elanous 0.2.22 → 0.2.24

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 (803) hide show
  1. package/NOTICE +7 -0
  2. package/README.md +32 -22
  3. package/apps/pwa/out/404/index.html +1 -1
  4. package/apps/pwa/out/404.html +1 -1
  5. package/apps/pwa/out/_next/static/{aBi6EyMtLsrl7J8eH4kF7 → Q-7iofoxOEv1WX18S35of}/_buildManifest.js +1 -1
  6. package/apps/pwa/out/_next/static/chunks/{119fc678.6f591cdb84ca5791.js → 0673cc54.8e2ef1c23e49e190.js} +1 -1
  7. package/apps/pwa/out/_next/static/chunks/{a9f2b54d-40c16bd0efdb04b8.js → 0a09e062-34f747a17d8d8c2e.js} +1 -1
  8. package/apps/pwa/out/_next/static/chunks/{f8626309.a4e5d362b1d55e59.js → 0e3acd34.d42b2ef87fdf4234.js} +1 -1
  9. package/apps/pwa/out/_next/static/chunks/1168.a0fb3d9db76c00bd.js +77 -0
  10. package/apps/pwa/out/_next/static/chunks/{7175-350f4ce2873bc038.js → 1325-dc3f3c21eb181cb4.js} +1 -1
  11. package/apps/pwa/out/_next/static/chunks/1357.a843c41d2cd7ec31.js +34 -0
  12. package/apps/pwa/out/_next/static/chunks/1430.53f49882b17607c2.js +24 -0
  13. package/apps/pwa/out/_next/static/chunks/1459-be6509b3419d8a9f.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/{6767.8e6c5f6e744fcd9f.js → 1505.5826671109111e75.js} +2 -2
  15. package/apps/pwa/out/_next/static/chunks/153.0a4e3cd516930491.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/1572.7bc291352e241a45.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/1593-d07ad068c120dfb0.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/1608.b7c900baa56cab32.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/1615-4d8156febaac4b35.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/1646.e03f0fbc26bc72f6.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/{7327-2d69fb321ba73389.js → 1669-da843ed73aa301f5.js} +1 -1
  22. package/apps/pwa/out/_next/static/chunks/176.13ba0659e3e96fd4.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/1990.9c60f495ef33c070.js +36 -0
  24. package/apps/pwa/out/_next/static/chunks/2042e469.f86158dd5c1e51a1.js +122 -0
  25. package/apps/pwa/out/_next/static/chunks/2528.0af5c0e1fad88df6.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2543-28ec6aeb80a5e1e1.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2561.43c99d6ee914ee6a.js +62 -0
  28. package/apps/pwa/out/_next/static/chunks/2638.b39ab2f674caa1a5.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/272-0eed0fb0aab716b6.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/{7899.597af4a9996c907f.js → 2721.bc9a8f36bd85c07a.js} +1 -1
  31. package/apps/pwa/out/_next/static/chunks/2778.67e0c1d484189ccf.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/2841.10ff309f6a3168af.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/2886-9639f97d523d752a.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/2978.57fb87ce21cc5a85.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/3664.15f968c39d15bd28.js +149 -0
  36. package/apps/pwa/out/_next/static/chunks/3786-935eb3fcde90e496.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3813.df4a01ae89c6f63f.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3961-aaae04ed1d32622f.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3992.f79c70480e8c4077.js +309 -0
  40. package/apps/pwa/out/_next/static/chunks/40-413e8641de9ed1e5.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/4054-521f11a503daed64.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/4315.e7356f34c7d8ec79.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/4489-bf629de6f04f7681.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4540.557733cc88c6a82b.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/462.0275b4338c5b6337.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/4658-7ed9266098a787e4.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4945-0f4046cfc3228ea3.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/{d70879db.c66c56a95a91efc6.js → 4c5e95ce.83e9b16add6fcd8c.js} +1 -1
  49. package/apps/pwa/out/_next/static/chunks/5105-18b4165c5d3a86b0.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/5205-6992210fe31f45f4.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/5287-72898b126d722457.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/{6158.566c890adc06a459.js → 5313.1697309c532b9856.js} +2 -2
  53. package/apps/pwa/out/_next/static/chunks/{79b78388.663188133449d707.js → 53746282.1be36038d1abd949.js} +1 -1
  54. package/apps/pwa/out/_next/static/chunks/5474.991b90688c3cb321.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5544-871146192d095594.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/5578.ac963634373b28c6.js +286 -0
  57. package/apps/pwa/out/_next/static/chunks/5935.d5e8ca3e096772e8.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5967-c0a80f8ffe5d4050.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/{1268.0840ff91e083fcbd.js → 5974.360f8441eb0ac1ec.js} +1 -1
  60. package/apps/pwa/out/_next/static/chunks/6006.84e8b418a7a0db97.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/6013-1267ba7454d6764b.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/6038-1e0f7ee1086da4cf.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/617.709dd0019fe99796.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/6261.fb9bf94947094636.js +74 -0
  65. package/apps/pwa/out/_next/static/chunks/6411.1966866fae31ffa9.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/6481-b829d99aa8d158f5.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/6541.2b7daa043100d0fa.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/6571-926ddf024a6ad5df.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/6597.2d7a6d77ab485b27.js +64 -0
  70. package/apps/pwa/out/_next/static/chunks/67.5dd2dc543c2fa3de.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/{9832.2ab2e818013574c7.js → 6702.ebbd165d5e4a4a14.js} +1 -1
  72. package/apps/pwa/out/_next/static/chunks/6777-312496b0d774719b.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/681.0116f7036cfb4e8d.js +32 -0
  74. package/apps/pwa/out/_next/static/chunks/6871.30b2bf23b3126e36.js +24 -0
  75. package/apps/pwa/out/_next/static/chunks/6882.737d366d54e29d83.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/7035.54c2c535164b1c9b.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/7086-8bfa7e8f796a03d9.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/7126.5e5599f251726b67.js +93 -0
  79. package/apps/pwa/out/_next/static/chunks/7203-47ff0740a293e284.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/7268.017f49dafb5f0ff3.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/7355.5d65a87e9567ae08.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7392.4018c2a62177f296.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/{6110.1297d4093fdfbb0d.js → 740.90b31555290236a9.js} +2 -2
  84. package/apps/pwa/out/_next/static/chunks/7471.3a3d1be50559cfb8.js +148 -0
  85. package/apps/pwa/out/_next/static/chunks/7500.73489a345cef2201.js +226 -0
  86. package/apps/pwa/out/_next/static/chunks/{9070.067c106528ec1ae6.js → 7518.49161e8f5814abdb.js} +1 -1
  87. package/apps/pwa/out/_next/static/chunks/7565.c2f72a15c1ed0396.js +27 -0
  88. package/apps/pwa/out/_next/static/chunks/7651.6d1c984d3d8587a4.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7713.7ab863ed59b2d661.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7793.d7cd2026767ddd54.js +115 -0
  91. package/apps/pwa/out/_next/static/chunks/7837.c7c267e5dceadb11.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7891.09266382daf70d1c.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7905.b230b9d06cb4ad5d.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7990-cbf6a01bcbdcb7e6.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/8119-819c549e0c197786.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/8186-74ea19a3700d04a8.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/{8194.484f51e273d9abd2.js → 8264.00e434fbd02e9311.js} +16 -16
  98. package/apps/pwa/out/_next/static/chunks/8267-e7b3262b735ae106.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/8386.86518e55b75f7cf5.js +8 -0
  100. package/apps/pwa/out/_next/static/chunks/{088d8e8a.8069543d082bec12.js → 83cfc5c8.349535543c1548b6.js} +1 -1
  101. package/apps/pwa/out/_next/static/chunks/8437.ba6eeeb29590042f.js +23 -0
  102. package/apps/pwa/out/_next/static/chunks/{1948.5f35b39eef222a94.js → 8438.ee7f0df3b3f6fcb4.js} +1 -1
  103. package/apps/pwa/out/_next/static/chunks/8469-1500be57e582296f.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8483-7164cecdaf178ca6.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/{4588.ad3364cb7fb97ada.js → 8532.a86e99acf9b761cb.js} +2 -2
  106. package/apps/pwa/out/_next/static/chunks/8569.b853a8daa8f31d12.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8722-4c940f02c496ad36.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/887-41d0dcf5af48c628.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/8925-2abfb48af477fb7f.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/{88729267.9c6c000157c83f2f.js → 89849432.9eaa2f4c9c010965.js} +3 -3
  111. package/apps/pwa/out/_next/static/chunks/9039.da86361496797522.js +90 -0
  112. package/apps/pwa/out/_next/static/chunks/905.d5745a25884754d4.js +94 -0
  113. package/apps/pwa/out/_next/static/chunks/9089-d909f3d4478b0628.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9096.dc5c7a267f83790c.js +41 -0
  115. package/apps/pwa/out/_next/static/chunks/93.a567257b6bdb7fe4.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9320.419acb9665b46597.js +287 -0
  117. package/apps/pwa/out/_next/static/chunks/9356.b8ceda6634612ff8.js +79 -0
  118. package/apps/pwa/out/_next/static/chunks/94.e9e1043b35cd3eed.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9400-7498ea90b2e6ee8f.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/{3522-1de1319d028ac89c.js → 9502-32c5dc22e8f120f5.js} +3 -3
  121. package/apps/pwa/out/_next/static/chunks/9930-58644af9c813d6e1.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9932.367cf4725fedd6e2.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/9935.1628b904cdc8ce0e.js +104 -0
  124. package/apps/pwa/out/_next/static/chunks/{7630.2b9a68659053ff4e.js → 9976.8f28864317639fe6.js} +16 -16
  125. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-a2aa8709d193ee0d.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/approvals/page-3b9fc39362473ae7.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f2b62c19ca68fef8.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/board/page-d7602d489edf5f37.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/botlab/page-24282bf9f90031a5.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/bots/page-8b7c5ab6b5bc8d64.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/ceo/page-4eb84d454f8c3415.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/chat/page-b2e494bdad57fcb5.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/consult/{page-80ed511e02c81412.js → page-c0ab229673a8b0eb.js} +1 -1
  134. package/apps/pwa/out/_next/static/chunks/app/control/page-3e2b45f3c36dbac4.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c22aa511b28743ad.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/design-check/page-26345242e4049f55.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/editor/page-bf88c0f558d8ef54.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/exec/page-52fec523e5b5d3ad.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/field/page-67723dfdcde92b31.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/healthz/route-a2aa8709d193ee0d.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/inside/page-22725e2570f1126b.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/intake/page-1891335950d68b70.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/layout-3267af1ebdc73cf5.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/live/page-c314b75c11234998.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/live-run/page-9f9c85415f61782b.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/loops/page-c1d4276059085587.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/market/page-833aab587f26ad4c.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8526c17ae38e6a50.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/morning/page-f998637a8402115c.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/not-found-b7bb53828b17b335.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/observatory/page-1b1850de0257e46d.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6f23159fedb41f67.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1d809a87139dd024.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-da9e570234d481fd.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/outputs/page-b92caddb5c715f30.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/page-8ce3a38e210b810a.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/reflection/page-57ffeeb6019440fd.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-abbb417bf514630b.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/sessions/page-2c2b3f29cec1efa4.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-9369279f72fc7b51.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/settings/page-64861f14039499c3.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ddc4c93efd8ab94b.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/setup/layout-a2aa8709d193ee0d.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/setup/page-901a1391b81053bc.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/share/page-68d9bbaac9841a58.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/showroom/page-b5c0c996f329371e.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/tasks/page-89881ccbcf728978.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/term/page-0e87a803b3d7165e.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/today/page-58d4e5cb30ef4871.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/trace/page-02ce4c3b5f39e4d2.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/vault/page-e620d1bb8eadcec2.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-acf868c64d77f950.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/workflows/page-54fa605fa6dba457.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/workspace/page-bc79f0833533fa84.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-d5c4398eea03d8f3.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/b4e12462-5fab4a813a63dadd.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/cd39fa05.fac4545f42a3ef70.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/{f6b7c9ba.64a895b8b2fedbdc.js → ce383d63.d2ede338788ed18e.js} +1 -1
  179. package/apps/pwa/out/_next/static/chunks/{framework-5c169757551134ed.js → framework-b2763b10dc6b3836.js} +1 -1
  180. package/apps/pwa/out/_next/static/chunks/main-app-27893e93b0ec193d.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/main-f280047194e1daf8.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_app-e90eff2d0b70564c.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/pages/_error-70f2d654b3435d34.js +1 -0
  184. package/apps/pwa/out/_next/static/chunks/webpack-4794f053bd5e4230.js +1 -0
  185. package/apps/pwa/out/_next/static/css/72becfd42807b50d.css +1 -0
  186. package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +1 -0
  187. package/apps/pwa/out/approvals/index.html +1 -1
  188. package/apps/pwa/out/approvals/index.txt +23 -23
  189. package/apps/pwa/out/autopilot/index.html +1 -1
  190. package/apps/pwa/out/autopilot/index.txt +23 -23
  191. package/apps/pwa/out/board/index.html +1 -1
  192. package/apps/pwa/out/board/index.txt +23 -23
  193. package/apps/pwa/out/botlab/index.html +1 -1
  194. package/apps/pwa/out/botlab/index.txt +22 -22
  195. package/apps/pwa/out/bots/index.html +1 -1
  196. package/apps/pwa/out/bots/index.txt +22 -22
  197. package/apps/pwa/out/ceo/index.html +1 -1
  198. package/apps/pwa/out/ceo/index.txt +23 -23
  199. package/apps/pwa/out/chat/index.html +1 -1
  200. package/apps/pwa/out/chat/index.txt +22 -22
  201. package/apps/pwa/out/consult/index.html +1 -1
  202. package/apps/pwa/out/consult/index.txt +23 -23
  203. package/apps/pwa/out/control/index.html +1 -1
  204. package/apps/pwa/out/control/index.txt +23 -23
  205. package/apps/pwa/out/decisions/index.html +1 -1
  206. package/apps/pwa/out/decisions/index.txt +22 -22
  207. package/apps/pwa/out/design-check/index.html +1 -1
  208. package/apps/pwa/out/design-check/index.txt +23 -23
  209. package/apps/pwa/out/editor/index.html +1 -1
  210. package/apps/pwa/out/editor/index.txt +24 -23
  211. package/apps/pwa/out/exec/index.html +1 -1
  212. package/apps/pwa/out/exec/index.txt +23 -23
  213. package/apps/pwa/out/field/index.html +1 -1
  214. package/apps/pwa/out/field/index.txt +23 -23
  215. package/apps/pwa/out/healthz +1 -1
  216. package/apps/pwa/out/index.html +1 -1
  217. package/apps/pwa/out/index.txt +22 -22
  218. package/apps/pwa/out/inside/index.html +1 -1
  219. package/apps/pwa/out/inside/index.txt +22 -22
  220. package/apps/pwa/out/intake/index.html +1 -1
  221. package/apps/pwa/out/intake/index.txt +23 -23
  222. package/apps/pwa/out/live/index.html +1 -1
  223. package/apps/pwa/out/live/index.txt +23 -23
  224. package/apps/pwa/out/live-run/index.html +1 -1
  225. package/apps/pwa/out/live-run/index.txt +24 -23
  226. package/apps/pwa/out/loops/index.html +1 -1
  227. package/apps/pwa/out/loops/index.txt +22 -22
  228. package/apps/pwa/out/market/index.html +1 -1
  229. package/apps/pwa/out/market/index.txt +22 -22
  230. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  231. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  232. package/apps/pwa/out/morning/index.html +1 -1
  233. package/apps/pwa/out/morning/index.txt +23 -23
  234. package/apps/pwa/out/observatory/index.html +1 -1
  235. package/apps/pwa/out/observatory/index.txt +23 -23
  236. package/apps/pwa/out/ops/checklist/index.html +1 -1
  237. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  238. package/apps/pwa/out/ops/release/index.html +1 -1
  239. package/apps/pwa/out/ops/release/index.txt +22 -22
  240. package/apps/pwa/out/ops/seats/index.html +1 -1
  241. package/apps/pwa/out/ops/seats/index.txt +22 -22
  242. package/apps/pwa/out/outputs/index.html +1 -1
  243. package/apps/pwa/out/outputs/index.txt +22 -22
  244. package/apps/pwa/out/reflection/index.html +1 -1
  245. package/apps/pwa/out/reflection/index.txt +23 -23
  246. package/apps/pwa/out/scheduler/index.html +1 -1
  247. package/apps/pwa/out/scheduler/index.txt +23 -23
  248. package/apps/pwa/out/sessions/index.html +1 -1
  249. package/apps/pwa/out/sessions/index.txt +22 -22
  250. package/apps/pwa/out/settings/devices/index.html +1 -1
  251. package/apps/pwa/out/settings/devices/index.txt +23 -23
  252. package/apps/pwa/out/settings/index.html +1 -1
  253. package/apps/pwa/out/settings/index.txt +23 -23
  254. package/apps/pwa/out/setup/done/index.html +1 -1
  255. package/apps/pwa/out/setup/done/index.txt +23 -23
  256. package/apps/pwa/out/setup/index.html +1 -1
  257. package/apps/pwa/out/setup/index.txt +23 -23
  258. package/apps/pwa/out/share/index.html +1 -1
  259. package/apps/pwa/out/share/index.txt +23 -23
  260. package/apps/pwa/out/showroom/index.html +1 -1
  261. package/apps/pwa/out/showroom/index.txt +22 -22
  262. package/apps/pwa/out/tasks/index.html +1 -1
  263. package/apps/pwa/out/tasks/index.txt +23 -23
  264. package/apps/pwa/out/term/index.html +1 -1
  265. package/apps/pwa/out/term/index.txt +23 -23
  266. package/apps/pwa/out/today/index.html +1 -1
  267. package/apps/pwa/out/today/index.txt +23 -23
  268. package/apps/pwa/out/trace/index.html +1 -1
  269. package/apps/pwa/out/trace/index.txt +23 -23
  270. package/apps/pwa/out/vault/index.html +1 -1
  271. package/apps/pwa/out/vault/index.txt +23 -23
  272. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  273. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  274. package/apps/pwa/out/workflows/index.html +1 -1
  275. package/apps/pwa/out/workflows/index.txt +23 -23
  276. package/apps/pwa/out/workspace/index.html +1 -1
  277. package/apps/pwa/out/workspace/index.txt +23 -23
  278. package/apps/pwa/out/worktrees/index.html +1 -1
  279. package/apps/pwa/out/worktrees/index.txt +23 -23
  280. package/catalog/models/anthropic/claude-haiku-5-5.yaml +32 -0
  281. package/catalog/models/anthropic/claude-opus-5-5.yaml +5 -0
  282. package/catalog/models/anthropic/claude-sonnet-5-5.yaml +31 -0
  283. package/catalog/models/anthropic/claude-sonnet-5.yaml +8 -2
  284. package/catalog/models/openai/gpt-6-astra.yaml +6 -0
  285. package/catalog/models/openai/gpt-6-luna.yaml +6 -0
  286. package/catalog/models/openai/gpt-6-sol.yaml +6 -0
  287. package/catalog/models/openrouter/deepseek-v4-pro-0813.yaml +39 -0
  288. package/catalog/models/openrouter/deepseek-v4.1-flash.yaml +38 -0
  289. package/catalog/models/openrouter/glm-5.3-flash.yaml +35 -0
  290. package/catalog/providers/openrouter.yaml +2 -0
  291. package/graphs/implement-loop.yaml +31 -0
  292. package/graphs/log-horizon/log-horizon-watch.yaml +25 -0
  293. package/graphs/log-horizon/recipes.yaml +3 -0
  294. package/graphs/ops/harness-gc.yaml +17 -0
  295. package/graphs/ops/recipes.yaml +3 -0
  296. package/graphs/overlays/README.md +1 -1
  297. package/graphs/overlays/stop-heal-ladder.yaml +105 -0
  298. package/graphs/release/recipes.yaml +1 -1
  299. package/graphs/release/release-loop.yaml +6 -2
  300. package/graphs/release-rehearsal/recipes.yaml +12 -0
  301. package/graphs/release-rehearsal/release-rehearsal.yaml +17 -0
  302. package/package.json +4 -1
  303. package/scripts/add-api-key.sh +1 -1
  304. package/scripts/bench-report.ts +82 -3
  305. package/scripts/ci-typecheck-changed.ts +80 -14
  306. package/scripts/fleet/bedrock-pod-secret.ts +122 -0
  307. package/scripts/fleet/node-setup-linux.sh +97 -0
  308. package/scripts/fleet/node-setup.sh +11 -0
  309. package/scripts/fleet/zai-pod-secret.ts +86 -0
  310. package/scripts/hq/hq-fence-wrapper.sh +148 -0
  311. package/scripts/land-global-checks.ts +3 -0
  312. package/scripts/lib/typecheck-ratchet.ts +51 -0
  313. package/scripts/measure-log-diet-2.ts +213 -0
  314. package/scripts/measure-tsc-affected-roots.ts +289 -0
  315. package/scripts/openai-relay-server.ts +5 -1
  316. package/scripts/release-loop/docs-node.ts +258 -43
  317. package/scripts/release-loop/gate-executor.ts +28 -0
  318. package/scripts/release-loop/gate-method.ts +59 -0
  319. package/scripts/release-loop/gate-node.ts +335 -33
  320. package/scripts/release-loop/gate-wall.ts +208 -0
  321. package/scripts/release-loop/known-issues-node.ts +53 -8
  322. package/scripts/release-loop/publish-at.ts +14 -0
  323. package/scripts/release-loop/publish-node.ts +17 -2
  324. package/scripts/release-loop/resume-release.ts +40 -4
  325. package/scripts/release-loop/resume.ts +94 -0
  326. package/scripts/release-loop/shard-plan.ts +3 -11
  327. package/scripts/release-loop/tui-node-checks.ts +22 -0
  328. package/scripts/release-loop/unattended-release.ts +29 -7
  329. package/scripts/rhythm/daily.ts +51 -2
  330. package/scripts/rhythm/weekly.ts +3 -2
  331. package/scripts/tsc-baseline-cache.ts +147 -0
  332. package/scripts/tsc-main-safety-net.ts +189 -0
  333. package/scripts/usage-rollup.ts +64 -8
  334. package/src/acp/codex-plugins.ts +48 -6
  335. package/src/agent/monad-agent-turn.ts +67 -5
  336. package/src/agent/run-context.ts +20 -0
  337. package/src/agent/tool-profile.ts +28 -2
  338. package/src/agent-mission/acp-judge.ts +8 -2
  339. package/src/agent-mission/capabilities-cli.ts +16 -1
  340. package/src/agent-mission/driver.ts +19 -4
  341. package/src/agent-mission/pr-review-watch.ts +6 -2
  342. package/src/agent-mission/resource-ladder.ts +8 -3
  343. package/src/agent-mission/review-loop.ts +41 -7
  344. package/src/agent-substrate/acp-implementer.ts +139 -0
  345. package/src/agent-substrate/acp-reviewer.ts +17 -8
  346. package/src/agent-substrate/pr-reviewer.ts +191 -28
  347. package/src/agent-substrate/review-intent.ts +6 -4
  348. package/src/agent-substrate/self-review-cli.ts +155 -21
  349. package/src/agent-substrate/shard-boundary-intent.ts +92 -26
  350. package/src/ask-user-question/pending-questions.ts +8 -2
  351. package/src/autopilot/build/llm-conflict-merge.ts +216 -12
  352. package/src/autopilot/codebase-grounding.ts +44 -0
  353. package/src/autopilot/llm-control-brain.ts +13 -1
  354. package/src/autopilot/mission-codebase-gate.ts +8 -77
  355. package/src/autopilot/mission-critique.ts +18 -5
  356. package/src/autopilot/mission-feasibility-negotiate.ts +11 -10
  357. package/src/autopilot/mission-trace.ts +12 -1
  358. package/src/autopilot/pr-manager.ts +12 -3
  359. package/src/autopilot/system-lookback-run.ts +16 -10
  360. package/src/bench/bench.ts +183 -0
  361. package/src/boot/acp-server.ts +4 -7
  362. package/src/boot/acp-socket-path.ts +7 -0
  363. package/src/briefing/brief-items.ts +21 -13
  364. package/src/budget/fetchers/grok.ts +15 -5
  365. package/src/budget/llm-cost.ts +37 -5
  366. package/src/budget/types.ts +8 -2
  367. package/src/budget/unified-usage.ts +88 -6
  368. package/src/chat/index.ts +12 -3
  369. package/src/cli/agent-cli.ts +20 -0
  370. package/src/cli/bench-cli.ts +34 -0
  371. package/src/cli/brief-cli.ts +27 -21
  372. package/src/cli/cli-user-error.ts +9 -2
  373. package/src/cli/guardian-cli.ts +26 -1
  374. package/src/cli/image-cli.ts +101 -0
  375. package/src/cli/log-event-names.ts +7 -0
  376. package/src/cli/logs-cli.ts +1 -0
  377. package/src/cli/mcp-login.ts +111 -37
  378. package/src/cli/plugin-cli.ts +21 -1
  379. package/src/cli/pod-cli.ts +26 -0
  380. package/src/cli/pr-cli.ts +90 -5
  381. package/src/cli/pr-land-overlap-evidence.ts +279 -0
  382. package/src/cli/release-cli.ts +63 -12
  383. package/src/cli/rfc-status.ts +52 -2
  384. package/src/cli/self-update.ts +277 -10
  385. package/src/cli/skills-cli.ts +12 -3
  386. package/src/cli/tasks-cli.ts +241 -30
  387. package/src/cli/usage-cli.ts +91 -8
  388. package/src/context-bus/context-first.ts +51 -2
  389. package/src/context-bus/context-now-surfaces.ts +13 -2
  390. package/src/context-bus/long-term-memory.ts +3 -1
  391. package/src/context-bus/nightly-condense.ts +3 -2
  392. package/src/core-turn/run-goal-loop.ts +87 -2
  393. package/src/dashboard/ad-run-setup-bindings.ts +279 -0
  394. package/src/dashboard/chat-fold.ts +20 -0
  395. package/src/dashboard/first-screen-band.ts +151 -1
  396. package/src/dashboard/index.ts +45 -281
  397. package/src/dashboard/slash-runtime/dashboard-handlers.ts +5 -3
  398. package/src/dashboard/stale-install-check.ts +24 -2
  399. package/src/dashboard/turn-stream-formatter.ts +25 -0
  400. package/src/debug/log-diet.ts +190 -0
  401. package/src/debug/log.ts +70 -17
  402. package/src/display/coordinator.ts +25 -2
  403. package/src/domains/coo-admin-tool.ts +27 -0
  404. package/src/domains/cron-match.ts +1 -0
  405. package/src/domains/outbound-alert.ts +17 -6
  406. package/src/domains/release-tool.ts +158 -10
  407. package/src/domains/schedule-registry.ts +10 -7
  408. package/src/domains/schedule-runner.ts +1 -0
  409. package/src/elanous-config-dir.ts +2 -2
  410. package/src/elanous-daemon.ts +3 -3
  411. package/src/error-report/report.ts +21 -4
  412. package/src/execution-loop/launch-gate.ts +1 -1
  413. package/src/expression/i18n/messages.en.ts +5 -0
  414. package/src/expression/i18n/messages.ja.ts +5 -0
  415. package/src/expression/i18n/messages.ko.ts +5 -0
  416. package/src/expression/i18n/messages.zh.ts +5 -0
  417. package/src/expression/i18n/types.ts +8 -0
  418. package/src/github/pr-labels.ts +2 -0
  419. package/src/graph-runner/graph-cli.ts +42 -1
  420. package/src/graph-runner/runner.ts +218 -8
  421. package/src/grok/usage.ts +23 -2
  422. package/src/grounding/ref-index.ts +253 -0
  423. package/src/harness/dispatch-backpressure.ts +267 -0
  424. package/src/harness/harness-clean.ts +199 -78
  425. package/src/harness/harness-cli-command.ts +229 -35
  426. package/src/harness/harness-gc.ts +331 -0
  427. package/src/harness/harness-seams.ts +2 -20
  428. package/src/harness/harness-stop.ts +4 -2
  429. package/src/harness/harness-substrate-default.ts +214 -8
  430. package/src/harness/launch-registry.ts +6 -0
  431. package/src/harness/nested-elanous-policy.ts +4 -2
  432. package/src/harness/worktree-branch-prefix.ts +9 -0
  433. package/src/hq/fence-wrapper.ts +7 -0
  434. package/src/hq/fence.ts +187 -0
  435. package/src/hq/hq.ts +33 -2
  436. package/src/hq/lease.ts +13 -0
  437. package/src/hq/seats.ts +133 -21
  438. package/src/images/image-ledger.ts +179 -0
  439. package/src/index.ts +250 -69
  440. package/src/instance/child-scope.ts +32 -1
  441. package/src/instance/dev-project.ts +133 -0
  442. package/src/instance/resolve.ts +24 -0
  443. package/src/instance/spawn-elanous.ts +45 -0
  444. package/src/intake-plane/collect-github.ts +19 -1
  445. package/src/intake-plane/digest.ts +45 -20
  446. package/src/intake-plane/lens.ts +36 -8
  447. package/src/intake-plane/ref-prefetch.ts +110 -0
  448. package/src/intelligence-map/model-alias.ts +6 -0
  449. package/src/intelligence-map/model-catalog.ts +113 -0
  450. package/src/knowledge/kgs/pack.ts +5 -2
  451. package/src/knowledge/kgs/sqlite-store.ts +15 -0
  452. package/src/knowledge/tools/knowledge-query.ts +20 -2
  453. package/src/knowledge/write.ts +234 -2
  454. package/src/llm/bedrock-eventstream.ts +215 -0
  455. package/src/llm/bedrock-provider.ts +248 -0
  456. package/src/llm/bedrock.ts +491 -0
  457. package/src/llm/openrouter-byok-cost.ts +96 -0
  458. package/src/llm/openrouter-deepseek.ts +151 -0
  459. package/src/llm/openrouter-upstream-pins.config.ts +25 -0
  460. package/src/llm/provider-credentials.ts +3 -1
  461. package/src/llm/zai-coding-plan.ts +700 -0
  462. package/src/llm.ts +383 -41
  463. package/src/loops/budget.ts +150 -0
  464. package/src/loops/checker.ts +148 -9
  465. package/src/loops/orchestrator/resync-shadow.ts +34 -7
  466. package/src/loops/orchestrator/seat-share.ts +6 -49
  467. package/src/loops/orchestrator/traffic.ts +5 -81
  468. package/src/market/signed-index.ts +42 -0
  469. package/src/maturity/feature-maturity.ts +2 -2
  470. package/src/mcp/mcp-oauth.ts +136 -17
  471. package/src/model-tier/llm-tier-map.ts +52 -4
  472. package/src/models/prompts.ts +23 -1
  473. package/src/mss/logging/horizon-watch.ts +168 -0
  474. package/src/mss/logging/log-store.ts +262 -26
  475. package/src/native-tool-catalog.ts +1 -1
  476. package/src/nexus/api/consult-requests.ts +7 -10
  477. package/src/nexus/api/discord-trigger-bot.ts +6 -3
  478. package/src/nexus/api/error-reports.ts +30 -8
  479. package/src/nexus/api/http-server.ts +8 -0
  480. package/src/nexus/api/loop-resources.ts +42 -0
  481. package/src/nexus/api/missions.ts +73 -2
  482. package/src/nexus/api/ops-api.ts +18 -0
  483. package/src/nexus/api/outbound-report.ts +8 -3
  484. package/src/nexus/api/telegram-trigger-bot.ts +6 -3
  485. package/src/nexus/index.ts +17 -75
  486. package/src/nexus/outbound/format.ts +2 -0
  487. package/src/nexus/outbound/router.ts +198 -13
  488. package/src/nexus/tools-kind.ts +78 -0
  489. package/src/oauth/codex-account-rotation.ts +55 -20
  490. package/src/oauth/codex-account-store.ts +451 -23
  491. package/src/oauth/fallback-chain.ts +75 -15
  492. package/src/onboarding/first-run.ts +37 -18
  493. package/src/onboarding/web-first.ts +20 -2
  494. package/src/onboarding.ts +2 -1
  495. package/src/ops/machine-heartbeat.ts +185 -0
  496. package/src/ops/overview-cache.ts +175 -0
  497. package/src/ops/overview.ts +8 -0
  498. package/src/plugins/adapters/claude-package.ts +4 -12
  499. package/src/plugins/core/capability-policy.ts +141 -0
  500. package/src/plugins/core/host.ts +21 -8
  501. package/src/plugins/core/manifest.ts +19 -2
  502. package/src/plugins/core/trust-store.ts +15 -0
  503. package/src/plugins/core/types.ts +12 -0
  504. package/src/plugins/install/market-fetch.ts +68 -16
  505. package/src/plugins/install/plugin-install.ts +187 -16
  506. package/src/plugins/maker/plugin-maker.ts +25 -20
  507. package/src/plugins/maker/wizard-generate.ts +16 -2
  508. package/src/policy/llm-policy.ts +14 -1
  509. package/src/process/pid-liveness.ts +1 -1
  510. package/src/prompt-cache/openai.ts +13 -6
  511. package/src/prompt-cache/openrouter.ts +94 -0
  512. package/src/prompt-cache/types.ts +5 -0
  513. package/src/prompt-enhance/enhance.ts +69 -5
  514. package/src/prompt-library/family-prompt-coverage.ts +1 -0
  515. package/src/prompt-library/universal-preamble.ts +2 -2
  516. package/src/registry/discovery/openrouter-live-resolve.ts +122 -0
  517. package/src/registry/loader.ts +6 -1
  518. package/src/release-loop/checklist.ts +24 -9
  519. package/src/release-loop/feature-store.ts +3 -0
  520. package/src/release-loop/gate-shards.ts +48 -4
  521. package/src/release-loop/landed-to-green.ts +81 -0
  522. package/src/release-loop/light-rc.ts +11 -1
  523. package/src/release-loop/merged-pr-checklist.ts +10 -0
  524. package/src/release-loop/placement.ts +107 -23
  525. package/src/release-loop/rehearsal.ts +317 -0
  526. package/src/release-loop/release-schedule.ts +13 -1
  527. package/src/release-loop/rubric-types.ts +1 -0
  528. package/src/release-loop/rubric.ts +2 -2
  529. package/src/requirements/requirement-ledger.ts +536 -0
  530. package/src/retro/daily.ts +26 -12
  531. package/src/seat-loop/seat-loop.ts +66 -11
  532. package/src/seat-loop/traffic-signal.ts +44 -0
  533. package/src/self-dev/ask-launch-flow.ts +2 -2
  534. package/src/self-dev/dev-cli.ts +109 -11
  535. package/src/self-dev/dev-pipeline.ts +11 -8
  536. package/src/self-dev/draft-residue.ts +475 -0
  537. package/src/self-dev/draft-sweep.ts +254 -10
  538. package/src/self-dev/draft-triage-rules.ts +27 -1
  539. package/src/self-dev/graph-journey-route.ts +6 -0
  540. package/src/self-dev/launch-preflight-text.ts +549 -0
  541. package/src/self-dev/launch-preflight.ts +10 -545
  542. package/src/self-dev/orchestrate-cli.ts +82 -5
  543. package/src/self-dev/orchestrate-summary-line.ts +13 -0
  544. package/src/self-dev/orchestrate.ts +49 -141
  545. package/src/self-dev/review-provider-fallback.ts +115 -19
  546. package/src/self-dev/run-store.ts +1 -3
  547. package/src/self-dev/run-supervisor.ts +190 -36
  548. package/src/self-dev/run-types.ts +191 -0
  549. package/src/self-dev/shard-aggregate.ts +61 -13
  550. package/src/self-dev/shard-plan.ts +5 -1
  551. package/src/self-dev/shard-run.ts +23 -5
  552. package/src/self-dev/supervisor-verdict-edges.ts +3 -4
  553. package/src/self-implement/blocked-draft-policy.ts +3 -19
  554. package/src/self-implement/budget-gate.ts +53 -13
  555. package/src/self-implement/child-context-composition.ts +139 -0
  556. package/src/self-implement/child-llm-preference.ts +13 -5
  557. package/src/self-implement/claude-acp-implement.ts +67 -0
  558. package/src/self-implement/draft-on-stop-mode.ts +18 -0
  559. package/src/self-implement/flex-signals.ts +59 -0
  560. package/src/self-implement/follow-up-goals.ts +114 -38
  561. package/src/self-implement/frozen-merges.ts +8 -3
  562. package/src/self-implement/gate-baseline-reap.ts +157 -0
  563. package/src/self-implement/gate-baseline.ts +78 -16
  564. package/src/self-implement/gate-cli.ts +12 -2
  565. package/src/self-implement/gate-remote.ts +17 -6
  566. package/src/self-implement/goal-author-decompose.ts +10 -2
  567. package/src/self-implement/goal-author.ts +48 -13
  568. package/src/self-implement/goal-digest.ts +19 -0
  569. package/src/self-implement/graph-overlay-condition.ts +32 -0
  570. package/src/self-implement/graph-overlay-yaml.ts +41 -7
  571. package/src/self-implement/graph-templates.ts +33 -1
  572. package/src/self-implement/graph-yaml.ts +56 -0
  573. package/src/self-implement/headless-elanous-driver.ts +11 -9
  574. package/src/self-implement/heal-intake.ts +5 -1
  575. package/src/self-implement/host-regate.ts +120 -29
  576. package/src/self-implement/l8-merge-queue.ts +67 -5
  577. package/src/self-implement/merge-train.ts +131 -0
  578. package/src/self-implement/off-diff-evidence.ts +9 -0
  579. package/src/self-implement/orchestrator.ts +271 -25
  580. package/src/self-implement/review-finding-recurrence.ts +28 -0
  581. package/src/self-implement/rework-policy.ts +2 -1
  582. package/src/self-implement/round-summary-card.ts +63 -0
  583. package/src/self-implement/run-ledger.ts +4 -3
  584. package/src/self-implement/run-step-projection.ts +147 -0
  585. package/src/self-implement/run-stop.ts +1 -1
  586. package/src/self-implement/running-runs.ts +75 -5
  587. package/src/self-implement/seams.ts +83 -4
  588. package/src/self-implement/self-implement-cli.ts +12 -5
  589. package/src/self-implement/stop-autoheal.ts +69 -2
  590. package/src/self-implement/train-gate-remote.ts +158 -0
  591. package/src/session-runtime/index.ts +10 -1
  592. package/src/session-runtime/retry-api.ts +11 -1
  593. package/src/session-runtime/retry-policy.ts +2 -1
  594. package/src/skills/gift-install.ts +119 -0
  595. package/src/skills/runner.ts +59 -2
  596. package/src/skills/skill-feedback.ts +31 -1
  597. package/src/skills/skill-tier.ts +1 -0
  598. package/src/smart-wizard/capability-index.ts +231 -0
  599. package/src/smart-wizard/rung.ts +74 -0
  600. package/src/steward/launch.ts +22 -10
  601. package/src/steward/triage-budget.ts +62 -0
  602. package/src/steward/triage.ts +87 -24
  603. package/src/storage/file-lock.ts +8 -1
  604. package/src/task-agent/actions.ts +66 -5
  605. package/src/task-agent/card-evidence.ts +59 -13
  606. package/src/task-agent/completion-evidence.ts +5 -0
  607. package/src/task-agent/cover.ts +101 -3
  608. package/src/task-agent/judge.ts +20 -3
  609. package/src/task-agent/land-order-ledger.ts +95 -0
  610. package/src/task-agent/land-worktree.ts +201 -0
  611. package/src/task-agent/live-move-history.ts +219 -0
  612. package/src/task-agent/live-moves.ts +451 -34
  613. package/src/task-agent/parent-host.ts +117 -8
  614. package/src/task-agent/rejudge-on-head.ts +352 -0
  615. package/src/task-agent/review-prior-fix.ts +146 -0
  616. package/src/task-agent/review-result-capture.ts +218 -0
  617. package/src/task-agent/run-adopt.ts +136 -0
  618. package/src/task-agent/shadow.ts +154 -14
  619. package/src/task-agent/task-hand.ts +186 -14
  620. package/src/task-orchestrator/surfaces/pod-account-broker.ts +38 -5
  621. package/src/task-orchestrator/surfaces/pod-bedrock-child.ts +74 -0
  622. package/src/task-orchestrator/surfaces/pod-child-default.ts +50 -0
  623. package/src/task-orchestrator/surfaces/pod-child-providers.ts +42 -0
  624. package/src/task-orchestrator/surfaces/pod-command-job.ts +6 -3
  625. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +94 -7
  626. package/src/task-orchestrator/surfaces/pod-image-source.ts +212 -0
  627. package/src/task-orchestrator/surfaces/pod-lease.ts +110 -17
  628. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +32 -3
  629. package/src/task-orchestrator/surfaces/pod-pool.ts +86 -18
  630. package/src/task-orchestrator/surfaces/pod-zai-child.ts +101 -0
  631. package/src/task-orchestrator/surfaces/self-implement-pod.ts +463 -50
  632. package/src/task-orchestrator/surfaces/self-implement.ts +25 -3
  633. package/src/telegram-service.ts +5 -1
  634. package/src/telegram.ts +17 -4
  635. package/src/time/format.ts +13 -4
  636. package/src/tool-runtime/goal-author-runtime.ts +1 -0
  637. package/src/tool-runtime/self-cognition-catalog.ts +23 -0
  638. package/src/tool-runtime/self-cognition-runtimes.ts +2 -24
  639. package/src/typecheck-ratchet.ts +1 -0
  640. package/src/user-config.ts +180 -32
  641. package/src/ux-sim/slash-menu-frames.ts +168 -0
  642. package/src/version/packed-revision.json +1 -1
  643. package/src/web-terminal/preview-tap-registry.ts +5 -2
  644. package/src/workflow-runtime/triggers/registry.ts +59 -0
  645. package/src/workflow-runtime/triggers/scheduler.ts +1 -0
  646. package/src/workflow-runtime/triggers/webhook-source.ts +35 -5
  647. package/apps/pwa/out/_next/static/chunks/1109.78a7a3288c0259d9.js +0 -148
  648. package/apps/pwa/out/_next/static/chunks/115.1c6690b8604f81c4.js +0 -32
  649. package/apps/pwa/out/_next/static/chunks/1262.76a3f08e67c5f816.js +0 -309
  650. package/apps/pwa/out/_next/static/chunks/1307-08b716476f1d50af.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/1358d292.5c87f12cad6eaa91.js +0 -122
  652. package/apps/pwa/out/_next/static/chunks/1438.27a1a7b8f2308004.js +0 -149
  653. package/apps/pwa/out/_next/static/chunks/1442.02d85cd88f4c1eac.js +0 -79
  654. package/apps/pwa/out/_next/static/chunks/1501-1aad662d82ba43f7.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/1584.9e2dd53da6e6d4b1.js +0 -24
  656. package/apps/pwa/out/_next/static/chunks/1586.b989b0614afb77e6.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/1609.2ad355062870151f.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/1612-f6df0fc0eed7157b.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/1826-5d279da64bbbc2de.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/1923.37f1d5fe7ebe3860.js +0 -27
  661. package/apps/pwa/out/_next/static/chunks/195-fb1d7690bf30bab4.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/1986-33e13d648a9df765.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/1993.3fd074a2a246234e.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/211-9c9090c59e2c5907.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/2140.d2daf9ee96e295d1.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/2196-4700653d12a44b40.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/2212.0359851457473efc.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/224.583e562365a52f74.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/2328.0f37465646bafa7d.js +0 -36
  670. package/apps/pwa/out/_next/static/chunks/2372.bf71372184991937.js +0 -286
  671. package/apps/pwa/out/_next/static/chunks/2489-d238d3e2eb5b2bf5.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/2537-6c289376caa88ca1.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/2549-a8515c86f9e8cb96.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/2655.72cc6a97276c5acc.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/2699-325cc923ba7b8631.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/2743-ef6e8c3ced74cce5.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/2840-5458ad50c49cac6a.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/2856.f75d5baef7f49b74.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/311.e685738f92e6e2ec.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/3194-807b212fb8eae065.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/3324-d1d2979821dfa845.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/3344.0de4b0ec5a454b7a.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/335.a13f339e97893437.js +0 -94
  684. package/apps/pwa/out/_next/static/chunks/3394.646348f34b2500be.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/3443.6276909b53d72d53.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/3495.abd4254d808bf2dc.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/3558-bbb5ab553a0471d3.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/3721.ba5b82db0d9a5572.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/3857-5985236d9307f676.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/3916-3d02dd1fc257dd3c.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/3919.9ff7dc25afefee33.js +0 -74
  692. package/apps/pwa/out/_next/static/chunks/3998.bd9a69d9b50e9bd2.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/4003.ab6db1dc266576c9.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/4144-fad095b48a1862ee.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/4216.e8ac94b9fe6b96ab.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/4327.c44dc2b55cb43ee5.js +0 -34
  697. package/apps/pwa/out/_next/static/chunks/4401.94257d497b6d26bc.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/4559.17ca2cdbaa8d414f.js +0 -115
  699. package/apps/pwa/out/_next/static/chunks/4565-3d7e3fdeb43686a8.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/4706.97e734bd4c9816ca.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/4795-f372490b178583fc.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/4982.6e44352f751b9a1b.js +0 -77
  703. package/apps/pwa/out/_next/static/chunks/5342.49c5c5a530e62b50.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/5360-08a80abdf3a4da99.js +0 -1
  705. package/apps/pwa/out/_next/static/chunks/5431.66c58ab1327ee0b7.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/5633-d6852385000738ef.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/5717.bcfcb96e701b82e0.js +0 -90
  708. package/apps/pwa/out/_next/static/chunks/5755-30d102586789bf7f.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/5957.3f1a4012388dd962.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/5977-5b9e8a45a5b0c823.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/602.9bf02ac8e9502598.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/6020.3a1b347e2d2dfacc.js +0 -8
  713. package/apps/pwa/out/_next/static/chunks/6375.fce1d174ba6d0324.js +0 -64
  714. package/apps/pwa/out/_next/static/chunks/6546.92a828aef441271f.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/658.957fdb0a8c6c6c8e.js +0 -287
  716. package/apps/pwa/out/_next/static/chunks/6706.323590aabb8b1293.js +0 -226
  717. package/apps/pwa/out/_next/static/chunks/6747.b67947f293a4c02d.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/6868.000b24a3045c5574.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/6877-74399f69c7da1433.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/6946.bba74e9c96050f30.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/7033.a558f1b2f6912a53.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/7065.46029c26c53eac50.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/7087.6fae577d09249bc1.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/722.de8d9801e0f6d414.js +0 -41
  725. package/apps/pwa/out/_next/static/chunks/726.83532d69452ee24b.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/7290-f09c928a06c52e2d.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/7497.57981e9d7a75a52a.js +0 -24
  728. package/apps/pwa/out/_next/static/chunks/7672.4af122ad892117c7.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/771.6ab889a233e7dae7.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/7797-df5aa0381fdc078f.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/8060-cc008cc6fedfa818.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/8085-d065d0393c1760f5.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/8096.f7da0776cfde6300.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/8401-35e94e9091f5eb8d.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/8682-7061dd4fa7bd62ed.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/8695-846034ce44852c70.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/8769.815ca69879f608b4.js +0 -104
  738. package/apps/pwa/out/_next/static/chunks/8857-aa1cc4ac90af4d40.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/8f835b4f.048eeb02299e3e12.js +0 -1
  740. package/apps/pwa/out/_next/static/chunks/9068.5f2764fccf86c1b2.js +0 -93
  741. package/apps/pwa/out/_next/static/chunks/9103-60fbef33e66f0a46.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/9247-55bcfbb0e8057f59.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/935.4ddaa99fc1d1126c.js +0 -1
  744. package/apps/pwa/out/_next/static/chunks/9451.ebfb0dcc9c02250f.js +0 -23
  745. package/apps/pwa/out/_next/static/chunks/9559.e648369b1d57cf9a.js +0 -62
  746. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c1a96669158471ec.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/app/approvals/page-88459e0903da2803.js +0 -1
  748. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-d85c43f46f58716b.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/app/board/page-4e645600579ae952.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/app/botlab/page-87edbfd19117823b.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/app/bots/page-7f0c2b7801ac6a54.js +0 -1
  752. package/apps/pwa/out/_next/static/chunks/app/ceo/page-bf1f030a9d1adffd.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/app/chat/page-cbaf66b1e1804adf.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/app/control/page-9f5610caaa06178c.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/app/decisions/page-ec8f3575e339de74.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/app/design-check/page-86d753e460f1a989.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/app/editor/page-4166a7d51cf0a57d.js +0 -1
  758. package/apps/pwa/out/_next/static/chunks/app/exec/page-2a19c5cd3b562580.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/app/field/page-b6a09cde2e07521a.js +0 -1
  760. package/apps/pwa/out/_next/static/chunks/app/healthz/route-c1a96669158471ec.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/app/inside/page-f7eae1518ca0c353.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/app/intake/page-456a8573ad811381.js +0 -1
  763. package/apps/pwa/out/_next/static/chunks/app/layout-8462d6a543cbb2d9.js +0 -1
  764. package/apps/pwa/out/_next/static/chunks/app/live/page-2974cdfb87c0f9c9.js +0 -1
  765. package/apps/pwa/out/_next/static/chunks/app/live-run/page-f927ffa25f3c86d1.js +0 -1
  766. package/apps/pwa/out/_next/static/chunks/app/loops/page-abd86cd832aaa011.js +0 -1
  767. package/apps/pwa/out/_next/static/chunks/app/market/page-79daf68f6256adaa.js +0 -1
  768. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8c3f168fc3f91939.js +0 -1
  769. package/apps/pwa/out/_next/static/chunks/app/morning/page-786fb4504d0f2fa9.js +0 -1
  770. package/apps/pwa/out/_next/static/chunks/app/not-found-75209f14597dcb8f.js +0 -1
  771. package/apps/pwa/out/_next/static/chunks/app/observatory/page-bf30affe3a85af7e.js +0 -1
  772. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1187a44b7515434b.js +0 -1
  773. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-3d0910185a66ed54.js +0 -1
  774. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f401ee1dd5a26e25.js +0 -1
  775. package/apps/pwa/out/_next/static/chunks/app/outputs/page-5dfe7604fd842784.js +0 -1
  776. package/apps/pwa/out/_next/static/chunks/app/page-76cf838050a8d681.js +0 -1
  777. package/apps/pwa/out/_next/static/chunks/app/reflection/page-7ec8e289b4c14df6.js +0 -1
  778. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-8c8ac17d52be2a79.js +0 -1
  779. package/apps/pwa/out/_next/static/chunks/app/sessions/page-d359ab048d63a9d9.js +0 -1
  780. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-b8b345c880bf78d1.js +0 -1
  781. package/apps/pwa/out/_next/static/chunks/app/settings/page-f151cc10ad026940.js +0 -1
  782. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-9875f103057da433.js +0 -1
  783. package/apps/pwa/out/_next/static/chunks/app/setup/layout-c1a96669158471ec.js +0 -1
  784. package/apps/pwa/out/_next/static/chunks/app/setup/page-9789328af9a9aa62.js +0 -1
  785. package/apps/pwa/out/_next/static/chunks/app/share/page-bf495a1e284f4e00.js +0 -1
  786. package/apps/pwa/out/_next/static/chunks/app/showroom/page-a263d94bca4be22a.js +0 -1
  787. package/apps/pwa/out/_next/static/chunks/app/tasks/page-3962eab8ec58d16e.js +0 -1
  788. package/apps/pwa/out/_next/static/chunks/app/term/page-9abcfac07e02a542.js +0 -1
  789. package/apps/pwa/out/_next/static/chunks/app/today/page-bee49f927c333abb.js +0 -1
  790. package/apps/pwa/out/_next/static/chunks/app/trace/page-bac2d56dcb02d955.js +0 -1
  791. package/apps/pwa/out/_next/static/chunks/app/vault/page-937cbcc13176295c.js +0 -1
  792. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-d09495594f7f480d.js +0 -1
  793. package/apps/pwa/out/_next/static/chunks/app/workflows/page-69cb93d1a2e57e0e.js +0 -1
  794. package/apps/pwa/out/_next/static/chunks/app/workspace/page-72ec543928d67c3e.js +0 -1
  795. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-82906eeda0186a7b.js +0 -1
  796. package/apps/pwa/out/_next/static/chunks/f6231284-45726550aba08fca.js +0 -1
  797. package/apps/pwa/out/_next/static/chunks/main-59fe95fed40c7a01.js +0 -1
  798. package/apps/pwa/out/_next/static/chunks/main-app-4ca74dbbee7057c6.js +0 -1
  799. package/apps/pwa/out/_next/static/chunks/pages/_app-13a0a886df4d97a1.js +0 -1
  800. package/apps/pwa/out/_next/static/chunks/pages/_error-6af8591cd3a3f038.js +0 -1
  801. package/apps/pwa/out/_next/static/chunks/webpack-f2b4016b9b981bc8.js +0 -1
  802. package/apps/pwa/out/_next/static/css/f2bd5257e6af88d8.css +0 -1
  803. /package/apps/pwa/out/_next/static/{aBi6EyMtLsrl7J8eH4kF7 → Q-7iofoxOEv1WX18S35of}/_ssgManifest.js +0 -0
@@ -244,6 +244,7 @@ export async function mergeMainWithLlmResolve(
244
244
  });
245
245
  const unresolved = (outcome: LlmMergeOutcome & { status: 'conflict-unresolved'; failedFile: string }): LlmMergeOutcome => {
246
246
  debug.log('self-dev.merge', 'conflict-unresolved', { reason: outcome.reason, failedFile: outcome.failedFile, resolvedCount: resolvedFiles.length });
247
+ debug.log('self-dev.merge', 'merge-conflict-resolve', { attempt: 'merge', result: 'unresolved', files: [outcome.failedFile], ...(outcome.reason ? { reason: outcome.reason } : {}) });
247
248
  return measuredOutcome(outcome);
248
249
  };
249
250
  for (const f of files) {
@@ -315,7 +316,12 @@ export async function mergeMainWithLlmResolve(
315
316
  else llmResolved += 1;
316
317
  }
317
318
  const committed = seamOk(git.commit(worktreePath));
318
- if (!committed.ok) { git.abort(worktreePath); return measuredOutcome(errorOutcome('commit', committed.errorDetail, resolvedFiles)); }
319
+ if (!committed.ok) {
320
+ git.abort(worktreePath);
321
+ debug.log('self-dev.merge', 'merge-conflict-resolve', { attempt: 'merge', result: 'unresolved', files: resolvedFiles, reason: 'commit-failed' });
322
+ return measuredOutcome(errorOutcome('commit', committed.errorDetail, resolvedFiles));
323
+ }
324
+ debug.log('self-dev.merge', 'merge-conflict-resolve', { attempt: 'merge', result: 'resolved', files: resolvedFiles });
319
325
  return measuredOutcome({
320
326
  status: llmResolved === 0 && deterministicResolved > 0 ? 'deterministic-resolved' : 'llm-resolved',
321
327
  resolvedFiles,
@@ -393,6 +399,157 @@ export function defaultGitMergeSeam(): MergeGitSeam {
393
399
  };
394
400
  }
395
401
 
402
+ /**
403
+ * MERGE-CONFLICT-AUTO — 큰 파일의 충돌을 «hunk 단위»로 푼다.
404
+ * 🩸 10-10 run-448e450f: `src/llm.ts`(11k+ 줄) 충돌이 전체 파일 프롬프트 상한(`mergeConflictInputMaxChars`)을 넘어
405
+ * `conflict-input-too-large` 로 시도조차 못 하고 사람 넘김(main-sync-blocked)이 됐다.
406
+ * ⇒ 파일 전체 대신 충돌 블록(`<<<<<<< `…`>>>>>>> `)과 앞뒤 문맥만 잘라 LLM 에 주고, 해결된 블록을 원 파일 자리에 다시 꿰맨다.
407
+ * 충돌 밖의 줄은 바이트 그대로다. 해결본은 호출부(`mergeMainWithLlmResolve`)의 마커·시험 선언·크기 붕괴 검사를 그대로 탄다.
408
+ */
409
+ export interface ConflictHunk {
410
+ /** 블록 첫 줄(`<<<<<<< `)의 0-기준 줄 번호. */
411
+ start: number;
412
+ /** 블록 끝 줄(`>>>>>>> `)의 0-기준 줄 번호(포함). */
413
+ end: number;
414
+ }
415
+
416
+ /** 충돌 블록을 찾는다(순수). 짝이 안 맞으면 null — 꿰맬 수 없으니 hunk 경로를 쓰지 않는다. */
417
+ export function findConflictHunks(content: string): ConflictHunk[] | null {
418
+ const lines = content.split('\n');
419
+ const hunks: ConflictHunk[] = [];
420
+ let open = -1;
421
+ let base = false;
422
+ let separator = false;
423
+ for (let i = 0; i < lines.length; i++) {
424
+ const line = lines[i]!;
425
+ if (/^<{7}(?: |\r?$)/.test(line)) {
426
+ if (open !== -1) return null;
427
+ open = i; base = false; separator = false;
428
+ } else if (/^>{7}(?: |\r?$)/.test(line)) {
429
+ // ⛔ 구분자(`=======`) 없는 블록은 꿰맬 수 없는 모양이다 — 종전 출구로.
430
+ if (open === -1 || !separator) return null;
431
+ hunks.push({ start: open, end: i });
432
+ open = -1;
433
+ } else if (open !== -1 && /^\|{7}(?: |\r?$)/.test(line)) {
434
+ // diff3 base 구간은 구분자 «앞»에 한 번만.
435
+ if (base || separator) return null;
436
+ base = true;
437
+ } else if (open !== -1 && /^={7}\r?$/.test(line)) {
438
+ if (separator) return null;
439
+ separator = true;
440
+ }
441
+ }
442
+ return open === -1 ? hunks : null;
443
+ }
444
+
445
+ /** hunk 해결 기본 문맥 줄 수(앞뒤 각각). */
446
+ export const DEFAULT_CONFLICT_HUNK_CONTEXT_LINES = 40;
447
+
448
+ export function conflictHunkResolvePrompt(
449
+ filePath: string, before: string, block: string, after: string, mergeTarget: string, index: number, total: number,
450
+ intent?: ResolverIntent,
451
+ ): string {
452
+ return [
453
+ '너는 git merge 충돌을 지능적으로 해결하는 엔지니어다. 파일이 커서 충돌 블록 «하나»와 그 앞뒤 문맥만 보여 준다.',
454
+ ' <<<<<<< ours = 현재 브랜치(walker 가 이 미션에서 만든 산출물)',
455
+ ' ======= 사이 = 양쪽 버전',
456
+ ` >>>>>>> theirs = ${mergeTarget}(호출자가 해석해 전달한 정합 대상)`,
457
+ '',
458
+ ...resolverIntentLines(intent),
459
+ '해결 원칙:',
460
+ '- 양쪽의 의도를 **모두 보존**하며 종합한다(한쪽을 통째로 버리지 않는다).',
461
+ `- 같은 목적의 중복은 **theirs(${mergeTarget}) 버전을 채택**하고 ours 의 중복은 제거.`,
462
+ '- ours 에만 있는 고유 추가분은 **보존**해 theirs 와 합친다.',
463
+ '- 앞·뒤 문맥은 «참고용»이다 — 출력하지 않는다. 해결본이 그 문맥 사이에 들어가 문법적으로 이어져야 한다.',
464
+ '',
465
+ '⚠️ 충돌 블록(<<<<<<< 부터 >>>>>>> 까지)을 «대체할 줄들만» 출력하라. 충돌 마커 없이, 설명·코드펜스 없이.',
466
+ '',
467
+ `파일: ${filePath} · 충돌 블록 ${index + 1}/${total}`,
468
+ '앞 문맥(출력 금지):',
469
+ '```',
470
+ before,
471
+ '```',
472
+ '충돌 블록(이것을 대체):',
473
+ '```',
474
+ block,
475
+ '```',
476
+ '뒤 문맥(출력 금지):',
477
+ '```',
478
+ after,
479
+ '```',
480
+ ].join('\n');
481
+ }
482
+
483
+ /**
484
+ * 충돌 블록마다 `resolveHunk` 로 대체 줄을 받아 원 파일에 꿰맨다. 블록 하나라도 상한을 넘으면
485
+ * `MergeConflictInputTooLarge` 를 던진다(종전과 같은 사람 넘김). 짝이 안 맞는 마커면 null.
486
+ */
487
+ export async function resolveConflictByHunks(
488
+ filePath: string, conflicted: string, mergeTarget: string, maxChars: number,
489
+ resolveHunk: (prompt: string) => Promise<string>,
490
+ contextLines = DEFAULT_CONFLICT_HUNK_CONTEXT_LINES,
491
+ intent?: ResolverIntent,
492
+ ): Promise<string | null> {
493
+ const hunks = findConflictHunks(conflicted);
494
+ if (hunks === null || hunks.length === 0) return null;
495
+ const lines = conflicted.split('\n');
496
+ // 1차: 블록마다 프롬프트를 «먼저» 다 만든다 — 하나라도 상한을 넘으면 LLM 을 한 번도 안 부르고 종전 출구.
497
+ const prompts: string[] = [];
498
+ for (let k = 0; k < hunks.length; k++) {
499
+ const { start, end } = hunks[k]!;
500
+ const prevEnd = k === 0 ? -1 : hunks[k - 1]!.end;
501
+ const nextStart = k === hunks.length - 1 ? lines.length : hunks[k + 1]!.start;
502
+ const block = lines.slice(start, end + 1).join('\n');
503
+ // 상한 안에 들 때까지 — 의도(ours·theirs·형제 PR)가 문맥보다 먼저다:
504
+ // ① 의도 포함으로 문맥을 반씩 줄여(0 까지) 본다 → ② 그래도 안 들면 의도 없이 같은 순서로.
505
+ // 블록만으로도(문맥 0 · 의도 없음) 넘으면 그때만 종전 출구(too-large).
506
+ const hunkPrompt = (ctx: number, withIntent: ResolverIntent | undefined): string => {
507
+ const before = lines.slice(Math.max(prevEnd + 1, start - ctx), start).join('\n');
508
+ const after = lines.slice(end + 1, Math.min(nextStart, end + 1 + ctx)).join('\n');
509
+ return conflictHunkResolvePrompt(filePath, before, block, after, mergeTarget, k, hunks.length, withIntent);
510
+ };
511
+ let prompt = '';
512
+ for (const withIntent of intent ? [intent, undefined] : [undefined]) {
513
+ for (let ctx = contextLines; ; ctx = Math.floor(ctx / 2)) {
514
+ prompt = hunkPrompt(ctx, withIntent);
515
+ if (prompt.length <= maxChars || ctx === 0) break;
516
+ }
517
+ if (prompt.length <= maxChars) break;
518
+ }
519
+ if (prompt.length > maxChars) throw new MergeConflictInputTooLarge(prompt.length);
520
+ prompts.push(prompt);
521
+ }
522
+ // 2차: 해결하고 꿰맨다.
523
+ const out: string[] = [];
524
+ let cursor = 0;
525
+ for (let k = 0; k < hunks.length; k++) {
526
+ const { start, end } = hunks[k]!;
527
+ const raw = await resolveHunk(prompts[k]!);
528
+ const replacement = raw.replace(/^```[\w.-]*\r?\n?/, '').replace(/\r?\n?```\s*$/, '').replace(/(?:\r?\n)+$/, '');
529
+ // ⛔ 스프레드 대신 줄 단위 — 충돌 밖 구간이 아주 길어도 인자 수 한도에 안 걸린다.
530
+ for (let i = cursor; i < start; i++) out.push(lines[i]!);
531
+ // CRLF 파일이면 해결 줄도 CRLF 로 맞춘다(블록 끝 마커 줄의 줄 끝을 따른다).
532
+ const crlf = lines[end]!.endsWith('\r');
533
+ // ⛔ 해결 줄도 펼침(`push(...x)`) 없이 — 입력 상한은 LLM «출력» 줄 수를 막지 않는다(펼침은 인자 수 한도에서 RangeError).
534
+ if (replacement.length > 0) {
535
+ for (const line of replacement.split('\n')) out.push(crlf ? `${line.replace(/\r$/, '')}\r` : line.replace(/\r$/, ''));
536
+ }
537
+ // ⛔ 파일 끝 블록이 빈 해결본이면 앞 줄의 개행이 사라진다 — 빈 줄 하나로 그 개행을 남긴다(충돌 밖 바이트 불변).
538
+ else if (end === lines.length - 1 && start > 0) out.push('');
539
+ cursor = end + 1;
540
+ }
541
+ for (let i = cursor; i < lines.length; i++) out.push(lines[i]!);
542
+ return out.join('\n');
543
+ }
544
+
545
+ /** `tools.selfImplement.mergeConflictAuto` — 기본 on. `false` 면 큰 파일 hunk 해결을 끄고 종전(사람 넘김) 그대로. */
546
+ export function mergeConflictAutoEnabled(raw: Record<string, unknown> | undefined): boolean {
547
+ const tools = raw?.tools;
548
+ const selfImplement = tools && typeof tools === 'object' ? (tools as Record<string, unknown>).selfImplement : undefined;
549
+ const value = selfImplement && typeof selfImplement === 'object' ? (selfImplement as Record<string, unknown>).mergeConflictAuto : undefined;
550
+ return value !== false;
551
+ }
552
+
396
553
  /** 실 LLM 충돌 해결 어댑터(streamLLM·sol). 코드펜스/설명 제거해 완결 파일만. */
397
554
  export async function defaultLlmResolve(
398
555
  filePath: string, conflicted: string, mergeTarget: string,
@@ -404,10 +561,13 @@ export async function defaultLlmResolve(
404
561
  siblingIntent?: 'on' | 'off';
405
562
  /** Receives each resolver-phase `intent-resolve` decision (carried onto the merge outcome). */
406
563
  onIntentResolve?: (record: IntentResolveRecord) => void;
564
+ /** MERGE-CONFLICT-AUTO seam — overrides `tools.selfImplement.mergeConflictAuto` (default on). */
565
+ mergeConflictAuto?: boolean;
407
566
  } = {},
408
567
  ): Promise<string> {
409
568
  let rawConfig: { mergeConflictInputMaxChars?: unknown; mergeIntent?: unknown; siblingIntent?: unknown } | undefined;
410
- try { rawConfig = getUserConfig().raw.selfImplement as typeof rawConfig; }
569
+ let rawRoot: Record<string, unknown> | undefined;
570
+ try { rawRoot = getUserConfig().raw; rawConfig = rawRoot.selfImplement as typeof rawConfig; }
411
571
  catch { /* unreadable config keeps the old resolver and default input limit */ }
412
572
  const configuredMax = rawConfig?.mergeConflictInputMaxChars;
413
573
  const maxChars = typeof configuredMax === 'number' && Number.isSafeInteger(configuredMax) && configuredMax > 0
@@ -417,13 +577,52 @@ export async function defaultLlmResolve(
417
577
  rawMode = rawConfig?.mergeIntent;
418
578
  }
419
579
  const mode = rawMode === 'shadow' || rawMode === 'on' ? rawMode : 'off';
420
- const resolve = async (intent?: ResolverIntent): Promise<string> => {
421
- const prompt = conflictResolvePrompt(filePath, conflicted, mergeTarget, intent);
422
- if (prompt.length > maxChars) throw new MergeConflictInputTooLarge(prompt.length);
580
+ const conflictModel = process.env.ELANOUS_CONFLICT_MODEL || tierModel('better');
581
+ const ask = async (prompt: string): Promise<string> => {
423
582
  const streamLLM = options.stream ?? (await import('../../llm.js')).streamLLM;
424
- const out = await streamLLM([{ role: 'user', content: prompt }], () => {}, { model: process.env.ELANOUS_CONFLICT_MODEL || tierModel('better'), reasoningEffort: 'medium' });
583
+ const out = await streamLLM([{ role: 'user', content: prompt }], () => {}, { model: conflictModel, reasoningEffort: 'medium' });
425
584
  // ⛔ 라우터는 공급자가 전부 막히면 던지지 않고 오류 문구를 돌려준다 — 그것은 파일 내용이 아니다.
426
585
  if (PROVIDER_FAILURE_TEXT.test(out)) throw new Error(`conflict resolve: LLM provider failure for ${filePath}`);
586
+ return out;
587
+ };
588
+ const resolve = async (intent?: ResolverIntent): Promise<string> => {
589
+ const prompt = conflictResolvePrompt(filePath, conflicted, mergeTarget, intent);
590
+ const autoOn = prompt.length > maxChars && (options.mergeConflictAuto ?? mergeConflictAutoEnabled(rawRoot));
591
+ if (autoOn && intent !== undefined) {
592
+ // 의도 때문에만 상한을 넘으면 의도 없는 전체 파일 프롬프트가 먼저다(hunk 로 가지 않는다).
593
+ const plain = conflictResolvePrompt(filePath, conflicted, mergeTarget);
594
+ if (plain.length <= maxChars) {
595
+ const out = await ask(plain);
596
+ return `${out.replace(/^```[\w.-]*\n?/, '').replace(/\n?```\s*$/, '').trimEnd()}\n`;
597
+ }
598
+ }
599
+ if (prompt.length > maxChars) {
600
+ // MERGE-CONFLICT-AUTO — 전체 파일이 상한을 넘으면 충돌 hunk 와 앞뒤 문맥만 잘라 푼다(노브 off 면 종전 그대로).
601
+ // 노브 off 면 종전 그대로(LLM 호출 0) — 위 의도 없는 전체 파일 재시도도 노브 on 에서만.
602
+ if (!autoOn) throw new MergeConflictInputTooLarge(prompt.length);
603
+ let stitched: string | null;
604
+ try {
605
+ stitched = await resolveConflictByHunks(filePath, conflicted, mergeTarget, maxChars, ask, DEFAULT_CONFLICT_HUNK_CONTEXT_LINES, intent);
606
+ } catch (error) {
607
+ debug.log('self-dev.merge', 'merge-conflict-resolve', {
608
+ attempt: 'hunk', result: 'unresolved', files: [filePath], model: conflictModel, inputChars: prompt.length,
609
+ error: error instanceof MergeConflictInputTooLarge ? 'hunk-input-too-large' : String((error as Error)?.message ?? error).slice(0, 200),
610
+ }, { level: 'warn' });
611
+ throw error instanceof MergeConflictInputTooLarge ? new MergeConflictInputTooLarge(prompt.length) : error;
612
+ }
613
+ if (stitched === null) {
614
+ debug.log('self-dev.merge', 'merge-conflict-resolve', { attempt: 'hunk', result: 'unresolved', files: [filePath], model: conflictModel, inputChars: prompt.length, error: 'hunk-markers-unbalanced' }, { level: 'warn' });
615
+ throw new MergeConflictInputTooLarge(prompt.length);
616
+ }
617
+ const hunks = findConflictHunks(conflicted)?.length ?? 0;
618
+ // ⚠️ `stitched` 는 «꿰맴»까지다 — 최종 판정(마커·시험 선언·크기 붕괴)은 mergeMainWithLlmResolve 의 merge-conflict-resolve(attempt: 'merge').
619
+ debug.log('self-dev.merge', 'merge-conflict-resolve', {
620
+ attempt: 'hunk', result: hasConflictMarkers(stitched) ? 'unresolved' : 'stitched', files: [filePath], model: conflictModel, inputChars: prompt.length, hunks,
621
+ });
622
+ // 끝 개행 상태도 원본 그대로(충돌 밖 줄 바이트 불변).
623
+ return stitched;
624
+ }
625
+ const out = await ask(prompt);
427
626
  return `${out.replace(/^```[\w.-]*\n?/, '').replace(/\n?```\s*$/, '').trimEnd()}\n`;
428
627
  };
429
628
  const collect = () => collectMergeIntent({ worktreePath: options.worktreePath ?? process.cwd(), filePath, mergeTarget, git: options.git ?? defaultIntentGit });
@@ -558,6 +757,16 @@ function siblingIntentLines(siblings: SiblingPrIntent[] | undefined): string[] {
558
757
  ];
559
758
  }
560
759
 
760
+ /** 전체 파일·hunk 프롬프트가 공유하는 의도 줄(ours·theirs·형제 PR). */
761
+ function resolverIntentLines(intent: ResolverIntent | undefined): string[] {
762
+ return intent ? [
763
+ `ours 의 의도: ${intent.ours ?? '(확인 불가)'}`,
764
+ `theirs 에 먼저 착지한 변경: ${intent.theirs.length ? intent.theirs.join(' · ') : '(확인 불가)'}`,
765
+ '',
766
+ ...siblingIntentLines(intent.siblings),
767
+ ] : [];
768
+ }
769
+
561
770
  export function conflictResolvePrompt(filePath: string, conflictedContent: string, mergeTarget: string, intent?: ResolverIntent): string {
562
771
  return [
563
772
  '너는 git merge 충돌을 지능적으로 해결하는 엔지니어다. 아래 파일은 3-way merge 충돌 마커를 포함한다:',
@@ -565,12 +774,7 @@ export function conflictResolvePrompt(filePath: string, conflictedContent: strin
565
774
  ' ======= 사이 = 양쪽 버전',
566
775
  ` >>>>>>> theirs = ${mergeTarget}(호출자가 해석해 전달한 정합 대상)`,
567
776
  '',
568
- ...(intent ? [
569
- `ours 의 의도: ${intent.ours ?? '(확인 불가)'}`,
570
- `theirs 에 먼저 착지한 변경: ${intent.theirs.length ? intent.theirs.join(' · ') : '(확인 불가)'}`,
571
- '',
572
- ...siblingIntentLines(intent.siblings),
573
- ] : []),
777
+ ...resolverIntentLines(intent),
574
778
  '해결 원칙:',
575
779
  '- 양쪽의 의도를 **모두 보존**하며 종합한다(한쪽을 통째로 버리지 않는다).',
576
780
  `- 같은 목적의 중복(예: 같은 테스트·같은 함수)은 **theirs(${mergeTarget}) 버전을 채택**하고 ours 의 중복은 제거.`,
@@ -0,0 +1,44 @@
1
+ import type { HarnessGroundingProvenance } from '../self-implement/context-capsule.js';
2
+
3
+ // ⚠️ `<name>` 은 한 구간이며 디렉터리는 정확히, SKILL.md 파일명만 대소문자를 무시한다.
4
+ const CLAUDE_SKILL_DOCUMENT = /(?:^|\/)\.claude\/skills\/[^/]+\/[Ss][Kk][Ii][Ll][Ll]\.[Mm][Dd]$/;
5
+
6
+ /** The sole path policy for repository implementation candidates. */
7
+ export function isRepositoryImplementationCandidate(path: string): boolean {
8
+ return !CLAUDE_SKILL_DOCUMENT.test(path.replace(/\\/g, '/'));
9
+ }
10
+
11
+ export interface PersistentGroundingEvidenceItem {
12
+ text: string;
13
+ sourceKind?: HarnessGroundingProvenance;
14
+ }
15
+
16
+ export interface DocumentGroundingMatch {
17
+ path: string;
18
+ score: number;
19
+ matchedTerms: string[];
20
+ excerpt: string;
21
+ }
22
+
23
+ export interface CodebaseGrounding {
24
+ grounded: boolean;
25
+ context: string; // 분해 objective 에 fold 할 "기존 관련 코드/문서" 맵
26
+ /** `.claude/skills/<name>/SKILL.md` 만 제외한다. 일반적인 저장소 소스 판별은 아니다. */
27
+ files: string[];
28
+ /** Persistent loop completion-evidence lines, preserved verbatim after Read-path verification. */
29
+ persistentEvidence?: string[];
30
+ /** Positional source associations preserve distinct provenance for duplicate evidence text. */
31
+ persistentEvidenceItems?: readonly PersistentGroundingEvidenceItem[];
32
+ persistentStopReason?: string;
33
+ /** 코드 접지 채널의 상태. 빈 파일 결과의 서로 다른 원인을 구분한다. */
34
+ codeChannel?: 'ok' | 'disabled' | 'failed' | 'incomplete';
35
+ skillFacts: string[];
36
+ codeFacts: string[];
37
+ memoryFacts: string[];
38
+ documentFacts: string[];
39
+ documentMatches?: DocumentGroundingMatch[];
40
+ searchTerms?: string[];
41
+ genericSearchScope?: boolean;
42
+ refFacts: string[];
43
+ ptyFacts: string[];
44
+ }
@@ -13,6 +13,7 @@
13
13
  import type { RunSupervisor, ControlDecision, ControlObservation } from './pty-control-loop.js';
14
14
  import { formatStallContext } from './stall-context.js';
15
15
  import type { LLMMessage } from '../llm.js';
16
+ import type { LLMProviderName, ReasoningLevel } from '../user-config.js';
16
17
  import { debug } from '../debug/log.js';
17
18
  import { emitDecision } from '../live/detail-switch.js';
18
19
  import { MAX_PTY_KEY_REPEAT } from '../pty-shell/pty-mouse.js';
@@ -30,6 +31,9 @@ export interface LlmControlBrainOpts {
30
31
  /** LLM 스트림(미주입 시 실제 streamLLM lazy-import). */
31
32
  readonly stream?: StreamLLMFn;
32
33
  readonly model?: string;
34
+ readonly provider?: LLMProviderName;
35
+ /** Per-brain tier reasoning; applied to provider construction without changing global config. */
36
+ readonly reasoningLevel?: ReasoningLevel;
33
37
  readonly maxTokens?: number;
34
38
  readonly temperature?: number;
35
39
  /** 스텝당 LLM 호출 상한(ms). 초과 시 wait(fail-soft) — provider 멈춰도 루프의 stuck/budget/
@@ -134,7 +138,15 @@ export function createLlmControlBrain(opts: LlmControlBrainOpts): RunSupervisor
134
138
  };
135
139
  // lazy — 테스트가 stream 주입 시 llm.js 로드 안 함.
136
140
  const stream: StreamLLMFn = opts.stream
137
- ?? (async (m, cb, o) => (await import('../llm.js')).streamLLM(m, cb, o ?? {}));
141
+ ?? (async (m, cb, o) => {
142
+ const llm = await import('../llm.js');
143
+ const config = opts.provider ? (await import('../user-config.js')).getUserConfig() : undefined;
144
+ const provider = config && opts.provider
145
+ ? llm.getProviderForConfig({ ...config, llm: { ...config.llm, provider: opts.provider, model: opts.model ?? config.llm.model,
146
+ ...(opts.reasoningLevel ? { reasoningLevel: opts.reasoningLevel, codexReasoning: undefined } : {}) } }, opts.model)
147
+ : undefined;
148
+ return llm.streamLLM(m, cb, { ...o, ...(provider ? { initialProvider: provider } : {}) });
149
+ });
138
150
 
139
151
  return {
140
152
  async decide(obs: ControlObservation, externalSignal?: AbortSignal): Promise<ControlDecision> {
@@ -16,7 +16,12 @@ import { searchMemories } from '../memory.js';
16
16
  import { debug } from '../debug/log.js';
17
17
  import { localRefGroundingDigest } from '../agent/ref-grounding.js';
18
18
  import { listContextCapsules } from '../self-implement/context-capsule-store.js';
19
- import type { HarnessContextCapsule, HarnessGroundingProvenance } from '../self-implement/context-capsule.js';
19
+ import type { HarnessContextCapsule } from '../self-implement/context-capsule.js';
20
+ import { isRepositoryImplementationCandidate, type DocumentGroundingMatch } from './codebase-grounding.js';
21
+ import { registerGoalAuthorGroundMission } from '../self-implement/goal-author.js';
22
+ export { isRepositoryImplementationCandidate } from './codebase-grounding.js';
23
+ export type CodebaseGrounding = import('./codebase-grounding.js').CodebaseGrounding;
24
+ export type { DocumentGroundingMatch, PersistentGroundingEvidenceItem } from './codebase-grounding.js';
20
25
  import { groundPersistently, type PersistentGroundingDeps } from '../skills/tools/persistent-grounding.js';
21
26
  import type { LLMUsage } from '../prompt-cache/types.js';
22
27
  import { llmUsageCostFields } from '../budget/llm-cost.js';
@@ -38,75 +43,6 @@ function logLlmUsage(site: 'codebase-gate-injected' | 'codebase-gate-dynamic', m
38
43
  } catch { /* usage observation must not change grounding */ }
39
44
  }
40
45
 
41
- // ⚠️ `<name>` 은 **한 구간**이다(리뷰 should-fix) — `.+` 는 중첩 경로까지 삼켜 정책 설명과 어긋난다.
42
- // ⛔ **대소문자를 가리지 않는다**(2026-07-30 실측) — 실물로 `~/.claude/skills/project-onboarding/skill.md`
43
- // (전부 소문자)가 존재하고, 종전 정규식은 그것을 **구현 후보로 실었다**. macOS 기본 FS 는
44
- // case-insensitive 라 같은 스킬이 어느 표기로도 존재할 수 있다.
45
- // ⊕ 같은 형태의 우회로를 `[S·round6]` 가 자기 가드(`.MD`)에서 먼저 찾았다 — 같은 관례가 둘을 속였다.
46
- // ⛔ `/i` 를 **전체에 걸지 않는다**(리뷰 must-fix) — 그러면 `.CLAUDE/SKILLS/...` 까지 제외해
47
- // "정책 범위는 `.claude/skills/<name>/SKILL.md` 한 구간" 이라는 내 경계를 내가 넓힌다.
48
- // **디렉터리는 정확히**, **파일명만** 대소문자를 무시한다.
49
- const CLAUDE_SKILL_DOCUMENT = /(?:^|\/)\.claude\/skills\/[^/]+\/[Ss][Kk][Ii][Ll][Ll]\.[Mm][Dd]$/;
50
-
51
- /** The sole path policy for repository implementation candidates. */
52
- export function isRepositoryImplementationCandidate(path: string): boolean {
53
- return !CLAUDE_SKILL_DOCUMENT.test(path.replace(/\\/g, '/'));
54
- }
55
-
56
- export interface PersistentGroundingEvidenceItem {
57
- text: string;
58
- sourceKind?: HarnessGroundingProvenance;
59
- }
60
-
61
- export interface CodebaseGrounding {
62
- grounded: boolean;
63
- context: string; // 분해 objective 에 fold 할 "기존 관련 코드/문서" 맵
64
- /** ⚠️ 이 판별은 **`.claude/skills/<name>/SKILL.md` 만** 제외한다 — "저장소 소스만" 을
65
- * 일반적으로 가려내지 않는다(리뷰 should-fix: 과장 금지). 실측으로 확인된 오분류가 그것뿐이라
66
- * 안 잰 것을 규칙으로 만들지 않았다. */
67
- files: string[];
68
- /** Persistent loop completion-evidence lines, preserved verbatim after Read-path verification. */
69
- persistentEvidence?: string[];
70
- /**
71
- * Per-item source associations for persistent evidence. Association is positional rather
72
- * than text-keyed so duplicate evidence text can retain distinct provenance.
73
- */
74
- persistentEvidenceItems?: readonly PersistentGroundingEvidenceItem[];
75
- /** Persistent grounding loop's observed stop reason, including no-candidate outcomes. */
76
- persistentStopReason?: string;
77
- /** 코드 접지 «채널»의 상태 — ⛔ `files: []` 의 세 뜻을 가른다(2026-08-11 72차 실측).
78
- * `ok` 채널이 돌았다(결과가 0이어도 «찾아본» 것이다) · `disabled` 호출자가 껐다 ·
79
- * `failed` 채널이 «실패»했다(제공자 오류 등 — 그 0 은 「없다」가 «아니다») ·
80
- * `incomplete` 채널이 «돌긴 했는데 목표를 못 끝냈다»(`stopReason !== goal_complete`) —
81
- * 그때 후보는 «일부러» 비운다(검증 안 된 것을 파일로 주장하지 않는다). 📏 72차 전수 400건에서
82
- * 후보 0인 finished 5건이 «전부» `end_turn` 이었다 ⇒ 「성공인데 0」은 «없는 수수께끼»였다.
83
- * ⛔ 이 값이 없던 동안, 제공자 과부하로 난 `files: []` 가 「ask 에 앵커가 없다」로 사람에게 보고됐고
84
- * 두 트랙이 그 문면을 믿고 ask 를 여러 번 다시 썼다(상관 17/17). */
85
- codeChannel?: 'ok' | 'disabled' | 'failed' | 'incomplete';
86
- /** ★ L3 — 탐색이 찾은 skill 계약 팩트(`[skill:name] <계약>`). 경로가 아니라 내용이라 build seed→PLAN.md
87
- * 로 실려 구현 에이전트가 Read 없이도 계약 보유. 없으면 []. */
88
- skillFacts: string[];
89
- /** ★ L4 — grounded 코드 파일의 export 심볼 팩트(`[code:file] sym1, sym2`). decompose 가 코드 재사용을
90
- * 추측/환각(예: 없는 "URL helper")하지 않게 **실제 export 심볼**을 실어 나른다. 없으면 []. */
91
- codeFacts: string[];
92
- /** ★ P2 — 검색공간 3박자 확장(기억·자기이력·문서벡터) 팩트(`[memory:type]`/`[self:kind]`/`[doc]`). ⚠️ 참조
93
- * 컨텍스트(사실 배경)로만 쓰고 files/reusables(파일 실존 주장)에 넣지 않는다(mirage 가드). 없으면 []. */
94
- memoryFacts: string[];
95
- /** 저장소 `docs/` 검색 후보. 문서 근거를 보존하되 고칠 구현 파일 `files`에는 승격하지 않는다. */
96
- documentFacts: string[];
97
- /** 문서 검색의 실제 랭킹 근거. 저작기는 이 메타데이터로만 scope boundary를 선별한다. */
98
- documentMatches?: DocumentGroundingMatch[];
99
- /** 문서·코드 검색에 실제 사용한 확장 term. 저작기가 문서 후보의 관련도와 근거를 설명할 때만 쓴다. */
100
- searchTerms?: string[];
101
- /** ask에 저장소 고유명사/식별자가 없어 일반 검색어만 사용했음을 나타낸다. 빈 결과는 부재가 아니라 검색 범위의 미지다. */
102
- genericSearchScope?: boolean;
103
- /** 로컬 reference repository 팩트(`[ref:name] /absolute/path`). 참조 컨텍스트로만 쓰며 repo files 로 주장하지 않는다. */
104
- refFacts: string[];
105
- /** ★ F2(2026-07-25) — 상류 PTY 잡 capsule 팩트(`[pty:<id>] <objective> — 완료기준…`). 검색-코퍼스로 관련
106
- * 상류 산출을 grounding 에 편입(dependsOn 없이·§11 컨텍스트 교환). 참조 컨텍스트로만(files 승격 아님). 없으면 []. */
107
- ptyFacts: string[];
108
- }
109
-
110
46
  /** 구현·변경·분석형 골 판정 — 기존 자산을 다루는 미션(순수 단발 조회 제외). 순수함수(테스트). */
111
47
  export function isImplementationGoal(goal: string): boolean {
112
48
  const g = goal.toLowerCase();
@@ -229,13 +165,6 @@ export function hasRepositorySpecificIdentifier(goal: string, identifiers: reado
229
165
  });
230
166
  }
231
167
 
232
- export interface DocumentGroundingMatch {
233
- path: string;
234
- score: number;
235
- matchedTerms: string[];
236
- excerpt: string;
237
- }
238
-
239
168
  /** git grep 으로 키워드 매칭 구현 파일(src·scripts) 상위 N. 랭킹은 **distinct term coverage**
240
169
  * (서로 다른 키워드가 겹치는 파일 = 진짜 관련)가 핵심 — 흔한 단어(session 등) 하나만 걸린
241
170
  * 무관 파일을 밀어낸다. + 파일명 히트 + 내용 히트 + src(구현코드) 우선. 저장소 문서는
@@ -769,3 +698,5 @@ export async function groundMissionInCodebase(
769
698
  observeTiming();
770
699
  }
771
700
  }
701
+
702
+ registerGoalAuthorGroundMission(groundMissionInCodebase);
@@ -106,12 +106,25 @@ export function buildCritiquePrompt(input: { planBody: string; changedFiles: str
106
106
  ].join('\n');
107
107
  }
108
108
 
109
- /** LLM 응답 파싱 → verdict + findings. 순수함수(LLM node 규칙). */
109
+ /** 판정 줄 — «줄 머리» VERDICT 만 판정으로 읽는다(본문 중간 인용·설명 속 «VERDICT:» 오인 방지).
110
+ * 들여쓰기는 허용(mission-engine 의 미션 판정 파서와 같은 앵커). */
111
+ const CRITIQUE_VERDICT_LINE = /^[ \t]*VERDICT:\s*(PASS|WARN|FAIL)/im;
112
+ /** 판정 줄이 없을 때 findings 에 남기는 fail-closed 사유(REVIEW-NO-VERDICT-FAILCLOSED #25937). */
113
+ const NO_VERDICT_FINDING = '비평 판정 줄(VERDICT) 없음 — 판정 없음은 통과가 아니다(fail-closed · REVIEW-NO-VERDICT-FAILCLOSED #25937)';
114
+ const MAX_CRITIQUE_FINDINGS = 4;
115
+
116
+ /** LLM 응답 파싱 → verdict + findings. 순수함수(LLM node 규칙).
117
+ * ⛔ 판정 줄이 «없으면» pass 로 기본하지 않는다(칸 MISSION-CRITIQUE-FAILCLOSED · #25937):
118
+ * «판정 없음 = 통과 아님» ⇒ verdict 'warn' + 사유 finding.
119
+ * 'fail' 이 아니라 'warn' 인 이유 — 소비측(nocturnal-runner)은 critique verdict==='fail' 에
120
+ * gate-failed(재구현 요구)를 건다. «비평가 응답의 형식 결함»을 «구현 훼손」으로
121
+ * 오귀속시키는 것이다. 'warn' 은 PR 본문(renderCritique)·자율 원장에 그대로 표시되어 사람(HITL)이 판단한다.
122
+ * (post-PR 리뷰 축 parseReviewResult 는 substrate 가 `reviewed:false` 로 같은 fail-closed 를 이미 한다.) */
110
123
  export function parseLLMCritique(text: string): { verdict: CritiqueResult['verdict']; findings: string[] } {
111
- const vm = /VERDICT:\s*(PASS|WARN|FAIL)/i.exec(text);
112
- const verdict = (vm ? vm[1]!.toLowerCase() : 'pass') as CritiqueResult['verdict'];
113
- const findings = text.split('\n').map((l) => l.trim()).filter((l) => l.startsWith('- ')).map((l) => l.slice(2).trim()).slice(0, 4);
114
- return { verdict, findings };
124
+ const bullets = text.split('\n').map((l) => l.trim()).filter((l) => l.startsWith('- ')).map((l) => l.slice(2).trim());
125
+ const vm = CRITIQUE_VERDICT_LINE.exec(text);
126
+ if (!vm) return { verdict: 'warn', findings: [NO_VERDICT_FINDING, ...bullets].slice(0, MAX_CRITIQUE_FINDINGS) };
127
+ return { verdict: vm[1]!.toLowerCase() as CritiqueResult['verdict'], findings: bullets.slice(0, MAX_CRITIQUE_FINDINGS) };
115
128
  }
116
129
 
117
130
  /** ★ R1 결정론 + LLM 비평(대표 2026-07-12) — 결정론(R0) 먼저, llmReview 주입 시 LLM 심층 비평
@@ -11,7 +11,7 @@
11
11
  // 2 예산(§8-5·config-first): maxStalls(언제 협상) · maxReplans(언제 partial 포기). a6230f 실측 튜닝.
12
12
  // 제1원칙: 협상 제안을 debug.log('mission.negotiate')로 관측.
13
13
 
14
- import { getUserConfig } from '../user-config.js';
14
+ import { getUserConfig, resolveRoleLlm } from '../user-config.js';
15
15
  import { debug } from '../debug/log.js';
16
16
 
17
17
  export interface FeasibilityBudget {
@@ -104,16 +104,17 @@ function buildNegotiatePrompt(input: NegotiateInput, overBudget: boolean): strin
104
104
  ].filter(Boolean).join('\n');
105
105
  }
106
106
 
107
- async function defaultJudge(prompt: string): Promise<string> {
108
- // ★ 모델 기반 provider 라우팅(2026-07-14) — 협상은 강한 추론이 핵심이라 기본 opus 4.8(대표 셋업).
109
- // getProvider(model)로 모델 계열 라우팅(claude-* → anthropic·env/config 키)해 활성 provider(codex 등)
110
- // 무관하게 지목 모델이 닿는다. resolveDefaultProvider(활성 반환)면 opus 를 codex 로 보내 400→fail-soft.
111
- // env(ELANOUS_NEGOTIATE_MODEL·ELANOUS_DECOMPOSE_MODEL)로 override 가능.
112
- const { streamLLM, getProvider } = await import('../llm.js');
113
- const model = process.env.ELANOUS_NEGOTIATE_MODEL || process.env.ELANOUS_DECOMPOSE_MODEL || 'claude-opus-4-8';
114
- const provider = getProvider(model);
107
+ export async function defaultJudge(prompt: string): Promise<string> {
108
+ const { streamLLM, getProvider, PROVIDERS } = await import('../llm.js');
109
+ const override = process.env.ELANOUS_NEGOTIATE_MODEL || process.env.ELANOUS_DECOMPOSE_MODEL;
110
+ const resolved = override ? undefined : resolveRoleLlm('planning');
111
+ const model = override || resolved!.model;
112
+ const provider = override ? getProvider(model) : PROVIDERS[resolved!.provider];
113
+ const providerName = override ? provider.name : resolved!.provider;
114
+ if (!provider) throw new Error(`Unknown planning provider: ${providerName}`);
115
+ debug.log('llm.role-pin', 'resolved', { site: 'feasibility-negotiate', role: 'planning', model, provider: providerName, source: override ? 'env' : resolved!.source });
115
116
  return streamLLM([{ role: 'user', content: prompt }], () => {}, {
116
- model, reasoningEffort: 'medium', ...(provider ? { provider } : {}),
117
+ model, provider, usageRole: 'planning', reasoningEffort: 'medium',
117
118
  });
118
119
  }
119
120
 
@@ -91,6 +91,17 @@ export function rollupDerived(derived: DerivedJob[]): MissionRollup {
91
91
 
92
92
  export interface TracePaths { schedulesDb?: string; tasksDb?: string; surfaceEventsDb?: string }
93
93
 
94
+ /** 크론 행 목록 → 파생물(순수 · 행→DerivedJob 매핑의 «단일 소유»).
95
+ * ⛔ 목록 화면(`/v1/missions` 카드)도 이 함수를 쓴다 — 크론 매핑을 두 번
96
+ * 쓰면 「트레이스는 stale 인데 카드는 ok」 갈림이 생긴다.
97
+ * `staleIds` 는 `scheduleHealth(rows).stale` 로 «한 번» 구해 넣는다. */
98
+ export function cronRowsToDerived(
99
+ rows: readonly ScheduleRow[],
100
+ staleIds: ReadonlySet<string>,
101
+ ): DerivedJob[] {
102
+ return rows.map(r => cronToDerived(r, staleIds.has(r.id)));
103
+ }
104
+
94
105
  /** 크론 파생물 — schedule_registry.autopilot_id = apmId + scheduleHealth 상태. */
95
106
  function fetchCronDerived(apmId: string, schedulesDb?: string): DerivedJob[] {
96
107
  try {
@@ -98,7 +109,7 @@ function fetchCronDerived(apmId: string, schedulesDb?: string): DerivedJob[] {
98
109
  try {
99
110
  const rows = listSchedules(db);
100
111
  const staleIds = new Set(scheduleHealth(rows).stale.map(s => s.id));
101
- return rows.filter(r => r.autopilot_id === apmId).map(r => cronToDerived(r, staleIds.has(r.id)));
112
+ return cronRowsToDerived(rows.filter(r => r.autopilot_id === apmId), staleIds);
102
113
  } finally { db.close(); }
103
114
  } catch { return []; }
104
115
  }
@@ -209,8 +209,16 @@ export function resolveDeliverableBase(
209
209
  explicit?: string,
210
210
  ): string | undefined {
211
211
  const e = explicit?.trim();
212
- if (e) return e;
213
212
  const opts = { cwd };
213
+ if (e) {
214
+ if (e.startsWith('origin/') || run('git', ['-C', cwd, 'rev-parse', '--verify', '--quiet', e], opts).ok) return e;
215
+ const resolved = `origin/${e}`;
216
+ if (run('git', ['-C', cwd, 'rev-parse', '--verify', '--quiet', resolved], opts).ok) {
217
+ debug.log('autopilot.pr-manager', 'base-resolved-remote', { explicit: e, resolved });
218
+ return resolved;
219
+ }
220
+ return e;
221
+ }
214
222
  const head = run('git', ['-C', cwd, 'rev-parse', '--abbrev-ref', 'origin/HEAD'], opts);
215
223
  const headRef = head.ok ? head.out.trim() : '';
216
224
  // `origin/HEAD` 미설정 리포는 "origin/HEAD" 를 그대로 되돌려주기도 한다 → 해소 실패로 취급.
@@ -359,8 +367,9 @@ export function makePrManager(runner: CmdRunner = defaultCmdRunner): PrManager {
359
367
  // (node_modules·apps/pwa/out 심링크)를 이미 자동 skip 하는데, `:(exclude)<ignored>` 로 명시 지목하면
360
368
  // git 이 "paths ignored by .gitignore … use -f" 로 exit 1 을 뱉는다(staging 은 성공하지만 exit≠0).
361
369
  // 그간 이게 add 실패로 오판돼 makePr null→pr-failed→budget 오힐 교착. gitignore 안 된 것만 exclude.
362
- // ★ 최초 base 해석을 일반 경로의 판정과 PR 생성에 그대로 공유한다. self-base 인수 발사만
363
- // `branch..HEAD`의 구조적 0을 피하려 upstream 비교 ref와 기본 PR base를 추가 해석한다.
370
+ // ★ 최초 base 해석을 일반 경로의 판정과 PR 생성에 그대로 공유한다. 명시 base가 원격 추적으로만
371
+ // 존재하면 여기서 해석한 ref로 rev-list·diff를 비교하고 PR 생성에는 브랜치명만 전달한다.
372
+ // self-base 인수 발사만 `branch..HEAD`의 구조적 0을 피하려 upstream 비교 ref와 기본 PR base를 추가 해석한다.
364
373
  const resolvedBase = resolveDeliverableBase(run, cwd, input.base);
365
374
  const selfBase = Boolean(resolvedBase && isBranchSelfRef(resolvedBase, input.branch));
366
375
  let comparisonBase = resolvedBase;