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
@@ -90,6 +90,8 @@ export interface TasksCliDeps {
90
90
  adoptRunTerminal?: typeof import('../task-agent/adopt-pr.js').adoptedRunTerminal;
91
91
  /** `tasks show`·`advance` 의 런 근거 읽기(시험 주입) — 기본 = 런 원장(이 우주 ⊕ 연합) ⊕ 호스트 logs 의 Pod job-finished. */
92
92
  cardRunEvidence?: CardRunEvidenceDeps;
93
+ /** `tasks show --json` 의 저작 골 파일 조회(시험 주입). null 은 골 연결을 확인하지 못한 상태다. */
94
+ cardGoalDocument?: (goalId: string) => { goalFile: string; goalBody: string } | null;
93
95
  /** `tasks live-verified` 가 적는 런 원장 디렉터리(시험 주입). 기본 = `runLedgerDir()`. */
94
96
  liveVerifiedLedgerDir?: string;
95
97
  /** HARNESS-PARENT-ON-MSB1 — 원격 부모 카드의 원장 거울(시험 주입). 기본 = ssh 로 `<prodRoot>/remote-parents/<host>/run-ledger`. */
@@ -189,8 +191,6 @@ export interface DefaultTaskLauncherDeps {
189
191
  localVersion?: string;
190
192
  /** HQ-owned, refresh-less Codex access mirror to install before a remote parent launch. */
191
193
  codexAccessMirror?: () => Promise<{ elanousAuth: string; codexAuth: string; account?: string; usedPercent?: number; thresholdPercent?: number; mirrors?: Array<{ elanousAuth: string; codexAuth: string; account: string; usedPercent?: number; thresholdPercent: number; expiresAt: number }> } | null>;
192
- /** HQ-owned Grok subscription access mirror; resolved before the first remote SSH call. */
193
- grokAccessMirror?: () => import('../task-agent/parent-host.js').OwnerGrokAccessMirror;
194
194
  /** Clock used to recheck mirror freshness immediately before installation. */
195
195
  now?: () => number;
196
196
  /** Isolated integration seam; production still reads the HQ rotation snapshot and config directly. */
@@ -205,6 +205,18 @@ export interface DefaultTaskLauncherDeps {
205
205
 
206
206
  class NoEligibleOwnerCodexAccountError extends Error {}
207
207
 
208
+ /** Only declared Pod launch switches cross from HQ to the remote parent. */
209
+ export function podParentLaunchSelectors(contextEnv: Record<string, string>, inheritedEnv: NodeJS.ProcessEnv): Record<string, string> {
210
+ const selectors: Record<string, string> = {};
211
+ for (const key of ['ELANOUS_POD_MEMORY_TIER', 'ELANOUS_POD_MEMORY', 'ELANOUS_POD_MEMORY_HIGH', 'ELANOUS_POD_MEMORY_LITE', 'ELANOUS_POD_GOAL_TYPE'] as const) {
212
+ const value = contextEnv[key] ?? inheritedEnv[key];
213
+ if (value !== undefined) selectors[key] = value;
214
+ }
215
+ const inplace = contextEnv.ELANOUS_POD_INPLACE_WORKTREE ?? inheritedEnv.ELANOUS_POD_INPLACE_WORKTREE;
216
+ if (inplace !== undefined) selectors.ELANOUS_POD_INPLACE_WORKTREE = inplace === '1' ? '1' : '0';
217
+ return selectors;
218
+ }
219
+
208
220
  /**
209
221
  * HARNESS-PARENT-ON-MSB1 — 켜져 있고 발사 전 점검이 통과하면 원격(ssh)에서 부모를 띄운다(PR 까지만 · 병합은 HQ).
210
222
  * 막히면 null — 호출부가 종전 로컬 발사로 간다(관측: task-agent parent-host-fallback).
@@ -223,9 +235,21 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
223
235
  ?? (args.includes('--child-llm-provider') ? args[args.indexOf('--child-llm-provider') + 1] : undefined);
224
236
  const effectiveChildProvider = context.effectiveChildProvider ?? providerFromArgs;
225
237
  const notice = deps.notice ?? ((line: string) => { try { process.stderr.write(`${line}\n`); } catch { /* ignore */ } });
238
+ const provisionRequests = new Set<string>();
239
+ const provision = (host: string, reason: string): void => {
240
+ const key = `${host}:${reason}`;
241
+ if (provisionRequests.has(key)) return;
242
+ provisionRequests.add(key);
243
+ try { debug.log('task-agent.parent-host', 'provision-requested', { host, runId: context.runId, provider: effectiveChildProvider ?? 'openai-codex', reason }); } catch { /* fail-soft */ }
244
+ notice(`[parent-host] ${host} provision 요청 — ${reason}; 준비 완료 전 배정 대기`);
245
+ };
226
246
  const failed = (target: typeof targets[number], gaps: string[], facts: Record<string, string> = {}): void => {
227
247
  try { debug.log('task-agent', 'parent-host-fallback', { host: target.host, runId: context.runId, gaps, facts }); } catch { /* fail-soft */ }
228
- notice(`[parent-host] ${target.host} 로 못 띄움 — ${multi ? '다음 호스트 또는 로컬 발사로 간다' : '로컬 발사로 간다'}: ${gaps.join(' · ')}`);
248
+ // grok-credential-* 은 호스트가 스스로 보고한 자체 자격 상태다 — 무효면 OP 재로그인 요청이 나간다.
249
+ const provisionGaps = ['grok-cli-missing', 'codex-cli-missing', 'grok-credential-missing', 'grok-credential-expiring', 'grok-credential-expired', 'codex-access-mirror-unavailable'];
250
+ const missing = gaps.every((gap) => provisionGaps.includes(gap)) ? gaps : [];
251
+ notice(`[parent-host] ${target.host} 로 못 띄움 — ${missing.length ? '공급자 준비 뒤 재시도' : multi ? '다음 호스트 또는 로컬 발사로 간다' : '로컬 발사로 간다'}: ${gaps.join(' · ')}`);
252
+ for (const gap of missing) provision(target.host, gap);
229
253
  };
230
254
  type OwnerMirror = { elanousAuth: string; codexAuth: string; account?: string; usedPercent?: number; thresholdPercent?: number; mirrors?: Array<{ elanousAuth: string; codexAuth: string; account: string; usedPercent?: number; thresholdPercent: number; expiresAt: number }> };
231
255
  let accessMirror: OwnerMirror | null | undefined;
@@ -313,11 +337,9 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
313
337
  // 그 앞의 readParentHostCapacity 도 ssh). 가드를 아래로 내리면 hold 경로에서 시험이 실 ssh 를 쏜다(R7 사고 모양).
314
338
  // hold 경로를 재는 시험은 deps.ssh 가짜 또는 parentHost:null 을 주입한다(real-launch-guard.test 가 이 순서를 문다).
315
339
  if (!deps.ssh) (await import('../task-agent/real-launch-guard.js')).refuseRealLaunchUnderTest('remote-parent-ssh', targets.map((target) => target.host).join(','));
316
- // Grok access is selected/refreshed on HQ before preflight performs any SSH call. A missing or stale
317
- // subscription must fail closed without touching the remote host or falling back to a local launch.
318
- const grokAccessMirror = effectiveChildProvider === 'grok'
319
- ? (deps.grokAccessMirror?.() ?? parentHostModule.resolveOwnerGrokAccessMirror())
320
- : undefined;
340
+ // GROK-MIRROR-REAL-SCOPE: HQ does not select or copy its own Grok access for a remote parent. Each host keeps
341
+ // its own device-auth session, and the preflight below blocks the Grok child when the host reports it invalid
342
+ // (grok-credential-*) — that gap drives the OP re-login request instead of a silent local fallback.
321
343
  let launchHoldActive = false;
322
344
  try {
323
345
  if (deps.launchHoldActive) launchHoldActive = deps.launchHoldActive();
@@ -328,7 +350,7 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
328
350
  }
329
351
  } catch { launchHoldActive = true; /* 못 읽으면 막힌 것으로(fail-closed) */ }
330
352
  const podGoal = context.substrate === 'pod' ? context.podGoal : undefined;
331
- // 부모에서 잰 메모리 선택자만 원격 자식에도 넘긴다. 로컬의 나머지 환경·자격은 SSH 로 복사하지 않는다.
353
+ // Pod 선택자만 원격 부모에 넘긴다. 로컬의 나머지 환경·자격은 SSH 로 복사하지 않는다.
332
354
  const remoteEnv = { ...context.env };
333
355
  // These labels describe an HQ-selected Codex access mirror; never forward an inherited label by itself.
334
356
  delete remoteEnv.ELANOUS_REMOTE_CODEX_ACCOUNT;
@@ -336,10 +358,7 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
336
358
  delete remoteEnv.ELANOUS_REMOTE_CODEX_THRESHOLD_PERCENT;
337
359
  delete remoteEnv.ELANOUS_REMOTE_CODEX_ACCOUNTS;
338
360
  delete remoteEnv.ELANOUS_REMOTE_CODEX_ACCESS_ONLY;
339
- if (podGoal) for (const key of ['ELANOUS_POD_MEMORY_TIER', 'ELANOUS_POD_MEMORY', 'ELANOUS_POD_MEMORY_HIGH', 'ELANOUS_POD_MEMORY_LITE', 'ELANOUS_POD_GOAL_TYPE'] as const) {
340
- const value = context.env[key] ?? process.env[key];
341
- if (value !== undefined) remoteEnv[key] = value;
342
- }
361
+ if (podGoal) Object.assign(remoteEnv, podParentLaunchSelectors(context.env, process.env));
343
362
  const memoryLimit = podGoal ? (await import('../task-orchestrator/surfaces/self-implement-pod.js')).podMemoryLimitFor(podGoal, remoteEnv).limit : undefined;
344
363
  const fits = Object.fromEntries(targets.map((target) => {
345
364
  const fit = memoryLimit
@@ -354,7 +373,9 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
354
373
  const details = targets.map((target) => `${target.host}: Pod ${fits[target.host]!.memoryLimit} (${fits[target.host]!.requiredBytes} bytes) > node allocatable ${fits[target.host]!.allocatableBytes} bytes`).join(' · ');
355
374
  throw new Error(`parent-host memory-never-fits — ${details}; local fallback refused`);
356
375
  }
357
- const capacities = Object.fromEntries(multi ? eligible.map((target) => [target.host, parentHostModule.readParentHostCapacity(target, deps.ssh)]) : []);
376
+ const capacities: Record<string, import('../task-agent/parent-host.js').ParentHostCapacity | null> = Object.fromEntries(
377
+ multi ? eligible.map((target) => [target.host, parentHostModule.readParentHostCapacity(target, deps.ssh)]) : [],
378
+ );
358
379
  const measured = eligible.filter((target) => fits[target.host]?.state === 'fits');
359
380
  const unknown = eligible.filter((target) => fits[target.host]?.state !== 'fits');
360
381
  const ranked = multi
@@ -372,11 +393,14 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
372
393
  };
373
394
  for (const target of ordered) {
374
395
  if (multi && (!capacities[target.host] || capacities[target.host]!.approvalHeadroom <= 0)) {
375
- failed(target, ['capacity-unavailable']);
396
+ const capacity = capacities[target.host];
397
+ failed(target, [`capacity-unavailable · ${capacity
398
+ ? `host active=${capacity.active} waiting=${capacity.waiting} limit=${capacity.limit} headroom=${capacity.headroom}`
399
+ : 'measurement=unknown'}`]);
376
400
  continue;
377
401
  }
378
402
  let preflight: ReturnType<typeof parentHostModule.preflightParentHost>;
379
- try { preflight = parentHostModule.preflightParentHost({ target, localVersion: deps.localVersion ?? parentHostModule.localElanousVersion(), launchHoldActive, ...(deps.ssh ? { ssh: deps.ssh } : {}) }); }
403
+ try { preflight = parentHostModule.preflightParentHost({ target, localVersion: deps.localVersion ?? parentHostModule.localElanousVersion(), launchHoldActive, childProvider: effectiveChildProvider ?? 'openai-codex', ...(deps.ssh ? { ssh: deps.ssh } : {}) }); }
380
404
  catch (error) { failed(target, [`preflight-error: ${error instanceof Error ? error.message : String(error)}`]); continue; }
381
405
  if (!preflight.ok) { failed(target, preflight.gaps, preflight.facts); continue; }
382
406
  if (preflight.warnings.length) notice(`⚠ ${target.host} 자격: ${preflight.warnings.join(' · ')}`);
@@ -422,8 +446,7 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
422
446
  else {
423
447
  try { debug.log('task-agent.parent-host', 'codex-access-mirror-unavailable', { host: target.host, runId: context.runId, reason: mirrorReason }); } catch { /* fail-soft */ }
424
448
  failed(target, ['codex-access-mirror-unavailable']);
425
- recordHostRanking(null);
426
- return null;
449
+ continue;
427
450
  }
428
451
  if (selected?.account) {
429
452
  remoteEnv.ELANOUS_REMOTE_CODEX_ACCOUNT = selected.account;
@@ -433,8 +456,7 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
433
456
  if (mirrors) remoteEnv.ELANOUS_REMOTE_CODEX_ACCOUNTS = JSON.stringify(mirrors.map(({ account, usedPercent, thresholdPercent, expiresAt }) => ({ account, usedPercent: usedPercent ?? null, thresholdPercent, expiresAt })));
434
457
  remoteEnv.ELANOUS_REMOTE_CODEX_ACCESS_ONLY = '1';
435
458
  }
436
- const launched = parentHostModule.launchRemoteParent(target, args, remoteEnv, deps.ssh,
437
- grokAccessMirror ? () => grokAccessMirror : undefined, effectiveChildProvider, deps.now);
459
+ const launched = parentHostModule.launchRemoteParent(target, args, remoteEnv, deps.ssh, effectiveChildProvider);
438
460
  recordHostRanking(target.host);
439
461
  try { debug.log('task-agent', 'parent-host-launched', { host: target.host, runId: context.runId, pid: launched.pid, log: launched.log }); } catch { /* fail-soft */ }
440
462
  return { runId: context.runId, parentHost: { host: target.host, ...(target.configDir ? { configDir: target.configDir } : {}), pid: launched.pid, log: launched.log } };
@@ -447,6 +469,7 @@ async function tryRemoteParent(args: string[], cwd: string | undefined, context:
447
469
  }
448
470
  }
449
471
  recordHostRanking(null);
472
+ if (provisionRequests.size > 0) throw new Error(`parent-host-provision-pending: ${[...provisionRequests].join(', ')}; no child provider host launched`);
450
473
  return null;
451
474
  }
452
475
 
@@ -2486,14 +2509,17 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
2486
2509
  .option('--card <id>', '기존 launched 카드(미바인딩 또는 같은 PR이 등록부에서 바인딩됨)')
2487
2510
  .option('--checklist <id>', '새 카드에 붙일 체크리스트 칸')
2488
2511
  .option('--version <version>', '체크리스트 판(기존 카드에도 고정 가능)')
2512
+ .option('--rebind', '옛 판 또는 failed 카드의 기존 PR 결속을 풀고 지정 판의 새 카드로 원자 이동')
2489
2513
  .option('--unlinked-terminal', '기존 카드의 모든 구현 자식이 종결되고 PR 사건이 전혀 없을 때만 별도로 열린 PR을 명시적으로 입양')
2490
2514
  .option('--json', 'JSON 출력')
2491
- .action(async (value: string, opts: { card?: string; checklist?: string; version?: string; unlinkedTerminal?: boolean; json?: boolean }) => {
2515
+ .action(async (value: string, opts: { card?: string; checklist?: string; version?: string; rebind?: boolean; unlinkedTerminal?: boolean; json?: boolean }) => {
2492
2516
  await registerTaskAgentSink(deps.registerSink);
2493
2517
  try {
2494
2518
  if (!/^[1-9]\d*$/.test(value) || !Number.isSafeInteger(Number(value))) throw new Error(`PR 번호가 아니다: ${value}`);
2495
2519
  if ((opts.card === undefined) === (opts.checklist === undefined))
2496
2520
  throw new Error('--card 또는 --checklist [--version] 중 하나만 준다');
2521
+ if (opts.rebind && (opts.card || !opts.checklist || !opts.version || opts.unlinkedTerminal))
2522
+ throw new Error('--rebind는 --checklist와 --version을 지정하고 --card/--unlinked-terminal은 생략한다');
2497
2523
  if (opts.unlinkedTerminal && !opts.card) throw new Error('--unlinked-terminal은 --card와 함께 준다');
2498
2524
  if (opts.version) validateVersion(opts.version);
2499
2525
  let cardVersion = opts.version;
@@ -2534,15 +2560,28 @@ export function registerTasksCommands(program: Command, deps: TasksCliDeps = {})
2534
2560
  const linkedEvidence = targetCard ? checkRun(targetCard, view) : undefined;
2535
2561
  const terminalRunEvidence = linkedEvidence || (opts.unlinkedTerminal && targetCard ? checkRun(targetCard, view, undefined, true) : false);
2536
2562
  const unlinkedTerminalUsed = opts.unlinkedTerminal === true && linkedEvidence !== true;
2563
+ let rebindSource: { card: TaskCard; terminalRunEvidence: boolean } | undefined;
2564
+ if (opts.rebind) {
2565
+ const statePath = deps.taskStatePath ?? taskStatePathDefault();
2566
+ const bound = Object.values(readTaskAgentState<{ tasks?: Record<string, TaskCard> }>(statePath).tasks ?? {})
2567
+ .filter((card) => cardPrNumber(card) === number);
2568
+ if (bound.length !== 1) throw new Error(bound.length
2569
+ ? `PR #${number}가 여러 카드에 묶였다 — 임의로 rebind하지 않는다`
2570
+ : `PR #${number}가 기존 카드에 묶이지 않았다 — --rebind 대상 없음`);
2571
+ const source = bound[0]!;
2572
+ rebindSource = { card: source, terminalRunEvidence: source.status === 'launched' ? checkRun(source, view) : false };
2573
+ }
2537
2574
  const chosen = observedChecklist ?? checklist;
2538
2575
  const result = adoptExistingPr({ pr: view, repo, statePath: deps.taskStatePath ?? taskStatePathDefault(),
2539
2576
  ...(opts.card ? { cardId: opts.card, version: cardVersion, terminalRunEvidence, unlinkedTerminal: unlinkedTerminalUsed, observedChecklist,
2540
2577
  observedRun: { runId: targetCard?.runId, runChildId: targetCard?.runChildId, parentHost: targetCard?.parentHost?.host, launchId: targetCard?.launchId } } : {}),
2578
+ ...(rebindSource ? { rebindSource } : {}),
2579
+ ...(opts.rebind && opts.version ? { version: opts.version } : {}),
2541
2580
  ...(chosen ? { checklistAtWrite: () => (deps.adoptChecklist ?? listChecklist)(chosen.version).items.find((item) => item.id === chosen.id) } : {}),
2542
2581
  ...(checklist ? { checklist } : {}) });
2543
2582
  try { debug.log('task-agent', 'pr-adopted', { card: result.card.id, pr: number, head: view.headRefOid, created: result.created, changed: result.changed, launched: false }); } catch { /* fail-soft */ }
2544
- if (opts.json) out(JSON.stringify({ card: result.card.id, pr: number, head: view.headRefOid, created: result.created, changed: result.changed, next: `tasks rejudge ${result.card.id}` }));
2545
- else out(`${result.card.id}\tPR #${number}\t${result.changed ? 'adopted' : 'already-adopted'}\t구현 발사 0 · 다음: tasks rejudge ${result.card.id}`);
2583
+ if (opts.json) out(JSON.stringify({ card: result.card.id, ...(result.previousCardId ? { previousCard: result.previousCardId } : {}), pr: number, head: view.headRefOid, created: result.created, changed: result.changed, next: `tasks rejudge ${result.card.id}` }));
2584
+ else out(`${result.card.id}\tPR #${number}\t${result.changed ? 'adopted' : 'already-adopted'}${result.previousCardId ? ` · 이전 카드 ${result.previousCardId} 결속 해제` : ''}\t구현 발사 0 · 다음: tasks rejudge ${result.card.id}`);
2546
2585
  } catch (error) {
2547
2586
  out(error instanceof Error ? error.message : String(error));
2548
2587
  process.exitCode = 1;
@@ -6,6 +6,7 @@ import { readNexusRuntime } from '../nexus/runtime.js';
6
6
  import { TASK_CARD_PREFIX } from '../task-agent/task-card-prefix.js';
7
7
  import type { Task } from '../task-orchestrator/types.js';
8
8
  import type { TasksCliDeps } from './tasks-cli.js';
9
+ import { writeStdoutFully } from './stdout-flush.js';
9
10
 
10
11
  /**
11
12
  * CLI-ENTRY-LAZY — `tasks list`·`tasks show` 의 등록과 넥서스 조회 보조.
@@ -100,6 +101,7 @@ export function handleError(error: unknown, out: (line: string) => void): void {
100
101
  export interface TasksCliContext {
101
102
  deps: TasksCliDeps;
102
103
  out: (line: string) => void;
104
+ outFully: (line: string) => Promise<void>;
103
105
  authenticate: () => { baseUrl: string; token?: string };
104
106
  clearToken: () => void;
105
107
  }
@@ -107,9 +109,15 @@ export interface TasksCliContext {
107
109
  export function createTasksCliContext(deps: TasksCliDeps): TasksCliContext {
108
110
  let activeToken: string | undefined;
109
111
  const output = deps.output ?? console.log;
112
+ const maskToken = (line: string) => activeToken ? line.replaceAll(activeToken, '[redacted]') : line;
110
113
  return {
111
114
  deps,
112
- out: (line: string) => output(activeToken ? line.replaceAll(activeToken, '[redacted]') : line),
115
+ out: (line: string) => output(maskToken(line)),
116
+ outFully: async (line: string) => {
117
+ const safeLine = maskToken(line);
118
+ if (deps.output) output(safeLine);
119
+ else await writeStdoutFully(safeLine);
120
+ },
113
121
  authenticate: () => {
114
122
  const auth = credentials(deps);
115
123
  activeToken = auth?.token;
@@ -126,7 +134,7 @@ export function registerTasksRoot(program: Command): Command {
126
134
  }
127
135
 
128
136
  export function registerTaskListCommand(tasks: Command, ctx: TasksCliContext): void {
129
- const { deps, out, authenticate } = ctx;
137
+ const { deps, out, outFully, authenticate } = ctx;
130
138
  tasks.command('list')
131
139
  .description('우선순위와 생성 시각 순으로 태스크 보기')
132
140
  .option('--status <s>', '상태로 필터')
@@ -152,7 +160,7 @@ export function registerTaskListCommand(tasks: Command, ctx: TasksCliContext): v
152
160
  if (!opts.provider || (data.task.generatedBy?.kind === 'external' && data.task.generatedBy.provider === opts.provider)) rows.push(data.task);
153
161
  }
154
162
  rows.sort(taskOrder);
155
- if (opts.json) out(JSON.stringify(rows));
163
+ if (opts.json) await outFully(JSON.stringify(rows));
156
164
  else {
157
165
  out('id\t우선순위\t상태\t승인\t출처\t제목');
158
166
  for (const row of rows) out(taskLine(row));
@@ -162,7 +170,7 @@ export function registerTaskListCommand(tasks: Command, ctx: TasksCliContext): v
162
170
  }
163
171
 
164
172
  export function registerTaskShowCommand(tasks: Command, ctx: TasksCliContext): void {
165
- const { deps, out, authenticate } = ctx;
173
+ const { deps, out, outFully, authenticate } = ctx;
166
174
  tasks.command('show <id>')
167
175
  .description(`태스크 상세 보기 (id 가 \`${TASK_CARD_PREFIX}\` 로 시작하면 TASK-AGENT 과제 카드 ⊕ 다음 수)`)
168
176
  .option('--json', 'JSON 출력')
@@ -179,7 +187,7 @@ export function registerTaskShowCommand(tasks: Command, ctx: TasksCliContext): v
179
187
  if (!response.ok) throw httpError(response);
180
188
  const data = await responseJson(response) as { task?: TaskRow };
181
189
  if (!data?.task) throw new Error('넥서스 태스크 상세 형식이 유효하지 않다');
182
- if (opts.json) out(JSON.stringify(data));
190
+ if (opts.json) await outFully(JSON.stringify(data));
183
191
  else {
184
192
  out(taskLine(data.task));
185
193
  out(JSON.stringify(data, null, 2));
@@ -16,7 +16,7 @@ import { filterPublicDemoContext } from './context-now-public.js';
16
16
 
17
17
  export type ContextFact =
18
18
  | { kind: 'version'; version: string; source: string }
19
- | { kind: 'cell'; version: string; id: string; title: string; status: string; owner: string | null; source: string }
19
+ | { kind: 'cell'; version: string; id: string; title: string; status: string; owner: string | null; source: string; priority?: string | null }
20
20
  | { kind: 'decision'; id: string; title: string; status: string; dueAt: string | null; source: string }
21
21
  | { kind: 'seat'; seat: string; at: string; status: string; id: string | null; title: string | null; source: string }
22
22
  | { kind: 'run'; goal: string; phase: string; elapsed: string; source: string; unreadable?: string }
@@ -157,7 +157,8 @@ export function contextNow(options: { topic?: string; limit?: number; audience?:
157
157
  for (const item of checklist.items) {
158
158
  if (item.status === 'done') continue;
159
159
  facts.push({ kind: 'cell', version: v, id: item.id, title: redactSecretText(item.title.split(/\r?\n/, 1)[0] ?? '').slice(0, 120),
160
- status: item.status, owner: item.owner ?? null, source: `elanous://release/${v}/checklist#${encodeURIComponent(item.id)}` });
160
+ status: item.status, owner: item.owner ?? null, priority: item.priority ?? null,
161
+ source: `elanous://release/${v}/checklist#${encodeURIComponent(item.id)}` });
161
162
  }
162
163
  }
163
164
  for (const item of (deps.decisions ?? (() => new DecisionLedger().list({ status: 'open' })))()) {
@@ -218,6 +219,89 @@ export function contextNow(options: { topic?: string; limit?: number; audience?:
218
219
  return options.audience === 'public-demo' ? filterPublicDemoContext(answer, deps.brandCheck) : answer;
219
220
  }
220
221
 
222
+ export type AskOpContextTopic = 'release' | 'required' | 'train' | 'incident' | 'decision' | 'general';
223
+ export type AskOpContextBundle = {
224
+ queriedAt: string;
225
+ topic: AskOpContextTopic;
226
+ facts: Array<{ kind: string; summary: string; source: string; observedAt: string }>;
227
+ gaps: Array<{ kind: string; reason: string }>;
228
+ };
229
+
230
+ function askOpTopic(question: string): AskOpContextTopic {
231
+ const text = question.toLocaleLowerCase();
232
+ if (/열차|착지|병합|merge|train|pull request|\bpr\b/.test(text)) return 'train';
233
+ if (/사고|장애|incident|failure|실패|에러|오류/.test(text)) return 'incident';
234
+ if (/결정|승인|decision|approval/.test(text)) return 'decision';
235
+ if (/필수|p0|must|required|우선순위/.test(text)) return 'required';
236
+ if (/발행|출시|릴리스|release|컷|cut|게이트|gate|이번 판|다음 판|판 진도|\b\d+\.\d+\.\d+\b/.test(text)) return 'release';
237
+ return 'general';
238
+ }
239
+
240
+ /** A small evidence packet for an OP answer. A missing source stays a gap, never an inferred fact. */
241
+ export function buildAskOpContextBundle(
242
+ question: string,
243
+ snapshot: ContextNowAnswer,
244
+ options: { audience?: 'operator' | 'public-demo'; limit?: number } = {},
245
+ ): AskOpContextBundle {
246
+ const answer = options.audience === 'public-demo' ? filterPublicDemoContext(snapshot) : snapshot;
247
+ const topic = askOpTopic(question);
248
+ const limit = typeof options.limit === 'number' && Number.isFinite(options.limit)
249
+ ? Math.max(1, Math.min(20, Math.floor(options.limit))) : 8;
250
+ const facts: AskOpContextBundle['facts'] = [];
251
+ const gaps: AskOpContextBundle['gaps'] = [];
252
+ const pushFact = (kind: string, summary: string, source: string, observedAt: string) => {
253
+ if (facts.length < limit) facts.push({ kind, summary: oneLine(summary), source, observedAt });
254
+ };
255
+ const relevant = (kind: ContextFact['kind']) => topic === 'general'
256
+ || (topic === 'release' && (kind === 'release' || kind === 'version'))
257
+ || (topic === 'required' && kind === 'cell')
258
+ || (topic === 'decision' && kind === 'decision')
259
+ || (topic === 'incident' && kind === 'run');
260
+ for (const fact of answer.facts) {
261
+ if (!relevant(fact.kind)) continue;
262
+ if ('unreadable' in fact && fact.unreadable) {
263
+ gaps.push({ kind: fact.kind, reason: fact.unreadable });
264
+ continue;
265
+ }
266
+ if (topic === 'required' && fact.kind === 'cell' && fact.priority !== 'P0') continue;
267
+ if (topic === 'incident' && fact.kind === 'run' && !/fail|error|timeout|실패|오류|정지|중단/i.test(`${fact.phase} ${fact.goal}`)) continue;
268
+ if (topic === 'train') continue;
269
+ const summary = fact.kind === 'version' ? `판 ${fact.version}`
270
+ : fact.kind === 'cell' ? `${fact.id} ${fact.status} ${fact.title}`
271
+ : fact.kind === 'decision' ? `${fact.id} ${fact.status} ${fact.title}`
272
+ : fact.kind === 'seat' ? `${fact.seat} ${fact.status} ${fact.id ?? ''}`
273
+ : fact.kind === 'run' ? `${fact.goal} ${fact.phase} ${fact.elapsed}`
274
+ : fact.kind === 'release' ? `${fact.version} ${fact.node} ${fact.status}`
275
+ : `${fact.count ?? '미관측'}건 ${fact.names.join(', ')}`;
276
+ pushFact(fact.kind, summary, fact.source, fact.kind === 'seat' ? fact.at : answer.at);
277
+ }
278
+ const eventMatches = (kind: string, summary: string) => topic === 'general'
279
+ || (topic === 'train' && /train|열차|착지|병합|merge|\bpr\b/i.test(`${kind} ${summary}`))
280
+ || (topic === 'incident' && /incident|사고|장애|failure|실패|에러|오류|timeout/i.test(`${kind} ${summary}`));
281
+ for (const event of answer.events) {
282
+ if (eventMatches(event.kind, event.summary)) pushFact(event.kind, event.summary, event.source, event.at);
283
+ }
284
+ if (topic === 'required' && !facts.length) {
285
+ const cells = answer.facts.filter(fact => fact.kind === 'cell');
286
+ if (cells.some(fact => fact.priority == null)) gaps.push({ kind: 'cell', reason: '우선순위 미관측' });
287
+ else if (cells.length) gaps.push({ kind: 'cell', reason: '조회 범위에서 일치하는 P0 없음' });
288
+ }
289
+ if (!facts.length && !gaps.length) gaps.push({ kind: topic, reason: '미관측' });
290
+ if (topic === 'release' && !answer.facts.some(fact => fact.kind === 'release' && !('unreadable' in fact && fact.unreadable))
291
+ && !gaps.some(gap => gap.kind === 'release')) gaps.push({ kind: 'release', reason: '미관측' });
292
+ return { queriedAt: answer.at, topic, facts, gaps: gaps.slice(0, 3) };
293
+ }
294
+
295
+ /** Worker scan keeps ledger IO away from the OP inbox turn; the packet itself is bounded. */
296
+ export async function askOpContextBundle(
297
+ question: string,
298
+ options: { audience?: 'operator' | 'public-demo'; limit?: number } = {},
299
+ readSnapshot: () => Promise<ContextNowAnswer> = () => contextNowInWorker({ audience: 'operator', limit: 100 }),
300
+ ): Promise<AskOpContextBundle> {
301
+ try { return buildAskOpContextBundle(question, await readSnapshot(), { ...options, audience: options.audience ?? 'public-demo' }); }
302
+ catch { return { queriedAt: new Date().toISOString(), topic: askOpTopic(question), facts: [], gaps: [{ kind: 'context', reason: '조회 실패' }] }; }
303
+ }
304
+
221
305
  const workerAnswers = new Map<string, { promise: Promise<ContextNowAnswer>; expiresAt: number }>();
222
306
  const WORKER_ANSWER_TTL_MS = 5_000;
223
307
  const WORKER_SCAN_TIMEOUT_MS = 60_000;
@@ -25,7 +25,7 @@ import { drainPendingUserInput } from '../session/pending-input.js';
25
25
  import type { StreamWithToolsHandlers } from '../llm.js';
26
26
  import { debug, redactSecretText, withAmbientSessionScope } from '../debug/log.js';
27
27
  import { applyDeferredTools } from '../session-runtime/tier-flip.js';
28
- import { resolveSessionSurfaceProfile } from '../session-runtime/index.js';
28
+ import { buildResearchDateSystemMessage, resolveSessionSurfaceProfile } from '../session-runtime/index.js';
29
29
  import type {
30
30
  CoreTurnContext,
31
31
  CoreTurnResult,
@@ -239,12 +239,18 @@ export async function runCoreTurn(
239
239
  // 있으면 그 스코프의 deferred 툴을 active 로 선주입(ToolSearch 왕복 0).
240
240
  const recentUserText = extractRecentUserText(ctx.messages);
241
241
  const surfaceUserText = selectSurfaceUserText(ctx);
242
- const surface = resolveSessionSurfaceProfile({ userText: surfaceUserText });
242
+ const surface = ctx.surfaceProfile ?? resolveSessionSurfaceProfile({ userText: surfaceUserText });
243
243
  const { messages, tools, stats } = applyDeferredTools(
244
244
  ctx.messages,
245
245
  ctx.tools,
246
246
  { enabled: deferredEnabled, ...(recentUserText ? { userText: recentUserText } : {}) },
247
247
  );
248
+ if (surface.id === 'research/agent' && !messages.some((message) =>
249
+ message.role === 'system' && typeof message.content === 'string'
250
+ && message.content.startsWith('Current local date:'))
251
+ ) {
252
+ messages.unshift(buildResearchDateSystemMessage());
253
+ }
248
254
  if (debug.enabled) {
249
255
  debug.log('llm.request', 'tools-tier', {
250
256
  sessionId: ctx.sessionId,
@@ -282,6 +288,7 @@ export async function runCoreTurn(
282
288
  handlers,
283
289
  {
284
290
  tools,
291
+ researchTurn: surface.id === 'research/agent',
285
292
  signal: ctx.signal,
286
293
  ...(ctx.sessionId !== undefined ? { sessionId: ctx.sessionId } : {}),
287
294
  ...(ctx.maxToolTurns !== undefined ? { maxTurns: ctx.maxToolTurns } : {}),
@@ -137,6 +137,9 @@ export interface CoreTurnContext {
137
137
  originSessionId?: string;
138
138
  /** Original human prompt for this turn, forwarded to tool dispatch. */
139
139
  userText?: string;
140
+ /** Caller-selected surface. ACP passes its one per-turn verdict through;
141
+ * direct callers can omit it and let core-turn resolve from userText. */
142
+ surfaceProfile?: import('../session-runtime/index.js').SessionSurfaceProfile;
140
143
  /** Full prompt (system + history + current user blocks). */
141
144
  messages: LLMMessage[];
142
145
  /** Tool catalog the model may call this turn. Empty array means
@@ -5078,8 +5078,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
5078
5078
  };
5079
5079
 
5080
5080
  // P5 — register the mode-enter actions + default chord bindings so
5081
- // `Ctrl+B s` from input focus enters sync, `Ctrl+B c` enters
5082
- // control, `Ctrl+B g` returns to general. The `allowOverwrite`
5081
+ // `Ctrl+X s` from input focus enters sync, `Ctrl+X c` enters
5082
+ // control, `Ctrl+X g` returns to general. The `allowOverwrite`
5083
5083
  // flag is critical because this closure may re-run on hot-reload
5084
5084
  // scenarios (tests, plugin reinit) — the registry should be idempotent.
5085
5085
  // A2 — forward-declared toast hook. mouseWiring is initialized
@@ -5100,7 +5100,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
5100
5100
  handler: () => {
5101
5101
  enterSessionControlMode(chatModeState);
5102
5102
  void inputCoreSetMode(resolveSessionInputModeFromChatMode({ chatModeState }));
5103
- chatLines.push(C.error('-- CONTROL MODE —') + C.text(' (via ^B c chord)'));
5103
+ chatLines.push(C.error('-- CONTROL MODE —') + C.text(' (via ^X c chord)'));
5104
5104
  chatScrollOffset = -1;
5105
5105
  draw();
5106
5106
  pushModeToast('→ control mode', 'success');
@@ -7481,7 +7481,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7481
7481
  // Scratch visibility (Phase S5). When closed, the workingDir
7482
7482
  // layouts drop the scratch cell so the remaining panes expand
7483
7483
  // to fill the reclaimed columns — useful on narrow terminals.
7484
- // Reopen via the ^B ^S chord.
7484
+ // Reopen via the ^X ^S chord.
7485
7485
  let scratchClosed = false;
7486
7486
  const dashboardViewRegistryOptions = () => ({
7487
7487
  extraPanes: pluginHost.activeDashboardPanes().map(p => p.paneId),
@@ -7676,10 +7676,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7676
7676
  );
7677
7677
  };
7678
7678
 
7679
- // Prefix chord (Phase O6). tmux-style Ctrl+B arms the chord; the
7680
- // next key within the timeout window triggers a bound action
7681
- // (Ctrl+W / Ctrl+O for browser focus). HUD segment `chord` shows
7682
- // `[^B]` while armed so the user knows the terminal is waiting.
7679
+ // Prefix chord (Phase O6). Ctrl+X arms the chord; the next key
7680
+ // within the timeout window triggers a bound action. HUD segment
7681
+ // `chord` shows `[^X]` while armed.
7683
7682
  const chord: ChordState = createChord();
7684
7683
  const disarmChordHud = (): void => {
7685
7684
  disarmChord(chord);
@@ -7752,7 +7751,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7752
7751
  let previewTerminalDims: { cols: number; rows: number } | null = null;
7753
7752
  // Phase T7 — when true, the preview widget swells to the full
7754
7753
  // top-row width, hiding browser / scratch / obsidian / skill
7755
- // siblings. Toggled by `^B e` / `^B ㄷ` (global chord) and by `e`
7754
+ // siblings. Toggled by `^X e` / `^X ㄷ` (pane chord) and by `e`
7756
7755
  // on the focused preview pane (muscle memory). Auto-clears when
7757
7756
  // the terminal session exits.
7758
7757
  let terminalExpanded = false;
@@ -7909,7 +7908,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7909
7908
  };
7910
7909
 
7911
7910
  /** Shared helper for both the pane-level `t` key AND the global
7912
- * `Ctrl+B t` chord. Idempotent — calling while a session is
7911
+ * `Ctrl+X t` chord. Idempotent — calling while a session is
7913
7912
  * already alive just re-focuses the preview pane. Handles:
7914
7913
  * - view 4 (chat-only) → bounce to view 1 so wd-preview is visible
7915
7914
  * - wiring onUpdate / onExit callbacks with cleanup
@@ -8672,7 +8671,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
8672
8671
  widgetHost.register(planBoardWidget, 'builtin', 'src/widgets/plan-board.ts');
8673
8672
  }
8674
8673
  // NT4 — notification bell modal widget. Registered + spawned here
8675
- // so Ctrl+B b (NT5) can toggle without spawn latency. The bellOpen
8674
+ // so Ctrl+X b (NT5) can toggle without spawn latency. The bellOpen
8676
8675
  // flag + helpers live further down (after notificationStore is
8677
8676
  // created) because refreshBellInto reads from the store.
8678
8677
  widgetHost.register(bellModalWidget, 'builtin', 'src/notification-bell-modal.ts');
@@ -12492,8 +12491,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
12492
12491
  }
12493
12492
 
12494
12493
  /** N2 — open the shell-runner rollup popup centered on the viewport.
12495
- * Shared entry point for `/shell rollup` slash + `^B S` chord so
12496
- * keyboard users can access the same UI mouse users get by clicking
12494
+ * Entry point for `/shell rollup` so keyboard users can access the
12495
+ * same UI mouse users get by clicking
12497
12496
  * the 🐚 status-bar pill. Anchored-to-pill placement stays in
12498
12497
  * dashboard-mouse-wiring; this path is explicitly center-placed so
12499
12498
  * it works with status row unknown. */
@@ -13470,8 +13469,10 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13470
13469
  try {
13471
13470
  if (req.kind === 'shell') {
13472
13471
  const shellSeat = resolveTuiShellSeat(req.cwd, process.env.COORD_ID);
13472
+ const terminalSessionId = crypto.randomUUID();
13473
13473
  session = sessionRegistry.spawn(
13474
13474
  {
13475
+ id: terminalSessionId,
13475
13476
  title: 'terminal',
13476
13477
  cwd: req.cwd,
13477
13478
  command: req.command,
@@ -13481,7 +13482,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13481
13482
  registryKind: 'shell',
13482
13483
  registryNickname: `tui-shell:${req.cwd}`,
13483
13484
  registryOrigin: { originRoot: 'elanous-internal', controller: 'tui-shell' },
13484
- registryPurpose: `tui-shell:${shellSeat}`,
13485
+ registryPurpose: `tui-shell:${shellSeat}:session:${currentChatPersonaSessionId()}:terminal:${terminalSessionId}`,
13485
13486
  registrySeat: shellSeat,
13486
13487
  onExit: handleExit,
13487
13488
  onTitleAction: handleTitleAction,
@@ -14938,7 +14939,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
14938
14939
  chatScrollOffset = -1;
14939
14940
  break;
14940
14941
  // Phase T: spawn an embedded terminal in this pane. Same
14941
- // code path as the `Ctrl+B t` global chord.
14942
+ // code path as the `Ctrl+X t` pane chord.
14942
14943
  case 't': case 'ㅅ':
14943
14944
  openPreviewTerminal();
14944
14945
  break;
@@ -14954,7 +14955,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
14954
14955
  }
14955
14956
 
14956
14957
  // Ctrl+W (no chord armed — chord would have consumed the
14957
- // key earlier) closes the scratch pane. Reopen via the ^B ^S chord.
14958
+ // key earlier) closes the scratch pane. Reopen via the ^X ^S chord.
14958
14959
  if (key.ctrl && (key.name === 'w' || key.name === 'ㅈ')) {
14959
14960
  scratchClosed = true;
14960
14961
  userClosedPanes.add('scratch');
@@ -16233,7 +16234,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
16233
16234
  terminalExpanded = !terminalExpanded;
16234
16235
  previewTerminalDims = null;
16235
16236
  chatLines.push(C.muted(terminalExpanded
16236
- ? 'Terminal expanded. Ctrl+Shift+E or ^B e to restore.'
16237
+ ? 'Terminal expanded. Ctrl+Shift+E to restore.'
16237
16238
  : 'Terminal collapsed to preview slot.'));
16238
16239
  chatScrollOffset = -1;
16239
16240
  },