elanous 0.2.36 → 0.2.37

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 (630) 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 → 8kITumG9GAZ1LwT9POrAR}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1224.2ceca6c180d5130b.js +62 -0
  8. package/apps/pwa/out/_next/static/chunks/{4286.b70c4520306817e8.js → 1262.a89bb27a5b2f844e.js} +1 -1
  9. package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/{3410.7f9af5ab77cbe65f.js → 1746.3563617ea64023a3.js} +1 -1
  12. package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/{9250-072df22eaadaa6b5.js → 2002-a43a3f380df873ec.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +32 -0
  19. package/apps/pwa/out/_next/static/chunks/{3727.7949ccaacaa71242.js → 2283.edd9627b7bdfb546.js} +2 -2
  20. package/apps/pwa/out/_next/static/chunks/2318-450e75d07605b8fe.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/{4615.8525eb0add35eba6.js → 2375.bf364c85dbb6f085.js} +1 -1
  22. package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2479-fe7e188bd9402d14.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +148 -0
  25. package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +27 -0
  29. package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{5711.957b095705c12560.js → 3199.6a1a9b0e6cd01dc6.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/{2986.45d7652e4f13557e.js → 3578.4e9f9948a9a6f2f4.js} +2 -2
  35. package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +36 -0
  37. package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/4036.d54e55e1ebf5acdc.js +90 -0
  39. package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +226 -0
  40. package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +287 -0
  41. package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/{7481.39f7a4654907bf6e.js → 4313.76f232c304a15bde.js} +1 -1
  43. package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4337e36d.f42c3b391b3d8f20.js +122 -0
  45. package/apps/pwa/out/_next/static/chunks/{6943.c6b24124853a47b2.js → 4383.18e5c54db3a22c88.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/{3757-180308bc61021b05.js → 4725-34bed25720cc326b.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +24 -0
  52. package/apps/pwa/out/_next/static/chunks/{771.c3cdb6c1f7f47c02.js → 4931.95cc6dbd230774ca.js} +3 -3
  53. package/apps/pwa/out/_next/static/chunks/4937-28d437999b77c9dd.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{552.b7d061ad91eeac51.js → 5046.7fd5cbd859299448.js} +2 -2
  56. package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +104 -0
  57. package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/{9f31e478.fefcbcd3c388ebc5.js → 58edce7d.f1b0c72acf13b123.js} +1 -1
  64. package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +93 -0
  65. package/apps/pwa/out/_next/static/chunks/{3136.30aaaa5fa03662a3.js → 5952.294fc574a8625184.js} +1 -1
  66. package/apps/pwa/out/_next/static/chunks/{da5ecc5c-b005ad8cac737d57.js → 5f6af561-f90b7a67f4f75d13.js} +1 -1
  67. package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +74 -0
  68. package/apps/pwa/out/_next/static/chunks/{3324.a09703033abcbd2f.js → 6252.240578f10952e091.js} +1 -1
  69. package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/{8904.7d51af2dc033965c.js → 6680.6a693c28aae4cd19.js} +2 -2
  71. package/apps/pwa/out/_next/static/chunks/{275-02ea4c2a33980422.js → 6745-5a63492933959dd9.js} +3 -3
  72. package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +149 -0
  74. package/apps/pwa/out/_next/static/chunks/{528.38ce20ef8aa251ff.js → 6819.be5c9c4d67f22922.js} +3 -3
  75. package/apps/pwa/out/_next/static/chunks/6877-84d47b7e85d0c41e.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{3a3d9966.cc4d4585a2708e7c.js → 709a918c.4fd3b4e2a32cb4e3.js} +1 -1
  78. package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +41 -0
  80. package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +24 -0
  83. package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/{4304.e9b2512834a9e23e.js → 7424.c0fe2a595d4232b5.js} +1 -1
  87. package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/757-4fbaf50942b8c424.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{2683.c9773a0c589b031b.js → 7867.e8725745ddd1d940.js} +4 -4
  93. package/apps/pwa/out/_next/static/chunks/{6466-92e65a48490b68a9.js → 7893-e444a1b0809cd1e4.js} +1 -1
  94. package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{ccae1c4b-0cf414f5eff1b10d.js → 7c5ed21f-f286708e57cf88f7.js} +1 -1
  96. package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +8 -0
  98. package/apps/pwa/out/_next/static/chunks/{3840-5825d56d46976a92.js → 8080-40d781e7704d3671.js} +1 -1
  99. package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +77 -0
  100. package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +286 -0
  103. package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +79 -0
  107. package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{873d6c12.09bd499f57171543.js → 8c58d09b.e8724a299658d86f.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/{575.d929793a53f27c4b.js → 9151.a2c51e93f9156dae.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +94 -0
  117. package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{190.285c832bd9626f8c.js → 958.53a8dcf4729e6997.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/intake/page-5c112c6d7c33656e.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/live/{page-e2de2e59111c9aad.js → page-3337c6a1328c2674.js} +1 -1
  144. package/apps/pwa/out/_next/static/chunks/app/live-run/{page-f2b2e4bf6e981450.js → page-89acd5d68c0bc560.js} +1 -1
  145. package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/{page-2af16e62c12f22df.js → page-fe986fe79b107546.js} +1 -1
  148. package/apps/pwa/out/_next/static/chunks/app/morning/page-1e5da297557d2354.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-88a1edbff62eaf1d.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/page-b9af2ac1c4737ce8.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/share/page-fb9e639c107f5f72.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/term/page-ac2c1e6169cfce57.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/workspace/page-c1c80e345fa9d6f5.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/{053a429e.9a63436527cc751c.js → d9815f84.4918f682a45a8502.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/{ceba0382.650712b56b85b582.js → de8446d3.31b73eb239fecd7b.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.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/work/draft-close.yaml +54 -0
  280. package/graphs/work/green-close.yaml +37 -0
  281. package/graphs/work/recipes.yaml +46 -1
  282. package/graphs/work/run-research.yaml +35 -0
  283. package/package.json +1 -1
  284. package/scripts/__fixtures__/authoring-paths-10x3.json +32 -0
  285. package/scripts/boundary-proof-mapping-audit.ts +88 -0
  286. package/scripts/codex-fallback-live-probe.ts +17 -15
  287. package/scripts/fleet/node-setup.sh +32 -2
  288. package/scripts/fleet/run-light-worker.sh +9 -0
  289. package/scripts/gate-0226-failure-census.ts +507 -0
  290. package/scripts/goals/authoring-metrics.ts +258 -0
  291. package/scripts/graph-units/draft-close-node.ts +222 -0
  292. package/scripts/hook-order-sweep.ts +7 -4
  293. package/scripts/land-global-checks.ts +69 -1
  294. package/scripts/measure-nl-routing-corpus.ts +207 -2
  295. package/scripts/release-loop/docs-node.ts +140 -0
  296. package/scripts/release-loop/gate-closure.ts +48 -0
  297. package/scripts/release-loop/gate-diff.ts +2 -1
  298. package/scripts/release-loop/known-issues-node.ts +6 -4
  299. package/scripts/release-loop/notes-repair.ts +216 -0
  300. package/scripts/release-loop/prepare-node.ts +61 -5
  301. package/scripts/release-loop/resume-release.ts +114 -4
  302. package/scripts/release-loop/resume-test-traffic.ts +10 -0
  303. package/scripts/release-loop/version-node.ts +81 -12
  304. package/scripts/train/green-leg.ts +176 -0
  305. package/scripts/tui-continue-real-evidence.ts +47 -0
  306. package/scripts/ux-sim.ts +1 -1
  307. package/src/acp/client.ts +31 -5
  308. package/src/acp/core-turn-bridge.ts +6 -0
  309. package/src/acp/stderr-summary.ts +49 -0
  310. package/src/agent/monad-agent-turn.ts +1 -0
  311. package/src/agent/terminal-surface.ts +217 -0
  312. package/src/agent-substrate/pr-reviewer.ts +11 -3
  313. package/src/agent-substrate/self-review-cli.ts +343 -31
  314. package/src/autopilot/lineage/sources.ts +1 -1
  315. package/src/autopilot/pr-manager.ts +64 -13
  316. package/src/boot/daemon-runtime.ts +35 -3
  317. package/src/boot/daemon-tools/pty-shell.ts +2 -1
  318. package/src/budget/run-usage-rollup.ts +12 -7
  319. package/src/budget/unified-usage.ts +20 -0
  320. package/src/capture/tui-self-report.ts +32 -3
  321. package/src/cli/autopilot-cli.ts +24 -9
  322. package/src/cli/decisions-cli.ts +7 -4
  323. package/src/cli/doctor-cli.ts +116 -7
  324. package/src/cli/logs-cli.ts +357 -2
  325. package/src/cli/memory-cli.ts +30 -1
  326. package/src/cli/msg-cli.ts +15 -11
  327. package/src/cli/pr-granularity.ts +5 -3
  328. package/src/cli/release-checklist-read-cli.ts +109 -4
  329. package/src/cli/release-cli.ts +43 -10
  330. package/src/cli/self-update.ts +23 -5
  331. package/src/cli/self-utterances-cli.ts +13 -16
  332. package/src/cli/tasks-cli.ts +309 -11
  333. package/src/cli/usage-cli.ts +12 -10
  334. package/src/context-bus/claude-memory-import.ts +99 -0
  335. package/src/context-bus/long-term-memory.ts +125 -0
  336. package/src/core-turn/run-goal-loop.ts +5 -2
  337. package/src/core-turn/types.ts +2 -0
  338. package/src/dashboard/chat/acp-chat.ts +9 -0
  339. package/src/dashboard/index.ts +97 -13
  340. package/src/dashboard/input/agent-wake.ts +43 -0
  341. package/src/dashboard/input/chat-main-acp-dispatch.ts +21 -1
  342. package/src/dashboard/replay-preview.ts +25 -0
  343. package/src/dashboard/slash-runtime/dashboard-handlers.ts +17 -8
  344. package/src/dashboard/synchronized-frame-output.ts +74 -0
  345. package/src/display/coordinator.ts +45 -12
  346. package/src/display/resize-listener.ts +41 -20
  347. package/src/display/synchronized-output-region.ts +60 -0
  348. package/src/domains/surface-events.ts +80 -1
  349. package/src/exec-requests/planner.ts +37 -2
  350. package/src/execution-loop/launch-gate.ts +4 -3
  351. package/src/git-fs/cli-stderr.ts +45 -0
  352. package/src/git-fs/gh-cli.ts +6 -3
  353. package/src/git-fs/git-cli.ts +11 -5
  354. package/src/graph-runner/graph-cli.ts +26 -2
  355. package/src/graph-runner/graph-run-api.ts +3 -2
  356. package/src/graph-runner/runner.ts +17 -5
  357. package/src/graph-wizard/generate.ts +29 -6
  358. package/src/harness/harness-cli-command.ts +179 -33
  359. package/src/harness/review-adapter.ts +26 -6
  360. package/src/index.ts +116 -13
  361. package/src/instance/test-write-guard-real-transport.fixture.ts +52 -0
  362. package/src/llm/route-decision.ts +13 -0
  363. package/src/llm-tool-name.ts +37 -0
  364. package/src/llm-tool-schema.ts +35 -0
  365. package/src/llm.ts +123 -11
  366. package/src/loops/checker.ts +100 -0
  367. package/src/loops/consensus.ts +26 -2
  368. package/src/loops/loop-cli.ts +9 -4
  369. package/src/loops/orchestrator/anomaly-cluster.ts +243 -0
  370. package/src/loops/orchestrator/tick.ts +49 -4
  371. package/src/model-tier/llm-tier-map.ts +12 -17
  372. package/src/msg/msg-store.ts +17 -0
  373. package/src/native-tool-catalog.ts +1 -1
  374. package/src/nexus/api/graph-wizard-api.ts +27 -2
  375. package/src/nexus/api/grid.ts +24 -4
  376. package/src/nexus/api/http-server.ts +1 -1
  377. package/src/nexus/api/ops-api.ts +14 -6
  378. package/src/nexus/state/state.ts +7 -1
  379. package/src/oauth/codex-account-store.ts +34 -1
  380. package/src/ops/loops-map.ts +46 -0
  381. package/src/ops/overview-cache.ts +22 -4
  382. package/src/ops/overview.ts +41 -5
  383. package/src/policy/llm-policy.ts +3 -1
  384. package/src/prompt-enhance/enhance.ts +4 -4
  385. package/src/pty-shell/availability.ts +7 -0
  386. package/src/pty-shell/herdr-agent-report.ts +40 -31
  387. package/src/pty-shell/herdr-prune-stale.ts +17 -0
  388. package/src/pty-shell/herdr-sequence-lease.ts +60 -0
  389. package/src/pty-shell/pty-control-ipc.ts +187 -18
  390. package/src/pty-shell/registry.ts +25 -15
  391. package/src/pty-shell/tui-run-state.ts +235 -1
  392. package/src/release-loop/checklist.ts +50 -5
  393. package/src/release-loop/feature-store.ts +9 -9
  394. package/src/release-loop/landed-but-yellow.ts +93 -12
  395. package/src/repl/index.ts +8 -0
  396. package/src/seat-loop/seat-report.ts +1 -0
  397. package/src/self-dev/ask-launch-flow.ts +86 -10
  398. package/src/self-dev/decompose-proposal.ts +29 -18
  399. package/src/self-dev/dev-pipeline.ts +29 -7
  400. package/src/self-dev/draft-sweep.ts +241 -16
  401. package/src/self-dev/draft-triage-rules.ts +19 -5
  402. package/src/self-dev/review-provider-fallback.ts +45 -7
  403. package/src/self-dev/shard-plan.ts +48 -0
  404. package/src/self-dev/shard-run.ts +50 -3
  405. package/src/self-implement/doctor-visit.ts +83 -0
  406. package/src/self-implement/gate-artifacts.ts +6 -2
  407. package/src/self-implement/gate-baseline.ts +64 -1
  408. package/src/self-implement/gate-cli.ts +93 -9
  409. package/src/self-implement/gate-remote.ts +28 -4
  410. package/src/self-implement/gate-scope.ts +13 -1
  411. package/src/self-implement/goal-author.ts +333 -18
  412. package/src/self-implement/goal-supervisor-fill.ts +75 -26
  413. package/src/self-implement/importer-test-index.ts +215 -2
  414. package/src/self-implement/knowhow-pack.ts +5 -5
  415. package/src/self-implement/orchestrator.ts +318 -25
  416. package/src/self-implement/review-round-brief.ts +300 -0
  417. package/src/self-implement/rework-policy.ts +14 -0
  418. package/src/self-implement/run-ledger.ts +170 -6
  419. package/src/self-implement/run-stop.ts +1 -1
  420. package/src/self-implement/running-runs.ts +17 -3
  421. package/src/self-implement/seams.ts +12 -6
  422. package/src/self-implement/stop-autoheal.ts +1 -0
  423. package/src/self-implement/test-seams.ts +13 -1
  424. package/src/self-implement/train-reach-grouping.ts +8 -2
  425. package/src/session/chat.ts +7 -1
  426. package/src/session/id-prefix.ts +60 -0
  427. package/src/session/index.ts +4 -0
  428. package/src/session-runtime/index.ts +9 -1
  429. package/src/skills/tools/pty.ts +5 -0
  430. package/src/status/metrics.ts +12 -1
  431. package/src/steward/rejudge-tick.ts +12 -5
  432. package/src/steward/resync-tick.ts +31 -4
  433. package/src/task-agent/actions.ts +199 -4
  434. package/src/task-agent/boundary-proof-mapping.ts +12 -0
  435. package/src/task-agent/boundary-proof-producer.ts +147 -0
  436. package/src/task-agent/completion-evidence.ts +2 -1
  437. package/src/task-agent/green-close-recipe.ts +239 -0
  438. package/src/task-agent/green-sweep.ts +64 -10
  439. package/src/task-agent/live-moves.ts +48 -3
  440. package/src/task-agent/map-host-adapter.ts +134 -0
  441. package/src/task-agent/map-reduce.ts +158 -0
  442. package/src/task-agent/map-run-ledger.ts +226 -0
  443. package/src/task-agent/parent-host.ts +21 -11
  444. package/src/task-agent/rejudge-on-head.ts +72 -5
  445. package/src/task-agent/repair-cycle.ts +41 -0
  446. package/src/task-agent/repair-next-move.ts +12 -2
  447. package/src/task-agent/review-prior-fix.ts +12 -2
  448. package/src/task-agent/shadow.ts +188 -5
  449. package/src/task-agent/task-hand.ts +158 -13
  450. package/src/task-agent/task-parent-role-llm.ts +9 -0
  451. package/src/task-agent/tier-split.ts +4 -3
  452. package/src/task-agent/work-order.ts +53 -2
  453. package/src/task-orchestrator/dispatcher.ts +46 -1
  454. package/src/task-orchestrator/generator-prompt.ts +6 -0
  455. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +16 -6
  456. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +8 -6
  457. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +97 -0
  458. package/src/task-orchestrator/surfaces/pod-pool.ts +50 -4
  459. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +15 -9
  460. package/src/task-orchestrator/surfaces/self-implement-pod.ts +217 -36
  461. package/src/task-orchestrator/surfaces/self-implement.ts +4 -0
  462. package/src/testing/linux-env.ts +177 -0
  463. package/src/tui/chat/goal-interim.ts +5 -1
  464. package/src/tui/entry.ts +258 -4
  465. package/src/tui/input/at-picker.ts +55 -0
  466. package/src/tui/slash/resume.ts +35 -12
  467. package/src/tui/slash/signals.ts +114 -0
  468. package/src/tui/slash/term-next.ts +71 -0
  469. package/src/tui-client/local-chat-turn.ts +4 -3
  470. package/src/user-config.ts +19 -1
  471. package/src/ux-sim/boot-daemon-tools-pty-shell-device.ts +136 -0
  472. package/src/ux-sim/classic-tui-seat-scenarios.ts +158 -4
  473. package/src/ux-sim/fake-gh.ts +174 -0
  474. package/src/ux-sim/fake-kubectl.ts +142 -0
  475. package/src/ux-sim/fake-llm.ts +6 -1
  476. package/src/ux-sim/next-tui-seat-scenarios.ts +124 -6
  477. package/src/ux-sim/resume-picker-device.ts +173 -0
  478. package/src/ux-sim/session-id-seed.ts +60 -0
  479. package/src/ux-sim/skills-tools-shell-device.ts +156 -0
  480. package/src/ux-sim/task-agent-parent-host-device.ts +264 -0
  481. package/src/ux-sim/task-agent-rejudge-on-head-device.ts +114 -0
  482. package/src/version/packed-revision.json +1 -1
  483. package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +0 -287
  484. package/apps/pwa/out/_next/static/chunks/1201.afbfc5b1c5e5cbe4.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +0 -1
  487. package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +0 -36
  490. package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +0 -149
  493. package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +0 -1
  496. package/apps/pwa/out/_next/static/chunks/2500.cbc1257b774aae52.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +0 -24
  498. package/apps/pwa/out/_next/static/chunks/2812ca6a.3b9f4a7a08885744.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/2941.3c3546f96bc6efa7.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +0 -24
  502. package/apps/pwa/out/_next/static/chunks/3031-85328a92fcce4da6.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/3148-98efd4869d660a87.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +0 -226
  505. package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +0 -8
  509. package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +0 -32
  510. package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +0 -286
  512. package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +0 -74
  515. package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +0 -1
  517. package/apps/pwa/out/_next/static/chunks/4116.a84a92a2492c080e.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +0 -104
  519. package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +0 -148
  522. package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +0 -93
  524. package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +0 -122
  526. package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +0 -1
  527. package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/599.c39c571b6733f2a2.js +0 -41
  531. package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +0 -79
  532. package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/6566.926a1d1b7c911442.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +0 -27
  544. package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/6925.562d532110879886.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/727.7deb87749b0a343a.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/7784.1f0ac4a16d190cf4.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/7891.03f910124a737985.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/8037.e254fd797aa224d1.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +0 -62
  557. package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +0 -90
  559. package/apps/pwa/out/_next/static/chunks/914.8abefd48d579547b.js +0 -94
  560. package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +0 -77
  565. package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/9514.131c52cc75fe6439.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/9789.60f723d18097ec30.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/app/outputs/page-e7abc34a48a6f71e.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/app/term/page-c15958835534404b.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/f9a61e4d.1fc2c1dbdd49fe46.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +0 -1
  630. /package/apps/pwa/out/_next/static/{uC-N0emedeNOFuaBQFv-I → 8kITumG9GAZ1LwT9POrAR}/_ssgManifest.js +0 -0
@@ -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
+ }
@@ -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
+ }
@@ -172,10 +172,58 @@ export function recordInboundTurn(
172
172
  finally { if (ownDb) db.close(); }
173
173
  }
174
174
 
175
+ /** 발화 «원천» — 사람이 말한 것과 시험 fixture·외부 CLI agent 가 던진 것을 계측상 구분한다.
176
+ * ⛔ 원천 표기가 없는 0건을 «사람 표본 0» 으로 오인하면 안 되고, 반대로 시험 fixture 가
177
+ * 사람과 같은 서피스(cli·telegram)에 기록됐다는 이유로 사람 표본으로 세어도 안 된다. */
178
+ export type SurfaceUtteranceOrigin = 'human' | 'test-fixture' | 'external-cli-agent' | 'elanous-self' | 'unknown';
179
+
180
+ const TEST_FIXTURE_ORIGIN = /^(?:test-fixture|test_fixture|fixture|test|test-runner|bun-test)$/i;
181
+ const HUMAN_ORIGIN = /^(?:human|user|tui|pwa|telegram|discord|cli)$/i;
182
+ const EXTERNAL_CLI_AGENT_ORIGIN = /^(?:claude-code|codex|gemini|agent|external|external-cli-agent|external:[\w-]+|ext:[\w-]+)$/i;
183
+ const HUMAN_PROSE_SURFACE = /^(?:cli|tui|pwa|telegram|discord|ipad|watch)$/i;
184
+
185
+ function refsOf(raw: string | null): Record<string, unknown> {
186
+ if (!raw) return {};
187
+ try {
188
+ const value: unknown = JSON.parse(raw);
189
+ return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {};
190
+ } catch { return {}; }
191
+ }
192
+
193
+ /** 원천 분류기 — provenance(recordInboundTurn opts.origin → refs.origin/tags.origin:<origin>)
194
+ * 표기를 먼저 읽고, 표기가 없을 때만 서피스로 추정한다. 시험 fixture 는 서피스 추정 «전에» 가른다. */
195
+ export function classifySurfaceUtteranceOrigin(
196
+ row: Pick<SurfaceEventRow, 'direction' | 'surface' | 'kind' | 'refs' | 'tags'>,
197
+ ): SurfaceUtteranceOrigin {
198
+ if (row.direction !== 'inbound') return 'unknown';
199
+ const refs = refsOf(row.refs);
200
+ const explicit = typeof refs.origin === 'string' ? refs.origin : undefined;
201
+ const utteranceOrigin = typeof refs.utteranceOrigin === 'string' ? refs.utteranceOrigin : undefined;
202
+ const fixtureTagged = (row.tags ?? '').split(/\s+/).filter(Boolean)
203
+ .some((tag) => TEST_FIXTURE_ORIGIN.test(tag.split(':').pop() ?? ''));
204
+ if ((utteranceOrigin && TEST_FIXTURE_ORIGIN.test(utteranceOrigin)) || (explicit && TEST_FIXTURE_ORIGIN.test(explicit)) || fixtureTagged) {
205
+ return 'test-fixture';
206
+ }
207
+ if (utteranceOrigin === 'human') return 'human';
208
+ if (utteranceOrigin === 'agent') return 'external-cli-agent';
209
+ if (explicit) {
210
+ if (HUMAN_ORIGIN.test(explicit)) return 'human';
211
+ if (EXTERNAL_CLI_AGENT_ORIGIN.test(explicit)) return 'external-cli-agent';
212
+ }
213
+ // recordInboundTurn marks its recorder as elanous-self; on chat Q&A the speaker is the human.
214
+ if (row.kind === 'qna' && /^(?:telegram|discord)$/i.test(row.surface)) return 'human';
215
+ if (explicit === 'elanous-self') return 'elanous-self';
216
+ if (/^ext:/i.test(row.surface)) return 'external-cli-agent';
217
+ if (HUMAN_PROSE_SURFACE.test(row.surface)) return 'human';
218
+ return 'unknown';
219
+ }
220
+
175
221
  export interface SurfaceUtteranceQuery {
176
222
  from: string;
177
223
  to: string;
178
224
  surface?: string;
225
+ /** 원천 필터(선택) — 미지정이면 종전과 같이 창 안의 모든 발화를 읽는다(보존 계약). */
226
+ origin?: SurfaceUtteranceOrigin | readonly SurfaceUtteranceOrigin[];
179
227
  }
180
228
 
181
229
  /** Read every event in a half-open UTC interval without touching recall state. */
@@ -183,9 +231,40 @@ export function querySurfaceUtterances(db: Database, opts: SurfaceUtteranceQuery
183
231
  const where = ["julianday(e.ts) >= julianday(?)", "julianday(e.ts) < julianday(?)", "e.direction = 'inbound'", "e.kind IN ('utterance', 'qna')"];
184
232
  const params: string[] = [opts.from, opts.to];
185
233
  if (opts.surface) { where.push('e.surface = ?'); params.push(opts.surface); }
186
- return db.prepare(
234
+ const rows = db.prepare(
187
235
  `SELECT e.* FROM events e WHERE ${where.join(' AND ')} ORDER BY julianday(e.ts) ASC, e.id ASC`,
188
236
  ).all(...params) as SurfaceEventRow[];
237
+ if (opts.origin === undefined) return rows;
238
+ const wanted = new Set<SurfaceUtteranceOrigin>(typeof opts.origin === 'string' ? [opts.origin] : opts.origin);
239
+ return rows.filter((row) => wanted.has(classifySurfaceUtteranceOrigin(row)));
240
+ }
241
+
242
+ /** 원천별 발화 수 — «사람 원천 0» 을 사람 표본으로 읽지 않게 하는 계측 입구(read-only·recall 무접촉). */
243
+ export interface SurfaceUtteranceOriginCounts {
244
+ human: number;
245
+ testFixture: number;
246
+ externalCliAgent: number;
247
+ elanousSelf: number;
248
+ unknown: number;
249
+ total: number;
250
+ }
251
+
252
+ export function countSurfaceUtterancesByOrigin(
253
+ db: Database,
254
+ opts: Omit<SurfaceUtteranceQuery, 'origin'>,
255
+ ): SurfaceUtteranceOriginCounts {
256
+ const counts: SurfaceUtteranceOriginCounts = { human: 0, testFixture: 0, externalCliAgent: 0, elanousSelf: 0, unknown: 0, total: 0 };
257
+ for (const row of querySurfaceUtterances(db, opts)) {
258
+ counts.total += 1;
259
+ switch (classifySurfaceUtteranceOrigin(row)) {
260
+ case 'human': counts.human += 1; break;
261
+ case 'test-fixture': counts.testFixture += 1; break;
262
+ case 'external-cli-agent': counts.externalCliAgent += 1; break;
263
+ case 'elanous-self': counts.elanousSelf += 1; break;
264
+ default: counts.unknown += 1;
265
+ }
266
+ }
267
+ return counts;
189
268
  }
190
269
 
191
270
  export interface QueryEventsOpts {
@@ -10,6 +10,41 @@ import { debug } from '../debug/log.js';
10
10
  import { peerEditRunGate } from '../nexus/api/graph-peer-edit.js';
11
11
  import { OUTPUT_KINDS, pickDefaultOutput, type OutputKind } from './default-outputs.js';
12
12
 
13
+ /**
14
+ * 코드포인트 순서 비교 — `localeCompare` 는 «실행 로케일의 ICU 콜레이션» 을 쓰므로 같은 문자열 쌍의 대소가
15
+ * 플랫폼/로케일마다 뒤집힌다(실측: '🎉party' vs '2026-10-23', 'alpha' vs 'Zebra' 는 콜레이션과 코드포인트가 반대).
16
+ * 순서가 실행 환경에 따라 달라지면 «가장 새 것» 선택이 재현 불가능해진다 — 그래서 코드포인트로 고정한다.
17
+ */
18
+ export function compareCodePoints(a: string, b: string): number {
19
+ return a < b ? -1 : a > b ? 1 : 0;
20
+ }
21
+
22
+ /** 숫자 구간의 선행 0 을 지운다(01 == 1). */
23
+ const stripLeadingZeros = (digits: string): string => digits.replace(/^0+(?=\d)/, '');
24
+
25
+ /**
26
+ * 버전 문자열 비교 — 숫자 구간만 «수치» 로, 나머지는 «코드포인트» 로 비교한다.
27
+ * `localeCompare(..., { numeric: true })` 의 수치 규칙은 그대로 두고 콜레이션 의존만 걷어낸 등가물이다.
28
+ */
29
+ export function compareVersionish(a: string, b: string): number {
30
+ const chunks = (value: string): string[] => value.match(/\d+|\D+/g) ?? [];
31
+ const left = chunks(a);
32
+ const right = chunks(b);
33
+ for (let index = 0; index < Math.min(left.length, right.length); index += 1) {
34
+ const [x, y] = [left[index]!, right[index]!];
35
+ if (/^\d/.test(x) && /^\d/.test(y)) {
36
+ const [dx, dy] = [stripLeadingZeros(x), stripLeadingZeros(y)];
37
+ if (dx.length !== dy.length) return dx.length < dy.length ? -1 : 1;
38
+ const digits = compareCodePoints(dx, dy);
39
+ if (digits !== 0) return digits;
40
+ continue;
41
+ }
42
+ const text = compareCodePoints(x, y);
43
+ if (text !== 0) return text;
44
+ }
45
+ return left.length === right.length ? 0 : left.length < right.length ? -1 : 1;
46
+ }
47
+
13
48
  export interface InstalledGraph {
14
49
  id: string;
15
50
  title: string;
@@ -43,7 +78,7 @@ export function installedPluginGraphs(pluginsRoot = join(elanousStateRoot(), 'pl
43
78
  };
44
79
  for (const market of dirs(pluginsRoot)) {
45
80
  for (const name of dirs(join(pluginsRoot, market))) {
46
- const versions = dirs(join(pluginsRoot, market, name)).sort((a, b) => b.localeCompare(a, undefined, { numeric: true }));
81
+ const versions = dirs(join(pluginsRoot, market, name)).sort((a, b) => compareVersionish(b, a));
47
82
  const version = versions[0];
48
83
  if (!version) continue;
49
84
  const root = join(pluginsRoot, market, name, version);
@@ -146,7 +181,7 @@ export function latestFieldFolder(configRoot = getElanousConfigDir()): string |
146
181
  const photos = readdirSync(path, { withFileTypes: true }).filter(file => file.isFile() && /\.(?:png|jpe?g|webp|heic)$/i.test(file.name));
147
182
  for (const photo of photos) {
148
183
  const time = statSync(join(path, photo.name)).mtimeMs;
149
- if (!latest || time > latest.time || (time === latest.time && path.localeCompare(latest.path) > 0)) latest = { path, time };
184
+ if (!latest || time > latest.time || (time === latest.time && compareCodePoints(path, latest.path) > 0)) latest = { path, time };
150
185
  }
151
186
  } catch { /* Unreadable event does not supply photos. */ }
152
187
  }
@@ -88,8 +88,6 @@ export function activeRunsForGoal(goalId: string, deps: ActiveRunsForGoalDeps =
88
88
  }
89
89
  }
90
90
 
91
- const LAUNCH_BUDGET_PROVIDER: Readonly<Record<string, string>> = { 'codex-rotate': CODEX_PROVIDER, grok: GROK_PROVIDER };
92
-
93
91
  /**
94
92
  * L6 발사 관문의 예산 입력 보정 — 발사 우주의 config 에 체인이 없으면(작업 트리 = 시험 우주) 막지 않고
95
93
  * 코드 기본 체인으로 판단한다. `--child-llm-provider` 를 명시했으면 그것이 체인이다(예산 판정 밖 provider 는 통과).
@@ -98,6 +96,9 @@ export function harnessLaunchBudgetDecision(
98
96
  inputs: BudgetInputs,
99
97
  opts: { readonly childLlmProvider?: string; readonly childLlmModel?: string } = {},
100
98
  ): { readonly decision: BudgetDecision; readonly warning?: string; readonly unmeasuredProvider?: string } {
99
+ // Resolve imported provider constants only when the launch gate is called.
100
+ // This module participates in the CLI/tool catalog import cycle.
101
+ const launchBudgetProvider: Readonly<Record<string, string>> = { 'codex-rotate': CODEX_PROVIDER, grok: GROK_PROVIDER };
101
102
  const explicit = opts.childLlmProvider?.trim();
102
103
  const judged = (selected: BudgetInputs) => {
103
104
  const { decision, unmeasuredProvider } = decideLaunchBudget(selected);
@@ -114,7 +115,7 @@ export function harnessLaunchBudgetDecision(
114
115
  return judged({ ...inputs, preference: { ...inputs.preference, chain } });
115
116
  }
116
117
  if (inputs.preference.chain.length > 0) return judged(inputs);
117
- const chain = DEFAULT_FALLBACK_CHAIN.map((step) => ({ provider: LAUNCH_BUDGET_PROVIDER[step] ?? step }));
118
+ const chain = DEFAULT_FALLBACK_CHAIN.map((step) => ({ provider: launchBudgetProvider[step] ?? step }));
118
119
  const result = judged({ ...inputs, preference: { ...inputs.preference, chain } });
119
120
  return {
120
121
  ...result,
@@ -0,0 +1,45 @@
1
+ import { debug } from '../debug/log.js';
2
+
3
+ export type CliStderrRecord = {
4
+ readonly source: 'git' | 'gh';
5
+ readonly exitCode: number;
6
+ readonly raw: Buffer;
7
+ };
8
+
9
+ export type CliStderrSink = (record: CliStderrRecord) => void;
10
+
11
+ let activeSink: CliStderrSink | null = null;
12
+
13
+ export function hasCliStderrSink(): boolean {
14
+ return activeSink !== null;
15
+ }
16
+
17
+ /** Install a surface-specific sink; without one, CLI stderr keeps its process contract. */
18
+ export function setCliStderrSink(sink: CliStderrSink | null): () => void {
19
+ const previous = activeSink;
20
+ activeSink = sink;
21
+ return () => {
22
+ if (activeSink === sink) activeSink = previous;
23
+ };
24
+ }
25
+
26
+ /** Preserve raw bytes for the caller and keep ordinary CLI invocations on process.stderr. */
27
+ export function writeCliStderr(record: CliStderrRecord): void {
28
+ const sink = activeSink;
29
+ if (!sink) {
30
+ process.stderr.write(record.raw);
31
+ return;
32
+ }
33
+ // A failed screen redraw must not fall through to the physical TTY and overwrite its prompt.
34
+ try { sink(record); } catch (error) {
35
+ // Keep the prompt isolated, but leave a forensic breadcrumb for a failed presentation path.
36
+ try {
37
+ debug.log('tui.cli-stderr', 'sink-failed', {
38
+ source: record.source,
39
+ exitCode: record.exitCode,
40
+ byteLength: record.raw.length,
41
+ errorName: error instanceof Error ? error.name : typeof error,
42
+ });
43
+ } catch { /* never fall through to the physical TTY */ }
44
+ }
45
+ }
@@ -1,5 +1,6 @@
1
1
  import { spawn, spawnSync } from 'node:child_process';
2
2
  import { debug } from '../debug/log.js';
3
+ import { writeCliStderr } from './cli-stderr.js';
3
4
 
4
5
  const LF = 0x0a;
5
6
  const MAX_GH_RETRY_ATTEMPTS = 3;
@@ -195,14 +196,16 @@ export function runGhCli(args: string[]): void {
195
196
  const auxiliaryFailure = exitCode === 0 ? undefined : auxiliaryFailureSignature(stderr);
196
197
 
197
198
  if (stdout.length) process.stdout.write(stdout);
198
- if (stderr.length) process.stderr.write(stderr);
199
+ const stderrChunks: Buffer[] = [];
200
+ if (stderr.length) stderrChunks.push(stderr);
199
201
  // ⛔⭐⭐⭐⭐⭐ **상태 줄은 `stderr` 로** — `git-cli.ts` 의 같은 주석이 canonical.
200
202
  // `--json` 산출 뒤에 비-JSON 한 줄이 붙으면 ***모든 JSON 소비자가 죽는다***(`jq: parse error` 실측).
201
203
  // stdout 은 ***원 바이트 그대로만*** 나간다.
202
204
  const endsWithoutLf = (buffer: Buffer): boolean => buffer.length > 0 && buffer[buffer.length - 1] !== LF;
203
- if (endsWithoutLf(stderr)) process.stderr.write('\n');
205
+ if (endsWithoutLf(stderr)) stderrChunks.push(Buffer.from('\n'));
204
206
 
205
- process.stderr.write(`${statusLine(label, result, auxiliaryFailure)}\n`);
207
+ stderrChunks.push(Buffer.from(`${statusLine(label, result, auxiliaryFailure)}\n`));
208
+ writeCliStderr({ source: 'gh', exitCode, raw: Buffer.concat(stderrChunks) });
206
209
  process.exitCode = exitCode;
207
210
  if (auxiliaryFailure) {
208
211
  debug.log('gh.cli', 'partial-outcome', {
@@ -2,6 +2,7 @@ import { spawnSync } from 'node:child_process';
2
2
  import { existsSync } from 'node:fs';
3
3
  import { join } from 'node:path';
4
4
  import { debug } from '../debug/log.js';
5
+ import { hasCliStderrSink, writeCliStderr } from './cli-stderr.js';
5
6
  import { runGitWithRetry, type GitRunner } from './retry.js';
6
7
 
7
8
  const LF = 0x0a;
@@ -134,7 +135,11 @@ export function runGitCli(args: string[]): void {
134
135
  // ⛔ 실행 «전» 스냅샷 — 이 명령이 마커를 남길 수 있는 종류일 때만 잰다(무관한 명령엔 비용 0).
135
136
  const probesForRun = SUBCOMMAND_PROBES[subcommand];
136
137
  const probesBefore = probesForRun ? probeSnapshot(args, probesForRun, process.env) : undefined;
137
- if (HELP_ARGUMENTS.has(args[0] ?? '')) process.stderr.write(HELP_GUIDANCE);
138
+ const stderrChunks: Buffer[] = [];
139
+ if (HELP_ARGUMENTS.has(args[0] ?? '')) {
140
+ if (hasCliStderrSink()) stderrChunks.push(Buffer.from(HELP_GUIDANCE));
141
+ else process.stderr.write(HELP_GUIDANCE);
142
+ }
138
143
  let attempts = 0;
139
144
  let rawStdout: Buffer = Buffer.alloc(0);
140
145
  let rawStderr: Buffer = Buffer.alloc(0);
@@ -154,7 +159,7 @@ export function runGitCli(args: string[]): void {
154
159
  const result = runGitWithRetry(args, runner);
155
160
 
156
161
  if (rawStdout.length) process.stdout.write(rawStdout);
157
- if (rawStderr.length) process.stderr.write(rawStderr);
162
+ if (rawStderr.length) stderrChunks.push(rawStderr);
158
163
 
159
164
  // ⛔⭐⭐⭐⭐⭐ **상태 줄은 `stderr` 로 나간다** — 2026-08-09 정정(라이브에서 «둘이» 밟았다).
160
165
  // 초판은 stdout 에 썼다. 그러면 ***산출을 값으로 쓰는 모든 소비자가 깨진다***:
@@ -166,7 +171,7 @@ export function runGitCli(args: string[]): void {
166
171
  // `git`·`gh` 자신의 오류도 똑같이 사라지므로 일관된다.
167
172
  // ⇒ 📌 stdout 은 이제 ***원 바이트 그대로만*** 나간다(separator 도 안 붙인다).
168
173
  const endsWithoutLf = (buf: Buffer): boolean => buf.length > 0 && buf[buf.length - 1] !== LF;
169
- if (endsWithoutLf(rawStderr)) process.stderr.write('\n');
174
+ if (endsWithoutLf(rawStderr)) stderrChunks.push(Buffer.from('\n'));
170
175
 
171
176
  const exitCode = result.status ?? 1;
172
177
  const leftKind = exitCode !== 0 && probesForRun
@@ -176,11 +181,12 @@ export function runGitCli(args: string[]): void {
176
181
  const leftReason = leftKind
177
182
  ? `${leftKind}-${hasUnmergedPaths(args, process.env) ? 'conflict' : 'in-progress'}`
178
183
  : undefined;
179
- process.stderr.write(
184
+ stderrChunks.push(Buffer.from(
180
185
  `[git] ${subcommand} ${exitCode === 0 ? 'ok' : 'FAILED'} rc=${exitCode}`
181
186
  + (leftReason ? ` worktree-changed=yes reason=${leftReason}` : '')
182
187
  + '\n',
183
- );
188
+ ));
189
+ writeCliStderr({ source: 'git', exitCode, raw: Buffer.concat(stderrChunks) });
184
190
  process.exitCode = exitCode;
185
191
  debug.log('git.cli', 'completed', {
186
192
  subcommand,