elanous 0.2.37 → 0.2.38

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 (588) 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 → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{2002-a43a3f380df873ec.js → 1026-44010f405704050c.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +27 -0
  6. package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/{7424.c0fe2a595d4232b5.js → 1632.7d87f998e714bede.js} +1 -1
  10. package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/{4937-28d437999b77c9dd.js → 1923-5c1695332240246a.js} +1 -1
  13. package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
  14. package/apps/pwa/out/_next/static/chunks/2104.70e086d5174a4736.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +93 -0
  18. package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +104 -0
  19. package/apps/pwa/out/_next/static/chunks/{3199.6a1a9b0e6cd01dc6.js → 2415.738b777642a02233.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/{1262.a89bb27a5b2f844e.js → 3086.fb14b60ce98b53d3.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/3124-561f7f037943cde2.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +24 -0
  31. package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{2283.edd9627b7bdfb546.js → 3291.f6c1005387d514bd.js} +2 -2
  33. package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +36 -0
  34. package/apps/pwa/out/_next/static/chunks/{6877-84d47b7e85d0c41e.js → 3341-f09b9efbd7a82f70.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +287 -0
  38. package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/{6680.6a693c28aae4cd19.js → 3528.e4b8ab70d339f965.js} +1 -1
  40. package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +94 -0
  45. package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4199-f7c6eb40cd0322f8.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +32 -0
  57. package/apps/pwa/out/_next/static/chunks/{4036.d54e55e1ebf5acdc.js → 4804.6012b5cd33c22792.js} +2 -2
  58. package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +79 -0
  60. package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +74 -0
  63. package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{6819.be5c9c4d67f22922.js → 5203.51e5d8b5f1dcfe53.js} +16 -16
  65. package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/{757-4fbaf50942b8c424.js → 5255-1b60d50eabe9f057.js} +1 -1
  67. package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +286 -0
  68. package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{7867.e8725745ddd1d940.js → 5307.d7328020227880c2.js} +4 -4
  70. package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +8 -0
  73. package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/{5046.7fd5cbd859299448.js → 5638.107314dc479e2f37.js} +1 -1
  75. package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6142.913b44e260a3f925.js +64 -0
  80. package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6493.27ad77de7aac7966.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/{1224.2ceca6c180d5130b.js → 7000.28157393caaf5343.js} +1 -1
  88. package/apps/pwa/out/_next/static/chunks/{6745-5a63492933959dd9.js → 7161-8f22db3ec5ed005e.js} +3 -3
  89. package/apps/pwa/out/_next/static/chunks/{2479-fe7e188bd9402d14.js → 7311-60a7ea80d23c7521.js} +1 -1
  90. package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{5952.294fc574a8625184.js → 7488.966b116789f3d41a.js} +1 -1
  93. package/apps/pwa/out/_next/static/chunks/7524.ce973525d30b3d52.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +77 -0
  95. package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/{6252.240578f10952e091.js → 7628.6b16863ac3972333.js} +1 -1
  97. package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/{1746.3563617ea64023a3.js → 7954.4f7a8832663ee979.js} +1 -1
  100. package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/{4931.95cc6dbd230774ca.js → 8019.21ca554a821dad01.js} +16 -16
  102. package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/{2375.bf364c85dbb6f085.js → 8487.291666583bebe640.js} +1 -1
  107. package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/{4383.18e5c54db3a22c88.js → 8879.ac06755bcf3e44a1.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +149 -0
  111. package/apps/pwa/out/_next/static/chunks/{9151.a2c51e93f9156dae.js → 8911.bf5e712acb25fb6c.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/{58edce7d.f1b0c72acf13b123.js → 8994d93e.33ba491f95345fc2.js} +1 -1
  113. package/apps/pwa/out/_next/static/chunks/{5f6af561-f90b7a67f4f75d13.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +41 -0
  115. package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +226 -0
  116. package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +24 -0
  117. package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +2 -0
  121. package/apps/pwa/out/_next/static/chunks/{de8446d3.31b73eb239fecd7b.js → 9fe1b809.738da85c8b17e3fb.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-866aac5ff226a7f3.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/{page-5c112c6d7c33656e.js → page-c348a3959c5b5fc6.js} +1 -1
  140. package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-88a1edbff62eaf1d.js → page-d1d1210f99f620ae.js} +1 -1
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/{page-b9af2ac1c4737ce8.js → page-7f569e533ddeecba.js} +1 -1
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/{page-fb9e639c107f5f72.js → page-a9d9a3e66459c1e0.js} +1 -1
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{709a918c.4fd3b4e2a32cb4e3.js → b7459770.6539b11860eb8a9c.js} +7 -7
  174. package/apps/pwa/out/_next/static/chunks/{d9815f84.4918f682a45a8502.js → b7478fef.5917716286213fcc.js} +3 -3
  175. package/apps/pwa/out/_next/static/chunks/{4337e36d.f42c3b391b3d8f20.js → bb6987f9.3647e1a23b0e3217.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/de8b930d.d94c0f42acf807fc.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/{8c58d09b.e8724a299658d86f.js → eaad0cba.771200940c529df7.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +1 -0
  184. package/apps/pwa/out/approvals/index.html +1 -1
  185. package/apps/pwa/out/approvals/index.txt +22 -22
  186. package/apps/pwa/out/autopilot/index.html +1 -1
  187. package/apps/pwa/out/autopilot/index.txt +22 -22
  188. package/apps/pwa/out/board/index.html +1 -1
  189. package/apps/pwa/out/board/index.txt +22 -22
  190. package/apps/pwa/out/botlab/index.html +1 -1
  191. package/apps/pwa/out/botlab/index.txt +21 -21
  192. package/apps/pwa/out/bots/index.html +1 -1
  193. package/apps/pwa/out/bots/index.txt +21 -21
  194. package/apps/pwa/out/ceo/index.html +1 -1
  195. package/apps/pwa/out/ceo/index.txt +22 -22
  196. package/apps/pwa/out/chat/index.html +1 -1
  197. package/apps/pwa/out/chat/index.txt +21 -21
  198. package/apps/pwa/out/consult/index.html +1 -1
  199. package/apps/pwa/out/consult/index.txt +22 -22
  200. package/apps/pwa/out/control/index.html +1 -1
  201. package/apps/pwa/out/control/index.txt +22 -22
  202. package/apps/pwa/out/decisions/index.html +1 -1
  203. package/apps/pwa/out/decisions/index.txt +21 -21
  204. package/apps/pwa/out/design-check/index.html +1 -1
  205. package/apps/pwa/out/design-check/index.txt +22 -22
  206. package/apps/pwa/out/editor/index.html +1 -1
  207. package/apps/pwa/out/editor/index.txt +22 -22
  208. package/apps/pwa/out/exec/index.html +1 -1
  209. package/apps/pwa/out/exec/index.txt +22 -22
  210. package/apps/pwa/out/field/index.html +1 -1
  211. package/apps/pwa/out/field/index.txt +22 -22
  212. package/apps/pwa/out/healthz +1 -1
  213. package/apps/pwa/out/index.html +1 -1
  214. package/apps/pwa/out/index.txt +21 -21
  215. package/apps/pwa/out/inside/index.html +1 -1
  216. package/apps/pwa/out/inside/index.txt +21 -21
  217. package/apps/pwa/out/intake/index.html +1 -1
  218. package/apps/pwa/out/intake/index.txt +22 -22
  219. package/apps/pwa/out/live/index.html +1 -1
  220. package/apps/pwa/out/live/index.txt +22 -22
  221. package/apps/pwa/out/live-run/index.html +1 -1
  222. package/apps/pwa/out/live-run/index.txt +22 -22
  223. package/apps/pwa/out/loops/index.html +1 -1
  224. package/apps/pwa/out/loops/index.txt +21 -21
  225. package/apps/pwa/out/market/index.html +1 -1
  226. package/apps/pwa/out/market/index.txt +21 -21
  227. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  228. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  229. package/apps/pwa/out/morning/index.html +1 -1
  230. package/apps/pwa/out/morning/index.txt +22 -22
  231. package/apps/pwa/out/observatory/index.html +1 -1
  232. package/apps/pwa/out/observatory/index.txt +22 -22
  233. package/apps/pwa/out/ops/checklist/index.html +1 -1
  234. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  235. package/apps/pwa/out/ops/release/index.html +1 -1
  236. package/apps/pwa/out/ops/release/index.txt +21 -21
  237. package/apps/pwa/out/ops/seats/index.html +1 -1
  238. package/apps/pwa/out/ops/seats/index.txt +21 -21
  239. package/apps/pwa/out/outputs/index.html +1 -1
  240. package/apps/pwa/out/outputs/index.txt +21 -21
  241. package/apps/pwa/out/reflection/index.html +1 -1
  242. package/apps/pwa/out/reflection/index.txt +22 -22
  243. package/apps/pwa/out/scheduler/index.html +1 -1
  244. package/apps/pwa/out/scheduler/index.txt +22 -22
  245. package/apps/pwa/out/sessions/index.html +1 -1
  246. package/apps/pwa/out/sessions/index.txt +21 -21
  247. package/apps/pwa/out/settings/devices/index.html +1 -1
  248. package/apps/pwa/out/settings/devices/index.txt +22 -22
  249. package/apps/pwa/out/settings/index.html +1 -1
  250. package/apps/pwa/out/settings/index.txt +22 -22
  251. package/apps/pwa/out/setup/done/index.html +1 -1
  252. package/apps/pwa/out/setup/done/index.txt +22 -22
  253. package/apps/pwa/out/setup/index.html +1 -1
  254. package/apps/pwa/out/setup/index.txt +22 -22
  255. package/apps/pwa/out/share/index.html +1 -1
  256. package/apps/pwa/out/share/index.txt +22 -22
  257. package/apps/pwa/out/showroom/index.html +1 -1
  258. package/apps/pwa/out/showroom/index.txt +21 -21
  259. package/apps/pwa/out/tasks/index.html +1 -1
  260. package/apps/pwa/out/tasks/index.txt +22 -22
  261. package/apps/pwa/out/term/index.html +1 -1
  262. package/apps/pwa/out/term/index.txt +22 -22
  263. package/apps/pwa/out/today/index.html +1 -1
  264. package/apps/pwa/out/today/index.txt +22 -22
  265. package/apps/pwa/out/trace/index.html +1 -1
  266. package/apps/pwa/out/trace/index.txt +22 -22
  267. package/apps/pwa/out/vault/index.html +1 -1
  268. package/apps/pwa/out/vault/index.txt +22 -22
  269. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  270. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  271. package/apps/pwa/out/workflows/index.html +1 -1
  272. package/apps/pwa/out/workflows/index.txt +22 -22
  273. package/apps/pwa/out/workspace/index.html +1 -1
  274. package/apps/pwa/out/workspace/index.txt +22 -22
  275. package/apps/pwa/out/worktrees/index.html +1 -1
  276. package/apps/pwa/out/worktrees/index.txt +22 -22
  277. package/graphs/release/recipes.yaml +9 -0
  278. package/graphs/release/release-loop.yaml +26 -18
  279. package/package.json +1 -1
  280. package/scripts/ask-op-inbox-once.ts +17 -0
  281. package/scripts/brand/check.ts +13 -4
  282. package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
  283. package/scripts/gate-0226-failure-census.ts +39 -0
  284. package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
  285. package/scripts/provision-export-redactions.ts +15 -0
  286. package/scripts/public-copy-lint.ts +122 -0
  287. package/scripts/public-export.ts +69 -2
  288. package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
  289. package/scripts/ratchets/train-side-invariants.sh +7 -1
  290. package/scripts/release-loop/cut-branch.ts +61 -12
  291. package/scripts/release-loop/gate-node.ts +161 -25
  292. package/scripts/release-loop/gate-partial.ts +82 -3
  293. package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
  294. package/scripts/release-loop/gate-radius-live.ts +4 -2
  295. package/scripts/release-loop/resume-cap.ts +2 -1
  296. package/scripts/release-loop/resume-release.ts +297 -8
  297. package/scripts/release-loop/resume.ts +13 -5
  298. package/scripts/release-loop/traffic-node.ts +12 -4
  299. package/scripts/release-loop/traffic-transition.ts +53 -13
  300. package/scripts/release-loop/version-node.ts +29 -4
  301. package/scripts/ux-sim.ts +1 -1
  302. package/scripts/video-pipeline.ts +2 -2
  303. package/src/acp/core-turn-bridge.ts +6 -1
  304. package/src/agent/run-context.ts +1 -1
  305. package/src/agent/task-notification.ts +3 -1
  306. package/src/agent-substrate/review-observation.ts +10 -0
  307. package/src/agent-substrate/self-review-cli.ts +195 -27
  308. package/src/auto-research/question-ladder-contract.ts +137 -0
  309. package/src/auto-research/research-turn.ts +134 -0
  310. package/src/autopilot/discovery/doc-lint.ts +1 -1
  311. package/src/bots/screen-probe.ts +1 -1
  312. package/src/capture/tui-self-report.ts +10 -2
  313. package/src/chat/index.ts +1 -0
  314. package/src/chat/tool-render/dispatch.ts +8 -1
  315. package/src/cli/guardian-cli.ts +3 -1
  316. package/src/cli/intake-cli.ts +48 -12
  317. package/src/cli/lesson-cli.ts +69 -9
  318. package/src/cli/pr-land-overlap-evidence.ts +38 -5
  319. package/src/cli/pr-land-refusal.ts +1 -1
  320. package/src/cli/pty-takeover-cli.ts +58 -5
  321. package/src/cli/release-checklist-read-cli.ts +5 -2
  322. package/src/cli/release-cli.ts +47 -9
  323. package/src/cli/review-carry.ts +77 -0
  324. package/src/cli/self-update.ts +1 -1
  325. package/src/cli/tasks-card-show.ts +31 -1
  326. package/src/cli/tasks-cli.ts +62 -23
  327. package/src/cli/tasks-read-cli.ts +13 -5
  328. package/src/context-bus/context-now.ts +86 -2
  329. package/src/core-turn/run-core-turn.ts +9 -2
  330. package/src/core-turn/types.ts +3 -0
  331. package/src/dashboard/index.ts +18 -17
  332. package/src/dashboard/input/terminal-modal-router.ts +8 -159
  333. package/src/dashboard/side-basic-runtime.ts +61 -0
  334. package/src/dashboard/slash-runtime/dashboard-handlers.ts +2 -0
  335. package/src/dashboard/term-slash-runtime.ts +2 -0
  336. package/src/dashboard/turn-preamble.ts +28 -4
  337. package/src/domains/guardian-tick.ts +9 -0
  338. package/src/git-fs/watcher.ts +27 -22
  339. package/src/git-fs/worktree.ts +19 -3
  340. package/src/graph-runner/graph-grow.ts +37 -9
  341. package/src/graph-runner/runner.ts +17 -2
  342. package/src/grok/credential.ts +107 -36
  343. package/src/hq/fence-wrapper.ts +1 -1
  344. package/src/hq/transfer.ts +1 -1
  345. package/src/index.ts +44 -14
  346. package/src/intake-plane/collect-telegram-saved.ts +54 -5
  347. package/src/interactive-terminal-modal.ts +3 -0
  348. package/src/keybindings.ts +17 -22
  349. package/src/llm/provider-credentials.ts +1 -1
  350. package/src/llm-tool-schema.ts +20 -0
  351. package/src/llm.ts +81 -11
  352. package/src/loops/orchestrator/inbox-once.ts +28 -0
  353. package/src/loops/orchestrator/inbox.ts +130 -1
  354. package/src/loops/orchestrator/tick.ts +6 -3
  355. package/src/maturity/feature-maturity.ts +1 -0
  356. package/src/nexus/api/channel-ask-op.ts +96 -0
  357. package/src/nexus/api/discord-trigger-bot.ts +28 -1
  358. package/src/nexus/api/telegram-trigger-bot.ts +24 -0
  359. package/src/nexus/api/terminals.ts +28 -6
  360. package/src/patents/ledger.ts +18 -1
  361. package/src/preview/terminal.ts +4 -2
  362. package/src/prompt-cache/anthropic.ts +2 -0
  363. package/src/prompt-enhance/enhance.ts +5 -0
  364. package/src/pty-shell/pty-manifest.ts +16 -2
  365. package/src/release-loop/gate-shards.ts +61 -0
  366. package/src/release-loop/light-rc.ts +7 -4
  367. package/src/release-loop/rehearsal.ts +1 -1
  368. package/src/repl/index.ts +10 -0
  369. package/src/research/axis-fanout.ts +133 -0
  370. package/src/research/edge-decision.ts +88 -0
  371. package/src/research/output-router.ts +127 -0
  372. package/src/research-bridge/format.ts +16 -1
  373. package/src/research-bridge/index.ts +1 -0
  374. package/src/research-bridge/invoke.ts +41 -5
  375. package/src/self-dev/decompose.ts +45 -9
  376. package/src/self-dev/draft-residue.ts +221 -2
  377. package/src/self-dev/draft-sweep.ts +29 -16
  378. package/src/self-dev/orchestrate.ts +1 -0
  379. package/src/self-dev/run-supervisor.ts +22 -7
  380. package/src/self-dev/shard-run.ts +260 -3
  381. package/src/self-implement/comment-only-source.ts +54 -0
  382. package/src/self-implement/doctor-visit.ts +25 -0
  383. package/src/self-implement/gate-artifacts.ts +2 -2
  384. package/src/self-implement/gate-baseline.ts +44 -9
  385. package/src/self-implement/gate-cli.ts +151 -86
  386. package/src/self-implement/gate-failure-signature.ts +44 -0
  387. package/src/self-implement/gate-remote.ts +2 -0
  388. package/src/self-implement/goal-author.ts +74 -3
  389. package/src/self-implement/goal-doc/section.ts +22 -0
  390. package/src/self-implement/goal-supervisor-fill.ts +38 -4
  391. package/src/self-implement/knowhow-pack.ts +120 -7
  392. package/src/self-implement/l8-merge-queue.ts +198 -32
  393. package/src/self-implement/off-diff-evidence.ts +23 -0
  394. package/src/self-implement/orchestrator.ts +55 -12
  395. package/src/self-implement/pod-inplace-worktree.ts +82 -0
  396. package/src/self-implement/pod-warm-pool-profile.ts +2 -2
  397. package/src/self-implement/premise-review.ts +7 -5
  398. package/src/self-implement/run-ledger.ts +258 -0
  399. package/src/self-implement/seams.ts +33 -10
  400. package/src/self-implement/self-implement-cli.ts +26 -2
  401. package/src/session/channel-ask-op-envelope.ts +36 -0
  402. package/src/session/channel-op-reply-route.ts +200 -0
  403. package/src/session/chat.ts +3 -0
  404. package/src/session/index.ts +2 -0
  405. package/src/session-runtime/index.ts +9 -22
  406. package/src/skills/runner.ts +7 -3
  407. package/src/skills/tools/dev-harness.ts +2 -2
  408. package/src/skills/tools/schedule-wakeup.ts +1 -6
  409. package/src/status/bar.ts +3 -3
  410. package/src/storage/file-lock.ts +17 -4
  411. package/src/task-agent/adopt-pr.ts +63 -2
  412. package/src/task-agent/evidence-command-normalize.ts +42 -0
  413. package/src/task-agent/export-redactions-provision.ts +43 -0
  414. package/src/task-agent/parent-host.ts +59 -12
  415. package/src/task-agent/repair-cycle.ts +67 -8
  416. package/src/task-agent/repair-worker.ts +37 -1
  417. package/src/task-agent/task-hand.ts +98 -10
  418. package/src/task-agent/tier-split.ts +37 -3
  419. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
  420. package/src/task-orchestrator/surfaces/pod-pool.ts +27 -4
  421. package/src/task-orchestrator/surfaces/self-implement-pod.ts +126 -48
  422. package/src/task-orchestrator/surfaces/self-implement.ts +33 -2
  423. package/src/terminal/session-registry.ts +1 -0
  424. package/src/terminal/terminal-modal-router.ts +156 -0
  425. package/src/tool-hints/gate.ts +6 -4
  426. package/src/tool-hints/signals.ts +33 -1
  427. package/src/tui/chat/background-job-status.ts +8 -2
  428. package/src/tui/entry.ts +469 -31
  429. package/src/tui/sidetab/attach.ts +304 -0
  430. package/src/tui/sidetab/list.ts +176 -0
  431. package/src/tui/sidetab/nl-tool.ts +136 -0
  432. package/src/tui/slash/resume-command.ts +23 -0
  433. package/src/tui/slash/resume.ts +3 -23
  434. package/src/tui/slash/term-next.ts +2 -1
  435. package/src/tui-client/local-chat-turn.ts +29 -8
  436. package/src/user-config.ts +11 -2
  437. package/src/ux-sim/fake-llm.ts +11 -5
  438. package/src/ux-sim/next-tui-seat-scenarios.ts +53 -1
  439. package/src/version/packed-revision.json +1 -1
  440. package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +0 -1
  441. package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +0 -1
  442. package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +0 -1
  443. package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +0 -1
  444. package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +0 -1
  445. package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +0 -1
  446. package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +0 -1
  447. package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +0 -1
  448. package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +0 -1
  449. package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +0 -1
  450. package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +0 -32
  451. package/apps/pwa/out/_next/static/chunks/2318-450e75d07605b8fe.js +0 -1
  452. package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +0 -1
  453. package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +0 -148
  454. package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +0 -1
  456. package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +0 -1
  457. package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +0 -27
  458. package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +0 -1
  461. package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/3578.4e9f9948a9a6f2f4.js +0 -2
  463. package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +0 -36
  465. package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +0 -226
  467. package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +0 -287
  468. package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/4313.76f232c304a15bde.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +0 -1
  472. package/apps/pwa/out/_next/static/chunks/4725-34bed25720cc326b.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +0 -24
  477. package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +0 -104
  479. package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +0 -1
  482. package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +0 -93
  486. package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +0 -74
  487. package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +0 -149
  490. package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +0 -41
  493. package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +0 -24
  496. package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/7c5ed21f-f286708e57cf88f7.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +0 -8
  508. package/apps/pwa/out/_next/static/chunks/8080-40d781e7704d3671.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +0 -77
  510. package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +0 -286
  513. package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +0 -79
  517. package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +0 -94
  525. package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +0 -64
  527. package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/app/live/page-3337c6a1328c2674.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/app/morning/page-1e5da297557d2354.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/app/term/page-ac2c1e6169cfce57.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/workspace/page-c1c80e345fa9d6f5.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +0 -1
  586. package/scripts/migrate-monad-to-elanous.ts +0 -195
  587. package/scripts/rebrand-elanous.ts +0 -242
  588. /package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
package/src/tui/entry.ts CHANGED
@@ -1,12 +1,12 @@
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';
9
+ import { RESUME_BUSY_STATUS, parseResumeCommand } from './slash/resume-command.js';
10
10
  import { 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';
@@ -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,21 @@ 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
+ let sidetabAttachments: import('./sidetab/attach.js').SidetabAttachmentController | null = null;
104
+ let pendingSidetabSwitch: string | null = null;
105
+ let sidetabRefreshTimer: ReturnType<typeof setInterval> | null = null;
106
+ let paintingCoordinatorFrame = false;
82
107
  const mouseResidue = new MouseResidueGuard();
83
108
  const replay: Key[] = [];
84
109
  let escapeSnapshot: { editor: InlineEditorState; status: string; focus: 'input' | 'log'; busy: boolean } | null = null;
@@ -89,7 +114,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
89
114
  let draft = '';
90
115
  let activity: string[] = [];
91
116
  /** Rows of the last `/resume` list — `/resume <n>` picks from what the user saw. */
92
- let lastResumeRows: ReturnType<typeof resumeCandidates> | null = null;
117
+ let lastResumeRows: import('../session/index.js').SessionMeta[] | null = null;
93
118
  let atPicker: { query: AtPickerQuery; candidates: AtPickerCandidate[]; selected: number } | null = null;
94
119
  let atPickerApi: typeof import('./input/at-picker.js') | null = null;
95
120
  let dismissedAtQuery = '';
@@ -106,6 +131,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
106
131
  const backgroundJobs = new BackgroundJobStatus(id);
107
132
  const backgroundSubscription: { stop?: () => void } = {};
108
133
  const selfHealthSubscription: { stop?: () => void } = {};
134
+ let observedSessionId: string | null = null;
109
135
  let selfHealthLine: string | null = null;
110
136
  // TUI-NEXT-QUEUE-AND-WAKE — what is submitted while busy waits here (the classic FIFO state) and
111
137
  // leaves one item per settle; Esc returns it all to the prompt (classic «interrupted» drain).
@@ -130,6 +156,25 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
130
156
  const pushNotice = (line: string): void => {
131
157
  notices = [...notices, safeStatusText(line)].slice(-3);
132
158
  };
159
+ const observeSession = (
160
+ sessionId: string,
161
+ onBackground: typeof import('../tui-client/local-chat-turn.js').onLocalChatBackgroundStatus,
162
+ onSelfHealth: typeof import('../tui-client/local-chat-turn.js').onLocalChatSelfHealthStatus,
163
+ ): void => {
164
+ if (observedSessionId === sessionId) return;
165
+ backgroundSubscription.stop?.();
166
+ selfHealthSubscription.stop?.();
167
+ backgroundSubscription.stop = onBackground(sessionId, (frame) => {
168
+ if (frame === null) backgroundJobs.clear();
169
+ else backgroundJobs.accept(frame);
170
+ render();
171
+ });
172
+ selfHealthSubscription.stop = onSelfHealth(sessionId, (snapshot) => {
173
+ selfHealthLine = snapshot?.line ?? null;
174
+ render();
175
+ });
176
+ observedSessionId = sessionId;
177
+ };
133
178
  const slashHandlers = new Map<string, (args: string[], context: MissionSlashContext) => Promise<void>>();
134
179
  slashHandlers.set('mission', handleMissionSlash);
135
180
  slashHandlers.set('signals', handleSignalsSlash);
@@ -239,47 +284,198 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
239
284
  }));
240
285
 
241
286
  const render = (): void => {
287
+ if (sidetabRemoteFrame !== null) {
288
+ const columns = process.stdout.columns || 80;
289
+ const rows = process.stdout.rows || 24;
290
+ const footer = fitLogLine(` ${status} `, Math.max(1, columns));
291
+ process.stdout.write(`\x1b[H\x1b[2J${sidetabRemoteFrame}\x1b[${rows};1H\x1b[7m${footer}\x1b[0m`);
292
+ return;
293
+ }
242
294
  const columns = process.stdout.columns || 0;
243
295
  const rows = process.stdout.rows || 0;
244
296
  if (columns < 20 || rows < 6) {
245
297
  process.stdout.write(`\x1b[H\x1b[2J${fitLogLine('터미널이 너무 작습니다 · q 종료', Math.max(1, columns))}`);
246
298
  return;
247
299
  }
300
+ if (sidetabOpen && columns < 34) {
301
+ sidetabOpen = false;
302
+ sidetabMode = 'list';
303
+ status = '터미널 폭이 줄어 사이드탭을 닫았습니다';
304
+ if (sidetabRefreshTimer !== null) {
305
+ clearInterval(sidetabRefreshTimer);
306
+ sidetabRefreshTimer = null;
307
+ }
308
+ }
309
+ const sidetabWidth = sidetabOpen ? sidetabApi!.sidetabWidthForTerminal(columns) : 0;
310
+ const chatColumns = columns - sidetabWidth - (sidetabOpen ? 1 : 0);
248
311
  const backgroundLine = backgroundJobs.line();
249
312
  const footerRows = backgroundLine ? 2 : 1;
250
313
  const history = [
251
- ...logViewLines(messages, columns, expandedToolBlocks),
252
- ...notices.map((line) => fitLogLine(line, columns)),
253
- ...activity.map((line) => fitLogLine(line, columns)),
314
+ ...logViewLines(messages, chatColumns, expandedToolBlocks),
315
+ ...notices.map((line) => fitLogLine(line, chatColumns)),
316
+ ...activity.map((line) => fitLogLine(line, chatColumns)),
254
317
  ];
255
318
  const bodyRows = rows - 3 - footerRows;
256
319
  maxScroll = Math.max(0, history.length - bodyRows);
257
320
  scroll = Math.min(scroll, maxScroll);
258
321
  const start = Math.max(0, history.length - bodyRows - scroll);
259
322
  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);
323
+ logWindow = { start, rows: bodyRows, columns: chatColumns };
324
+ const title = fitLogLine(`elanous next · ${safeLogText(nextTuiTitle(session?.meta)).split('\n')[0]}`, chatColumns);
262
325
  const turnStatus = (!busy && focus === 'log'
263
- ? `로그 탐색 · ↑↓ 스크롤${toolFoldBlockStarts(messages, columns).length > 0 ? ' · Enter 접기/펼치기' : ''} · Esc 입력`
326
+ ? `로그 탐색 · ↑↓ 스크롤${toolFoldBlockStarts(messages, chatColumns).length > 0 ? ' · Enter 접기/펼치기' : ''} · Esc 입력`
264
327
  : status) + nextTuiQueueSuffix(queue.queuedSubmissions.length);
265
328
  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));
329
+ ? [fitLogLine(backgroundLine, chatColumns), fitLogLine(turnStatus, chatColumns)]
330
+ : [fitLogLine(turnStatus, chatColumns)];
331
+ const prompt = composerViewport(editor, chatColumns);
332
+ const header = [title, mailLine ? fitLogLine(mailLine, chatColumns) : '─'.repeat(Math.min(chatColumns, 80))];
333
+ if (selfHealthLine) header.push(fitLogLine(selfHealthLine, chatColumns));
271
334
  if (atPicker) {
272
335
  const limit = Math.max(1, Math.min(6, rows - 8));
273
336
  const start = Math.max(0, Math.min(atPicker.selected - limit + 1, atPicker.candidates.length - limit));
274
337
  const visible = atPicker.candidates.slice(start, start + limit);
275
- header.push(fitLogLine(visible.length ? '@ 파일 첨부 · ↑↓ 선택 · Enter 추가 · Esc 닫기' : '@ 파일 후보 없음', columns));
338
+ header.push(fitLogLine(visible.length ? '@ 파일 첨부 · ↑↓ 선택 · Enter 추가 · Esc 닫기' : '@ 파일 후보 없음', chatColumns));
276
339
  for (const [offset, candidate] of visible.entries()) {
277
- header.push(fitLogLine((start + offset === atPicker.selected ? '▸' : ' ') + ' ' + candidate.label, columns));
340
+ header.push(fitLogLine((start + offset === atPicker.selected ? '▸' : ' ') + ' ' + candidate.label, chatColumns));
278
341
  }
279
342
  }
280
343
  const lines = [...header, ...body, ...footer, prompt.line];
281
344
  const promptRow = lines.length;
282
- process.stdout.write(`\x1b[H\x1b[2J${lines.join('\n')}\x1b[${promptRow};${prompt.cursorCol}H\x1b[?25h`);
345
+ const sidetabLines = sidetabOpen
346
+ ? sidetabApi!.formatSidetabLines(sidetabRows, sidetabSelected, sidetabWidth, Math.max(1, rows - 1), sidetabMode)
347
+ : [];
348
+ const screenLines = sidetabOpen
349
+ ? lines.map((line, index) => `${sidetabLines[index] ?? ' '.repeat(sidetabWidth)}│${line}`)
350
+ : lines;
351
+ process.stdout.write(`\x1b[H\x1b[2J${screenLines.join('\n')}\x1b[${promptRow};${prompt.cursorCol + (sidetabOpen ? sidetabWidth + 1 : 0)}H\x1b[?25h`);
352
+ if (sidetabAttachments?.hasModal() && !paintingCoordinatorFrame) sidetabAttachments.refresh();
353
+ };
354
+
355
+ const ensureSidetabAttachments = async (): Promise<void> => {
356
+ if (sidetabAttachments) return;
357
+ sidetabAttachments = (await import('./sidetab/attach.js')).createSidetabAttachmentController({
358
+ drawBase: () => {
359
+ paintingCoordinatorFrame = true;
360
+ try { render(); } finally { paintingCoordinatorFrame = false; }
361
+ },
362
+ termSize: () => ({ cols: process.stdout.columns || 80, rows: process.stdout.rows || 24 }),
363
+ setStatus: (message) => { status = safeStatusText(message); },
364
+ drawRemoteFrame: (frame) => {
365
+ sidetabRemoteFrame = frame || null;
366
+ if (sidetabRemoteFrame !== null) {
367
+ const columns = process.stdout.columns || 80;
368
+ const rows = process.stdout.rows || 24;
369
+ const footer = fitLogLine(` ${status} `, Math.max(1, columns));
370
+ process.stdout.write(`\x1b[H\x1b[2J${sidetabRemoteFrame}\x1b[${rows};1H\x1b[7m${footer}\x1b[0m`);
371
+ }
372
+ else render();
373
+ },
374
+ });
375
+ };
376
+
377
+ const toggleSidetab = async (): Promise<void> => {
378
+ if (!sidetabEnabled) {
379
+ status = '사이드탭 off · /side on 으로 이 세션에서 켜기';
380
+ return;
381
+ }
382
+ if (!sidetabOpen && (process.stdout.columns || 0) < 34) {
383
+ status = '사이드탭은 터미널 폭 34칸 이상에서 열 수 있습니다';
384
+ return;
385
+ }
386
+ if (!sidetabApi) sidetabApi = await import('./sidetab/list.js');
387
+ sidetabRows = sidetabApi.loadSidetabRows(sidetabAll);
388
+ const current = sidetabRows.findIndex((row) => row.sessionId === id);
389
+ const next = sidetabApi.applySidetabKey({ open: sidetabOpen, selected: current >= 0 ? current : sidetabSelected }, 'toggle', sidetabRows.length);
390
+ sidetabOpen = next.open;
391
+ sidetabOpenBySession.set(id!, sidetabOpen);
392
+ updateSessionMeta(id!, (meta) => { meta.uiState = { ...meta.uiState, sidetabOpen }; });
393
+ sidetabSelected = next.selected;
394
+ sidetabMode = 'list';
395
+ if (sidetabOpen && sidetabRefreshTimer === null) {
396
+ sidetabRefreshTimer = setInterval(() => {
397
+ if (!sidetabOpen || !sidetabApi) return;
398
+ refreshSidetabRows();
399
+ render();
400
+ }, 1000);
401
+ } else if (!sidetabOpen && sidetabRefreshTimer !== null) {
402
+ clearInterval(sidetabRefreshTimer);
403
+ sidetabRefreshTimer = null;
404
+ }
405
+ };
406
+
407
+ const refreshSidetabRows = (): void => {
408
+ if (!sidetabApi) return;
409
+ const selectedId = sidetabRows[sidetabSelected]?.id;
410
+ sidetabRows = sidetabApi.loadSidetabRows(sidetabAll);
411
+ const preservedIndex = selectedId ? sidetabRows.findIndex((row) => row.id === selectedId) : -1;
412
+ sidetabSelected = preservedIndex >= 0
413
+ ? preservedIndex
414
+ : Math.min(sidetabSelected, Math.max(0, sidetabRows.length - 1));
415
+ };
416
+ const switchSidetabSession = async (requestedSessionId?: string): Promise<void> => {
417
+ const selected = sidetabRows[sidetabSelected];
418
+ const targetId = requestedSessionId ?? (selected?.kind === 'tui' ? selected.sessionId : undefined);
419
+ if (!targetId || targetId === id) return;
420
+ if (busy) {
421
+ status = '응답 중에는 세션을 전환할 수 없습니다';
422
+ return;
423
+ }
424
+ const target = loadSession(targetId);
425
+ if (!target) {
426
+ status = '세션을 읽을 수 없습니다 · 목록을 다시 열어 주세요';
427
+ return;
428
+ }
429
+ id = targetId;
430
+ session = target;
431
+ messages = target.messages;
432
+ setActiveSessionId(targetId);
433
+ updatePtyManifestSession(`tui:${process.pid}`, targetId);
434
+ backgroundJobs.setSessionId(targetId);
435
+ selfHealthLine = null;
436
+ const statusSources = await import('../tui-client/local-chat-turn.js');
437
+ observeSession(targetId, statusSources.onLocalChatBackgroundStatus, statusSources.onLocalChatSelfHealthStatus);
438
+ goalContinue?.noteHumanTurn();
439
+ lastResumeRows = null;
440
+ expandedToolBlocks.clear();
441
+ activity = [];
442
+ streamingReply = '';
443
+ scroll = 0;
444
+ maxScroll = 0;
445
+ status = '세션 전환됨 · Enter 전송 · Ctrl+Q 종료';
446
+ };
447
+ const focusSidetab = async (): Promise<void> => {
448
+ sidetabEnabled = true;
449
+ if (sidetabAttachments?.hasRemoteView()) sidetabAttachments.showMain();
450
+ if (!sidetabOpen) await toggleSidetab();
451
+ sidetabMode = 'list';
452
+ sidetabFocused = true;
453
+ status = '사이드탭 포커스 · 1–9 선택 · Esc 입력';
454
+ };
455
+ const returnToParent = (): void => {
456
+ sidetabAttachments?.showMain();
457
+ sidetabFocused = false;
458
+ focus = 'input';
459
+ status = '부모 채팅 · 입력 포커스';
460
+ };
461
+ const returnToInput = (): void => {
462
+ sidetabFocused = false;
463
+ focus = 'input';
464
+ status = '입력 포커스';
465
+ };
466
+ const selectSidetabIndex = async (index: number): Promise<void> => {
467
+ refreshSidetabRows();
468
+ if (index < 0 || index >= sidetabRows.length) {
469
+ status = `사이드탭 ${index + 1}번 항목 없음`;
470
+ return;
471
+ }
472
+ sidetabSelected = index;
473
+ const selected = sidetabRows[index]!;
474
+ if (selected.kind === 'tui') await switchSidetabSession();
475
+ else {
476
+ await ensureSidetabAttachments();
477
+ sidetabAttachments?.select(selected);
478
+ }
283
479
  };
284
480
 
285
481
  let restoreCliStderrSink: (() => void) | null = null;
@@ -371,16 +567,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
371
567
  turnAbort = abort;
372
568
  turnDone = import('../tui-client/local-chat-turn.js')
373
569
  .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
- });
570
+ observeSession(turnSessionId, onLocalChatBackgroundStatus, onLocalChatSelfHealthStatus);
384
571
  let firstResponseSeen = false;
385
572
  return runLocalChatTurn(turnSessionId, turnText, abort.signal, undefined, undefined, (delta) => {
386
573
  // 첫 응답 경계: 첫 스트림 델타에서 턴 시작 트레이스를 닫는다(endedBy=stream-open).
@@ -413,7 +600,10 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
413
600
  expandedToolBlocks.clear();
414
601
  render();
415
602
  },
416
- }, attachments);
603
+ }, attachments, (line) => {
604
+ pushNotice(line);
605
+ render();
606
+ });
417
607
  })
418
608
  .then(() => { status = `${compactNote}응답 완료 · Enter 전송 · Ctrl+Q 종료`; })
419
609
  .catch((error: unknown) => {
@@ -423,7 +613,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
423
613
  ? '응답 취소됨 · Enter 전송'
424
614
  : `응답 실패: ${safeStatusText(message)}`);
425
615
  })
426
- .finally(() => {
616
+ .finally(async () => {
427
617
  if (streamRenderTimer !== null) clearTimeout(streamRenderTimer);
428
618
  streamRenderTimer = null;
429
619
  session = loadSession(turnSessionId);
@@ -452,10 +642,22 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
452
642
  } else if (goalContinue && (queue.queuedSubmissions.length > 0 || editor.text.length > 0)) {
453
643
  debug.log('tui.proactive', 'yield-user-input', { queued: queue.queuedSubmissions.length, bufferedChars: editor.text.length });
454
644
  }
645
+ const switchAfterTurn = pendingSidetabSwitch;
646
+ pendingSidetabSwitch = null;
647
+ if (switchAfterTurn) await switchSidetabSession(switchAfterTurn);
455
648
  render();
456
649
  });
457
650
  };
458
651
 
652
+ if (sidetabOpen) {
653
+ sidetabApi = await import('./sidetab/list.js');
654
+ sidetabRows = sidetabApi.loadSidetabRows(sidetabAll);
655
+ sidetabRefreshTimer = setInterval(() => {
656
+ if (!sidetabApi || !sidetabOpen) return;
657
+ refreshSidetabRows();
658
+ render();
659
+ }, 1_000);
660
+ }
459
661
  initTui();
460
662
  restoreCliStderrSink = setCliStderrSink(({ source, exitCode, raw }) => {
461
663
  // Keep the exact bytes in the normal debug log while rendering only failures through the
@@ -477,6 +679,8 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
477
679
  try {
478
680
  {
479
681
  const { createNextTuiWakeup, setNextTuiWakeupTool } = await import('../tui-client/next-wakeup.js');
682
+ const { setNextSidetabHandler } = await import('../tui-client/local-chat-turn.js');
683
+ const { createNextSidetabHostHandler } = await import('./sidetab/nl-tool.js');
480
684
  wakeup = createNextTuiWakeup({
481
685
  isTurnRunning: () => busy,
482
686
  getBufferText: () => editor.text,
@@ -485,6 +689,28 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
485
689
  notify: (line) => { pushNotice(line); render(); },
486
690
  });
487
691
  setNextTuiWakeupTool(wakeup.tool);
692
+ setNextSidetabHandler(createNextSidetabHostHandler({
693
+ rows: async () => { if (!sidetabApi) sidetabApi = await import('./sidetab/list.js'); refreshSidetabRows(); return sidetabRows; },
694
+ selected: () => sidetabSelected,
695
+ switchSession: async (row) => {
696
+ if (!row.sessionId) return { error: '전환할 TUI 세션 id가 없습니다' };
697
+ const index = sidetabRows.findIndex((item) => item.id === row.id);
698
+ if (index < 0) return { error: '세션 목록이 갱신되어 전환을 취소했습니다' };
699
+ if (busy) {
700
+ sidetabSelected = index;
701
+ pendingSidetabSwitch = row.sessionId;
702
+ return { ok: true, action: 'switch', target: row.id, scheduled: 'after-turn' };
703
+ }
704
+ sidetabSelected = index;
705
+ await switchSidetabSession(row.sessionId);
706
+ render();
707
+ return { ok: true, action: 'switch', target: row.id };
708
+ },
709
+ attach: async (row) => { await ensureSidetabAttachments(); const ok = sidetabAttachments!.select(row); render(); return { ok, action: 'attach', target: row.id }; },
710
+ 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' }; },
711
+ spawn: async (character) => { await ensureSidetabAttachments(); const ok = sidetabAttachments!.spawn(character); refreshSidetabRows(); render(); return { ok, action: 'new', character }; },
712
+ kill: async (row) => { await ensureSidetabAttachments(); const ok = sidetabAttachments!.kill(row); refreshSidetabRows(); render(); return { ok, action: 'kill', target: row.id }; },
713
+ }));
488
714
  const gate = wakeup.gate;
489
715
  loopCommand = createNextLoopCommand(gate, (event, data) => debug.log('dashboard.loop', event, data));
490
716
  goalContinue = dashboardRuntime.createGoalContinue({
@@ -559,6 +785,99 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
559
785
  escapeSnapshot = null;
560
786
  }
561
787
  }
788
+ if (sidetabChordPending) {
789
+ sidetabChordPending = false;
790
+ if (sidetabChordTimer !== null) clearTimeout(sidetabChordTimer);
791
+ sidetabChordTimer = null;
792
+ if (key.name === 'up' || key.name === 'down') {
793
+ if (!sidetabApi) sidetabApi = await import('./sidetab/list.js');
794
+ refreshSidetabRows();
795
+ if (sidetabRows.length > 0) {
796
+ const delta = key.name === 'up' ? -1 : 1;
797
+ sidetabSelected = (sidetabSelected + delta + sidetabRows.length) % sidetabRows.length;
798
+ if (sidetabRows[sidetabSelected]!.kind === 'tui') await switchSidetabSession();
799
+ else {
800
+ await ensureSidetabAttachments();
801
+ sidetabAttachments?.select(sidetabRows[sidetabSelected]!);
802
+ }
803
+ }
804
+ render();
805
+ continue;
806
+ }
807
+ if (key.name.toLowerCase() === 's') {
808
+ await focusSidetab();
809
+ render();
810
+ continue;
811
+ }
812
+ if (key.name.toLowerCase() === 'p') {
813
+ returnToParent();
814
+ render();
815
+ continue;
816
+ }
817
+ if (/^[1-9]$/.test(key.name)) {
818
+ sidetabEnabled = true;
819
+ if (!sidetabOpen) await toggleSidetab();
820
+ await selectSidetabIndex(Number(key.name) - 1);
821
+ render();
822
+ continue;
823
+ }
824
+ if (key.name === 'escape') {
825
+ returnToInput();
826
+ render();
827
+ continue;
828
+ }
829
+ if (key.name.toLowerCase() === 'd' && sidetabAttachments?.hasModal()) {
830
+ sidetabAttachments.handleKey({ name: '\\', ctrl: true, shift: false });
831
+ sidetabAttachments.handleKey(key);
832
+ render();
833
+ continue;
834
+ }
835
+ if (sidetabAttachments?.hasRemoteView()) sidetabAttachments.showMain();
836
+ await toggleSidetab();
837
+ }
838
+ if (key.ctrl && key.name === '\\') {
839
+ if (!sidetabEnabled) {
840
+ status = '사이드탭 off · /side on 으로 이 세션에서 켜기';
841
+ render();
842
+ continue;
843
+ }
844
+ sidetabChordPending = true;
845
+ sidetabChordTimer = setTimeout(() => {
846
+ if (!sidetabChordPending) return;
847
+ sidetabChordPending = false;
848
+ sidetabChordTimer = null;
849
+ if (sidetabAttachments?.hasRemoteView()) sidetabAttachments.showMain();
850
+ void toggleSidetab().then(render);
851
+ }, 300);
852
+ continue;
853
+ }
854
+ if (sidetabFocused && key.name === 'escape') {
855
+ returnToInput();
856
+ render();
857
+ continue;
858
+ }
859
+ if (key.name === 'mouse' && key.mouse?.type === 'click') {
860
+ if (sidetabOpen && sidetabMode === 'list' && !sidetabAttachments?.hasRemoteView() && !sidetabAttachments?.hasModal()) {
861
+ const panelWidth = sidetabApi!.sidetabWidthForTerminal(process.stdout.columns || 0);
862
+ if (key.mouse.col <= panelWidth) {
863
+ const index = sidetabApi!.sidetabRowIndexAtTerminalRow(
864
+ sidetabRows.length,
865
+ sidetabSelected,
866
+ Math.max(1, (process.stdout.rows || 0) - 1),
867
+ key.mouse.row,
868
+ );
869
+ if (index !== null) {
870
+ await selectSidetabIndex(index);
871
+ }
872
+ }
873
+ }
874
+ render();
875
+ continue;
876
+ }
877
+ if (sidetabAttachments?.handleKey(key)) {
878
+ render();
879
+ continue;
880
+ }
562
881
  const wheel = wheelDirection(key);
563
882
  if (wheel) {
564
883
  // Wheel over the chat moves the log only; the prompt and focus stay as they were.
@@ -571,6 +890,56 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
571
890
  await turnDone;
572
891
  break;
573
892
  }
893
+ if (sidetabFocused && /^[1-9]$/.test(key.name)) {
894
+ await selectSidetabIndex(Number(key.name) - 1);
895
+ render();
896
+ continue;
897
+ }
898
+ if (sidetabFocused && key.name !== 'up' && key.name !== 'down') {
899
+ render();
900
+ continue;
901
+ }
902
+ if (sidetabOpen && sidetabMode === 'new') {
903
+ if (key.name === 'escape') {
904
+ sidetabMode = 'list';
905
+ } else {
906
+ const character = ({ s: 'shell', e: 'elanous', c: 'codex', l: 'claude' } as const)[key.name.toLowerCase() as 's' | 'e' | 'c' | 'l'];
907
+ if (character) {
908
+ await ensureSidetabAttachments();
909
+ sidetabAttachments?.spawn(character);
910
+ sidetabMode = 'list';
911
+ refreshSidetabRows();
912
+ }
913
+ }
914
+ render();
915
+ continue;
916
+ }
917
+ if (sidetabOpen && (key.name === 'up' || key.name === 'down')) {
918
+ const next = sidetabApi!.applySidetabKey({ open: sidetabOpen, selected: sidetabSelected }, key.name, sidetabRows.length);
919
+ sidetabSelected = next.selected;
920
+ if (sidetabRows[sidetabSelected]) {
921
+ if (sidetabRows[sidetabSelected]!.kind === 'tui') await switchSidetabSession();
922
+ else {
923
+ await ensureSidetabAttachments();
924
+ sidetabAttachments?.select(sidetabRows[sidetabSelected]!);
925
+ }
926
+ }
927
+ render();
928
+ continue;
929
+ }
930
+ if (sidetabOpen && editor.text.length === 0 && key.name === 'enter') {
931
+ const selected = sidetabRows[sidetabSelected];
932
+ if (selected) {
933
+ if (selected.kind === 'tui') await switchSidetabSession();
934
+ else {
935
+ await ensureSidetabAttachments();
936
+ sidetabAttachments?.select(selected);
937
+ }
938
+ refreshSidetabRows();
939
+ }
940
+ render();
941
+ continue;
942
+ }
574
943
  if (busy && (key.name === 'escape' || (key.ctrl && key.name === 'c'))) {
575
944
  turnAbort?.abort();
576
945
  interrupted = true;
@@ -764,6 +1133,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
764
1133
  }
765
1134
  const resumeCommand = parseResumeCommand(submitted);
766
1135
  if (resumeCommand?.kind === 'list') {
1136
+ const { resumeCandidates, resumeListLines } = await import('./slash/resume.js');
767
1137
  lastResumeRows = resumeCandidates(id);
768
1138
  activity = resumeListLines(lastResumeRows, id).map(safeStatusText);
769
1139
  status = '/resume <번호|id 앞자리> 로 이어 가기 · Enter 전송';
@@ -772,6 +1142,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
772
1142
  continue;
773
1143
  }
774
1144
  if (resumeCommand?.kind === 'load') {
1145
+ const { requestResumeTuiSession, resumeCandidates } = await import('./slash/resume.js');
775
1146
  const next = requestResumeTuiSession({ busy, from: id, prefix: resumeCommand.prefix, rows: lastResumeRows ?? resumeCandidates(id) });
776
1147
  if (next.kind === 'started') {
777
1148
  loopCommand?.run('stop');
@@ -874,6 +1245,68 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
874
1245
  render();
875
1246
  continue;
876
1247
  }
1248
+ if (submitted === '/help' || submitted === '/help next') {
1249
+ activity.push(
1250
+ 'Next TUI: /side · /sidetab — 세션/PTY 목록',
1251
+ '사이드탭: Ctrl+\\ 토글 · ↑↓ 선택 · 빈 prompt Enter=attach · /side new · /side kill',
1252
+ '새 PTY: s shell · e elanous · c codex 구독 · l claude code 구독',
1253
+ 'PTY 분리: Ctrl+\\ 후 d · /term help 는 읽기 전용 목록 명령',
1254
+ );
1255
+ status = 'Enter 전송';
1256
+ render();
1257
+ continue;
1258
+ }
1259
+ if (submitted === '/side' || submitted === '/sidetab' || submitted.startsWith('/side ') || submitted.startsWith('/sidetab ')) {
1260
+ const args = submitted.slice(1).trim().split(/\s+/);
1261
+ const action = args[1]?.toLowerCase();
1262
+ if (action === 'help') {
1263
+ activity.push('/side [open|close|off|on|all|new|kill|help] · /sidetab 별칭', 'Ctrl+\\ 후 s=사이드탭 · p=부모 · 1–9=선택 · Esc=입력 · 목록 클릭=전환');
1264
+ status = 'Enter 전송';
1265
+ } else if (action === 'off') {
1266
+ const restoreOpen = sidetabOpen;
1267
+ if (sidetabOpen) await toggleSidetab();
1268
+ sidetabEnabled = false;
1269
+ if (restoreOpen) {
1270
+ sidetabOpenBySession.set(id!, true);
1271
+ updateSessionMeta(id!, (meta) => { meta.uiState = { ...meta.uiState, sidetabOpen: true }; });
1272
+ }
1273
+ status = '사이드탭 off · /side on 으로 이 세션에서 켜기';
1274
+ } else if (action === 'on') {
1275
+ sidetabEnabled = true;
1276
+ if (sidetabOpenBySession.get(id!) === true && !sidetabOpen) await toggleSidetab();
1277
+ status = sidetabOpen ? '사이드탭 on · 열림' : '사이드탭 on · /side open 으로 열기';
1278
+ } else if (action === 'open') {
1279
+ sidetabEnabled = true;
1280
+ if (!sidetabOpen) await toggleSidetab();
1281
+ } else if (action === 'close') {
1282
+ if (sidetabOpen) await toggleSidetab();
1283
+ } else if (action === 'all') {
1284
+ sidetabAll = !sidetabAll;
1285
+ sidetabEnabled = true;
1286
+ if (!sidetabOpen) await toggleSidetab();
1287
+ else refreshSidetabRows();
1288
+ status = sidetabAll ? '사이드탭 전체 목록' : '사이드탭 현재 세션 목록';
1289
+ } else if (action === 'kill') {
1290
+ if (!sidetabApi) sidetabApi = await import('./sidetab/list.js');
1291
+ refreshSidetabRows();
1292
+ const selected = sidetabRows[sidetabSelected];
1293
+ if (selected) {
1294
+ await ensureSidetabAttachments();
1295
+ sidetabAttachments?.kill(selected);
1296
+ refreshSidetabRows();
1297
+ } else {
1298
+ status = '종료할 PTY가 없습니다';
1299
+ }
1300
+ } else if (action === 'new') {
1301
+ sidetabEnabled = true;
1302
+ if (!sidetabOpen) await toggleSidetab();
1303
+ if (sidetabOpen) sidetabMode = 'new';
1304
+ } else {
1305
+ await toggleSidetab();
1306
+ }
1307
+ render();
1308
+ continue;
1309
+ }
877
1310
  if (submitted === '/term' || submitted.startsWith('/term ') || submitted === '/terminal' || submitted.startsWith('/terminal ')) {
878
1311
  const { dispatchNextTermSlash } = await import('./slash/term-next.js');
879
1312
  const args = submitted.slice('/'.length).trim().split(/\s+/).slice(1);
@@ -920,6 +1353,9 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
920
1353
  render();
921
1354
  }
922
1355
  } finally {
1356
+ if (sidetabRefreshTimer !== null) clearInterval(sidetabRefreshTimer);
1357
+ if (sidetabChordTimer !== null) clearTimeout(sidetabChordTimer);
1358
+ sidetabAttachments?.close();
923
1359
  restoreCliStderrSink?.();
924
1360
  restoreCliStderrSink = null;
925
1361
  if (residueTimer !== null) clearTimeout(residueTimer);
@@ -934,6 +1370,8 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
934
1370
  const { setNextTuiWakeupTool } = await import('../tui-client/next-wakeup.js');
935
1371
  setNextTuiWakeupTool(null);
936
1372
  }
1373
+ const { setNextSidetabHandler } = await import('../tui-client/local-chat-turn.js');
1374
+ setNextSidetabHandler(null);
937
1375
  turnAbort?.abort();
938
1376
  await turnDone;
939
1377
  backgroundSubscription.stop?.();