elanous 0.2.32 → 0.2.34

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 (633) 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/{IVKr3AlRUVLKsw2fh7eXF → L04y73dlwKeTW-GetaTF3}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/1162.c69abda138c7ce43.js +79 -0
  5. package/apps/pwa/out/_next/static/chunks/1449-1fede62af84c3e43.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1598-13fc845935e816df.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1639.62c5e16fa20d242f.js +94 -0
  8. package/apps/pwa/out/_next/static/chunks/{4174.92ed04922709ac9e.js → 1644.35dd25240ae24e4b.js} +2 -2
  9. package/apps/pwa/out/_next/static/chunks/1661-adb8b2babc9aaf8c.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/{2940-619bfd8ef337c611.js → 1895-60ed0e341c658bd4.js} +1 -1
  11. package/apps/pwa/out/_next/static/chunks/{5525.86debf231e181813.js → 2124.ed5bf480cea7f85b.js} +1 -1
  12. package/apps/pwa/out/_next/static/chunks/2147.107c0fc6146fb15a.js +23 -0
  13. package/apps/pwa/out/_next/static/chunks/2202-ef1c9b000c3074fc.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/2247.1e326638ee43e672.js +115 -0
  15. package/apps/pwa/out/_next/static/chunks/2268.56e1e3d58180abae.js +8 -0
  16. package/apps/pwa/out/_next/static/chunks/2469-606819c812414021.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/{6092.a7f99e68b188ca66.js → 2547.dd27303624cb4da8.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/{2213.2ccbada92c33ea0f.js → 2554.3b5e200f5f5cfcd6.js} +16 -16
  19. package/apps/pwa/out/_next/static/chunks/2593.e53c1620c0bb3599.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/2690.e96671114222676a.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2898-79ee1a5cc0cd9d13.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/298.26099a9f65e5c8ff.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/{5173-233188df2f42c626.js → 2987-30cf9c2eb7b8bdd5.js} +1 -1
  24. package/apps/pwa/out/_next/static/chunks/2992.51fc2a7295bd8139.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/{3541-ce3a5424ed5ad7f1.js → 3001-5a52788c813b6113.js} +1 -1
  26. package/apps/pwa/out/_next/static/chunks/3014-291245fba9df7b5b.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/3068.ee78201f0251a18d.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/3083.cd399a17e9365f78.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/3103.84470c8445962f04.js +34 -0
  30. package/apps/pwa/out/_next/static/chunks/{6433.fc573af22bbc9ab7.js → 3110.0a7065f25c841818.js} +17 -17
  31. package/apps/pwa/out/_next/static/chunks/3117-e1c474683fd1f824.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/3121.779fafe3e44612c5.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/3251-2c17bd5a91f8de2e.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/326.3fb32322bb2ddf6d.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/3411-f87314c6c66ebc73.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/{6157.0c9af021de4fb31b.js → 3414.172ad4ca2d9b08e8.js} +2 -2
  37. package/apps/pwa/out/_next/static/chunks/3421-7ff7fbaa156985a7.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/{4745.67d6f99c245af3f7.js → 3498.cf2a15a8a9e5b926.js} +3 -3
  39. package/apps/pwa/out/_next/static/chunks/381.f55dc63ea87735e6.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3819.163d4777f0a597f6.js +32 -0
  41. package/apps/pwa/out/_next/static/chunks/{5543.a438b8ab5a13ea47.js → 3837.722e053fb9f321ad.js} +1 -1
  42. package/apps/pwa/out/_next/static/chunks/4129-ab0a6189f1778633.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/4361.93d14ba594b3a035.js +104 -0
  44. package/apps/pwa/out/_next/static/chunks/4364.7a7eb19cceb67d2f.js +286 -0
  45. package/apps/pwa/out/_next/static/chunks/4406.d71f506f7c3ee9d3.js +149 -0
  46. package/apps/pwa/out/_next/static/chunks/4461.2ad1514180ae7e29.js +148 -0
  47. package/apps/pwa/out/_next/static/chunks/4479.bd309cbe0e3842ee.js +64 -0
  48. package/apps/pwa/out/_next/static/chunks/4522-05966f777d66d13b.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4543-9a3e9812e845de65.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4557.f8f1d84a0d90d590.js +74 -0
  51. package/apps/pwa/out/_next/static/chunks/4589-79b11542179ef58c.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4633-9f8f9f88ffbb8f5c.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4831.23af4d10c0697b5e.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4983.5951b85724f61f2a.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{b313b242.cb1265eea908db61.js → 4fa33ebd.21c1bd5b294496e6.js} +1 -1
  56. package/apps/pwa/out/_next/static/chunks/{997ce8a5-2ad501927003b41b.js → 5014f970-22bef0b5210f7d60.js} +1 -1
  57. package/apps/pwa/out/_next/static/chunks/{2112-e4efc21a6505d5bc.js → 5028-f0722e6114c313e7.js} +1 -1
  58. package/apps/pwa/out/_next/static/chunks/{2898.fd781bc7cf01a7b7.js → 5249.96a848656b582a93.js} +1 -1
  59. package/apps/pwa/out/_next/static/chunks/5311.16e0ffbfa5468b80.js +62 -0
  60. package/apps/pwa/out/_next/static/chunks/{9407.e49124dedf0f5e72.js → 5446.edf141cff9ef647d.js} +1 -1
  61. package/apps/pwa/out/_next/static/chunks/{9002.e5658224e3dc1b6f.js → 5489.ec2dd1b5272a19dc.js} +1 -1
  62. package/apps/pwa/out/_next/static/chunks/{1335-6731f392c35216eb.js → 5576-82d3703636d5c4b9.js} +3 -3
  63. package/apps/pwa/out/_next/static/chunks/559.df87695df637920c.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5618-5c88f2f70178c4ad.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/5764.05487bf0b73ddb6b.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5930.e678826c3f831aab.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5dfb57f7.f2e3305326202474.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/6053-d893974de92e6198.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{2985.39ccdecd36848b12.js → 6086.913a69e6fa3e4a8b.js} +4 -4
  70. package/apps/pwa/out/_next/static/chunks/6200-cefd6f33f59d765e.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6314-edeba650ae686ac9.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6316-bc9a9b74d7842d79.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/6476-13b9779b73528008.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/666-04db3ac4c8e3c66f.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/670.682e55106ef915a6.js +77 -0
  76. package/apps/pwa/out/_next/static/chunks/{7862.30a8d6482bb238eb.js → 6740.43de73fc427c9fe2.js} +1 -1
  77. package/apps/pwa/out/_next/static/chunks/6816.b7ba9d0a1a4a46a7.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/690-fbbcc777f189af37.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6989.0d3d4020e5cb3df6.js +90 -0
  80. package/apps/pwa/out/_next/static/chunks/{2871.0bca6137343b3f76.js → 7005.1623d2aea78eb85f.js} +1 -1
  81. package/apps/pwa/out/_next/static/chunks/7193-cf355cca5ba6c5d5.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7217-d17393fe7af78fa6.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/7232.24edbd938a69c8d0.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7295cd1e.b4b557908888eeee.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7323.adb02de21991883c.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7386.5d8e7e42e818dfb6.js +287 -0
  87. package/apps/pwa/out/_next/static/chunks/{7502.ccd5b8065545edd0.js → 7431.3051e9b8a4372d2d.js} +2 -2
  88. package/apps/pwa/out/_next/static/chunks/{3583.a05e88cc8d594628.js → 7448.478958ffbbba0ac0.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/7537.ba2208c5c656b8a3.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7562.948255cbc3e79d33.js +41 -0
  91. package/apps/pwa/out/_next/static/chunks/7596-962ae6db6cfc9c83.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7671.cff51beac212a2ba.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7883.3916734ee16d3e58.js +27 -0
  94. package/apps/pwa/out/_next/static/chunks/{9989.3694300e5f000b14.js → 7952.b192c31b6a0e00cc.js} +1 -1
  95. package/apps/pwa/out/_next/static/chunks/801.5b24e81eded22d1b.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/8176.8c9a8613f5a01ac1.js +36 -0
  97. package/apps/pwa/out/_next/static/chunks/819e78a6.fa3dd7f7da19bf61.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/8220-78978450c3183d8d.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/8221-eb60b5bc692a3361.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/826.e9a26064f474949e.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/{5307.60f2209e809bd627.js → 8368.014caa8de2f5af34.js} +1 -1
  102. package/apps/pwa/out/_next/static/chunks/8459-a351487a4480f584.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8482-75823d513a4ce151.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8488.8da515248cda3f3a.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/{9221.7d22eaf353a2d4e7.js → 8548.036c344973968847.js} +1 -1
  106. package/apps/pwa/out/_next/static/chunks/8584.388a1779d9b203af.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8637.a55e098e61ffefb8.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8817.61bb7ffbba502ecb.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/{9398-6aed28f0a96d0d6f.js → 9131-fce7256c4180c4a5.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/9207-8e6a12db30373f32.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/9263-00ae932c62696a86.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9318.caafc3a130e8769c.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/932.da3fb55951882562.js +93 -0
  114. package/apps/pwa/out/_next/static/chunks/9433.002f8426ac75b6b7.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9464.dd631a5a14b1d660.js +24 -0
  116. package/apps/pwa/out/_next/static/chunks/{3278.2e5d15b53a4091c8.js → 9550.d5f76828f972058c.js} +2 -2
  117. package/apps/pwa/out/_next/static/chunks/{2534.e85ae21ad0dac829.js → 9739.8d5f36ac67a3b236.js} +1 -1
  118. package/apps/pwa/out/_next/static/chunks/9743.beeabb9d5f86abe4.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9843-a23d3f32dc43f715.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/994-28211077c7c587d5.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{7a1887c4.f36b88fba31da8fd.js → 9a8cb466.cc9fc9e6e46038aa.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/{0bb0ff36.b8d418980951e5ba.js → 9b48c871.204d5d13e7809bd0.js} +7 -7
  123. package/apps/pwa/out/_next/static/chunks/{409f1e57.d0649fc47691ebfe.js → abb4b98b.163e0f56e84ae35d.js} +1 -1
  124. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-3b4c947f174e33d8.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/approvals/page-369d5ce99483f859.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-63c0ed0eb26e5fce.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/board/page-62802c6003bc85cc.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/botlab/page-ecb41560d4e77be9.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/bots/page-7b65ad8130c93e95.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8755477c15a9060c.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/chat/page-5725447dd972c471.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/consult/page-b979de0591a69375.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/control/page-6d0796bf4633751a.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/decisions/page-59c31dc0394e67b4.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/design-check/page-12dfc95f6cc5c718.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/editor/page-25788244e66aa4dd.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/exec/page-a2555dc705466322.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/field/page-4fb31eb476dcbad3.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/healthz/route-3b4c947f174e33d8.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/inside/page-578729adbeaa40cb.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/intake/page-a1d20fffbec35205.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/layout-4a558f94516b8004.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/live/page-9e3834705b86145e.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/live-run/page-d7bff0f0905a662c.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/loops/page-cb1c5fe746ea4014.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/market/page-9ee320507356582a.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-66fd183b74835886.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/morning/page-3272a064a01a9927.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/not-found-f281b7a7f6ef2529.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/observatory/page-d45a65f8b7124fcd.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-e9c1fe684dd19a66.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-b8322932fc6e34de.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-82c66d9af2290575.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/outputs/page-63c6752009c97b05.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/page-bb33d42ebc358aec.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/reflection/page-7e4c9379197d7214.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-38bf1e9a7001732b.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/sessions/page-2e5b752012389d56.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-8c66a3b24a745630.js → page-398c0faa173203f7.js} +1 -1
  160. package/apps/pwa/out/_next/static/chunks/app/settings/page-002f53a965b6445c.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-7f75997f61a26269.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/layout-3b4c947f174e33d8.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/setup/page-05631753294f23fb.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/share/page-edd700fd2cc3d7f8.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/showroom/page-105f83ecb4594365.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/tasks/page-5823e87d2017f19c.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/term/{page-04d00ae9b0890349.js → page-df3445b207ceceab.js} +1 -1
  168. package/apps/pwa/out/_next/static/chunks/app/today/page-b51ca09566c03de7.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/trace/page-8aacd5ded5dbac60.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/vault/page-bae3365a0b3c6a8e.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ed52b48ff1aa7fd.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b6f8cad35fe00946.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6d25ceda500d2457.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-b6401a5f2c962fe8.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/ebf6cf5e.0d2f887b040e80fb.js +122 -0
  176. package/apps/pwa/out/_next/static/chunks/f09ec7d7-d29abe23edcbb193.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/{ebc7d829.264a0bcb6c750b50.js → ffdc3a04.b9c23c1b28dd4a96.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/framework-9322cb8a56ac081c.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-2fbab294e49a1561.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-f36729f56621a8f3.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-2a62e450b47c6114.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-5e17f7b445f34d43.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-b4263e2190ea7adf.js +1 -0
  184. package/apps/pwa/out/approvals/index.html +1 -1
  185. package/apps/pwa/out/approvals/index.txt +22 -22
  186. package/apps/pwa/out/autopilot/index.html +1 -1
  187. package/apps/pwa/out/autopilot/index.txt +22 -22
  188. package/apps/pwa/out/board/index.html +1 -1
  189. package/apps/pwa/out/board/index.txt +22 -22
  190. package/apps/pwa/out/botlab/index.html +1 -1
  191. package/apps/pwa/out/botlab/index.txt +21 -21
  192. package/apps/pwa/out/bots/index.html +1 -1
  193. package/apps/pwa/out/bots/index.txt +21 -21
  194. package/apps/pwa/out/ceo/index.html +1 -1
  195. package/apps/pwa/out/ceo/index.txt +22 -22
  196. package/apps/pwa/out/chat/index.html +1 -1
  197. package/apps/pwa/out/chat/index.txt +21 -21
  198. package/apps/pwa/out/consult/index.html +1 -1
  199. package/apps/pwa/out/consult/index.txt +22 -22
  200. package/apps/pwa/out/control/index.html +1 -1
  201. package/apps/pwa/out/control/index.txt +22 -22
  202. package/apps/pwa/out/decisions/index.html +1 -1
  203. package/apps/pwa/out/decisions/index.txt +21 -21
  204. package/apps/pwa/out/design-check/index.html +1 -1
  205. package/apps/pwa/out/design-check/index.txt +22 -22
  206. package/apps/pwa/out/editor/index.html +1 -1
  207. package/apps/pwa/out/editor/index.txt +22 -22
  208. package/apps/pwa/out/exec/index.html +1 -1
  209. package/apps/pwa/out/exec/index.txt +22 -22
  210. package/apps/pwa/out/field/index.html +1 -1
  211. package/apps/pwa/out/field/index.txt +22 -22
  212. package/apps/pwa/out/healthz +1 -1
  213. package/apps/pwa/out/index.html +1 -1
  214. package/apps/pwa/out/index.txt +21 -21
  215. package/apps/pwa/out/inside/index.html +1 -1
  216. package/apps/pwa/out/inside/index.txt +21 -21
  217. package/apps/pwa/out/intake/index.html +1 -1
  218. package/apps/pwa/out/intake/index.txt +22 -22
  219. package/apps/pwa/out/live/index.html +1 -1
  220. package/apps/pwa/out/live/index.txt +22 -22
  221. package/apps/pwa/out/live-run/index.html +1 -1
  222. package/apps/pwa/out/live-run/index.txt +22 -22
  223. package/apps/pwa/out/loops/index.html +1 -1
  224. package/apps/pwa/out/loops/index.txt +21 -21
  225. package/apps/pwa/out/market/index.html +1 -1
  226. package/apps/pwa/out/market/index.txt +21 -21
  227. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  228. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  229. package/apps/pwa/out/morning/index.html +1 -1
  230. package/apps/pwa/out/morning/index.txt +22 -22
  231. package/apps/pwa/out/observatory/index.html +1 -1
  232. package/apps/pwa/out/observatory/index.txt +22 -22
  233. package/apps/pwa/out/ops/checklist/index.html +1 -1
  234. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  235. package/apps/pwa/out/ops/release/index.html +1 -1
  236. package/apps/pwa/out/ops/release/index.txt +21 -21
  237. package/apps/pwa/out/ops/seats/index.html +1 -1
  238. package/apps/pwa/out/ops/seats/index.txt +21 -21
  239. package/apps/pwa/out/outputs/index.html +1 -1
  240. package/apps/pwa/out/outputs/index.txt +21 -21
  241. package/apps/pwa/out/reflection/index.html +1 -1
  242. package/apps/pwa/out/reflection/index.txt +22 -22
  243. package/apps/pwa/out/scheduler/index.html +1 -1
  244. package/apps/pwa/out/scheduler/index.txt +22 -22
  245. package/apps/pwa/out/sessions/index.html +1 -1
  246. package/apps/pwa/out/sessions/index.txt +21 -21
  247. package/apps/pwa/out/settings/devices/index.html +1 -1
  248. package/apps/pwa/out/settings/devices/index.txt +22 -22
  249. package/apps/pwa/out/settings/index.html +1 -1
  250. package/apps/pwa/out/settings/index.txt +22 -22
  251. package/apps/pwa/out/setup/done/index.html +1 -1
  252. package/apps/pwa/out/setup/done/index.txt +22 -22
  253. package/apps/pwa/out/setup/index.html +1 -1
  254. package/apps/pwa/out/setup/index.txt +22 -22
  255. package/apps/pwa/out/share/index.html +1 -1
  256. package/apps/pwa/out/share/index.txt +22 -22
  257. package/apps/pwa/out/showroom/index.html +1 -1
  258. package/apps/pwa/out/showroom/index.txt +21 -21
  259. package/apps/pwa/out/tasks/index.html +1 -1
  260. package/apps/pwa/out/tasks/index.txt +22 -22
  261. package/apps/pwa/out/term/index.html +1 -1
  262. package/apps/pwa/out/term/index.txt +22 -22
  263. package/apps/pwa/out/today/index.html +1 -1
  264. package/apps/pwa/out/today/index.txt +22 -22
  265. package/apps/pwa/out/trace/index.html +1 -1
  266. package/apps/pwa/out/trace/index.txt +22 -22
  267. package/apps/pwa/out/vault/index.html +1 -1
  268. package/apps/pwa/out/vault/index.txt +22 -22
  269. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  270. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  271. package/apps/pwa/out/workflows/index.html +1 -1
  272. package/apps/pwa/out/workflows/index.txt +22 -22
  273. package/apps/pwa/out/workspace/index.html +1 -1
  274. package/apps/pwa/out/workspace/index.txt +22 -22
  275. package/apps/pwa/out/worktrees/index.html +1 -1
  276. package/apps/pwa/out/worktrees/index.txt +22 -22
  277. package/bin/elanous.mjs +9 -2
  278. package/docs/goal-context/README.md +1 -0
  279. package/graphs/default-loop.yaml +20 -3
  280. package/graphs/document-loop.yaml +21 -2
  281. package/graphs/implement-loop.yaml +6 -0
  282. package/graphs/journey/SCENARIOS.md +33 -0
  283. package/graphs/journey/recipes.yaml +1 -0
  284. package/graphs/journey/ta-journey.yaml +84 -0
  285. package/graphs/journey/units/author/author.yaml +20 -0
  286. package/graphs/journey/units/author/recipes.yaml +2 -0
  287. package/graphs/journey/units/green/green.yaml +20 -0
  288. package/graphs/journey/units/green/recipes.yaml +2 -0
  289. package/graphs/journey/units/pr/pr.yaml +20 -0
  290. package/graphs/journey/units/pr/recipes.yaml +2 -0
  291. package/graphs/journey/units/remember/recipes.yaml +2 -0
  292. package/graphs/journey/units/remember/remember.yaml +20 -0
  293. package/graphs/operate-loop.yaml +21 -2
  294. package/graphs/overlays/stop-heal-ladder.yaml +1 -1
  295. package/graphs/release-rehearsal/recipes.yaml +1 -1
  296. package/graphs/release-rehearsal/release-rehearsal.yaml +2 -2
  297. package/graphs/research-loop.yaml +23 -2
  298. package/graphs/units/dispatch-pod/dispatch-pod.yaml +50 -0
  299. package/graphs/units/dispatch-pod/recipes.yaml +14 -0
  300. package/graphs/units/entry/entry.yaml +50 -0
  301. package/graphs/units/entry/recipes.yaml +14 -0
  302. package/graphs/units/harvest/harvest.yaml +25 -0
  303. package/graphs/units/harvest/recipes.yaml +4 -0
  304. package/graphs/units/land/land.yaml +45 -0
  305. package/graphs/units/land/recipes.yaml +3 -0
  306. package/graphs/units/recipes.yaml +7 -0
  307. package/graphs/units/recover.yaml +39 -0
  308. package/graphs/units/reflect/recipes.yaml +3 -0
  309. package/graphs/units/reflect/reflect.yaml +15 -0
  310. package/graphs/units/task-agent-recover-review.yaml +17 -0
  311. package/graphs/units/task-agent-recover-wait.yaml +17 -0
  312. package/graphs/units/verbs/make-doc.yaml +34 -0
  313. package/graphs/units/verbs/recipes.yaml +33 -0
  314. package/graphs/units/verbs/verify.yaml +55 -0
  315. package/graphs/work/recipes.yaml +2 -0
  316. package/graphs/work/research-report.yaml +28 -0
  317. package/package.json +1 -1
  318. package/scripts/ci-typecheck-changed.ts +69 -16
  319. package/scripts/docs/generate-graph-anatomy.ts +19 -2
  320. package/scripts/graph-harvest-unit.ts +22 -0
  321. package/scripts/graph-units/journey-stub.ts +6 -0
  322. package/scripts/graph-units/land-enqueue.ts +78 -0
  323. package/scripts/graph-units/recover-plan.ts +15 -0
  324. package/scripts/graph-units/reflect-node.ts +88 -0
  325. package/scripts/graph-units/ta-journey-observe.ts +109 -0
  326. package/scripts/graph-units/verbs/headless-goal-loop.ts +152 -0
  327. package/scripts/graph-units/verbs/verify-stage.ts +75 -0
  328. package/scripts/graph-units/verbs-envelope.ts +139 -0
  329. package/scripts/hq/standby-snapshot.ts +25 -0
  330. package/scripts/public-export.ts +43 -1
  331. package/scripts/ratchets/train-side-invariants.sh +45 -0
  332. package/scripts/release-loop/auto-approve-node.ts +30 -16
  333. package/scripts/release-loop/gate-closure.ts +5 -1
  334. package/scripts/release-loop/gate-diff.ts +1 -1
  335. package/scripts/release-loop/gate-node.ts +498 -31
  336. package/scripts/release-loop/gate-partial.ts +3 -3
  337. package/scripts/release-loop/gate-radius-shadow.ts +138 -0
  338. package/scripts/release-loop/gate-traffic-mode.ts +128 -0
  339. package/scripts/release-loop/gate-triage-node.ts +5 -2
  340. package/scripts/release-loop/known-issues-0.2.33-approved.json +194 -0
  341. package/scripts/release-loop/known-issues-node.ts +77 -8
  342. package/scripts/release-loop/preflight.ts +93 -7
  343. package/scripts/release-loop/publish-node.ts +60 -9
  344. package/scripts/release-loop/resume-cap.ts +56 -0
  345. package/scripts/release-loop/resume-release.ts +114 -15
  346. package/scripts/release-loop/resume.ts +24 -1
  347. package/scripts/release-loop/tui-sim-node.ts +8 -2
  348. package/scripts/release-loop/unattended-release.ts +8 -2
  349. package/src/acp/core-turn-bridge.ts +20 -5
  350. package/src/acp/reasoning-thought-buffer.ts +45 -0
  351. package/src/agent-substrate/acp-reviewer.ts +52 -12
  352. package/src/agent-substrate/review-finding-key.ts +53 -0
  353. package/src/agent-substrate/self-review-cli.ts +126 -5
  354. package/src/ask-user-question/pending-questions.ts +1 -1
  355. package/src/autopilot/pr-manager.ts +192 -43
  356. package/src/chat/tool-render/dispatch.ts +62 -10
  357. package/src/cli/control-cli.ts +24 -7
  358. package/src/cli/guardian-cli.ts +10 -0
  359. package/src/cli/light-entry-route.ts +35 -0
  360. package/src/cli/llm-detect-cli.ts +23 -1
  361. package/src/cli/pr-cli.ts +76 -12
  362. package/src/cli/pr-land-base-read.ts +2 -0
  363. package/src/cli/pr-land-overlap-evidence.ts +154 -16
  364. package/src/cli/pr-land-recovery.ts +64 -0
  365. package/src/cli/pty-takeover-cli.ts +6 -5
  366. package/src/cli/release-cli.ts +120 -33
  367. package/src/cli/release-run-if-ready.ts +29 -28
  368. package/src/cli/release-single-flight.ts +178 -0
  369. package/src/cli/seat-cli.ts +37 -0
  370. package/src/cli/setup-cli.ts +40 -1
  371. package/src/cli/tasks-cli.ts +149 -5
  372. package/src/control/control-status.ts +8 -3
  373. package/src/control-plane/ledger.ts +5 -3
  374. package/src/control-plane/server.ts +5 -3
  375. package/src/core-turn/short-question.ts +5 -1
  376. package/src/dashboard/index.ts +36 -67
  377. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +3 -0
  378. package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
  379. package/src/dashboard/input/seat-autowake.ts +56 -3
  380. package/src/dashboard/seat-boot-preamble.ts +1 -1
  381. package/src/dashboard/slash-runtime/ask-clarification.ts +48 -0
  382. package/src/dashboard/slash-runtime/dashboard-delegated-slashes.ts +68 -0
  383. package/src/dashboard/slash-runtime/dashboard-handlers.ts +62 -322
  384. package/src/dashboard/slash-runtime/dashboard-log-slash.ts +208 -0
  385. package/src/dashboard/turn-preamble.ts +47 -1
  386. package/src/dashboard/turn-stream-formatter.ts +34 -1
  387. package/src/dashboard/turn-stream-runtime.ts +2 -0
  388. package/src/dashboard/turn-typeahead-prompt-zone.ts +67 -0
  389. package/src/domains/guardian-tick.ts +54 -2
  390. package/src/domains/outbound-alert.ts +3 -2
  391. package/src/extractors.ts +3 -1
  392. package/src/git-fs/retry.ts +4 -0
  393. package/src/git-fs/runner.ts +2 -0
  394. package/src/graph-runner/runner.ts +114 -44
  395. package/src/grok/credential.ts +5 -0
  396. package/src/harness/harness-cli-command.ts +39 -10
  397. package/src/harness/harness-incidents.ts +4 -0
  398. package/src/harness/harness-pod-dispatch.ts +38 -1
  399. package/src/harness/harness-salvage-cli.ts +14 -2
  400. package/src/index.ts +192 -8
  401. package/src/intake-plane/already-built-hint.ts +89 -0
  402. package/src/knowhow/pack.ts +199 -0
  403. package/src/light-cli.ts +95 -0
  404. package/src/llm.ts +55 -9
  405. package/src/loops/budget.ts +95 -0
  406. package/src/loops/msg-wake.ts +8 -2
  407. package/src/loops/orchestrator/traffic.ts +132 -1
  408. package/src/mss/logging/log-store.ts +4 -5
  409. package/src/nexus/api/graphs-api.ts +22 -3
  410. package/src/nexus/api/http-server.ts +1 -1
  411. package/src/nexus/api/ops-api.ts +12 -0
  412. package/src/oauth/claude-pty-maturity.ts +66 -0
  413. package/src/oauth/codex-access-mirror.ts +55 -0
  414. package/src/oauth/fallback-chain.ts +1 -1
  415. package/src/onboarding/first-run.ts +5 -3
  416. package/src/onboarding/non-interactive.ts +64 -13
  417. package/src/onboarding.ts +10 -2
  418. package/src/ops/overview-collect.ts +36 -1
  419. package/src/ops/overview.ts +11 -0
  420. package/src/pr-tool/census.ts +23 -5
  421. package/src/pr-tool/inflight-registry.ts +160 -7
  422. package/src/prompt-library/gpt6-family-addendum.ts +14 -1
  423. package/src/pty-shell/herdr-agent-report.ts +442 -0
  424. package/src/pty-shell/pty-control-ipc.ts +5 -5
  425. package/src/pty-shell/pty-write-outcome.ts +24 -6
  426. package/src/pty-shell/tui-run-state.ts +117 -3
  427. package/src/release-loop/checklist.ts +79 -5
  428. package/src/release-loop/feature-store.ts +19 -2
  429. package/src/release-loop/placement.ts +10 -3
  430. package/src/release-loop/rehearsal.ts +205 -25
  431. package/src/release-loop/rubric.ts +16 -2
  432. package/src/self-dev/draft-sweep.ts +52 -3
  433. package/src/self-dev/graph-journey-nodes.ts +10 -6
  434. package/src/self-dev/graph-journey-route.ts +60 -6
  435. package/src/self-dev/orchestrate.ts +79 -3
  436. package/src/self-dev/run-supervisor.ts +107 -12
  437. package/src/self-dev/run-types.ts +5 -1
  438. package/src/self-implement/gate-baseline.ts +49 -5
  439. package/src/self-implement/gate-remote.ts +9 -5
  440. package/src/self-implement/goal-author-identity.ts +66 -0
  441. package/src/self-implement/goal-author-preservation-obligation.ts +35 -0
  442. package/src/self-implement/goal-author.ts +4 -120
  443. package/src/self-implement/graph-overlay-yaml.ts +17 -2
  444. package/src/self-implement/graph-unit-flatten.ts +103 -0
  445. package/src/self-implement/graph-unit-resolver.ts +107 -0
  446. package/src/self-implement/graph-yaml.ts +151 -1
  447. package/src/self-implement/headless-elanous-driver.ts +1 -0
  448. package/src/self-implement/knowhow-pack.ts +103 -0
  449. package/src/self-implement/orchestrator.ts +8 -0
  450. package/src/self-implement/pod-warm-pool-profile.ts +45 -0
  451. package/src/self-implement/review-mustfix-class.ts +203 -0
  452. package/src/self-implement/run-stop.ts +8 -2
  453. package/src/self-implement/seams.ts +32 -1
  454. package/src/self-implement/stop-autoheal.ts +25 -1
  455. package/src/session/chat.ts +27 -0
  456. package/src/session-runtime/retry-policy.ts +2 -1
  457. package/src/skills/tools/schedule-wakeup.ts +66 -17
  458. package/src/steward/release-day.ts +7 -3
  459. package/src/steward/triage.ts +37 -4
  460. package/src/task-agent/harvest-unit.ts +141 -0
  461. package/src/task-agent/live-moves.ts +98 -12
  462. package/src/task-agent/parent-host.ts +93 -3
  463. package/src/task-agent/postland-card.ts +80 -1
  464. package/src/task-agent/rejudge-on-head.ts +112 -26
  465. package/src/task-agent/repair-branch-cas.ts +4 -1
  466. package/src/task-agent/repair-cycle.ts +16 -3
  467. package/src/task-agent/run-identity.ts +4 -3
  468. package/src/task-agent/shadow.ts +12 -2
  469. package/src/task-agent/task-hand.ts +54 -7
  470. package/src/task-agent/work-order-build.ts +22 -0
  471. package/src/task-orchestrator/surfaces/pod-account-broker.ts +39 -3
  472. package/src/task-orchestrator/surfaces/pod-command-job.ts +2 -1
  473. package/src/task-orchestrator/surfaces/pod-lifecycle-stages.ts +86 -8
  474. package/src/task-orchestrator/surfaces/pod-pool.ts +73 -17
  475. package/src/task-orchestrator/surfaces/pod-source-receive.ts +54 -4
  476. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +26 -3
  477. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +389 -0
  478. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +2 -1
  479. package/src/task-orchestrator/surfaces/self-implement-pod.ts +223 -38
  480. package/src/task-orchestrator/surfaces/self-implement.ts +83 -2
  481. package/src/tool-runtime/truncation-store.ts +4 -0
  482. package/src/tui-client/dashboard-session.ts +10 -1
  483. package/src/user-config/coercion.ts +36 -0
  484. package/src/user-config.ts +18 -41
  485. package/src/ux-sim/scenario.ts +72 -13
  486. package/src/version/packed-revision.json +1 -1
  487. package/apps/pwa/out/_next/static/chunks/1034-8b639cee57b8e4a8.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/1085-6c2d35526f11f840.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/1220.1ff7d5cdc34b1ae5.js +0 -27
  490. package/apps/pwa/out/_next/static/chunks/1247.5884ec81b39fe2e7.js +0 -287
  491. package/apps/pwa/out/_next/static/chunks/1302.87681521a7a4661e.js +0 -62
  492. package/apps/pwa/out/_next/static/chunks/1324-59dae3002413623b.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/1343-f40b5870ac1eda5a.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/146-b6cd56be11dda017.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/1654.32de4b324981a188.js +0 -23
  496. package/apps/pwa/out/_next/static/chunks/1834-98b64172bc1efe77.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/1849.1ce38efa6c527d9a.js +0 -149
  498. package/apps/pwa/out/_next/static/chunks/1913.7cc6fb6055b1ed3f.js +0 -41
  499. package/apps/pwa/out/_next/static/chunks/2001.6c7e0fd02190886c.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/2030.41fae98c7e907304.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/2099-08b2f2dfba742c9b.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/2134.ecee03a550ee7250.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/2236.66061832181cb745.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/2422.b0bd272e7020d7e6.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/3040.92ff9ffc9f971cb9.js +0 -115
  506. package/apps/pwa/out/_next/static/chunks/3144.6861096c7b4edef7.js +0 -64
  507. package/apps/pwa/out/_next/static/chunks/3267c0e6.d34854e7b3984a6e.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/3771.e928edf2867d28c0.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/3902.e1e71aaac850a045.js +0 -34
  510. package/apps/pwa/out/_next/static/chunks/4063-03284b5de59965f3.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/4111.2bfedbb233ad206b.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/4300-c7ec4eeabbb5f3f7.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/4483.646d5065199e1b55.js +0 -36
  514. package/apps/pwa/out/_next/static/chunks/4519.28199ff26b2fd80d.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/4581.ef2443578054544f.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/4608-8d894e9cbe4f08bf.js +0 -1
  517. package/apps/pwa/out/_next/static/chunks/4639.ae48a01d1bb50a93.js +0 -286
  518. package/apps/pwa/out/_next/static/chunks/4739.08742ac668aada67.js +0 -77
  519. package/apps/pwa/out/_next/static/chunks/4882-16cef71d6a1a32be.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/4999.c064a4000c2a9e94.js +0 -79
  521. package/apps/pwa/out/_next/static/chunks/5260-69f35419bca263e7.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/5272.b92d1b72a15c25fe.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/5304.04d24756f242a094.js +0 -148
  524. package/apps/pwa/out/_next/static/chunks/5415-997980f828667736.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/5458-16cd7a2b51b74c8c.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/5572-42c9084f27ca761e.js +0 -1
  527. package/apps/pwa/out/_next/static/chunks/5661-80470aac963d9f36.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/5723.421338408b5c30c4.js +0 -74
  529. package/apps/pwa/out/_next/static/chunks/5809.64c3664267c50bce.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/6000.64bc21ac8627f2f5.js +0 -94
  531. package/apps/pwa/out/_next/static/chunks/6013.39459b9c68eabf5f.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/607-06466dff012b03ef.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/60fb96c9.360b01d8d4927b7b.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/6192.a190b989b81e9743.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/6323.8672b4817a306928.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/6444.7d1fdcb9b09ae71c.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/6517.4147878ac06d584d.js +0 -90
  538. package/apps/pwa/out/_next/static/chunks/6532.e34302010b2f0b68.js +0 -32
  539. package/apps/pwa/out/_next/static/chunks/6544cb48.a87fe20ddf137be2.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/6546.74bc4ed82f19016d.js +0 -104
  541. package/apps/pwa/out/_next/static/chunks/6684-e7523ce7c2fad075.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/6726.ebdc82feb161431e.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/6739.00fb6f892e5e392b.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/6745.934c4921bf15513a.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/6767.ea607cf0c20a25af.js +0 -24
  546. package/apps/pwa/out/_next/static/chunks/6843.67bfd020da0926c5.js +0 -93
  547. package/apps/pwa/out/_next/static/chunks/69-0a2c8209c6d4a158.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/6948.1062d4594652b5bf.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/7138-eaf841fc1dc03463.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/7174-cda29ee13d7790e7.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/7304-3c07583f4e405f4f.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/7371.80c05c653b08e907.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/7391.ebae168025c91b6a.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/7557.e325503a090a4310.js +0 -8
  555. package/apps/pwa/out/_next/static/chunks/7569-9ce9432c7f10989f.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/7886-55854585fadeded1.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/7947-d0759430f8042240.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/8018.a32663f04a6fc5f9.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/8097-9530c03bcc550f02.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/8215-1661812b6e9ad71f.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/8260-19c921a51ca8ec3e.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/8440.3a5cf5c85aa76db8.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/8519-4599be2249161e68.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/8547.b028b90c5c01ace6.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/8587-cbe02a953a7f4990.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/877-2b977259c4b15655.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/9019-0a4b40c50c7314fb.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/9138.b6e80031afb1d973.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/9188-d36e4fc869ddc166.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/9230.44f5039e796e4ab4.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/9279-d28c5b7754d010ae.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/939.336acce73e98482c.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/9610.c07cce4bfcc14ed7.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/9667-ce78c2ce91050ff9.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-339fabb3499da0e1.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/approvals/page-504204b58c82c253.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a9717a67c2eecbaf.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/board/page-5c9ec30aee62dfbf.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/app/botlab/page-584191533721fa16.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/app/bots/page-73c4b4bb3ac7ab5f.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/app/ceo/page-c0f1ca371f710b06.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/app/chat/page-46430d45a9e04eac.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/app/consult/page-3b2ebf1dc64ff0be.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/app/control/page-a27b1e5a0d1b308f.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/app/decisions/page-25654b82094f7d22.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/app/design-check/page-8ea49a4c6dd2c6e7.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/app/editor/page-ce5113aefea0a8d1.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/app/exec/page-0e5a41fac1c75396.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/app/field/page-31aaf1ed37c6df9a.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/app/healthz/route-339fabb3499da0e1.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/app/inside/page-3dcc1fa411e1f4e0.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/app/intake/page-c69247e7134d329d.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/app/layout-66dc5cd3a0999abe.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/app/live/page-26ff7ff651a7217d.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/app/live-run/page-617b3976981efa96.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/app/loops/page-d256f5d5d9552823.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/app/market/page-ce8f1907b8a6101c.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-33e182a316263116.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/app/morning/page-32866485913d6a04.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/app/not-found-7607cca9b84950c6.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/app/observatory/page-eeab86176b03dc3b.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-5b93dbae3432b996.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-77a6cb90a9cf2b10.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f47e768b5b242b5a.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/app/outputs/page-eb41aa3367fc2505.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/app/page-4d13ab0b8a267e3f.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/app/reflection/page-84dad32ff0fc0831.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-95306f892aa2d0ee.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/app/sessions/page-940fb6c217f6b470.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/app/settings/page-7b675dfd35c36fc9.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8bd0d3cf7665bcfc.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/app/setup/layout-339fabb3499da0e1.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/app/setup/page-c219f2ed171131be.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/app/share/page-40f8fa21bdae955b.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/app/showroom/page-468f8313e4f1fbd9.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/app/tasks/page-7bbb8fa353a246c4.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/app/today/page-4214b855d9233ea8.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/app/trace/page-936752c7aa58762e.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/app/vault/page-ec052ad359df1797.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8305570551091338.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/app/workflows/page-fad650e4793adb65.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/app/workspace/page-d90e64743826e1d8.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a16bcfd49af86a32.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/e5012ffe.f727e23c231f4342.js +0 -122
  625. package/apps/pwa/out/_next/static/chunks/ea695e3c-1f1d70d740cf3031.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/framework-906af9bd029e166c.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/main-a24847f9f684d469.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/main-app-7bdcd8aa7c8397d3.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/pages/_app-6ba46a5066fc226d.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/pages/_error-a8dc6d07591f2a25.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/webpack-f13df28c15c55eee.js +0 -1
  632. package/src/cli/g6a-registration-probe.ts +0 -16
  633. /package/apps/pwa/out/_next/static/{IVKr3AlRUVLKsw2fh7eXF → L04y73dlwKeTW-GetaTF3}/_ssgManifest.js +0 -0
@@ -0,0 +1,17 @@
1
+ graph_id: task-agent-recover-review
2
+ version: 1
3
+ entry_node: recover
4
+ terminal_nodes: [done, failed]
5
+ nodes:
6
+ - node_id: recover
7
+ kind: subgraph
8
+ recipe: none
9
+ max_visits: 1
10
+ call: recover@1
11
+ call_entry: request-review
12
+ budget: { inner_steps: 3 }
13
+ contract: { inputs: [ask, context, prior], tools: read-only, outputs: [result, evidence] }
14
+ - { node_id: done, kind: gate, recipe: none, max_visits: 1 }
15
+ - { node_id: failed, kind: gate, recipe: none, max_visits: 1 }
16
+ edges:
17
+ - { from: recover, on: outcome, map: { done: done, rework: done, needs-human: failed, failed: failed } }
@@ -0,0 +1,17 @@
1
+ graph_id: task-agent-recover-wait
2
+ version: 1
3
+ entry_node: recover
4
+ terminal_nodes: [done, failed]
5
+ nodes:
6
+ - node_id: recover
7
+ kind: subgraph
8
+ recipe: none
9
+ max_visits: 1
10
+ call: recover@1
11
+ call_entry: wait-retry
12
+ budget: { inner_steps: 3 }
13
+ contract: { inputs: [ask, context, prior], tools: read-only, outputs: [result, evidence] }
14
+ - { node_id: done, kind: gate, recipe: none, max_visits: 1 }
15
+ - { node_id: failed, kind: gate, recipe: none, max_visits: 1 }
16
+ edges:
17
+ - { from: recover, on: outcome, map: { done: done, rework: done, needs-human: failed, failed: failed } }
@@ -0,0 +1,34 @@
1
+ graph_id: verb-make-doc
2
+ version: 1
3
+ entry_node: prepare
4
+ terminal_nodes: [done, rework, needs-human, failed]
5
+ unit:
6
+ inputs: [ask, context, prior]
7
+ outputs: [result, evidence]
8
+ exits: [done, rework, needs-human, failed]
9
+ nodes:
10
+ - node_id: prepare
11
+ kind: observe
12
+ recipe: 'cmd:make-doc-input'
13
+ max_visits: 1
14
+ contract:
15
+ inputs: [ask, context, prior]
16
+ tools: none
17
+ outputs: [goal, worktree, branch, review-intent, head-sha, base-branch, prior]
18
+ - node_id: document-draft
19
+ kind: agent
20
+ recipe: 'cmd:headless-goal-loop'
21
+ max_visits: 4
22
+ contract:
23
+ inputs: [goal, worktree]
24
+ tools: worktree-write
25
+ outputs: [outcome, result, evidence]
26
+ - { node_id: done, kind: gate, recipe: 'cmd:make-doc-output', max_visits: 1, contract: { inputs: [], tools: none, outputs: [result, evidence] } }
27
+ - { node_id: rework, kind: gate, recipe: 'cmd:make-doc-output', max_visits: 1, contract: { inputs: [], tools: none, outputs: [result, evidence] } }
28
+ - { node_id: needs-human, kind: hitl, recipe: 'cmd:make-doc-output', max_visits: 1, contract: { inputs: [], tools: none, outputs: [result, evidence] } }
29
+ - { node_id: failed, kind: observe, recipe: 'cmd:make-doc-output', max_visits: 1, contract: { inputs: [], tools: none, outputs: [result, evidence] } }
30
+ edges:
31
+ - { from: prepare, to: document-draft }
32
+ - from: document-draft
33
+ on: outcome
34
+ map: { done: done, rework: rework, needs-human: needs-human, failed: failed }
@@ -0,0 +1,33 @@
1
+ make-doc-input:
2
+ command: 'bun scripts/graph-units/verbs-envelope.ts make-doc-input'
3
+ timeout_ms: 10000
4
+ make-doc-output:
5
+ command: 'bun scripts/graph-units/verbs-envelope.ts make-doc-output'
6
+ timeout_ms: 10000
7
+ verify-envelope:
8
+ command: 'bun scripts/graph-units/verbs-envelope.ts verify-envelope'
9
+ timeout_ms: 10000
10
+ verify-output-done:
11
+ command: 'bun scripts/graph-units/verbs-envelope.ts verify-output done'
12
+ timeout_ms: 10000
13
+ verify-output-rework:
14
+ command: 'bun scripts/graph-units/verbs-envelope.ts verify-output rework'
15
+ timeout_ms: 10000
16
+ verify-output-needs-human:
17
+ command: 'bun scripts/graph-units/verbs-envelope.ts verify-output needs-human'
18
+ timeout_ms: 10000
19
+ verify-output-failed:
20
+ command: 'bun scripts/graph-units/verbs-envelope.ts verify-output failed'
21
+ timeout_ms: 10000
22
+ headless-goal-loop:
23
+ command: 'bun scripts/graph-units/verbs/headless-goal-loop.ts'
24
+ dry_run_command: 'printf ''{"outcome":"done","result":"dry-run","evidence":{}}\n'''
25
+ timeout_ms: 300000
26
+ gate-baseline:
27
+ command: 'bun scripts/graph-units/verbs/verify-stage.ts gate'
28
+ dry_run_command: 'printf ''{"outcome":"pass","passed":true,"gate-log":"dry-run"}\n'''
29
+ timeout_ms: 600000
30
+ pr-reviewer:
31
+ command: 'bun scripts/graph-units/verbs/verify-stage.ts review'
32
+ dry_run_command: 'printf ''{"outcome":"pass","verdict":"pass","must-fix":[],"review-summary":"dry-run"}\n'''
33
+ timeout_ms: 180000
@@ -0,0 +1,55 @@
1
+ graph_id: verb-verify
2
+ version: 1
3
+ entry_node: prepare
4
+ terminal_nodes: [done, rework, needs-human, failed]
5
+ unit:
6
+ inputs: [ask, context, prior]
7
+ outputs: [result, evidence]
8
+ exits: [done, rework, needs-human, failed]
9
+ nodes:
10
+ - node_id: prepare
11
+ kind: observe
12
+ recipe: 'cmd:verify-envelope'
13
+ max_visits: 1
14
+ contract:
15
+ inputs: [ask, context, prior]
16
+ tools: none
17
+ outputs: [outcome, worktree, changed-files, diff, review-intent, must-fix, gate-log]
18
+ - node_id: gate
19
+ kind: gate
20
+ recipe: 'cmd:gate-baseline'
21
+ max_visits: 11
22
+ progress: [gating, gated]
23
+ terminal_stages: []
24
+ contract: { inputs: [worktree, changed-files], tools: read-and-run-tests, outputs: [outcome, passed, gate-log] }
25
+ - node_id: review
26
+ kind: judge
27
+ recipe: 'cmd:pr-reviewer'
28
+ max_visits: 11
29
+ progress: [reviewing, reviewed]
30
+ terminal_stages: [review-blocked]
31
+ contract: { inputs: [diff, review-intent], tools: read-only, outputs: [outcome, verdict, must-fix, review_summary] }
32
+ - node_id: rework-loop
33
+ kind: agent
34
+ recipe: 'cmd:headless-goal-loop'
35
+ max_visits: 10
36
+ progress: [implementing]
37
+ terminal_stages: [gate-failed, review-blocked, no-changes]
38
+ contract: { inputs: [must-fix, gate-log, worktree], tools: worktree-write, outputs: [outcome, diff, must-fix, evidence] }
39
+ - { node_id: done, kind: gate, recipe: 'cmd:verify-output-done', max_visits: 1, contract: { inputs: [], tools: none, outputs: [result, evidence] } }
40
+ - { node_id: rework, kind: gate, recipe: 'cmd:verify-output-rework', max_visits: 1, contract: { inputs: [], tools: none, outputs: [result, evidence] } }
41
+ - { node_id: needs-human, kind: hitl, recipe: 'cmd:verify-output-needs-human', max_visits: 1, contract: { inputs: [], tools: none, outputs: [result, evidence] } }
42
+ - { node_id: failed, kind: observe, recipe: 'cmd:verify-output-failed', max_visits: 1, contract: { inputs: [], tools: none, outputs: [result, evidence] } }
43
+ edges:
44
+ - from: prepare
45
+ on: outcome
46
+ map: { gate: gate, review: review, rework: rework-loop, failed: failed }
47
+ - from: gate
48
+ on: outcome
49
+ map: { pass: review, fail: rework-loop, needs-human: needs-human, failed: failed }
50
+ - from: review
51
+ on: outcome
52
+ map: { pass: done, fail: rework-loop, needs-human: needs-human, failed: failed }
53
+ - from: rework-loop
54
+ on: outcome
55
+ map: { done: gate, needs-human: needs-human, failed: rework }
@@ -0,0 +1,2 @@
1
+ # work-research-report-rehearsal has no command nodes; its behavior is in called graph units.
2
+ {}
@@ -0,0 +1,28 @@
1
+ graph_id: work-research-report-rehearsal
2
+ version: 1
3
+ entry_node: make-doc
4
+ terminal_nodes: [done, failed]
5
+ nodes:
6
+ - node_id: make-doc
7
+ kind: subgraph
8
+ recipe: none
9
+ max_visits: 3
10
+ call: verb-make-doc@1
11
+ budget: { inner_steps: 16 }
12
+ contract: { inputs: [ask, context, prior], tools: worktree-write, outputs: [result, evidence] }
13
+ - node_id: verify
14
+ kind: subgraph
15
+ recipe: none
16
+ max_visits: 3
17
+ call: verb-verify@1
18
+ budget: { inner_steps: 16 }
19
+ contract: { inputs: [ask, context, prior], tools: read-and-run-tests, outputs: [result, evidence] }
20
+ - { node_id: done, kind: gate, recipe: none, max_visits: 1 }
21
+ - { node_id: failed, kind: gate, recipe: none, max_visits: 1 }
22
+ edges:
23
+ - from: make-doc
24
+ on: outcome
25
+ map: { done: verify, rework: make-doc, needs-human: failed, failed: failed }
26
+ - from: verify
27
+ on: outcome
28
+ map: { done: done, rework: make-doc, needs-human: failed, failed: failed }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "elanous",
3
3
  "mcpName": "io.github.ElanvitalAI/elanous",
4
- "version": "0.2.32",
4
+ "version": "0.2.34",
5
5
  "description": "Self-healing coding harness where eyes, hands, and memory all turn on one sentence — it authors its own goals, implements them in isolated worktrees, and reviews its own work.",
6
6
  "license": "Apache-2.0",
7
7
  "author": "Elanvital AI",
@@ -1,7 +1,7 @@
1
1
  /** Changed-file tsc gate with a visible ratchet for pre-existing test-only debt. */
2
2
  import { execFileSync, execSync } from 'node:child_process';
3
3
  import { existsSync, mkdtempSync, readFileSync, realpathSync, rmSync, symlinkSync, writeFileSync } from 'node:fs';
4
- import { tmpdir } from 'node:os';
4
+ import { hostname, tmpdir } from 'node:os';
5
5
  import { join } from 'node:path';
6
6
  import ts from 'typescript';
7
7
  import {
@@ -26,6 +26,7 @@ import {
26
26
  } from './tsc-baseline-cache.js';
27
27
  import { TSC_OOM_RETRY_HEAP_MB, TSC_HEAP_MB, tscEnv } from '../src/typecheck-ratchet.js';
28
28
  import { runIncrementalCachedTsc } from './tsc-incremental-cache.js';
29
+ import type { GateRemoteFlags } from '../src/self-implement/gate-remote.js';
29
30
 
30
31
  /** Inherited GIT_DIR / GIT_WORK_TREE would make `--cwd <other tree>` still read the launcher's repo. */
31
32
  function gitEnv(base: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {
@@ -147,12 +148,12 @@ export function changedTsFiles(run: (cmd: string) => string = sh, env: NodeJS.Pr
147
148
  let uncountableBase: { command: string; why: string } | undefined;
148
149
  if (head && quietRevision(`git rev-parse ${base}`) === head) {
149
150
  const main = quietRevision('git rev-parse origin/main');
150
- const merged = main && main !== head ? quietRevision('git merge-base HEAD origin/main') : '';
151
+ const merged = main ? quietRevision('git merge-base HEAD origin/main') : '';
151
152
  if (merged && merged !== head) {
152
153
  warnings.push(`base=${base} 가 HEAD 와 같은 커밋 — origin/main (${main})과 달라 merge-base 로 재계산`);
153
154
  base = merged;
154
155
  baseSource = 'recomputed merge-base(origin/main)';
155
- } else if (main && main !== head) {
156
+ } else if ((merged === head && head) || (!merged && main && main !== head)) {
156
157
  uncountableBase = { command: `git rev-parse ${base}`, why: `base 가 HEAD(${head}) 와 같아 변경을 셀 수 없다 — TSC_BASE_REF 로 base 를 주라 (못 셌음 ≠ 0)` };
157
158
  }
158
159
  }
@@ -923,6 +924,10 @@ export type GateIo = {
923
924
  baseRef?: string;
924
925
  /** Source of TSC_GATE_ROOTS / ELANOUS_TSC_AFFECTED_ROOTS. Defaults to process.env. */
925
926
  env?: NodeJS.ProcessEnv;
927
+ /** Refuse an unbounded root program on the MBP seat before starting tsc. */
928
+ forbidFullLocal?: boolean;
929
+ /** Only pr land may measure a dependency-free target with the installed compiler. */
930
+ allowMissingCheckoutDependencies?: boolean;
926
931
  /** Changed gate sources → themselves plus their direct importers. Defaults to the repository import-graph reader. */
927
932
  affectedRoots?: (cwd: string, changed: ReadonlySet<string>) => AffectedRoots;
928
933
  log: (message: string) => void;
@@ -945,10 +950,11 @@ export function formatOutsideChangedWarning(outsideChanged: readonly { file: str
945
950
  return `[tsc-gate] ⚠ 변경 파일 밖 진단 ${total}건이 파일 ${fileCount}개에서 버려짐: ${nameText}`;
946
951
  }
947
952
 
948
- function inspectTscResult(tsc: TscRun, changed: ReadonlySet<string>, baseline: ReadonlyMap<string, number>, error: (message: string) => void, warn: (message: string) => void, wholeRepository = false, excludedPrefixes: readonly string[] = [], includedPrefixes: readonly string[] = [], promotionBaseline?: BaselineDiagnostics, excludeTests = false): boolean {
953
+ function inspectTscResult(tsc: TscRun, changed: ReadonlySet<string>, baseline: ReadonlyMap<string, number>, error: (message: string) => void, warn: (message: string) => void, wholeRepository = false, excludedPrefixes: readonly string[] = [], includedPrefixes: readonly string[] = [], promotionBaseline?: BaselineDiagnostics, excludeTests = false, requireAllDiagnostics = false): boolean {
949
954
  if (!tsc.ran) {
950
955
  error(`[tsc-gate] ⛔ 실행 판정 실패 — ${tsc.why}`);
951
956
  if (tsc.out.trim()) error(tsc.out.trim().slice(0, 2000));
957
+ if (tsc.why?.includes('ENOENT') || tsc.why?.includes('종료코드 127') || /Module not found ["'].*typescript\/bin\/tsc/.test(tsc.out)) error('[tsc-gate] TypeScript 실행 파일을 확인하십시오 — 대상 트리 또는 설치본에서 bun install --frozen-lockfile 뒤 재실행하십시오.');
952
958
  error('[tsc-gate] FAIL — tsc 가 정상 실행됐음을 확인할 수 없다(통과로 읽지 않는다).');
953
959
  return false;
954
960
  }
@@ -968,7 +974,11 @@ function inspectTscResult(tsc: TscRun, changed: ReadonlySet<string>, baseline: R
968
974
  warn(`[tsc-gate] ⚠ 기준 진단을 얻지 못했다 — ${promotionBaseline.unavailable} (관측만 · 비차단; 현재 진단은 면제하지 않는다).`);
969
975
  }
970
976
  const promotionDiff = wholeRepository && baselineDiagnostics ? diffTypecheckDiagnostics(diagnostics, baselineDiagnostics) : undefined;
971
- const result = classifyTypecheckErrors(promotionDiff?.added ?? diagnostics, wholeRepository ? new Set((promotionDiff?.added ?? diagnostics).map((diagnostic) => diagnostic.file)) : changed, baseline);
977
+ // Without the target's declarations, even a diagnostic outside the changed files
978
+ // may be caused by the missing installation. Do not call that measurement clean.
979
+ const classified = promotionDiff?.added ?? diagnostics;
980
+ const result = classifyTypecheckErrors(classified, wholeRepository || requireAllDiagnostics
981
+ ? new Set(classified.map((diagnostic) => diagnostic.file)) : changed, requireAllDiagnostics ? new Map() : baseline);
972
982
  if (promotionDiff?.existing.length) {
973
983
  const existingByFile = new Map<string, number>();
974
984
  for (const diagnostic of promotionDiff.existing) existingByFile.set(diagnostic.file, (existingByFile.get(diagnostic.file) ?? 0) + 1);
@@ -986,7 +996,7 @@ function inspectTscResult(tsc: TscRun, changed: ReadonlySet<string>, baseline: R
986
996
  }
987
997
  if (result.outsideChanged.length > 0) warn(formatOutsideChangedWarning(result.outsideChanged));
988
998
  if (result.failing.length === 0) return true;
989
- const failureScope = wholeRepository ? '저장소 전체 범위' : '변경 파일';
999
+ const failureScope = wholeRepository ? '저장소 전체 범위' : requireAllDiagnostics ? '대상 트리 타입 진단' : '변경 파일';
990
1000
  error(`\n[tsc-gate] FAIL — ${failureScope}에 타입 에러 ${result.failing.length}건:`);
991
1001
  for (const entry of result.failing) error(' ' + entry.line);
992
1002
  error('\n건드린 src/scripts 파일과 baseline 밖 test 파일은 tsc 클린이어야 합니다(touch-clean).');
@@ -1034,7 +1044,7 @@ export function resolveTscScript(cwd: string, scriptsDir = import.meta.dir, pres
1034
1044
  ].find(present);
1035
1045
  }
1036
1046
 
1037
- /** The installed compiler cannot resolve declarations from a checkout without its own dependencies. */
1047
+ /** Identify missing target declarations; partial installations and PWA checks remain fail-closed. */
1038
1048
  export function missingCheckoutTypeDependencies(cwd: string, needsPwa = false, present: (path: string) => boolean = existsSync): string[] {
1039
1049
  const missing: string[] = [];
1040
1050
  if (!present(join(cwd, 'node_modules'))) missing.push('node_modules');
@@ -1122,6 +1132,11 @@ export function runGate(io: Partial<GateIo> = {}): void {
1122
1132
  for (const removal of literalRemovals) warn(` ${removal.referenceFile}:${removal.line}: ${removal.typeName} -= '${removal.literal}' (${removal.file})`);
1123
1133
  }
1124
1134
  const wholeRepository = requiredFields.length > 0 || removedSymbols.length > 0 || parameterIncreases.length > 0;
1135
+ if (io.forbidFullLocal && wholeRepository) {
1136
+ error('[tsc-gate] FAIL — mbp 로 전체 tsc 승격을 실행하지 않는다. --remote 로 다시 재라 (원격 불가=미측정).');
1137
+ exit(1);
1138
+ return;
1139
+ }
1125
1140
  const pwaChanged = new Set([...changed].filter((file) => file.startsWith('apps/pwa/')));
1126
1141
  const rootChanged = new Set([...changed].filter((file) => !pwaChanged.has(file)));
1127
1142
  // 앱 파일은 앱 설정만 소유한다. 전체 승격은 root 설정만 저장소 전체로 올리고,
@@ -1156,11 +1171,14 @@ export function runGate(io: Partial<GateIo> = {}): void {
1156
1171
  }, { level: 'info' });
1157
1172
  log(`[tsc-gate] root 설정 범위 ${rootScope.size}개 관측 (apps/pwa/** 제외).`);
1158
1173
  if (runsPwa) log(`[tsc-gate] PWA 설정 범위 ${pwaScope.size}개 관측.`);
1159
- // K-OP-039: PWA checks without app dependencies produce fake type errors.
1160
- // The target checkout's declarations are required even when a compiler is
1161
- // supplied by the installed CLI or injected by another gate caller.
1174
+ // K-OP-039: partial installations without PWA dependencies produce fake type errors.
1175
+ // A checkout with no root node_modules can instead be measured by the installed compiler;
1176
+ // missing root/PWA declarations and configuration diagnostics must not become a clean pass.
1162
1177
  const missing = missingCheckoutTypeDependencies(cwd, runsPwa || wholeRepository);
1163
- if (missing.length > 0) {
1178
+ const installedCompilerCanMeasure = io.allowMissingCheckoutDependencies === true && !io.runTscCmd && missing.includes('node_modules')
1179
+ && missing.includes('bun-types') && missing.every((dependency) =>
1180
+ dependency === 'node_modules' || dependency === 'bun-types' || dependency === 'apps/pwa/node_modules');
1181
+ if (missing.length > 0 && !installedCompilerCanMeasure) {
1164
1182
  const quotedCwd = `'${cwd.replaceAll("'", "'\\''")}'`;
1165
1183
  const install = `cd ${quotedCwd} && bun install --frozen-lockfile${missing.includes('apps/pwa/node_modules') ? ' && (cd apps/pwa && bun install --frozen-lockfile)' : ''}`;
1166
1184
  error(`[tsc-gate] ⛔ 대상 트리 타입 의존성 없음: ${missing.join(', ')} — ${install}`);
@@ -1193,13 +1211,18 @@ export function runGate(io: Partial<GateIo> = {}): void {
1193
1211
  if (!cacheEnabled) return runTscCmd(command);
1194
1212
  return runIncrementalCachedTsc({
1195
1213
  cwd, base, head, changed, config, command, cacheDir: cacheDir!, run: runTscCmd, log,
1196
- decision: (result) => result.ran && inspectTscResult(result, scope, baseline, () => {}, () => {}, wholeRepository, excluded, included, promotionBaseline, excludeTests),
1214
+ decision: (result) => result.ran && inspectTscResult(result, scope, baseline, () => {}, () => {}, wholeRepository, excluded, included, promotionBaseline, excludeTests, installedCompilerCanMeasure),
1197
1215
  });
1198
1216
  };
1199
1217
  const rootPromotionBaseline = wholeRepository ? readBaselineDiagnostics(base, rootCommand) : undefined;
1200
1218
  const pwaPromotionBaseline = wholeRepository && runsPwa ? readBaselineDiagnostics(base, pwaCommand) : undefined;
1201
1219
  const pwaEnvPromotionBaseline = wholeRepository && runsPwaEnv ? readBaselineDiagnostics(base, pwaEnvCommand) : undefined;
1202
1220
  let rootPlan = planRootCheck({ wholeRepository, rootChanged, env: io.env ?? process.env, cwd, affectedRoots: io.affectedRoots ?? reverseImportAffectedRoots });
1221
+ if (io.forbidFullLocal && rootPlan.mode === 'full') {
1222
+ error(`[tsc-gate] FAIL — mbp 로 전체 tsc 를 실행하지 않는다 (${rootPlan.fallbackReason}). --remote 로 다시 재라 (원격 불가=미측정).`);
1223
+ exit(1);
1224
+ return;
1225
+ }
1203
1226
  let rootsConfig: string | undefined;
1204
1227
  if (rootPlan.mode === 'affected') {
1205
1228
  rootsConfig = cacheEnabled ? 'tsconfig.gate-roots.incremental.json' : `tsconfig.gate-roots.${process.pid}.${Date.now()}.json`;
@@ -1229,12 +1252,12 @@ export function runGate(io: Partial<GateIo> = {}): void {
1229
1252
  rootsConfig ?? TYPECHECK_GATE_CONFIG, rootScope, ['apps/pwa/'], [], rootPromotionBaseline); }
1230
1253
  finally { if (rootsConfig) rmSync(join(cwd, rootsConfig), { force: true }); }
1231
1254
  let unmeasured = !rootTsc.ran;
1232
- let passed = inspectTscResult(rootTsc, rootScope, baseline, error, warn, wholeRepository, ['apps/pwa/'], [], rootPromotionBaseline);
1255
+ let passed = inspectTscResult(rootTsc, rootScope, baseline, error, warn, wholeRepository, ['apps/pwa/'], [], rootPromotionBaseline, false, installedCompilerCanMeasure);
1233
1256
  if (runsPwa) {
1234
1257
  log(`[tsc-gate] PWA 변경 ${pwaChanged.size}개 관측 — apps/pwa/tsconfig.json 검사.`);
1235
1258
  const pwaTsc = checkedTsc(pwaCommand, 'apps/pwa/tsconfig.json', pwaScope, [], ['apps/pwa/'], pwaPromotionBaseline);
1236
1259
  unmeasured = unmeasured || !pwaTsc.ran;
1237
- passed = inspectTscResult(pwaTsc, pwaScope, baseline, error, warn, wholeRepository, [], ['apps/pwa/'], pwaPromotionBaseline) && passed;
1260
+ passed = inspectTscResult(pwaTsc, pwaScope, baseline, error, warn, wholeRepository, [], ['apps/pwa/'], pwaPromotionBaseline, false, installedCompilerCanMeasure) && passed;
1238
1261
  }
1239
1262
  if (runsPwaEnv) {
1240
1263
  log(`[tsc-gate] PWA env 패스 — 루트 비시험 ${nonTestRootChanged.size}개 (Next ProcessEnv 선언 포함).`);
@@ -1242,6 +1265,13 @@ export function runGate(io: Partial<GateIo> = {}): void {
1242
1265
  unmeasured = unmeasured || !pwaEnvTsc.ran;
1243
1266
  passed = inspectTscResult(pwaEnvTsc, pwaEnvScope, baseline, error, warn, wholeRepository, ['apps/pwa/'], [], pwaEnvPromotionBaseline, true) && passed;
1244
1267
  }
1268
+ if (passed && installedCompilerCanMeasure && missing.includes('apps/pwa/node_modules')) {
1269
+ const quotedCwd = `'${cwd.replaceAll("'", "'\\''")}'`;
1270
+ error(`[tsc-gate] ⛔ 대상 트리 타입 의존성 없음: apps/pwa/node_modules — cd ${quotedCwd} && bun install --frozen-lockfile && (cd apps/pwa && bun install --frozen-lockfile)`);
1271
+ error('[tsc-gate] FAIL — PWA 의존성이 없는 트리의 진단 0건은 통과가 아니다.');
1272
+ exit(1);
1273
+ return;
1274
+ }
1245
1275
  if (passed) { log('[tsc-gate] PASS — 변경 파일에 신규 타입 에러 없음.'); return; }
1246
1276
  // ⛔⭐⭐ T67 — ***마지막 줄은 언제나 「판정」이어야 한다.*** 사람도 도구도 마지막 줄을 읽는다.
1247
1277
  // 🩸 2026-09-11 실측(🅕 보고): 타입 에러 3건이 있는데 `tail -1` 이 «경고»를 집어
@@ -1266,6 +1296,26 @@ export function runGate(io: Partial<GateIo> = {}): void {
1266
1296
  // ⭐ 그래서 막는 자리는 «여기»뿐이다 — 인-프로세스 호출자(`pr-cli.ts`·`seams.ts`)는
1267
1297
  // argv 를 안 넘기고, 만약 여기서 `process.argv` 를 «읽으면» 형제 게이트가 경고한 그 사고가 난다
1268
1298
  // (`elanous pr land` 의 인자를 자기 인자로 읽는다 — `src/cli/pr-cli.ts` 의 `args: []` 주석).
1299
+ /** Physical MBP/HQ seat shells need a guard even when the caller explicitly selected --local. */
1300
+ export function isHeadquartersTypecheckShell(host: string, cwd: string): boolean {
1301
+ const name = host.toLowerCase();
1302
+ if (/macstudio|macmini|host-e|node-b|node-c/.test(name)) return false;
1303
+ return /macbook|(?:^|[-.])mbp(?:[-.]|$)/.test(name) || /(?:^|\/)elanous-hq\/(?:seats|work)\//.test(cwd);
1304
+ }
1305
+
1306
+ /** HQ/seat shells default to node-b; a gate Pod, remote worker, or CI measures its own checkout locally. */
1307
+ export function forbidFullTypecheckOnLocal(env: NodeJS.ProcessEnv, host: string, cwd: string): boolean {
1308
+ if (env.CI || env.KUBERNETES_SERVICE_HOST || env.ELANOUS_GATE_REMOTE_CHILD === '1') return false;
1309
+ return isHeadquartersTypecheckShell(host, cwd);
1310
+ }
1311
+
1312
+ export const defaultTypecheckRemote = forbidFullTypecheckOnLocal;
1313
+
1314
+ export function typecheckDispatchFlags(flags: GateRemoteFlags, env: NodeJS.ProcessEnv, host: string, cwd: string): GateRemoteFlags {
1315
+ return defaultTypecheckRemote(env, host, cwd) && flags.remote === undefined && !flags.local
1316
+ ? { ...flags, remote: 'node-b' } : flags;
1317
+ }
1318
+
1269
1319
  if (import.meta.main) void (async () => {
1270
1320
  // GATE-REMOTE (10-06): the only accepted arguments are the dispatch flags `--remote [host]` / `--local` — they choose
1271
1321
  // «where» the same commit is measured, never «what» (the base stays merge-base(origin/main) on both sides).
@@ -1281,14 +1331,17 @@ if (import.meta.main) void (async () => {
1281
1331
  process.exit(2);
1282
1332
  }
1283
1333
  const repo = sh('git rev-parse --show-toplevel').trim();
1334
+ const onMbp = forbidFullTypecheckOnLocal(process.env, hostname(), repo);
1335
+ const dispatchFlags = typecheckDispatchFlags(flags, process.env, hostname(), repo);
1284
1336
  const baseRef = process.env.TSC_BASE_REF;
1285
1337
  const passEnv = (sha: (ref: string) => string) => (['NODE_OPTIONS', 'TSC_BASE_REF', 'TSC_HEAP_MB'] as const).filter((key) => process.env[key])
1286
1338
  .map((key) => `${key}=${key === 'TSC_BASE_REF' && baseRef !== 'origin/main' ? sha(baseRef!) : process.env[key]}`);
1287
1339
  // exitCode, not exit(): piped stdout/stderr drain before the process ends.
1288
1340
  process.exitCode = await dispatchHeavyCheck({
1289
- tool: 'ci-typecheck-changed', repo, flags,
1341
+ tool: 'ci-typecheck-changed', repo, flags: dispatchFlags, explicitRemoteOnly: dispatchFlags.remote !== undefined,
1342
+ stableCheckout: true, installPwa: true,
1290
1343
  remoteArgv: (sha) => { const vars = passEnv(sha); return [...(vars.length ? ['env', ...vars] : []), 'bun', 'run', 'scripts/ci-typecheck-changed.ts', '--local']; },
1291
1344
  refs: baseRef ? [baseRef] : [],
1292
- runLocal: () => { runGate(); return 0; },
1345
+ runLocal: () => { runGate({ forbidFullLocal: onMbp }); return 0; },
1293
1346
  });
1294
1347
  })();
@@ -26,6 +26,7 @@ import {
26
26
  type GraphParseIssue,
27
27
  type GraphTemplateSpec,
28
28
  } from '../../src/self-implement/graph-yaml.js';
29
+ import { flattenGraphTemplate } from '../../src/self-implement/graph-unit-resolver.js';
29
30
  import { parse as parseYaml, stringify as stringifyYaml } from 'yaml';
30
31
 
31
32
  /** drafts/ · overlays/ 는 스캔에서 뺀다(실측 10-05). 그 이름인 디렉터리와 그 아래는 안 읽는다. */
@@ -104,7 +105,22 @@ function graphFileNames(abs: string): string[] {
104
105
 
105
106
  /** loadGraphTemplates for harness dirs; the runner's reading for workflow-graph dirs (same result shape). */
106
107
  function loadDir(abs: string): GraphLoadResult {
107
- if (!isRunnerDir(abs)) return loadGraphTemplates(abs);
108
+ if (!isRunnerDir(abs)) {
109
+ const loaded = loadGraphTemplates(abs);
110
+ if (loaded.scannedFiles === 0) return loaded;
111
+ const errors = [...loaded.errors];
112
+ const templates: Record<string, GraphTemplateSpec> = {};
113
+ for (const file of graphFileNames(abs)) {
114
+ let source: string;
115
+ try { source = readFileSync(join(abs, file), 'utf8'); }
116
+ catch (error) { errors.push({ path: file, message: `읽기 실패: ${String(error)}` }); continue; }
117
+ const parsed = parseGraphTemplateYaml(source, file);
118
+ if (!parsed.template || parsed.errors.length) continue;
119
+ try { templates[parsed.template.graphId] = flattenGraphTemplate(parsed.template, join(abs, file)); }
120
+ catch (error) { errors.push({ path: file, message: `unit 펼침 실패: ${error instanceof Error ? error.message : String(error)}` }); }
121
+ }
122
+ return { ...loaded, templates, errors };
123
+ }
108
124
  const errors: GraphParseIssue[] = [];
109
125
  const warnings: GraphParseIssue[] = [];
110
126
  const templates: Record<string, GraphTemplateSpec> = {};
@@ -120,7 +136,8 @@ function loadDir(abs: string): GraphLoadResult {
120
136
  warnings.push(...result.warnings);
121
137
  if (!result.template) continue;
122
138
  if (templates[result.template.graphId]) { errors.push({ path: file, message: `graph_id '${result.template.graphId}' 가 중복이다` }); continue; }
123
- templates[result.template.graphId] = result.template;
139
+ try { templates[result.template.graphId] = flattenGraphTemplate(result.template, join(abs, file)); }
140
+ catch (error) { errors.push({ path: file, message: `unit 펼침 실패: ${error instanceof Error ? error.message : String(error)}` }); }
124
141
  }
125
142
  return { templates, errors, warnings, scannedFiles: files.length };
126
143
  }
@@ -0,0 +1,22 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { spawnSync } from 'node:child_process';
3
+ import { runHarvestUnit, type HarvestInput } from '../src/task-agent/harvest-unit.js';
4
+
5
+ type GraphContext = { input?: HarvestInput };
6
+ if (process.argv.includes('--dry-run')) {
7
+ console.log(JSON.stringify({ outcome: 'done', result: { dryRun: true }, evidence: { reviewerInvoked: false } }));
8
+ process.exit(0);
9
+ }
10
+ const contextPath = process.env.ELANOUS_GRAPH_CONTEXT;
11
+ if (!contextPath) throw new Error('ELANOUS_GRAPH_CONTEXT is required');
12
+ const graphContext = JSON.parse(readFileSync(contextPath, 'utf8')) as GraphContext;
13
+
14
+ const result = await runHarvestUnit(graphContext.input ?? {}, async ({ pr, intent }) => {
15
+ const command = process.env.ELANOUS_BIN ?? 'eln';
16
+ const child = spawnSync(command, [
17
+ 'self', 'review', pr, '--intent', intent, '--json', '--save', 'ta-harvest',
18
+ ], { encoding: 'utf8', timeout: 300_000, maxBuffer: 8 * 1024 * 1024 });
19
+ if (child.error) throw child.error;
20
+ return { stdout: child.stdout ?? '', stderr: child.stderr ?? '', exitCode: child.status };
21
+ });
22
+ console.log(JSON.stringify(result));
@@ -0,0 +1,6 @@
1
+ const stage = process.argv[2] ?? 'unknown';
2
+ process.stdout.write(`${JSON.stringify({
3
+ outcome: 'needs-human',
4
+ result: { stage, state: 'stub' },
5
+ evidence: { reason: 'owner unit has not been integrated' },
6
+ })}\n`);
@@ -0,0 +1,78 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { existsSync, readFileSync } from 'node:fs';
3
+ import { isAbsolute } from 'node:path';
4
+ import { debug } from '../../src/debug/log.js';
5
+
6
+ type RecordValue = Record<string, unknown>;
7
+ type EnqueueResult = {
8
+ outcome: 'done' | 'needs-human';
9
+ result: string;
10
+ evidence: RecordValue;
11
+ };
12
+
13
+ function record(value: unknown): RecordValue {
14
+ return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as RecordValue : {};
15
+ }
16
+
17
+ function text(value: unknown): string {
18
+ return typeof value === 'string' ? value.trim() : '';
19
+ }
20
+
21
+ function needsHuman(reason: string, evidence: RecordValue = {}): EnqueueResult {
22
+ return { outcome: 'needs-human', result: reason, evidence: { enqueued: false, reason, ...evidence } };
23
+ }
24
+
25
+ const OWNERS = new Set(['TC', 'MK', 'UX', 'OPC', 'OPT', 'OP', 'tf']);
26
+
27
+ /** The graph asks the existing OP train to enqueue; it never performs a merge. */
28
+ export function runLandEnqueue(
29
+ envelope: unknown,
30
+ executable = process.env.ELANOUS_LAND_ENQUEUE,
31
+ spawn: typeof spawnSync = spawnSync,
32
+ ): EnqueueResult {
33
+ const context = record(record(envelope).context);
34
+ const rawPr = context.pr;
35
+ const pr = typeof rawPr === 'number' ? rawPr : typeof rawPr === 'string' && /^\d+$/.test(rawPr) ? Number(rawPr) : NaN;
36
+ const expectedHead = text(context.expectedHead);
37
+ const review = text(context.review);
38
+ const rawOwner = text(context.owner);
39
+ const owner = rawOwner.startsWith('train:') ? rawOwner.slice(6) : rawOwner;
40
+ if (!Number.isSafeInteger(pr) || pr <= 0) return needsHuman('pr-missing-or-invalid');
41
+ if (!/^[0-9a-f]{40}$/i.test(expectedHead)) return needsHuman('expected-head-missing-or-invalid', { pr });
42
+ if (!isAbsolute(review) || !existsSync(review)) return needsHuman('review-json-missing', { pr, expectedHead, review });
43
+ if (!OWNERS.has(owner)) return needsHuman('train-owner-missing-or-invalid', { pr, expectedHead, review });
44
+ if (!executable || !isAbsolute(executable) || !existsSync(executable)) {
45
+ return needsHuman('land-enqueue-command-unavailable', { pr, expectedHead, review, owner });
46
+ }
47
+ const args = [String(pr), `train:${owner}`, '--expected-head', expectedHead, '--review', review];
48
+ const result = spawn(executable, args, { encoding: 'utf8', timeout: 55_000, shell: false });
49
+ const evidence = {
50
+ pr, expectedHead, review, owner,
51
+ exitCode: result.status,
52
+ stdout: String(result.stdout ?? '').slice(-2000),
53
+ stderr: String(result.stderr ?? '').slice(-2000),
54
+ };
55
+ if (result.error || result.status !== 0) {
56
+ return needsHuman(result.error ? `land-enqueue-error: ${result.error.message}` : 'land-enqueue-refused', evidence);
57
+ }
58
+ return { outcome: 'done', result: 'train-enqueued', evidence: { enqueued: true, ...evidence } };
59
+ }
60
+
61
+ if (import.meta.main) {
62
+ try {
63
+ const path = process.env.ELANOUS_GRAPH_CONTEXT;
64
+ if (!path) throw new Error('ELANOUS_GRAPH_CONTEXT missing');
65
+ const graph = JSON.parse(readFileSync(path, 'utf8')) as { input?: unknown };
66
+ const result = runLandEnqueue(graph.input);
67
+ debug.log('harness.journey', 'land-enqueue', {
68
+ outcome: result.outcome,
69
+ reason: result.outcome === 'needs-human' ? result.result : null,
70
+ pr: result.evidence.pr ?? null,
71
+ expectedHead: result.evidence.expectedHead ?? null,
72
+ enqueued: result.evidence.enqueued,
73
+ });
74
+ console.log(JSON.stringify(result));
75
+ } catch (error) {
76
+ console.log(JSON.stringify(needsHuman(`land-context-invalid: ${error instanceof Error ? error.message : String(error)}`)));
77
+ }
78
+ }
@@ -0,0 +1,15 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { planPrLandRecoveryForEntry, type PrLandRecoveryContext } from '../../src/cli/pr-land-recovery.js';
3
+
4
+ type GraphContext = { nodeId?: string; input?: { context?: PrLandRecoveryContext } };
5
+
6
+ try {
7
+ const path = process.env.ELANOUS_GRAPH_CONTEXT;
8
+ if (!path) throw new Error('ELANOUS_GRAPH_CONTEXT missing');
9
+ const graph = JSON.parse(readFileSync(path, 'utf8')) as GraphContext;
10
+ const context = graph.input?.context;
11
+ if (!context || typeof context !== 'object' || Array.isArray(context)) throw new Error('recover context missing');
12
+ console.log(JSON.stringify(planPrLandRecoveryForEntry(context, graph.nodeId ?? '')));
13
+ } catch (error) {
14
+ console.log(JSON.stringify({ outcome: 'failed', result: { action: 'none', reason: error instanceof Error ? error.message : String(error) }, evidence: { refusal: '', label: 'invalid-input', route: null, source: 'none' } }));
15
+ }