elanous 0.2.28 → 0.2.29

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 (609) 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/{y1ltt7oCZxVpC6zVPhZ2O → cIpv5nU9AycwYWZI9H589}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{ab4d57c2.e90bc2cb31949045.js → 058a98ba.7eb28d5e6dc03565.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{4565-67e4c620597965c8.js → 1015-9cba22a5a4554797.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/1084-4e66af7376a18db7.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1106.3a6410b7b0c70ad4.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1127.32fc642f70423506.js +8 -0
  9. package/apps/pwa/out/_next/static/chunks/{1516.83dd2c1b86b4e507.js → 1142.65d002789ab3af7d.js} +2 -2
  10. package/apps/pwa/out/_next/static/chunks/1189-d9b8e1995a831fae.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1224.6da98c7ad0eb7dd8.js +34 -0
  12. package/apps/pwa/out/_next/static/chunks/1370.4e3e2558f111fd5d.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1514-b7da377fdc4eb17a.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/1516.dfaceff3fd2d0e0d.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1577.3c24c32584e10d70.js +286 -0
  16. package/apps/pwa/out/_next/static/chunks/161.130a569855c4d68c.js +24 -0
  17. package/apps/pwa/out/_next/static/chunks/1782-59db1b5aa06df38a.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/{1743.563d3168e95825ef.js → 1852.7f7b53991fcb99ef.js} +2 -2
  19. package/apps/pwa/out/_next/static/chunks/1864.16da9556e78a9236.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/1b6f6b2a.aff090122be3726e.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2341.e8a9135e5b910dd5.js +36 -0
  22. package/apps/pwa/out/_next/static/chunks/257.10afdbe3520f2fc2.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2658.87550e692dc493f6.js +64 -0
  24. package/apps/pwa/out/_next/static/chunks/2673.85e2f02efae7a85f.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2766-bee623b37472ed63.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2794.6d836872b0bf43e2.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2806.eb57ced1a528ed39.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/283.7a121c4910e6dad7.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/{65ebff95.081daeff622d238e.js → 285adb1a.5654e605dddf86d2.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/2870.1dc29aa5fc01f09f.js +115 -0
  31. package/apps/pwa/out/_next/static/chunks/293.fd38e77ce5d48103.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/2993-5952a1cd3fd5d441.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/3160-95c96f4d2a21dd26.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/32-a523427c5bd5ed00.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/3280.af38002a6424a905.js +90 -0
  36. package/apps/pwa/out/_next/static/chunks/328bb3ab-6628a1114fe3fb3b.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3292-5ddffdb2f517b44f.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/{9917-9e26abc5f7772735.js → 3396-97b97928c49190c9.js} +1 -1
  39. package/apps/pwa/out/_next/static/chunks/{6196.34d6b229079e9e28.js → 3403.7199205e65124486.js} +1 -1
  40. package/apps/pwa/out/_next/static/chunks/3523.d3231daaf7aba993.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3763.577de3181e1e6ea0.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/4138-cc56b0938ef72783.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/419.736c0d6f426249a7.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4255-8350c43d307a8875.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{6def8a8e.c81f9ca41028eccf.js → 425cfc4d.fb91158e3971c39f.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4352.a4954693499c2714.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4421-f2dcbc6fd80ec013.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4513-51b94aeee37c9905.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/{16e57f67.3ea19e893461e611.js → 46bd8bea.2f4b4099172fcdb7.js} +1 -1
  50. package/apps/pwa/out/_next/static/chunks/{5081.a240b63fad28663a.js → 4759.1f76713aefb87db5.js} +1 -1
  51. package/apps/pwa/out/_next/static/chunks/4928-c3b72f99aa588699.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4986-f9fc0283fb325219.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/5014.671a7b9f69c2b7b1.js +94 -0
  54. package/apps/pwa/out/_next/static/chunks/5137.d398e24710b3feb6.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5298.0bea74885cabe754.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/5315.74c53a39739b11c4.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/5317-8b1df8d02105cd07.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5358-33051f41a2b239af.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/5388.a2ec02501f714ad5.js +62 -0
  60. package/apps/pwa/out/_next/static/chunks/5395.e6ac948a2d15058d.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5409-f282bf533c151849.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5466.d0f4aba9d52acfa8.js +27 -0
  63. package/apps/pwa/out/_next/static/chunks/5564.3d28b353470fe305.js +104 -0
  64. package/apps/pwa/out/_next/static/chunks/{9974.e77b4ff4884557b3.js → 5591.a35e7a217734a8b9.js} +2 -2
  65. package/apps/pwa/out/_next/static/chunks/569.b0cbfb4dee4a167a.js +93 -0
  66. package/apps/pwa/out/_next/static/chunks/5835-72465b73a8bb8d74.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5941.045d6093139e1f7a.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/{5492-e05e26a033ba80d2.js → 6013-2f769370d8b4c2c6.js} +3 -3
  69. package/apps/pwa/out/_next/static/chunks/6228.47cabb83564dfe54.js +24 -0
  70. package/apps/pwa/out/_next/static/chunks/6457-8d1993002a87d0fe.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6513.ef54cfae52351982.js +2 -0
  72. package/apps/pwa/out/_next/static/chunks/{5408.377c8c543635b81f.js → 6534.1ab00f370db7b105.js} +1 -1
  73. package/apps/pwa/out/_next/static/chunks/6582.13d245bf87df69f1.js +148 -0
  74. package/apps/pwa/out/_next/static/chunks/6655.c33f6acc2c61bb89.js +149 -0
  75. package/apps/pwa/out/_next/static/chunks/6731-9d7195af289c8d4c.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6733.0be05b1db9279fc5.js +79 -0
  77. package/apps/pwa/out/_next/static/chunks/6742-90937146253a8b9e.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/{8578.dff22d988cc2b106.js → 6767.1fcfc9b8be83975f.js} +16 -16
  79. package/apps/pwa/out/_next/static/chunks/6776.06ff1e3b464cc607.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/{9311.24c8f5ea793253dd.js → 6853.cc5174a9dee59593.js} +1 -1
  81. package/apps/pwa/out/_next/static/chunks/687-816858f77a396a4e.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6888.72c7b8cfb02a7e61.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6993.c17c828ac3ef3253.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7076.9f27ef666b0cefdd.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7113.1403c5d451804e8c.js +287 -0
  86. package/apps/pwa/out/_next/static/chunks/7169.9dd603c726c2cd7c.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/7247-e3ec21f761f86710.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/7261-a47b72f96f5199df.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7335-5cda81ac90310077.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7356-c2e4af090546e2d4.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/{94.4cfed21c0b781a06.js → 7375.050ea0d72968e49f.js} +16 -16
  92. package/apps/pwa/out/_next/static/chunks/738-59518742078fda71.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7385.a7375f10db73243a.js +77 -0
  94. package/apps/pwa/out/_next/static/chunks/7445.cf1cf2fe109bcd96.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7505.a2057432ab6ef99a.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/7515.31f45fac1f9c70cb.js +74 -0
  97. package/apps/pwa/out/_next/static/chunks/7658-d4ce8c72a9548a91.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7725-4f83d5541fbdb81b.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/8107-0b1ae46bc5bcb788.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/8132.bfea2f016ce8d992.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8332.6f0f49df772e163b.js +23 -0
  102. package/apps/pwa/out/_next/static/chunks/{7483.ba01c6c209b81bba.js → 8398.73a19b39715eda04.js} +1 -1
  103. package/apps/pwa/out/_next/static/chunks/{2846.d6a433b8663819a5.js → 8471.8d2a8c74f09c36ff.js} +3 -3
  104. package/apps/pwa/out/_next/static/chunks/8672.e299832bc7d18ee2.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8735.f1ef798a5f260f6f.js +226 -0
  106. package/apps/pwa/out/_next/static/chunks/{5785-ea8d2c633b6688e3.js → 8767-2f6a634f5abeaa01.js} +1 -1
  107. package/apps/pwa/out/_next/static/chunks/8774-88f67f7d8d53d299.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8782.252e5a405d86e4ed.js +32 -0
  109. package/apps/pwa/out/_next/static/chunks/8795.32573a185af18c7b.js +41 -0
  110. package/apps/pwa/out/_next/static/chunks/909-9ed7aa0dba804316.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/9100.22b0301256827007.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9140-dde77575570bc71e.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/{4593.10f5b9bd702d4a6c.js → 9143.ff14585db1d275ff.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/9292-a7ad9a01c7044b93.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9517.00627dc51b02821c.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9725.dcbb585652d8e9c5.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9761.a3ebf5c389c24ddc.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{4204.a409ab6250c0f6a8.js → 9907.49be0fcadaf214b5.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/9972.834d2b2b7d48f1ed.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9995-1a90486f5ae01546.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{973cbf1b.3bbcf2b41548eca7.js → a435ad95.577add051b4facb2.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-83372d8b5863ebf7.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-d69256d7613c140a.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-352c5e9ba3f9b858.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-69f1d725524201a8.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-fa46d4588e8442c2.js → page-a5635eba0d73b84e.js} +1 -1
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-ad9181d84285e4ea.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/{page-66ad46ed0279feb9.js → page-86feb08080261a2f.js} +1 -1
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-ffa15987e4756d03.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-11a3ab44ac327cc1.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-6309b11c4264d24d.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-8800472079612e87.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-d387bf3f2301882a.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-048f88d8c8658da6.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-6c14f9739b7f6880.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-2834f44f64e98d74.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-83372d8b5863ebf7.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-a13df6f88e824887.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-8a4397248754cf2b.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-daf0bd329360a336.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-f7ef1c28764cb476.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-61e74f28b9353dac.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/{page-646b50f63b6fe732.js → page-8aaa6dedc4c10dfb.js} +1 -1
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-294602ba649be829.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-5fa5f41ed3fce323.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/{page-6f131b51193a36f9.js → page-33bf667a5fb297bf.js} +1 -1
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-5ae3cbd6e5dba515.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-eb867d16ad6fdede.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1ab789fa68682f7e.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6fd41b5b6ff13a71.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fb3d5f7642c99fba.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-70f705b2b5ed42ca.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-c9c93b358a7667b5.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1563c556b81c96ed.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ce89c20c45b3a673.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-423ae63d786f4ee9.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-591a5378a4c4447c.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-a250496b19a5824b.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-c36a9277febc5911.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-83372d8b5863ebf7.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-29900ed0011b2c83.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-a5de57edc6d7f942.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-16bdd4c9f40498df.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-75e946e6e71cc6d8.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-9eb56166774eb256.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-1c5f9ef35dbb22c5.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-657ff9985e508498.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-22dc72499da68fb2.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9f92737b8766009a.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-094ad334e40f8169.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-8bcd379852ff6287.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-6b04413f280cd344.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{f4dfbfc0.a69fb12f854882aa.js → bc324b7c.02a09dd93f6a399b.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/de70ab42-d28d47437208d458.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/f800c5e3.46dbd7f2af8c3fce.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/f8bc19ad.47579f6d684b0760.js +122 -0
  177. package/apps/pwa/out/_next/static/chunks/framework-ca9ac4609fb9fed8.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/main-app-0dd08d32d15a030f.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-f0399d33955c4e01.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/pages/_app-d42caca6f8ac2211.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_error-42e713c13aa41ca8.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/webpack-8fbf8f61a377aa16.js +1 -0
  183. package/apps/pwa/out/approvals/index.html +1 -1
  184. package/apps/pwa/out/approvals/index.txt +22 -22
  185. package/apps/pwa/out/autopilot/index.html +1 -1
  186. package/apps/pwa/out/autopilot/index.txt +22 -22
  187. package/apps/pwa/out/board/index.html +1 -1
  188. package/apps/pwa/out/board/index.txt +22 -22
  189. package/apps/pwa/out/botlab/index.html +1 -1
  190. package/apps/pwa/out/botlab/index.txt +21 -21
  191. package/apps/pwa/out/bots/index.html +1 -1
  192. package/apps/pwa/out/bots/index.txt +21 -21
  193. package/apps/pwa/out/ceo/index.html +1 -1
  194. package/apps/pwa/out/ceo/index.txt +22 -22
  195. package/apps/pwa/out/chat/index.html +1 -1
  196. package/apps/pwa/out/chat/index.txt +21 -21
  197. package/apps/pwa/out/consult/index.html +1 -1
  198. package/apps/pwa/out/consult/index.txt +22 -22
  199. package/apps/pwa/out/control/index.html +1 -1
  200. package/apps/pwa/out/control/index.txt +22 -22
  201. package/apps/pwa/out/decisions/index.html +1 -1
  202. package/apps/pwa/out/decisions/index.txt +21 -21
  203. package/apps/pwa/out/design-check/index.html +1 -1
  204. package/apps/pwa/out/design-check/index.txt +22 -22
  205. package/apps/pwa/out/editor/index.html +1 -1
  206. package/apps/pwa/out/editor/index.txt +22 -22
  207. package/apps/pwa/out/exec/index.html +1 -1
  208. package/apps/pwa/out/exec/index.txt +22 -22
  209. package/apps/pwa/out/field/index.html +1 -1
  210. package/apps/pwa/out/field/index.txt +22 -22
  211. package/apps/pwa/out/healthz +1 -1
  212. package/apps/pwa/out/index.html +1 -1
  213. package/apps/pwa/out/index.txt +21 -21
  214. package/apps/pwa/out/inside/index.html +1 -1
  215. package/apps/pwa/out/inside/index.txt +21 -21
  216. package/apps/pwa/out/intake/index.html +1 -1
  217. package/apps/pwa/out/intake/index.txt +22 -22
  218. package/apps/pwa/out/live/index.html +1 -1
  219. package/apps/pwa/out/live/index.txt +22 -22
  220. package/apps/pwa/out/live-run/index.html +1 -1
  221. package/apps/pwa/out/live-run/index.txt +22 -22
  222. package/apps/pwa/out/loops/index.html +1 -1
  223. package/apps/pwa/out/loops/index.txt +21 -21
  224. package/apps/pwa/out/market/index.html +1 -1
  225. package/apps/pwa/out/market/index.txt +21 -21
  226. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  227. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  228. package/apps/pwa/out/morning/index.html +1 -1
  229. package/apps/pwa/out/morning/index.txt +22 -22
  230. package/apps/pwa/out/observatory/index.html +1 -1
  231. package/apps/pwa/out/observatory/index.txt +22 -22
  232. package/apps/pwa/out/ops/checklist/index.html +1 -1
  233. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  234. package/apps/pwa/out/ops/release/index.html +1 -1
  235. package/apps/pwa/out/ops/release/index.txt +21 -21
  236. package/apps/pwa/out/ops/seats/index.html +1 -1
  237. package/apps/pwa/out/ops/seats/index.txt +21 -21
  238. package/apps/pwa/out/outputs/index.html +1 -1
  239. package/apps/pwa/out/outputs/index.txt +21 -21
  240. package/apps/pwa/out/reflection/index.html +1 -1
  241. package/apps/pwa/out/reflection/index.txt +22 -22
  242. package/apps/pwa/out/scheduler/index.html +1 -1
  243. package/apps/pwa/out/scheduler/index.txt +22 -22
  244. package/apps/pwa/out/sessions/index.html +1 -1
  245. package/apps/pwa/out/sessions/index.txt +21 -21
  246. package/apps/pwa/out/settings/devices/index.html +1 -1
  247. package/apps/pwa/out/settings/devices/index.txt +22 -22
  248. package/apps/pwa/out/settings/index.html +1 -1
  249. package/apps/pwa/out/settings/index.txt +22 -22
  250. package/apps/pwa/out/setup/done/index.html +1 -1
  251. package/apps/pwa/out/setup/done/index.txt +22 -22
  252. package/apps/pwa/out/setup/index.html +1 -1
  253. package/apps/pwa/out/setup/index.txt +22 -22
  254. package/apps/pwa/out/share/index.html +1 -1
  255. package/apps/pwa/out/share/index.txt +22 -22
  256. package/apps/pwa/out/showroom/index.html +1 -1
  257. package/apps/pwa/out/showroom/index.txt +21 -21
  258. package/apps/pwa/out/tasks/index.html +1 -1
  259. package/apps/pwa/out/tasks/index.txt +22 -22
  260. package/apps/pwa/out/term/index.html +1 -1
  261. package/apps/pwa/out/term/index.txt +22 -22
  262. package/apps/pwa/out/today/index.html +1 -1
  263. package/apps/pwa/out/today/index.txt +22 -22
  264. package/apps/pwa/out/trace/index.html +1 -1
  265. package/apps/pwa/out/trace/index.txt +22 -22
  266. package/apps/pwa/out/vault/index.html +1 -1
  267. package/apps/pwa/out/vault/index.txt +22 -22
  268. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  269. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  270. package/apps/pwa/out/workflows/index.html +1 -1
  271. package/apps/pwa/out/workflows/index.txt +22 -22
  272. package/apps/pwa/out/workspace/index.html +1 -1
  273. package/apps/pwa/out/workspace/index.txt +22 -22
  274. package/apps/pwa/out/worktrees/index.html +1 -1
  275. package/apps/pwa/out/worktrees/index.txt +22 -22
  276. package/graphs/release/release-loop.yaml +6 -2
  277. package/package.json +1 -1
  278. package/plugins/agent-team/agents/research.md +1 -0
  279. package/scripts/ci-typecheck-changed.ts +3 -2
  280. package/scripts/coord-channel-watch.sh +26 -6
  281. package/scripts/coord-role-pack.ts +143 -0
  282. package/scripts/lib/morning-report-options.ts +41 -0
  283. package/scripts/pr-land-extra-remote-gates.ts +49 -0
  284. package/scripts/release-loop/gate-batch-safe.ts +23 -0
  285. package/scripts/release-loop/gate-history.ts +422 -0
  286. package/scripts/release-loop/gate-node.ts +310 -46
  287. package/scripts/release-loop/gate-triage-node.ts +190 -0
  288. package/scripts/release-loop/spawn-lane.ts +68 -0
  289. package/scripts/release-loop/tui-node-checks.ts +23 -0
  290. package/scripts/release-loop/version-node.ts +62 -4
  291. package/scripts/test-deterministic.ts +41 -12
  292. package/scripts/usage-rollup.ts +11 -3
  293. package/src/acp/core-turn-bridge.ts +98 -22
  294. package/src/acp/elanous-extensions.ts +2 -0
  295. package/src/acp/server.ts +2 -0
  296. package/src/agent/ref-grounding.ts +18 -0
  297. package/src/agent-substrate/pr-reviewer.ts +29 -21
  298. package/src/budget/pty-usage-reemit.ts +7 -0
  299. package/src/budget/run-usage-rollup.ts +9 -0
  300. package/src/budget/usage-daily-store.ts +98 -0
  301. package/src/capture/tui-self-report.ts +22 -4
  302. package/src/chat/index.ts +31 -10
  303. package/src/chat/pickers/modal-runtime.ts +1 -0
  304. package/src/chat/pickers/modals.ts +3 -1
  305. package/src/chat/turn-typeahead.ts +123 -16
  306. package/src/cli/dashboard-name-flag.ts +48 -0
  307. package/src/cli/doctor-cli.ts +80 -0
  308. package/src/cli/log-event-names.ts +12 -0
  309. package/src/cli/msg-cli.ts +45 -2
  310. package/src/cli/pr-cli.ts +382 -105
  311. package/src/cli/pr-land-heavy-remote.ts +233 -0
  312. package/src/cli/pr-land-overlap-evidence.ts +104 -5
  313. package/src/cli/pty-takeover-cli.ts +125 -16
  314. package/src/cli/release-cli.ts +44 -2
  315. package/src/cli/remote-resolve.ts +2 -1
  316. package/src/cli/seat-cli.ts +26 -16
  317. package/src/cli/tasks-cli.ts +8 -2
  318. package/src/cli/usage-cli.ts +146 -12
  319. package/src/cli/usage-daily-cli.ts +84 -0
  320. package/src/context-bus/context-now.ts +82 -5
  321. package/src/core-turn/auth-rejected-notice.ts +41 -0
  322. package/src/core-turn/run-core-turn.ts +13 -2
  323. package/src/core-turn/run-goal-loop.ts +17 -1
  324. package/src/core-turn/short-question.ts +45 -12
  325. package/src/core-turn/types.ts +7 -0
  326. package/src/dashboard/acp-active-model.ts +40 -0
  327. package/src/dashboard/auto-compact-runtime.ts +2 -0
  328. package/src/dashboard/boot-banner.ts +80 -0
  329. package/src/dashboard/dashboard-status-lines.ts +11 -0
  330. package/src/dashboard/detail-viewer-runtime.ts +15 -2
  331. package/src/dashboard/event-loop-stall-monitor.ts +4 -0
  332. package/src/dashboard/goal-loop-thinking.ts +16 -0
  333. package/src/dashboard/hitl-boot.ts +9 -4
  334. package/src/dashboard/index.ts +228 -387
  335. package/src/dashboard/input/chat-main-entry-runtime.ts +2 -0
  336. package/src/dashboard/input/chat-main-log-actions.ts +4 -0
  337. package/src/dashboard/input/chat-main-log-command.ts +12 -1
  338. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +172 -3
  339. package/src/dashboard/input/chat-main-session.ts +6 -2
  340. package/src/dashboard/input/chat-main-slash-command.ts +7 -0
  341. package/src/dashboard/input/chat-main-turn.ts +2 -1
  342. package/src/dashboard/input/compact-prepass-recovery.ts +97 -0
  343. package/src/dashboard/input/dashboard-chord-actions.ts +10 -1
  344. package/src/dashboard/input/dashboard-chord-runtime.ts +2 -0
  345. package/src/dashboard/input/external-input-host.ts +45 -0
  346. package/src/dashboard/input/log-fold-binding.ts +18 -0
  347. package/src/dashboard/input/mouse-wiring.ts +17 -4
  348. package/src/dashboard/input/turn-steer-bridge.ts +94 -0
  349. package/src/dashboard/log-click-runtime.ts +5 -3
  350. package/src/dashboard/running-build-status.ts +74 -0
  351. package/src/dashboard/seat-boot-preamble.ts +113 -0
  352. package/src/dashboard/seat-local-instructions.ts +305 -0
  353. package/src/dashboard/slash-runtime/dashboard-handlers.ts +100 -28
  354. package/src/dashboard/slash-runtime/model-choices.ts +35 -0
  355. package/src/dashboard/term-slash-runtime.ts +15 -0
  356. package/src/dashboard/turn-preamble.ts +30 -2
  357. package/src/dashboard/turn-session-layers.ts +176 -0
  358. package/src/dashboard/turn-stream-formatter.ts +14 -6
  359. package/src/dashboard/turn-stream-presentation-applier.ts +8 -0
  360. package/src/domains/release-tool.ts +8 -9
  361. package/src/domains/surface-events.ts +4 -1
  362. package/src/domains/watch-default-scheduler.ts +8 -9
  363. package/src/fold-stack.ts +24 -1
  364. package/src/git-fs/dirty.ts +32 -4
  365. package/src/git-fs/index.ts +43 -1
  366. package/src/graph-runner/runner.ts +1 -0
  367. package/src/harness/harness-gc.ts +32 -5
  368. package/src/index.ts +14 -1
  369. package/src/input/external-input-queue.ts +219 -0
  370. package/src/interactive-terminal-modal.ts +13 -0
  371. package/src/llm/route-decision.ts +25 -0
  372. package/src/llm-stream-retry-display.ts +59 -0
  373. package/src/llm.ts +253 -55
  374. package/src/log-entry.ts +3 -3
  375. package/src/log-pane/search.ts +29 -4
  376. package/src/loops/agent-reply.ts +256 -0
  377. package/src/loops/budget.ts +37 -7
  378. package/src/loops/loop-cli.ts +3 -2
  379. package/src/loops/msg-address.ts +57 -0
  380. package/src/loops/msg-wake.ts +282 -0
  381. package/src/loops/orchestrator/inbox.ts +60 -3
  382. package/src/loops/orchestrator/tick.ts +24 -4
  383. package/src/loops/registry.ts +42 -4
  384. package/src/memory.ts +20 -5
  385. package/src/native-tool-catalog.ts +125 -0
  386. package/src/nexus/api/http-server.ts +5 -0
  387. package/src/nexus/api/ops-api.ts +2 -0
  388. package/src/nexus/api/project-autopsy.ts +127 -0
  389. package/src/nexus/api/terminals.ts +3 -0
  390. package/src/nexus/api/workflow-approvals.ts +2 -0
  391. package/src/nexus/onboarding/first-boot-wizard.ts +56 -2
  392. package/src/oauth/codex-account-store.ts +15 -3
  393. package/src/oauth/codex-billing-route.ts +31 -0
  394. package/src/ops/overview-collect.ts +19 -2
  395. package/src/panes/log-pane.ts +67 -8
  396. package/src/persona/presets.ts +44 -0
  397. package/src/plugins/maker/wizard-generate.ts +6 -4
  398. package/src/preview/terminal.ts +14 -1
  399. package/src/prompt-cache/types.ts +2 -0
  400. package/src/prompt-enhance/enhance.ts +24 -8
  401. package/src/prompt-library/universal-preamble.ts +273 -56
  402. package/src/pty-shell/pty-control-ipc.ts +4 -1
  403. package/src/pty-shell/pty-manifest.ts +77 -5
  404. package/src/pty-shell/registry.ts +19 -2
  405. package/src/pty-shell/tui-run-state.ts +253 -0
  406. package/src/release-loop/light-rc.ts +28 -3
  407. package/src/release-loop/rehearsal.ts +1 -1
  408. package/src/render.ts +5 -1
  409. package/src/seat-loop/seat-report.ts +42 -2
  410. package/src/self-dev/run-supervisor.ts +71 -5
  411. package/src/self-dev/shard-aggregate.ts +2 -0
  412. package/src/self-dev/shard-run.ts +23 -2
  413. package/src/self-health/signatures.ts +132 -0
  414. package/src/self-implement/doctor-visit.ts +118 -0
  415. package/src/self-implement/gate-cli.ts +11 -2
  416. package/src/self-implement/goal-author-decompose.ts +80 -16
  417. package/src/self-implement/goal-author.ts +114 -72
  418. package/src/self-implement/goal-authoring-grounding.ts +1 -1
  419. package/src/self-implement/goal-file-name.ts +65 -0
  420. package/src/self-implement/ground-goal.ts +2 -1
  421. package/src/self-implement/host-regate.ts +14 -0
  422. package/src/self-implement/review-mustfix-class.ts +115 -0
  423. package/src/self-implement/run-ledger.ts +111 -7
  424. package/src/self-implement/running-runs.ts +10 -6
  425. package/src/self-implement/self-implement-runtime.ts +32 -0
  426. package/src/session/pending-input.ts +62 -11
  427. package/src/session-runtime/index.ts +7 -1
  428. package/src/skills/tools/ops-ledger.ts +707 -0
  429. package/src/skills/tools/persistent-grounding.ts +47 -7
  430. package/src/skills/tools/shell.ts +117 -1
  431. package/src/status/bar.ts +32 -2
  432. package/src/status/status-provider-info.ts +58 -0
  433. package/src/task-agent/rejudge-on-head.ts +4 -1
  434. package/src/task-agent/remote-rejudge-bind.ts +34 -5
  435. package/src/task-agent/repair-cycle.ts +13 -0
  436. package/src/task-orchestrator/surfaces/kubectl-transient-retry.ts +51 -0
  437. package/src/task-orchestrator/surfaces/pod-command-job.ts +63 -7
  438. package/src/task-orchestrator/surfaces/pod-install-slots.ts +6 -11
  439. package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +76 -0
  440. package/src/task-orchestrator/surfaces/self-implement-pod.ts +107 -33
  441. package/src/terminal/session-registry.ts +6 -0
  442. package/src/thinking-line.ts +12 -3
  443. package/src/tool-runtime/index.ts +4 -0
  444. package/src/tool-runtime/ops-ledger-runtimes.ts +84 -0
  445. package/src/tool-runtime/ref-consult-runtime.ts +17 -2
  446. package/src/tool-runtime/run-shell-runtime.ts +4 -1
  447. package/src/tool-runtime/self-cognition-runtimes.ts +5 -1
  448. package/src/tui.ts +5 -0
  449. package/src/user-config.ts +54 -6
  450. package/src/ux-sim/fake-llm.ts +29 -0
  451. package/src/ux-sim/in-process-cli.ts +175 -0
  452. package/src/version/packed-revision.json +1 -1
  453. package/apps/pwa/out/_next/static/chunks/1027.a0f04663d24c2779.js +0 -1
  454. package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +0 -1
  456. package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +0 -1
  457. package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +0 -36
  458. package/apps/pwa/out/_next/static/chunks/1146.80d15ea7c6e6ee95.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/1157.f08bf2b70915e176.js +0 -148
  460. package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +0 -1
  461. package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +0 -1
  463. package/apps/pwa/out/_next/static/chunks/1454-29d1d773d5996a49.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +0 -1
  465. package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +0 -27
  467. package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +0 -1
  468. package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/2528.3868070ef1be69f9.js +0 -24
  472. package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/2697.76ca2ac3efef6f3b.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +0 -32
  475. package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/3143.257997a5f1ed79df.js +0 -34
  477. package/apps/pwa/out/_next/static/chunks/3259-86f3be56e43eaf6a.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +0 -1
  479. package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/3309.364573ceedbdfd5f.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +0 -287
  482. package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/4084.15ecaf4240bd9e77.js +0 -286
  487. package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +0 -1
  490. package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +0 -8
  492. package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +0 -104
  494. package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +0 -149
  496. package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/599-56f2c0a5cc4a7295.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +0 -23
  506. package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +0 -77
  510. package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +0 -64
  512. package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +0 -2
  514. package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +0 -1
  517. package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +0 -62
  522. package/apps/pwa/out/_next/static/chunks/7752.5cbdd0b433c54af9.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +0 -1
  527. package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/8085-1e5fce59500a2cc2.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +0 -226
  531. package/apps/pwa/out/_next/static/chunks/83a80514-b897b64df43ce108.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +0 -93
  533. package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +0 -24
  534. package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +0 -115
  537. package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +0 -41
  539. package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +0 -74
  540. package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +0 -94
  541. package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/949.1e7d45ccb71580aa.js +0 -90
  545. package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/9938.b23e4d4dfa0114cd.js +0 -79
  549. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/app/approvals/page-5ab1e47978577c5e.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-24453f6a302816b4.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/app/board/page-6c131d30bb1cf871.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/app/bots/page-dc0772b11861af51.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/app/chat/page-5159dc8752c6cd29.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/app/consult/page-c5a2478861c08b87.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/app/control/page-f722a9dec084e08b.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/app/decisions/page-256ffd365d32e100.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/app/design-check/page-e0de78ae7b99f01c.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/app/editor/page-cfbdc44b708d9801.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/app/exec/page-4c741eb760f2f77c.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/app/field/page-e9ba98f5f1440a21.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/app/inside/page-dafc901bb1b72b5f.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/app/intake/page-2f6f303fa114ec24.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/app/layout-1634081c5272006c.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/app/live/page-ced0bcfc6542b3fc.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/app/live-run/page-bb1f05cd51c38944.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/app/market/page-db069b48a59c8c00.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-f736324afa2117c1.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/app/not-found-435f5e2faf02bc01.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/app/observatory/page-497e0eedf20e7890.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-a8d28fdf995e16ea.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-8966452228753c5e.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fd5d18656cb432b6.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/outputs/page-5663779cb1a37609.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/page-66a67eb19ebd976b.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/reflection/page-3b492aa78cf3c4a6.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c71267e7681da982.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/app/sessions/page-a21d1e1797172692.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-cb249e81ed339318.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/app/settings/page-781cfc5114e097da.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-478157214db6a023.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/app/setup/page-86141f12cf090b7f.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/app/share/page-7256c73bb1c36751.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/app/showroom/page-5c738ca7adef3de5.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/app/tasks/page-0138c8091ec17224.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/app/term/page-cc2f24f16d85e735.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/app/today/page-979d318a534e92da.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/app/trace/page-182d394f7e6e096b.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/app/vault/page-21050928a697ed7a.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-44b9d807005a9030.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/app/workflows/page-601fb77340e63c9a.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/app/workspace/page-75d3fb5d47af0edf.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-11bf9e5725a72c22.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/e117f801.e92bf10242653497.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/e87d89b9.2e71c0ae475d28a1.js +0 -122
  599. package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +0 -1
  605. package/src/dashboard/bench-slash-runtime.ts +0 -40
  606. package/src/dashboard/input/search-modal-router.ts +0 -9
  607. package/src/dashboard/modals/pane-key-router.ts +0 -27
  608. package/src/dashboard/view-slash-runtime.ts +0 -48
  609. /package/apps/pwa/out/_next/static/{y1ltt7oCZxVpC6zVPhZ2O → cIpv5nU9AycwYWZI9H589}/_ssgManifest.js +0 -0
@@ -18,6 +18,7 @@ import type { ModelFamily } from '../models/prompts.js';
18
18
  import { debug } from '../debug/log.js';
19
19
  import type { NativeToolCatalogEntry } from '../native-tool-catalog.js';
20
20
  import { buildUniversalPreamble } from '../prompt-library/universal-preamble.js';
21
+ import { buildSeatBootSystemMessages, type SeatBootDeps } from './seat-boot-preamble.js';
21
22
  import { buildPlanModeSystemMessages } from '../plan-mode/system-prompt.js';
22
23
  import { buildImplDisciplineSystemMessages } from '../impl-discipline/index.js';
23
24
  import { buildConcisenessSystemMessages } from '../prompt-library/chat-conciseness.js';
@@ -29,7 +30,8 @@ import {
29
30
  import { buildExecutionAskSystemMessages } from '../ask-user-question/index.js';
30
31
  import { buildApprovalPolicySystemMessages } from '../code-edit/index.js';
31
32
  import { buildSandboxEscalationSystemMessages } from '../shell-primitive/index.js';
32
- import { elanousSelfAccessPrompt, elanousSelfAmbientParts } from '../agent/self-ambient.js';
33
+ import { elanousSelfAccessPrompt, investigationRecallAmbient } from '../agent/self-ambient.js';
34
+ import { sessionMemoryLayer, sessionSelfAmbientParts } from './turn-session-layers.js';
33
35
  import { localRefGroundingAmbient } from '../agent/ref-grounding.js';
34
36
  import {
35
37
  globalTaskNotificationQueue,
@@ -66,9 +68,14 @@ export interface DashboardTurnPreambleContext {
66
68
  * one-liner directives (e.g. AskUserQuestion → use for tool-deny
67
69
  * clarification). Pass `tools.map(t => t.name)` from the caller. */
68
70
  enabledTools?: readonly string[];
71
+ /** 🪪 L1 자리 부트 카드를 싣나(`seat-boot-preamble.ts`). 대화형 TUI 호출부만 켠다 — 기본 꺼짐이라
72
+ * 다른 호출부·시험은 셸의 `COORD_ID` 에 따라 출력이 갈리지 않는다. */
73
+ seatBoot?: boolean | SeatBootDeps;
69
74
  /** Explicit controller provenance for tests and embedded callers. When
70
75
  * omitted, the controller environment is used. */
71
76
  controlEnv?: { controller?: string; channels?: string };
77
+ /** File-memory layer seam: a store root and env for scope resolution (tests), or false to omit it. */
78
+ memory?: { root?: string; env?: NodeJS.ProcessEnv } | false;
72
79
  }
73
80
 
74
81
  export function buildControllerSystemMessage(controller: string, channels?: string): LLMMessage {
@@ -91,10 +98,22 @@ export function buildDashboardTurnPreamble(
91
98
  ...(ctx.modelFamily !== undefined ? { modelFamily: ctx.modelFamily } : {}),
92
99
  ...(ctx.enabledTools !== undefined ? { enabledTools: ctx.enabledTools } : {}),
93
100
  });
101
+ // 🪪 L1 — 자리 부트 카드(세션마다 한 번 만든 스냅샷). 정체성(앵커) 바로 뒤. 자리가 아니면 [].
102
+ const seatBootSystemMsgs = ctx.seatBoot
103
+ ? buildSeatBootSystemMessages(
104
+ { cwd: ctx.cwd, ...(ctx.sessionId !== undefined ? { sessionId: ctx.sessionId } : {}) },
105
+ ctx.seatBoot === true ? {} : ctx.seatBoot,
106
+ )
107
+ : [];
94
108
  const planModeSystemMsgs = buildPlanModeSystemMessages();
95
109
  const askSystemMsgs = buildExecutionAskSystemMessages() as LLMMessage[];
96
110
  const approvalSystemMsgs = buildApprovalPolicySystemMessages() as LLMMessage[];
97
111
  const sandboxSystemMsgs = buildSandboxEscalationSystemMessages() as LLMMessage[];
112
+ // Session-scoped (built once, rebuilt on change) — see turn-session-layers.ts.
113
+ const sessionKey = ctx.sessionId ?? 'tui';
114
+ const memorySystemMsgs = ctx.memory === false
115
+ ? []
116
+ : sessionMemoryLayer({ sessionKey, cwd: ctx.cwd, ...(ctx.memory ?? {}) });
98
117
  const gitSnapshotSystemMsgs = buildSessionRuntimeSystemMessages({
99
118
  cwd: ctx.cwd,
100
119
  });
@@ -137,7 +156,12 @@ export function buildDashboardTurnPreamble(
137
156
  // 성립한다. fail-soft: ambient 조회 실패가 턴을 막지 않는다.
138
157
  let selfOpsSystemMsgs: LLMMessage[] = [];
139
158
  try {
140
- selfOpsSystemMsgs = [elanousSelfAccessPrompt(ctx.sessionId), ...elanousSelfAmbientParts(ctx.userText), localRefGroundingAmbient(ctx.userText)]
159
+ selfOpsSystemMsgs = [
160
+ elanousSelfAccessPrompt(ctx.sessionId),
161
+ ...sessionSelfAmbientParts(sessionKey),
162
+ investigationRecallAmbient(ctx.userText),
163
+ localRefGroundingAmbient(ctx.userText),
164
+ ]
141
165
  .filter(Boolean)
142
166
  .map((content): LLMMessage => ({ role: 'system', content }));
143
167
  } catch { /* fail-soft */ }
@@ -150,10 +174,12 @@ export function buildDashboardTurnPreamble(
150
174
  : [];
151
175
  const preamble = [
152
176
  ...universalPreamble,
177
+ ...seatBootSystemMsgs,
153
178
  ...planModeSystemMsgs,
154
179
  ...askSystemMsgs,
155
180
  ...approvalSystemMsgs,
156
181
  ...sandboxSystemMsgs,
182
+ ...memorySystemMsgs,
157
183
  ...gitSnapshotSystemMsgs,
158
184
  ...surfaceSystemMsgs,
159
185
  ...selfOpsSystemMsgs,
@@ -190,10 +216,12 @@ export function buildDashboardTurnPreamble(
190
216
  rich: ctx.rich === true,
191
217
  builderCounts: {
192
218
  universal: universalPreamble.length,
219
+ seatBoot: seatBootSystemMsgs.length,
193
220
  planMode: planModeSystemMsgs.length,
194
221
  ask: askSystemMsgs.length,
195
222
  approval: approvalSystemMsgs.length,
196
223
  sandbox: sandboxSystemMsgs.length,
224
+ memory: memorySystemMsgs.length,
197
225
  gitSnapshot: gitSnapshotSystemMsgs.length,
198
226
  surface: surfaceSystemMsgs.length,
199
227
  selfOps: selfOpsSystemMsgs.length,
@@ -0,0 +1,176 @@
1
+ // TUI-SEAT-MEMORY-SCOPE (RFC-tui-self-awareness L2 ①③) — the TUI turn preamble's session layers.
2
+ //
3
+ // ① File memory: until now only chat.ts (telegram · discord · repl · a2a) injected buildMemoryInjection;
4
+ // the TUI preamble had no memory layer at all. Here it does, scoped to global ⊕ this seat/project:
5
+ // a context card tagged with another seat (or another project) is left out — index line included.
6
+ // ③ Injection cadence: the preamble is rebuilt every turn, but these layers are not. They are built once
7
+ // per session and rebuilt only when their source changed (file signature for memory, a short TTL
8
+ // plus content hash for self ambient). Unchanged layers come back byte-identical, which keeps the
9
+ // provider's prompt-cache prefix and skips the per-turn store reads.
10
+ //
11
+ // Both layers are fail-soft: an error drops the layer (observed), it never blocks the turn.
12
+
13
+ import { createHash } from 'node:crypto';
14
+ import { readdirSync, statSync } from 'node:fs';
15
+ import { join } from 'node:path';
16
+ import type { LLMMessage } from '../llm.js';
17
+ import { debug } from '../debug/log.js';
18
+ import { buildMemoryInjection, memoryRoot, type MemoryEntry } from '../memory.js';
19
+ import { elanousSelfAmbientParts } from '../agent/self-ambient.js';
20
+
21
+ /** Token budget for the TUI memory layer — the same default chat.ts gives buildMemoryInjection. */
22
+ export const TUI_MEMORY_BUDGET_TOKENS = 1500;
23
+ /** How long cached self ambient is trusted before the stores are read again. */
24
+ export const SELF_AMBIENT_TTL_MS = 60_000;
25
+ /** Sessions remembered per cache; the least recently used one is dropped beyond this. */
26
+ export const SESSION_LAYER_CACHE_MAX = 32;
27
+
28
+ export interface MemoryScope {
29
+ seat?: string;
30
+ project?: string;
31
+ }
32
+
33
+ /** This session's seat: `/seats/<seat>` in the cwd first, then COORD_ID. Project comes only from
34
+ * ELANOUS_PROJECT — a path guess would silently drop cards whose project string does not match it. */
35
+ export function resolveMemoryScope(cwd: string, env: NodeJS.ProcessEnv = process.env): MemoryScope {
36
+ const fromCwd = /(?:^|\/)seats\/([^/]+)/.exec(cwd)?.[1]?.trim();
37
+ const seat = fromCwd || env.COORD_ID?.trim() || undefined;
38
+ const project = env.ELANOUS_PROJECT?.trim() || undefined;
39
+ return { ...(seat ? { seat } : {}), ...(project ? { project } : {}) };
40
+ }
41
+
42
+ const same = (a: string, b: string): boolean => a.trim().toLowerCase() === b.trim().toLowerCase();
43
+
44
+ /** Global memories (no context card, or a card with an empty seat) stay. A card tagged with a seat
45
+ * stays only for that seat; a card tagged with a project is dropped only when the scope names another one. */
46
+ export function memoryInScope(entry: MemoryEntry, scope: MemoryScope): boolean {
47
+ const card = entry.contextCard;
48
+ if (!card) return true;
49
+ if (card.seat.trim() && !(scope.seat && same(card.seat, scope.seat))) return false;
50
+ if (card.project.trim() && scope.project && !same(card.project, scope.project)) return false;
51
+ return true;
52
+ }
53
+
54
+ /** This seat's own cards are injected in full, like pinned memories. */
55
+ export function isSeatCard(entry: MemoryEntry, scope: MemoryScope): boolean {
56
+ const seat = entry.contextCard?.seat.trim();
57
+ return Boolean(seat && scope.seat && same(seat, scope.seat));
58
+ }
59
+
60
+ /** Cheap change signal for the file store: names, sizes and mtimes of its markdown files. */
61
+ export function memoryStoreSignature(root: string): string {
62
+ let names: string[];
63
+ try { names = readdirSync(root).filter(name => name.endsWith('.md')).sort(); }
64
+ catch { return 'missing'; }
65
+ const hash = createHash('sha256');
66
+ for (const name of names) {
67
+ try {
68
+ const st = statSync(join(root, name));
69
+ hash.update(`${name}\0${st.size}\0${st.mtimeMs}\n`);
70
+ } catch { hash.update(`${name}\0gone\n`); }
71
+ }
72
+ return hash.digest('hex').slice(0, 16);
73
+ }
74
+
75
+ const contentHash = (text: string): string => createHash('sha256').update(text).digest('hex').slice(0, 16);
76
+
77
+ interface MemoryCacheEntry { key: string; messages: LLMMessage[]; hash: string }
78
+ interface AmbientCacheEntry { parts: string[]; hash: string; at: number }
79
+
80
+ const memoryCache = new Map<string, MemoryCacheEntry>();
81
+ const ambientCache = new Map<string, AmbientCacheEntry>();
82
+
83
+ /** Map insertion order doubles as recency: re-insert on use, drop the oldest beyond the cap. */
84
+ function remember<V>(cache: Map<string, V>, key: string, value: V): void {
85
+ cache.delete(key);
86
+ cache.set(key, value);
87
+ while (cache.size > SESSION_LAYER_CACHE_MAX) cache.delete(cache.keys().next().value as string);
88
+ }
89
+
90
+ /** Test seam — forget every session's cached layers. */
91
+ export function resetTurnSessionLayers(): void {
92
+ memoryCache.clear();
93
+ ambientCache.clear();
94
+ }
95
+
96
+ export interface SessionMemoryLayerOpts {
97
+ sessionKey: string;
98
+ cwd: string;
99
+ root?: string;
100
+ env?: NodeJS.ProcessEnv;
101
+ maxTokens?: number;
102
+ }
103
+
104
+ /** The file-memory system message for this session. Rebuilt only when the store or the scope changed. */
105
+ export function sessionMemoryLayer(opts: SessionMemoryLayerOpts): LLMMessage[] {
106
+ try {
107
+ const root = opts.root ?? memoryRoot();
108
+ const scope = resolveMemoryScope(opts.cwd, opts.env);
109
+ const maxTokens = opts.maxTokens ?? TUI_MEMORY_BUDGET_TOKENS;
110
+ const key = JSON.stringify([root, scope.seat ?? '', scope.project ?? '', maxTokens, memoryStoreSignature(root)]);
111
+ const cached = memoryCache.get(opts.sessionKey);
112
+ if (cached && cached.key === key) {
113
+ remember(memoryCache, opts.sessionKey, cached);
114
+ debug.log('chat.memory-layer', 'reused', { session: opts.sessionKey, seat: scope.seat ?? null, hash: cached.hash });
115
+ return cached.messages;
116
+ }
117
+ // Empty user text on purpose: keyword hits would change with every prompt and break the cached prefix.
118
+ // Per-prompt recall is the memory_recall tool's job (it is on every TUI route).
119
+ const inj = buildMemoryInjection('', {
120
+ maxTokens,
121
+ filter: entry => memoryInScope(entry, scope),
122
+ alwaysInject: entry => isSeatCard(entry, scope),
123
+ }, root);
124
+ const messages: LLMMessage[] = inj.block ? [{ role: 'system', content: inj.block }] : [];
125
+ const hash = contentHash(inj.block);
126
+ debug.log('chat.memory-layer', cached ? 'changed' : 'built', {
127
+ session: opts.sessionKey, seat: scope.seat ?? null, project: scope.project ?? null,
128
+ injected: inj.injectedIds.length, tokens: inj.tokens, hash,
129
+ ...(cached ? { previousHash: cached.hash, sameContent: cached.hash === hash } : {}),
130
+ });
131
+ // Same content (e.g. an unrelated file touched) keeps the previous array — byte-identical prefix.
132
+ const kept = cached && cached.hash === hash ? cached.messages : messages;
133
+ remember(memoryCache, opts.sessionKey, { key, hash, messages: kept });
134
+ return kept;
135
+ } catch (error) {
136
+ // The layer is dropped for this turn and rebuilt on the next one.
137
+ memoryCache.delete(opts.sessionKey);
138
+ debug.log('chat.memory-layer', 'failed', { session: opts.sessionKey, error: String(error) });
139
+ return [];
140
+ }
141
+ }
142
+
143
+ export interface SessionSelfAmbientOpts {
144
+ now?: number;
145
+ ttlMs?: number;
146
+ build?: () => string[];
147
+ }
148
+
149
+ /** The task-independent self ambient (recent changes · autonomy · ops health · mission incident),
150
+ * read at most once per TTL per session. The task-dependent investigation recall stays per turn. */
151
+ export function sessionSelfAmbientParts(sessionKey: string, opts: SessionSelfAmbientOpts = {}): string[] {
152
+ const now = opts.now ?? Date.now();
153
+ const ttl = opts.ttlMs ?? SELF_AMBIENT_TTL_MS;
154
+ const cached = ambientCache.get(sessionKey);
155
+ if (cached && now - cached.at < ttl) {
156
+ remember(ambientCache, sessionKey, cached);
157
+ return cached.parts;
158
+ }
159
+ try {
160
+ const parts = (opts.build ?? (() => elanousSelfAmbientParts()))();
161
+ const hash = contentHash(parts.join('\0'));
162
+ if (cached && cached.hash === hash) {
163
+ remember(ambientCache, sessionKey, { ...cached, at: now });
164
+ debug.log('chat.self-ambient', 'unchanged', { session: sessionKey, hash });
165
+ return cached.parts;
166
+ }
167
+ remember(ambientCache, sessionKey, { parts, hash, at: now });
168
+ debug.log('chat.self-ambient', cached ? 'changed' : 'built', { session: sessionKey, parts: parts.length, hash });
169
+ return parts;
170
+ } catch (error) {
171
+ // Fail-soft means the layer is left out, not replayed stale; the next turn reads again.
172
+ ambientCache.delete(sessionKey);
173
+ debug.log('chat.self-ambient', 'failed', { session: sessionKey, error: String(error) });
174
+ return [];
175
+ }
176
+ }
@@ -166,6 +166,12 @@ export interface TurnStreamFormatter {
166
166
  export function createTurnStreamFormatter(
167
167
  deps: TurnStreamFormatterDeps,
168
168
  ): TurnStreamFormatter {
169
+ const groupingKind = (name: string, args: Record<string, unknown>): string | undefined => {
170
+ const kind = toolOperationKind(name, args);
171
+ return deps.foldMode === 'kind-unit' || (deps.foldMode === 'task-unit' && kind === 'RunShell')
172
+ ? kind
173
+ : undefined;
174
+ };
169
175
  // Per-tool-round 누적기. cross-turn 에서 이전 round 의 텍스트를
170
176
  // 가져오지 않음. clear-and-commit (onText('', '')) 또는 tool call
171
177
  // 발생 시 reset.
@@ -278,8 +284,8 @@ export function createTurnStreamFormatter(
278
284
  callId: call.id,
279
285
  lines: rendered,
280
286
  args: call.args,
281
- ...(deps.foldMode === 'kind-unit'
282
- ? { operationKind: toolOperationKind(call.name, call.args) }
287
+ ...(groupingKind(call.name, call.args)
288
+ ? { operationKind: groupingKind(call.name, call.args) }
283
289
  : {}),
284
290
  });
285
291
  closeRound();
@@ -293,8 +299,8 @@ export function createTurnStreamFormatter(
293
299
  callId: call.id,
294
300
  lines: [deps.muted(`${deps.brainIcon} tool: ${call.name} — running`)],
295
301
  args: call.args,
296
- ...(deps.foldMode === 'kind-unit'
297
- ? { operationKind: toolOperationKind(call.name, call.args) }
302
+ ...(groupingKind(call.name, call.args)
303
+ ? { operationKind: groupingKind(call.name, call.args) }
298
304
  : {}),
299
305
  });
300
306
  debug.log('dashboard.chat.generic-tool', 'formatter.genericCall', { toolName: call.name });
@@ -331,8 +337,10 @@ export function createTurnStreamFormatter(
331
337
  callId: call.id,
332
338
  collapsedLines: variants.collapsed,
333
339
  expandedLines: variants.expanded,
334
- ...(deps.foldMode === 'kind-unit'
335
- ? { operationKind: ('operationKind' in variants ? variants.operationKind : undefined) ?? toolOperationKind(call.name, args) }
340
+ ...(groupingKind(call.name, args)
341
+ ? { operationKind: deps.foldMode === 'task-unit'
342
+ ? 'RunShell'
343
+ : ('operationKind' in variants ? variants.operationKind : undefined) ?? toolOperationKind(call.name, args) }
336
344
  : {}),
337
345
  });
338
346
  toolArgsByCallId.delete(call.id);
@@ -99,6 +99,13 @@ export function createTurnStreamPresentationApplier(
99
99
  switch (event.type) {
100
100
  case 'assistant.replaceBlock': {
101
101
  const beforeLen = deps.chatLines.length;
102
+ if (assistantStart > deps.chatLines.length) {
103
+ debug.log('dashboard.chat.stream', 'presentation.assistant-start-clamped', {
104
+ assistantStart,
105
+ chatLinesLen: deps.chatLines.length,
106
+ });
107
+ assistantStart = deps.chatLines.length;
108
+ }
102
109
  deps.chatLines.length = assistantStart;
103
110
  deps.chatLines.push(...event.lines);
104
111
  logEvent('assistant.replaceBlock', {
@@ -158,6 +165,7 @@ export function createTurnStreamPresentationApplier(
158
165
  event.expandedLines,
159
166
  event.operationKind ? { operationKind: event.operationKind } : undefined,
160
167
  );
168
+ assistantStart = Math.min(assistantStart, deps.chatLines.length);
161
169
  deps.renderedToolRuntime.deleteArgs(event.callId);
162
170
  logEvent('tool.replaceBlock', {
163
171
  callId: event.callId,
@@ -21,7 +21,7 @@ export const RELEASE_STATUS_SPEC: LLMToolSpec = {
21
21
  + 'topic=cell: id 칸 하나의 상태·근거와 살핀 판.\n'
22
22
  + 'topic=schedule: 발행 이후 판의 컷·착지·발행·동결 일정.\n'
23
23
  + 'topic=ops: 도는 런·발행·늦은 스케줄·자리·열린 결정의 출처 있는 개관.\n'
24
- + 'topic 과 action 을 동시에 쓰면 topic 을 우선하고 action 은 무시한다. topic 은 읽을 대상, action 은 단독 조회의 짧은 요약.\n'
24
+ + 'topic 과 action 을 동시에 쓰면 오류를 돌려받는다 — 둘 중 하나만 보낸다. topic 은 읽을 대상, action 은 단독 조회의 짧은 요약.\n'
25
25
  + 'topic=features 에서는 owner·status 로 칸을 필터링할 수 있다.\n'
26
26
  + '발행·버전·피처·체크리스트·칸·컷·일정·운영 상태 질문은 Grep·ListDir·파일 검색보다 이 도구를 먼저 부른다 — 그 답은 파일이 아니라 원장에 있다.',
27
27
  parameters: { type: 'object', properties: {
@@ -125,10 +125,9 @@ function cellView(item: ChecklistItem) {
125
125
  export function dispatchReleaseStatus(args: Record<string, unknown>, deps: ReleaseToolDeps = {}): { text: string; structured: Record<string, unknown> } {
126
126
  const topic = args.topic === undefined ? 'status' : args.topic;
127
127
  if (typeof topic !== 'string' || !['status', 'features', 'cell', 'schedule', 'ops'].includes(topic)) throw new Error('topic 은 status, features, cell, schedule, ops 중 하나');
128
- const ignoredAction = args.topic !== undefined && args.action !== undefined ? args.action : undefined;
129
- const withIgnoredAction = (result: { text: string; structured: Record<string, unknown> }) => ignoredAction === undefined
130
- ? result
131
- : { ...result, text: `action=${String(ignoredAction)} 은 무시됨 — topic 과 같이 못 쓴다\n${result.text}` };
128
+ if (args.topic !== undefined && args.action !== undefined) {
129
+ throw new Error('topic 과 action 을 동시에 쓸 수 없습니다 — 둘 중 하나만: topic=features 는 피처 목록 · action 은 짧은 요약');
130
+ }
132
131
  const requested = args.version;
133
132
  if (topic === 'features') {
134
133
  for (const key of ['owner', 'status'] as const) {
@@ -149,10 +148,10 @@ export function dispatchReleaseStatus(args: Record<string, unknown>, deps: Relea
149
148
  const kinds: ContextFact['kind'][] = ['run', 'release', 'schedule-late', 'seat', 'decision'];
150
149
  const facts = answer.facts.filter(fact => kinds.includes(fact.kind));
151
150
  debug.log('release.tool', 'status', { action: 'status', topic, version: requested ?? null });
152
- return withIgnoredAction({ text: facts.length ? facts.map(fact => JSON.stringify(fact)).join('\n') : '운영 개관: 관측된 사실 없음', structured: { facts } });
151
+ return { text: facts.length ? facts.map(fact => JSON.stringify(fact)).join('\n') : '운영 개관: 관측된 사실 없음', structured: { facts } };
153
152
  }
154
153
  const dev = checklistDevVersion(deps.devVersion?.() ?? devVersion());
155
- if (ignoredAction === undefined && args.action !== undefined) {
154
+ if (args.action !== undefined) {
156
155
  const action = args.action;
157
156
  if (typeof action !== 'string' || !['schedule', 'blocked', 'landed'].includes(action)) {
158
157
  throw new Error('action 은 schedule, blocked, landed 중 하나여야 합니다');
@@ -225,7 +224,7 @@ export function dispatchReleaseStatus(args: Record<string, unknown>, deps: Relea
225
224
  publishAt: row.publishAt ?? null, freezeFrom: row.freezeFrom ?? null, freezeUntil: row.freezeUntil ?? null })) } };
226
225
  }
227
226
  debug.log('release.tool', 'status', { action: 'status', topic, version: requested ?? dev });
228
- return withIgnoredAction(result);
227
+ return result;
229
228
  }
230
229
  const version = requested ? null : dev;
231
230
  const versions = requested ? [requested as string] : [version!, nextVersion(version!)];
@@ -270,7 +269,7 @@ export function dispatchReleaseStatus(args: Record<string, unknown>, deps: Relea
270
269
  : published.state === 'unreadable' ? `발행 판 ${published.version} · 발행 기록 못 읽음` : '발행 판 모름';
271
270
  const structured = { releases: entries, latestRun: latest, published };
272
271
  debug.log('release.tool', 'status', { action: 'status', topic, version: versions.join(',') });
273
- return withIgnoredAction({ text: `${lines.join('\n\n')}\n${cards.map(formatElanousCard).join('\n')}\n${publishedLine}`, structured });
272
+ return { text: `${lines.join('\n\n')}\n${cards.map(formatElanousCard).join('\n')}\n${publishedLine}`, structured };
274
273
  }
275
274
 
276
275
  function requiredString(args: Record<string, unknown>, key: string): string {
@@ -146,7 +146,10 @@ export function recordInboundTurn(
146
146
  ): string | null {
147
147
  const q = (opts.userText ?? '').trim();
148
148
  if (!q) return null;
149
- const db = opts.db ?? openSurfaceEventsDb();
149
+ // Test runners must never fall through to the user's production memory DB.
150
+ const testRunner = process.env.NODE_ENV === 'test' || process.env.BUN_TEST !== undefined;
151
+ const isolatedTestPath = process.env.ELANOUS_STATE_DIR?.trim() ? surfaceEventsDbPath() : ':memory:';
152
+ const db = opts.db ?? openSurfaceEventsDb(testRunner ? isolatedTestPath : surfaceEventsDbPath());
150
153
  const ownDb = !opts.db;
151
154
  try {
152
155
  const a = (opts.responseText ?? '').trim();
@@ -50,8 +50,13 @@ export function startWatchDefaultScheduler(opts: WatchDefaultSchedulerOpts = {})
50
50
  running = true;
51
51
  try {
52
52
  const active = enabled() && listSources({ seat: 'user' }, root).length > 0;
53
- const registryDay = now().toISOString().slice(0, 10);
54
- const inventoryKey = `${registryDay}:${active}`;
53
+ const parts = new Intl.DateTimeFormat('en-CA', {
54
+ timeZone, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hourCycle: 'h23',
55
+ }).formatToParts(now());
56
+ const part = (type: string) => parts.find((entry) => entry.type === type)?.value ?? '';
57
+ const day = `${part('year')}-${part('month')}-${part('day')}`;
58
+ const clock = `${part('hour')}:${part('minute')}`;
59
+ const inventoryKey = `${day}:${active}`;
55
60
  if (lastInventory !== inventoryKey) {
56
61
  // The registry row is a view; a registry failure must not skip the real collect/brief of this minute.
57
62
  try {
@@ -62,14 +67,8 @@ export function startWatchDefaultScheduler(opts: WatchDefaultSchedulerOpts = {})
62
67
  }
63
68
  lastFailure = undefined;
64
69
  if (!active) return;
65
- const parts = new Intl.DateTimeFormat('en-CA', {
66
- timeZone, year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', hourCycle: 'h23',
67
- }).formatToParts(now());
68
- const part = (type: string) => parts.find((entry) => entry.type === type)?.value ?? '';
69
- const day = `${part('year')}-${part('month')}-${part('day')}`;
70
- const clock = `${part('hour')}:${part('minute')}`;
71
70
  for (const [job, at, fire] of [['watch-collect', '07:00', collect], ['watch-brief', '08:30', brief]] as const) {
72
- if (clock !== at || lastRun.get(job) === day) continue;
71
+ if (clock < at || lastRun.get(job) === day) continue;
73
72
  try {
74
73
  const outcome = await fire();
75
74
  if (job === 'watch-brief' && (!outcome || (outcome as { sent?: boolean }).sent !== true)) continue;
package/src/fold-stack.ts CHANGED
@@ -70,6 +70,9 @@ export interface StaticFoldTarget {
70
70
  groupKey?: string;
71
71
  /** Fold mode shared with fold-applied. FoldStack does not invent this. */
72
72
  mode?: string;
73
+ /** Offset (from lineStart) of the click that expanded this target —
74
+ * clicking the same row again collapses it (#16 two-way click). */
75
+ expandedAtOffset?: number;
73
76
  }
74
77
 
75
78
  export type FoldTarget = LiveFoldTarget | StaticFoldTarget;
@@ -178,6 +181,7 @@ export class FoldStack {
178
181
 
179
182
  this.opts.chatLines.splice(t.lineStart, oldLen, ...newLines);
180
183
  t.expanded = nextExpanded;
184
+ t.expandedAtOffset = undefined;
181
185
  t.lineEnd = t.lineStart + newLines.length;
182
186
 
183
187
  // Any OTHER static target whose lineStart is ≥ the toggled
@@ -224,6 +228,7 @@ export class FoldStack {
224
228
  const lineStart = t.lineStart;
225
229
  const lineEnd = t.lineEnd;
226
230
  const toggled = this.toggleTarget(t);
231
+ if (toggled) t.expandedAtOffset = t.expanded ? lineIndex - lineStart : undefined;
227
232
  if (toggled) {
228
233
  debug.log('log.fold', t.expanded ? 'fold-expanded' : 'fold-recollapsed', {
229
234
  mode: t.mode ?? null,
@@ -259,6 +264,16 @@ export class FoldStack {
259
264
  return t != null && t.expanded && t.lineStart === lineIndex;
260
265
  }
261
266
 
267
+ /** Fact for callers: may a click on `lineIndex` collapse its expanded
268
+ * target? True on the first line, the last line, and the row whose
269
+ * click expanded it — the rest of the body stays a reading area. */
270
+ isExpandedCollapseLine(lineIndex: number): boolean {
271
+ const t = this.findLatestStaticContaining(lineIndex);
272
+ if (t == null || !t.expanded) return false;
273
+ const offset = lineIndex - t.lineStart;
274
+ return offset === 0 || lineIndex === t.lineEnd - 1 || offset === t.expandedAtOffset;
275
+ }
276
+
262
277
  /** Toggle every static target on the stack in the same direction.
263
278
  * If ≥ half are already expanded we collapse all; otherwise we
264
279
  * expand all. Returns the number of targets that actually changed
@@ -273,7 +288,14 @@ export class FoldStack {
273
288
  const statics = this.targets.filter((t): t is StaticFoldTarget => t.kind === 'static');
274
289
  if (statics.length === 0) return 0;
275
290
  const expandedCount = statics.filter(t => t.expanded).length;
276
- const targetExpanded = expandedCount * 2 < statics.length; // <50% → expand all
291
+ return this.setAll(expandedCount * 2 < statics.length); // <50% → expand all
292
+ }
293
+
294
+ /** Put every static target in one explicit state (`/log unfold all` ·
295
+ * `/log fold all`). Returns how many targets changed; live targets are
296
+ * skipped exactly as in toggleAll. */
297
+ setAll(targetExpanded: boolean): number {
298
+ const statics = this.targets.filter((t): t is StaticFoldTarget => t.kind === 'static');
277
299
  // Sort by lineStart ascending; toggling from the top of chatLines
278
300
  // down means later targets shift consistently as we go. Skip
279
301
  // targets already in the desired state.
@@ -287,6 +309,7 @@ export class FoldStack {
287
309
  const delta = newLines.length - oldLen;
288
310
  this.opts.chatLines.splice(t.lineStart, oldLen, ...newLines);
289
311
  t.expanded = targetExpanded;
312
+ t.expandedAtOffset = undefined;
290
313
  t.lineEnd = t.lineStart + newLines.length;
291
314
  if (delta !== 0) {
292
315
  for (const other of this.targets) {
@@ -5,10 +5,11 @@
5
5
  // kernel has to stat every tracked file vs its index entry.
6
6
  //
7
7
  // Throttle is enforced by the caller (the index.ts cache). This
8
- // module just does one probe, synchronously (spawnSync), and is
9
- // intentionally side-effect free.
8
+ // module just does one probe and is intentionally side-effect free.
9
+ // The sync probes serve one-shot callers; the TUI's periodic refresh
10
+ // uses the async twins so `git status` never blocks its event loop.
10
11
 
11
- import { spawnSync } from 'node:child_process';
12
+ import { execFile, spawnSync } from 'node:child_process';
12
13
  import type { DirtyCount, AheadBehind } from './types.js';
13
14
  import { CLEAN_DIRTY } from './types.js';
14
15
 
@@ -26,6 +27,23 @@ export function probeDirty(cwd: string, timeoutMs = 5_000): DirtyCount {
26
27
  return parsePorcelain(res.stdout);
27
28
  }
28
29
 
30
+ /** Run git without blocking the caller's event loop; null on failure. */
31
+ function execGit(cwd: string, args: string[], timeoutMs: number, maxBuffer: number): Promise<string | null> {
32
+ return new Promise((resolveOut) => {
33
+ try {
34
+ execFile('git', args, { cwd, encoding: 'utf8', timeout: timeoutMs, maxBuffer }, (error, stdout) => {
35
+ resolveOut(error ? null : String(stdout ?? ''));
36
+ });
37
+ } catch { resolveOut(null); }
38
+ });
39
+ }
40
+
41
+ /** Async twin of `probeDirty`. */
42
+ export async function probeDirtyAsync(cwd: string, timeoutMs = 5_000): Promise<DirtyCount> {
43
+ const out = await execGit(cwd, ['status', '--porcelain'], timeoutMs, 2 * 1024 * 1024);
44
+ return out === null ? CLEAN_DIRTY : parsePorcelain(out);
45
+ }
46
+
29
47
  /** Parse porcelain v1 output. Format per line:
30
48
  *
31
49
  * XY <path> — regular change
@@ -66,7 +84,17 @@ export function probeAheadBehind(cwd: string, timeoutMs = 5_000): AheadBehind |
66
84
  { cwd, encoding: 'utf8', timeout: timeoutMs, maxBuffer: 64 * 1024 },
67
85
  );
68
86
  if (res.status !== 0 || res.error) return null;
69
- const parts = res.stdout.trim().split(/\s+/);
87
+ return parseAheadBehind(res.stdout);
88
+ }
89
+
90
+ /** Async twin of `probeAheadBehind`. */
91
+ export async function probeAheadBehindAsync(cwd: string, timeoutMs = 5_000): Promise<AheadBehind | null> {
92
+ const out = await execGit(cwd, ['rev-list', '--left-right', '--count', '@{u}...HEAD'], timeoutMs, 64 * 1024);
93
+ return out === null ? null : parseAheadBehind(out);
94
+ }
95
+
96
+ function parseAheadBehind(out: string): AheadBehind | null {
97
+ const parts = out.trim().split(/\s+/);
70
98
  if (parts.length < 2) return null;
71
99
  const behind = Number.parseInt(parts[0]!, 10);
72
100
  const ahead = Number.parseInt(parts[1]!, 10);
@@ -13,7 +13,7 @@ import { spawnSync } from 'node:child_process';
13
13
  import { findGitDir, type LocatedGit } from './locate.js';
14
14
  import { readGitHead } from './read-head.js';
15
15
  import { GitFileWatcher } from './watcher.js';
16
- import { probeDirty, probeAheadBehind } from './dirty.js';
16
+ import { probeDirty, probeAheadBehind, probeDirtyAsync, probeAheadBehindAsync } from './dirty.js';
17
17
  import { debug } from '../debug/log.js';
18
18
  import type {
19
19
  GitHeadInfo,
@@ -170,6 +170,47 @@ export function refreshDirty(
170
170
  };
171
171
  }
172
172
 
173
+ const dirtyInFlight = new Map<CacheEntry, Promise<GitStatusView>>();
174
+
175
+ function viewOf(entry: CacheEntry): GitStatusView {
176
+ return { head: entry.head, dirty: entry.dirty, aheadBehind: entry.aheadBehind, lastDirtyProbeAt: entry.lastDirtyProbeAt };
177
+ }
178
+
179
+ /** Non-blocking twin of `refreshDirty` for the TUI: the probes run as
180
+ * async subprocesses so a slow `git status` (large worktree, loaded
181
+ * host) never stalls key input. Same throttle; concurrent calls share
182
+ * one probe, except that `force` (a known write just happened) never
183
+ * reuses a probe that started before it. */
184
+ export function refreshDirtyAsync(
185
+ cwd: string,
186
+ opts: { minIntervalMs?: number; force?: boolean } = {},
187
+ ): Promise<GitStatusView> {
188
+ let entry: CacheEntry | null;
189
+ try { entry = ensureEntry(cwd); } catch (error) { return Promise.reject(error); }
190
+ if (!entry) return Promise.resolve({ head: null, dirty: null, aheadBehind: null, lastDirtyProbeAt: 0 });
191
+ // An in-flight probe (possibly a forced, post-write one) is newer than the last stored view.
192
+ const running = dirtyInFlight.get(entry);
193
+ if (running && !opts.force) return running;
194
+ const min = opts.minIntervalMs ?? 2_000;
195
+ if (!opts.force && entry.lastDirtyProbeAt > 0 && Date.now() - entry.lastDirtyProbeAt < min) {
196
+ return Promise.resolve(viewOf(entry));
197
+ }
198
+ const target = entry;
199
+ const root = target.located.root;
200
+ const start = (): Promise<GitStatusView> => Promise.all([probeDirtyAsync(root), probeAheadBehindAsync(root)])
201
+ .then(([dirty, aheadBehind]) => {
202
+ target.dirty = dirty;
203
+ target.aheadBehind = aheadBehind;
204
+ target.lastDirtyProbeAt = Date.now();
205
+ return viewOf(target);
206
+ });
207
+ // A forced probe queues behind the running one so it reads the post-write tree.
208
+ const probe = (running ? running.then(start, start) : start())
209
+ .finally(() => { if (dirtyInFlight.get(target) === probe) dirtyInFlight.delete(target); });
210
+ dirtyInFlight.set(target, probe);
211
+ return probe;
212
+ }
213
+
173
214
  /** Claude Code-style git snapshot for LLM system context.
174
215
  * This is intentionally a point-in-time summary: good enough for
175
216
  * baseline repo awareness, but callers should still use tools for
@@ -256,4 +297,5 @@ export function __resetGitFsCache(): void {
256
297
  for (const [, entry] of cache) entry.watcher.dispose();
257
298
  cache.clear();
258
299
  clearGitSnapshotCache();
300
+ dirtyInFlight.clear();
259
301
  }
@@ -53,6 +53,7 @@ const RELEASE_NODE_COMMANDS: Readonly<Record<string, { recipe: string; command?:
53
53
  'release-story': { recipe: 'cmd:release-story', command: 'bun scripts/release-story/draft.ts --graph' },
54
54
  'ops-upgrade': { recipe: 'cmd:ops-upgrade', command: 'bun scripts/release-loop/ops-upgrade-node.ts' },
55
55
  'version-dev-bump': { recipe: 'cmd:version-dev-bump', command: 'bun scripts/release-loop/version-node.ts dev-bump --json' },
56
+ 'version-dev-bump-after-failure': { recipe: 'cmd:version-dev-bump', command: 'bun scripts/release-loop/version-node.ts dev-bump --json' },
56
57
  done: { recipe: 'none' },
57
58
  failed: { recipe: 'none' },
58
59
  };