elanous 0.2.36 → 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 (741) 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/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{9250-072df22eaadaa6b5.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/{4304.e9b2512834a9e23e.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/1923-5c1695332240246a.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
  14. package/apps/pwa/out/_next/static/chunks/{7784.1f0ac4a16d190cf4.js → 2104.70e086d5174a4736.js} +1 -1
  15. package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/{6566.926a1d1b7c911442.js → 214.186a430da28338f1.js} +1 -1
  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/{5711.957b095705c12560.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/{4286.b70c4520306817e8.js → 3086.fb14b60ce98b53d3.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/{3148-98efd4869d660a87.js → 3124-561f7f037943cde2.js} +1 -1
  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/{3727.7949ccaacaa71242.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/3341-f09b9efbd7a82f70.js +1 -0
  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/{8904.7d51af2dc033965c.js → 3528.e4b8ab70d339f965.js} +2 -2
  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/{3031-85328a92fcce4da6.js → 4199-f7c6eb40cd0322f8.js} +1 -1
  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/4804.6012b5cd33c22792.js +90 -0
  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/{528.38ce20ef8aa251ff.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/5255-1b60d50eabe9f057.js +1 -0
  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/{2683.c9773a0c589b031b.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/{552.b7d061ad91eeac51.js → 5638.107314dc479e2f37.js} +2 -2
  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/{6925.562d532110879886.js → 6493.27ad77de7aac7966.js} +1 -1
  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/7000.28157393caaf5343.js +62 -0
  88. package/apps/pwa/out/_next/static/chunks/{275-02ea4c2a33980422.js → 7161-8f22db3ec5ed005e.js} +3 -3
  89. package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +1 -0
  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/{3136.30aaaa5fa03662a3.js → 7488.966b116789f3d41a.js} +1 -1
  93. package/apps/pwa/out/_next/static/chunks/{4116.a84a92a2492c080e.js → 7524.ce973525d30b3d52.js} +1 -1
  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/{3324.a09703033abcbd2f.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/{3410.7f9af5ab77cbe65f.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/{771.c3cdb6c1f7f47c02.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/{4615.8525eb0add35eba6.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/{6943.c6b24124853a47b2.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/{575.d929793a53f27c4b.js → 8911.bf5e712acb25fb6c.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/{9f31e478.fefcbcd3c388ebc5.js → 8994d93e.33ba491f95345fc2.js} +1 -1
  113. package/apps/pwa/out/_next/static/chunks/{da5ecc5c-b005ad8cac737d57.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/{599.c39c571b6733f2a2.js → 9223.cbcc88e0e9950426.js} +2 -2
  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/{8037.e254fd797aa224d1.js → 9581.da63ddf41acfad46.js} +1 -1
  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/{ceba0382.650712b56b85b582.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-c348a3959c5b5fc6.js +1 -0
  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-d1d1210f99f620ae.js +1 -0
  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-e7abc34a48a6f71e.js → page-291ab19fe2acb173.js} +1 -1
  153. package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +1 -0
  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-a9d9a3e66459c1e0.js +1 -0
  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-c15958835534404b.js → page-6b140f77593576eb.js} +1 -1
  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/{3a3d9966.cc4d4585a2708e7c.js → b7459770.6539b11860eb8a9c.js} +7 -7
  174. package/apps/pwa/out/_next/static/chunks/{053a429e.9a63436527cc751c.js → b7478fef.5917716286213fcc.js} +3 -3
  175. package/apps/pwa/out/_next/static/chunks/bb6987f9.3647e1a23b0e3217.js +122 -0
  176. package/apps/pwa/out/_next/static/chunks/{2812ca6a.3b9f4a7a08885744.js → de8b930d.d94c0f42acf807fc.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/{873d6c12.09bd499f57171543.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/_next/static/css/{b5d88eba78a3d7bf.css → be9019f696217521.css} +1 -1
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/graphs/drafts/recipes.yaml +27 -7
  279. package/graphs/release/recipes.yaml +9 -0
  280. package/graphs/release/release-loop.yaml +26 -18
  281. package/graphs/work/draft-close.yaml +54 -0
  282. package/graphs/work/green-close.yaml +37 -0
  283. package/graphs/work/recipes.yaml +46 -1
  284. package/graphs/work/run-research.yaml +35 -0
  285. package/package.json +1 -1
  286. package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
  287. package/scripts/ask-op-inbox-once.ts +17 -0
  288. package/scripts/boundary-proof-mapping-audit.ts +88 -0
  289. package/scripts/brand/check.ts +13 -4
  290. package/scripts/codex-fallback-live-probe.ts +17 -15
  291. package/scripts/fleet/node-setup.sh +32 -2
  292. package/scripts/fleet/run-light-worker.sh +9 -0
  293. package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
  294. package/scripts/gate-0226-failure-census.ts +546 -0
  295. package/scripts/goals/authoring-metrics.ts +258 -0
  296. package/scripts/graph-units/draft-close-node.ts +222 -0
  297. package/scripts/hook-order-sweep.ts +7 -4
  298. package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
  299. package/scripts/land-global-checks.ts +69 -1
  300. package/scripts/measure-nl-routing-corpus.ts +207 -2
  301. package/scripts/provision-export-redactions.ts +15 -0
  302. package/scripts/public-copy-lint.ts +122 -0
  303. package/scripts/public-export.ts +69 -2
  304. package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
  305. package/scripts/ratchets/train-side-invariants.sh +7 -1
  306. package/scripts/release-loop/cut-branch.ts +61 -12
  307. package/scripts/release-loop/docs-node.ts +140 -0
  308. package/scripts/release-loop/gate-closure.ts +48 -0
  309. package/scripts/release-loop/gate-diff.ts +2 -1
  310. package/scripts/release-loop/gate-node.ts +161 -25
  311. package/scripts/release-loop/gate-partial.ts +82 -3
  312. package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
  313. package/scripts/release-loop/gate-radius-live.ts +4 -2
  314. package/scripts/release-loop/known-issues-node.ts +6 -4
  315. package/scripts/release-loop/notes-repair.ts +216 -0
  316. package/scripts/release-loop/prepare-node.ts +61 -5
  317. package/scripts/release-loop/resume-cap.ts +2 -1
  318. package/scripts/release-loop/resume-release.ts +406 -7
  319. package/scripts/release-loop/resume-test-traffic.ts +10 -0
  320. package/scripts/release-loop/resume.ts +13 -5
  321. package/scripts/release-loop/traffic-node.ts +12 -4
  322. package/scripts/release-loop/traffic-transition.ts +53 -13
  323. package/scripts/release-loop/version-node.ts +109 -15
  324. package/scripts/train/green-leg.ts +176 -0
  325. package/scripts/tui-continue-real-evidence.ts +47 -0
  326. package/scripts/ux-sim.ts +1 -1
  327. package/scripts/video-pipeline.ts +2 -2
  328. package/src/acp/client.ts +31 -5
  329. package/src/acp/core-turn-bridge.ts +12 -1
  330. package/src/acp/stderr-summary.ts +49 -0
  331. package/src/agent/monad-agent-turn.ts +1 -0
  332. package/src/agent/run-context.ts +1 -1
  333. package/src/agent/task-notification.ts +3 -1
  334. package/src/agent/terminal-surface.ts +217 -0
  335. package/src/agent-substrate/pr-reviewer.ts +11 -3
  336. package/src/agent-substrate/review-observation.ts +10 -0
  337. package/src/agent-substrate/self-review-cli.ts +537 -57
  338. package/src/auto-research/question-ladder-contract.ts +137 -0
  339. package/src/auto-research/research-turn.ts +134 -0
  340. package/src/autopilot/discovery/doc-lint.ts +1 -1
  341. package/src/autopilot/lineage/sources.ts +1 -1
  342. package/src/autopilot/pr-manager.ts +64 -13
  343. package/src/boot/daemon-runtime.ts +35 -3
  344. package/src/boot/daemon-tools/pty-shell.ts +2 -1
  345. package/src/bots/screen-probe.ts +1 -1
  346. package/src/budget/run-usage-rollup.ts +12 -7
  347. package/src/budget/unified-usage.ts +20 -0
  348. package/src/capture/tui-self-report.ts +42 -5
  349. package/src/chat/index.ts +1 -0
  350. package/src/chat/tool-render/dispatch.ts +8 -1
  351. package/src/cli/autopilot-cli.ts +24 -9
  352. package/src/cli/decisions-cli.ts +7 -4
  353. package/src/cli/doctor-cli.ts +116 -7
  354. package/src/cli/guardian-cli.ts +3 -1
  355. package/src/cli/intake-cli.ts +48 -12
  356. package/src/cli/lesson-cli.ts +69 -9
  357. package/src/cli/logs-cli.ts +357 -2
  358. package/src/cli/memory-cli.ts +30 -1
  359. package/src/cli/msg-cli.ts +15 -11
  360. package/src/cli/pr-granularity.ts +5 -3
  361. package/src/cli/pr-land-overlap-evidence.ts +38 -5
  362. package/src/cli/pr-land-refusal.ts +1 -1
  363. package/src/cli/pty-takeover-cli.ts +58 -5
  364. package/src/cli/release-checklist-read-cli.ts +112 -4
  365. package/src/cli/release-cli.ts +89 -18
  366. package/src/cli/review-carry.ts +77 -0
  367. package/src/cli/self-update.ts +24 -6
  368. package/src/cli/self-utterances-cli.ts +13 -16
  369. package/src/cli/tasks-card-show.ts +31 -1
  370. package/src/cli/tasks-cli.ts +370 -33
  371. package/src/cli/tasks-read-cli.ts +13 -5
  372. package/src/cli/usage-cli.ts +12 -10
  373. package/src/context-bus/claude-memory-import.ts +99 -0
  374. package/src/context-bus/context-now.ts +86 -2
  375. package/src/context-bus/long-term-memory.ts +125 -0
  376. package/src/core-turn/run-core-turn.ts +9 -2
  377. package/src/core-turn/run-goal-loop.ts +5 -2
  378. package/src/core-turn/types.ts +5 -0
  379. package/src/dashboard/chat/acp-chat.ts +9 -0
  380. package/src/dashboard/index.ts +115 -30
  381. package/src/dashboard/input/agent-wake.ts +43 -0
  382. package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
  383. package/src/dashboard/input/terminal-modal-router.ts +8 -159
  384. package/src/dashboard/replay-preview.ts +25 -0
  385. package/src/dashboard/side-basic-runtime.ts +61 -0
  386. package/src/dashboard/slash-runtime/dashboard-handlers.ts +19 -8
  387. package/src/dashboard/synchronized-frame-output.ts +74 -0
  388. package/src/dashboard/term-slash-runtime.ts +2 -0
  389. package/src/dashboard/turn-preamble.ts +28 -4
  390. package/src/display/coordinator.ts +45 -12
  391. package/src/display/resize-listener.ts +41 -20
  392. package/src/display/synchronized-output-region.ts +60 -0
  393. package/src/domains/guardian-tick.ts +9 -0
  394. package/src/domains/surface-events.ts +80 -1
  395. package/src/exec-requests/planner.ts +37 -2
  396. package/src/execution-loop/launch-gate.ts +4 -3
  397. package/src/git-fs/cli-stderr.ts +45 -0
  398. package/src/git-fs/gh-cli.ts +6 -3
  399. package/src/git-fs/git-cli.ts +11 -5
  400. package/src/git-fs/watcher.ts +27 -22
  401. package/src/git-fs/worktree.ts +19 -3
  402. package/src/graph-runner/graph-cli.ts +26 -2
  403. package/src/graph-runner/graph-grow.ts +37 -9
  404. package/src/graph-runner/graph-run-api.ts +3 -2
  405. package/src/graph-runner/runner.ts +34 -7
  406. package/src/graph-wizard/generate.ts +29 -6
  407. package/src/grok/credential.ts +107 -36
  408. package/src/harness/harness-cli-command.ts +179 -33
  409. package/src/harness/review-adapter.ts +26 -6
  410. package/src/hq/fence-wrapper.ts +1 -1
  411. package/src/hq/transfer.ts +1 -1
  412. package/src/index.ts +151 -18
  413. package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
  414. package/src/intake-plane/collect-telegram-saved.ts +54 -5
  415. package/src/interactive-terminal-modal.ts +3 -0
  416. package/src/keybindings.ts +17 -22
  417. package/src/llm/provider-credentials.ts +1 -1
  418. package/src/llm/route-decision.ts +13 -0
  419. package/src/llm-tool-name.ts +37 -0
  420. package/src/llm-tool-schema.ts +55 -0
  421. package/src/llm.ts +203 -21
  422. package/src/loops/checker.ts +100 -0
  423. package/src/loops/consensus.ts +26 -2
  424. package/src/loops/loop-cli.ts +9 -4
  425. package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
  426. package/src/loops/orchestrator/inbox-once.ts +28 -0
  427. package/src/loops/orchestrator/inbox.ts +130 -1
  428. package/src/loops/orchestrator/tick.ts +55 -7
  429. package/src/maturity/feature-maturity.ts +1 -0
  430. package/src/model-tier/llm-tier-map.ts +12 -17
  431. package/src/msg/msg-store.ts +17 -0
  432. package/src/native-tool-catalog.ts +1 -1
  433. package/src/nexus/api/channel-ask-op.ts +96 -0
  434. package/src/nexus/api/discord-trigger-bot.ts +28 -1
  435. package/src/nexus/api/graph-wizard-api.ts +27 -2
  436. package/src/nexus/api/grid.ts +24 -4
  437. package/src/nexus/api/http-server.ts +1 -1
  438. package/src/nexus/api/ops-api.ts +14 -6
  439. package/src/nexus/api/telegram-trigger-bot.ts +24 -0
  440. package/src/nexus/api/terminals.ts +28 -6
  441. package/src/nexus/state/state.ts +7 -1
  442. package/src/oauth/codex-account-store.ts +34 -1
  443. package/src/ops/loops-map.ts +46 -0
  444. package/src/ops/overview-cache.ts +22 -4
  445. package/src/ops/overview.ts +41 -5
  446. package/src/patents/ledger.ts +18 -1
  447. package/src/policy/llm-policy.ts +3 -1
  448. package/src/preview/terminal.ts +4 -2
  449. package/src/prompt-cache/anthropic.ts +2 -0
  450. package/src/prompt-enhance/enhance.ts +9 -4
  451. package/src/pty-shell/availability.ts +7 -0
  452. package/src/pty-shell/herdr-agent-report.ts +40 -31
  453. package/src/pty-shell/herdr-prune-stale.ts +17 -0
  454. package/src/pty-shell/herdr-sequence-lease.ts +60 -0
  455. package/src/pty-shell/pty-control-ipc.ts +187 -18
  456. package/src/pty-shell/pty-manifest.ts +16 -2
  457. package/src/pty-shell/registry.ts +25 -15
  458. package/src/pty-shell/tui-run-state.ts +235 -1
  459. package/src/release-loop/checklist.ts +50 -5
  460. package/src/release-loop/feature-store.ts +9 -9
  461. package/src/release-loop/gate-shards.ts +61 -0
  462. package/src/release-loop/landed-but-yellow.ts +93 -12
  463. package/src/release-loop/light-rc.ts +7 -4
  464. package/src/release-loop/rehearsal.ts +1 -1
  465. package/src/repl/index.ts +18 -0
  466. package/src/research/axis-fanout.ts +133 -0
  467. package/src/research/edge-decision.ts +88 -0
  468. package/src/research/output-router.ts +127 -0
  469. package/src/research-bridge/format.ts +16 -1
  470. package/src/research-bridge/index.ts +1 -0
  471. package/src/research-bridge/invoke.ts +41 -5
  472. package/src/seat-loop/seat-report.ts +1 -0
  473. package/src/self-dev/ask-launch-flow.ts +86 -10
  474. package/src/self-dev/decompose-proposal.ts +29 -18
  475. package/src/self-dev/decompose.ts +45 -9
  476. package/src/self-dev/dev-pipeline.ts +29 -7
  477. package/src/self-dev/draft-residue.ts +221 -2
  478. package/src/self-dev/draft-sweep.ts +254 -16
  479. package/src/self-dev/draft-triage-rules.ts +19 -5
  480. package/src/self-dev/orchestrate.ts +1 -0
  481. package/src/self-dev/review-provider-fallback.ts +45 -7
  482. package/src/self-dev/run-supervisor.ts +22 -7
  483. package/src/self-dev/shard-plan.ts +48 -0
  484. package/src/self-dev/shard-run.ts +310 -6
  485. package/src/self-implement/comment-only-source.ts +54 -0
  486. package/src/self-implement/doctor-visit.ts +108 -0
  487. package/src/self-implement/gate-artifacts.ts +6 -2
  488. package/src/self-implement/gate-baseline.ts +99 -1
  489. package/src/self-implement/gate-cli.ts +231 -82
  490. package/src/self-implement/gate-failure-signature.ts +44 -0
  491. package/src/self-implement/gate-remote.ts +30 -4
  492. package/src/self-implement/gate-scope.ts +13 -1
  493. package/src/self-implement/goal-author.ts +407 -21
  494. package/src/self-implement/goal-doc/section.ts +22 -0
  495. package/src/self-implement/goal-supervisor-fill.ts +110 -27
  496. package/src/self-implement/importer-test-index.ts +215 -2
  497. package/src/self-implement/knowhow-pack.ts +125 -12
  498. package/src/self-implement/l8-merge-queue.ts +198 -32
  499. package/src/self-implement/off-diff-evidence.ts +23 -0
  500. package/src/self-implement/orchestrator.ts +369 -33
  501. package/src/self-implement/pod-inplace-worktree.ts +82 -0
  502. package/src/self-implement/pod-warm-pool-profile.ts +2 -2
  503. package/src/self-implement/premise-review.ts +7 -5
  504. package/src/self-implement/review-round-brief.ts +300 -0
  505. package/src/self-implement/rework-policy.ts +14 -0
  506. package/src/self-implement/run-ledger.ts +428 -6
  507. package/src/self-implement/run-stop.ts +1 -1
  508. package/src/self-implement/running-runs.ts +17 -3
  509. package/src/self-implement/seams.ts +45 -16
  510. package/src/self-implement/self-implement-cli.ts +26 -2
  511. package/src/self-implement/stop-autoheal.ts +1 -0
  512. package/src/self-implement/test-seams.ts +13 -1
  513. package/src/self-implement/train-reach-grouping.ts +8 -2
  514. package/src/session/channel-ask-op-envelope.ts +36 -0
  515. package/src/session/channel-op-reply-route.ts +200 -0
  516. package/src/session/chat.ts +10 -1
  517. package/src/session/id-prefix.ts +60 -0
  518. package/src/session/index.ts +6 -0
  519. package/src/session-runtime/index.ts +18 -23
  520. package/src/skills/runner.ts +7 -3
  521. package/src/skills/tools/dev-harness.ts +2 -2
  522. package/src/skills/tools/pty.ts +5 -0
  523. package/src/skills/tools/schedule-wakeup.ts +1 -6
  524. package/src/status/bar.ts +3 -3
  525. package/src/status/metrics.ts +12 -1
  526. package/src/steward/rejudge-tick.ts +12 -5
  527. package/src/steward/resync-tick.ts +31 -4
  528. package/src/storage/file-lock.ts +17 -4
  529. package/src/task-agent/actions.ts +199 -4
  530. package/src/task-agent/adopt-pr.ts +63 -2
  531. package/src/task-agent/boundary-proof-mapping.ts +12 -0
  532. package/src/task-agent/boundary-proof-producer.ts +147 -0
  533. package/src/task-agent/completion-evidence.ts +2 -1
  534. package/src/task-agent/evidence-command-normalize.ts +42 -0
  535. package/src/task-agent/export-redactions-provision.ts +43 -0
  536. package/src/task-agent/green-close-recipe.ts +239 -0
  537. package/src/task-agent/green-sweep.ts +64 -10
  538. package/src/task-agent/live-moves.ts +48 -3
  539. package/src/task-agent/map-host-adapter.ts +134 -0
  540. package/src/task-agent/map-reduce.ts +158 -0
  541. package/src/task-agent/map-run-ledger.ts +226 -0
  542. package/src/task-agent/parent-host.ts +74 -17
  543. package/src/task-agent/rejudge-on-head.ts +72 -5
  544. package/src/task-agent/repair-cycle.ts +108 -8
  545. package/src/task-agent/repair-next-move.ts +12 -2
  546. package/src/task-agent/repair-worker.ts +37 -1
  547. package/src/task-agent/review-prior-fix.ts +12 -2
  548. package/src/task-agent/shadow.ts +188 -5
  549. package/src/task-agent/task-hand.ts +253 -20
  550. package/src/task-agent/task-parent-role-llm.ts +9 -0
  551. package/src/task-agent/tier-split.ts +40 -5
  552. package/src/task-agent/work-order.ts +53 -2
  553. package/src/task-orchestrator/dispatcher.ts +46 -1
  554. package/src/task-orchestrator/generator-prompt.ts +6 -0
  555. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
  556. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
  557. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
  558. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
  559. package/src/task-orchestrator/surfaces/pod-pool.ts +77 -8
  560. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +15 -9
  561. package/src/task-orchestrator/surfaces/self-implement-pod.ts +338 -79
  562. package/src/task-orchestrator/surfaces/self-implement.ts +37 -2
  563. package/src/terminal/session-registry.ts +1 -0
  564. package/src/terminal/terminal-modal-router.ts +156 -0
  565. package/src/testing/linux-env.ts +177 -0
  566. package/src/tool-hints/gate.ts +6 -4
  567. package/src/tool-hints/signals.ts +33 -1
  568. package/src/tui/chat/background-job-status.ts +8 -2
  569. package/src/tui/chat/goal-interim.ts +5 -1
  570. package/src/tui/entry.ts +722 -30
  571. package/src/tui/input/at-picker.ts +55 -0
  572. package/src/tui/sidetab/attach.ts +304 -0
  573. package/src/tui/sidetab/list.ts +176 -0
  574. package/src/tui/sidetab/nl-tool.ts +136 -0
  575. package/src/tui/slash/resume-command.ts +23 -0
  576. package/src/tui/slash/resume.ts +38 -35
  577. package/src/tui/slash/signals.ts +114 -0
  578. package/src/tui/slash/term-next.ts +72 -0
  579. package/src/tui-client/local-chat-turn.ts +31 -9
  580. package/src/user-config.ts +30 -3
  581. package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
  582. package/src/ux-sim/classic-tui-seat-scenarios.ts +158 -4
  583. package/src/ux-sim/fake-gh.ts +174 -0
  584. package/src/ux-sim/fake-kubectl.ts +142 -0
  585. package/src/ux-sim/fake-llm.ts +17 -6
  586. package/src/ux-sim/next-tui-seat-scenarios.ts +176 -6
  587. package/src/ux-sim/resume-picker-device.ts +173 -0
  588. package/src/ux-sim/session-id-seed.ts +60 -0
  589. package/src/ux-sim/skills-tools-shell-device.ts +156 -0
  590. package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
  591. package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
  592. package/src/version/packed-revision.json +1 -1
  593. package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +0 -287
  594. package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +0 -64
  600. package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +0 -36
  601. package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +0 -149
  604. package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +0 -24
  609. package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +0 -24
  612. package/apps/pwa/out/_next/static/chunks/2986.45d7652e4f13557e.js +0 -2
  613. package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +0 -226
  614. package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +0 -8
  618. package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +0 -32
  619. package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +0 -286
  621. package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/3757-180308bc61021b05.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +0 -74
  625. package/apps/pwa/out/_next/static/chunks/3840-5825d56d46976a92.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +0 -104
  629. package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +0 -148
  632. package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +0 -93
  634. package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +0 -122
  636. package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +0 -79
  641. package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +0 -27
  653. package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/7481.39f7a4654907bf6e.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/7891.03f910124a737985.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +0 -62
  664. package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +0 -90
  666. package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +0 -94
  667. package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +0 -77
  672. package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/9514.131c52cc75fe6439.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +0 -1
  705. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/ccae1c4b-0cf414f5eff1b10d.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +0 -1
  738. package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +0 -1
  739. package/scripts/migrate-monad-to-elanous.ts +0 -195
  740. package/scripts/rebrand-elanous.ts +0 -242
  741. /package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
@@ -0,0 +1,61 @@
1
+ import { loadSidetabRows, type SidetabRow } from '../tui/sidetab/list.js';
2
+ import { stripAnsi, termSize } from '../tui.js';
3
+ import { requestRemotePtyControl } from '../pty-shell/pty-control-ipc.js';
4
+ import type { SlashCommandRegistry } from './slash-runtime/registry.js';
5
+ import type { DashboardSlashContext, DashboardSlashReturn } from './slash-runtime/dashboard-handlers.js';
6
+
7
+ /** Classic /side: the Next TUI manifest is the sole source of list ordering. */
8
+ export function registerClassicSideSlash(
9
+ registry: SlashCommandRegistry<DashboardSlashContext, DashboardSlashReturn>,
10
+ loadRows: (sessionId?: string) => SidetabRow[] = (sessionId) => loadSidetabRows(false, sessionId),
11
+ snapshot: typeof requestRemotePtyControl = requestRemotePtyControl,
12
+ ): void {
13
+ registry.register(['side'], async (args, ctx) => {
14
+ const sub = (args[0] ?? 'list').toLowerCase();
15
+ if (sub === 'new') {
16
+ if (args.length > 1) ctx.chatLines.push(ctx.warning(' 사용법: /side new'));
17
+ else ctx.termSlash.openNewTerminal();
18
+ ctx.setChatScrollOffset(-1);
19
+ return;
20
+ }
21
+ if (sub !== 'list' && sub !== 'attach') {
22
+ ctx.chatLines.push(ctx.muted(' 사용법: /side [list] | new | attach <번호>'));
23
+ ctx.setChatScrollOffset(-1);
24
+ return;
25
+ }
26
+ // Use the same filtered manifest rows for display and numeric resolution;
27
+ // never let an exited row shift the number shown to the user.
28
+ const rows = loadRows(ctx.chatPersona?.sessionId()).filter(row => row.badge !== 'exited');
29
+ if (sub === 'list') {
30
+ if (rows.length === 0) ctx.chatLines.push(ctx.muted(' 사이드탭 없음'));
31
+ rows.forEach((row, i) => ctx.chatLines.push(ctx.muted(` ${i + 1}. ${row.badge} ${row.label}`)));
32
+ ctx.setChatScrollOffset(-1);
33
+ return;
34
+ }
35
+ const raw = args[1] ?? '';
36
+ const index = /^\d+$/.test(raw) ? Number(raw) - 1 : -1;
37
+ const row = rows[index];
38
+ if (args.length !== 2 || !row) {
39
+ ctx.chatLines.push(ctx.warning(' 사용법: /side attach <목록 번호>'));
40
+ } else if (row.currentProcess) {
41
+ ctx.chatLines.push(ctx.muted(' 현재 세션입니다'));
42
+ } else if (row.sessionId && ctx.termSlash.sessionRegistry.get(row.sessionId)) {
43
+ const { cols, rows: height } = termSize();
44
+ const session = ctx.termSlash.sessionRegistry.attach(row.sessionId, { termCols: cols, termRows: height });
45
+ if (session?.modal) ctx.termSlash.openSession(session);
46
+ else ctx.chatLines.push(ctx.warning(' PTY attach 실패'));
47
+ } else if (row.ptyId) {
48
+ try {
49
+ // A foreign child belongs to another PTY owner: snapshot only, no takeover.
50
+ const result = await snapshot(row.ptyId, 'snapshot', { ansi: false }, { timeoutMs: 450 });
51
+ if (result.status === 'success' && result.screen?.trim()) {
52
+ ctx.chatLines.push(ctx.muted(` ${row.label} · 읽기 전용 snapshot (입력은 전달되지 않습니다)`));
53
+ ctx.chatLines.push(...stripAnsi(result.screen).split('\n'));
54
+ } else ctx.chatLines.push(ctx.warning(` PTY 화면 읽기 실패 · ${result.status}`));
55
+ } catch (error) {
56
+ ctx.chatLines.push(ctx.warning(` PTY 화면 읽기 오류 · ${error instanceof Error ? error.message : String(error)}`));
57
+ }
58
+ } else ctx.chatLines.push(ctx.warning(' attach할 PTY가 없습니다'));
59
+ ctx.setChatScrollOffset(-1);
60
+ });
61
+ }
@@ -364,13 +364,15 @@ import {
364
364
  attachTelegramBinding as sessionAttachTelegram,
365
365
  listBoundSessions as sessionListBound,
366
366
  } from '../../session/index.js';
367
+ import { idPrefixCell, sessionIdPrefixes, sessionListTime } from '../../session/id-prefix.js';
367
368
  import { safeReadLock as telegramSafeReadLock, defaultLockPath as telegramDefaultLockPath } from '../../telegram-lock.js';
368
369
  import { userConfigPath as userConfigPathFn } from '../../user-config.js';
369
370
  import { dirname as pathDirname, relative, resolve as resolvePath } from 'node:path';
370
371
  import { existsSync, readFileSync, statSync, writeFileSync } from 'node:fs';
371
372
  import { installPlugin, listInstalledPlugins, type InstalledPlugin } from '../../plugins/install/plugin-install.js';
372
373
  import type { SurfaceUx } from '../../agent/surface-ux/types.js';
373
- import { renderReplayPreviewLines } from '../replay-preview.js';
374
+ import { renderRestoredTranscriptLines } from '../replay-preview.js';
375
+ import { noteRestoredContext } from '../../status/metrics.js';
374
376
  import {
375
377
  deriveDaemonHttpBase,
376
378
  fetchDaemonSessionList,
@@ -385,6 +387,7 @@ import { readDashboardAskClarification } from './ask-clarification.js';
385
387
  export { readDashboardAskClarification };
386
388
  import { createLoopScheduler, type LoopScheduler } from '../loop-scheduler.js';
387
389
  import { registerShellSlash } from './shell-slash.js';
390
+ import { registerClassicSideSlash } from '../side-basic-runtime.js';
388
391
  export { registerShellSlash } from './shell-slash.js';
389
392
  import { registerMissionSlash } from '../../tui/slash/mission.js';
390
393
  // TUI-SLASH-SPLIT-MISSION(D4b) — /mission 은 src/tui/slash/mission.ts 로 이사. 옛 입구 re-export shim 은 slash-runtime/index.ts 한 곳뿐(RFC A5).
@@ -2395,6 +2398,8 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2395
2398
  }
2396
2399
  } else if (result.kind === 'stopped-before-authoring') {
2397
2400
  ctx.chatLines.push(ctx.error(' ⛔ 저작 «전» 예비 검사에서 막혔다 — 위 이름을 확인하라'));
2401
+ } else if (result.kind === 'stopped-by-timebox') {
2402
+ ctx.chatLines.push(ctx.error(` ⛔ AUTHOR-TIMEBOX 초과로 접지 없이 끝났다 — 골은 남아 있다: ${result.goalFile}`));
2398
2403
  } else {
2399
2404
  ctx.chatLines.push(ctx.error(` ⛔ 전제 검사에서 막혔다 — 골은 남아 있다: ${result.goalFile}`));
2400
2405
  }
@@ -2573,6 +2578,7 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2573
2578
 
2574
2579
 
2575
2580
  registerShellSlash(registry);
2581
+ registerClassicSideSlash(registry);
2576
2582
 
2577
2583
  // ── B-3.b ─────────────────────────────────────────────────────────
2578
2584
 
@@ -2602,6 +2608,8 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2602
2608
  if (seSub === 'list' || seSub === 'ls') {
2603
2609
  const limit = args[1] ? Math.max(1, Math.min(50, Number(args[1]) || 10)) : 10;
2604
2610
  const rows = sessionListSessions({ limit });
2611
+ // Unique prefixes, not a fixed 8 — `/session load <shown prefix>` must resolve (TUI-RESUME-PICKER).
2612
+ const idPrefixes = sessionIdPrefixes(rows.map((m) => m.id));
2605
2613
  // Tier 1 daemon merge — when attached to a remote daemon w/ a
2606
2614
  // derivable HTTP base, fetch the daemon's session list too so
2607
2615
  // the user sees web/PWA/other-client sessions alongside their
@@ -2628,9 +2636,9 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2628
2636
  if (m.bindings?.telegram) binds.push(`tg:${m.bindings.telegram.chatId}`);
2629
2637
  if (m.bindings?.discord) binds.push(`dc:${m.bindings.discord.channelId}`);
2630
2638
  const bindStr = binds.length > 0 ? ctx.subtext(`[${binds.join(' ')}]`) : '';
2631
- const ts = m.updatedAt.slice(5, 16).replace('T', ' ');
2639
+ const ts = sessionListTime(m.updatedAt);
2632
2640
  const title = (m.title || '(no title)').slice(0, 48);
2633
- ctx.chatLines.push(` ${marker} ${ctx.text(m.id.slice(0, 8))} ${ctx.muted(ts)} ${ctx.muted(`${m.messageCount}t`.padStart(4))} ${bindStr.padEnd(10)} ${title}`);
2641
+ ctx.chatLines.push(` ${marker} ${ctx.text(idPrefixCell(idPrefixes, m.id))} ${ctx.muted(ts)} ${ctx.muted(`${m.messageCount}t`.padStart(4))} ${bindStr.padEnd(10)} ${title}`);
2634
2642
  }
2635
2643
  }
2636
2644
  if (daemonRows.length > 0) {
@@ -2734,13 +2742,14 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2734
2742
  }
2735
2743
  ctx.setAttachedSessionId(match.id);
2736
2744
  try { sessionSetActiveId(match.id); } catch { /* best-effort */ }
2745
+ noteRestoredContext(chatHistory);
2737
2746
  ctx.chatLines.push('');
2738
2747
  ctx.chatLines.push(ctx.success(` ✓ swapped to daemon session ${match.id}`));
2739
2748
  if (past && past.length > 0) {
2740
- ctx.chatLines.push(ctx.muted(` ${past.length} turn${past.length === 1 ? '' : 's'} restored. Preview of last 5:`));
2749
+ ctx.chatLines.push(ctx.muted(` ${past.length} turn${past.length === 1 ? '' : 's'} restored:`));
2741
2750
  const swapPreviewWidth = Math.max(40, termSize().cols - 8);
2742
2751
  const swapPreviewWrap = getUserConfig().chat.rendering.wrap;
2743
- const swapPreviewLines = renderReplayPreviewLines(past, {
2752
+ const swapPreviewLines = renderRestoredTranscriptLines(past, {
2744
2753
  maxWidth: swapPreviewWidth,
2745
2754
  wrapOpts: swapPreviewWrap,
2746
2755
  });
@@ -2792,11 +2801,13 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2792
2801
  // side /attach (no-arg) picks up the same session automatically.
2793
2802
  try { sessionSetActiveId(resolvedId); } catch { /* best-effort */ }
2794
2803
  ctx.chatLines.push('');
2795
- ctx.chatLines.push(ctx.success(` ✓ loaded session ${resolvedId.slice(0, 8)} (${loaded.meta.title || '(no title)'})`));
2796
- ctx.chatLines.push(ctx.muted(` ${loaded.history.length} turns restored. Preview of last 5:`));
2804
+ ctx.chatLines.push(ctx.success(` ✓ loaded session ${sessionIdPrefixes([resolvedId]).get(resolvedId) ?? resolvedId} (${loaded.meta.title || '(no title)'})`));
2805
+ ctx.chatLines.push(ctx.muted(` ${loaded.history.length} turns restored:`));
2806
+ const restoredTokens = noteRestoredContext(chatHistory);
2807
+ debug.log('chat.session.load', 'restored', { sessionId: resolvedId, turns: loaded.history.length, estimatedContextTokens: restoredTokens });
2797
2808
  const loadPreviewWidth = Math.max(40, termSize().cols - 8);
2798
2809
  const loadPreviewWrap = getUserConfig().chat.rendering.wrap;
2799
- const loadPreviewLines = renderReplayPreviewLines(loaded.history, {
2810
+ const loadPreviewLines = renderRestoredTranscriptLines(loaded.history, {
2800
2811
  maxWidth: loadPreviewWidth,
2801
2812
  wrapOpts: loadPreviewWrap,
2802
2813
  });
@@ -0,0 +1,74 @@
1
+ /**
2
+ * TUI-FLICKER-DRAW-INTEGRATION — one synchronized-output owner per dashboard frame.
3
+ *
4
+ * A dashboard frame is not a single write: the transient-overlay cleanup, the
5
+ * base frame, the coordinator modal overlay, the prompt repaint and the
6
+ * post-frame overlay stamp are flushed one after another. Under tmux each of
7
+ * those flushes is presented on its own, so a tick that rewrites the frame is
8
+ * visible as a flicker. Wrapping the whole compose in DEC synchronized output
9
+ * (`CSI ? 2026 h` … `CSI ? 2026 l`) lets the terminal present the composite
10
+ * frame atomically.
11
+ *
12
+ * The owner is deliberately tiny and synchronous: callers open it, draw, and
13
+ * close it in a `finally` so a throw inside the draw still emits the ESU and
14
+ * the *next* frame is not swallowed by a dangling synchronized-output region.
15
+ *
16
+ * The wrap nests with the display coordinator, which opens the same region
17
+ * around its own flush and whose `onRender` hook is what calls `drawNow()`.
18
+ * `src/display/synchronized-output-region.ts` keeps that single-owner: an
19
+ * inner open contributes no bytes, so the coordinator's overlay + cursor stamp
20
+ * stays inside the one presentation instead of being pushed out by an early
21
+ * inner ESU.
22
+ */
23
+
24
+ import {
25
+ SYNCHRONIZED_OUTPUT_BEGIN,
26
+ SYNCHRONIZED_OUTPUT_END,
27
+ openSynchronizedOutputRegion,
28
+ synchronizedOutputDisabledByEnv,
29
+ } from '../display/synchronized-output-region.js';
30
+
31
+ export { SYNCHRONIZED_OUTPUT_BEGIN, SYNCHRONIZED_OUTPUT_END };
32
+
33
+ export interface SynchronizedFrameOutputDeps {
34
+ /** Sink for the control sequences — production passes `process.stdout.write`. */
35
+ write: (chunk: string) => void;
36
+ /**
37
+ * Whether the sink may receive DEC 2026. Defaults to `true`. Production
38
+ * passes `process.stdout.isTTY` so piped/captured output stays
39
+ * byte-identical to what it was before this seam existed.
40
+ */
41
+ supported?: boolean;
42
+ /** Environment escape hatch (`ELANOUS_SYNC_OUTPUT=off`). Defaults to `process.env`. */
43
+ env?: Record<string, string | undefined>;
44
+ }
45
+
46
+ export interface SynchronizedFrameOutput {
47
+ /** Closes the region. Idempotent — a second call writes nothing. */
48
+ close: () => void;
49
+ }
50
+
51
+ export function beginSynchronizedFrameOutput(
52
+ deps: SynchronizedFrameOutputDeps,
53
+ ): SynchronizedFrameOutput {
54
+ const region = openSynchronizedOutputRegion();
55
+ const enabled =
56
+ region.outermost && deps.supported !== false && !synchronizedOutputDisabledByEnv(deps.env);
57
+ let closed = false;
58
+ if (enabled) {
59
+ try {
60
+ deps.write(SYNCHRONIZED_OUTPUT_BEGIN);
61
+ } catch (err) {
62
+ region.close();
63
+ throw err;
64
+ }
65
+ }
66
+ return {
67
+ close: () => {
68
+ if (closed) return;
69
+ closed = true;
70
+ if (enabled) deps.write(SYNCHRONIZED_OUTPUT_END);
71
+ region.close();
72
+ },
73
+ };
74
+ }
@@ -127,6 +127,8 @@ export function createDashboardTermSlashRuntime(
127
127
  deps.muted(' /term list List all alive sessions (fg / bg / exited).'),
128
128
  deps.muted(' /term attach <id> Bring a backgrounded session to foreground.'),
129
129
  deps.muted(' /term detach Send foreground session to background (PTY survives).'),
130
+ deps.muted(' Ctrl+B (while streaming) Background running child tasks; turn continues.'),
131
+ deps.muted(' Ctrl+X c (chat input) Enter control mode.'),
130
132
  deps.muted(' /term switch Open the session picker modal.'),
131
133
  deps.muted(' /term kill <id> Stop the PTY and remove the session.'),
132
134
  deps.muted(' /term snapshot <id> [tail [bytes]] Capture current grid (snapshot) or last N bytes (tail).'),
@@ -25,6 +25,7 @@ import { buildConcisenessSystemMessages } from '../prompt-library/chat-concisene
25
25
  import {
26
26
  buildSessionRuntimeSystemMessages,
27
27
  buildSessionRuntimeTurnSystemMessages,
28
+ buildResearchDateSystemMessage,
28
29
  type SessionTurnProfile,
29
30
  } from '../session-runtime/index.js';
30
31
  import { buildExecutionAskSystemMessages } from '../ask-user-question/index.js';
@@ -208,9 +209,13 @@ function buildDashboardTurnPreambleUnmeasured(
208
209
  gitSnapshotStaleMs: DASHBOARD_GIT_SNAPSHOT_STALE_MS,
209
210
  }));
210
211
  const turnProfile = ctx.turnProfile;
212
+ const researchTurn = turnProfile?.surface.id === 'research/agent';
211
213
  const surfaceSystemMsgs = turnProfile
212
214
  ? timed(builderMs, 'surface', () => buildSessionRuntimeTurnSystemMessages(turnProfile, ctx.userText))
213
215
  : ([] as LLMMessage[]);
216
+ if (researchTurn) {
217
+ surfaceSystemMsgs.push(buildResearchDateSystemMessage());
218
+ }
214
219
  // ⭐⭐ `tools.nativeStructure` 는 «어느 provider 에 켤지»를 목록으로 고를 수 있다(2026-08-18).
215
220
  // ⛔ 목록이 없으면 종전대로 «전 provider» — 기존 설정을 쓰는 사람의 값이 안 바뀐다.
216
221
  // ⛔ `config.llm.provider` 를 그대로 읽지 않는다. 그것은 `'auto'` 일 수 있고,
@@ -240,9 +245,9 @@ function buildDashboardTurnPreambleUnmeasured(
240
245
  nativeStructureEnabled,
241
246
  ...(nativeTools !== undefined ? { enabledTools: nativeTools } : {}),
242
247
  }) as LLMMessage[]);
243
- const concisenessSystemMsgs = timed(builderMs, 'conciseness', () => buildConcisenessSystemMessages(
244
- ctx.userConfig.chat.conciseness,
245
- ) as LLMMessage[]);
248
+ const concisenessSystemMsgs = timed(builderMs, 'conciseness', () => researchTurn
249
+ ? [] as LLMMessage[]
250
+ : buildConcisenessSystemMessages(ctx.userConfig.chat.conciseness) as LLMMessage[]);
246
251
  // ★ elanous 자기접근 규율 + 자기인지 ambient(P3 · 2026-07-13) — 텔레그램/디스코드
247
252
  // (makeElanousAgentRunTurn)와 단일 출처(agent/self-ambient.ts). TUI 채팅에서도 미션
248
253
  // 진단("P2 왜 실패?")·자율 시스템 관측·회상이 규율+ambient+툴(self-ops family) 3박자로
@@ -313,10 +318,29 @@ function buildDashboardTurnPreambleUnmeasured(
313
318
  let taskNotificationCount = 0;
314
319
  try {
315
320
  timed(builderMs, 'taskNotifications', () => {
321
+ // ACP may ask for a preamble while the session is idle. Keep queued
322
+ // completion receipts for the next actual user/auto-wake turn.
323
+ if (!ctx.userText.trim()) return;
324
+ const notificationOnlyWake = /(?:^|\n)(?:Question: )?\[자동 재개\] 위임 끝: .+ \((?:done|error|aborted)\) — <task-notification> 의 결과를 읽고 이어서 처리$/u
325
+ .test(ctx.userText);
326
+ if (notificationOnlyWake) {
327
+ preamble.push({ role: 'system', content: '[알림 전용 턴] 이것은 완료 알림을 전달한 비요청 status receipt다. 작업 요청으로 취급하지 말고 Agent 또는 SelfImplement 위임을 시작하지 않는다. 포함된 결과를 바탕으로 한 번의 간결한 상태 요약만 답하고 멈춘다. 결과가 전달되지 않았다면 결과가 아직 제공되지 않았다고 알리고 내용을 추측하지 않는다.' });
328
+ }
316
329
  const pendingNotifications = globalTaskNotificationQueue.drain();
317
330
  taskNotificationCount = pendingNotifications.length;
318
- const taskNotificationsXml = renderTaskNotificationsXml(pendingNotifications);
331
+ if (pendingNotifications.length === 0) {
332
+ if (notificationOnlyWake) {
333
+ debug.log('tui.notify', 'notification-only-turn', { notificationCount: 0, resultAvailable: false });
334
+ }
335
+ return;
336
+ }
337
+ const taskNotificationsXml = renderTaskNotificationsXml(pendingNotifications, {
338
+ statusReceipt: notificationOnlyWake,
339
+ });
319
340
  if (taskNotificationsXml) {
341
+ debug.log('tui.notify', notificationOnlyWake ? 'notification-only-turn' : 'notification-with-user-request', {
342
+ notificationCount: pendingNotifications.length,
343
+ });
320
344
  preamble.push({ role: 'user', content: taskNotificationsXml });
321
345
  }
322
346
  });
@@ -22,6 +22,10 @@ import { TIER_ORDER, tierRank, tiersCompatible } from './types.js';
22
22
  import { resolveKeyAlias } from '../input-core/key-alias-table.js';
23
23
  import type { DisplayEventBus } from './events.js';
24
24
  import { paintCursor, type CursorState } from './cursor-state.js';
25
+ import {
26
+ openSynchronizedOutputRegion,
27
+ synchronizedOutputDisabledByEnv,
28
+ } from './synchronized-output-region.js';
25
29
  import { deriveCursor, type CursorDecision } from './cursor-owner.js';
26
30
  import {
27
31
  createVirtualCursorRegistry,
@@ -261,7 +265,6 @@ export class DisplayCoordinator {
261
265
  * even when its bytes are unchanged, because the base rows under it
262
266
  * were just repainted. Replaces the old forceNext follow-up. */
263
267
  private overlayRowsInvalidated = false;
264
-
265
268
  private surfaces = new Map<SurfaceId, DisplaySurface>();
266
269
  private focusNodes = new Map<SurfaceId, FocusNode>();
267
270
  private keyBindings = new Map<string, DisplayKeyBinding>();
@@ -288,6 +291,7 @@ export class DisplayCoordinator {
288
291
  private dirty = new Set<SurfaceId | 'all' | 'status' | 'dock'>();
289
292
  private forceNext = false;
290
293
  private scheduled: Timer | null = null;
294
+ private scheduleGeneration = 0;
291
295
  // P2.2.b — cursor state. Last-writer-wins. cursorVersion bumps on
292
296
  // every setCursor; lastEmittedCursorVersion tracks what's been
293
297
  // written so flushCursor only emits on change.
@@ -966,6 +970,36 @@ export class DisplayCoordinator {
966
970
  }, 'dashboard');
967
971
  }
968
972
 
973
+ /** Mark a render dirty and flush it before returning. Used when a host
974
+ * already owns a synchronized output batch around the render. */
975
+ requestRenderNow(opts?: { region?: SurfaceId | 'all'; force?: boolean }): void {
976
+ this.markDirty(opts?.region ?? 'all');
977
+ if (opts?.force) this.forceNext = true;
978
+ this.scheduleGeneration += 1;
979
+ this.scheduled = null;
980
+ this.flush();
981
+ }
982
+
983
+ /** Run synchronous terminal writes inside DECSET 2026 when enabled.
984
+ * Coordinator flushes, the dashboard draw seam, and host paint batches
985
+ * share the same re-entrant region instead of emitting nested markers. */
986
+ withSynchronizedOutput<T>(paint: () => T): T {
987
+ const syncRegion = openSynchronizedOutputRegion();
988
+ const syncOutput = syncRegion.outermost && this.syncOutputEnabled;
989
+ try {
990
+ if (syncOutput) {
991
+ this.writeOverlay?.('\x1b[?2026h');
992
+ }
993
+ return paint();
994
+ } finally {
995
+ try {
996
+ if (syncOutput) this.writeOverlay?.('\x1b[?2026l');
997
+ } finally {
998
+ syncRegion.close();
999
+ }
1000
+ }
1001
+ }
1002
+
969
1003
  handle(owner: SurfaceOwner): DisplayHandle {
970
1004
  return {
971
1005
  owner,
@@ -2629,10 +2663,16 @@ export class DisplayCoordinator {
2629
2663
 
2630
2664
  private requestFrame(): void {
2631
2665
  if (this.scheduled !== null) return;
2632
- this.scheduled = this.scheduleFn(() => {
2666
+ const generation = ++this.scheduleGeneration;
2667
+ const marker = {} as Timer;
2668
+ let scheduled: Timer | undefined;
2669
+ this.scheduled = marker;
2670
+ scheduled = this.scheduleFn(() => {
2671
+ if (generation !== this.scheduleGeneration || (this.scheduled !== marker && this.scheduled !== scheduled)) return;
2633
2672
  this.scheduled = null;
2634
2673
  this.flush();
2635
2674
  }, this.frameMs);
2675
+ if (this.scheduled === marker) this.scheduled = scheduled;
2636
2676
  }
2637
2677
 
2638
2678
  private flush(): void {
@@ -2661,9 +2701,7 @@ export class DisplayCoordinator {
2661
2701
  // `ELANOUS_SYNC_OUTPUT=off` for buggy terminals (none observed in
2662
2702
  // practice, 2026-04-21). Pattern matches Textual (synchronized
2663
2703
  // output since v0.47) + Ratatui backend buffer-swap semantics.
2664
- const syncOutput = this.syncOutputEnabled;
2665
- if (syncOutput) this.writeOverlay?.('\x1b[?2026h');
2666
- try {
2704
+ this.withSynchronizedOutput(() => {
2667
2705
  // H1.6 · W2 shadow flush. Fires rc.on('before-flush') +
2668
2706
  // rc.on('after-flush') synchronously. Subscriber paints (if any
2669
2707
  // are wired in Phase γ) land INSIDE the DECSET 2026 atomic-frame
@@ -2696,11 +2734,7 @@ export class DisplayCoordinator {
2696
2734
  // so the prior cursor position may have been overwritten. Always
2697
2735
  // re-assert. The bypass-batch path calls flushCursor(false).
2698
2736
  this.flushCursor(true);
2699
- } finally {
2700
- // Always close the sync block — a throw inside render hooks
2701
- // must not leave the terminal stuck in "buffering" mode.
2702
- if (syncOutput) this.writeOverlay?.('\x1b[?2026l');
2703
- }
2737
+ });
2704
2738
  this.eventBus?.emit({ type: 'render:after', request, snapshot });
2705
2739
  this.pendingWidgetPatches = [];
2706
2740
  this.pendingLogLines = [];
@@ -2713,8 +2747,7 @@ export class DisplayCoordinator {
2713
2747
  * not a TTY (unit-test + CI environment) so overlay assertions
2714
2748
  * don't have to strip the ?2026h / ?2026l pair. */
2715
2749
  private get syncOutputEnabled(): boolean {
2716
- const v = (process.env.ELANOUS_SYNC_OUTPUT ?? 'on').toLowerCase();
2717
- if (v === 'off' || v === '0' || v === 'false') return false;
2750
+ if (synchronizedOutputDisabledByEnv()) return false;
2718
2751
  // Non-TTY environments (tests, piped output) gain nothing from
2719
2752
  // atomic frame wrapping and the sequences would pollute assertions.
2720
2753
  if (typeof process !== 'undefined' && process.stdout && process.stdout.isTTY !== true) {
@@ -5,10 +5,9 @@
5
5
  // resize produced a stale paint (old input prompt row + ghost tab
6
6
  // bar) until the next keystroke triggered a redraw.
7
7
  //
8
- // Strategy: on every stdout resize event, (1) push a forced dashboard
9
- // redraw and (2) invoke the prompt's repaint hook so input-mode
10
- // overlays catch up too. Both calls are wrapped in try/catch so a
11
- // transient paint error doesn't kill the listener.
8
+ // Strategy: debounce resize bursts for one frame (16ms), then paint the
9
+ // dashboard, prompt, and overlays synchronously inside one atomic output
10
+ // block. Transient paint errors do not kill the listener.
12
11
  //
13
12
  // (3) TUI-PICKER-RESIZE-SHRINK (#76 · 2026-10-17) — then ask the
14
13
  // coordinator for one FORCED frame. Steps (1)+(2) bypass the
@@ -28,6 +27,8 @@
28
27
 
29
28
  import { debug } from '../debug/log.js';
30
29
 
30
+ const RESIZE_DEBOUNCE_MS = 16;
31
+
31
32
  export interface ResizeListenerDeps {
32
33
  draw: (opts?: { force?: boolean }) => void;
33
34
  promptCtl: { repaint: () => void };
@@ -35,6 +36,9 @@ export interface ResizeListenerDeps {
35
36
  * re-emitted on top of the chrome the prompt repaint just wrote.
36
37
  * Optional: hosts without a coordinator keep the legacy two-step. */
37
38
  requestOverlayFrame?: () => void;
39
+ /** Run the whole resize repaint batch inside the host's atomic output
40
+ * block. Nested coordinator frames must share this outer block. */
41
+ withSynchronizedOutput?: (paint: () => void) => void;
38
42
  }
39
43
 
40
44
  /** Registers the resize listener and returns a dispose fn that
@@ -42,26 +46,43 @@ export interface ResizeListenerDeps {
42
46
  * fresh listener; the caller is responsible for disposing previous
43
47
  * installations. */
44
48
  export function installResizeListener(deps: ResizeListenerDeps): () => void {
45
- const handler = (): void => {
46
- try { deps.draw({ force: true }); } catch { /* swallow — paint errors shouldn't break resize */ }
47
- try { deps.promptCtl.repaint(); } catch { /* swallow */ }
48
- let overlayFrame: 'requested' | 'absent' | 'failed' = 'absent';
49
- if (deps.requestOverlayFrame) {
50
- try {
51
- deps.requestOverlayFrame();
52
- overlayFrame = 'requested';
53
- } catch {
54
- overlayFrame = 'failed';
49
+ let timer: ReturnType<typeof setTimeout> | undefined;
50
+ let disposed = false;
51
+ const repaint = (): void => {
52
+ timer = undefined;
53
+ if (disposed) return;
54
+ const paint = (): void => {
55
+ try { deps.draw({ force: true }); } catch { /* swallow — paint errors shouldn't break resize */ }
56
+ try { deps.promptCtl.repaint(); } catch { /* swallow */ }
57
+ let overlayFrame: 'requested' | 'absent' | 'failed' = 'absent';
58
+ if (deps.requestOverlayFrame) {
59
+ try {
60
+ deps.requestOverlayFrame();
61
+ overlayFrame = 'requested';
62
+ } catch {
63
+ overlayFrame = 'failed';
64
+ }
55
65
  }
56
- }
57
- debug.log('display.resize', 'repaint', {
58
- cols: process.stdout.columns ?? null,
59
- rows: process.stdout.rows ?? null,
60
- overlayFrame,
61
- });
66
+ debug.log('display.resize', 'repaint', {
67
+ cols: process.stdout.columns ?? null,
68
+ rows: process.stdout.rows ?? null,
69
+ overlayFrame,
70
+ });
71
+ };
72
+ try {
73
+ if (deps.withSynchronizedOutput) deps.withSynchronizedOutput(paint);
74
+ else paint();
75
+ } catch { /* resize painting must not detach the listener */ }
76
+ };
77
+ const handler = (): void => {
78
+ if (timer !== undefined) clearTimeout(timer);
79
+ timer = setTimeout(repaint, RESIZE_DEBOUNCE_MS);
62
80
  };
63
81
  process.stdout.on('resize', handler);
64
82
  return (): void => {
83
+ disposed = true;
84
+ if (timer !== undefined) clearTimeout(timer);
85
+ timer = undefined;
65
86
  process.stdout.removeListener('resize', handler);
66
87
  };
67
88
  }
@@ -0,0 +1,60 @@
1
+ /**
2
+ * DECSET 2026 (synchronized output) region registry.
3
+ *
4
+ * Two owners wrap their writes in `CSI ? 2026 h` … `CSI ? 2026 l`: the
5
+ * display coordinator (`flush()`) and the dashboard draw seam
6
+ * (`src/dashboard/synchronized-frame-output.ts`). They nest — the
7
+ * coordinator opens a region and its `onRender` hook runs `drawNow()`,
8
+ * which wants the same wrap for the frame + prompt repaint. A second pair
9
+ * emitted inside the outer one is not harmless: the inner ESU flushes the
10
+ * terminal early, so everything the coordinator writes afterwards (modal
11
+ * overlay, cursor) lands in a separate presentation — exactly the flicker
12
+ * the wrap exists to prevent.
13
+ *
14
+ * The registry makes the wrap re-entrant: whoever opens first owns the
15
+ * byte pair; nested openers contribute no bytes and never close the outer
16
+ * region. Every opener must close its handle (idempotent) so the depth
17
+ * stays balanced even when a draw throws.
18
+ */
19
+
20
+ export const SYNCHRONIZED_OUTPUT_BEGIN = '\x1b[?2026h';
21
+ export const SYNCHRONIZED_OUTPUT_END = '\x1b[?2026l';
22
+
23
+ export interface SynchronizedOutputRegion {
24
+ /** true when this region owns the emitted BSU/ESU pair. */
25
+ readonly outermost: boolean;
26
+ /** Idempotent — closes this region exactly once. */
27
+ close(): void;
28
+ }
29
+
30
+ let openDepth = 0;
31
+
32
+ /** True while any owner holds a synchronized-output region open. */
33
+ export function isSynchronizedOutputRegionOpen(): boolean {
34
+ return openDepth > 0;
35
+ }
36
+
37
+ /**
38
+ * `ELANOUS_SYNC_OUTPUT=off|0|false` escape hatch for terminals that
39
+ * mishandle DEC 2026. Anything else (including unset) keeps the wrap on.
40
+ */
41
+ export function synchronizedOutputDisabledByEnv(
42
+ env: Record<string, string | undefined> = process.env,
43
+ ): boolean {
44
+ const value = (env.ELANOUS_SYNC_OUTPUT ?? 'on').toLowerCase();
45
+ return value === 'off' || value === '0' || value === 'false';
46
+ }
47
+
48
+ export function openSynchronizedOutputRegion(): SynchronizedOutputRegion {
49
+ const outermost = openDepth === 0;
50
+ openDepth += 1;
51
+ let closed = false;
52
+ return {
53
+ outermost,
54
+ close(): void {
55
+ if (closed) return;
56
+ closed = true;
57
+ if (openDepth > 0) openDepth -= 1;
58
+ },
59
+ };
60
+ }
@@ -19,6 +19,8 @@ export interface GuardianDeps {
19
19
  execute?: (command: string) => Promise<SpawnOutcome>;
20
20
  /** Injected only for deterministic expiry-alert tests. Production reads the local Grok auth file. */
21
21
  grokExpiry?: () => string | null;
22
+ /** Injected in tests; production reevaluates recorded doctor visits without dispatching a prescription. */
23
+ doctorShadow?: () => void | Promise<void>;
22
24
  hostName?: string;
23
25
  }
24
26
 
@@ -100,6 +102,13 @@ export async function guardianTick(now: Date, plan: GuardianPlan, deps: Guardian
100
102
  errorName: error instanceof Error ? error.name : 'unknown',
101
103
  });
102
104
  }
105
+ try {
106
+ await deps.doctorShadow?.();
107
+ } catch (error) {
108
+ debug.log('guardian.doctor-shadow', 'reevaluation-failed', {
109
+ errorName: error instanceof Error ? error.name : 'unknown',
110
+ });
111
+ }
103
112
  const timeZone = plan.timeZone ?? resolveTimeZone().timeZone;
104
113
  const wouldRun: string[] = [];
105
114
  let executed = 0;