elanous 0.2.28 → 0.2.31

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 (818) 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 → LSXfY0u9QtfDbejY0Ukf_}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{ab4d57c2.e90bc2cb31949045.js → 0bb0ff36.b8d418980951e5ba.js} +7 -7
  5. package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +27 -0
  8. package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +287 -0
  9. package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +62 -0
  10. package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/{5492-e05e26a033ba80d2.js → 1335-6731f392c35216eb.js} +3 -3
  12. package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/1654.32de4b324981a188.js +23 -0
  15. package/apps/pwa/out/_next/static/chunks/1834-50625904996a8fa8.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +149 -0
  17. package/apps/pwa/out/_next/static/chunks/1913.7cc6fb6055b1ed3f.js +41 -0
  18. package/apps/pwa/out/_next/static/chunks/2001.6c7e0fd02190886c.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2112-e4efc21a6505d5bc.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/{8578.dff22d988cc2b106.js → 2213.2ccbada92c33ea0f.js} +3 -3
  24. package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2534.e85ae21ad0dac829.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/{5081.a240b63fad28663a.js → 2871.0bca6137343b3f76.js} +1 -1
  28. package/apps/pwa/out/_next/static/chunks/2898.fd781bc7cf01a7b7.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2940-619bfd8ef337c611.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/{2846.d6a433b8663819a5.js → 2985.39ccdecd36848b12.js} +4 -4
  31. package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +115 -0
  32. package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +64 -0
  33. package/apps/pwa/out/_next/static/chunks/{f4dfbfc0.a69fb12f854882aa.js → 3267c0e6.d34854e7b3984a6e.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/3278.2e5d15b53a4091c8.js +2 -0
  35. package/apps/pwa/out/_next/static/chunks/3541-ce3a5424ed5ad7f1.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3583.a05e88cc8d594628.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/{3143.257997a5f1ed79df.js → 3902.e1e71aaac850a045.js} +1 -1
  39. package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/{16e57f67.3ea19e893461e611.js → 409f1e57.d0649fc47691ebfe.js} +1 -1
  41. package/apps/pwa/out/_next/static/chunks/{1146.80d15ea7c6e6ee95.js → 4111.2bfedbb233ad206b.js} +1 -1
  42. package/apps/pwa/out/_next/static/chunks/{1516.83dd2c1b86b4e507.js → 4174.92ed04922709ac9e.js} +2 -2
  43. package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +36 -0
  45. package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +286 -0
  49. package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +77 -0
  50. package/apps/pwa/out/_next/static/chunks/4745.67d6f99c245af3f7.js +226 -0
  51. package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/{9938.b23e4d4dfa0114cd.js → 4999.c064a4000c2a9e94.js} +2 -2
  53. package/apps/pwa/out/_next/static/chunks/5173-233188df2f42c626.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/{1157.f08bf2b70915e176.js → 5304.04d24756f242a094.js} +2 -2
  57. package/apps/pwa/out/_next/static/chunks/{7752.5cbdd0b433c54af9.js → 5307.60f2209e809bd627.js} +1 -1
  58. package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/{9917-9e26abc5f7772735.js → 5458-16cd7a2b51b74c8c.js} +1 -1
  60. package/apps/pwa/out/_next/static/chunks/{6196.34d6b229079e9e28.js → 5525.86debf231e181813.js} +1 -1
  61. package/apps/pwa/out/_next/static/chunks/{4593.10f5b9bd702d4a6c.js → 5543.a438b8ab5a13ea47.js} +1 -1
  62. package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +74 -0
  65. package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +94 -0
  67. package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{7483.ba01c6c209b81bba.js → 6092.a7f99e68b188ca66.js} +1 -1
  70. package/apps/pwa/out/_next/static/chunks/60fb96c9.360b01d8d4927b7b.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/{9974.e77b4ff4884557b3.js → 6157.0c9af021de4fb31b.js} +2 -2
  72. package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/{3309.364573ceedbdfd5f.js → 6323.8672b4817a306928.js} +1 -1
  74. package/apps/pwa/out/_next/static/chunks/{94.4cfed21c0b781a06.js → 6433.fc573af22bbc9ab7.js} +4 -4
  75. package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/{949.1e7d45ccb71580aa.js → 6517.4147878ac06d584d.js} +2 -2
  77. package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +32 -0
  78. package/apps/pwa/out/_next/static/chunks/6544cb48.a87fe20ddf137be2.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +104 -0
  80. package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/{2528.3868070ef1be69f9.js → 6767.ea607cf0c20a25af.js} +2 -2
  85. package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +93 -0
  86. package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7371.80c05c653b08e907.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7391.ebae168025c91b6a.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{1743.563d3168e95825ef.js → 7502.ccd5b8065545edd0.js} +2 -2
  93. package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +8 -0
  94. package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{5408.377c8c543635b81f.js → 7862.30a8d6482bb238eb.js} +1 -1
  96. package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/7947-d0759430f8042240.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/{65ebff95.081daeff622d238e.js → 7a1887c4.f36b88fba31da8fd.js} +1 -1
  99. package/apps/pwa/out/_next/static/chunks/{2697.76ca2ac3efef6f3b.js → 8018.a32663f04a6fc5f9.js} +1 -1
  100. package/apps/pwa/out/_next/static/chunks/8097-92f87bd108322f66.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/9002.e5658224e3dc1b6f.js +24 -0
  109. package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/9138.b6e80031afb1d973.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/{4204.a409ab6250c0f6a8.js → 9221.7d22eaf353a2d4e7.js} +1 -1
  113. package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/{5785-ea8d2c633b6688e3.js → 9279-d28c5b7754d010ae.js} +1 -1
  115. package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9398-6aed28f0a96d0d6f.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9407.e49124dedf0f5e72.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/997ce8a5-2ad501927003b41b.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{9311.24c8f5ea793253dd.js → 9989.3694300e5f000b14.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-bf3634a117322df7.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-3535a4a69f1fafaa.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-b9f51447f757fbf2.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-fa46d4588e8442c2.js → page-2ebb8fd59b9461f9.js} +1 -1
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-a2fc4e49a4fa4ba8.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-5a503541353e60a8.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-6025101384e361a5.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-f4b630cc8b5273cd.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-a645f00a06483e9a.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-61ac22cbab1ee4ec.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-e9bab7413b028b28.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-c992eafe028b642e.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-e547e6ce55f1fb33.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-d27e1b9850fd54bf.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-805ac2e137b7a121.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-0fec29c7ba01894b.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-339a07410cd6f36b.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/{page-ced0bcfc6542b3fc.js → page-349f2752d8cd37ad.js} +1 -1
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-d5c6dcf31c25cecc.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-2fd93ed8c9f16580.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-9b564dbff0fefc35.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-62f4475d3c38fb9b.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-814ba51385225776.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-397d479626e5a459.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-af1bba4e3251b728.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ad3be5e7d3fdce9.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-f219ccdbc0bf27df.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4da93ad35d4a8d28.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-456666766e5ce6fc.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-7404e377e8adb8c5.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-14456240ed2a36ad.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-3a658d5fa6d16a25.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-0157de6e85f8bb6b.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-cb249e81ed339318.js → page-0a07363b130182a1.js} +1 -1
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-841d73d4ac44ed49.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6f43a3d1146e6377.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-521ee23ac8c0abfa.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-a9992ee285efaa83.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-3d48e85fa89ec04f.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-d2ced71132fac9b2.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-f08358bdf251adb9.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-233c71cd5f68f0d7.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-70151d78de2f375e.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-dcac33a3e2cb72c0.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-149dc1caba411bb9.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0448145ccd5c45c1.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-9cb0c444903da65d.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-17e504c396e0e389.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{6def8a8e.c81f9ca41028eccf.js → b313b242.cb1265eea908db61.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/{e87d89b9.2e71c0ae475d28a1.js → e5012ffe.f727e23c231f4342.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/{e117f801.e92bf10242653497.js → ebc7d829.264a0bcb6c750b50.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +1 -0
  183. package/apps/pwa/out/_next/static/css/{72becfd42807b50d.css → 3f5fc6f96e2cf7b2.css} +1 -1
  184. package/apps/pwa/out/approvals/index.html +1 -1
  185. package/apps/pwa/out/approvals/index.txt +23 -23
  186. package/apps/pwa/out/autopilot/index.html +1 -1
  187. package/apps/pwa/out/autopilot/index.txt +23 -23
  188. package/apps/pwa/out/board/index.html +1 -1
  189. package/apps/pwa/out/board/index.txt +23 -23
  190. package/apps/pwa/out/botlab/index.html +1 -1
  191. package/apps/pwa/out/botlab/index.txt +22 -22
  192. package/apps/pwa/out/bots/index.html +1 -1
  193. package/apps/pwa/out/bots/index.txt +22 -22
  194. package/apps/pwa/out/ceo/index.html +1 -1
  195. package/apps/pwa/out/ceo/index.txt +23 -23
  196. package/apps/pwa/out/chat/index.html +1 -1
  197. package/apps/pwa/out/chat/index.txt +22 -22
  198. package/apps/pwa/out/consult/index.html +1 -1
  199. package/apps/pwa/out/consult/index.txt +23 -23
  200. package/apps/pwa/out/control/index.html +1 -1
  201. package/apps/pwa/out/control/index.txt +23 -23
  202. package/apps/pwa/out/decisions/index.html +1 -1
  203. package/apps/pwa/out/decisions/index.txt +22 -22
  204. package/apps/pwa/out/design-check/index.html +1 -1
  205. package/apps/pwa/out/design-check/index.txt +23 -23
  206. package/apps/pwa/out/editor/index.html +1 -1
  207. package/apps/pwa/out/editor/index.txt +23 -23
  208. package/apps/pwa/out/exec/index.html +1 -1
  209. package/apps/pwa/out/exec/index.txt +23 -23
  210. package/apps/pwa/out/field/index.html +1 -1
  211. package/apps/pwa/out/field/index.txt +23 -23
  212. package/apps/pwa/out/healthz +1 -1
  213. package/apps/pwa/out/index.html +1 -1
  214. package/apps/pwa/out/index.txt +22 -22
  215. package/apps/pwa/out/inside/index.html +1 -1
  216. package/apps/pwa/out/inside/index.txt +22 -22
  217. package/apps/pwa/out/intake/index.html +1 -1
  218. package/apps/pwa/out/intake/index.txt +23 -23
  219. package/apps/pwa/out/live/index.html +1 -1
  220. package/apps/pwa/out/live/index.txt +23 -23
  221. package/apps/pwa/out/live-run/index.html +1 -1
  222. package/apps/pwa/out/live-run/index.txt +23 -23
  223. package/apps/pwa/out/loops/index.html +1 -1
  224. package/apps/pwa/out/loops/index.txt +22 -22
  225. package/apps/pwa/out/market/index.html +1 -1
  226. package/apps/pwa/out/market/index.txt +22 -22
  227. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  228. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  229. package/apps/pwa/out/morning/index.html +1 -1
  230. package/apps/pwa/out/morning/index.txt +23 -23
  231. package/apps/pwa/out/observatory/index.html +1 -1
  232. package/apps/pwa/out/observatory/index.txt +23 -23
  233. package/apps/pwa/out/ops/checklist/index.html +1 -1
  234. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  235. package/apps/pwa/out/ops/release/index.html +1 -1
  236. package/apps/pwa/out/ops/release/index.txt +22 -22
  237. package/apps/pwa/out/ops/seats/index.html +1 -1
  238. package/apps/pwa/out/ops/seats/index.txt +22 -22
  239. package/apps/pwa/out/outputs/index.html +1 -1
  240. package/apps/pwa/out/outputs/index.txt +22 -22
  241. package/apps/pwa/out/reflection/index.html +1 -1
  242. package/apps/pwa/out/reflection/index.txt +23 -23
  243. package/apps/pwa/out/scheduler/index.html +1 -1
  244. package/apps/pwa/out/scheduler/index.txt +23 -23
  245. package/apps/pwa/out/sessions/index.html +1 -1
  246. package/apps/pwa/out/sessions/index.txt +22 -22
  247. package/apps/pwa/out/settings/devices/index.html +1 -1
  248. package/apps/pwa/out/settings/devices/index.txt +23 -23
  249. package/apps/pwa/out/settings/index.html +1 -1
  250. package/apps/pwa/out/settings/index.txt +23 -23
  251. package/apps/pwa/out/setup/done/index.html +1 -1
  252. package/apps/pwa/out/setup/done/index.txt +23 -23
  253. package/apps/pwa/out/setup/index.html +1 -1
  254. package/apps/pwa/out/setup/index.txt +23 -23
  255. package/apps/pwa/out/share/index.html +1 -1
  256. package/apps/pwa/out/share/index.txt +23 -23
  257. package/apps/pwa/out/showroom/index.html +1 -1
  258. package/apps/pwa/out/showroom/index.txt +22 -22
  259. package/apps/pwa/out/tasks/index.html +1 -1
  260. package/apps/pwa/out/tasks/index.txt +23 -23
  261. package/apps/pwa/out/term/index.html +1 -1
  262. package/apps/pwa/out/term/index.txt +23 -23
  263. package/apps/pwa/out/today/index.html +1 -1
  264. package/apps/pwa/out/today/index.txt +23 -23
  265. package/apps/pwa/out/trace/index.html +1 -1
  266. package/apps/pwa/out/trace/index.txt +23 -23
  267. package/apps/pwa/out/vault/index.html +1 -1
  268. package/apps/pwa/out/vault/index.txt +23 -23
  269. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  270. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  271. package/apps/pwa/out/workflows/index.html +1 -1
  272. package/apps/pwa/out/workflows/index.txt +23 -23
  273. package/apps/pwa/out/workspace/index.html +1 -1
  274. package/apps/pwa/out/workspace/index.txt +23 -23
  275. package/apps/pwa/out/worktrees/index.html +1 -1
  276. package/apps/pwa/out/worktrees/index.txt +23 -23
  277. package/bin/elanous.mjs +7 -3
  278. package/graphs/context/nightly-condense.yaml +1 -0
  279. package/graphs/intake/intake-daily.yaml +8 -1
  280. package/graphs/intake/recipes.yaml +5 -0
  281. package/graphs/lecture/lecture-note.yaml +2 -2
  282. package/graphs/ops/harness-gc.yaml +1 -0
  283. package/graphs/release/recipes.yaml +3 -0
  284. package/graphs/release/release-loop.yaml +15 -7
  285. package/graphs/units/recipes.yaml +3 -0
  286. package/graphs/units/release-gate-recheck.yaml +15 -0
  287. package/package.json +2 -1
  288. package/plugins/agent-team/agents/research.md +1 -0
  289. package/scripts/check-native-tool-wiring.ts +3 -2
  290. package/scripts/ci-android-unit-tests.ts +16 -0
  291. package/scripts/ci-typecheck-changed.ts +40 -11
  292. package/scripts/coord-channel-watch.sh +45 -19
  293. package/scripts/coord-role-pack.ts +222 -0
  294. package/scripts/cron-run.ts +96 -3
  295. package/scripts/detect-test-interference.ts +38 -5
  296. package/scripts/gate-pr-cache.ts +65 -0
  297. package/scripts/gh-surface/capture.ts +126 -0
  298. package/scripts/gh-surface/gh +40 -0
  299. package/scripts/import-graph-scc.ts +38 -0
  300. package/scripts/install.ps1 +19 -0
  301. package/scripts/intake-social.ts +181 -0
  302. package/scripts/lecture-note/node.ts +71 -4
  303. package/scripts/lib/android-toolchain.ts +32 -0
  304. package/scripts/lib/deterministic-env.ts +62 -0
  305. package/scripts/lib/gate-test-env.ts +19 -0
  306. package/scripts/lib/morning-report-options.ts +41 -0
  307. package/scripts/measure-goal-grounding-corpus.ts +2 -1
  308. package/scripts/pr-land-extra-remote-gates.ts +49 -0
  309. package/scripts/ratchets/test-interference-patterns.allowlist.txt +257 -0
  310. package/scripts/ratchets/test-interference-patterns.ts +367 -0
  311. package/scripts/release-loop/cut-branch.ts +4 -3
  312. package/scripts/release-loop/export-check-node.ts +0 -1
  313. package/scripts/release-loop/fixtures/warm-failure-assertion/sample.junit.xml +8 -0
  314. package/scripts/release-loop/fixtures/warm-job-029/sample.json +1 -0
  315. package/scripts/release-loop/fixtures/warm-job-029/sample.junit.xml +10 -0
  316. package/scripts/release-loop/gate-batch-safe.ts +23 -0
  317. package/scripts/release-loop/gate-closure.ts +12 -8
  318. package/scripts/release-loop/gate-diff.ts +1 -1
  319. package/scripts/release-loop/gate-history.ts +422 -0
  320. package/scripts/release-loop/gate-host-mirror.ts +66 -0
  321. package/scripts/release-loop/gate-node.ts +806 -94
  322. package/scripts/release-loop/gate-partial.ts +106 -9
  323. package/scripts/release-loop/gate-pr-cache.ts +66 -0
  324. package/scripts/release-loop/gate-prewarm-plan.ts +66 -0
  325. package/scripts/release-loop/gate-r2-verdict.ts +189 -0
  326. package/scripts/release-loop/gate-recheck-plan-node.ts +52 -0
  327. package/scripts/release-loop/gate-triage-node.ts +190 -0
  328. package/scripts/release-loop/gate-warm-artifacts.ts +253 -0
  329. package/scripts/release-loop/import-graph-scc-run.ts +54 -0
  330. package/scripts/release-loop/import-graph-scc.ts +215 -0
  331. package/scripts/release-loop/node-verdict.ts +2 -0
  332. package/scripts/release-loop/probe-pod-host-dirs-live.ts +113 -0
  333. package/scripts/release-loop/resume-release.ts +33 -4
  334. package/scripts/release-loop/resume.ts +13 -5
  335. package/scripts/release-loop/spawn-lane.ts +51 -0
  336. package/scripts/release-loop/tui-node-checks.ts +23 -0
  337. package/scripts/release-loop/tui-sim-node.ts +3 -2
  338. package/scripts/release-loop/unattended-release.ts +16 -0
  339. package/scripts/release-loop/version-node.ts +62 -4
  340. package/scripts/test-deterministic.ts +46 -73
  341. package/scripts/train-reach-grouping.ts +48 -0
  342. package/scripts/tsc-incremental-cache.ts +86 -0
  343. package/scripts/tsc-incremental-diagnostics.ts +76 -0
  344. package/scripts/tsc-main-safety-net.ts +2 -2
  345. package/scripts/usage-rollup.ts +11 -3
  346. package/src/acp/client.ts +4 -1
  347. package/src/acp/core-turn-bridge.ts +145 -24
  348. package/src/acp/elanous-extensions.ts +2 -0
  349. package/src/acp/server.ts +2 -0
  350. package/src/ad-pipeline/run.ts +4 -2
  351. package/src/agent/ref-grounding.ts +18 -0
  352. package/src/agent/runner.ts +169 -3
  353. package/src/agent/subagent-callable.ts +3 -2
  354. package/src/agent-mission/review-loop.ts +6 -3
  355. package/src/agent-substrate/acp-implementer.ts +14 -2
  356. package/src/agent-substrate/pr-reviewer.ts +41 -21
  357. package/src/agent-substrate/self-review-cli.ts +30 -4
  358. package/src/autopilot/pr-manager.ts +62 -7
  359. package/src/briefing/brief-items.ts +24 -22
  360. package/src/budget/pty-usage-reemit.ts +7 -0
  361. package/src/budget/run-usage-rollup.ts +9 -0
  362. package/src/budget/usage-daily-store.ts +98 -0
  363. package/src/capture/tui-self-report.ts +37 -4
  364. package/src/chat/chat-cli.ts +10 -2
  365. package/src/chat/index.ts +107 -20
  366. package/src/chat/input-control-key.ts +5 -3
  367. package/src/chat/pickers/modal-runtime.ts +1 -0
  368. package/src/chat/pickers/modals.ts +3 -1
  369. package/src/chat/tool-interrupt-behavior.ts +38 -0
  370. package/src/chat/tool-render/dispatch.ts +5 -1
  371. package/src/chat/turn-typeahead.ts +191 -29
  372. package/src/cli/__fixtures__/agent-help-before/agent.txt +4 -2
  373. package/src/cli/agent-cli.ts +41 -13
  374. package/src/cli/config-audit.ts +123 -0
  375. package/src/cli/dashboard-name-flag.ts +48 -0
  376. package/src/cli/decisions-cli.ts +80 -6
  377. package/src/cli/doctor-cli.ts +80 -0
  378. package/src/cli/log-event-names.ts +19 -0
  379. package/src/cli/mcp-login.ts +21 -5
  380. package/src/cli/msg-cli.ts +133 -2
  381. package/src/cli/pr-cli.ts +546 -112
  382. package/src/cli/pr-land-heavy-remote.ts +233 -0
  383. package/src/cli/pr-land-overlap-evidence.ts +167 -14
  384. package/src/cli/pr-land-pod-shadow-job.ts +83 -0
  385. package/src/cli/pr-land-pod-shadow.ts +16 -3
  386. package/src/cli/pr-land-virtual-rebase.ts +108 -0
  387. package/src/cli/pty-takeover-cli.ts +125 -16
  388. package/src/cli/release-cli.ts +122 -14
  389. package/src/cli/remote-resolve.ts +2 -1
  390. package/src/cli/seat-cli.ts +164 -19
  391. package/src/cli/self-update.ts +5 -2
  392. package/src/cli/tasks-cli.ts +105 -21
  393. package/src/cli/usage-cli.ts +146 -12
  394. package/src/cli/usage-daily-cli.ts +84 -0
  395. package/src/context-bus/context-first.ts +13 -0
  396. package/src/context-bus/context-now.ts +95 -7
  397. package/src/context-bus/ops-events.ts +75 -0
  398. package/src/control-plane/lease-holder.ts +12 -8
  399. package/src/control-plane/ledger.ts +163 -4
  400. package/src/control-plane/server.ts +91 -11
  401. package/src/core-turn/auth-rejected-notice.ts +41 -0
  402. package/src/core-turn/run-core-turn.ts +14 -2
  403. package/src/core-turn/run-goal-loop.ts +239 -4
  404. package/src/core-turn/seat-turn-cap.ts +79 -0
  405. package/src/core-turn/short-question.ts +78 -13
  406. package/src/core-turn/types.ts +10 -0
  407. package/src/dashboard/acp-active-model.ts +40 -0
  408. package/src/dashboard/acp-boot.ts +3 -0
  409. package/src/dashboard/auto-compact-runtime.ts +2 -0
  410. package/src/dashboard/boot-banner.ts +80 -0
  411. package/src/dashboard/dashboard-status-lines.ts +11 -0
  412. package/src/dashboard/detail-viewer-runtime.ts +15 -2
  413. package/src/dashboard/event-loop-stall-monitor.ts +4 -0
  414. package/src/dashboard/goal-loop-thinking.ts +16 -0
  415. package/src/dashboard/hitl-boot.ts +9 -4
  416. package/src/dashboard/index.ts +448 -998
  417. package/src/dashboard/input/chat-main-entry-runtime.ts +2 -0
  418. package/src/dashboard/input/chat-main-log-actions.ts +4 -0
  419. package/src/dashboard/input/chat-main-log-command.ts +12 -1
  420. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +176 -4
  421. package/src/dashboard/input/chat-main-session.ts +14 -3
  422. package/src/dashboard/input/chat-main-slash-command.ts +7 -0
  423. package/src/dashboard/input/chat-main-turn.ts +14 -4
  424. package/src/dashboard/input/compact-prepass-recovery.ts +130 -0
  425. package/src/dashboard/input/dashboard-chord-actions.ts +10 -1
  426. package/src/dashboard/input/dashboard-chord-runtime.ts +2 -0
  427. package/src/dashboard/input/external-input-host.ts +71 -0
  428. package/src/dashboard/input/internal-turn.ts +261 -0
  429. package/src/dashboard/input/log-fold-binding.ts +18 -0
  430. package/src/dashboard/input/mouse-wiring.ts +17 -4
  431. package/src/dashboard/input/seat-autowake.ts +318 -0
  432. package/src/dashboard/input/turn-steer-bridge.ts +164 -0
  433. package/src/dashboard/log-click-runtime.ts +5 -3
  434. package/src/dashboard/loop-scheduler.ts +72 -0
  435. package/src/dashboard/running-build-status.ts +74 -0
  436. package/src/dashboard/seat-boot-preamble.ts +131 -0
  437. package/src/dashboard/seat-local-instructions.ts +305 -0
  438. package/src/dashboard/skill-runtime.ts +2 -0
  439. package/src/dashboard/slash-runtime/dashboard-handlers.ts +220 -1203
  440. package/src/dashboard/slash-runtime/help-from-registry.ts +2 -1
  441. package/src/dashboard/slash-runtime/index.ts +13 -0
  442. package/src/dashboard/slash-runtime/model-choices.ts +35 -0
  443. package/src/dashboard/term-slash-runtime.ts +15 -0
  444. package/src/dashboard/turn-busy-teardown.ts +50 -0
  445. package/src/dashboard/turn-preamble.ts +30 -2
  446. package/src/dashboard/turn-session-layers.ts +176 -0
  447. package/src/dashboard/turn-stream-formatter.ts +14 -6
  448. package/src/dashboard/turn-stream-presentation-applier.ts +8 -0
  449. package/src/decisions/decision-ledger.ts +45 -4
  450. package/src/discord-self-message.ts +4 -4
  451. package/src/domains/release-tool.ts +26 -10
  452. package/src/domains/surface-events.ts +4 -1
  453. package/src/domains/watch-default-scheduler.ts +8 -9
  454. package/src/field-note/transcribe.ts +17 -0
  455. package/src/fold-stack.ts +24 -1
  456. package/src/git-fs/dirty.ts +32 -4
  457. package/src/git-fs/index.ts +43 -1
  458. package/src/github/remote-call.ts +81 -0
  459. package/src/goals/registry.ts +46 -6
  460. package/src/goals/types.ts +7 -1
  461. package/src/graph-runner/runner.ts +2 -0
  462. package/src/grok/credential.ts +26 -0
  463. package/src/harness/harness-clean.ts +2 -1
  464. package/src/harness/harness-cli-command.ts +52 -5
  465. package/src/harness/harness-gc.ts +34 -6
  466. package/src/harness/harness-incidents.ts +57 -20
  467. package/src/harness/harness-pod-dispatch.ts +87 -10
  468. package/src/harness/harness-queue.ts +53 -4
  469. package/src/harness/harness-stop.ts +4 -3
  470. package/src/harness/harness-substrate-default.ts +78 -7
  471. package/src/harness/harness-worktree-auto.ts +2 -1
  472. package/src/harness/harness-worktrees.ts +3 -2
  473. package/src/hooks/dispatch.ts +2 -1
  474. package/src/index.ts +166 -26
  475. package/src/input/external-input-queue.ts +251 -0
  476. package/src/intake-plane/slash.ts +14 -3
  477. package/src/interactive-terminal-modal.ts +13 -0
  478. package/src/keybindings.ts +4 -1
  479. package/src/llm/route-decision.ts +25 -0
  480. package/src/llm/tool-loop-steered-rejection.ts +33 -0
  481. package/src/llm-stream-retry-display.ts +59 -0
  482. package/src/llm.ts +391 -74
  483. package/src/log-entry.ts +3 -3
  484. package/src/log-pane/search.ts +29 -4
  485. package/src/loops/agent-reply.ts +256 -0
  486. package/src/loops/budget.ts +37 -7
  487. package/src/loops/consensus.ts +348 -0
  488. package/src/loops/loop-cli.ts +3 -2
  489. package/src/loops/msg-address.ts +57 -0
  490. package/src/loops/msg-wake.ts +484 -0
  491. package/src/loops/observe.ts +19 -3
  492. package/src/loops/orchestrator/inbox.ts +60 -3
  493. package/src/loops/orchestrator/tick.ts +80 -6
  494. package/src/loops/orchestrator/traffic.ts +64 -1
  495. package/src/loops/registry.ts +72 -4
  496. package/src/market/signed-index.ts +14 -0
  497. package/src/mcp/mcp-oauth.ts +54 -5
  498. package/src/memory.ts +20 -5
  499. package/src/models/prompts.ts +28 -0
  500. package/src/msg/msg-sse-client.ts +223 -0
  501. package/src/msg/msg-store.ts +86 -2
  502. package/src/mss/logging/log-store.ts +225 -1
  503. package/src/native-tool-catalog.ts +125 -0
  504. package/src/nexus/DAEMON-THIN-inventory-2026-10-15.md +122 -0
  505. package/src/nexus/api/http-server.ts +59 -15
  506. package/src/nexus/api/loop-resources.ts +19 -3
  507. package/src/nexus/api/ops-api.ts +13 -0
  508. package/src/nexus/api/project-autopsy.ts +127 -0
  509. package/src/nexus/api/terminals.ts +3 -0
  510. package/src/nexus/api/workflow-approvals.ts +2 -0
  511. package/src/nexus/daemon-thin-inventory.md +37 -0
  512. package/src/nexus/index.ts +70 -0
  513. package/src/nexus/onboarding/first-boot-wizard.ts +56 -2
  514. package/src/nexus/state/state.ts +1 -0
  515. package/src/oauth/codex-account-store.ts +15 -3
  516. package/src/oauth/codex-billing-route.ts +31 -0
  517. package/src/oauth/store.ts +32 -7
  518. package/src/onboarding/first-run.ts +28 -3
  519. package/src/ops/overview-cache.ts +16 -4
  520. package/src/ops/overview-collect.ts +19 -2
  521. package/src/ops/resources.ts +82 -0
  522. package/src/panes/log-pane.ts +67 -8
  523. package/src/persona/presets.ts +44 -0
  524. package/src/plugins/maker/connector-maker.ts +41 -0
  525. package/src/plugins/maker/skill-maker.ts +42 -0
  526. package/src/plugins/maker/wizard-generate.ts +6 -4
  527. package/src/pr-tool/census.ts +288 -0
  528. package/src/preview/terminal.ts +14 -1
  529. package/src/prompt-cache/types.ts +2 -0
  530. package/src/prompt-enhance/enhance.ts +24 -8
  531. package/src/prompt-library/chat-conciseness.ts +13 -0
  532. package/src/prompt-library/universal-preamble.ts +283 -61
  533. package/src/pty-shell/pty-control-ipc.ts +4 -1
  534. package/src/pty-shell/pty-manifest.ts +77 -5
  535. package/src/pty-shell/registry.ts +19 -2
  536. package/src/pty-shell/tui-run-state.ts +253 -0
  537. package/src/release-loop/gate-host-reservation.ts +97 -0
  538. package/src/release-loop/landing-freeze.ts +5 -0
  539. package/src/release-loop/light-rc.ts +32 -4
  540. package/src/release-loop/placement.ts +92 -1
  541. package/src/release-loop/rehearsal-shard-plan.ts +149 -0
  542. package/src/release-loop/rehearsal.ts +73 -17
  543. package/src/render.ts +5 -1
  544. package/src/repl/index.ts +20 -2
  545. package/src/seat-loop/seat-knowhow.ts +282 -0
  546. package/src/seat-loop/seat-loop.ts +41 -2
  547. package/src/seat-loop/seat-report.ts +42 -2
  548. package/src/seat-loop/traffic-signal.ts +3 -0
  549. package/src/self-dev/ask-launch-flow.ts +24 -3
  550. package/src/self-dev/decompose-compose-graph.ts +28 -27
  551. package/src/self-dev/decompose-proposal.ts +53 -38
  552. package/src/self-dev/decompose.ts +17 -0
  553. package/src/self-dev/dev-pipeline.ts +31 -2
  554. package/src/self-dev/draft-residue.ts +24 -9
  555. package/src/self-dev/draft-sweep.ts +59 -4
  556. package/src/self-dev/external-call-zero.ts +77 -0
  557. package/src/self-dev/launch-preflight-text.ts +6 -0
  558. package/src/self-dev/launch-preflight.ts +25 -3
  559. package/src/self-dev/local-supervisor-judge.ts +185 -0
  560. package/src/self-dev/run-supervisor.ts +300 -24
  561. package/src/self-dev/run-types.ts +20 -0
  562. package/src/self-dev/shard-aggregate.ts +15 -2
  563. package/src/self-dev/shard-plan.ts +47 -0
  564. package/src/self-dev/shard-run.ts +135 -12
  565. package/src/self-dev/spawn-lane-files.ts +19 -0
  566. package/src/self-health/signatures.ts +132 -0
  567. package/src/self-implement/app-api-budget.ts +51 -11
  568. package/src/self-implement/config-gate.ts +2 -1
  569. package/src/self-implement/doctor-visit.ts +118 -0
  570. package/src/self-implement/expose-gate.ts +2 -1
  571. package/src/self-implement/gate-artifacts.ts +405 -0
  572. package/src/self-implement/gate-cli.ts +212 -18
  573. package/src/self-implement/gate-remote.ts +110 -25
  574. package/src/self-implement/gate-scenario.ts +85 -0
  575. package/src/self-implement/goal-author-decompose.ts +80 -16
  576. package/src/self-implement/goal-author.ts +270 -76
  577. package/src/self-implement/goal-authoring-grounding.ts +1 -1
  578. package/src/self-implement/goal-file-name.ts +65 -0
  579. package/src/self-implement/graph-authority.ts +38 -6
  580. package/src/self-implement/graph-overlay-condition.ts +92 -1
  581. package/src/self-implement/ground-goal.ts +2 -1
  582. package/src/self-implement/heal-triage.ts +79 -0
  583. package/src/self-implement/host-regate.ts +74 -2
  584. package/src/self-implement/orchestrator.ts +14 -123
  585. package/src/self-implement/pr-title.ts +123 -0
  586. package/src/self-implement/review-mustfix-class.ts +115 -0
  587. package/src/self-implement/run-checkpoint.ts +235 -0
  588. package/src/self-implement/run-ledger.ts +266 -17
  589. package/src/self-implement/run-stop.ts +4 -3
  590. package/src/self-implement/run-ttl.ts +28 -4
  591. package/src/self-implement/running-runs.ts +10 -6
  592. package/src/self-implement/seams.ts +2 -0
  593. package/src/self-implement/self-implement-runtime.ts +32 -0
  594. package/src/self-implement/shadow-stage.ts +7 -6
  595. package/src/self-implement/stop-autoheal.ts +2 -1
  596. package/src/self-implement/train-gate-remote.ts +37 -8
  597. package/src/self-implement/train-reach-grouping.ts +157 -0
  598. package/src/self-implement/train-scenario-layers.ts +133 -0
  599. package/src/self-implement/uncommitted-work.ts +2 -0
  600. package/src/session/pending-input.ts +81 -11
  601. package/src/session/session-start.ts +224 -0
  602. package/src/session-runtime/index.ts +7 -1
  603. package/src/session-runtime/parallel-dispatch.ts +22 -5
  604. package/src/skills/tools/dev-harness.ts +6 -4
  605. package/src/skills/tools/ops-ledger.ts +707 -0
  606. package/src/skills/tools/persistent-grounding.ts +47 -7
  607. package/src/skills/tools/shell.ts +117 -1
  608. package/src/status/bar.ts +32 -2
  609. package/src/status/status-provider-info.ts +58 -0
  610. package/src/steward/resync-tick.ts +114 -23
  611. package/src/steward/ta-repair-event-collect.ts +158 -0
  612. package/src/task-agent/card-evidence.ts +25 -1
  613. package/src/task-agent/green-sweep.ts +8 -3
  614. package/src/task-agent/judge.ts +76 -0
  615. package/src/task-agent/land-queue.ts +79 -0
  616. package/src/task-agent/live-moves.ts +30 -9
  617. package/src/task-agent/postland-card.ts +5 -0
  618. package/src/task-agent/prelaunch-already-done.ts +98 -0
  619. package/src/task-agent/real-launch-guard.ts +37 -0
  620. package/src/task-agent/rejudge-on-head.ts +93 -13
  621. package/src/task-agent/remote-rejudge-bind.ts +62 -13
  622. package/src/task-agent/repair-cycle.ts +58 -7
  623. package/src/task-agent/repair-worker.ts +7 -0
  624. package/src/task-agent/run-identity.ts +200 -0
  625. package/src/task-agent/shadow.ts +50 -3
  626. package/src/task-agent/task-hand.ts +158 -5
  627. package/src/task-agent/train-landing.ts +77 -0
  628. package/src/task-agent/work-order.ts +104 -0
  629. package/src/task-orchestrator/surfaces/kubectl-transient-retry.ts +51 -0
  630. package/src/task-orchestrator/surfaces/pod-command-job.ts +138 -22
  631. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +88 -19
  632. package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +2 -1
  633. package/src/task-orchestrator/surfaces/pod-image-source.ts +2 -1
  634. package/src/task-orchestrator/surfaces/pod-install-slots.ts +122 -15
  635. package/src/task-orchestrator/surfaces/pod-lease.ts +20 -6
  636. package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +169 -0
  637. package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +103 -0
  638. package/src/task-orchestrator/surfaces/pod-result-marker-wait.ts +33 -0
  639. package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +63 -0
  640. package/src/task-orchestrator/surfaces/pod-source-receive.ts +19 -3
  641. package/src/task-orchestrator/surfaces/pod-warm-switch.ts +141 -0
  642. package/src/task-orchestrator/surfaces/pod-warm-ta-shadow.ts +85 -0
  643. package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +153 -0
  644. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +208 -0
  645. package/src/task-orchestrator/surfaces/self-implement-pod.ts +237 -46
  646. package/src/telegram.ts +2 -4
  647. package/src/terminal/session-registry.ts +6 -0
  648. package/src/thinking-line.ts +12 -3
  649. package/src/tool-runtime/index.ts +4 -0
  650. package/src/tool-runtime/ops-ledger-runtimes.ts +84 -0
  651. package/src/tool-runtime/ref-consult-runtime.ts +17 -2
  652. package/src/tool-runtime/run-shell-runtime.ts +4 -1
  653. package/src/tool-runtime/self-cognition-runtimes.ts +5 -1
  654. package/src/tui/input/pickers.ts +732 -0
  655. package/src/tui/slash/mission.ts +492 -0
  656. package/src/tui/slash/term.ts +877 -0
  657. package/src/tui-client/dashboard-session.ts +9 -0
  658. package/src/tui.ts +53 -0
  659. package/src/user-config/gemini-server-tools.ts +9 -0
  660. package/src/user-config.ts +106 -21
  661. package/src/util/spawn-sync-output.ts +7 -0
  662. package/src/ux-sim/fake-bin.ts +154 -0
  663. package/src/ux-sim/fake-clock.ts +36 -0
  664. package/src/ux-sim/fake-llm.ts +29 -0
  665. package/src/ux-sim/headless-tui.ts +72 -0
  666. package/src/ux-sim/in-process-cli.ts +176 -0
  667. package/src/ux-sim/temp-git-remote.ts +82 -0
  668. package/src/version/packed-revision.json +1 -1
  669. package/src/video-pipeline/recipes/vlog.ts +25 -7
  670. package/apps/pwa/out/_next/static/chunks/1027.a0f04663d24c2779.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/1038.676007ae505822e7.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/1113.a37eadf7f740d955.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/112-fa7c526c20ce1405.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/1144.5fa1fa1d48dbcd12.js +0 -36
  675. package/apps/pwa/out/_next/static/chunks/119b405e.8fdd0e44d1ff37aa.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/1296.04560d98e73fbf51.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/1314-f604ba013ec535b0.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/1454-29d1d773d5996a49.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/1464.f3209af0d8ae4ff2.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/1729-d73dd25e564679d4.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/1843.5924c24295243261.js +0 -27
  682. package/apps/pwa/out/_next/static/chunks/1987.e28149724b92918b.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/2066-5ca18ffa5a4be68b.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/2240.d10a66695155fd93.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/2391.e2cbc98d4abbb41a.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/2566-734cb83bbd405886.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/275.0e6bad414729bfa0.js +0 -32
  688. package/apps/pwa/out/_next/static/chunks/2803-33bdae771855a8d1.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/3259-86f3be56e43eaf6a.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/3280-e177c33bfbdcfb0a.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/3294-2b6a6d45a46a6c1c.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/3522.758840fc5e7fe630.js +0 -287
  693. package/apps/pwa/out/_next/static/chunks/3525-a7c989c1a661e880.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/3694.b1a66387756458c0.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/370.124f9e678a76fc01.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/3797-9643105335e660fe.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/4084.15ecaf4240bd9e77.js +0 -286
  698. package/apps/pwa/out/_next/static/chunks/4089-b3382b8843114eee.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/4293.928a8d573c16aab7.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/4402.f9238a3b18a7bd43.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/4490-9b090b0f9427f902.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/4548.13502d0ca3b4f862.js +0 -8
  703. package/apps/pwa/out/_next/static/chunks/4565-67e4c620597965c8.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/4599-548bc96cda44a5a7.js +0 -1
  705. package/apps/pwa/out/_next/static/chunks/4625.206574e33a9e7ae8.js +0 -104
  706. package/apps/pwa/out/_next/static/chunks/4862-392c9a71f0d8dfb4.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/5054.2906d1b02542edc5.js +0 -149
  708. package/apps/pwa/out/_next/static/chunks/5102-c822bbbee5a022a4.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/5194-8c93f2e7e4b6f717.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/5305-bacd7eca0b9a5848.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/5311.9071ee3f44fd7ff5.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/5369.9f34353442daa421.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/589-49d730cb8138b397.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/5904-264a6412ae3c9028.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/5980.728531d5c566535c.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/599-56f2c0a5cc4a7295.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/6011.f525002e21bef0ac.js +0 -23
  718. package/apps/pwa/out/_next/static/chunks/6132.4381ab93683f1acf.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/6149.2e698635e454d8f6.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/6356-0afafc4230cf9767.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/6406.64756073f7df35b8.js +0 -77
  722. package/apps/pwa/out/_next/static/chunks/6479-16e62aedafa0e310.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/6599.b5246b46a2453329.js +0 -64
  724. package/apps/pwa/out/_next/static/chunks/6610.5c26eec011565acb.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/666.37d18474edc1c552.js +0 -2
  726. package/apps/pwa/out/_next/static/chunks/6904.a0b5b1ed4f2d2c20.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/7247-1f4aba94aba50d9f.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/7274-e71a7c5b7760cd02.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/7290.1fcaeef3adb5d0d4.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/7477-2c64e42760f82f33.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/7505-47002b76ff1aef6c.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/7600-11884ca4da68e5d9.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/7607.40d8bb3689697ccb.js +0 -62
  734. package/apps/pwa/out/_next/static/chunks/7763.f51fcc19ca1414ec.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/7785.846140c859b1adf6.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/7807-a0fdac6393e0bf36.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/7837-20a63b4b7e9342b1.js +0 -1
  738. package/apps/pwa/out/_next/static/chunks/800.7815414cf280545d.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/8085-1e5fce59500a2cc2.js +0 -1
  740. package/apps/pwa/out/_next/static/chunks/8100.415f2105faa63e97.js +0 -1
  741. package/apps/pwa/out/_next/static/chunks/8290.701aa42ed13aa767.js +0 -226
  742. package/apps/pwa/out/_next/static/chunks/83a80514-b897b64df43ce108.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/8444.d9c74214a3145a43.js +0 -93
  744. package/apps/pwa/out/_next/static/chunks/8569.98c915534928c7f9.js +0 -24
  745. package/apps/pwa/out/_next/static/chunks/8591.b1c7f876e5ec7cfb.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/8715-f63756021d3ab989.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/8879.776c2ec7732aa114.js +0 -115
  748. package/apps/pwa/out/_next/static/chunks/8881.ddca15b3c82c490c.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/8946.5da5c87f32a2e1a8.js +0 -41
  750. package/apps/pwa/out/_next/static/chunks/9117.080b9b75be90e14d.js +0 -74
  751. package/apps/pwa/out/_next/static/chunks/9167.f3ecb28f367d6e69.js +0 -94
  752. package/apps/pwa/out/_next/static/chunks/9224.66095370ee28c93b.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/9238-0682b013c83d6449.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/9449.d3ed795da4befb1c.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/9638-d268329f2c6f4f8d.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/973cbf1b.3bbcf2b41548eca7.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/9842-d6644eb53d3dc6bf.js +0 -1
  758. package/apps/pwa/out/_next/static/chunks/9863.94ca3263e760696e.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d9babd8795f396a5.js +0 -1
  760. package/apps/pwa/out/_next/static/chunks/app/approvals/page-5ab1e47978577c5e.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-24453f6a302816b4.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/app/board/page-6c131d30bb1cf871.js +0 -1
  763. package/apps/pwa/out/_next/static/chunks/app/bots/page-dc0772b11861af51.js +0 -1
  764. package/apps/pwa/out/_next/static/chunks/app/ceo/page-66ad46ed0279feb9.js +0 -1
  765. package/apps/pwa/out/_next/static/chunks/app/chat/page-5159dc8752c6cd29.js +0 -1
  766. package/apps/pwa/out/_next/static/chunks/app/consult/page-c5a2478861c08b87.js +0 -1
  767. package/apps/pwa/out/_next/static/chunks/app/control/page-f722a9dec084e08b.js +0 -1
  768. package/apps/pwa/out/_next/static/chunks/app/decisions/page-256ffd365d32e100.js +0 -1
  769. package/apps/pwa/out/_next/static/chunks/app/design-check/page-e0de78ae7b99f01c.js +0 -1
  770. package/apps/pwa/out/_next/static/chunks/app/editor/page-cfbdc44b708d9801.js +0 -1
  771. package/apps/pwa/out/_next/static/chunks/app/exec/page-4c741eb760f2f77c.js +0 -1
  772. package/apps/pwa/out/_next/static/chunks/app/field/page-e9ba98f5f1440a21.js +0 -1
  773. package/apps/pwa/out/_next/static/chunks/app/healthz/route-d9babd8795f396a5.js +0 -1
  774. package/apps/pwa/out/_next/static/chunks/app/inside/page-dafc901bb1b72b5f.js +0 -1
  775. package/apps/pwa/out/_next/static/chunks/app/intake/page-2f6f303fa114ec24.js +0 -1
  776. package/apps/pwa/out/_next/static/chunks/app/layout-1634081c5272006c.js +0 -1
  777. package/apps/pwa/out/_next/static/chunks/app/live-run/page-bb1f05cd51c38944.js +0 -1
  778. package/apps/pwa/out/_next/static/chunks/app/loops/page-646b50f63b6fe732.js +0 -1
  779. package/apps/pwa/out/_next/static/chunks/app/market/page-db069b48a59c8c00.js +0 -1
  780. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-f736324afa2117c1.js +0 -1
  781. package/apps/pwa/out/_next/static/chunks/app/morning/page-6f131b51193a36f9.js +0 -1
  782. package/apps/pwa/out/_next/static/chunks/app/not-found-435f5e2faf02bc01.js +0 -1
  783. package/apps/pwa/out/_next/static/chunks/app/observatory/page-497e0eedf20e7890.js +0 -1
  784. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-a8d28fdf995e16ea.js +0 -1
  785. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-8966452228753c5e.js +0 -1
  786. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fd5d18656cb432b6.js +0 -1
  787. package/apps/pwa/out/_next/static/chunks/app/outputs/page-5663779cb1a37609.js +0 -1
  788. package/apps/pwa/out/_next/static/chunks/app/page-66a67eb19ebd976b.js +0 -1
  789. package/apps/pwa/out/_next/static/chunks/app/reflection/page-3b492aa78cf3c4a6.js +0 -1
  790. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c71267e7681da982.js +0 -1
  791. package/apps/pwa/out/_next/static/chunks/app/sessions/page-a21d1e1797172692.js +0 -1
  792. package/apps/pwa/out/_next/static/chunks/app/settings/page-781cfc5114e097da.js +0 -1
  793. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-478157214db6a023.js +0 -1
  794. package/apps/pwa/out/_next/static/chunks/app/setup/layout-d9babd8795f396a5.js +0 -1
  795. package/apps/pwa/out/_next/static/chunks/app/setup/page-86141f12cf090b7f.js +0 -1
  796. package/apps/pwa/out/_next/static/chunks/app/share/page-7256c73bb1c36751.js +0 -1
  797. package/apps/pwa/out/_next/static/chunks/app/showroom/page-5c738ca7adef3de5.js +0 -1
  798. package/apps/pwa/out/_next/static/chunks/app/tasks/page-0138c8091ec17224.js +0 -1
  799. package/apps/pwa/out/_next/static/chunks/app/term/page-cc2f24f16d85e735.js +0 -1
  800. package/apps/pwa/out/_next/static/chunks/app/today/page-979d318a534e92da.js +0 -1
  801. package/apps/pwa/out/_next/static/chunks/app/trace/page-182d394f7e6e096b.js +0 -1
  802. package/apps/pwa/out/_next/static/chunks/app/vault/page-21050928a697ed7a.js +0 -1
  803. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-44b9d807005a9030.js +0 -1
  804. package/apps/pwa/out/_next/static/chunks/app/workflows/page-601fb77340e63c9a.js +0 -1
  805. package/apps/pwa/out/_next/static/chunks/app/workspace/page-75d3fb5d47af0edf.js +0 -1
  806. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-11bf9e5725a72c22.js +0 -1
  807. package/apps/pwa/out/_next/static/chunks/dcf24383-2f82e35f2d827393.js +0 -1
  808. package/apps/pwa/out/_next/static/chunks/framework-bf135b997155e90e.js +0 -1
  809. package/apps/pwa/out/_next/static/chunks/main-5571537543bea91c.js +0 -1
  810. package/apps/pwa/out/_next/static/chunks/main-app-25c51c7df7f3a442.js +0 -1
  811. package/apps/pwa/out/_next/static/chunks/pages/_app-e3b2c1f5d82abd65.js +0 -1
  812. package/apps/pwa/out/_next/static/chunks/pages/_error-083f2e23e9bc3641.js +0 -1
  813. package/apps/pwa/out/_next/static/chunks/webpack-e94d22b7a028217b.js +0 -1
  814. package/src/dashboard/bench-slash-runtime.ts +0 -40
  815. package/src/dashboard/input/search-modal-router.ts +0 -9
  816. package/src/dashboard/modals/pane-key-router.ts +0 -27
  817. package/src/dashboard/view-slash-runtime.ts +0 -48
  818. /package/apps/pwa/out/_next/static/{y1ltt7oCZxVpC6zVPhZ2O → LSXfY0u9QtfDbejY0Ukf_}/_ssgManifest.js +0 -0
@@ -0,0 +1,37 @@
1
+ ## stay
2
+ http | src/nexus/api/http-server.ts:startNexusHttpServer | HTTP
3
+ pwa | src/nexus/pwa-registration.ts:createPwaRegistration | PWA
4
+ workflow-dispatch | src/workflow-runtime/daemon.ts:dispatchWebhook | 발송/dispatch
5
+ outbound | src/notifications/outbound-boot.ts:buildOutboundSubstrate | 발송/dispatch
6
+ sse-bus | src/nexus/api/event-bus.ts:NexusEventBus | SSE
7
+ sse-events | src/nexus/api/events.ts:handleSseEvents | SSE
8
+ sse-heartbeat | src/nexus/api/sse-heartbeat.ts:SSE_HEARTBEAT_MS | SSE
9
+ task-cards | src/nexus/api/task-cards-api.ts:handleTaskCardsGet | cards
10
+ decision-cards | src/decisions/decision-cards.ts:DecisionCardService | cards
11
+ hitl-pending | src/nexus/api/hitl-runtime.ts:createHitlPendingCallbacks | cards
12
+
13
+ ## leave
14
+ executor | src/workflow-runtime/executor.ts:runWorkflowToCompletion | judgment/executor; daemon emit awaits this in-process — ops rail must consume a short-lived run instead (process extraction is remaining work, out of stage 1)
15
+ harness | src/boot/daemon-tools/self-implement.ts:dispatchSelfImplement | harness/self-implement wired into TOX externalExec on this boot — already process-shaped; must leave the daemon
16
+ agent-loop | src/telegram-agent.ts:makeTelegramAgentRunTurn | agent loop started on this boot (telegram Q&A; discord makeDiscordAgentRunTurn and ACP createAgentTurnRunner siblings). AutopilotLoopDriver in src/autopilot/agent-loop.ts is not started here
17
+ tox | src/task-orchestrator/boot.ts:wireTox | TOX TaskFeedbackLoop + startToxLoop long-lived dispatcher started on this boot
18
+ continuation | src/dispatch/continuation-scheduler.ts:ContinuationScheduler.start | idle-continuation scheduler constructed on this boot (starts when dispatch.enabled)
19
+ workflow-schedule | src/workflow-runtime/daemon.ts:start | scheduleSource.start is a long-lived trigger scheduler; dispatch methods stay
20
+ intent-prediction | src/intent-prediction/index.ts:createIntentPredictionService | long-lived ranker tick / judgment scheduler
21
+ patcher | src/background-reasoning/patcher-boot.ts:buildPatcherSubstrate | self-improving patcher loop started on this boot
22
+ daily-reflection | src/notes/daily-reflection-scheduler.ts:startDailyReflectionScheduler | daily reflection scheduler
23
+ discovery-cron | src/registry/discovery/cron.ts:startDiscoveryCron | discovery cron scheduler
24
+ watch-default | src/domains/watch-default-scheduler.ts:startWatchDefaultScheduler | watch default scheduler
25
+
26
+ ## removalOrder
27
+ executor
28
+ harness
29
+ agent-loop
30
+ tox
31
+ continuation
32
+ workflow-schedule
33
+ intent-prediction
34
+ patcher
35
+ daily-reflection
36
+ discovery-cron
37
+ watch-default
@@ -88,6 +88,7 @@ import type { McpReloadOutcome, McpReloadServerResult } from './api/admin-mcp-re
88
88
  import { loadOrCreateSigningKey, NonceStore } from './api/edit-in-pwa-core.js';
89
89
  import { subscribeErrorSnapshotWriter } from './supervisor/error-snapshot.js';
90
90
  import { NexusEventBus } from './api/event-bus.js';
91
+ import { startTaRepairEventCollector } from '../steward/ta-repair-event-collect.js';
91
92
  import type { SessionSurface } from '../session/index.js';
92
93
  import { wireWorkflowApprovalEvents } from './api/workflow-event-bridge.js';
93
94
  import { wireAgentStatusEvents } from './api/agent-status-event-bridge.js';
@@ -275,6 +276,73 @@ import { packageVersion } from '../version/code-revision.js';
275
276
  export const NEXUS_VERSION = packageVersion();
276
277
  export const NEXUS_PHASE = 'N-5 PR χ (graceful exit + restart pending)';
277
278
 
279
+ // DAEMON-THIN stage 1 — inventory only (RFC-universe-by-house §4).
280
+ // Intentional wiring boundary: do not call daemonThinStage1 from runNexus.
281
+ // A runtime caller would change process composition, which stage 1 forbids.
282
+ export const DAEMON_THIN_STAY_ALLOWLIST = ['HTTP', 'PWA', '발송/dispatch', 'SSE', 'cards'] as const;
283
+ export type DaemonThinStayAllowlistClass = (typeof DAEMON_THIN_STAY_ALLOWLIST)[number];
284
+
285
+ export interface DaemonThinStayEntry {
286
+ id: string;
287
+ fileFunction: string;
288
+ allowlistClass: DaemonThinStayAllowlistClass;
289
+ }
290
+
291
+ export interface DaemonThinLeaveEntry {
292
+ id: string;
293
+ fileFunction: string;
294
+ why: string;
295
+ }
296
+
297
+ export interface DaemonThinStage1 {
298
+ stay: readonly DaemonThinStayEntry[];
299
+ leave: readonly DaemonThinLeaveEntry[];
300
+ removalOrder: readonly string[];
301
+ }
302
+
303
+ export function daemonThinStage1(): DaemonThinStage1 {
304
+ return {
305
+ stay: [
306
+ { id: 'http', fileFunction: 'src/nexus/api/http-server.ts:startNexusHttpServer', allowlistClass: 'HTTP' },
307
+ { id: 'pwa', fileFunction: 'src/nexus/pwa-registration.ts:createPwaRegistration', allowlistClass: 'PWA' },
308
+ { id: 'workflow-dispatch', fileFunction: 'src/workflow-runtime/daemon.ts:dispatchWebhook', allowlistClass: '발송/dispatch' },
309
+ { id: 'outbound', fileFunction: 'src/notifications/outbound-boot.ts:buildOutboundSubstrate', allowlistClass: '발송/dispatch' },
310
+ { id: 'sse-bus', fileFunction: 'src/nexus/api/event-bus.ts:NexusEventBus', allowlistClass: 'SSE' },
311
+ { id: 'sse-events', fileFunction: 'src/nexus/api/events.ts:handleSseEvents', allowlistClass: 'SSE' },
312
+ { id: 'sse-heartbeat', fileFunction: 'src/nexus/api/sse-heartbeat.ts:SSE_HEARTBEAT_MS', allowlistClass: 'SSE' },
313
+ { id: 'task-cards', fileFunction: 'src/nexus/api/task-cards-api.ts:handleTaskCardsGet', allowlistClass: 'cards' },
314
+ { id: 'decision-cards', fileFunction: 'src/decisions/decision-cards.ts:DecisionCardService', allowlistClass: 'cards' },
315
+ { id: 'hitl-pending', fileFunction: 'src/nexus/api/hitl-runtime.ts:createHitlPendingCallbacks', allowlistClass: 'cards' },
316
+ ],
317
+ leave: [
318
+ { id: 'executor', fileFunction: 'src/workflow-runtime/executor.ts:runWorkflowToCompletion', why: 'judgment/executor; daemon emit awaits this in-process — ops rail must consume a short-lived run instead (process extraction is remaining work, out of stage 1)' },
319
+ { id: 'harness', fileFunction: 'src/boot/daemon-tools/self-implement.ts:dispatchSelfImplement', why: 'harness/self-implement wired into TOX externalExec on this boot — already process-shaped; must leave the daemon' },
320
+ { id: 'agent-loop', fileFunction: 'src/telegram-agent.ts:makeTelegramAgentRunTurn', why: 'agent loop started on this boot (telegram Q&A; discord makeDiscordAgentRunTurn and ACP createAgentTurnRunner siblings). AutopilotLoopDriver in src/autopilot/agent-loop.ts is not started here' },
321
+ { id: 'tox', fileFunction: 'src/task-orchestrator/boot.ts:wireTox', why: 'TOX TaskFeedbackLoop + startToxLoop long-lived dispatcher started on this boot' },
322
+ { id: 'continuation', fileFunction: 'src/dispatch/continuation-scheduler.ts:ContinuationScheduler.start', why: 'idle-continuation scheduler constructed on this boot (starts when dispatch.enabled)' },
323
+ { id: 'workflow-schedule', fileFunction: 'src/workflow-runtime/daemon.ts:start', why: 'scheduleSource.start is a long-lived trigger scheduler; dispatch methods stay' },
324
+ { id: 'intent-prediction', fileFunction: 'src/intent-prediction/index.ts:createIntentPredictionService', why: 'long-lived ranker tick / judgment scheduler' },
325
+ { id: 'patcher', fileFunction: 'src/background-reasoning/patcher-boot.ts:buildPatcherSubstrate', why: 'self-improving patcher loop started on this boot' },
326
+ { id: 'daily-reflection', fileFunction: 'src/notes/daily-reflection-scheduler.ts:startDailyReflectionScheduler', why: 'daily reflection scheduler' },
327
+ { id: 'discovery-cron', fileFunction: 'src/registry/discovery/cron.ts:startDiscoveryCron', why: 'discovery cron scheduler' },
328
+ { id: 'watch-default', fileFunction: 'src/domains/watch-default-scheduler.ts:startWatchDefaultScheduler', why: 'watch default scheduler' },
329
+ ],
330
+ removalOrder: [
331
+ 'executor',
332
+ 'harness',
333
+ 'agent-loop',
334
+ 'tox',
335
+ 'continuation',
336
+ 'workflow-schedule',
337
+ 'intent-prediction',
338
+ 'patcher',
339
+ 'daily-reflection',
340
+ 'discovery-cron',
341
+ 'watch-default',
342
+ ],
343
+ };
344
+ }
345
+
278
346
  type TelegramAgentRunTurnFactory = typeof import('../telegram-agent.js').makeTelegramAgentRunTurn;
279
347
  type TelegramChannelResolver = typeof import('../domains/telegram-channels.js').resolveTelegramChannels;
280
348
  type TelegramInteractivePollerSelector = typeof import('../domains/telegram-channels.js').interactivePollerTokens;
@@ -1067,6 +1135,7 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
1067
1135
  }
1068
1136
 
1069
1137
  const eventBus = new NexusEventBus();
1138
+ const stopTaRepairEventCollector = startTaRepairEventCollector(eventBus);
1070
1139
  const state = createNexusState({ nexusVersion: NEXUS_VERSION, phase: NEXUS_PHASE });
1071
1140
  state.bus = eventBus;
1072
1141
  // BACKLOG #9 — fan workflow approval lifecycle into `/v1/events` SSE
@@ -3315,6 +3384,7 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
3315
3384
  pushEvent(state, { kind: 'nexus.shutdown' });
3316
3385
  pwaRegistration.unregister();
3317
3386
  try { unsubscribeWebtermTabLifecycle(); } catch { /* swallow */ }
3387
+ try { stopTaRepairEventCollector(); } catch { /* swallow */ }
3318
3388
  try { unsubscribeErrorSnapshots(); } catch { /* swallow */ }
3319
3389
  if (supervisor) {
3320
3390
  void supervisor.shutdown({ graceMs: 0 });
@@ -1,6 +1,7 @@
1
1
  import type { WizardIO } from '../../onboarding.js';
2
2
  import type { SetupCheckResult } from '../setup-status.js';
3
3
  import type { TailscaleProbe } from './tailscale-probe.js';
4
+ import { createManagementStarterContract } from '../../persona/presets.js';
4
5
 
5
6
  export interface FirstBootWizardDeps {
6
7
  io: WizardIO;
@@ -18,14 +19,32 @@ export interface FirstBootWizardDeps {
18
19
  pwaBuilt?: boolean;
19
20
  /** Tailscale probe 결과 (alive 시 magicDNS / IP 도 banner 에 노출). */
20
21
  tailscale?: TailscaleProbe;
22
+ /** 0.2.29 PERSONA-STARTER — «경영» 스타터 계약을 쓸 persona 저장소 경로.
23
+ * 생략하면 기본 상태 저장소(resolveStatePersonaDir) — 운영 첫 실행 경로. */
24
+ starterContractDir?: string;
21
25
  }
22
26
 
23
27
  export type FirstBootStep = 'llm' | 'tailscale';
24
28
 
29
+ /** 0.2.29 PERSONA-STARTER — 직업 질문에서 «경영»을 골랐을 때 만들어진 스타터 계약 한 장. */
30
+ export interface StarterContractSummary {
31
+ personaId: string;
32
+ displayName: string;
33
+ path: string;
34
+ }
35
+
25
36
  export type FirstBootResult =
26
- | { action: 'completed'; stepsRun: FirstBootStep[] }
37
+ | { action: 'completed'; stepsRun: FirstBootStep[]; starterContract?: StarterContractSummary }
27
38
  | { action: 'skipped'; reason: 'no-tty' | 'all-set-up' };
28
39
 
40
+ /** 직업 질문 답의 정규화 — «1»·«경영»·«management» 는 경영,
41
+ * 나머지(빈 답 포함)는 일반(현재 첫 실행 동작 유지). */
42
+ export function normalizeOccupationChoice(input: string): 'management' | 'general' {
43
+ const v = input.trim().toLowerCase();
44
+ if (v === '1' || v === '경영' || v === 'management') return 'management';
45
+ return 'general';
46
+ }
47
+
29
48
  function isTty(force?: boolean): boolean {
30
49
  if (force === true) return true;
31
50
  if (force === false) return false;
@@ -89,6 +108,39 @@ function printPwaSetupBanner(deps: FirstBootWizardDeps): void {
89
108
  deps.io.print('');
90
109
  }
91
110
 
111
+ /** 0.2.29 PERSONA-STARTER — 직업 질문. «경영»이면 경영 스타터 계약 한 장을
112
+ * 만들고, 일반이면 계약 없이 현재 흐름 그대로. 계약 생성이 실패해도
113
+ * wizard 결과는 completed 로 유지한다(fail-soft). */
114
+ async function askOccupationAndCreateStarter(
115
+ deps: FirstBootWizardDeps,
116
+ out: { log: (s: string) => void; error: (s: string) => void },
117
+ ): Promise<StarterContractSummary | undefined> {
118
+ const io = deps.io;
119
+ if (io.nonInteractive) return undefined;
120
+ io.print('');
121
+ io.print(' 어떤 일을 하세요? 고르면 스타터 계약 한 장을 만듭니다.');
122
+ io.print(' 1) 경영 — 방향·판단·운영을 함께 세우는 경영 스타터');
123
+ io.print(' 2) 일반 — 지금처럼 계속 (스타터 계약 없이)');
124
+ let answer: string;
125
+ try {
126
+ answer = await io.ask(' 선택 (1/2 · Enter=일반): ');
127
+ } catch (err) {
128
+ out.error(`first-boot wizard: occupation question failed: ${(err as Error).message}`);
129
+ return undefined;
130
+ }
131
+ if (normalizeOccupationChoice(answer) !== 'management') return undefined;
132
+ try {
133
+ const written = createManagementStarterContract(
134
+ deps.starterContractDir ? { dir: deps.starterContractDir } : {},
135
+ );
136
+ io.print(` ✓ 경영 스타터 계약이 만들어졌습니다: ${written.path}`);
137
+ return { personaId: written.personaId, displayName: written.displayName, path: written.path };
138
+ } catch (err) {
139
+ out.error(`first-boot wizard: starter contract failed: ${(err as Error).message}`);
140
+ return undefined;
141
+ }
142
+ }
143
+
92
144
  export async function runFirstBootWizard(
93
145
  deps: FirstBootWizardDeps,
94
146
  ): Promise<FirstBootResult> {
@@ -127,5 +179,7 @@ export async function runFirstBootWizard(
127
179
  }
128
180
  }
129
181
 
130
- return { action: 'completed', stepsRun };
182
+ const starterContract = await askOccupationAndCreateStarter(deps, out);
183
+
184
+ return { action: 'completed', stepsRun, ...(starterContract ? { starterContract } : {}) };
131
185
  }
@@ -104,6 +104,7 @@ export interface NexusEvent {
104
104
  // FeedbackEnvelope so `<StatusChip>` hydrates wherever chat is
105
105
  // rendered (PWA tab · iOS native · future Telegram bot).
106
106
  | 'agent.status'
107
+ | 'ta.repair.completed'
107
108
  // PLAN-chat-hud-multi-surface-port-2026-05-13 §4 M2 — HudStore
108
109
  // (process-wide HUD segment map) lifecycle. The bridge in
109
110
  // `hud-event-bridge.ts` subscribes to the store and publishes one
@@ -17,6 +17,7 @@ import {
17
17
  import { authStorePath, defaultCodexHome, isUnderTestRunner, listProviders, loadTokens, saveTokens } from './store.js';
18
18
  import { readFreshAvailabilityState, quotaSignalDir, readQuotaSignal, readQuotaSignalCredits, readQuotaSignalUsedPercent, readQuotaSignalObservedAt, readQuotaSignalObservedAtRaw } from '../budget/codex-reset-credit-state.js';
19
19
  import { creditPaceStatus } from '../budget/codex-credit-pace.js';
20
+ import { noteCodexBillingDecision, type CodexCreditSpendReason } from './codex-billing-route.js';
20
21
  import { loadLlmPolicy } from '../policy/llm-policy.js';
21
22
  import { getUserConfig } from '../user-config.js';
22
23
  import {
@@ -204,6 +205,8 @@ interface RunPin {
204
205
  readonly resolution: CodexAccountResolution;
205
206
  /** ⛔ 핀이 «갇혔는지»를 싸게 재려면 그 계정의 홈이 필요하다. 모르면 재지 못하므로 그대로 둔다. */
206
207
  readonly home: string | undefined;
208
+ /** 핀을 박은 판정이 크레딧 소진이었나 — 핀으로 돌려줄 때도 과금 경로를 같이 남긴다. */
209
+ readonly creditReason?: CodexCreditSpendReason;
207
210
  }
208
211
  const pinnedByRun = new Map<string, RunPin>();
209
212
  /** ⛔ 상한 — 장수 프로세스에서 runId 수만큼 «영구히» 자라면 안 된다(리뷰 should-fix).
@@ -213,6 +216,8 @@ const PIN_MAX = 256;
213
216
  /** ⛔ 테스트 심 — 고정을 푼다. 프로덕션에서는 부르지 않는다. */
214
217
  export function _resetCodexRotationPinForTesting(): void {
215
218
  pinnedByRun.clear();
219
+ // 판정이 남긴 과금 경로도 같이 푼다 — 안 풀면 다음 시험 파일의 codex usage 가 credit 으로 읽힌다.
220
+ noteCodexBillingDecision(undefined);
216
221
  }
217
222
 
218
223
  /** ⛔⭐⭐ 후보 조립은 «한 자»여야 한다 — 실행 경로와 조회(dry-run)가 다른 자를 쓰면
@@ -728,7 +733,7 @@ export function resolveCodexAccountForRun(
728
733
  const explicit = Boolean(env.ELANOUS_CODEX_ACCOUNT?.trim());
729
734
  // ⛔⭐ 사람이 «명시»했으면 고정보다 «먼저» 이긴다(결정 ③) — 고정을 읽지도 쓰지도 않는다.
730
735
  // 고정이 앞서면, 앞선 호출이 만든 회전 결과가 「명시한 계정」을 덮는다.
731
- if (explicit) { observeRotation({ reason: 'explicit' }, current.name); return current; }
736
+ if (explicit) { observeRotation({ reason: 'explicit' }, current.name); noteCodexBillingDecision(undefined); return current; }
732
737
  // ⛔⭐⭐⭐ 설정 판정이 «핀보다 먼저»다(리뷰 must-fix).
733
738
  // 핀을 먼저 보면, 같은 런에서 이미 회전·핀된 뒤 설정이 false 로 바뀌어도
734
739
  // ***계속 회전 계정을 돌려준다*** — 「config false 로만 꺼진다」가 핀 경유로 깨진다.
@@ -736,6 +741,7 @@ export function resolveCodexAccountForRun(
736
741
  const enabled = rotationConfig.enabled;
737
742
  if (!enabled) {
738
743
  observeRotation({ reason: 'disabled', disabledProvenance: rotationConfig.state }, current.name);
744
+ noteCodexBillingDecision(undefined);
739
745
  return current;
740
746
  }
741
747
  // ⛔⭐⭐⭐ 고정은 «런 신원이 있을 때만» 한다.
@@ -763,7 +769,7 @@ export function resolveCodexAccountForRun(
763
769
  // 🔑 전환은 «소진당 한 번»으로 갇히고, 그 뒤 다시 핀이 박힌다.
764
770
  const pinnedHome = pinned.home;
765
771
  const exhausted = pinnedHome !== undefined && pinnedAccountExhausted(pinnedHome, pinned.resolution.name);
766
- if (!exhausted) return pinned.resolution;
772
+ if (!exhausted) { noteCodexBillingDecision(pinned.creditReason); return pinned.resolution; }
767
773
  pinnedByRun.delete(runKey);
768
774
  debug.log('oauth.codex-account', 'pin-released',
769
775
  { account: pinned.resolution.name, why: 'threshold-reached' }, { level: 'warn' });
@@ -806,6 +812,8 @@ export function resolveCodexAccountForRun(
806
812
  // CREDIT-SPEND-ORDER(10-12) — «다른 계정의 선불 크레딧으로 옮김»(`rotated` ⊕ creditEntry)도 크레딧 진입이다.
807
813
  const creditSpendReason = decision.reason === 'credits-allowed' || decision.reason === 'credit-pace' ? decision.reason
808
814
  : decision.reason === 'rotated' && decision.creditEntry ? 'credits-rotated' as const : undefined;
815
+ // CREDIT-BILLING-LABEL(10-14) — 이 판정으로 나가는 호출의 `llm.usage` 가 `billing='credit'` 이 되게 남긴다.
816
+ noteCodexBillingDecision(creditSpendReason);
809
817
  if (creditSpendReason && !deps.counterPath && isUnderTestRunner(process.env)) {
810
818
  // 시험 러너 가드(autoConsume 의 test-runtime-guard 와 같은 관용구) — 카운터를 주입 안 한 시험이 실제 카운터·송신기에 닿지 않는다.
811
819
  debug.log('oauth.codex-account', 'credit-spend-alert-skipped', { account: decision.to?.name ?? current.name, reason: 'test-runtime-guard' });
@@ -833,7 +841,11 @@ export function resolveCodexAccountForRun(
833
841
  const oldest = pinnedByRun.keys().next().value;
834
842
  if (oldest !== undefined) pinnedByRun.delete(oldest);
835
843
  }
836
- pinnedByRun.set(runKey, { resolution: resolved, home: effectiveCodexHome(resolved, loadTokens(resolved.storeKey, path), env).home });
844
+ pinnedByRun.set(runKey, {
845
+ resolution: resolved,
846
+ home: effectiveCodexHome(resolved, loadTokens(resolved.storeKey, path), env).home,
847
+ ...(creditSpendReason ? { creditReason: creditSpendReason } : {}),
848
+ });
837
849
  }
838
850
  return resolved;
839
851
  }
@@ -0,0 +1,31 @@
1
+ /**
2
+ * codex 호출의 «과금 경로» 기억 — 회전 판정이 크레딧 소진을 정했으면 그 호출의 `llm.usage` 가 `billing='credit'` 이다.
3
+ *
4
+ * 🩸 10-14 운영 실측: 세 계정이 주간 100% 라 회전이 `credits-allowed` 로 default 계정 크레딧을 쓰는데,
5
+ * 같은 턴의 `llm.usage` 는 `billing=subscription` · `cost.kind=included($0)` 였다 — 원장·토큰 경보가 크레딧 지출을 $0 로 봤다.
6
+ * 자격 종류(oauth)만으로 과금 경로를 정하면 «구독 한도를 넘어 크레딧으로 나간 호출»을 구분 못 한다.
7
+ *
8
+ * 경로: `loadFreshCodexAuthState` → `resolveCodexAccountForRun`(요청마다 · 판정·핀) → 여기 기록
9
+ * → 응답 끝 `logAgentTurnUsage` → `billingRouteForProvider('openai-codex')` 가 여기를 읽는다.
10
+ * ⚠️ 프로세스 단위 «마지막 판정»이다 — 같은 프로세스에서 다른 런이 동시에 다른 판정을 내리면 섞일 수 있다
11
+ * (판정은 같은 스토어·설정을 읽으므로 보통 같은 답이다).
12
+ */
13
+
14
+ export type CodexCreditSpendReason = 'credits-allowed' | 'credit-pace' | 'credits-rotated';
15
+
16
+ let lastCreditReason: CodexCreditSpendReason | undefined;
17
+
18
+ /** 계정 해석이 끝날 때마다 부른다 — 크레딧 소진이 아니면 `undefined` 로 지운다(앞 판정이 남지 않게). */
19
+ export function noteCodexBillingDecision(reason: CodexCreditSpendReason | undefined): void {
20
+ lastCreditReason = reason;
21
+ }
22
+
23
+ /** 마지막 codex 계정 해석이 크레딧 소진이었으면 그 이유. */
24
+ export function codexCreditSpendReason(): CodexCreditSpendReason | undefined {
25
+ return lastCreditReason;
26
+ }
27
+
28
+ /** ⛔ 테스트 심 — 프로덕션에서는 부르지 않는다. */
29
+ export function _resetCodexBillingDecisionForTesting(): void {
30
+ lastCreditReason = undefined;
31
+ }
@@ -27,10 +27,10 @@
27
27
 
28
28
  import {
29
29
  existsSync, readFileSync, writeFileSync, mkdirSync, renameSync,
30
- chmodSync, realpathSync,
30
+ chmodSync, lstatSync, readlinkSync,
31
31
  } from 'node:fs';
32
32
  import { homedir } from 'node:os';
33
- import { join, dirname, basename, resolve } from 'node:path';
33
+ import { join, dirname, parse, resolve, sep } from 'node:path';
34
34
  import { extractChatGPTClaims, decodeJWTPayload, type ChatGPTClaims } from './jwt.js';
35
35
  import { debug } from '../debug/log.js';
36
36
  import { isCodexStoreKey } from './codex-account.js';
@@ -347,12 +347,37 @@ export function listProviders(path: string = authStorePath()): string[] {
347
347
  /** 두 경로가 «실체로» 같은 파일인가. ⛔ 문자열 비교로는 심볼릭 링크가 가드를 통과한다
348
348
  * (`CODEX_HOME` 이 `~/.codex` 로 가는 링크면 resolve() 결과가 다르다 · 리뷰 must-fix).
349
349
  * ⚠️ 파일이 아직 없을 수 있으므로 «부모까지» 실체화하고 이름을 붙인다. */
350
+ export function resolveMirrorGuardPath(path: string): string {
351
+ let candidate = resolve(path);
352
+ const visited = new Set<string>();
353
+ for (let hop = 0; hop < 40; hop++) {
354
+ if (visited.has(candidate)) throw new Error('mirror path symlink cycle');
355
+ visited.add(candidate);
356
+ const root = parse(candidate).root;
357
+ const parts = candidate.slice(root.length).split(sep).filter(Boolean);
358
+ let prefix = root;
359
+ let expanded = false;
360
+ for (const [index, part] of parts.entries()) {
361
+ const next = join(prefix, part);
362
+ let link = false;
363
+ try { link = lstatSync(next).isSymbolicLink(); }
364
+ catch (error) {
365
+ if (!['ENOENT', 'ENOTDIR'].includes((error as NodeJS.ErrnoException).code ?? '')) throw error;
366
+ }
367
+ if (link) {
368
+ candidate = resolve(dirname(next), readlinkSync(next), ...parts.slice(index + 1));
369
+ expanded = true;
370
+ break;
371
+ }
372
+ prefix = next;
373
+ }
374
+ if (!expanded) return candidate;
375
+ }
376
+ throw new Error('mirror path symlink depth exceeded');
377
+ }
378
+
350
379
  function sameRealFile(a: string, b: string): boolean {
351
- const norm = (p: string): string => {
352
- try { return realpathSync(p); } catch { /* 아직 없다 — 부모로 내려간다 */ }
353
- try { return join(realpathSync(dirname(p)), basename(p)); } catch { return resolve(p); }
354
- };
355
- return norm(a) === norm(b);
380
+ return resolveMirrorGuardPath(a) === resolveMirrorGuardPath(b);
356
381
  }
357
382
 
358
383
  /** ⛔ 테스트 러너 판정 — 이 값이 «거짓»이면 가드는 영영 안 도는 장식이 된다.
@@ -27,13 +27,38 @@ export function orderProviderChoices(detected: readonly LLMProviderName[] = []):
27
27
  return [...detected, ...CHOICE_BASE.filter((name) => !detected.includes(name))];
28
28
  }
29
29
 
30
- async function chooseProvider(detected: readonly LLMProviderName[] = []): Promise<LLMProviderName | null> {
30
+ export type MenuAnswer =
31
+ | { kind: 'chosen'; provider: LLMProviderName }
32
+ | { kind: 'cancel' }
33
+ | { kind: 'miss' };
34
+
35
+ // FIRST10-FIX: 첫 화면의 오타 한 번이 first-run 전체를 취소하던 마찰 — 빈 입력(취소 의사)과 달리
36
+ // 선택지를 가리키지 못하는 입력(오타·범위 밖·전각 숫자)은 취소가 아니라 다시 묻는다.
37
+ export function parseMenuAnswer(answer: string, choices: readonly LLMProviderName[]): MenuAnswer {
38
+ const trimmed = answer.trim();
39
+ if (trimmed === '') return { kind: 'cancel' };
40
+ const index = Number(trimmed) - 1;
41
+ const provider = Number.isInteger(index) && index >= 0 ? choices[index] : undefined;
42
+ return provider !== undefined ? { kind: 'chosen', provider } : { kind: 'miss' };
43
+ }
44
+
45
+ export async function promptProviderMenu(
46
+ ask: (prompt: string) => Promise<string>,
47
+ detected: readonly LLMProviderName[] = [],
48
+ ): Promise<LLMProviderName | null> {
31
49
  const choices = orderProviderChoices(detected);
32
50
  const menu = choices.map((name, i) => `${i + 1} ${CHOICE_LABEL[name] ?? name}`).join(', ');
51
+ for (;;) {
52
+ const parsed = parseMenuAnswer(await ask(`Choose LLM (${menu}; Enter to cancel): `), choices);
53
+ if (parsed.kind === 'chosen') return parsed.provider;
54
+ if (parsed.kind === 'cancel') return null;
55
+ }
56
+ }
57
+
58
+ async function chooseProvider(detected: readonly LLMProviderName[] = []): Promise<LLMProviderName | null> {
33
59
  const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
34
60
  try {
35
- const answer = (await rl.question(`Choose LLM (${menu}; Enter to cancel): `)).trim();
36
- return choices[Number(answer) - 1] ?? null;
61
+ return await promptProviderMenu((prompt) => rl.question(prompt), detected);
37
62
  } finally {
38
63
  rl.close();
39
64
  }
@@ -106,10 +106,10 @@ export function createOverviewCache(deps: {
106
106
  podTimer = schedule(() => { void refreshPods(); }, POD_MS);
107
107
  podTimer.unref();
108
108
  };
109
- const present = (entry: Entry): OverviewData => {
110
- const at = now();
109
+ /** Response-time Pod occupancy overlay — shared by /v1/ops/overview and /v1/ops/resources. */
110
+ const overlayPods = (snapshot: OverviewSnapshot, at: number): PodMemberRow[] => {
111
111
  const byContext = new Map(podRows.map((row) => [row.context, row]));
112
- const pods: PodMemberRow[] = entry.snapshot.machines.pods.map((pod) => {
112
+ return snapshot.machines.pods.map((pod) => {
113
113
  const row = byContext.get(pod.context);
114
114
  const stale = row && at - row.observedAt >= POD_STALE_MS;
115
115
  const occupied = !podFailure && row && !stale && row.occupied !== null
@@ -117,11 +117,23 @@ export function createOverviewCache(deps: {
117
117
  : unmeasured<number>('pod pool background measure', podFailure ?? (stale ? '낡음(120초)' : row?.reason ?? '측정 대기'), row ? new Date(row.observedAt).toISOString() : null);
118
118
  return { ...pod, occupied };
119
119
  });
120
+ };
121
+ const present = (entry: Entry): OverviewData => {
122
+ const at = now();
123
+ const pods = overlayPods(entry.snapshot, at);
120
124
  const full = { ...entry.snapshot, machines: { ...entry.snapshot.machines, pods } };
121
125
  return { ...full, ...computeVerdict(full), durationMs: entry.durationMs,
122
126
  sources: [full.release.run.source, full.tasks.launchable.source, full.tasks.capacity.source],
123
127
  cacheAgeMs: Math.max(0, at - entry.at), refreshFailed: entry.failure ?? null };
124
128
  };
129
+ /** Read-only view of the freshest memo entry (RES-FLOOR-API) — never collects, never measures, never waits. */
130
+ const peek = (): { snapshot: OverviewSnapshot; pods: PodMemberRow[]; at: number } | null => {
131
+ let freshest: Entry | null = null;
132
+ for (const entry of memo.values()) if (!freshest || entry.at > freshest.at) freshest = entry;
133
+ if (!freshest) return null;
134
+ const at = now();
135
+ return { snapshot: freshest.snapshot, pods: overlayPods(freshest.snapshot, at), at };
136
+ };
125
137
  const get = async (options: Pick<CollectOptions, 'version' | 'owner'> & { sinceMs?: number; sinceLabel?: string } = {}): Promise<OverviewData> => {
126
138
  start();
127
139
  const key = JSON.stringify([options.version ?? null, options.owner ?? null, options.sinceMs ?? 3_600_000]);
@@ -171,5 +183,5 @@ export function createOverviewCache(deps: {
171
183
  }
172
184
  return present(memo.get(key)!);
173
185
  };
174
- return { get, memoSize: () => memo.size, stop: () => { if (podTimer) clearInterval(podTimer); podTimer = null; memo.clear(); } };
186
+ return { get, peek, memoSize: () => memo.size, stop: () => { if (podTimer) clearInterval(podTimer); podTimer = null; memo.clear(); } };
175
187
  }
@@ -10,7 +10,8 @@ import { effectiveInstanceRoot } from '../instance/resolve.js';
10
10
  import type { Checklist, ChecklistItem } from '../release-loop/checklist.js';
11
11
  import type { ReleaseSchedule } from '../release-loop/release-schedule.js';
12
12
  import type { ResourceView } from '../control-plane/ledger.js';
13
- import type { TaskCard } from '../task-agent/task-hand.js';
13
+ import { cardPrNumber, type TaskCard } from '../task-agent/task-hand.js';
14
+ import { measureLandingThroughput, type LandingThroughput } from '../task-agent/cover.js';
14
15
  import {
15
16
  okCell, unmeasured, type Cell, type CapacityInfo, type ChecklistCounts, type LaunchableInfo, type LoopRow, type MachineRow,
16
17
  type OverviewSnapshot, type OwnerTaskRow, type ParentsInfo, type PodMemberRow, type ReleaseRunInfo, type ScheduleInfo,
@@ -269,6 +270,22 @@ export async function collectOverview(opts: CollectOptions, injected: CollectDep
269
270
  const byOwner: Cell<Record<string, OwnerTaskRow>> = cards instanceof Error
270
271
  ? unmeasured('task-agent ledger', errText(cards))
271
272
  : okCell(ownerRows(cards, kstMidnight, opts.owner), `task-agent ledger(오늘 KST · owner=seat 키)`, iso(now));
273
+ const launchedCards = cards instanceof Error ? [] : cards.filter((card) => card.createdAt >= kstMidnight && card.status === 'launched');
274
+ const throughput = cards instanceof Error
275
+ ? unmeasured<LandingThroughput>('task-agent ledger', errText(cards))
276
+ : okCell(measureLandingThroughput({
277
+ launched: launchedCards.length,
278
+ cardPrs: launchedCards.filter((card) => cardPrNumber(card) !== undefined).length,
279
+ taskAgentActions: launchedCards.flatMap((card) => (card.landAttempts ?? [])
280
+ .filter((attempt) => attempt.at >= kstMidnight)
281
+ .map((attempt) => ({
282
+ kind: 'land' as const,
283
+ result: attempt.ok === true ? 'done' : attempt.ok === false ? 'failed' : 'pending',
284
+ reason: attempt.reason ?? attempt.detail,
285
+ }))),
286
+ allLands: null,
287
+ pendingLandingAgeSeconds: null,
288
+ }), 'task-agent ledger(오늘 KST · landAttempts)', iso(now));
272
289
  const done = unmeasured<number>('task-agent ledger', '착지 판정은 PR 조회가 필요 — owner 모델(OVW-OWNER)·card-evidence 연결 전');
273
290
 
274
291
  // 발사 가능 — 열린 판(앞으로의 컷) 전부.
@@ -334,7 +351,7 @@ export async function collectOverview(opts: CollectOptions, injected: CollectDep
334
351
  beat: okCell({ lastAt: b.lastAt, ageSeconds: b.ageSeconds, alive: b.alive }, `${SEAT_ERA_SOURCE} dispatcher-${b.seat}.pid`, b.lastAt) });
335
352
  }
336
353
 
337
- return { generatedAt: iso(now), instanceRoot: root, since: opts.sinceLabel, release, tasks, machines, landings, loops };
354
+ return { generatedAt: iso(now), instanceRoot: root, since: opts.sinceLabel, release, tasks, machines, landings, throughput, loops };
338
355
  }
339
356
 
340
357
  export function parseSince(raw: string | undefined): { ms: number; label: string } {
@@ -0,0 +1,82 @@
1
+ /**
2
+ * RES-FLOOR-API — «자원 지도» 접기(순수 층). I/O 0 · kubectl/ssh 0 · 새 수집 0.
3
+ * 이미 도는 overview 캐시의 메모 스냅숏과 응답 때 얹는 Pod 점유를 PWA 자원 지도 꼴로 접는다.
4
+ * 설계: 칸 RES-FLOOR-API(0.2.28) — 호스트별 load·mem · Pod 슬롯 · 칸마다 observedAt · 빠진 칸은 missing 사유.
5
+ */
6
+ import type { Cell, MachineLoad, OverviewSnapshot, PodMemberRow } from './overview.js';
7
+
8
+ export interface ResourceCell<T> {
9
+ value: T | null;
10
+ observedAt: string | null;
11
+ /** value 가 없는 칸의 사유 — 측정됐으면 null */
12
+ missing: string | null;
13
+ }
14
+
15
+ export interface HostResourcesRow {
16
+ name: string;
17
+ load1: ResourceCell<number>;
18
+ load5: ResourceCell<number>;
19
+ load15: ResourceCell<number>;
20
+ cpuCount: ResourceCell<number>;
21
+ memFreeGb: ResourceCell<number>;
22
+ memTotalGb: ResourceCell<number>;
23
+ }
24
+
25
+ export interface PodSlotRow {
26
+ context: string;
27
+ capacity: number;
28
+ occupied: ResourceCell<number>;
29
+ }
30
+
31
+ export interface ResourcesMap {
32
+ /** 접은 스냅숏의 시각(overview generatedAt) */
33
+ generatedAt: string;
34
+ /** 이 읽기 시각 */
35
+ readAt: string;
36
+ hosts: HostResourcesRow[];
37
+ pods: PodSlotRow[];
38
+ /** 구조적으로 통째로 빈 칸의 사유(호스트 원장 비어 있음 · 풀 설정 없음) */
39
+ missing: string[];
40
+ }
41
+
42
+ const NO_REASON = '사유 없음';
43
+
44
+ function fold<T>(source: Cell<T>): ResourceCell<T> {
45
+ const measured = source.status !== 'unmeasured' && source.value !== null;
46
+ return { value: measured ? source.value : null, observedAt: source.observedAt, missing: measured ? null : source.reason ?? NO_REASON };
47
+ }
48
+
49
+ /** 호스트의 모든 숫자 칸은 같은 하트비트 cell 에서 나오니 observedAt·missing 도 함께 접힌다. */
50
+ function hostRow(host: OverviewSnapshot['machines']['hosts'][number]): HostResourcesRow {
51
+ const load = fold(host.load);
52
+ const num = (pick: (l: MachineLoad) => number): ResourceCell<number> => load.value !== null
53
+ ? { value: pick(load.value), observedAt: load.observedAt, missing: null }
54
+ : { value: null, observedAt: load.observedAt, missing: load.missing };
55
+ return {
56
+ name: host.name,
57
+ load1: num((l) => l.load1),
58
+ load5: num((l) => l.load5),
59
+ load15: num((l) => l.load15),
60
+ cpuCount: num((l) => l.cpuCount),
61
+ memFreeGb: num((l) => l.freeGb),
62
+ memTotalGb: num((l) => l.totalGb),
63
+ };
64
+ }
65
+
66
+ export function resourcesFromOverview(snapshot: OverviewSnapshot, pods: readonly PodMemberRow[], now: number): ResourcesMap {
67
+ const byContext = new Map(pods.map((pod) => [pod.context, pod]));
68
+ const missing: string[] = [];
69
+ if (snapshot.machines.hosts.length === 0) missing.push('hosts: 하트비트 원장 비어 있음');
70
+ if (snapshot.machines.pods.length === 0) missing.push('pods: 풀 설정 없음');
71
+ return {
72
+ generatedAt: snapshot.generatedAt,
73
+ readAt: new Date(now).toISOString(),
74
+ hosts: snapshot.machines.hosts.map(hostRow),
75
+ pods: snapshot.machines.pods.map((pod): PodSlotRow => ({
76
+ context: pod.context,
77
+ capacity: pod.capacity,
78
+ occupied: fold((byContext.get(pod.context) ?? pod).occupied),
79
+ })),
80
+ missing,
81
+ };
82
+ }