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,40 @@
1
+ #!/bin/sh
2
+ # Opt-in only: the launcher must prepend this directory to its isolated child's PATH.
3
+ case ${ELANOUS_GH_REAL_BIN-} in
4
+ /*) ;;
5
+ *) printf '%s\n' 'gh-surface: real gh absolute path required' >&2; exit 70 ;;
6
+ esac
7
+ if [ ! -f "$ELANOUS_GH_REAL_BIN" ] || [ ! -x "$ELANOUS_GH_REAL_BIN" ] || [ "$ELANOUS_GH_REAL_BIN" -ef "$0" ]; then
8
+ printf '%s\n' 'gh-surface: real gh unavailable' >&2
9
+ exit 70
10
+ fi
11
+ case $0 in
12
+ */*) capture=${0%/*}/capture.ts ;;
13
+ *) printf '%s\n' 'gh-surface: wrapper path unavailable' >&2; exit 70 ;;
14
+ esac
15
+ capture_pid=
16
+ forward_signal() {
17
+ signal=$1
18
+ trap - INT TERM
19
+ if [ -n "$capture_pid" ]; then
20
+ # Noninteractive shells may start an async child with SIGINT ignored.
21
+ # TERM reliably stops capture; the wrapper still exits with the original signal.
22
+ child_signal=$signal
23
+ if [ "$signal" = INT ]; then child_signal=TERM; fi
24
+ kill -s "$child_signal" "$capture_pid" 2>/dev/null || :
25
+ wait "$capture_pid" 2>/dev/null || :
26
+ fi
27
+ kill -s "$signal" "$$"
28
+ }
29
+ trap 'forward_signal INT' INT
30
+ trap 'forward_signal TERM' TERM
31
+ bun "$capture" "$@" &
32
+ capture_pid=$!
33
+ wait "$capture_pid"
34
+ capture_status=$?
35
+ trap - INT TERM
36
+ if [ "$capture_status" -ne 0 ]; then
37
+ printf '%s\n' 'gh-surface: capture failed' >&2
38
+ exit 70
39
+ fi
40
+ exec "$ELANOUS_GH_REAL_BIN" "$@"
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env bun
2
+ // Read-only operator/train entry: bun scripts/import-graph-scc.ts --base <full SHA> [--repo <clean checkout>]
3
+ import { reportImportGraphSccForGate } from './release-loop/import-graph-scc-run.js';
4
+
5
+ function parse(args: readonly string[]): { base40: string; repo: string; format: 'json' | 'table' } | null {
6
+ if (args.length % 2 !== 0) return null;
7
+ const values = new Map<string, string>();
8
+ for (let at = 0; at < args.length; at += 2) {
9
+ const name = args[at]!;
10
+ const value = args[at + 1]!;
11
+ if ((name !== '--base' && name !== '--repo' && name !== '--format') || !value || value.startsWith('-') || values.has(name)) return null;
12
+ values.set(name, value);
13
+ }
14
+ const base40 = values.get('--base');
15
+ const format = values.get('--format') ?? 'json';
16
+ return base40 && (format === 'json' || format === 'table')
17
+ ? { base40, repo: values.get('--repo') ?? process.cwd(), format } : null;
18
+ }
19
+
20
+ const input = parse(process.argv.slice(2));
21
+ if (!input) {
22
+ process.stderr.write('usage: bun scripts/import-graph-scc.ts --base <full SHA> [--repo <clean checkout>] [--format json|table]\n');
23
+ process.exitCode = 2;
24
+ } else {
25
+ const result = reportImportGraphSccForGate(input.repo, input.base40);
26
+ if (input.format === 'table' && result.ok) {
27
+ const { report } = result;
28
+ const rows = [
29
+ `HEAD ${result.head40} BASE ${result.base40}`,
30
+ `SCC ${report.cycleCount} largest ${report.largestScc} cut candidates ${report.cutCandidateTotal} ${report.measured ? 'measured' : 'unmeasured'}`,
31
+ 'Changed file | Definite tests | Possible tests | Impact',
32
+ '--- | ---: | ---: | ---',
33
+ ...report.changedFileImpacts.map((impact) => `${impact.file} | ${impact.affectedTestCount} | ${impact.possibleTestCount} | ${impact.measured ? 'measured' : impact.issues.join('; ')}`),
34
+ ];
35
+ process.stdout.write(`${rows.join('\n')}\n`);
36
+ } else process.stdout.write(`${JSON.stringify(result)}\n`);
37
+ process.exitCode = !result.ok ? 2 : result.report.measured ? 0 : 1;
38
+ }
@@ -101,6 +101,25 @@ for ($index = 0; $index -lt $RemainingArgs.Count; $index++) {
101
101
  if ($Help) { Show-Usage; exit 0 }
102
102
  $installLang = if ($env:ELANOUS_INSTALL_LANG) { $env:ELANOUS_INSTALL_LANG } else { [Globalization.CultureInfo]::CurrentUICulture.Name }
103
103
  $installLang = if ($installLang -match '^ko(?:-|$)') { 'ko' } else { 'en' }
104
+
105
+ # WIN-ARM64-VM-TRIAL (0.2.40): Windows on ARM reports ARM64 via PROCESSOR_ARCHITECTURE (ARM64-native
106
+ # host) or PROCESSOR_ARCHITEW6432 (32-bit host on 64-bit Windows). bun, the required runtime, publishes
107
+ # no Windows ARM64 build (its installer fetches bun-windows-x64), so refuse before touching the prefix
108
+ # or the profile. Exit 78 (EX_CONFIG) keeps this distinct from 127 (required command missing) and 1.
109
+ # Third tier (re-issued fragment): a host that spawns PowerShell with a scrubbed environment block still
110
+ # reports its architecture through the .NET runtime (RuntimeInformation, in .NET since 4.7.1, the floor
111
+ # under PowerShell 5.1), so fall back to it only when both environment variables are absent. Guarded to
112
+ # Windows_NT: elsewhere the host architecture says nothing about Windows installability and the gate must
113
+ # keep its pre-fallback behavior. Uppercased: the enum prints Arm64, the check below reads ARM64.
114
+ $osArchitecture = $env:PROCESSOR_ARCHITEW6432
115
+ if (-not $osArchitecture) { $osArchitecture = $env:PROCESSOR_ARCHITECTURE }
116
+ if (-not $osArchitecture -and $env:OS -eq 'Windows_NT') {
117
+ try { $osArchitecture = ([string][System.Runtime.InteropServices.RuntimeInformation]::ProcessArchitecture).ToUpperInvariant() } catch { $osArchitecture = $null }
118
+ }
119
+ if ($osArchitecture -eq 'ARM64') {
120
+ Fail (Say 'Windows on ARM (ARM64) is not supported yet: bun, the required runtime, has no Windows ARM64 build, so nothing was installed. Use x64 Windows for now (WIN-ARM64-VM-TRIAL tracks the first live measurement).' '\uc708\ub3c4\uc6b0 ARM(ARM64)\uc740 \uc544\uc9c1 \uc9c0\uc6d0\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4: \ud544\uc218 \ub7f0\ud0c0\uc784 bun \uc5d0 \uc708\ub3c4\uc6b0 ARM64 \ube4c\ub4dc\uac00 \uc5c6\uc5b4 \uc544\ubb34\uac83\ub3c4 \uc124\uce58\ud558\uc9c0 \uc54a\uc558\uc2b5\ub2c8\ub2e4. \ub2f9\ubd84\uac04 x64 \uc708\ub3c4\uc6b0\ub97c \uc0ac\uc6a9\ud558\uc138\uc694(WIN-ARM64-VM-TRIAL \uce78\uc774 \uccab \uc2e4\uce21\uc744 \ucd94\uc801\ud569\ub2c8\ub2e4).') 78
121
+ }
122
+
104
123
  if (-not $Prefix) {
105
124
  $dataHome = if ($env:LOCALAPPDATA) { $env:LOCALAPPDATA } else { Join-Path $HOME 'AppData\Local' }
106
125
  $Prefix = if ($env:ELANOUS_INSTALL_PREFIX) { $env:ELANOUS_INSTALL_PREFIX } else { Join-Path $dataHome 'elanous' }
@@ -0,0 +1,181 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { spawnSync } from 'node:child_process';
3
+ import { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
4
+ import { homedir } from 'node:os';
5
+ import { dirname, join, resolve } from 'node:path';
6
+ import { effectiveInstanceRoot } from '../src/instance/resolve.js';
7
+ import { canonicalUrl } from '../src/intake-plane/items.js';
8
+
9
+ export interface CommunityPoint { title: string; url: string; text: string }
10
+ export interface SocialCheck { items: { fact: string; line: string; verdict: string; current: string }[] }
11
+ export interface SocialDeps {
12
+ now?: () => Date;
13
+ crawl?: () => Promise<CommunityPoint[]>;
14
+ check?: (facts: readonly string[]) => Promise<SocialCheck>;
15
+ log?: (message: string) => void;
16
+ }
17
+
18
+ const QUERY = '최근 24시간 AI 코딩 에이전트·하니스·로컬 LLM 커뮤니티(X·Reddit) 화제와 반응';
19
+ const MAX_POINTS = 8;
20
+ // URL 을 뺀 뒤 남는 서술의 최소 길이 — «링크만 있는 줄» 같은 레이블은 내용 없는 동향이라 흡수하지 않는다.
21
+ const MIN_TREND_TEXT_LENGTH = 12;
22
+ const OMNI_JSON_BEGIN = '---BEGIN_OMNI_CRAWL_JSON---';
23
+ const OMNI_JSON_END = '---END_OMNI_CRAWL_JSON---';
24
+
25
+ /** grok-community rawText(마크다운 보고서)에서 불릿/번호 줄만 뽑아 링크 있는 동향 점으로 만든다. */
26
+ export function parseCommunityReport(rawText: string): CommunityPoint[] {
27
+ const points: CommunityPoint[] = [];
28
+ for (const rawLine of rawText.split('\n')) {
29
+ const line = rawLine.trim();
30
+ if (!/^(?:[-*•·]|\d{1,2}[.)])\s+/.test(line)) continue;
31
+ const url = line.match(/https?:\/\/[^\s)\]]+/)?.[0];
32
+ if (!url) continue;
33
+ const text = line
34
+ .replace(/^(?:[-*•·]|\d{1,2}[.)])\s+/, '')
35
+ .replace(/\[([^\]]*)\]\(https?:\/\/[^)]*\)/g, '$1')
36
+ .replace(/\*\*([^*]+)\*\*/g, '$1')
37
+ .replace(/\*([^*]+)\*/g, '$1')
38
+ .replace(/https?:\/\/\S+/g, '')
39
+ .replace(/\s+/g, ' ')
40
+ .trim();
41
+ if (text.length < MIN_TREND_TEXT_LENGTH) continue;
42
+ points.push({ title: text.slice(0, 120), url, text });
43
+ }
44
+ return points;
45
+ }
46
+
47
+ /** omni-crawl `--json` 페이로드(results[].items ⊕ results[].summary)에서 커뮤니티 동향 점을 합친다. URL 로 중복을 뺀다. */
48
+ export function parseOmniCrawlPayload(payload: { results?: { items?: { url?: unknown; title?: unknown; text?: unknown }[]; summary?: unknown }[] }): CommunityPoint[] {
49
+ const points: CommunityPoint[] = [];
50
+ const urls = new Set<string>();
51
+ for (const result of payload.results ?? []) {
52
+ const fromItems = (result.items ?? []).flatMap((item) => {
53
+ const url = typeof item.url === 'string' && /^https?:\/\//.test(item.url) ? item.url : '';
54
+ const title = typeof item.title === 'string' ? item.title.trim() : '';
55
+ const text = typeof item.text === 'string' ? item.text.trim() : '';
56
+ return url && (title || text) ? [{ title: (title || text).slice(0, 120), url, text: text || title }] : [];
57
+ });
58
+ const fromSummary = parseCommunityReport(typeof result.summary === 'string' ? result.summary : '');
59
+ for (const point of [...fromItems, ...fromSummary]) {
60
+ const key = canonicalUrl(point.url) ?? point.url;
61
+ if (urls.has(key)) continue;
62
+ urls.add(key);
63
+ points.push(point);
64
+ }
65
+ }
66
+ return points;
67
+ }
68
+
69
+ /** omni-crawl 스킬의 grok-community 엔진을 실제로 돌린다(스킬 .env 를 엔진이 알아서 적재한다). */
70
+ async function crawlWithOmniCrawl(): Promise<CommunityPoint[]> {
71
+ const dir = process.env.OMNI_CRAWL_DIR || join(homedir(), '.claude', 'skills', 'omni-crawl');
72
+ if (!existsSync(dir)) throw new Error(`omni-crawl 스킬 디렉터리 없음: ${dir}`);
73
+ const result = spawnSync('bun', ['scripts/main.ts', QUERY, '--engine', 'grok-community', '--json', '--no-save'], {
74
+ cwd: dir, encoding: 'utf8', timeout: 600_000, maxBuffer: 32 * 1024 * 1024,
75
+ });
76
+ if (result.error || result.status !== 0) throw new Error(result.error?.message ?? result.stderr?.trim() ?? `omni-crawl exited ${result.status}`);
77
+ const begin = result.stdout.indexOf(OMNI_JSON_BEGIN);
78
+ const end = result.stdout.lastIndexOf(OMNI_JSON_END);
79
+ if (begin < 0 || end <= begin) throw new Error('omni-crawl JSON 마커 없음');
80
+ return parseOmniCrawlPayload(JSON.parse(result.stdout.slice(begin + OMNI_JSON_BEGIN.length, end)) as Parameters<typeof parseOmniCrawlPayload>[0]);
81
+ }
82
+
83
+ /** 함의 판정은 로컬 흉내가 아니라 CLI(intake check) 가 정본이다. 칸이나 판을 바꾸지 않는다. */
84
+ async function checkWithCli(facts: readonly string[]): Promise<SocialCheck> {
85
+ const result = spawnSync('bun', ['bin/elanous.mjs', '--test', 'intake', 'check', ...facts.flatMap((fact) => ['--fact', fact]), '--json'], {
86
+ cwd: resolve(import.meta.dir, '..'), encoding: 'utf8', timeout: 120_000, maxBuffer: 4 * 1024 * 1024,
87
+ });
88
+ if (result.error || result.status !== 0) throw new Error(result.error?.message ?? result.stderr?.trim() ?? `intake check exited ${result.status}`);
89
+ const start = result.stdout.indexOf('{');
90
+ if (start < 0) throw new Error('intake check JSON 없음');
91
+ const parsed = JSON.parse(result.stdout.slice(start)) as SocialCheck;
92
+ if (!Array.isArray(parsed.items)) throw new Error('intake check items 없음');
93
+ return parsed;
94
+ }
95
+
96
+ function splitSentences(text: string): string[] {
97
+ const clean = text.replace(/\s+/g, ' ').trim();
98
+ if (!clean) return [];
99
+ return clean.split(/(?<=[.!?。])\s+/).map((sentence) => sentence.trim()).filter(Boolean)
100
+ .map((sentence) => sentence.slice(0, 240)).slice(0, 5);
101
+ }
102
+
103
+ export async function runIntakeSocial(options: { root: string; deps?: SocialDeps }): Promise<{ written: number; failed: number }> {
104
+ const { root, deps = {} } = options;
105
+ const log = deps.log ?? ((message: string) => console.error(message));
106
+ const now = (deps.now ?? (() => new Date()))();
107
+ const day = new Date(now.getTime() + 9 * 3600_000).toISOString().slice(0, 10);
108
+ const state = join(root, 'intake', 'social-seen.jsonl');
109
+ const lens = join(root, 'intake', 'outbox', 'lens', `${day}.jsonl`);
110
+ const seen = new Set(existsSync(state) ? readFileSync(state, 'utf8').split('\n').filter(Boolean) : []);
111
+ // 렌즈에 이미 쓴 동향도 «본 것» — 상태 기록이 죽어도 재실행이 같은 점을 다시 쓰지 않는다(24h 창이라 어제·오늘 파일).
112
+ const yesterday = new Date(now.getTime() + 9 * 3600_000 - 86_400_000).toISOString().slice(0, 10);
113
+ for (const lensDay of [yesterday, day]) {
114
+ const file = join(root, 'intake', 'outbox', 'lens', `${lensDay}.jsonl`);
115
+ if (!existsSync(file)) continue;
116
+ for (const line of readFileSync(file, 'utf8').split('\n')) {
117
+ try { const id = (JSON.parse(line) as { id?: unknown }).id; if (typeof id === 'string') seen.add(id); } catch { /* 깨진 줄은 건너뛴다 */ }
118
+ }
119
+ }
120
+ let written = 0;
121
+ let failed = 0;
122
+ const crawl = deps.crawl ?? crawlWithOmniCrawl;
123
+ let points: CommunityPoint[] = [];
124
+ try {
125
+ points = await crawl();
126
+ } catch (error) {
127
+ failed++;
128
+ log(`못 모음: grok-community — ${error instanceof Error ? error.message : String(error)}`);
129
+ return { written, failed };
130
+ }
131
+ for (const point of points) {
132
+ if (written >= MAX_POINTS) break;
133
+ if (!/^https?:\/\//.test(point.url)) continue;
134
+ const id = createHash('sha256').update(canonicalUrl(point.url) ?? point.url).digest('hex').slice(0, 16);
135
+ if (seen.has(id)) continue;
136
+ try {
137
+ const summary = splitSentences(point.text);
138
+ if (!summary.length) throw new Error('요약 줄 없음');
139
+ // 동향 자체는 기능 주장이 아니다. 제목과 본문에 실제로 적힌 제품 주장만 추가로 대조한다.
140
+ const isProductClaim = (fact: string) => /^(?:elanous|엘라누스)\s*(?:는|은)\s+/i.test(fact);
141
+ const facts = [...new Set([
142
+ ...summary.slice(0, 2),
143
+ ...splitSentences(point.title).filter(isProductClaim),
144
+ ...summary.filter(isProductClaim),
145
+ ])];
146
+ const check = await (deps.check ?? checkWithCli)(facts);
147
+ if (!check.items.length) throw new Error('intake check 항목 없음');
148
+ const productClaims = new Set(facts.filter(isProductClaim));
149
+ const judgedClaims = check.items.filter((item) => productClaims.has(item.fact));
150
+ const suggestions = judgedClaims.filter((item) => item.verdict === '없음' || item.verdict === '판단 필요')
151
+ .map((item) => ({ kind: '칸 제안', fact: item.fact, status: '제안', verdict: item.verdict }));
152
+ const verdict = suggestions.length ? '보강'
153
+ : judgedClaims.length && !judgedClaims.every((item) => item.verdict === '있음') ? '경쟁 대조' : '참고';
154
+ const implication = facts.map((fact) => productClaims.has(fact)
155
+ ? check.items.find((item) => item.fact === fact)?.line ?? `점검 결과 없음: ${fact}`
156
+ : `커뮤니티 동향 참고: ${fact}`);
157
+ const record = {
158
+ id, at: now.toISOString(), source: 'grok-community', url: point.url, title: point.title.slice(0, 120),
159
+ summary, implication, suggestions,
160
+ lensVerdict: verdict, why: `${judgedClaims.length ? '엘라누스 대조' : '커뮤니티 동향 참고'}: ${implication.join(' · ')}`.slice(0, 500),
161
+ target: point.text.match(/\b[A-Z][A-Z0-9]{2,}\b/)?.[0] ?? '커뮤니티',
162
+ };
163
+ mkdirSync(dirname(lens), { recursive: true });
164
+ appendFileSync(lens, `${JSON.stringify(record)}\n`);
165
+ mkdirSync(dirname(state), { recursive: true });
166
+ appendFileSync(state, `${id}\n`);
167
+ seen.add(id);
168
+ written++;
169
+ } catch (error) {
170
+ failed++;
171
+ log(`못 모음: ${point.url} — ${error instanceof Error ? error.message : String(error)}`);
172
+ }
173
+ }
174
+ return { written, failed };
175
+ }
176
+
177
+ if (import.meta.main) {
178
+ const result = await runIntakeSocial({ root: effectiveInstanceRoot() });
179
+ console.log(`intake-social: ${result.written}건 · 못 모음 ${result.failed}건`);
180
+ if (result.failed) process.exitCode = 1;
181
+ }
@@ -1,12 +1,18 @@
1
1
  #!/usr/bin/env bun
2
2
  import { spawnSync } from 'node:child_process';
3
- import { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from 'node:fs';
3
+ import { createHash } from 'node:crypto';
4
+ import { constants, copyFileSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from 'node:fs';
4
5
  import { dirname, extname, isAbsolute, join, resolve } from 'node:path';
5
6
  import { fileURLToPath } from 'node:url';
6
7
  import { homedir } from 'node:os';
7
8
  import { debug } from '../../src/debug/log.js';
8
9
  import { runOcr } from '../../skills/omni-digest/src/ocr.js';
9
10
  import { streamLLM } from '../../src/llm.js';
11
+ import { decodeFieldAudio } from '../../src/field-note/telegram.js';
12
+ import { createBatchSttEngine, transcribeFieldAudio, type FieldAudio, type TranscriptionEngine } from '../../src/field-note/transcribe.js';
13
+ import { createSTTProvider } from '../../src/voice/stt-provider.js';
14
+ import { resolveObsidianRoot } from '../../src/acp/fs-roots.js';
15
+ import { assertVaultWriteAllowed } from '../../src/obsidian/vault-write-guard.js';
10
16
  import { unified } from 'unified';
11
17
  import remarkParse from 'remark-parse';
12
18
  import remarkGfm from 'remark-gfm';
@@ -15,7 +21,7 @@ import rehypeSanitize from 'rehype-sanitize';
15
21
  import rehypeStringify from 'rehype-stringify';
16
22
 
17
23
  export type Stage = 'collect' | 'draft' | 'render' | 'html' | 'pdf';
18
- export interface Input { name: string; kind: 'pdf' | 'image' | 'markdown'; text: string }
24
+ export interface Input { name: string; kind: 'pdf' | 'image' | 'markdown' | 'audio'; text: string }
19
25
  export interface Counts { inputs: number; diagrams: number; rendered: number; html: 'yes' | 'no'; pdf: 'yes' | 'skipped' }
20
26
  export interface StageResult extends Counts { outcome: 'ok' | 'skipped' }
21
27
  export interface StageOptions {
@@ -23,11 +29,15 @@ export interface StageOptions {
23
29
  ocr?: (filePath: string) => Promise<string>;
24
30
  toolsPath?: string;
25
31
  referenceRoot?: string;
32
+ engine?: TranscriptionEngine;
33
+ decodeAudio?: (filePath: string, recordedAt: string) => FieldAudio;
34
+ vaultRoot?: string;
26
35
  }
27
36
 
28
37
  const ownRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../../skills');
29
38
  const kinds: Record<string, Input['kind']> = {
30
39
  '.pdf': 'pdf', '.md': 'markdown', '.png': 'image', '.jpg': 'image', '.jpeg': 'image', '.webp': 'image',
40
+ '.wav': 'audio', '.mp3': 'audio', '.m4a': 'audio', '.ogg': 'audio', '.webm': 'audio',
31
41
  };
32
42
  const mermaid = /^```mermaid\s*\n([\s\S]*?)^```\s*$/gm;
33
43
  const escapeHtml = (text: string) => text.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
@@ -92,13 +102,20 @@ export async function collect(folder: string, options: StageOptions = {}): Promi
92
102
  const sources = resolve(folder, 'sources/common');
93
103
  const scan = [{ base: folder, prefix: '' }, ...(pathStatus(sources)?.isDirectory() && !pathStatus(sources)?.isSymbolicLink()
94
104
  ? [{ base: sources, prefix: 'sources/common/' }] : [])];
105
+ let engine = options.engine;
95
106
  for (const { base, prefix } of scan) for (const entry of readdirSync(base, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name))) {
96
107
  const kind = kinds[extname(entry.name).toLowerCase()];
97
108
  if (!entry.isFile() || !kind) continue;
98
109
  const at = join(base, entry.name);
99
110
  let text: string;
100
111
  if (kind === 'markdown') text = readFileSync(at, 'utf8');
101
- else if (kind === 'image') {
112
+ else if (kind === 'audio') {
113
+ if (!engine) engine = createBatchSttEngine(await createSTTProvider({ id: 'openai-whisper' }));
114
+ const recordedAt = statSync(at).mtime.toISOString();
115
+ const entries = await transcribeFieldAudio((options.decodeAudio ?? decodeFieldAudio)(at, recordedAt), engine);
116
+ if (!entries.length) throw new Error(`오디오 전사 결과가 비었다: ${prefix + entry.name}`);
117
+ text = entries.map(({ timestamp, speaker, text }) => `${timestamp} · ${speaker}: ${text}`).join('\n');
118
+ } else if (kind === 'image') {
102
119
  try {
103
120
  const extracted = await (options.ocr ?? runOcr)(at);
104
121
  if (!extracted.trim()) throw new Error('Upstage/OCR.space 폴백 결과가 비었다');
@@ -130,14 +147,63 @@ export async function draft(folder: string, options: StageOptions = {}): Promise
130
147
  const dir = outputDir(folder);
131
148
  const inputs = readInputs(dir);
132
149
  if (!inputs.length) throw new Error('강의 자료가 없다');
133
- const prompt = `${instructions}\n\n자료:\n${inputs.map(i => `### ${i.name} (${i.kind})\n${i.text}`).join('\n\n')}`;
150
+ const audioInstructions = inputs.some(i => i.kind === 'audio')
151
+ ? '\n오디오 전사에서 근거를 찾아 노트 본문에 ## 요약 (내용 포함) 및 ## 할 일 셋 (번호 목록 1. 2. 3.)을 작성하라. 근거 없는 할 일은 만들지 말고 해당 항목은 없음으로 표시하라.' : '';
152
+ const prompt = `${instructions}${audioInstructions}\n\n자료:\n${inputs.map(i => `### ${i.name} (${i.kind})\n${i.text}`).join('\n\n')}`;
134
153
  const ask = options.llm ?? ((request: string) => streamLLM([{ role: 'user', content: request }], () => {}));
135
154
  const notes = (await ask(prompt)).trim();
136
155
  if (!notes) throw new Error('LLM 초안이 비었다');
156
+ if (audioInstructions && !hasAudioSummaryAndTasks(notes)) {
157
+ throw new Error('오디오 노트에 요약·할 일 셋이 없다');
158
+ }
137
159
  writeFileSync(artifact(dir, 'notes.md'), notes + '\n');
138
160
  return { ...counts(dir), outcome: 'ok' };
139
161
  }
140
162
 
163
+ function hasAudioSummaryAndTasks(notes: string): boolean {
164
+ const lines = notes.split(/\r?\n/);
165
+ const section = (title: string): string | undefined => {
166
+ const start = lines.findIndex(line => line.trimEnd() === `## ${title}`);
167
+ if (start < 0) return undefined;
168
+ const next = lines.slice(start + 1).findIndex(line => /^#{1,2}\s/.test(line));
169
+ return lines.slice(start + 1, next < 0 ? undefined : start + 1 + next).join('\n').trim();
170
+ };
171
+ const summary = section('요약');
172
+ const tasks = section('할 일 셋');
173
+ const summaryContent = summary?.split('\n').some(line => line.trim() && !/^#{1,6}\s/.test(line));
174
+ return !!summaryContent && !!tasks && /^1\. [^\S\n]*\S[^\n]*\n(?:[^\S\n]*\n)*2\. [^\S\n]*\S[^\n]*\n(?:[^\S\n]*\n)*3\. [^\S\n]*\S[^\n]*/m.test(tasks);
175
+ }
176
+
177
+ function publishAudioNote(folder: string, dir: string, notes: string, options: StageOptions): void {
178
+ if (!readInputs(dir).some(i => i.kind === 'audio')) return;
179
+ if (!hasAudioSummaryAndTasks(notes)) {
180
+ throw new Error('오디오 노트에 요약·할 일 셋이 없다');
181
+ }
182
+ const resolvedVault = options.vaultRoot ? { root: resolve(options.vaultRoot), available: true } : resolveObsidianRoot();
183
+ if (!resolvedVault.available) return;
184
+ const vault = resolve(resolvedVault.root);
185
+ const vaultStatus = pathStatus(vault);
186
+ if (vaultStatus?.isSymbolicLink()) throw new Error('vault 루트가 안전하지 않다');
187
+ if (!vaultStatus?.isDirectory()) return;
188
+ const course = resolve(folder);
189
+ const target = join(vault, 'lecture-notes', `${createHash('sha256').update(course + '\0' + notes.trim()).digest('hex')}.md`);
190
+ const section = pathStatus(join(vault, 'lecture-notes'));
191
+ if (section && (!section.isDirectory() || section.isSymbolicLink())) throw new Error('vault 강의 노트 폴더가 안전하지 않다');
192
+ assertVaultWriteAllowed(target);
193
+ if (!section) mkdirSync(join(vault, 'lecture-notes'));
194
+ const existing = pathStatus(target);
195
+ if (existing && (!existing.isFile() || existing.isSymbolicLink())) throw new Error('vault 노트 파일이 안전하지 않다');
196
+ if (existing && readFileSync(target, 'utf8') !== notes) throw new Error('vault 노트 해시 충돌');
197
+ if (!existing) {
198
+ try { copyFileSync(artifact(dir, 'notes.md'), target, constants.COPYFILE_EXCL); }
199
+ catch (error) {
200
+ const current = pathStatus(target);
201
+ if ((error as NodeJS.ErrnoException).code !== 'EEXIST' || !current?.isFile() ||
202
+ current.isSymbolicLink() || readFileSync(target, 'utf8') !== notes) throw error;
203
+ }
204
+ }
205
+ }
206
+
141
207
  export function render(folder: string, options: StageOptions = {}): StageResult {
142
208
  const dir = outputDir(folder);
143
209
  const notes = readFileSync(join(dir, 'notes.md'), 'utf8');
@@ -208,6 +274,7 @@ export function html(folder: string, options: StageOptions = {}): StageResult {
208
274
  `<style>${css}</style></head><body><div class="cover"><h1>${escapeHtml(title)}</h1></div>` +
209
275
  `<div class="toc"><h2>목차</h2><ol>${sections.join('\n')}</ol></div><div class="section">${numbered}</div></body></html>\n`;
210
276
  writeFileSync(artifact(dir, 'notes.html'), page);
277
+ publishAudioNote(folder, dir, notes, options);
211
278
  return { ...counts(dir), outcome: 'ok' };
212
279
  }
213
280
 
@@ -0,0 +1,32 @@
1
+ // 안드로이드 Gradle 빌드를 «실제로» 돌리는 시험의 전제 — JDK ⊕ Android SDK.
2
+ //
3
+ // ⛔ 0.2.20 컷(리눅스 게이트 Pod)에서 두 시험이 «JAVA_HOME is not set» 으로 빨갛게 떴다.
4
+ // Pod 이미지에는 JDK·Android SDK 가 없고, 넣으려면 SDK·Gradle 의존을 네트워크로 받아야 한다
5
+ // (게이트 Pod 의 몫이 아니다). macOS 개발 기계·`bun run test:android` 경로는 그대로 돈다.
6
+ // ⇒ 전제가 «없을 때만» 건너뛰고, 그 이유를 한 줄로 남긴다(조용한 skip 금지).
7
+ import { spawnSync } from 'node:child_process';
8
+ import { existsSync } from 'node:fs';
9
+ import { join } from 'node:path';
10
+
11
+ export function resolveJavaHome(): string | undefined {
12
+ if (process.env.JAVA_HOME) return process.env.JAVA_HOME;
13
+ for (const args of [['-v', '17'], []]) {
14
+ const probe = spawnSync('/usr/libexec/java_home', args, { encoding: 'utf8' });
15
+ if (probe.status === 0 && probe.stdout.trim()) return probe.stdout.trim();
16
+ }
17
+ return undefined;
18
+ }
19
+
20
+ export function resolveAndroidSdkDir(): string {
21
+ return process.env.ANDROID_HOME ?? join(process.env.HOME ?? '', 'Library/Android/sdk');
22
+ }
23
+
24
+ /** 없는 전제를 사람이 읽을 문장으로 준다. 다 있으면 null. */
25
+ export function androidToolchainMissing(): string | null {
26
+ const missing: string[] = [];
27
+ const javaOnPath = spawnSync('java', ['-version'], { encoding: 'utf8' }).status === 0;
28
+ if (!resolveJavaHome() && !javaOnPath) missing.push('JDK(JAVA_HOME·java_home·PATH 의 java 모두 없음)');
29
+ const sdk = resolveAndroidSdkDir();
30
+ if (!existsSync(sdk)) missing.push(`Android SDK(${sdk} 없음)`);
31
+ return missing.length ? missing.join(' · ') : null;
32
+ }
@@ -10,6 +10,7 @@
10
10
  import { mkdtempSync, rmSync } from 'node:fs';
11
11
  import { tmpdir } from 'node:os';
12
12
  import { join } from 'node:path';
13
+ import { envLiteral } from '../../src/platform/env-literal.js';
13
14
 
14
15
  /** True when the variable name has the SHAPE of a credential.
15
16
  *
@@ -89,3 +90,64 @@ export function prepareDeterministicChildEnvironment(
89
90
  throw error;
90
91
  }
91
92
  }
93
+
94
+ // A deterministic test child is not a harness executor: these inherited
95
+ // markers would activate write-boundary policy against each test's temp files.
96
+ const HARNESS_TEST_ENV_KEYS = [
97
+ 'ELANOUS_HARNESS_SPACE',
98
+ 'ELANOUS_HARNESS_SPACE_ID',
99
+ 'ELANOUS_HARNESS_BOUNDARY',
100
+ 'ELANOUS_HARNESS_ROLE',
101
+ 'ELANOUS_HARNESS_DETACHED',
102
+ ] as const;
103
+
104
+ // Discovery: rg -n "process\.env\.ELANOUS_(HOST|RUN|ORIGIN|SUPERVISOR|PARENT)" src
105
+ // These are ambient execution identities, not inputs to a deterministic test.
106
+ // debug.log also attributes SUBSTRATE and ARM_ID to every plain-object record.
107
+ export const GIT_LOCATION_ENV_KEYS = [
108
+ 'GIT_DIR', 'GIT_WORK_TREE', 'GIT_COMMON_DIR', 'GIT_INDEX_FILE',
109
+ 'GIT_OBJECT_DIRECTORY', 'GIT_ALTERNATE_OBJECT_DIRECTORIES',
110
+ ] as const;
111
+
112
+ const EXECUTION_ORIGIN_ENV_KEYS = [
113
+ 'ELANOUS_HOST_ID',
114
+ 'ELANOUS_RUN_ID',
115
+ 'ELANOUS_RUN_CONTEXT',
116
+ 'ELANOUS_PARENT_RUN_ID',
117
+ 'ELANOUS_PARENT_PTY_ID',
118
+ 'ELANOUS_PARENT_SELF_DEV_RUNS_DIR',
119
+ 'ELANOUS_SUBSTRATE',
120
+ 'ELANOUS_ARM_ID',
121
+ // Parent account selection changes CLI rotation assertions in the child.
122
+ 'ELANOUS_CODEX_ACCOUNT',
123
+ // A parent's derived-root label must not reclassify a test's explicit state dir.
124
+ 'ELANOUS_STATE_DIR_SOURCE',
125
+ ] as const;
126
+
127
+ export function prepareIsolatedTestEnv(sourceEnv: NodeJS.ProcessEnv, testRoot: string): NodeJS.ProcessEnv {
128
+ const env = Object.fromEntries(
129
+ Object.entries(sourceEnv).filter(([key]) => !isCredentialKey(key)
130
+ && !HARNESS_TEST_ENV_KEYS.includes(key as typeof HARNESS_TEST_ENV_KEYS[number])
131
+ && !EXECUTION_ORIGIN_ENV_KEYS.includes(key as typeof EXECUTION_ORIGIN_ENV_KEYS[number])
132
+ && !GIT_LOCATION_ENV_KEYS.includes(key as typeof GIT_LOCATION_ENV_KEYS[number])),
133
+ );
134
+ env.HOME = testRoot;
135
+ // userConfigPath() warns whenever XDG_CONFIG_HOME is set, including when
136
+ // config.json is absent. Use its non-XDG path; migrateLegacyXdgUserConfig()
137
+ // resolves the old path through ELANOUS_TEST_HOME rather than the real home.
138
+ delete env.XDG_CONFIG_HOME;
139
+ env.ELANOUS_TEST_HOME = testRoot;
140
+ // HOME and ELANOUS_STATE_DIR isolate both the state and default config roots.
141
+ // ELANOUS_CONFIG_DIR is not a config-dir override; discard an inherited value
142
+ // rather than passing an ignored variable that appears to provide isolation.
143
+ env.ELANOUS_STATE_DIR = join(testRoot, 'state');
144
+ delete env.ELANOUS_CONFIG_DIR;
145
+ // All ambient execution identities are removed by EXECUTION_ORIGIN_ENV_KEYS
146
+ // above, before the child is spawned; logger API-shape tests need their absence.
147
+ // ⚠️ No `ELANOUS_TEST_DETERMINISTIC` marker is exported. Nothing reads it yet,
148
+ // and an env var with no consumer is a surface that looks like a contract
149
+ // while guaranteeing nothing — a later test could branch on it believing it
150
+ // means something. The tier work in PLAN-test-suite-diet introduces the
151
+ // signal together with the code that honours it.
152
+ return envLiteral(env);
153
+ }
@@ -0,0 +1,19 @@
1
+ /** Shared deterministic environment for release and self gate test children. No process side effects. */
2
+ export const GATE_POD_ENV_BASELINE: Readonly<Record<string, string>> = Object.freeze({
3
+ TZ: 'UTC',
4
+ LANG: 'C.UTF-8',
5
+ LC_ALL: 'C.UTF-8',
6
+ ELANOUS_TEST_FAKE_LLM: '1',
7
+ });
8
+
9
+ /** Preserve an explicit fake-LLM choice (including '0'); pin locale and timezone. */
10
+ export function gateTestBaseline(source: NodeJS.ProcessEnv): Record<string, string> {
11
+ return {
12
+ ...GATE_POD_ENV_BASELINE,
13
+ ELANOUS_TEST_FAKE_LLM: source.ELANOUS_TEST_FAKE_LLM ?? GATE_POD_ENV_BASELINE.ELANOUS_TEST_FAKE_LLM,
14
+ };
15
+ }
16
+
17
+ export function withGateTestEnv(source: NodeJS.ProcessEnv): NodeJS.ProcessEnv {
18
+ return { ...source, ...gateTestBaseline(source) };
19
+ }
@@ -0,0 +1,41 @@
1
+ // ── morning-report 스크립트 CLI 인자 — 명시 서사 모델(--narrative-model) ────────
2
+ //
3
+ // scripts/morning-report.ts 는 지금 인자를 process.argv.includes(...) 인라인으로 읽는다
4
+ // (--dry · --no-narrate · --no-upload). 이 파일은 그 스크립트의 인자 계약을 일반 파서
5
+ // scripts/lib/argv.ts#parseArgv 위에 정의한다. 계약이 스크립트의 네 플래그를 «전부» 아는
6
+ // 것은, 이 헬퍼가 «스크립트 CLI 인자» 전체를 받아 모델 값만 뽑는 목적이어서다 —
7
+ // 다른 플래그가 섞인 실제 argv 가 들어와도 모델 값에 오염이 없다.
8
+ //
9
+ // 반환 계약 — src/domains/morning-report.ts#MorningReportOpts.model 에 그대로 꽂힌다:
10
+ // · '--narrative-model X' / '--narrative-model=X' 두 철자를 «같게» 읽어 값 문자열 반환.
11
+ // · 플래그가 없으면 undefined — src/domains/morning-essential.ts 의 기본 provider
12
+ // 경로(model 미지정 ⇒ providerFor(cfg))를 그대로 보존한다. 값이 없거나 빈 값이면
13
+ // parseArgv 오류를 던져 기본 모델로 조용히 실행되지 않도록 한다.
14
+ //
15
+ // ⛔ 의도된 경계(비연결 선언): 이 유닛은 «정의 + 단위시험» 에서 멈춘다.
16
+ // scripts/morning-report.ts 탑레벨(CLI 진입) → composeMorningReport(..., { model }) 배선은
17
+ // 의존 형제 샤드(task:d0183079b142)의 몫이다. 지금 이 유닛을 실행 경로에서 부르는 곳은
18
+ // scripts/lib/morning-report-options.test.ts(bun test, in-process) 다.
19
+
20
+ import { parseArgv, type ArgvContract } from './argv.js';
21
+
22
+ /** morning-report 스크립트의 전체 CLI 플래그 — 파서 계약(여기 없는 플래그는 거부된다). */
23
+ const MORNING_REPORT_ARGV: ArgvContract = {
24
+ known: {
25
+ '--dry': 'bool',
26
+ '--no-narrate': 'bool',
27
+ '--no-upload': 'bool',
28
+ '--narrative-model': 'value',
29
+ },
30
+ label: 'morning-report',
31
+ };
32
+
33
+ /**
34
+ * 아침 브리핑 시장서사의 명시 LLM 모델(--narrative-model)을 argv 에서 뽑는다.
35
+ * 플래그가 없으면 undefined — undefined 자체가 «기본 provider 경로» 값이다.
36
+ */
37
+ export function parseNarrativeModelArg(argv: string[]): string | undefined {
38
+ const parsed = parseArgv(argv, MORNING_REPORT_ARGV);
39
+ if (parsed.errors.length > 0) throw new Error(parsed.errors.join('\n'));
40
+ return parsed.values['narrative-model'];
41
+ }
@@ -14,6 +14,7 @@ import { debug } from '../src/debug/log.js';
14
14
  import { groundMissionInCodebase, type CodebaseGrounding, type SearchTermFn } from '../src/autopilot/mission-codebase-gate.js';
15
15
  import { groundForGoalAuthor, type GoalAuthorGroundingPath } from '../src/self-implement/goal-author.js';
16
16
  import { groundGoalInCodebase, GROUNDING_HEADER } from '../src/self-implement/ground-goal.js';
17
+ import { TUI_ENTRY_PATH } from '../test/helpers/dashboard-source.js';
17
18
 
18
19
  type CorpusItem = { id: string; kind: string; ask: string; answers: readonly string[]; pr: number | null; searchTerms: readonly string[]; note?: string };
19
20
 
@@ -21,7 +22,7 @@ const CORPUS = [
21
22
  { id: 'B1', kind: 'B', ask: 'elanous logs 조회가 0건일 때 그 0이 무엇을 뜻하는지 함께 알려주도록 고쳐줘', answers: ['src/cli/logs-cli.ts'], pr: 5806, searchTerms: ['elanous', 'logs', '조회'] },
22
23
  { id: 'B2', kind: 'B', ask: '격리된 테스트 인스턴스가 살아있는 체크아웃을 조용히 편집하지 못하게 막아줘', answers: ['src/boot/tool-cwd.ts', 'src/boot/daemon-runtime.ts', 'src/nexus/index.ts'], pr: 5814, searchTerms: ['격리', '테스트', '체크아웃', '편집'] },
23
24
  { id: 'B3', kind: 'B', ask: '동시에 도는 턴들이 서로의 세션 식별자를 덮어쓰지 않게 해줘', answers: ['src/core-turn/run-core-turn.ts', 'src/debug/log.ts'], pr: 5809, searchTerms: ['동시에', '턴', '세션', '식별자'] },
24
- { id: 'B4', kind: 'B', ask: '인자 없이 부르면 격리 판정이 항상 운영으로 나오는 문제를 고쳐줘', answers: ['src/instance/current.ts', 'src/boot/tool-cwd.ts', 'src/cli/where-cli.ts', 'src/dashboard/index.ts', 'src/nexus/index.ts'], pr: 5820, searchTerms: ['인자', '격리', '판정', '운영'] },
25
+ { id: 'B4', kind: 'B', ask: '인자 없이 부르면 격리 판정이 항상 운영으로 나오는 문제를 고쳐줘', answers: ['src/instance/current.ts', 'src/boot/tool-cwd.ts', 'src/cli/where-cli.ts', TUI_ENTRY_PATH, 'src/nexus/index.ts'], pr: 5820, searchTerms: ['인자', '격리', '판정', '운영'] },
25
26
  { id: 'B5', kind: 'B', ask: '팬아웃이 배달 0 을 냈을 때 그것이 어떤 종류의 0 인지 갈라서 알려줘', answers: ['src/session/session-fanout.ts'], pr: 5805, searchTerms: ['팬아웃', '배달', '종류'] },
26
27
  { id: 'A1', kind: 'A', ask: 'src/self-implement/goal-author.ts 가 근거를 모을 때 집계기를 쓰도록 바꿔줘', answers: ['src/self-implement/goal-author.ts'], pr: null, searchTerms: ['goal-author', '근거', '집계기'] },
27
28
  { id: 'A2', kind: 'A', ask: 'src/boot/tool-cwd.ts 의 죽은 타입을 살려서 경로 누출을 컴파일 에러로 만들어줘', answers: ['src/boot/tool-cwd.ts'], pr: 5815, searchTerms: ['tool-cwd', '타입', '경로'] },