elanous 0.2.29 → 0.2.32

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 (775) 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/{cIpv5nU9AycwYWZI9H589 → IVKr3AlRUVLKsw2fh7eXF}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{058a98ba.7eb28d5e6dc03565.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/{6013-2f769370d8b4c2c6.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/{8332.6f0f49df772e163b.js → 1654.32de4b324981a188.js} +1 -1
  15. package/apps/pwa/out/_next/static/chunks/1834-98b64172bc1efe77.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +149 -0
  17. package/apps/pwa/out/_next/static/chunks/{8795.32573a185af18c7b.js → 1913.7cc6fb6055b1ed3f.js} +2 -2
  18. package/apps/pwa/out/_next/static/chunks/{419.736c0d6f426249a7.js → 2001.6c7e0fd02190886c.js} +1 -1
  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/{6767.1fcfc9b8be83975f.js → 2213.2ccbada92c33ea0f.js} +16 -16
  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/{4759.1f76713aefb87db5.js → 2871.0bca6137343b3f76.js} +1 -1
  28. package/apps/pwa/out/_next/static/chunks/{6776.06ff1e3b464cc607.js → 2898.fd781bc7cf01a7b7.js} +1 -1
  29. package/apps/pwa/out/_next/static/chunks/{1782-59db1b5aa06df38a.js → 2940-619bfd8ef337c611.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/{8471.8d2a8c74f09c36ff.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/{bc324b7c.02a09dd93f6a399b.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/{7725-4f83d5541fbdb81b.js → 3541-ce3a5424ed5ad7f1.js} +1 -1
  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/3902.e1e71aaac850a045.js +34 -0
  39. package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/{46bd8bea.2f4b4099172fcdb7.js → 409f1e57.d0649fc47691ebfe.js} +1 -1
  41. package/apps/pwa/out/_next/static/chunks/4111.2bfedbb233ad206b.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/{1142.65d002789ab3af7d.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/4999.c064a4000c2a9e94.js +79 -0
  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/5304.04d24756f242a094.js +148 -0
  57. package/apps/pwa/out/_next/static/chunks/5307.60f2209e809bd627.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/{3396-97b97928c49190c9.js → 5458-16cd7a2b51b74c8c.js} +1 -1
  60. package/apps/pwa/out/_next/static/chunks/{3403.7199205e65124486.js → 5525.86debf231e181813.js} +1 -1
  61. package/apps/pwa/out/_next/static/chunks/{9143.ff14585db1d275ff.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/{8398.73a19b39715eda04.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/{5591.a35e7a217734a8b9.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/6323.8672b4817a306928.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/{7375.050ea0d72968e49f.js → 6433.fc573af22bbc9ab7.js} +17 -17
  75. package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +90 -0
  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/6767.ea607cf0c20a25af.js +24 -0
  85. package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +93 -0
  86. package/apps/pwa/out/_next/static/chunks/69-0a2c8209c6d4a158.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7371.80c05c653b08e907.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7391.ebae168025c91b6a.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/{1852.7f7b53991fcb99ef.js → 7502.ccd5b8065545edd0.js} +2 -2
  94. package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +8 -0
  95. package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/{6534.1ab00f370db7b105.js → 7862.30a8d6482bb238eb.js} +1 -1
  97. package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7947-d0759430f8042240.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/{285adb1a.5654e605dddf86d2.js → 7a1887c4.f36b88fba31da8fd.js} +1 -1
  100. package/apps/pwa/out/_next/static/chunks/8018.a32663f04a6fc5f9.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8097-9530c03bcc550f02.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/9002.e5658224e3dc1b6f.js +24 -0
  110. package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/{1516.dfaceff3fd2d0e0d.js → 9138.b6e80031afb1d973.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/{9907.49be0fcadaf214b5.js → 9221.7d22eaf353a2d4e7.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/{8767-2f6a634f5abeaa01.js → 9279-d28c5b7754d010ae.js} +1 -1
  116. package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/{3160-95c96f4d2a21dd26.js → 9398-6aed28f0a96d0d6f.js} +1 -1
  118. package/apps/pwa/out/_next/static/chunks/9407.e49124dedf0f5e72.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{328bb3ab-6628a1114fe3fb3b.js → 997ce8a5-2ad501927003b41b.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/{6853.cc5174a9dee59593.js → 9989.3694300e5f000b14.js} +1 -1
  123. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/approvals/page-504204b58c82c253.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a9717a67c2eecbaf.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/board/page-5c9ec30aee62dfbf.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/botlab/page-584191533721fa16.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/bots/page-73c4b4bb3ac7ab5f.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/ceo/page-c0f1ca371f710b06.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/chat/page-46430d45a9e04eac.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/consult/page-3b2ebf1dc64ff0be.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/control/page-a27b1e5a0d1b308f.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/decisions/page-25654b82094f7d22.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/design-check/page-8ea49a4c6dd2c6e7.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/editor/page-ce5113aefea0a8d1.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/exec/page-0e5a41fac1c75396.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/field/page-31aaf1ed37c6df9a.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/inside/page-3dcc1fa411e1f4e0.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/intake/page-c69247e7134d329d.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/layout-66dc5cd3a0999abe.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live/page-26ff7ff651a7217d.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/live-run/page-617b3976981efa96.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/loops/page-d256f5d5d9552823.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/market/page-ce8f1907b8a6101c.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-33e182a316263116.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/morning/page-32866485913d6a04.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/not-found-7607cca9b84950c6.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/observatory/page-eeab86176b03dc3b.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-5b93dbae3432b996.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-77a6cb90a9cf2b10.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f47e768b5b242b5a.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/outputs/page-eb41aa3367fc2505.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/page-4d13ab0b8a267e3f.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/reflection/page-84dad32ff0fc0831.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-95306f892aa2d0ee.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/sessions/page-940fb6c217f6b470.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-8c66a3b24a745630.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/settings/page-7b675dfd35c36fc9.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8bd0d3cf7665bcfc.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/{page-29900ed0011b2c83.js → page-c219f2ed171131be.js} +1 -1
  163. package/apps/pwa/out/_next/static/chunks/app/share/page-40f8fa21bdae955b.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/showroom/page-468f8313e4f1fbd9.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/tasks/page-7bbb8fa353a246c4.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/term/page-04d00ae9b0890349.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/today/page-4214b855d9233ea8.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/trace/page-936752c7aa58762e.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/vault/page-ec052ad359df1797.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8305570551091338.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workflows/page-fad650e4793adb65.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workspace/page-d90e64743826e1d8.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a16bcfd49af86a32.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/{425cfc4d.fb91158e3971c39f.js → b313b242.cb1265eea908db61.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +122 -0
  176. package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/ebc7d829.264a0bcb6c750b50.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +1 -0
  184. package/apps/pwa/out/_next/static/css/b5d88eba78a3d7bf.css +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +26 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/bin/elanous.mjs +7 -3
  279. package/graphs/context/nightly-condense.yaml +1 -0
  280. package/graphs/implement-loop.yaml +5 -0
  281. package/graphs/intake/intake-daily.yaml +8 -1
  282. package/graphs/intake/recipes.yaml +5 -0
  283. package/graphs/lecture/lecture-note.yaml +2 -2
  284. package/graphs/ops/harness-gc.yaml +1 -0
  285. package/graphs/release/recipes.yaml +3 -0
  286. package/graphs/release/release-loop.yaml +9 -5
  287. package/graphs/units/recipes.yaml +3 -0
  288. package/graphs/units/release-gate-recheck.yaml +15 -0
  289. package/package.json +2 -1
  290. package/scripts/check-native-tool-wiring.ts +3 -2
  291. package/scripts/ci-android-unit-tests.ts +16 -0
  292. package/scripts/ci-typecheck-changed.ts +63 -10
  293. package/scripts/coord-channel-watch.sh +22 -16
  294. package/scripts/coord-role-pack.ts +81 -2
  295. package/scripts/cron-run.ts +96 -3
  296. package/scripts/detect-test-interference.ts +38 -5
  297. package/scripts/gate-pr-cache.ts +65 -0
  298. package/scripts/gh-surface/capture.ts +126 -0
  299. package/scripts/gh-surface/gh +40 -0
  300. package/scripts/import-graph-scc.ts +38 -0
  301. package/scripts/install.ps1 +19 -0
  302. package/scripts/intake-social.ts +181 -0
  303. package/scripts/lecture-note/node.ts +71 -4
  304. package/scripts/lib/android-toolchain.ts +32 -0
  305. package/scripts/lib/deterministic-env.ts +62 -0
  306. package/scripts/lib/gate-test-env.ts +19 -0
  307. package/scripts/measure-goal-grounding-corpus.ts +2 -1
  308. package/scripts/measure-si-task-cpu.ts +143 -0
  309. package/scripts/ratchets/test-interference-patterns.allowlist.txt +255 -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-closure.ts +12 -8
  317. package/scripts/release-loop/gate-diff.ts +1 -1
  318. package/scripts/release-loop/gate-host-mirror.ts +66 -0
  319. package/scripts/release-loop/gate-node.ts +523 -75
  320. package/scripts/release-loop/gate-partial.ts +106 -9
  321. package/scripts/release-loop/gate-pr-cache.ts +66 -0
  322. package/scripts/release-loop/gate-prewarm-plan.ts +66 -0
  323. package/scripts/release-loop/gate-r2-verdict.ts +189 -0
  324. package/scripts/release-loop/gate-recheck-plan-node.ts +52 -0
  325. package/scripts/release-loop/gate-warm-artifacts.ts +253 -0
  326. package/scripts/release-loop/import-graph-scc-run.ts +54 -0
  327. package/scripts/release-loop/import-graph-scc.ts +215 -0
  328. package/scripts/release-loop/node-verdict.ts +2 -0
  329. package/scripts/release-loop/prepare-node.ts +102 -4
  330. package/scripts/release-loop/probe-pod-host-dirs-live.ts +113 -0
  331. package/scripts/release-loop/resume-release.ts +33 -4
  332. package/scripts/release-loop/resume.ts +13 -5
  333. package/scripts/release-loop/spawn-lane.ts +2 -19
  334. package/scripts/release-loop/tui-sim-node.ts +3 -2
  335. package/scripts/release-loop/unattended-release.ts +16 -0
  336. package/scripts/test-deterministic.ts +5 -61
  337. package/scripts/train-reach-grouping.ts +48 -0
  338. package/scripts/tsc-incremental-cache.ts +86 -0
  339. package/scripts/tsc-incremental-diagnostics.ts +76 -0
  340. package/scripts/tsc-main-safety-net.ts +2 -2
  341. package/src/acp/client.ts +4 -1
  342. package/src/acp/core-turn-bridge.ts +65 -8
  343. package/src/acp/elanous-extensions.ts +3 -0
  344. package/src/acp/server.ts +3 -0
  345. package/src/acp/tool-trace.ts +186 -11
  346. package/src/ad-pipeline/run.ts +4 -2
  347. package/src/agent/runner.ts +169 -3
  348. package/src/agent/self-ambient-cache.ts +156 -0
  349. package/src/agent/self-ambient.ts +8 -1
  350. package/src/agent/subagent-callable.ts +3 -2
  351. package/src/agent/task-notification.ts +5 -0
  352. package/src/agent-mission/review-loop.ts +6 -3
  353. package/src/agent-substrate/acp-implementer.ts +14 -2
  354. package/src/agent-substrate/pr-reviewer.ts +14 -0
  355. package/src/agent-substrate/self-review-cli.ts +30 -4
  356. package/src/ask-user-question/tool.ts +22 -0
  357. package/src/autopilot/build/llm-conflict-merge.ts +56 -10
  358. package/src/autopilot/pr-manager.ts +80 -7
  359. package/src/briefing/brief-items.ts +24 -22
  360. package/src/capture/frame-state-detect.ts +39 -0
  361. package/src/capture/tui-self-report.ts +149 -6
  362. package/src/chat/chat-cli.ts +10 -2
  363. package/src/chat/index.ts +138 -26
  364. package/src/chat/input-control-key.ts +5 -3
  365. package/src/chat/pickers/modal-runtime.ts +6 -0
  366. package/src/chat/pickers/modals.ts +8 -2
  367. package/src/chat/tool-interrupt-behavior.ts +38 -0
  368. package/src/chat/tool-render/dispatch.ts +5 -1
  369. package/src/chat/turn-typeahead.ts +75 -20
  370. package/src/cli/__fixtures__/agent-help-before/agent.txt +4 -2
  371. package/src/cli/agent-cli.ts +41 -13
  372. package/src/cli/ask-bare.ts +1 -0
  373. package/src/cli/config-audit.ts +123 -0
  374. package/src/cli/decisions-cli.ts +80 -6
  375. package/src/cli/import-cli.ts +12 -0
  376. package/src/cli/log-event-names.ts +17 -0
  377. package/src/cli/mcp-login.ts +21 -5
  378. package/src/cli/msg-cli.ts +89 -0
  379. package/src/cli/pod-cli.ts +14 -3
  380. package/src/cli/pr-cli.ts +273 -81
  381. package/src/cli/pr-land-base-read.ts +34 -0
  382. package/src/cli/pr-land-heavy-remote.ts +82 -26
  383. package/src/cli/pr-land-overlap-evidence.ts +109 -11
  384. package/src/cli/pr-land-pod-shadow-job.ts +106 -0
  385. package/src/cli/pr-land-pod-shadow.ts +16 -3
  386. package/src/cli/pr-land-refusal.ts +20 -5
  387. package/src/cli/pr-land-virtual-rebase.ts +108 -0
  388. package/src/cli/pty-takeover-cli.ts +88 -14
  389. package/src/cli/release-cli.ts +80 -14
  390. package/src/cli/seat-cli.ts +138 -3
  391. package/src/cli/self-update.ts +5 -2
  392. package/src/cli/sim-cli.ts +18 -0
  393. package/src/cli/tasks-cli.ts +97 -19
  394. package/src/context-bus/context-first.ts +13 -0
  395. package/src/context-bus/context-now.ts +13 -2
  396. package/src/context-bus/ops-events.ts +79 -0
  397. package/src/control-plane/lease-holder.ts +12 -8
  398. package/src/control-plane/ledger.ts +163 -4
  399. package/src/control-plane/server.ts +91 -11
  400. package/src/core-turn/run-core-turn.ts +2 -0
  401. package/src/core-turn/run-goal-loop.ts +243 -3
  402. package/src/core-turn/seat-turn-cap.ts +79 -0
  403. package/src/core-turn/short-question.ts +38 -6
  404. package/src/core-turn/types.ts +6 -0
  405. package/src/dashboard/acp-active-model.ts +42 -1
  406. package/src/dashboard/acp-boot.ts +3 -0
  407. package/src/dashboard/background-jobs-status.ts +66 -0
  408. package/src/dashboard/index.ts +339 -657
  409. package/src/dashboard/input/agent-wake.ts +242 -0
  410. package/src/dashboard/input/chat-main-entry-runtime.ts +6 -1
  411. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +4 -1
  412. package/src/dashboard/input/chat-main-session.ts +8 -1
  413. package/src/dashboard/input/chat-main-turn.ts +12 -3
  414. package/src/dashboard/input/compact-prepass-recovery.ts +33 -0
  415. package/src/dashboard/input/external-input-host.ts +49 -9
  416. package/src/dashboard/input/internal-turn.ts +261 -0
  417. package/src/dashboard/input/mouse-wiring.ts +108 -11
  418. package/src/dashboard/input/seat-autowake.ts +318 -0
  419. package/src/dashboard/input/turn-steer-bridge.ts +70 -0
  420. package/src/dashboard/log-click-runtime.ts +118 -2
  421. package/src/dashboard/loop-scheduler.ts +72 -0
  422. package/src/dashboard/seat-boot-preamble.ts +18 -0
  423. package/src/dashboard/skill-runtime.ts +2 -0
  424. package/src/dashboard/slash-runtime/dashboard-handlers.ts +126 -1181
  425. package/src/dashboard/slash-runtime/help-from-registry.ts +2 -1
  426. package/src/dashboard/slash-runtime/index.ts +13 -0
  427. package/src/dashboard/turn-busy-teardown.ts +50 -0
  428. package/src/dashboard/turn-preamble.ts +116 -40
  429. package/src/dashboard/turn-session-layers.ts +4 -2
  430. package/src/dashboard/turn-start-segments.ts +222 -0
  431. package/src/decisions/decision-ledger.ts +45 -4
  432. package/src/discord-self-message.ts +4 -4
  433. package/src/display/prompt-row-owner.ts +146 -0
  434. package/src/display/resize-listener.ts +33 -2
  435. package/src/domains/release-tool.ts +18 -1
  436. package/src/field-note/transcribe.ts +17 -0
  437. package/src/fold-stack.ts +4 -2
  438. package/src/git-fs/index.ts +263 -36
  439. package/src/github/remote-call.ts +81 -0
  440. package/src/goals/registry.ts +46 -6
  441. package/src/goals/types.ts +7 -1
  442. package/src/graph-runner/runner.ts +1 -0
  443. package/src/grok/credential.ts +26 -0
  444. package/src/harness/gate-reserve.ts +87 -0
  445. package/src/harness/harness-clean.ts +2 -1
  446. package/src/harness/harness-cli-command.ts +52 -5
  447. package/src/harness/harness-gc.ts +2 -1
  448. package/src/harness/harness-incidents.ts +70 -20
  449. package/src/harness/harness-pod-dispatch.ts +87 -10
  450. package/src/harness/harness-queue.ts +68 -4
  451. package/src/harness/harness-stop.ts +4 -3
  452. package/src/harness/harness-substrate-default.ts +78 -7
  453. package/src/harness/harness-worktree-auto.ts +2 -1
  454. package/src/harness/harness-worktrees.ts +3 -2
  455. package/src/hooks/dispatch.ts +2 -1
  456. package/src/index.ts +156 -27
  457. package/src/input/external-input-queue.ts +64 -7
  458. package/src/intake-plane/slash.ts +14 -3
  459. package/src/keybindings.ts +4 -1
  460. package/src/llm/route-decision.ts +36 -0
  461. package/src/llm/tool-loop-steered-rejection.ts +41 -0
  462. package/src/llm-request-shape.ts +209 -0
  463. package/src/llm.ts +301 -283
  464. package/src/loops/consensus.ts +348 -0
  465. package/src/loops/msg-wake.ts +206 -4
  466. package/src/loops/observe.ts +19 -3
  467. package/src/loops/orchestrator/tick.ts +88 -12
  468. package/src/loops/orchestrator/traffic.ts +64 -1
  469. package/src/loops/registry.ts +30 -0
  470. package/src/market/signed-index.ts +14 -0
  471. package/src/maturity/feature-maturity.ts +1 -1
  472. package/src/mcp/mcp-oauth.ts +54 -5
  473. package/src/models/prompts.ts +28 -0
  474. package/src/msg/msg-sse-client.ts +223 -0
  475. package/src/msg/msg-store.ts +86 -2
  476. package/src/mss/logging/log-store.ts +225 -1
  477. package/src/mss/logging/render-categories.ts +5 -0
  478. package/src/nexus/DAEMON-THIN-inventory-2026-10-15.md +122 -0
  479. package/src/nexus/api/http-server.ts +54 -15
  480. package/src/nexus/api/loop-resources.ts +19 -3
  481. package/src/nexus/api/ops-api.ts +11 -0
  482. package/src/nexus/daemon-thin-inventory.md +37 -0
  483. package/src/nexus/index.ts +70 -0
  484. package/src/nexus/state/state.ts +1 -0
  485. package/src/oauth/store.ts +32 -7
  486. package/src/onboarding/first-run.ts +28 -3
  487. package/src/ops/overview-cache.ts +16 -4
  488. package/src/ops/overview.ts +59 -2
  489. package/src/ops/resources.ts +82 -0
  490. package/src/plugins/maker/connector-maker.ts +41 -0
  491. package/src/plugins/maker/skill-maker.ts +42 -0
  492. package/src/pr-tool/census.ts +303 -0
  493. package/src/pr-tool/inflight-registry.ts +143 -0
  494. package/src/prompt-library/chat-conciseness.ts +13 -0
  495. package/src/prompt-library/universal-preamble.ts +10 -5
  496. package/src/pty-shell/pty-manifest.ts +12 -3
  497. package/src/pty-shell/tui-run-state.ts +34 -3
  498. package/src/release-loop/gate-host-reservation.ts +97 -0
  499. package/src/release-loop/landing-freeze.ts +5 -0
  500. package/src/release-loop/light-rc.ts +5 -2
  501. package/src/release-loop/placement.ts +92 -1
  502. package/src/release-loop/rehearsal-shard-plan.ts +149 -0
  503. package/src/release-loop/rehearsal.ts +73 -17
  504. package/src/repl/index.ts +20 -2
  505. package/src/seat-loop/seat-knowhow.ts +282 -0
  506. package/src/seat-loop/seat-loop.ts +41 -2
  507. package/src/seat-loop/traffic-signal.ts +5 -1
  508. package/src/self-dev/ask-launch-flow.ts +37 -3
  509. package/src/self-dev/decompose-compose-graph.ts +28 -27
  510. package/src/self-dev/decompose-proposal.ts +53 -38
  511. package/src/self-dev/decompose.ts +17 -0
  512. package/src/self-dev/dev-pipeline.ts +31 -2
  513. package/src/self-dev/draft-residue.ts +267 -33
  514. package/src/self-dev/draft-sweep.ts +59 -4
  515. package/src/self-dev/external-call-zero.ts +77 -0
  516. package/src/self-dev/launch-preflight-text.ts +6 -0
  517. package/src/self-dev/launch-preflight.ts +25 -3
  518. package/src/self-dev/local-supervisor-judge.ts +185 -0
  519. package/src/self-dev/run-supervisor.ts +229 -19
  520. package/src/self-dev/run-types.ts +20 -0
  521. package/src/self-dev/shard-aggregate.ts +13 -2
  522. package/src/self-dev/shard-plan.ts +56 -1
  523. package/src/self-dev/shard-run.ts +207 -12
  524. package/src/self-dev/spawn-lane-files.ts +19 -0
  525. package/src/self-implement/app-api-budget.ts +51 -11
  526. package/src/self-implement/config-gate.ts +2 -1
  527. package/src/self-implement/elanous-tui-spawn.ts +14 -0
  528. package/src/self-implement/expose-gate.ts +2 -1
  529. package/src/self-implement/follow-up-placement.ts +79 -0
  530. package/src/self-implement/gate-artifacts.ts +416 -0
  531. package/src/self-implement/gate-baseline.ts +96 -5
  532. package/src/self-implement/gate-cli.ts +207 -17
  533. package/src/self-implement/gate-remote.ts +136 -26
  534. package/src/self-implement/gate-scenario.ts +85 -0
  535. package/src/self-implement/goal-author.ts +160 -8
  536. package/src/self-implement/graph-authority.ts +38 -6
  537. package/src/self-implement/graph-overlay-condition.ts +92 -1
  538. package/src/self-implement/heal-triage.ts +79 -0
  539. package/src/self-implement/host-regate.ts +97 -7
  540. package/src/self-implement/orchestrator.ts +115 -134
  541. package/src/self-implement/pr-title.ts +123 -0
  542. package/src/self-implement/run-checkpoint.ts +235 -0
  543. package/src/self-implement/run-ledger.ts +162 -15
  544. package/src/self-implement/run-stop.ts +4 -3
  545. package/src/self-implement/run-ttl.ts +28 -4
  546. package/src/self-implement/seams.ts +2 -0
  547. package/src/self-implement/shadow-stage.ts +7 -6
  548. package/src/self-implement/stop-autoheal.ts +2 -1
  549. package/src/self-implement/train-gate-remote.ts +37 -8
  550. package/src/self-implement/train-reach-grouping.ts +157 -0
  551. package/src/self-implement/train-scenario-layers.ts +133 -0
  552. package/src/self-implement/uncommitted-work.ts +2 -0
  553. package/src/session/pending-input.ts +19 -0
  554. package/src/session/session-start.ts +224 -0
  555. package/src/session-runtime/index.ts +22 -267
  556. package/src/session-runtime/parallel-dispatch.ts +22 -5
  557. package/src/shell-runner/background-surface.ts +15 -5
  558. package/src/skills/tools/agent.ts +39 -6
  559. package/src/skills/tools/dev-harness.ts +6 -4
  560. package/src/skills/tools/list-dir.ts +11 -0
  561. package/src/skills/tools/schedule-wakeup.ts +408 -0
  562. package/src/skills/tools/shell.ts +246 -4
  563. package/src/status/bar.ts +26 -0
  564. package/src/steward/digest-delivery.ts +118 -0
  565. package/src/steward/hold-hygiene.ts +120 -0
  566. package/src/steward/resync-tick.ts +114 -23
  567. package/src/steward/ta-repair-event-collect.ts +158 -0
  568. package/src/steward/triage.ts +10 -0
  569. package/src/surface/shell-runner-boot.ts +5 -2
  570. package/src/task-agent/card-evidence.ts +25 -1
  571. package/src/task-agent/green-sweep.ts +8 -3
  572. package/src/task-agent/judge.ts +76 -0
  573. package/src/task-agent/land-queue.ts +79 -0
  574. package/src/task-agent/live-moves.ts +30 -9
  575. package/src/task-agent/postland-card.ts +5 -0
  576. package/src/task-agent/prelaunch-already-done.ts +98 -0
  577. package/src/task-agent/real-launch-guard.ts +37 -0
  578. package/src/task-agent/rejudge-on-head.ts +89 -12
  579. package/src/task-agent/remote-rejudge-bind.ts +28 -8
  580. package/src/task-agent/repair-cycle.ts +45 -7
  581. package/src/task-agent/repair-worker.ts +7 -0
  582. package/src/task-agent/run-identity.ts +200 -0
  583. package/src/task-agent/shadow.ts +50 -3
  584. package/src/task-agent/task-hand.ts +182 -5
  585. package/src/task-agent/train-landing.ts +77 -0
  586. package/src/task-agent/work-order.ts +104 -0
  587. package/src/task-orchestrator/surfaces/pod-command-job.ts +151 -37
  588. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +88 -19
  589. package/src/task-orchestrator/surfaces/pod-host-acp-review.ts +2 -1
  590. package/src/task-orchestrator/surfaces/pod-image-source.ts +2 -1
  591. package/src/task-orchestrator/surfaces/pod-install-slots.ts +121 -9
  592. package/src/task-orchestrator/surfaces/pod-lease.ts +118 -6
  593. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +1 -1
  594. package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +169 -0
  595. package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +27 -0
  596. package/src/task-orchestrator/surfaces/pod-pool.ts +3 -1
  597. package/src/task-orchestrator/surfaces/pod-result-marker-wait.ts +33 -0
  598. package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +67 -0
  599. package/src/task-orchestrator/surfaces/pod-source-receive.ts +19 -3
  600. package/src/task-orchestrator/surfaces/pod-warm-switch.ts +141 -0
  601. package/src/task-orchestrator/surfaces/pod-warm-ta-shadow.ts +85 -0
  602. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +525 -0
  603. package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +153 -0
  604. package/src/task-orchestrator/surfaces/pod-warm-worker-runner.ts +90 -0
  605. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +362 -0
  606. package/src/task-orchestrator/surfaces/self-implement-pod.ts +138 -19
  607. package/src/telegram.ts +2 -4
  608. package/src/tui/chat/execution-badge.ts +5 -1
  609. package/src/tui/input/pickers.ts +732 -0
  610. package/src/tui/input-lag-probe.ts +230 -0
  611. package/src/tui/slash/mission.ts +492 -0
  612. package/src/tui/slash/term.ts +877 -0
  613. package/src/tui-client/dashboard-session.ts +9 -0
  614. package/src/tui.ts +52 -0
  615. package/src/user-config/gemini-server-tools.ts +9 -0
  616. package/src/user-config.ts +53 -16
  617. package/src/util/spawn-sync-output.ts +7 -0
  618. package/src/ux-sim/fake-bin.ts +154 -0
  619. package/src/ux-sim/fake-clock.ts +36 -0
  620. package/src/ux-sim/headless-tui.ts +72 -0
  621. package/src/ux-sim/in-process-cli.ts +2 -1
  622. package/src/ux-sim/scenario.ts +255 -0
  623. package/src/ux-sim/temp-git-remote.ts +82 -0
  624. package/src/version/packed-revision.json +1 -1
  625. package/src/video-pipeline/recipes/vlog.ts +25 -7
  626. package/apps/pwa/out/_next/static/chunks/1015-9cba22a5a4554797.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/1084-4e66af7376a18db7.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/1106.3a6410b7b0c70ad4.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/1127.32fc642f70423506.js +0 -8
  630. package/apps/pwa/out/_next/static/chunks/1189-d9b8e1995a831fae.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/1224.6da98c7ad0eb7dd8.js +0 -34
  632. package/apps/pwa/out/_next/static/chunks/1370.4e3e2558f111fd5d.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/1514-b7da377fdc4eb17a.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/1577.3c24c32584e10d70.js +0 -286
  635. package/apps/pwa/out/_next/static/chunks/161.130a569855c4d68c.js +0 -24
  636. package/apps/pwa/out/_next/static/chunks/1864.16da9556e78a9236.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/1b6f6b2a.aff090122be3726e.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/2341.e8a9135e5b910dd5.js +0 -36
  639. package/apps/pwa/out/_next/static/chunks/257.10afdbe3520f2fc2.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/2658.87550e692dc493f6.js +0 -64
  641. package/apps/pwa/out/_next/static/chunks/2673.85e2f02efae7a85f.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/2766-bee623b37472ed63.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/2794.6d836872b0bf43e2.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/2806.eb57ced1a528ed39.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/283.7a121c4910e6dad7.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/2870.1dc29aa5fc01f09f.js +0 -115
  647. package/apps/pwa/out/_next/static/chunks/293.fd38e77ce5d48103.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/2993-5952a1cd3fd5d441.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/32-a523427c5bd5ed00.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/3280.af38002a6424a905.js +0 -90
  651. package/apps/pwa/out/_next/static/chunks/3292-5ddffdb2f517b44f.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/3523.d3231daaf7aba993.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/3763.577de3181e1e6ea0.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/4138-cc56b0938ef72783.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/4255-8350c43d307a8875.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/4352.a4954693499c2714.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/4421-f2dcbc6fd80ec013.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/4513-51b94aeee37c9905.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/4928-c3b72f99aa588699.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/4986-f9fc0283fb325219.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/5014.671a7b9f69c2b7b1.js +0 -94
  662. package/apps/pwa/out/_next/static/chunks/5137.d398e24710b3feb6.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/5298.0bea74885cabe754.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/5315.74c53a39739b11c4.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/5317-8b1df8d02105cd07.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/5358-33051f41a2b239af.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/5388.a2ec02501f714ad5.js +0 -62
  668. package/apps/pwa/out/_next/static/chunks/5395.e6ac948a2d15058d.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/5409-f282bf533c151849.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/5466.d0f4aba9d52acfa8.js +0 -27
  671. package/apps/pwa/out/_next/static/chunks/5564.3d28b353470fe305.js +0 -104
  672. package/apps/pwa/out/_next/static/chunks/569.b0cbfb4dee4a167a.js +0 -93
  673. package/apps/pwa/out/_next/static/chunks/5835-72465b73a8bb8d74.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/5941.045d6093139e1f7a.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/6228.47cabb83564dfe54.js +0 -24
  676. package/apps/pwa/out/_next/static/chunks/6457-8d1993002a87d0fe.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/6513.ef54cfae52351982.js +0 -2
  678. package/apps/pwa/out/_next/static/chunks/6582.13d245bf87df69f1.js +0 -148
  679. package/apps/pwa/out/_next/static/chunks/6655.c33f6acc2c61bb89.js +0 -149
  680. package/apps/pwa/out/_next/static/chunks/6731-9d7195af289c8d4c.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/6733.0be05b1db9279fc5.js +0 -79
  682. package/apps/pwa/out/_next/static/chunks/6742-90937146253a8b9e.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/687-816858f77a396a4e.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/6888.72c7b8cfb02a7e61.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/6993.c17c828ac3ef3253.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/7076.9f27ef666b0cefdd.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/7113.1403c5d451804e8c.js +0 -287
  688. package/apps/pwa/out/_next/static/chunks/7169.9dd603c726c2cd7c.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/7247-e3ec21f761f86710.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/7261-a47b72f96f5199df.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/7335-5cda81ac90310077.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/7356-c2e4af090546e2d4.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/738-59518742078fda71.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/7385.a7375f10db73243a.js +0 -77
  695. package/apps/pwa/out/_next/static/chunks/7445.cf1cf2fe109bcd96.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/7505.a2057432ab6ef99a.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/7515.31f45fac1f9c70cb.js +0 -74
  698. package/apps/pwa/out/_next/static/chunks/7658-d4ce8c72a9548a91.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/8107-0b1ae46bc5bcb788.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/8132.bfea2f016ce8d992.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/8672.e299832bc7d18ee2.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/8735.f1ef798a5f260f6f.js +0 -226
  703. package/apps/pwa/out/_next/static/chunks/8774-88f67f7d8d53d299.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/8782.252e5a405d86e4ed.js +0 -32
  705. package/apps/pwa/out/_next/static/chunks/909-9ed7aa0dba804316.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/9100.22b0301256827007.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/9140-dde77575570bc71e.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/9292-a7ad9a01c7044b93.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/9517.00627dc51b02821c.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/9725.dcbb585652d8e9c5.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/9761.a3ebf5c389c24ddc.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/9972.834d2b2b7d48f1ed.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/9995-1a90486f5ae01546.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/a435ad95.577add051b4facb2.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-83372d8b5863ebf7.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/app/approvals/page-d69256d7613c140a.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-352c5e9ba3f9b858.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/app/board/page-69f1d725524201a8.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/app/botlab/page-a5635eba0d73b84e.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/app/bots/page-ad9181d84285e4ea.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/app/ceo/page-86feb08080261a2f.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/app/chat/page-ffa15987e4756d03.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/app/consult/page-11a3ab44ac327cc1.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/app/control/page-6309b11c4264d24d.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/app/decisions/page-8800472079612e87.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/app/design-check/page-d387bf3f2301882a.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/app/editor/page-048f88d8c8658da6.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/app/exec/page-6c14f9739b7f6880.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/app/field/page-2834f44f64e98d74.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/app/healthz/route-83372d8b5863ebf7.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/app/inside/page-a13df6f88e824887.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/app/intake/page-8a4397248754cf2b.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/app/layout-daf0bd329360a336.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/app/live/page-f7ef1c28764cb476.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/app/live-run/page-61e74f28b9353dac.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/app/loops/page-8aaa6dedc4c10dfb.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/app/market/page-294602ba649be829.js +0 -1
  738. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-5fa5f41ed3fce323.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/app/morning/page-33bf667a5fb297bf.js +0 -1
  740. package/apps/pwa/out/_next/static/chunks/app/not-found-5ae3cbd6e5dba515.js +0 -1
  741. package/apps/pwa/out/_next/static/chunks/app/observatory/page-eb867d16ad6fdede.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1ab789fa68682f7e.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6fd41b5b6ff13a71.js +0 -1
  744. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fb3d5f7642c99fba.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/app/outputs/page-70f705b2b5ed42ca.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/app/page-c9c93b358a7667b5.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1563c556b81c96ed.js +0 -1
  748. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ce89c20c45b3a673.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/app/sessions/page-423ae63d786f4ee9.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-591a5378a4c4447c.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/app/settings/page-a250496b19a5824b.js +0 -1
  752. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-c36a9277febc5911.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/app/setup/layout-83372d8b5863ebf7.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/app/share/page-a5de57edc6d7f942.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/app/showroom/page-16bdd4c9f40498df.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/app/tasks/page-75e946e6e71cc6d8.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/app/term/page-9eb56166774eb256.js +0 -1
  758. package/apps/pwa/out/_next/static/chunks/app/today/page-1c5f9ef35dbb22c5.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/app/trace/page-657ff9985e508498.js +0 -1
  760. package/apps/pwa/out/_next/static/chunks/app/vault/page-22dc72499da68fb2.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9f92737b8766009a.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/app/workflows/page-094ad334e40f8169.js +0 -1
  763. package/apps/pwa/out/_next/static/chunks/app/workspace/page-8bcd379852ff6287.js +0 -1
  764. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-6b04413f280cd344.js +0 -1
  765. package/apps/pwa/out/_next/static/chunks/de70ab42-d28d47437208d458.js +0 -1
  766. package/apps/pwa/out/_next/static/chunks/f800c5e3.46dbd7f2af8c3fce.js +0 -1
  767. package/apps/pwa/out/_next/static/chunks/f8bc19ad.47579f6d684b0760.js +0 -122
  768. package/apps/pwa/out/_next/static/chunks/framework-ca9ac4609fb9fed8.js +0 -1
  769. package/apps/pwa/out/_next/static/chunks/main-app-0dd08d32d15a030f.js +0 -1
  770. package/apps/pwa/out/_next/static/chunks/main-f0399d33955c4e01.js +0 -1
  771. package/apps/pwa/out/_next/static/chunks/pages/_app-d42caca6f8ac2211.js +0 -1
  772. package/apps/pwa/out/_next/static/chunks/pages/_error-42e713c13aa41ca8.js +0 -1
  773. package/apps/pwa/out/_next/static/chunks/webpack-8fbf8f61a377aa16.js +0 -1
  774. package/apps/pwa/out/_next/static/css/72becfd42807b50d.css +0 -1
  775. /package/apps/pwa/out/_next/static/{cIpv5nU9AycwYWZI9H589 → IVKr3AlRUVLKsw2fh7eXF}/_ssgManifest.js +0 -0
@@ -0,0 +1,122 @@
1
+ # DAEMON-THIN 1단계 산출물 — 데몬 안 로직 목록 ⊕ 뺄 순서 (측정 먼저)
2
+
3
+ - 골: 27fa65fa79651b12 · 칸 [OP · 0.2.35 DAEMON-THIN · TASK-AGENT(OP 디스패처)]
4
+ - 준거: RFC-universe-by-house §4 · 루브릭 A1 E2 R2 D0 M1 B0 S2 X1 · 기둥 B(데몬 얇게, 재시작 없는 받침 강건성)
5
+ - 대상 파일: `src/nexus/index.ts` (runNexus 본체, 4,030줄) · `src/workflow-runtime/daemon.ts` (createWorkflowRuntimeDaemon, 440줄)
6
+ - 이 문서는 1단계(측정) 산출물이다 — **코드 동작은 바꾸지 않는다.**
7
+
8
+ ## 1. 데몬 안 로직 목록 — src/nexus/index.ts (runNexus)
9
+
10
+ ### A. 남길 것 (얇은 데몬에 그대로)
11
+
12
+ | # | 로직 | 위치(줄) | 비고 |
13
+ |---|---|---|---|
14
+ | A1 | 싱글인스턴스 락 (`~/.elanous/nexus/.lock`) | 부트 초반 | 보존 계약 |
15
+ | A2 | `runtime.json` 사이드카 (pid·startedAt·phase·httpPort·httpAuth·tailnetUrl·template — `NexusRuntimeMeta`, `src/nexus/runtime.ts`) | 부트 + `onRuntimeSidecarWrite` | 외부 발견 계약 — 형식 무변 |
16
+ | A3 | HTTP 서버 `startNexusHttpServer` 배선 | L2951(DI 기본값 `opts.startNexusHttpServerFn ?? startNexusHttpServer`) · L2988(호출 `httpServer = startHttpServer({`) | 데몬 표면의 핵심 |
17
+ | A4 | PWA static (staticDir) | L3004(`...(pwaStaticDir ? { staticDir: pwaStaticDir } : {})`) | 남긴다 |
18
+ | A5 | SSE 이벤트버스 (`NexusEventBus` + bridge) | 생성 L1069(`const eventBus = new NexusEventBus();`) · 배선 시 `eventBus` 인자(L2991 인접) · L2999(`...(wsBridgeOpts ? { wsBridge: wsBridgeOpts } : {})`) | 남긴다 |
19
+ | A6 | 발송 substrate (`buildOutboundSubstrate` — telegram/discord 발송) | L2784(선언) · L2788(`outboundSubstrate = buildOutboundSubstrate({`) | 발송은 남긴다 |
20
+ | A7 | 카드 webPushDecisionTimer | L2762(`webPushDecisionTimer = setInterval(`) · L2767(`.unref()`) | 카드는 남긴다(발송 타이머 자체) |
21
+ | A8 | 종결 훅: `gracefulExit`/`cleanExit` · `wrappedRelease` · `drainTelegramThen` | 임포트 L251(`gracefulExit, cleanExit`) · `wrappedRelease` 정의 L3312 · `drainTelegramThen` 정의 L3514 · 발화 L3710·L3770(`drainTelegramThen(() => gracefulExit({`) · `cleanExit` L3730·L3790 | **무조건 보존** — 재시작 0·깨끗한 종료의 받침 |
22
+ | A9 | supervisor 배선 (`createSupervisor` + TabRegistry + 종결 순서) | L1854(`supervisor = createSupervisor({`) | 운영 레일의 받침 |
23
+ | A10 | 워크플로 데몬 배선 (`createWorkflowRuntimeDaemon` — 트리거 소스 구독) | L2438(`workflowDaemon = createWorkflowRuntimeDaemon({`) | emit→디스패치 경계는 유지(2단계 이후 슬림화) |
24
+
25
+ ### B. 뺄 것 (짧게 사는 프로세스로 이전)
26
+
27
+ | # | 로직 | 위치(줄) | 이전 형태 |
28
+ |---|---|---|---|
29
+ | B1 | §5-③ continuation scheduler (자율 idle-continuation) | L2272–2419 (주석 L2272 · try L2278 · catch L2417–2419) | bun 자식 프로세스 |
30
+ | B2 | TOX (`wireTox` 부트 + subagent surface bridge) | L2242–2269 (`wireTox({` L2242 · catch 경고 L2269) | bun 자식 프로세스 |
31
+ | B3 | thread sweep | L2546–2589 (주석 L2546 `★ UR4b 조율자 상주 thread-awareness sweep` · try L2550 · `setInterval`(180초 주기) L2575 · catch L2587–2589) | bun 자식 프로세스 |
32
+ | B4 | dig/replay armer (dig L2387–2400 · replay L2402–2415) | L2387–2415 — **B1 try 블록 내부에 중첩**(L2387 > B1 try L2278 · L2415 < B1 catch L2417) ⇒ B1과 분리해 이전 불가, 같은 조각으로만 | bun 자식 프로세스(B1 조각에 동승) |
33
+ | B5 | catch-up sweep | L2489–2518 (주석 L2489 `Mission Fabric 통합 U4b — 이관잡(run_via='trigger') catch-up 자기회복` · try L2494 · catch L2515–2517) | bun 자식 프로세스 |
34
+ | B6 | patcher substrate (`buildPatcherSubstrate`) | L2869(`patcherSubstrateHandle = buildPatcherSubstrate({`) | bun 자식 프로세스 |
35
+ | B7 | devices cron (`buildDevicesSubstrate`) | L2897(`devicesSubstrateHandle = buildDevicesSubstrate({`) | bun 자식 프로세스 |
36
+ | B8 | 텔레그램/디스코드 폴러 (`wireNexusTelegramQaPollers` 정의 L301 · 호출 L2715·L2727) — **폴링** 로직. 발송(A6)과 구분 | 부트 배선 | bun 자식 프로세스 |
37
+ | B9 | 카드 decision 판단 로직 (webPushDecisionTimer의 «판단» 부분 — 타이머·발송은 A7로 남김) | L2752–2767 (판단 게이트 L2752 — 타이머 A7 L2762와 같은 블록) | bun 자식 프로세스 |
38
+
39
+ ### B-제외 검토 (빼지 «않는» 것 — 목록 대조용)
40
+
41
+ - `startSessionDecisionForward` — 발송 표면(A6 계열)과 결합 → 이번 칸에서는 남긴다.
42
+ - workflow 트리거 소스 구독(daemon.ts) — dispatch 경계는 데몬에 유지(TASK-AGENT가 붙는 지점이므로 칸 근거 끝 반영).
43
+
44
+ ## 2. 데몬 안 로직 목록 — src/workflow-runtime/daemon.ts (createWorkflowRuntimeDaemon)
45
+
46
+ | # | 로직 | 상태 |
47
+ |---|---|---|
48
+ | C1 | 트리거 소스 구독 (schedule/webhook/discord/telegram/chat) | **남긴다** — 데몬의 디스패치 표면 |
49
+ | C2 | emit→`runWorkflowToCompletion` 디스패치 | 남긴다 (슬림화는 후속 조각) |
50
+ | C3 | `registerWorkflow` 라이브 등록 | 남긴다 |
51
+ | C4 | dispatchWebhook/Chat/Discord/Telegram | 남긴다 |
52
+ | C5 | L212 `lifecycle === 'draft'` 게이트 (recordSkip 3-sink) | **남긴다** — 칸 근거 끝(draft #27303 닫음)의 반영 지점. TASK-AGENT(OP 디스패처)가 붙는 경계 |
53
+ | C6 | run-to-completion 내부의 판단·루프·하니스 성 로직 — **구체 경계(실측)**: `emit` 트리거 콜백 전체 L183–261(페이로드 정규화 → C5 draft 게이트 L212 → runId 생성 L228 → `await runFn(...)` L231–234). `runFn` = `runWorkflowToCompletion`(임포트 L14 · 주입 L152 `const runFn = opts.runWorkflow ?? runWorkflowToCompletion;`) | 뺄 후보 — 별도 조각에서 자식 프로세스로 (이번 1단계에서는 경계 실측만) |
54
+
55
+ ## 3. 뺄 순서 (확정)
56
+
57
+ 1. **B1 continuation scheduler (L2272–2418)** — 첫 조각. §5-③ 자율 발화라 위험도가 가장 높고 경계가 가장 깨끗하다. **B4 dig/replay armer(L2387–2415)는 이 조각에 동승한다** — §1 B4 행대로 B1 try 블록 내부에 중첩되어 분리 이전 불가(별도 단계 없음).
58
+ 2. **B2 TOX wireTox (L2242–2269)** — B1과 같은 조각으로 함께 이전 가능(분해 권고 조각 2의 첫 명세: "continuation·TOX 등 목록 상 첫 번째").
59
+ 3. B3 thread sweep (L2546–2589)
60
+ 4. B5 catch-up sweep
61
+ 5. B6 patcher substrate
62
+ 6. B7 devices cron
63
+ 7. B8 텔레그램/디스코드 폴러
64
+ 8. B9 카드 decision 판단
65
+ 9. C6 run-to-completion 내부 판단·루프·하니스 성 로직(daemon.ts emit 콜백 L183–261) — 별도 조각(§2 C6 행의 구체 경계대로)
66
+
67
+ ## 4. 이전 형태(수송 계약) — running-runs 패턴 복제
68
+
69
+ - 짧게 사는 **bun 자식 프로세스** (`src/nexus/api/running-runs-background.ts` / `running-runs-child.ts` 선례):
70
+ - 자식 스크립트가 로직을 실행하고 결과를 stdout JSON으로 인쇄
71
+ - 부모는 15s refresh · 60s timeout · in-flight dedup로 스냅샷만 즉시 반환
72
+ - supervisor TabSpec (`src/nexus/kinds/daemon.ts` `createDaemonTabSpec` 계약): socket health 10s · on-crash backoff [5s,15s,60s] · maxPerHour 5 — **재시작 0 운영 레일**.
73
+ - 호출자: `runNexus()`(src/nexus/index.ts) 안 해당 로직의 기존 위치 — diff에서 호출 치환이 보여야 한다(wiring 증거).
74
+
75
+ ## 5. 보존 지점 (무조건)
76
+
77
+ - `gracefulExit`/`cleanExit` · `wrappedRelease` · `drainTelegramThen` 종결 훅 — 이전되는 로직의 자식 프로세스는 이 훅에서 함께 정지되어야 한다.
78
+ - `runtime.json` 사이드카 형식(`NexusRuntimeMeta`) — 무변.
79
+ - 다른 명령·화면의 기본 동작 · 원장 형식 — 무변.
80
+ - 칸 범위 밖(src/nexus/index.ts · src/workflow-runtime/daemon.ts 외)은 건드리지 않는다. (자식 스크립트·TabSpec 신규 파일은 이 목적의 산출물로 칸 근거가 허용하는 범위에서 후속 조각이 판단한다.)
81
+
82
+ ## 6. 남은 것 (칸 근거 끝 반영)
83
+
84
+ - 이번 런(1단계) = 이 문서(목록 ⊕ 순서)까지. 가지 보존, 재발사는 디스패처·TA 판단.
85
+ - 미이전 항목: 위 §3 전부 (B1–B9 · C6) — 순서 확정만 됨.
86
+
87
+ ## 7. 검증 기록 (1단계 실측 · 줄 단위 대조)
88
+
89
+ 이 절은 §1 목록이 실제 코드와 대응하는지 `rg -n`으로 대조한 실측 기록이다. 이 라운드에 코드는 건드리지 않았다(1단계 = 측정 먼저).
90
+
91
+ | 문서 항목 | 실측 (rg -n on src/nexus/index.ts) | 일치 |
92
+ |---|---|---|
93
+ | B1 continuation | L2272 `nexus boot: autonomous continuation scheduler` … L2418 | ✅ |
94
+ | B2 TOX | L2242 `nexus boot: TOX` … L2269 | ✅ |
95
+ | B3 thread sweep | L2546 `UR4b 조율자 상주 thread-awareness sweep` … L2589 | ✅ |
96
+ | B4 dig/replay armer | L2387 `nexus boot: dig/replay armer` (continuation 블록 내부) | ✅ |
97
+ | B5 catch-up sweep | L2489 `이관잡 catch-up 자기회복` | ✅ |
98
+ | A3 HTTP 배선 | `rg -n 'startNexusHttpServer\('` → L2951 호출 | ✅ |
99
+ | A7 카드 타이머 | `rg -n 'webPushDecisionTimer'` → L2762 | ✅ |
100
+ | A8 종결 훅 | L3312 `Awaiting completion of async termination tasks (p0)` · L3514 `drainTelegramThen(…)` · L3710 `wireTox` 자동 해제 | ✅ |
101
+ | B6/B7 | `buildPatcherSubstrate`·`buildDevicesSubstrate` 임포트 + `wireSubstrates` L3170 | ✅ |
102
+
103
+ ### 판정선 시험
104
+
105
+ 골이 지정한 11개 경로 중 이 트리에 실재하는 8개와 그 자리의 실물 시험(총 12파일)을 실행했다:
106
+
107
+ ```
108
+ bun test src/nexus/index.test.ts test/workflow-runtime-daemon.test.ts \
109
+ src/nexus/api/running-runs-background.test.ts test/nexus-supervisor-health.test.ts \
110
+ test/nexus-supervisor-restart.test.ts test/nexus-kinds-daemon.test.ts \
111
+ test/nexus-daemon-tab-default-off.test.ts test/nexus-runtime-integration.test.ts \
112
+ test/nexus-prompt-stream-sse.test.ts src/nexus/api/task-cards-api.test.ts \
113
+ test/nexus-headless-mode.test.ts test/nexus-graceful-exit.test.ts
114
+ ```
115
+
116
+ 결과: **182 pass · 0 fail · 1 skip**. 골이 지정한 3개 경로(`supervisor/index`·`kinds/daemon`·`sse-heartbeat`)는 이 트리에 존재하지 않고(경로 실측: `bun test 'src/nexus/supervisor/index.test.ts'` → `error: Could not find`), 같은 단위를 커버하는 실물 시험이 위 목록으로 돌았다.
117
+
118
+ ### §간 정합 대조 (must-fix 수리 기록)
119
+
120
+ - §1 B4 행(«B1 try 블록 내부 중첩 ⇒ 분리 이전 불가, 같은 조각으로만(B1 조각에 동승)») ↔ §3: B4는 §3에서 독립 단계로 존재하지 «않고» 1번 B1 항에 «B4 dig/replay armer는 이 조각에 동승한다»로 명시 — 모순 0건. 재현: `rg -n '같은 조각|이 조각에 동승' src/nexus/DAEMON-THIN-inventory-2026-10-15.md` → §1 B4 행·§3 1번만 B4를 언급(§3 4번 독립 단계 행은 삭제됨).
121
+ - §2 C6 행(구체 경계: emit 콜백 L183–261 · runFn = runWorkflowToCompletion) ↔ §3: C6가 §3 9번에 같은 경계로 배치 — §3가 C6 없이 끝나던 공백 제거.
122
+ - 골 문서 U층 ↔ 게이트 관측: 이 diff에는 실행 코드 변경이 없다(`Verify-by-breaking: skipped; reason=no-changes`). 골 U층의 «데몬 얇음·자식 프로세스 이전·재시작 0» 줄은 «이 조각에서 미측정 — 후속 조각(이전 완료 후) 판정»으로 정정했다(§6 미이전 명시와 정합). `runNexus()` 실경로 관측은 후속 조각의 수용 기준으로 이관된다.
@@ -861,29 +861,53 @@ function isWithinRoot(path: string, root: string): boolean {
861
861
  return rel === '' || (!rel.startsWith('..') && !isAbsolute(rel));
862
862
  }
863
863
 
864
+ /** realpath-resolved folder-root allow-list; a missing root grants nothing. */
865
+ function resolveFolderRoots(roots: string[]): string[] {
866
+ const allowed: string[] = [];
867
+ for (const root of roots) {
868
+ try { allowed.push(realpathSync(root)); } catch { /* a missing root grants nothing */ }
869
+ }
870
+ return allowed;
871
+ }
872
+
873
+ /** Outcome of the folder-root allow-list check shared by the picker and project creation. */
874
+ type FolderRootResolution =
875
+ | { ok: true; path: string }
876
+ | { ok: false; error: 'folder_unavailable' | 'outside_allowed_roots'; status: 404 | 403 };
877
+
878
+ /**
879
+ * Resolves a folder path against the allow-listed roots with realpath first,
880
+ * so `..` segments and symlinks cannot escape the roots. A path that cannot
881
+ * be resolved is unavailable (404); a resolved path outside every root is
882
+ * refused (403).
883
+ */
884
+ function resolveWithinFolderRoots(requested: string, allowed: string[]): FolderRootResolution {
885
+ let path: string;
886
+ try { path = realpathSync(requested); }
887
+ catch { return { ok: false, error: 'folder_unavailable', status: 404 }; }
888
+ if (!allowed.some(root => isWithinRoot(path, root))) {
889
+ return { ok: false, error: 'outside_allowed_roots', status: 403 };
890
+ }
891
+ return { ok: true, path };
892
+ }
893
+
864
894
  /**
865
895
  * Remote folder picker: lists sub-folders under an allow-listed root only.
866
896
  * Every path is resolved with realpath first, so `..` segments and symlinks cannot escape the roots;
867
897
  * dot-folders are hidden and symlinked entries that point outside the roots are not listed.
868
898
  */
869
899
  export function handleProjectFoldersGet(req: Request, roots: string[] = [homedir()]): Response {
870
- const allowed: string[] = [];
871
- for (const root of roots) {
872
- try { allowed.push(realpathSync(root)); } catch { /* a missing root grants nothing */ }
873
- }
900
+ const allowed = resolveFolderRoots(roots);
874
901
  if (allowed.length === 0) return jsonResponse({ error: 'folder_unavailable' }, 404);
875
902
  const requested = new URL(req.url).searchParams.get('path') ?? allowed[0]!;
876
903
  if (!isAbsolute(requested) || requested.includes('\0')) return jsonResponse({ error: 'invalid_folder' }, 400);
877
- let path: string;
878
- try { path = realpathSync(requested); }
879
- catch {
880
- debug.log('nexus.projects', 'folders-unavailable', { reason: 'missing' });
881
- return jsonResponse({ error: 'folder_unavailable' }, 404);
882
- }
883
- if (!allowed.some(root => isWithinRoot(path, root))) {
884
- debug.log('nexus.projects', 'folders-refused', { reason: 'outside-roots' });
885
- return jsonResponse({ error: 'outside_allowed_roots' }, 403);
904
+ const resolved = resolveWithinFolderRoots(requested, allowed);
905
+ if (!resolved.ok) {
906
+ if (resolved.status === 403) debug.log('nexus.projects', 'folders-refused', { reason: 'outside-roots' });
907
+ else debug.log('nexus.projects', 'folders-unavailable', { reason: 'missing' });
908
+ return jsonResponse({ error: resolved.error }, resolved.status);
886
909
  }
910
+ const path = resolved.path;
887
911
  try {
888
912
  if (!statSync(path).isDirectory()) return jsonResponse({ error: 'not_directory' }, 400);
889
913
  const folders = readdirSync(path, { withFileTypes: true })
@@ -905,7 +929,12 @@ export function handleProjectFoldersGet(req: Request, roots: string[] = [homedir
905
929
  }
906
930
  }
907
931
 
908
- export async function handleProjectsPost(req: Request): Promise<Response> {
932
+ /**
933
+ * Project creation. A `primaryFolder`, when given, must pass the same
934
+ * projectFolderRoots allow-list as the remote folder picker: realpath first,
935
+ * so `..` segments and symlinks cannot persist a folder outside the roots.
936
+ */
937
+ export async function handleProjectsPost(req: Request, roots: string[] = [homedir()]): Promise<Response> {
909
938
  let body: unknown;
910
939
  try { body = await req.json(); }
911
940
  catch { return jsonResponse({ error: 'invalid_json' }, 400); }
@@ -919,6 +948,16 @@ export async function handleProjectsPost(req: Request): Promise<Response> {
919
948
  if (primaryFolder !== undefined && (typeof primaryFolder !== 'string' || !isAbsolute(primaryFolder))) {
920
949
  return jsonResponse({ error: 'invalid_primary_folder' }, 400);
921
950
  }
951
+ if (typeof primaryFolder === 'string') {
952
+ const allowed = resolveFolderRoots(roots);
953
+ if (allowed.length === 0) return jsonResponse({ error: 'folder_unavailable' }, 404);
954
+ const resolved = resolveWithinFolderRoots(primaryFolder, allowed);
955
+ if (!resolved.ok) {
956
+ if (resolved.status === 403) debug.log('nexus.projects', 'post-primary-folder-refused', { reason: 'outside-roots' });
957
+ else debug.log('nexus.projects', 'post-primary-folder-unavailable', { reason: 'missing' });
958
+ return jsonResponse({ error: resolved.error }, resolved.status);
959
+ }
960
+ }
922
961
  return jsonResponse({ project: createProject({ name, ...(primaryFolder !== undefined ? { primaryFolder } : {}) }) }, 201);
923
962
  }
924
963
 
@@ -1498,7 +1537,7 @@ export async function routeRequest(
1498
1537
  }
1499
1538
  if (pathname === '/v1/projects' && (method === 'GET' || method === 'POST')) {
1500
1539
  if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
1501
- return method === 'GET' ? handleProjectsGet() : handleProjectsPost(req);
1540
+ return method === 'GET' ? handleProjectsGet() : handleProjectsPost(req, opts.projectFolderRoots);
1502
1541
  }
1503
1542
  if (pathname.startsWith('/v1/projects/') && pathname.endsWith('/autopsy') && method === 'GET') {
1504
1543
  if (!opts.metaApi || !checkAuth(req, opts.metaApi)) return jsonResponse({ error: 'unauthorized' }, 401);
@@ -1,11 +1,13 @@
1
1
  import { defaultListHarnessProcesses } from '../../harness/harness-cli-command.js';
2
2
  import { devVersion, listChecklist } from '../../release-loop/checklist.js';
3
3
  import { listSchedules } from '../../release-loop/release-schedule.js';
4
- import { releaseLedgerRoot } from '../../instance/resolve.js';
4
+ import { effectiveInstanceRoot, releaseLedgerRoot } from '../../instance/resolve.js';
5
+ import { ResourceLedger, type ResourceView } from '../../control-plane/ledger.js';
5
6
  import { getUserConfig, ORCHESTRATOR_DEFAULTS } from '../../user-config.js';
6
7
  import { seatOfTree, trafficTick, TRAFFIC_SEATS, type TrafficCell, type TrafficResult } from '../../loops/orchestrator/traffic.js';
7
8
  import { finishAdvice, measureFinish } from '../../loops/orchestrator/finish-rate.js';
8
9
  import { jsonResponse } from './json-response.js';
10
+ import { debug } from '../../debug/log.js';
9
11
 
10
12
  /** Read-only snapshot of the same ORCH traffic decision used by the scheduled tick. */
11
13
  export function observeLoopResources(deps: {
@@ -36,7 +38,21 @@ export function observeLoopResources(deps: {
36
38
  });
37
39
  }
38
40
 
39
- export function handleLoopResourcesGet(observe: () => TrafficResult = observeLoopResources): Response {
40
- try { return jsonResponse({ resource: observe() }); }
41
+ /** The Nexus resource view reads the existing control ledger; it never allocates a second pool ledger. */
42
+ export function handleLoopResourcesGet(
43
+ observe: () => TrafficResult = observeLoopResources,
44
+ listPodWorkers: () => ResourceView[] = () => new ResourceLedger(effectiveInstanceRoot()).list({ kind: 'pod-worker-lease' }),
45
+ ): Response {
46
+ try {
47
+ const resource = observe();
48
+ try {
49
+ const podWorkers = listPodWorkers().map(row => ({ id: row.id, machine: row.machine, workerId: row.name,
50
+ key: row.attrs.key, state: row.attrs.state, generation: row.attrs.generation, ageMs: row.ageMs, expired: row.expired }));
51
+ return jsonResponse({ resource, podWorkers });
52
+ } catch (error) {
53
+ debug.log('nexus.resource', 'pod-worker-ledger-unmeasured', { errorKind: error instanceof Error ? error.name : typeof error });
54
+ return jsonResponse({ resource, podWorkers: null, podWorkersError: 'unmeasured' });
55
+ }
56
+ }
41
57
  catch { return jsonResponse({ error: 'resource-unavailable' }, 503); }
42
58
  }
@@ -10,6 +10,7 @@ import { operatorSignal } from './operator.js';
10
10
  import { createSeatsCache, todayKst } from './ops-seats.js';
11
11
  import { liveSeatsSources } from './ops-seats-sources.js';
12
12
  import { createOverviewCache } from '../../ops/overview-cache.js';
13
+ import { resourcesFromOverview } from '../../ops/resources.js';
13
14
  import { parseSince } from '../../ops/overview-collect.js';
14
15
  import type { MetaApiOpts } from './meta-api.js';
15
16
 
@@ -192,6 +193,8 @@ export function handleOpsApi(req: Request, metaApi: MetaApiOpts | undefined): Re
192
193
  const signal = metaApi ? operatorSignal(req, metaApi) : { operator: false, operatorSource: null };
193
194
  if (!signal.operator) {
194
195
  debug.log('ops.api', 'refused', { path: pathname, source: signal.operatorSource });
196
+ // RES-FLOOR-API: no credential was offered at all — this endpoint names it 401; every other path keeps 403.
197
+ if (pathname === '/v1/ops/resources') return jsonResponse({ error: 'unauthorized' }, 401);
195
198
  return jsonResponse({ error: 'forbidden' }, 403);
196
199
  }
197
200
  const served = (response: Response): Response => {
@@ -210,6 +213,14 @@ export function handleOpsApi(req: Request, metaApi: MetaApiOpts | undefined): Re
210
213
  ...(version ? { version } : {}), ...(url.searchParams.has('owner') ? { owner: url.searchParams.get('owner')! } : {}) })
211
214
  .then((overview) => served(jsonResponse(overview)), () => jsonResponse({ error: 'overview-unavailable' }, 500));
212
215
  }
216
+ if (pathname === '/v1/ops/resources') {
217
+ // RES-FLOOR-API — shares the overview cache; no new collection, no kubectl/ssh call, never waits.
218
+ overviewCache ??= createOverviewCache();
219
+ const peeked = overviewCache.peek();
220
+ return Promise.resolve(peeked
221
+ ? served(jsonResponse(resourcesFromOverview(peeked.snapshot, peeked.pods, peeked.at)))
222
+ : served(jsonResponse({ stale: true })));
223
+ }
213
224
  if (pathname === '/v1/ops/seats') {
214
225
  const date = url.searchParams.get('date') ?? todayKst();
215
226
  if (!DATE.test(date) || Number.isNaN(Date.parse(`${date}T00:00:00+09:00`))) return jsonResponse({ error: 'invalid-date' }, 400);
@@ -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 });
@@ -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
@@ -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
  }