elanous 0.2.27 → 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 (700) 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/{Ev2jivDMTSoEc-5rIXdcy → 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-a5635eba0d73b84e.js +1 -0
  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-86feb08080261a2f.js +1 -0
  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-ff27902d0b11ef4f.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-25a302273b054fd7.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-87b88f551f421d8b.js → page-9eb56166774eb256.js} +1 -1
  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/implement-loop.yaml +38 -1
  277. package/graphs/release/release-loop.yaml +6 -2
  278. package/graphs/steward/recipes.yaml +6 -0
  279. package/graphs/steward/release-day.yaml +23 -0
  280. package/graphs/steward/steward.yaml +9 -1
  281. package/graphs/work/code-pr.yaml +23 -0
  282. package/package.json +1 -1
  283. package/plugins/agent-team/agents/research.md +1 -0
  284. package/scripts/browser-observe-cycle.ts +76 -2
  285. package/scripts/ci-typecheck-changed.ts +53 -19
  286. package/scripts/coord-channel-watch.sh +26 -6
  287. package/scripts/coord-role-pack.ts +143 -0
  288. package/scripts/detect-test-interference.ts +31 -1
  289. package/scripts/lib/morning-report-options.ts +41 -0
  290. package/scripts/pr-land-extra-remote-gates.ts +49 -0
  291. package/scripts/release-loop/docs-node.ts +51 -22
  292. package/scripts/release-loop/gate-batch-safe.ts +23 -0
  293. package/scripts/release-loop/gate-history.ts +422 -0
  294. package/scripts/release-loop/gate-node.ts +336 -39
  295. package/scripts/release-loop/gate-triage-node.ts +190 -0
  296. package/scripts/release-loop/node-verdict.ts +3 -1
  297. package/scripts/release-loop/publish-node.ts +3 -0
  298. package/scripts/release-loop/spawn-lane.ts +68 -0
  299. package/scripts/release-loop/tui-node-checks.ts +28 -2
  300. package/scripts/release-loop/version-node.ts +62 -4
  301. package/scripts/skills/public-check.ts +5 -2
  302. package/scripts/test-deterministic.ts +549 -37
  303. package/scripts/usage-rollup.ts +11 -3
  304. package/scripts/ux-sim.ts +7 -1
  305. package/scripts/verify-kpack6-live.ts +230 -0
  306. package/src/acp/codex-plugins.ts +17 -0
  307. package/src/acp/core-turn-bridge.ts +98 -22
  308. package/src/acp/elanous-extensions.ts +2 -0
  309. package/src/acp/server.ts +2 -0
  310. package/src/agent/ref-grounding.ts +18 -0
  311. package/src/agent/task-notification.ts +2 -1
  312. package/src/agent-mission/in-agent-plugin.ts +8 -3
  313. package/src/agent-substrate/pr-reviewer.ts +29 -21
  314. package/src/agent-substrate/self-review-cli.ts +34 -10
  315. package/src/briefing/brief-items.ts +151 -35
  316. package/src/budget/llm-cost.ts +25 -2
  317. package/src/budget/pty-usage-reemit.ts +7 -0
  318. package/src/budget/run-usage-rollup.ts +9 -0
  319. package/src/budget/usage-daily-store.ts +98 -0
  320. package/src/budget/usage-outcomes.ts +32 -0
  321. package/src/capture/tui-self-report.ts +22 -4
  322. package/src/chat/index.ts +31 -10
  323. package/src/chat/pickers/modal-runtime.ts +1 -0
  324. package/src/chat/pickers/modals.ts +3 -1
  325. package/src/chat/turn-typeahead.ts +123 -16
  326. package/src/claims/claims-ledger.ts +23 -0
  327. package/src/claims/claims-render.ts +22 -2
  328. package/src/cli/brief-cli.ts +131 -10
  329. package/src/cli/claims-cli.ts +24 -4
  330. package/src/cli/dashboard-name-flag.ts +48 -0
  331. package/src/cli/doctor-cli.ts +80 -0
  332. package/src/cli/log-event-names.ts +12 -0
  333. package/src/cli/msg-cli.ts +210 -11
  334. package/src/cli/plugin-cli.ts +11 -3
  335. package/src/cli/pr-cli.ts +443 -104
  336. package/src/cli/pr-land-heavy-remote.ts +233 -0
  337. package/src/cli/pr-land-overlap-evidence.ts +104 -5
  338. package/src/cli/pr-land-refusal.ts +20 -0
  339. package/src/cli/pty-takeover-cli.ts +125 -16
  340. package/src/cli/release-cli.ts +46 -2
  341. package/src/cli/remote-resolve.ts +2 -1
  342. package/src/cli/rfc-cli.ts +24 -0
  343. package/src/cli/seat-cli.ts +26 -16
  344. package/src/cli/tailscale-serve.ts +5 -8
  345. package/src/cli/tasks-cli.ts +400 -27
  346. package/src/cli/usage-cli.ts +155 -16
  347. package/src/cli/usage-daily-cli.ts +84 -0
  348. package/src/context-bus/context-now.ts +82 -5
  349. package/src/core-turn/auth-rejected-notice.ts +41 -0
  350. package/src/core-turn/run-core-turn.ts +13 -2
  351. package/src/core-turn/run-goal-loop.ts +17 -1
  352. package/src/core-turn/short-question.ts +45 -12
  353. package/src/core-turn/types.ts +7 -0
  354. package/src/dashboard/acp-active-model.ts +40 -0
  355. package/src/dashboard/auto-compact-runtime.ts +2 -0
  356. package/src/dashboard/boot-banner.ts +80 -0
  357. package/src/dashboard/dashboard-status-lines.ts +11 -0
  358. package/src/dashboard/detail-viewer-runtime.ts +15 -2
  359. package/src/dashboard/event-loop-stall-monitor.ts +4 -0
  360. package/src/dashboard/first-screen-band.ts +63 -13
  361. package/src/dashboard/goal-loop-thinking.ts +16 -0
  362. package/src/dashboard/hitl-boot.ts +9 -4
  363. package/src/dashboard/index.ts +235 -389
  364. package/src/dashboard/input/chat-main-entry-runtime.ts +2 -0
  365. package/src/dashboard/input/chat-main-log-actions.ts +4 -0
  366. package/src/dashboard/input/chat-main-log-command.ts +12 -1
  367. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +172 -3
  368. package/src/dashboard/input/chat-main-session.ts +6 -2
  369. package/src/dashboard/input/chat-main-slash-command.ts +7 -0
  370. package/src/dashboard/input/chat-main-turn.ts +2 -1
  371. package/src/dashboard/input/compact-prepass-recovery.ts +97 -0
  372. package/src/dashboard/input/dashboard-chord-actions.ts +10 -1
  373. package/src/dashboard/input/dashboard-chord-runtime.ts +2 -0
  374. package/src/dashboard/input/external-input-host.ts +45 -0
  375. package/src/dashboard/input/log-fold-binding.ts +18 -0
  376. package/src/dashboard/input/mouse-wiring.ts +17 -4
  377. package/src/dashboard/input/turn-steer-bridge.ts +94 -0
  378. package/src/dashboard/log-click-runtime.ts +5 -3
  379. package/src/dashboard/running-build-status.ts +74 -0
  380. package/src/dashboard/seat-boot-preamble.ts +113 -0
  381. package/src/dashboard/seat-local-instructions.ts +305 -0
  382. package/src/dashboard/skill-detection-runtime.ts +24 -4
  383. package/src/dashboard/slash-runtime/dashboard-handlers.ts +100 -28
  384. package/src/dashboard/slash-runtime/model-choices.ts +35 -0
  385. package/src/dashboard/term-slash-runtime.ts +15 -0
  386. package/src/dashboard/turn-preamble.ts +30 -2
  387. package/src/dashboard/turn-session-layers.ts +176 -0
  388. package/src/dashboard/turn-stream-formatter.ts +14 -6
  389. package/src/dashboard/turn-stream-presentation-applier.ts +8 -0
  390. package/src/domains/morning-report.ts +3 -1
  391. package/src/domains/release-tool.ts +8 -9
  392. package/src/domains/surface-events.ts +4 -1
  393. package/src/domains/watch-default-scheduler.ts +8 -9
  394. package/src/fold-stack.ts +24 -1
  395. package/src/git-fs/dirty.ts +32 -4
  396. package/src/git-fs/index.ts +43 -1
  397. package/src/github/pr-labels.ts +10 -4
  398. package/src/graph-runner/runner.ts +102 -14
  399. package/src/harness/harness-clean.ts +21 -3
  400. package/src/harness/harness-cli-command.ts +22 -6
  401. package/src/harness/harness-gc.ts +32 -5
  402. package/src/harness/harness-pod-dispatch.ts +11 -4
  403. package/src/hq/seats.ts +17 -3
  404. package/src/index.ts +48 -6
  405. package/src/input/external-input-queue.ts +219 -0
  406. package/src/intelligence-map/model-bench-scores.ts +102 -0
  407. package/src/interactive-terminal-modal.ts +13 -0
  408. package/src/llm/route-decision.ts +25 -0
  409. package/src/llm-stream-retry-display.ts +59 -0
  410. package/src/llm.ts +253 -55
  411. package/src/log-entry.ts +3 -3
  412. package/src/log-pane/search.ts +29 -4
  413. package/src/loops/agent-reply.ts +256 -0
  414. package/src/loops/budget.ts +37 -7
  415. package/src/loops/loop-cli.ts +3 -2
  416. package/src/loops/msg-address.ts +57 -0
  417. package/src/loops/msg-wake.ts +282 -0
  418. package/src/loops/orchestrator/inbox.ts +130 -0
  419. package/src/loops/orchestrator/resync-shadow.ts +100 -12
  420. package/src/loops/orchestrator/tick.ts +94 -3
  421. package/src/loops/registry.ts +42 -4
  422. package/src/maturity/feature-maturity.ts +1 -1
  423. package/src/memory.ts +20 -5
  424. package/src/msg/msg-sse-server.ts +141 -0
  425. package/src/msg/msg-store.ts +84 -14
  426. package/src/native-tool-catalog.ts +125 -0
  427. package/src/nexus/api/http-server.ts +5 -0
  428. package/src/nexus/api/ops-api.ts +2 -0
  429. package/src/nexus/api/project-autopsy.ts +127 -0
  430. package/src/nexus/api/terminals.ts +3 -0
  431. package/src/nexus/api/workflow-approvals.ts +2 -0
  432. package/src/nexus/onboarding/first-boot-wizard.ts +56 -2
  433. package/src/oauth/codex-account-store.ts +15 -3
  434. package/src/oauth/codex-billing-route.ts +31 -0
  435. package/src/ops/overview-collect.ts +19 -2
  436. package/src/panes/log-pane.ts +67 -8
  437. package/src/patents/ledger.ts +128 -0
  438. package/src/persona/presets.ts +44 -0
  439. package/src/plugins/install/market-fetch.ts +32 -1
  440. package/src/plugins/maker/wizard-generate.ts +6 -4
  441. package/src/pod-lease/admission.ts +116 -41
  442. package/src/preview/terminal.ts +14 -1
  443. package/src/prompt-cache/types.ts +2 -0
  444. package/src/prompt-enhance/enhance.ts +24 -8
  445. package/src/prompt-library/universal-preamble.ts +273 -56
  446. package/src/pty-shell/pty-control-ipc.ts +4 -1
  447. package/src/pty-shell/pty-manifest.ts +77 -5
  448. package/src/pty-shell/registry.ts +19 -2
  449. package/src/pty-shell/tui-run-state.ts +253 -0
  450. package/src/release-loop/checklist.ts +11 -0
  451. package/src/release-loop/light-rc.ts +28 -3
  452. package/src/release-loop/merged-pr-checklist.ts +24 -5
  453. package/src/release-loop/rehearsal.ts +1 -1
  454. package/src/release-loop/rubric.ts +70 -0
  455. package/src/render.ts +5 -1
  456. package/src/rfc-registry/registry.ts +88 -0
  457. package/src/seat-dispatch/seat-request-ledger.ts +4 -0
  458. package/src/seat-loop/knowhow-lint.ts +233 -0
  459. package/src/seat-loop/seat-pack.ts +16 -4
  460. package/src/seat-loop/seat-report.ts +42 -2
  461. package/src/seat-loop/traffic-signal.ts +7 -0
  462. package/src/self-dev/ask-launch-flow.ts +48 -8
  463. package/src/self-dev/ask-path-candidates.ts +69 -14
  464. package/src/self-dev/decompose-proposal.ts +43 -1
  465. package/src/self-dev/graph-journey-nodes.ts +2 -0
  466. package/src/self-dev/launch-preflight-text.ts +5 -1
  467. package/src/self-dev/launch-preflight.ts +143 -10
  468. package/src/self-dev/run-supervisor.ts +71 -5
  469. package/src/self-dev/shard-aggregate.ts +2 -0
  470. package/src/self-dev/shard-run.ts +23 -2
  471. package/src/self-health/signatures.ts +132 -0
  472. package/src/self-implement/doctor-visit.ts +118 -0
  473. package/src/self-implement/gate-cli.ts +17 -4
  474. package/src/self-implement/goal-author-decompose.ts +80 -16
  475. package/src/self-implement/goal-author.ts +116 -73
  476. package/src/self-implement/goal-authoring-grounding.ts +1 -1
  477. package/src/self-implement/goal-file-name.ts +65 -0
  478. package/src/self-implement/goal-new-paths.ts +4 -5
  479. package/src/self-implement/graph-authority.ts +17 -3
  480. package/src/self-implement/graph-yaml.ts +15 -7
  481. package/src/self-implement/ground-goal.ts +2 -1
  482. package/src/self-implement/headless-elanous-driver.ts +16 -1
  483. package/src/self-implement/host-regate.ts +58 -9
  484. package/src/self-implement/orchestrator.ts +3 -10
  485. package/src/self-implement/review-mustfix-class.ts +115 -0
  486. package/src/self-implement/rework-policy.ts +80 -2
  487. package/src/self-implement/run-ledger.ts +111 -7
  488. package/src/self-implement/running-runs.ts +10 -6
  489. package/src/self-implement/self-implement-runtime.ts +32 -0
  490. package/src/self-implement/speed-claims.ts +145 -6
  491. package/src/session/pending-input.ts +62 -11
  492. package/src/session-runtime/index.ts +7 -1
  493. package/src/skills/tools/ops-ledger.ts +707 -0
  494. package/src/skills/tools/persistent-grounding.ts +103 -8
  495. package/src/skills/tools/shell.ts +196 -2
  496. package/src/status/bar.ts +32 -2
  497. package/src/status/status-provider-info.ts +58 -0
  498. package/src/steward/rejudge-tick.ts +12 -1
  499. package/src/steward/release-day.ts +158 -0
  500. package/src/steward/resync-tick.ts +123 -0
  501. package/src/task-agent/actions.ts +1 -0
  502. package/src/task-agent/adopt-pr.ts +140 -0
  503. package/src/task-agent/board.ts +11 -1
  504. package/src/task-agent/card-evidence.ts +37 -5
  505. package/src/task-agent/cover.ts +84 -17
  506. package/src/task-agent/failure-notify.ts +61 -0
  507. package/src/task-agent/green-sweep.ts +170 -0
  508. package/src/task-agent/land-worktree.ts +52 -5
  509. package/src/task-agent/live-move-history.ts +1 -0
  510. package/src/task-agent/live-moves.ts +43 -12
  511. package/src/task-agent/parent-host.ts +1 -1
  512. package/src/task-agent/postland-card.ts +139 -0
  513. package/src/task-agent/rejudge-on-head.ts +109 -7
  514. package/src/task-agent/remote-rejudge-bind.ts +91 -0
  515. package/src/task-agent/repair-branch-cas.ts +182 -0
  516. package/src/task-agent/repair-cycle.ts +288 -0
  517. package/src/task-agent/repair-next-move.ts +31 -0
  518. package/src/task-agent/repair-review.ts +24 -0
  519. package/src/task-agent/repair-worker.ts +87 -0
  520. package/src/task-agent/review-result-capture.ts +2 -1
  521. package/src/task-agent/shadow.ts +13 -7
  522. package/src/task-agent/task-hand.ts +115 -6
  523. package/src/task-orchestrator/surfaces/kubectl-transient-retry.ts +51 -0
  524. package/src/task-orchestrator/surfaces/pod-command-job.ts +63 -7
  525. package/src/task-orchestrator/surfaces/pod-install-slots.ts +6 -11
  526. package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +76 -0
  527. package/src/task-orchestrator/surfaces/pod-repair-commit.ts +96 -0
  528. package/src/task-orchestrator/surfaces/self-implement-pod.ts +175 -43
  529. package/src/telegram.ts +30 -1
  530. package/src/terminal/session-registry.ts +6 -0
  531. package/src/thinking-line.ts +12 -3
  532. package/src/tool-runtime/index.ts +4 -0
  533. package/src/tool-runtime/ops-ledger-runtimes.ts +84 -0
  534. package/src/tool-runtime/ref-consult-runtime.ts +17 -2
  535. package/src/tool-runtime/run-shell-runtime.ts +4 -1
  536. package/src/tool-runtime/self-cognition-runtimes.ts +5 -1
  537. package/src/tui.ts +5 -0
  538. package/src/user-config.ts +62 -7
  539. package/src/ux-sim/fake-llm.ts +29 -0
  540. package/src/ux-sim/fault-sqlite-busy.ts +50 -0
  541. package/src/ux-sim/in-process-cli.ts +175 -0
  542. package/src/version/packed-revision.json +1 -1
  543. package/apps/pwa/out/_next/static/chunks/1027.a0f04663d24c2779.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +0 -36
  548. package/apps/pwa/out/_next/static/chunks/1146.80d15ea7c6e6ee95.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/1157.f08bf2b70915e176.js +0 -148
  550. package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/1454-a9c338f5bb556f42.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +0 -27
  557. package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/2528.3868070ef1be69f9.js +0 -24
  562. package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/2697.76ca2ac3efef6f3b.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +0 -32
  565. package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/3143.257997a5f1ed79df.js +0 -34
  567. package/apps/pwa/out/_next/static/chunks/3259-86f3be56e43eaf6a.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/3309.364573ceedbdfd5f.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +0 -287
  572. package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/4084.15ecaf4240bd9e77.js +0 -286
  577. package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +0 -8
  582. package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +0 -104
  584. package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +0 -149
  586. package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/599-a914cc0468f56143.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +0 -23
  596. package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +0 -77
  600. package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +0 -64
  602. package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +0 -2
  604. package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +0 -62
  612. package/apps/pwa/out/_next/static/chunks/7752.5cbdd0b433c54af9.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/8085-1e5fce59500a2cc2.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +0 -226
  621. package/apps/pwa/out/_next/static/chunks/83a80514-b897b64df43ce108.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +0 -93
  623. package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +0 -24
  624. package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +0 -115
  627. package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +0 -41
  629. package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +0 -74
  630. package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +0 -94
  631. package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/949.1e7d45ccb71580aa.js +0 -90
  635. package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/9938.b23e4d4dfa0114cd.js +0 -79
  639. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/app/approvals/page-a1ce306364f08da9.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-07110da72c45e68f.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/app/board/page-d2d76d4a7eae91bd.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/app/botlab/page-30007380f2e2a3c1.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/app/bots/page-e5a9302c105725a3.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/ceo/page-b93c04b5311c97ec.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/chat/page-718a49e86bf25f9c.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/consult/page-20662900d6b4b455.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/control/page-f707a509515ac50c.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/decisions/page-6a16a48d1aa6e91f.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/design-check/page-fcb06e305f515527.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/editor/page-6acf5ec4e6c6d1af.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/exec/page-39f82acf619cca23.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/field/page-7c2c8f81b185f9c0.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/inside/page-ae7aff07e32676bb.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/intake/page-482c60c1bc540d0a.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/layout-7cb996c1aa08b6f5.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/live/page-623e08fe4477d606.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/live-run/page-db460cd8aecb8490.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/market/page-8397a5c6ca569bf4.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1917ea87ea71ab6b.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/not-found-670510eda8b9443f.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/observatory/page-d73c3f1e00d93986.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-65caacf54389081e.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-4bb7556e2e97a750.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-77e04b4f8762c666.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/outputs/page-15c0a4095baddfba.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/page-4eb96fc7241c2456.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/reflection/page-63e272a4cd3b6634.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-0d64ff212dc55d03.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/sessions/page-7f096248993fc2d4.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-e47fc72049149a38.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/settings/page-f7d808e31e005895.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-5c2b24b5496dad73.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/setup/page-76cdb531668b5191.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/share/page-e2b63345bba1a11f.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/showroom/page-d376e0c83edc041a.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/tasks/page-d6db55fe2c04d128.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/app/today/page-dab163b338e3b966.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/app/trace/page-08019efef111ed2e.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/vault/page-0260ffc7eda50db1.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-980ce6fe36ad95eb.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/workflows/page-99c4e6c7345a9156.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/workspace/page-0ab42e0f05823013.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-ad9220422d20ba33.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/e117f801.e92bf10242653497.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/e87d89b9.2e71c0ae475d28a1.js +0 -122
  690. package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +0 -1
  696. package/src/dashboard/bench-slash-runtime.ts +0 -40
  697. package/src/dashboard/input/search-modal-router.ts +0 -9
  698. package/src/dashboard/modals/pane-key-router.ts +0 -27
  699. package/src/dashboard/view-slash-runtime.ts +0 -48
  700. /package/apps/pwa/out/_next/static/{Ev2jivDMTSoEc-5rIXdcy → cIpv5nU9AycwYWZI9H589}/_ssgManifest.js +0 -0
package/src/telegram.ts CHANGED
@@ -79,6 +79,8 @@ import { handleTelegramFieldNote } from './field-note/telegram.js';
79
79
  import type { TranscriptionEngine, FieldAudio } from './field-note/transcribe.js';
80
80
  import { maybeHandleCardPhoto, type CardPhotoDeps } from './telegram-card-followup.js';
81
81
  import { attachTelegramProjectButtons } from './telegram-project-command.js';
82
+ import { BriefItemsLedger } from './briefing/brief-items.js';
83
+ import { recordBriefTelegramUpdate } from './cli/brief-cli.js';
82
84
  import { attachTelegramFabricPlan } from './telegram-fabric-plan.js';
83
85
  import { contextNow as readContextNow, type ContextNowDeps } from './context-bus/context-now.js';
84
86
  import { renderContextFirstOpening } from './context-bus/context-now-surfaces.js';
@@ -123,6 +125,7 @@ export interface TgIncoming {
123
125
  botId?: string;
124
126
  /** 답장 대상 메시지의 텍스트(force_reply 정정 가로채기용). parseUpdate 가 채운다. */
125
127
  replyToText?: string;
128
+ replyToMessageId?: number;
126
129
  /** 앨범(media group) id — `#현장` 캡션은 앨범의 첫 항목에만 붙으므로 나머지를 같은 행사로 묶는 데 쓴다. */
127
130
  mediaGroupId?: string;
128
131
  /** 영상 — `#현장` 저장 전용. `attachments` 에 넣지 않는다(LLM 경로의 동작을 안 바꾸려고). */
@@ -239,6 +242,8 @@ export interface TelegramBotOpts {
239
242
  /** 시험 seam — `/v1/context/now` 와 같은 `contextNow` 읽기. 던지면 «맥락 못 읽음». */
240
243
  readContextNow?: typeof readContextNow;
241
244
  contextNowDeps?: ContextNowDeps;
245
+ /** Optional test-isolated briefing ledger for inbound feedback. */
246
+ briefLedger?: BriefItemsLedger;
242
247
  /** Keeps last-utterance times across a daemon restart so a restart does not re-send the context-first opening. */
243
248
  contextFirstStore?: ContextFirstStore;
244
249
  }
@@ -301,6 +306,7 @@ export class TelegramBot {
301
306
  readonly botId: string;
302
307
  private readonly allowedUsers: Set<number>;
303
308
  private readonly onMessage: TelegramBotOpts['onMessage'];
309
+ private readonly briefLedger: BriefItemsLedger | undefined;
304
310
  private readonly fetchImpl: typeof fetch;
305
311
  private readonly errorBackoffMs: number;
306
312
  private readonly pollTimeoutSec: number;
@@ -381,6 +387,7 @@ export class TelegramBot {
381
387
  this.botId = opts.token.split(':')[0] || opts.token;
382
388
  this.allowedUsers = new Set(opts.allowedUsers);
383
389
  this.onMessage = opts.onMessage;
390
+ this.briefLedger = opts.briefLedger ?? (opts.nowImpl === undefined && opts.fetchImpl === undefined ? new BriefItemsLedger() : undefined);
384
391
  this.homeChannel = opts.homeChannel;
385
392
  this.fetchImpl = opts.fetchImpl ?? fetch;
386
393
  this.errorBackoffMs = opts.errorBackoffMs ?? DEFAULT_ERROR_BACKOFF;
@@ -1229,7 +1236,7 @@ export class TelegramBot {
1229
1236
  while (this.running) {
1230
1237
  try {
1231
1238
  await deliverSeatAnswers(this.seatWorkDeps.askDeps!);
1232
- const wantCallbackQuery = this.callbackHandlers.size > 0;
1239
+ const wantCallbackQuery = this.callbackHandlers.size > 0 || this.briefLedger !== undefined;
1233
1240
  const wantReaction = this.reactionHandlers.size > 0;
1234
1241
  // allowed_updates 는 명시한 것만 받으므로 등록된 핸들러 종류만 추가(비파괴 — 핸들러
1235
1242
  // 없으면 종전 ['message']/['message','callback_query'] 그대로).
@@ -1274,6 +1281,19 @@ export class TelegramBot {
1274
1281
  messageId: cq.message?.message_id,
1275
1282
  data: cq.data ?? '',
1276
1283
  };
1284
+ if (this.briefLedger && payload.chatId !== undefined && payload.messageId !== undefined && /^brief-item:[1-9]\d*:(?:read|button|ignore)$/.test(payload.data)) {
1285
+ try {
1286
+ const recorded = recordBriefTelegramUpdate(this.briefLedger, {
1287
+ botId: this.botId, chatId: payload.chatId, messageId: payload.messageId,
1288
+ updateId: String(u.update_id), callbackData: payload.data,
1289
+ });
1290
+ await this.answerCallbackQuery(payload.id, { text: recorded ? '브리핑 반응 기록됨' : '브리핑 항목을 찾을 수 없습니다' });
1291
+ } catch (err) {
1292
+ this.log(`brief feedback failed: ${err instanceof Error ? err.message : String(err)}`);
1293
+ try { await this.answerCallbackQuery(payload.id, { text: '브리핑 반응 기록 실패' }); } catch { /* polling continues */ }
1294
+ }
1295
+ continue;
1296
+ }
1277
1297
  for (const h of this.callbackHandlers) {
1278
1298
  try { await h(payload); } catch (err) {
1279
1299
  this.log(`callback handler error: ${err instanceof Error ? err.message : String(err)}`);
@@ -1315,6 +1335,14 @@ export class TelegramBot {
1315
1335
  await this.refuseMessage(incoming);
1316
1336
  continue;
1317
1337
  }
1338
+ if (this.briefLedger && incoming.replyToMessageId && incoming.text.trim() && !incoming.text.trim().startsWith('/')) {
1339
+ try {
1340
+ recordBriefTelegramUpdate(this.briefLedger, {
1341
+ botId: this.botId, chatId: incoming.chatId, messageId: incoming.replyToMessageId,
1342
+ updateId: String(incoming.updateId), text: incoming.text,
1343
+ });
1344
+ } catch (err) { this.log(`brief feedback failed: ${err instanceof Error ? err.message : String(err)}`); }
1345
+ }
1318
1346
  // HITL "Other" free-text: consume inline (before the turn
1319
1347
  // chain) so it isn't queued behind the turn awaiting it.
1320
1348
  if (this.tryConsumeTextCapture(incoming)) continue;
@@ -2494,6 +2522,7 @@ export function parseUpdate(u: RawUpdate): TgIncoming | null {
2494
2522
  isGroup: !isDm,
2495
2523
  attachments,
2496
2524
  ...(m.reply_to_message?.text ? { replyToText: m.reply_to_message.text } : {}),
2525
+ ...(m.reply_to_message?.message_id ? { replyToMessageId: m.reply_to_message.message_id } : {}),
2497
2526
  ...(m.media_group_id ? { mediaGroupId: m.media_group_id } : {}),
2498
2527
  ...(video ? { video } : {}),
2499
2528
  };
@@ -158,6 +158,12 @@ export class TerminalSessionRegistry {
158
158
  shellArgs: spec.shellArgs,
159
159
  env: spec.env,
160
160
  termName: spec.termName,
161
+ useRegistry: spec.useRegistry,
162
+ registryKind: spec.registryKind,
163
+ registryNickname: spec.registryNickname,
164
+ registryOrigin: spec.registryOrigin,
165
+ registryPurpose: spec.registryPurpose,
166
+ registrySeat: spec.registrySeat,
161
167
  bounds: spec.bounds,
162
168
  sizePreset: spec.sizePreset,
163
169
  onExit: (code) => {
@@ -295,10 +295,19 @@ export function startPinnedThinking(opts: StartPinnedThinkingOpts): ThinkingHand
295
295
  const interval = opts.intervalMs ?? INTERVAL_MS;
296
296
  const timer = interval > 0 ? setInterval(tick, interval) : null;
297
297
 
298
+ // ⛔ stop() 뒤엔 칠하지 않는다 — 멈춘 손잡이에 늦게 온 update/updateMetrics(다음 반복이 같은 손잡이를
299
+ // 재사용하거나 턴 마감 뒤 도착한 이벤트)가 «✢ Thinking…» 프레임을 footer 에 다시 써서, 타이머 없는
300
+ // 멈춘 표시로 남았다(TUI 결함 #5 · 10-14 13:43 오류 뒤 «Thinking…» 정지).
301
+ const repaint = (): void => {
302
+ if (stopped) return;
303
+ paint();
304
+ opts.onFrame();
305
+ };
306
+
298
307
  return {
299
- update: (m) => { message = m; messageFactory = null; paint(); opts.onFrame(); },
300
- updateAnimated: (fn) => { messageFactory = fn; paint(); opts.onFrame(); },
301
- updateMetrics: (m) => { metrics = { ...metrics, ...m }; paint(); opts.onFrame(); },
308
+ update: (m) => { message = m; messageFactory = null; repaint(); },
309
+ updateAnimated: (fn) => { messageFactory = fn; repaint(); },
310
+ updateMetrics: (m) => { metrics = { ...metrics, ...m }; repaint(); },
302
311
  reflow: () => { if (!stopped) paint(); opts.onFrame(); },
303
312
  stop: (stopOpts) => {
304
313
  if (stopped) return;
@@ -32,6 +32,7 @@ import { agentReplyRuntime } from './agent-reply-runtime.js';
32
32
  import { agentStopRuntime } from './agent-stop-runtime.js';
33
33
  import { ALL_TEAM_TOOL_RUNTIMES } from './team-tool-runtimes.js';
34
34
  import { ALL_OPS_FLEET_RUNTIMES } from './ops-fleet-runtimes.js';
35
+ import { ALL_OPS_LEDGER_RUNTIMES } from './ops-ledger-runtimes.js';
35
36
  import { ALL_AUTO_RESEARCH_RUNTIMES } from './auto-research-runtimes.js';
36
37
  import { ALL_INTELLIGENCE_MAP_RUNTIMES } from './intelligence-map-runtimes.js';
37
38
  import { ALL_CFT_ANDON_RUNTIMES } from './cft-andon-runtimes.js';
@@ -115,6 +116,9 @@ export function registerAllDefaultToolRuntimes(): void {
115
116
  registerToolRuntime(agentStopRuntime);
116
117
  for (const rt of ALL_TEAM_TOOL_RUNTIMES) registerToolRuntime(rt);
117
118
  for (const rt of ALL_OPS_FLEET_RUNTIMES) registerToolRuntime(rt);
119
+ // Ops-ledger (우편 msg · 판 release checklist) — in-process ledger tools so
120
+ // TUI OP turns stop paying 1.3–2s of `eln` CLI startup per msg/checklist op.
121
+ for (const rt of ALL_OPS_LEDGER_RUNTIMES) registerToolRuntime(rt);
118
122
  for (const rt of ALL_AUTO_RESEARCH_RUNTIMES) registerToolRuntime(rt);
119
123
  for (const rt of ALL_INTELLIGENCE_MAP_RUNTIMES) registerToolRuntime(rt);
120
124
  for (const rt of ALL_CFT_ANDON_RUNTIMES) registerToolRuntime(rt);
@@ -0,0 +1,84 @@
1
+ // ── Ops-ledger tool runtimes (우편 msg · 판 release checklist) ──
2
+ //
3
+ // Registers the eight in-process ledger tools with the tool-runtime
4
+ // layer so every surface (skill-runner, TUI) can call them by name:
5
+ // MsgList / MsgPost / MsgAck and ChecklistList / ChecklistAdd /
6
+ // ChecklistSet / ChecklistEdit / ChecklistMove. Dispatchers live in
7
+ // src/skills/tools/ops-ledger.ts; this file is a thin adapter — the
8
+ // same pattern as team-tool-runtimes.ts. Every call goes through
9
+ // `observeLedgerCall` — one `ops-ledger` `call` line with the tool, the
10
+ // elapsed ms, ok, the seat actor and ids (never bodies or evidence).
11
+
12
+ import {
13
+ buildMsgListTool, dispatchMsgList,
14
+ buildMsgPostTool, dispatchMsgPost,
15
+ buildMsgAckTool, dispatchMsgAck,
16
+ buildChecklistListTool, dispatchChecklistList,
17
+ buildChecklistAddTool, dispatchChecklistAdd,
18
+ buildChecklistSetTool, dispatchChecklistSet,
19
+ buildChecklistMoveTool, dispatchChecklistMove,
20
+ buildChecklistEditTool, dispatchChecklistEdit,
21
+ type ChecklistAddResult, type ChecklistEditResult, type ChecklistListResult, type ChecklistMoveResult,
22
+ type ChecklistSetResult, type MsgAckResult, type MsgListResult, type MsgPostResult,
23
+ observeLedgerCall,
24
+ } from '../skills/tools/ops-ledger.js';
25
+ import type { ToolRuntime } from './types.js';
26
+
27
+ export const msgListRuntime: ToolRuntime<Record<string, unknown>, MsgListResult> = {
28
+ id: 'msg_list',
29
+ spec: buildMsgListTool(),
30
+ async run(req) { return observeLedgerCall('MsgList', req, () => dispatchMsgList(req), (a, r) => ({ to: a.to, ...(r ? { count: r.count, after: r.after } : {}) })); },
31
+ };
32
+
33
+ export const msgPostRuntime: ToolRuntime<Record<string, unknown>, MsgPostResult> = {
34
+ id: 'msg_post',
35
+ spec: buildMsgPostTool(),
36
+ async run(req) { return observeLedgerCall('MsgPost', req, () => dispatchMsgPost(req), (a, r) => ({ from: a.from, to: a.to, ...(r ? { id: r.message.id } : {}) })); },
37
+ };
38
+
39
+ export const msgAckRuntime: ToolRuntime<Record<string, unknown>, MsgAckResult> = {
40
+ id: 'msg_ack',
41
+ spec: buildMsgAckTool(),
42
+ async run(req) { return observeLedgerCall('MsgAck', req, () => dispatchMsgAck(req), (a, r) => ({ to: a.to, id: a.id, ...(r ? { cursor: r.cursor } : {}) })); },
43
+ };
44
+
45
+ export const checklistListRuntime: ToolRuntime<Record<string, unknown>, ChecklistListResult> = {
46
+ id: 'checklist_list',
47
+ spec: buildChecklistListTool(),
48
+ async run(req) { return observeLedgerCall('ChecklistList', req, () => dispatchChecklistList(req), (a, r) => ({ version: r?.version ?? a.version, ...(r ? { items: r.items.length, history: r.history.length } : {}) })); },
49
+ };
50
+
51
+ export const checklistAddRuntime: ToolRuntime<Record<string, unknown>, ChecklistAddResult> = {
52
+ id: 'checklist_add',
53
+ spec: buildChecklistAddTool(),
54
+ async run(req) { return observeLedgerCall('ChecklistAdd', req, () => dispatchChecklistAdd(req), (a, r) => ({ id: a.id, version: r?.version ?? a.version })); },
55
+ };
56
+
57
+ export const checklistSetRuntime: ToolRuntime<Record<string, unknown>, ChecklistSetResult> = {
58
+ id: 'checklist_set',
59
+ spec: buildChecklistSetTool(),
60
+ async run(req) { return observeLedgerCall('ChecklistSet', req, () => dispatchChecklistSet(req), (a, r) => ({ id: a.id, version: r?.version ?? a.version, ...(a.status === undefined ? {} : { status: a.status }) })); },
61
+ };
62
+
63
+ export const checklistEditRuntime: ToolRuntime<Record<string, unknown>, ChecklistEditResult> = {
64
+ id: 'checklist_edit',
65
+ spec: buildChecklistEditTool(),
66
+ async run(req) { return observeLedgerCall('ChecklistEdit', req, () => dispatchChecklistEdit(req), (a, r) => ({ id: a.id, version: r?.version ?? a.version, field: a.field })); },
67
+ };
68
+
69
+ export const checklistMoveRuntime: ToolRuntime<Record<string, unknown>, ChecklistMoveResult> = {
70
+ id: 'checklist_move',
71
+ spec: buildChecklistMoveTool(),
72
+ async run(req) { return observeLedgerCall('ChecklistMove', req, () => dispatchChecklistMove(req), (a) => ({ id: a.id, from: a.from, to: a.to })); },
73
+ };
74
+
75
+ export const ALL_OPS_LEDGER_RUNTIMES: ToolRuntime<any, any>[] = [
76
+ msgListRuntime,
77
+ msgPostRuntime,
78
+ msgAckRuntime,
79
+ checklistListRuntime,
80
+ checklistAddRuntime,
81
+ checklistSetRuntime,
82
+ checklistEditRuntime,
83
+ checklistMoveRuntime,
84
+ ];
@@ -23,7 +23,7 @@ import { join } from 'node:path';
23
23
  import { homedir } from 'node:os';
24
24
  import type { LLMToolSpec } from '../llm.js';
25
25
  import type { ToolRuntime, ToolRuntimeContext } from './types.js';
26
- import { DEFAULT_REFERENCE_ROOTS } from '../agent/ref-grounding.js'; // ★ F3 — 로컬 canonical ref 루트
26
+ import { DEFAULT_REFERENCE_ROOTS, denyNonPublicReference } from '../agent/ref-grounding.js'; // ★ F3 — 로컬 canonical ref 루트
27
27
  import { debug } from '../debug/log.js';
28
28
 
29
29
  const CACHE_ROOT_DEFAULT = join(homedir(), '.cache', 'elanous-refs');
@@ -123,6 +123,17 @@ export function dispatchRefConsult(
123
123
  ): RefConsultResult {
124
124
  const host = args.host ?? 'github.com';
125
125
  const cacheRoot = args.cacheRoot ?? CACHE_ROOT_DEFAULT;
126
+ // 대표 2026-10-14 — 비공개 소스(Claude Code 사본)는 캐시·로컬 ref 어느 쪽이든 조회하지 않는다.
127
+ // owner·repo 는 단일 경로 성분이어야 한다 — `<사본 이름>/.` 같은 값이 join() 정규화로 이름 판정을 우회하지 못하게.
128
+ for (const [field, value] of [['owner', args.owner], ['repo', args.repo]] as const) {
129
+ if (!/^[A-Za-z0-9._-]+$/.test(value) || value === '.' || value === '..') {
130
+ throw new Error(`RefConsult: ${field} must be a single path segment (got ${JSON.stringify(value)})`);
131
+ }
132
+ }
133
+ // 판정은 `repo` 칸만 — 공개 저장소 owner 이름이 우연히 같아도 막지 않는다(로컬 중첩 경로는 아래에서 따로 거른다).
134
+ if (denyNonPublicReference(args.repo)) {
135
+ throw new Error(`RefConsult: ${args.owner}/${args.repo} is a non-public source and is not consulted. Use public documentation instead.`);
136
+ }
126
137
  // ★ F3(2026-07-22) — repo 경로 해석을 fallback 체인으로: ①에이전트 scratch 캐시(SyncRepo 산출·있으면 우선)
127
138
  // → ②로컬 canonical ref(~/source/ref/<repo>·flat bare-name·재클론 없이 90 repo 즉시 grep) → ③둘 다 없으면
128
139
  // throw. 종전엔 캐시만 봐서 캐시 미존재 시 canonical ref 가 놀아도 "SyncRepo 먼저" 로 죽던 단절을 연결.
@@ -133,7 +144,11 @@ export function dispatchRefConsult(
133
144
  if (!existsSync(join(cachePath, '.git'))) {
134
145
  const roots = args.referenceRoots ?? DEFAULT_REFERENCE_ROOTS;
135
146
  const localHit = roots
136
- .flatMap((root) => [join(root, args.repo), join(root, args.owner, args.repo)])
147
+ .flatMap((root) => [
148
+ join(root, args.repo),
149
+ // 로컬 ref 의 <owner>/<repo> 중첩은 owner 디렉터리가 비공개 사본이면 그 아래로 내려가지 않는다.
150
+ ...(denyNonPublicReference(args.owner) ? [] : [join(root, args.owner, args.repo)]),
151
+ ])
137
152
  .find((p) => existsSync(join(p, '.git')));
138
153
  if (localHit) { repoPath = localHit; source = 'local-ref'; }
139
154
  else {
@@ -31,6 +31,9 @@ export const runShellRuntime: ToolRuntime<Record<string, unknown>, RunShellDispa
31
31
  ctx.surface === 'dashboard' && req.sandbox === undefined
32
32
  ? { ...req, sandbox: 'auto' }
33
33
  : req;
34
- return dispatchRunShell(effectiveReq, { signal: ctx.signal });
34
+ return dispatchRunShell(effectiveReq, {
35
+ signal: ctx.signal,
36
+ availableToolNames: ctx.agentHostTools?.map(tool => tool.name),
37
+ });
35
38
  },
36
39
  };
@@ -195,7 +195,11 @@ export const SELF_COGNITION_RUNTIMES: readonly ToolRuntime[] = SELF_COGNITION_TO
195
195
  return coreSpec(name);
196
196
  },
197
197
  run: async (args, ctx) => name === 'context_now'
198
- ? (await import('../context-bus/context-now.js')).contextNow({ ...(typeof args.topic === 'string' ? { topic: args.topic } : {}) })
198
+ ? (() => {
199
+ const options = { ...(typeof args.topic === 'string' ? { topic: args.topic } : {}) };
200
+ return import('../context-bus/context-now.js').then(now => ctx.surface === 'tui'
201
+ ? now.contextNowInWorker(options) : now.contextNow(options));
202
+ })()
199
203
  : name === 'memory_recall' || name === 'self_recall'
200
204
  ? runRecall(name, args, ctx)
201
205
  : toToolRunResult(await coreTools().buildCoreTools().dispatch(name, args)),
package/src/tui.ts CHANGED
@@ -965,6 +965,11 @@ export function injectKey(key: Key): boolean {
965
965
  return true;
966
966
  }
967
967
 
968
+ /** 아직 readKey 가 소비하지 않은 키 수 — 외부 입력 대기열이 «사용자 키보다 앞서» 끼어들지 않게 본다. */
969
+ export function pendingKeyCount(): number {
970
+ return _keyQueue.length;
971
+ }
972
+
968
973
  export function termSize(): { rows: number; cols: number } {
969
974
  return { rows: process.stdout.rows || 24, cols: process.stdout.columns || 80 };
970
975
  }
@@ -1190,6 +1190,8 @@ export interface SelfImplementToolConfig {
1190
1190
  * Overload failover (OVERLOAD-FAILOVER) may move an unpinned codex child to
1191
1191
  * grok. A pinned codex provider is never moved. */
1192
1192
  childLlm?: ChildLlmPreferenceConfig;
1193
+ /** Explicit same-provider child escalation map. Absent preserves the existing model ladder. */
1194
+ escalateChild?: Readonly<Record<string, string>>;
1193
1195
  /** SUBSCRIPTION-EXHAUST-REROUTE (0.2.24) — `--child-llm-*` 없이 뜬 Pod 구현 자식의 기본 모델.
1194
1196
  * `{ provider, model? }` · `'off'`(종전 codex 기본). 없으면 `openrouter/z-ai/glm-5.3`. 원값 — `resolvePodChildDefault` 가 검사한다. */
1195
1197
  podChildDefault?: unknown;
@@ -1657,6 +1659,10 @@ export interface DashboardConfig {
1657
1659
  * Defaults off so optional pane/window controls do not occupy keys
1658
1660
  * required by essential input, reading, and escape controls. */
1659
1661
  enableSupplementalGlobalKeys: boolean;
1662
+ /** First-screen boot banner. Absent = `minimal`: only failures and first-run
1663
+ * guidance reach the transcript; healthy daemon/PWA/hitl-port rows move to
1664
+ * `/status`. `full` restores the historical band. */
1665
+ bootBanner?: 'minimal' | 'full';
1660
1666
  }
1661
1667
 
1662
1668
  export interface DashboardPromptBankConfig {
@@ -2737,6 +2743,11 @@ function parseToolsConfig(raw: unknown): ToolsConfig {
2737
2743
  ? selfImplRaw.autoheal as Record<string, unknown> : undefined;
2738
2744
  // ⛔ 모르는 값은 좁은 쪽(shadow) — 오타가 live 를 켜면 안 된다.
2739
2745
  const autoheal = autohealRaw ? { mode: autohealRaw.mode === 'live' ? 'live' as const : 'shadow' as const } : undefined;
2746
+ const escalateChildRaw = selfImplRaw.escalateChild;
2747
+ const escalateChild = escalateChildRaw && typeof escalateChildRaw === 'object' && !Array.isArray(escalateChildRaw)
2748
+ ? Object.fromEntries(Object.entries(escalateChildRaw).filter(([from, to]) => from.trim() && typeof to === 'string' && to.trim())
2749
+ .map(([from, to]) => [from.trim(), (to as string).trim()])) as Record<string, string>
2750
+ : undefined;
2740
2751
  // ⭐ 관측(리뷰 should-fix) — 오타/비-boolean 은 기본값(ON)으로 수렴하는데, 그게 조용하면
2741
2752
  // "껐다고 믿었는데 자동 개설되는" 운영 사고가 된다. 값이 **있는데 boolean 이 아닐 때만**
2742
2753
  // 경고한다(부재는 정상). 로거 대신 stderr — 이 파일의 기존 경고와 동형(부트 시점·의존 0).
@@ -2772,7 +2783,7 @@ function parseToolsConfig(raw: unknown): ToolsConfig {
2772
2783
  runDevHarness,
2773
2784
  selfOrchestrate,
2774
2785
  nativeStructure,
2775
- selfImplement: { worktreeRoot, childInstanceMode, prApprovalDelivery, observeOnly, goalRecordInDoc, goalAuthorPersistentGrounding, fabricDecompose, fabricDecomposeAutoPathThreshold, autoOpenPr, draftOnStop, salvageRetention, autoStop, autoAssist, screenStallTermination, reworkBudget, decompositionShadow, clarificationEscalation, ...(childLlm ? { childLlm } : {}), ...(selfImplRaw.podChildDefault !== undefined ? { podChildDefault: selfImplRaw.podChildDefault } : {}), ...(runTtlHours !== undefined ? { runTtlHours } : {}), ...(draftSweepCloseCap !== undefined ? { draftSweepCloseCap } : {}), ...(runTtl ? { runTtl } : {}), ...(autoheal ? { autoheal } : {}) },
2786
+ selfImplement: { worktreeRoot, childInstanceMode, prApprovalDelivery, observeOnly, goalRecordInDoc, goalAuthorPersistentGrounding, fabricDecompose, fabricDecomposeAutoPathThreshold, autoOpenPr, draftOnStop, salvageRetention, autoStop, autoAssist, screenStallTermination, reworkBudget, decompositionShadow, clarificationEscalation, ...(childLlm ? { childLlm } : {}), ...(escalateChild && Object.keys(escalateChild).length ? { escalateChild } : {}), ...(selfImplRaw.podChildDefault !== undefined ? { podChildDefault: selfImplRaw.podChildDefault } : {}), ...(runTtlHours !== undefined ? { runTtlHours } : {}), ...(draftSweepCloseCap !== undefined ? { draftSweepCloseCap } : {}), ...(runTtl ? { runTtl } : {}), ...(autoheal ? { autoheal } : {}) },
2776
2787
  };
2777
2788
  }
2778
2789
 
@@ -3330,7 +3341,8 @@ export interface AutoReviewConfig {
3330
3341
  };
3331
3342
  }
3332
3343
 
3333
- export type ModelRole = 'implement' | 'review' | 'research' | 'planning' | 'audit' | 'classify' | 'graph-grow';
3344
+ export type ModelRole = 'implement' | 'review' | 'research' | 'planning' | 'audit' | 'classify' | 'graph-grow' | 'coordinator' | 'guardian';
3345
+ export type AgentModelRole = 'coordinator' | 'guardian';
3334
3346
 
3335
3347
  export interface RoleModelConfig {
3336
3348
  implement?: string;
@@ -3340,6 +3352,8 @@ export interface RoleModelConfig {
3340
3352
  audit?: string;
3341
3353
  classify?: string;
3342
3354
  'graph-grow'?: string;
3355
+ coordinator?: string;
3356
+ guardian?: string;
3343
3357
  }
3344
3358
 
3345
3359
  /** Sparse provider-agnostic model tier preferences by execution role. */
@@ -3422,6 +3436,10 @@ export const ROLE_MODEL_DEFAULTS: Record<ModelRole, { environment: string; tier:
3422
3436
  audit: { environment: 'ELANOUS_MEMORY_JUDGE_MODEL', tier: 'better' },
3423
3437
  classify: { environment: 'ELANOUS_ACTION_CLASSIFIER_MODEL', tier: 'budget' },
3424
3438
  'graph-grow': { environment: 'ELANOUS_GRAPH_GROW_MODEL', tier: 'better' },
3439
+ // 이 티어는 provider 만 명시했을 때 쓰인다. 에이전트 기동은
3440
+ // resolveConfiguredAgentRoleLlm 이 명시 설정을 먼저 요구한다.
3441
+ coordinator: { environment: 'ELANOUS_COORDINATOR_MODEL', tier: 'balanced' },
3442
+ guardian: { environment: 'ELANOUS_GUARDIAN_MODEL', tier: 'balanced' },
3425
3443
  };
3426
3444
 
3427
3445
  /** Resolve `auto` through the same runtime provider selector that dispatches LLM calls.
@@ -3576,6 +3594,24 @@ export function resolveRoleLlm(role: ModelRole, opts: RoleLlmResolveOptions = {}
3576
3594
  return baseline;
3577
3595
  }
3578
3596
 
3597
+ /** 조율자·수호자는 사용자 선택이 없으면 기동하지 않는다.
3598
+ * 일반 역할의 기본 모델 사다리와 구분해, 발사 인자·env pin·roleLlm 설정 중
3599
+ * 실제 모델 선택(provider/tier/model)이 있을 때만 해석한다. effort 단독은 선택이 아니다. */
3600
+ export function resolveConfiguredAgentRoleLlm(
3601
+ role: AgentModelRole,
3602
+ opts: RoleLlmResolveOptions = {},
3603
+ ): RoleLlmResolution | undefined {
3604
+ const config = opts.config ?? getUserConfig();
3605
+ const hasSelection = (spec: RoleLlmSpec | undefined): boolean =>
3606
+ Boolean(spec?.provider || spec?.tier || spec?.model?.trim());
3607
+ const configured = [
3608
+ (opts.overrides ?? launchRoleLlmOverrides)?.[role],
3609
+ roleLlmEnvPin(role, opts.env ?? process.env),
3610
+ config.roleLlm?.[role],
3611
+ ].some(hasSelection);
3612
+ return configured ? resolveRoleLlm(role, { ...opts, config }) : undefined;
3613
+ }
3614
+
3579
3615
  /** POD-ROLE-LLM — 역할 고정을 «프로세스 env» 로 받는 칸. `ELANOUS_ROLE_LLM_<ROLE>` = RoleLlmSpec JSON
3580
3616
  * (예 `{"provider":"openai-codex","tier":"best","model":"gpt-6-sol"}`).
3581
3617
  * ⭐ 왜 env 인가: `--role-llm` 은 부모 프로세스 메모리 값이고 Pod 안엔 운영 config 가 없다 —
@@ -3833,9 +3869,9 @@ export interface UserConfig {
3833
3869
  /** GUARD-ONE-a: omitted means shadow. `live` is parsed for the later cutover, but `elanous guardian tick`
3834
3870
  * refuses it until a human-confirmed operational change (GUARD-ONE-a ships shadow only). */
3835
3871
  guardian?: { mode?: 'shadow' | 'live'; /** Orphan CLI GC on the guardian tick: off = no ps collection, shadow (default) = evidence only, on = evidence then SIGTERM. */ orphanGc?: 'off' | 'shadow' | 'on' };
3836
- /** TA-JUDGE-LIVE-SAFE: task-agent judge moves executed for real. Only `review` · `propose-green` are honoured
3837
- * (`src/task-agent/live-moves.ts` drops anything else with a warning). Absent = env ELANOUS_TASK_AGENT_LIVE_MOVES, else none (pure shadow). */
3838
- taskAgent?: { liveMoves?: string[]; /** TA-REJUDGE-PERIODIC — steward tick runs `tasks rejudge --all` every N minutes (absent/0 = off). */ rejudgeEveryMinutes?: number; /** 1-minute load average above which that tick is skipped (default 60). */ rejudgeMaxLoad?: number; parentHost?: { host?: string; cwd?: string; elanous?: string; configDir?: string; podPool?: string; approvalCapacity?: number } | Array<{ host?: string; cwd?: string; elanous?: string; configDir?: string; podPool?: string; approvalCapacity?: number }> };
3872
+ /** Task-agent live move allow-list (`src/task-agent/live-moves.ts` validates its vocabulary).
3873
+ * Absent = env ELANOUS_TASK_AGENT_LIVE_MOVES, else none (pure shadow). */
3874
+ taskAgent?: { liveMoves?: string[]; /** TA-REJUDGE-PERIODIC — steward tick runs `tasks rejudge --all` every N minutes (absent/0 = off). */ rejudgeEveryMinutes?: number; /** 1-minute load average above which that tick is skipped (default 60). */ rejudgeMaxLoad?: number; /** TA-REPAIR-TICK-CAP — new repair launches per `tasks rejudge --all` (default 3, 0 = none). */ repairMaxPerTick?: number; parentHost?: { host?: string; cwd?: string; elanous?: string; configDir?: string; podPool?: string; approvalCapacity?: number } | Array<{ host?: string; cwd?: string; elanous?: string; configDir?: string; podPool?: string; approvalCapacity?: number }> };
3839
3875
  events?: EventsConfig;
3840
3876
  /** GATE-REMOTE — see GateRemoteConfig. Absent = defaults (auto on · node-b · load 20 · cap 2). */
3841
3877
  gateRemote?: GateRemoteConfig;
@@ -4039,7 +4075,7 @@ export function parseRoleLlmEntry(raw: unknown): { ok: true; spec: RoleLlmSpec }
4039
4075
  return { ok: true, spec };
4040
4076
  }
4041
4077
 
4042
- export const MODEL_ROLES: readonly ModelRole[] = ['implement', 'review', 'research', 'planning', 'audit', 'classify', 'graph-grow'];
4078
+ export const MODEL_ROLES: readonly ModelRole[] = ['implement', 'review', 'research', 'planning', 'audit', 'classify', 'graph-grow', 'coordinator', 'guardian'];
4043
4079
 
4044
4080
  export function isModelRole(v: unknown): v is ModelRole {
4045
4081
  return typeof v === 'string' && (MODEL_ROLES as readonly string[]).includes(v);
@@ -4147,13 +4183,18 @@ function parseTaskAgentConfig(raw: unknown): UserConfig['taskAgent'] {
4147
4183
  }
4148
4184
  const parentHost = parseTaskAgentParentHost((raw as Record<string, unknown>).parentHost);
4149
4185
  // TA-REJUDGE-PERIODIC — 음이 아닌 유한수만 산다(0 = 끔). 그 밖은 경고하고 버린다(= 끔 · 기본 부하 상한).
4150
- const rejudge: { rejudgeEveryMinutes?: number; rejudgeMaxLoad?: number } = {};
4186
+ const rejudge: { rejudgeEveryMinutes?: number; rejudgeMaxLoad?: number; repairMaxPerTick?: number } = {};
4151
4187
  for (const key of ['rejudgeEveryMinutes', 'rejudgeMaxLoad'] as const) {
4152
4188
  const value = (raw as Record<string, unknown>)[key];
4153
4189
  if (value === undefined) continue;
4154
4190
  if (typeof value === 'number' && Number.isFinite(value) && value >= 0) rejudge[key] = value;
4155
4191
  else warnUserConfigDrop(`taskAgent.${key}`, `음이 아닌 수가 아니다(${JSON.stringify(value)}) — 버림`);
4156
4192
  }
4193
+ const repairMaxPerTick = (raw as Record<string, unknown>).repairMaxPerTick;
4194
+ if (repairMaxPerTick !== undefined) {
4195
+ if (Number.isSafeInteger(repairMaxPerTick) && (repairMaxPerTick as number) >= 0) rejudge.repairMaxPerTick = repairMaxPerTick as number;
4196
+ else warnUserConfigDrop('taskAgent.repairMaxPerTick', `음이 아닌 정수가 아니다(${JSON.stringify(repairMaxPerTick)}) — 기본 3`);
4197
+ }
4157
4198
  const extras = { ...rejudge, ...(parentHost ? { parentHost } : {}) };
4158
4199
  const liveMoves = (raw as Record<string, unknown>).liveMoves;
4159
4200
  if (liveMoves === undefined) return Object.keys(extras).length ? extras : undefined;
@@ -4254,6 +4295,10 @@ function parseRoleLlmConfig(raw: unknown): RoleLlmConfig | undefined {
4254
4295
  if (effort === 'low' || effort === 'medium' || effort === 'high') spec.effort = effort;
4255
4296
  else warnUserConfigDrop(`roleLlm.${role}.effort`, `low|medium|high 가 아니다(${JSON.stringify(effort)}) — 버림`);
4256
4297
  }
4298
+ if ((role === 'coordinator' || role === 'guardian') && !spec.provider && !spec.tier && !spec.model) {
4299
+ dropped.push({ role, reason: 'provider·tier·model 중 하나는 있어야 한다 (effort 단독은 기동 설정이 아니다)' });
4300
+ continue;
4301
+ }
4257
4302
  if (Object.keys(spec).length > 0) parsed[role] = spec;
4258
4303
  } else {
4259
4304
  const entry = parseRoleLlmEntry(rawEntry);
@@ -4268,6 +4313,11 @@ function parseRoleLlmConfig(raw: unknown): RoleLlmConfig | undefined {
4268
4313
  // 사용자는 「왜 내 설정이 안 먹지」를 영영 못 푼다(CLI 는 이름을 대며 거부하는데 여기만 조용했다).
4269
4314
  // ⇒ 버린 것을 «이름과 이유»로 남긴다. 로딩 자체는 계속한다.
4270
4315
  if (dropped.length > 0) {
4316
+ for (const { role, reason } of dropped) {
4317
+ if (role === 'coordinator' || role === 'guardian') {
4318
+ warnUserConfigDrop(`roleLlm.${role}`, `${reason} — 버림; 명시 모델 없이는 에이전트 기동 거부`);
4319
+ }
4320
+ }
4271
4321
  try {
4272
4322
  // eslint-disable-next-line @typescript-eslint/no-require-imports
4273
4323
  const { debug } = require('./debug/log.js') as typeof import('./debug/log.js');
@@ -5715,6 +5765,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
5715
5765
  ? dash.foldMode
5716
5766
  : 'task-unit',
5717
5767
  benchmark: dash.benchmark === true ? true : undefined,
5768
+ bootBanner: dash.bootBanner === 'minimal' || dash.bootBanner === 'full' ? dash.bootBanner : undefined,
5718
5769
  enableVirtualWindowSwitchKeys: dash.enableVirtualWindowSwitchKeys === true,
5719
5770
  enableSupplementalGlobalKeys: dash.enableSupplementalGlobalKeys === true,
5720
5771
  promptBank: {
@@ -6528,6 +6579,9 @@ export function saveUserConfig(
6528
6579
  answerPriority: cfg.llm.answerPriority,
6529
6580
  maxTurns: cfg.llm.maxTurns,
6530
6581
  missionRouting: cfg.llm.missionRouting,
6582
+ // ⛔ 로드(parseLlmRoutePolicy)만 있고 저장이 없으면 `config set llm.routePolicy` 가 «조용히» 떨어진다
6583
+ // (10-14 OP 실측 — set 뒤 get 이 undefined · TUI-MODEL-SESSION-SCOPE ①).
6584
+ routePolicy: cfg.llm.routePolicy,
6531
6585
  }),
6532
6586
  skills: stripUndef({
6533
6587
  activeSet: cfg.skills.activeSet,
@@ -6691,6 +6745,7 @@ export function saveUserConfig(
6691
6745
  promptBank: cfg.dashboard.promptBank,
6692
6746
  foldMode: cfg.dashboard.foldMode,
6693
6747
  benchmark: cfg.dashboard.benchmark,
6748
+ bootBanner: cfg.dashboard.bootBanner,
6694
6749
  enableVirtualWindowSwitchKeys: cfg.dashboard.enableVirtualWindowSwitchKeys,
6695
6750
  enableSupplementalGlobalKeys: cfg.dashboard.enableSupplementalGlobalKeys,
6696
6751
  }),
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Deterministic, network-free LLM for gate tests without provider credentials.
3
+ * The opt-in is deliberately explicit; production never selects this provider.
4
+ */
5
+ import type { LLMMessage, LLMOpts, LLMProvider, LLMStreamEvent } from '../llm.js';
6
+
7
+ export const TEST_FAKE_LLM_ENV = 'ELANOUS_TEST_FAKE_LLM';
8
+ export const TEST_FAKE_LLM_RESPONSE_ENV = 'ELANOUS_TEST_FAKE_LLM_RESPONSE';
9
+
10
+ export function testFakeLlmEnabled(): boolean {
11
+ return process.env[TEST_FAKE_LLM_ENV] === '1';
12
+ }
13
+
14
+ export function testFakeLlmResponse(): string {
15
+ return process.env[TEST_FAKE_LLM_RESPONSE_ENV] ?? '[test-fake-llm] OK';
16
+ }
17
+
18
+ /** Shares the real LLMProvider contract; only the external model call is replaced. */
19
+ export const testFakeLlmProvider: LLMProvider = {
20
+ name: 'test-fake-llm',
21
+ defaultModel: 'test-fake-llm',
22
+ available: testFakeLlmEnabled,
23
+ async *chat(_messages: LLMMessage[], _opts?: LLMOpts): AsyncGenerator<string, void, unknown> {
24
+ yield testFakeLlmResponse();
25
+ },
26
+ async *streamChat(_messages: LLMMessage[], _opts?: LLMOpts): AsyncGenerator<LLMStreamEvent, void, unknown> {
27
+ yield { type: 'text', delta: testFakeLlmResponse() };
28
+ },
29
+ };
@@ -0,0 +1,50 @@
1
+ // SQLite의 실제 write lock 아래에서 LogStore.insertBatch의 busy 버퍼와 복구를 관측한다.
2
+ import { Database } from 'bun:sqlite';
3
+ import { mkdtempSync, rmSync } from 'node:fs';
4
+ import { tmpdir } from 'node:os';
5
+ import { join } from 'node:path';
6
+ import { LogStore } from '../mss/logging/log-store.js';
7
+
8
+ export interface SqliteBusyObservation {
9
+ readonly busy: boolean;
10
+ readonly beforeRelease: number;
11
+ readonly afterRelease: number;
12
+ readonly events: string[];
13
+ }
14
+
15
+ export function simSqliteBusy(): SqliteBusyObservation {
16
+ const dir = mkdtempSync(join(tmpdir(), 'ux-sim-sqlite-busy-'));
17
+ const path = join(dir, 'logs.db');
18
+ let store: LogStore | undefined;
19
+ let locker: Database | undefined;
20
+ try {
21
+ store = new LogStore(path, { instance: 'ux-sim' });
22
+ locker = new Database(path);
23
+ locker.run('BEGIN IMMEDIATE');
24
+ const rec = (event: string) => ({ rec: { ts: new Date().toISOString(), category: 'ux-sim.sqlite', event }, surface: 'ux-sim' });
25
+ let busy = false;
26
+ try { store.insertBatch([rec('locked')]); }
27
+ catch (error) {
28
+ if (!/SQLITE_BUSY|database is locked/i.test(String(error))) throw error;
29
+ busy = true;
30
+ }
31
+ const beforeRelease = store.count();
32
+ locker.run('ROLLBACK');
33
+ store.insertBatch([rec('recovered')]);
34
+ const events = store.query({ exactCategories: ['ux-sim.sqlite'] }).map((row) => row.event);
35
+ return { busy, beforeRelease, afterRelease: store.count(), events };
36
+ } finally {
37
+ try { locker?.run('ROLLBACK'); } catch { /* transaction already ended */ }
38
+ locker?.close();
39
+ store?.close();
40
+ rmSync(dir, { recursive: true, force: true });
41
+ }
42
+ }
43
+
44
+ export function renderSqliteBusy(result: SqliteBusyObservation): string[] {
45
+ return [
46
+ 'sqlite-busy · 실제 SQLite write lock → LogStore.insertBatch 재시도',
47
+ ` SQLite busy=${result.busy} · 잠금 중 행=${result.beforeRelease} · 해제 후 행=${result.afterRelease}`,
48
+ ` 복구된 이벤트=${result.events.join(', ')}`,
49
+ ];
50
+ }