elanous 0.2.22 → 0.2.23

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 (705) 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/chunks/{119fc678.6f591cdb84ca5791.js → 0673cc54.8e2ef1c23e49e190.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/{a9f2b54d-40c16bd0efdb04b8.js → 0a09e062-34f747a17d8d8c2e.js} +1 -1
  7. package/apps/pwa/out/_next/static/chunks/{f8626309.a4e5d362b1d55e59.js → 0e3acd34.d42b2ef87fdf4234.js} +1 -1
  8. package/apps/pwa/out/_next/static/chunks/1168.a0fb3d9db76c00bd.js +77 -0
  9. package/apps/pwa/out/_next/static/chunks/{7175-350f4ce2873bc038.js → 1325-dc3f3c21eb181cb4.js} +1 -1
  10. package/apps/pwa/out/_next/static/chunks/1357.a843c41d2cd7ec31.js +34 -0
  11. package/apps/pwa/out/_next/static/chunks/1430.53f49882b17607c2.js +24 -0
  12. package/apps/pwa/out/_next/static/chunks/1459-be6509b3419d8a9f.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/{6767.8e6c5f6e744fcd9f.js → 1505.5826671109111e75.js} +2 -2
  14. package/apps/pwa/out/_next/static/chunks/153.0a4e3cd516930491.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1572.7bc291352e241a45.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/1593-d07ad068c120dfb0.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/1608.b7c900baa56cab32.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/1615-4d8156febaac4b35.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/1646.e03f0fbc26bc72f6.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/{7327-2d69fb321ba73389.js → 1669-da843ed73aa301f5.js} +1 -1
  21. package/apps/pwa/out/_next/static/chunks/176.13ba0659e3e96fd4.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/1990.9c60f495ef33c070.js +36 -0
  23. package/apps/pwa/out/_next/static/chunks/2042e469.f86158dd5c1e51a1.js +122 -0
  24. package/apps/pwa/out/_next/static/chunks/2528.0af5c0e1fad88df6.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2543-28ec6aeb80a5e1e1.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2561.43c99d6ee914ee6a.js +62 -0
  27. package/apps/pwa/out/_next/static/chunks/2638.b39ab2f674caa1a5.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/272-b23d2e92161d11fd.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/{7899.597af4a9996c907f.js → 2721.bc9a8f36bd85c07a.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/2778.67e0c1d484189ccf.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/2841.10ff309f6a3168af.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/2886-9639f97d523d752a.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/2978.57fb87ce21cc5a85.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/3664.15f968c39d15bd28.js +149 -0
  35. package/apps/pwa/out/_next/static/chunks/3786-935eb3fcde90e496.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3813.df4a01ae89c6f63f.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3961-fbef064c213b2b18.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3992.f79c70480e8c4077.js +309 -0
  39. package/apps/pwa/out/_next/static/chunks/40-413e8641de9ed1e5.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/4054-521f11a503daed64.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/4315.e7356f34c7d8ec79.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/4489-bf629de6f04f7681.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/4540.557733cc88c6a82b.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/462.0275b4338c5b6337.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/4658-7ed9266098a787e4.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/4945-0f4046cfc3228ea3.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/{d70879db.c66c56a95a91efc6.js → 4c5e95ce.83e9b16add6fcd8c.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/5105-18b4165c5d3a86b0.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/5205-6992210fe31f45f4.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/5287-72898b126d722457.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/{6158.566c890adc06a459.js → 5313.1697309c532b9856.js} +2 -2
  52. package/apps/pwa/out/_next/static/chunks/{79b78388.663188133449d707.js → 53746282.1be36038d1abd949.js} +1 -1
  53. package/apps/pwa/out/_next/static/chunks/5474.991b90688c3cb321.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/5544-871146192d095594.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5578.ac963634373b28c6.js +286 -0
  56. package/apps/pwa/out/_next/static/chunks/5935.d5e8ca3e096772e8.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/5967-c0a80f8ffe5d4050.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/{1268.0840ff91e083fcbd.js → 5974.360f8441eb0ac1ec.js} +1 -1
  59. package/apps/pwa/out/_next/static/chunks/6006.84e8b418a7a0db97.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/6013-1267ba7454d6764b.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/6038-1e0f7ee1086da4cf.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/617.709dd0019fe99796.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/6261.fb9bf94947094636.js +74 -0
  64. package/apps/pwa/out/_next/static/chunks/6411.1966866fae31ffa9.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/6481-b829d99aa8d158f5.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/6541.2b7daa043100d0fa.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/6571-926ddf024a6ad5df.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/6597.2d7a6d77ab485b27.js +64 -0
  69. package/apps/pwa/out/_next/static/chunks/67.5dd2dc543c2fa3de.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/{9832.2ab2e818013574c7.js → 6702.ebbd165d5e4a4a14.js} +1 -1
  71. package/apps/pwa/out/_next/static/chunks/6777-312496b0d774719b.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/681.0116f7036cfb4e8d.js +32 -0
  73. package/apps/pwa/out/_next/static/chunks/6871.30b2bf23b3126e36.js +24 -0
  74. package/apps/pwa/out/_next/static/chunks/6882.737d366d54e29d83.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/7035.54c2c535164b1c9b.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/7086-8bfa7e8f796a03d9.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/7126.5e5599f251726b67.js +93 -0
  78. package/apps/pwa/out/_next/static/chunks/7203-47ff0740a293e284.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/7268.017f49dafb5f0ff3.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/7355.5d65a87e9567ae08.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/7392.4018c2a62177f296.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/{6110.1297d4093fdfbb0d.js → 740.90b31555290236a9.js} +2 -2
  83. package/apps/pwa/out/_next/static/chunks/7471.3a3d1be50559cfb8.js +148 -0
  84. package/apps/pwa/out/_next/static/chunks/7500.73489a345cef2201.js +226 -0
  85. package/apps/pwa/out/_next/static/chunks/{9070.067c106528ec1ae6.js → 7518.49161e8f5814abdb.js} +1 -1
  86. package/apps/pwa/out/_next/static/chunks/7565.c2f72a15c1ed0396.js +27 -0
  87. package/apps/pwa/out/_next/static/chunks/7651.6d1c984d3d8587a4.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/7713.7ab863ed59b2d661.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7793.d7cd2026767ddd54.js +115 -0
  90. package/apps/pwa/out/_next/static/chunks/7837.c7c267e5dceadb11.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7891.09266382daf70d1c.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7905.b230b9d06cb4ad5d.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7990-cbf6a01bcbdcb7e6.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/8119-819c549e0c197786.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/8186-74ea19a3700d04a8.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/{8194.484f51e273d9abd2.js → 8264.00e434fbd02e9311.js} +16 -16
  97. package/apps/pwa/out/_next/static/chunks/8267-e7b3262b735ae106.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/8386.86518e55b75f7cf5.js +8 -0
  99. package/apps/pwa/out/_next/static/chunks/{088d8e8a.8069543d082bec12.js → 83cfc5c8.349535543c1548b6.js} +1 -1
  100. package/apps/pwa/out/_next/static/chunks/8437.ba6eeeb29590042f.js +23 -0
  101. package/apps/pwa/out/_next/static/chunks/{1948.5f35b39eef222a94.js → 8438.ee7f0df3b3f6fcb4.js} +1 -1
  102. package/apps/pwa/out/_next/static/chunks/8469-1500be57e582296f.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8483-7164cecdaf178ca6.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/{4588.ad3364cb7fb97ada.js → 8532.a86e99acf9b761cb.js} +2 -2
  105. package/apps/pwa/out/_next/static/chunks/8569.b853a8daa8f31d12.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8722-4c940f02c496ad36.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/887-41d0dcf5af48c628.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8925-2abfb48af477fb7f.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/{88729267.9c6c000157c83f2f.js → 89849432.9eaa2f4c9c010965.js} +3 -3
  110. package/apps/pwa/out/_next/static/chunks/9039.da86361496797522.js +90 -0
  111. package/apps/pwa/out/_next/static/chunks/905.d5745a25884754d4.js +94 -0
  112. package/apps/pwa/out/_next/static/chunks/9089-d909f3d4478b0628.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9096.dc5c7a267f83790c.js +41 -0
  114. package/apps/pwa/out/_next/static/chunks/93.a567257b6bdb7fe4.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9320.419acb9665b46597.js +287 -0
  116. package/apps/pwa/out/_next/static/chunks/9356.b8ceda6634612ff8.js +79 -0
  117. package/apps/pwa/out/_next/static/chunks/94.e9e1043b35cd3eed.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9400-7498ea90b2e6ee8f.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/{3522-1de1319d028ac89c.js → 9502-32c5dc22e8f120f5.js} +3 -3
  120. package/apps/pwa/out/_next/static/chunks/9930-58644af9c813d6e1.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9932.367cf4725fedd6e2.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9935.1628b904cdc8ce0e.js +104 -0
  123. package/apps/pwa/out/_next/static/chunks/{7630.2b9a68659053ff4e.js → 9976.8f28864317639fe6.js} +16 -16
  124. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-a2aa8709d193ee0d.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/approvals/page-d5341ac96203a983.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-0160ab83c8685a12.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/board/page-55c631c032dcc47e.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/botlab/page-ad3bd8084048bee4.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/bots/page-e6784759a2531031.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/ceo/page-5c5d0e370f495ef6.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/chat/page-c325e21543cd48a8.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/consult/{page-80ed511e02c81412.js → page-6168a7c43e6ef8f5.js} +1 -1
  133. package/apps/pwa/out/_next/static/chunks/app/control/page-31417d3604154a6d.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/decisions/page-e9606dc0bdec9305.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/design-check/page-a648bc464c9dc754.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/editor/page-25bb425afdb27541.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/exec/page-32d72fdef1afe11a.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/field/page-d27b794c8ba76bbb.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/healthz/route-a2aa8709d193ee0d.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/inside/page-2bd9ce9c020d02d4.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/intake/page-a34096245e63b9f2.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/layout-22170f4f00a15496.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/live/page-4cc66d22ca4ec502.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/live-run/page-83b14c729fcea837.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/loops/page-6e2781c523dad761.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/market/page-26dd415c8f13f341.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-ccdb83ed40c8d724.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/morning/page-7ad3de8fa06fdea9.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/not-found-015c02c4fec4023e.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/observatory/page-6b0ae5b5c42f6d2f.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-786111f30b6f0969.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-48fb31810693c357.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e17cce5e2ed0fee.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/outputs/page-cb154acadb025414.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/page-16258e956ea93fc2.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/reflection/page-c2dd2b19c93f90ab.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-85f35dd1dd96ae87.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/sessions/page-d3c007c8a0ddd7ee.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-7837ce2aacb97b04.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/settings/page-7350ee93f4fe1033.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-00723458575f2b19.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/layout-a2aa8709d193ee0d.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/setup/page-745d9b6c015076f8.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/share/page-736d33c7414a8a1a.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/showroom/page-119be9a0444d2482.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/tasks/page-fa806c018833e332.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/term/page-c782041b5f5199ba.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/today/page-d431fbdea6ad93dd.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/trace/page-0c056abff82b9891.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/vault/page-242d668e4fbf72c4.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-847c3de6ca8a4416.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workflows/page-81dd0d8ae923ed72.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/workspace/page-74e69ba2c8e970d4.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-70038f41ae7cf931.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/b4e12462-5fab4a813a63dadd.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/cd39fa05.fac4545f42a3ef70.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/{f6b7c9ba.64a895b8b2fedbdc.js → ce383d63.d2ede338788ed18e.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/{framework-5c169757551134ed.js → framework-b2763b10dc6b3836.js} +1 -1
  179. package/apps/pwa/out/_next/static/chunks/main-app-27893e93b0ec193d.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-f280047194e1daf8.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-e90eff2d0b70564c.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-70f2d654b3435d34.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-4794f053bd5e4230.js +1 -0
  184. package/apps/pwa/out/_next/static/css/5619d59e87eddf66.css +1 -0
  185. package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +1 -0
  186. package/apps/pwa/out/_next/static/{aBi6EyMtLsrl7J8eH4kF7 → rfkMm4movqkqMebBrCXiR}/_buildManifest.js +1 -1
  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/graphs/log-horizon/log-horizon-watch.yaml +25 -0
  288. package/graphs/log-horizon/recipes.yaml +3 -0
  289. package/graphs/release/recipes.yaml +1 -1
  290. package/graphs/release/release-loop.yaml +6 -2
  291. package/graphs/release-rehearsal/recipes.yaml +12 -0
  292. package/graphs/release-rehearsal/release-rehearsal.yaml +17 -0
  293. package/package.json +4 -1
  294. package/scripts/bench-report.ts +82 -3
  295. package/scripts/ci-typecheck-changed.ts +10 -1
  296. package/scripts/hq/hq-fence-wrapper.sh +148 -0
  297. package/scripts/lib/typecheck-ratchet.ts +51 -0
  298. package/scripts/openai-relay-server.ts +5 -1
  299. package/scripts/release-loop/docs-node.ts +258 -43
  300. package/scripts/release-loop/gate-method.ts +59 -0
  301. package/scripts/release-loop/gate-node.ts +73 -7
  302. package/scripts/release-loop/gate-wall.ts +208 -0
  303. package/scripts/release-loop/known-issues-node.ts +53 -8
  304. package/scripts/release-loop/publish-at.ts +14 -0
  305. package/scripts/release-loop/publish-node.ts +17 -2
  306. package/scripts/release-loop/resume-release.ts +34 -4
  307. package/scripts/release-loop/resume.ts +53 -0
  308. package/scripts/release-loop/shard-plan.ts +3 -11
  309. package/scripts/release-loop/tui-node-checks.ts +22 -0
  310. package/scripts/release-loop/unattended-release.ts +8 -1
  311. package/scripts/rhythm/daily.ts +51 -2
  312. package/scripts/rhythm/weekly.ts +3 -2
  313. package/scripts/tsc-main-safety-net.ts +189 -0
  314. package/scripts/usage-rollup.ts +8 -4
  315. package/src/acp/codex-plugins.ts +48 -6
  316. package/src/agent/monad-agent-turn.ts +67 -5
  317. package/src/agent/run-context.ts +10 -0
  318. package/src/agent/tool-profile.ts +28 -2
  319. package/src/agent-mission/acp-judge.ts +8 -2
  320. package/src/agent-mission/capabilities-cli.ts +16 -1
  321. package/src/agent-mission/driver.ts +1 -1
  322. package/src/agent-mission/pr-review-watch.ts +6 -2
  323. package/src/agent-mission/review-loop.ts +33 -5
  324. package/src/agent-substrate/acp-reviewer.ts +17 -8
  325. package/src/agent-substrate/pr-reviewer.ts +164 -28
  326. package/src/agent-substrate/review-intent.ts +6 -4
  327. package/src/agent-substrate/self-review-cli.ts +111 -16
  328. package/src/agent-substrate/shard-boundary-intent.ts +92 -26
  329. package/src/ask-user-question/pending-questions.ts +8 -2
  330. package/src/autopilot/build/llm-conflict-merge.ts +216 -12
  331. package/src/autopilot/codebase-grounding.ts +44 -0
  332. package/src/autopilot/llm-control-brain.ts +13 -1
  333. package/src/autopilot/mission-codebase-gate.ts +8 -77
  334. package/src/autopilot/pr-manager.ts +12 -3
  335. package/src/boot/acp-server.ts +4 -7
  336. package/src/boot/acp-socket-path.ts +7 -0
  337. package/src/briefing/brief-items.ts +21 -13
  338. package/src/chat/index.ts +12 -3
  339. package/src/cli/agent-cli.ts +20 -0
  340. package/src/cli/brief-cli.ts +27 -21
  341. package/src/cli/cli-user-error.ts +9 -2
  342. package/src/cli/log-event-names.ts +3 -0
  343. package/src/cli/logs-cli.ts +1 -0
  344. package/src/cli/mcp-login.ts +111 -37
  345. package/src/cli/plugin-cli.ts +21 -1
  346. package/src/cli/pod-cli.ts +26 -0
  347. package/src/cli/pr-cli.ts +30 -2
  348. package/src/cli/pr-land-overlap-evidence.ts +131 -0
  349. package/src/cli/release-cli.ts +53 -11
  350. package/src/cli/self-update.ts +173 -10
  351. package/src/cli/skills-cli.ts +12 -3
  352. package/src/cli/tasks-cli.ts +133 -27
  353. package/src/context-bus/context-first.ts +51 -2
  354. package/src/context-bus/context-now-surfaces.ts +13 -2
  355. package/src/context-bus/long-term-memory.ts +3 -1
  356. package/src/context-bus/nightly-condense.ts +3 -2
  357. package/src/core-turn/run-goal-loop.ts +86 -2
  358. package/src/dashboard/chat-fold.ts +20 -0
  359. package/src/dashboard/first-screen-band.ts +151 -1
  360. package/src/dashboard/index.ts +27 -5
  361. package/src/dashboard/slash-runtime/dashboard-handlers.ts +5 -3
  362. package/src/dashboard/stale-install-check.ts +13 -2
  363. package/src/dashboard/turn-stream-formatter.ts +25 -0
  364. package/src/debug/log-diet.ts +159 -0
  365. package/src/debug/log.ts +52 -17
  366. package/src/display/coordinator.ts +25 -2
  367. package/src/domains/coo-admin-tool.ts +27 -0
  368. package/src/domains/cron-match.ts +1 -0
  369. package/src/domains/outbound-alert.ts +17 -6
  370. package/src/domains/release-tool.ts +119 -10
  371. package/src/domains/schedule-registry.ts +10 -7
  372. package/src/domains/schedule-runner.ts +1 -0
  373. package/src/elanous-config-dir.ts +2 -2
  374. package/src/elanous-daemon.ts +3 -3
  375. package/src/execution-loop/launch-gate.ts +1 -1
  376. package/src/expression/i18n/messages.en.ts +5 -0
  377. package/src/expression/i18n/messages.ja.ts +5 -0
  378. package/src/expression/i18n/messages.ko.ts +5 -0
  379. package/src/expression/i18n/messages.zh.ts +5 -0
  380. package/src/expression/i18n/types.ts +8 -0
  381. package/src/github/pr-labels.ts +1 -0
  382. package/src/graph-runner/runner.ts +54 -5
  383. package/src/harness/dispatch-backpressure.ts +259 -0
  384. package/src/harness/harness-cli-command.ts +107 -28
  385. package/src/harness/harness-seams.ts +2 -20
  386. package/src/harness/harness-substrate-default.ts +72 -1
  387. package/src/harness/nested-elanous-policy.ts +4 -2
  388. package/src/hq/fence-wrapper.ts +7 -0
  389. package/src/hq/hq.ts +33 -2
  390. package/src/hq/lease.ts +13 -0
  391. package/src/hq/seats.ts +114 -18
  392. package/src/index.ts +163 -64
  393. package/src/intake-plane/collect-github.ts +19 -1
  394. package/src/intake-plane/digest.ts +45 -20
  395. package/src/intake-plane/lens.ts +36 -8
  396. package/src/intelligence-map/model-alias.ts +6 -0
  397. package/src/intelligence-map/model-catalog.ts +41 -0
  398. package/src/knowledge/kgs/pack.ts +5 -2
  399. package/src/knowledge/kgs/sqlite-store.ts +15 -0
  400. package/src/knowledge/tools/knowledge-query.ts +20 -2
  401. package/src/knowledge/write.ts +234 -2
  402. package/src/llm/bedrock-provider.ts +175 -0
  403. package/src/llm/bedrock.ts +345 -0
  404. package/src/llm/provider-credentials.ts +3 -1
  405. package/src/llm.ts +306 -35
  406. package/src/loops/budget.ts +150 -0
  407. package/src/loops/orchestrator/seat-share.ts +6 -49
  408. package/src/loops/orchestrator/traffic.ts +5 -81
  409. package/src/market/signed-index.ts +42 -0
  410. package/src/mcp/mcp-oauth.ts +136 -17
  411. package/src/model-tier/llm-tier-map.ts +48 -4
  412. package/src/models/prompts.ts +22 -1
  413. package/src/mss/logging/horizon-watch.ts +168 -0
  414. package/src/mss/logging/log-store.ts +204 -15
  415. package/src/native-tool-catalog.ts +1 -1
  416. package/src/nexus/api/consult-requests.ts +7 -10
  417. package/src/nexus/api/discord-trigger-bot.ts +6 -3
  418. package/src/nexus/api/error-reports.ts +30 -8
  419. package/src/nexus/api/http-server.ts +8 -0
  420. package/src/nexus/api/loop-resources.ts +42 -0
  421. package/src/nexus/api/outbound-report.ts +8 -3
  422. package/src/nexus/api/telegram-trigger-bot.ts +6 -3
  423. package/src/nexus/index.ts +10 -0
  424. package/src/nexus/outbound/format.ts +2 -0
  425. package/src/nexus/outbound/router.ts +198 -13
  426. package/src/oauth/codex-account-rotation.ts +16 -18
  427. package/src/oauth/codex-account-store.ts +134 -5
  428. package/src/oauth/fallback-chain.ts +28 -6
  429. package/src/onboarding.ts +2 -1
  430. package/src/plugins/adapters/claude-package.ts +4 -12
  431. package/src/plugins/core/capability-policy.ts +141 -0
  432. package/src/plugins/core/host.ts +21 -8
  433. package/src/plugins/core/manifest.ts +19 -2
  434. package/src/plugins/core/trust-store.ts +15 -0
  435. package/src/plugins/core/types.ts +12 -0
  436. package/src/plugins/install/market-fetch.ts +68 -16
  437. package/src/plugins/install/plugin-install.ts +187 -16
  438. package/src/plugins/maker/plugin-maker.ts +25 -20
  439. package/src/plugins/maker/wizard-generate.ts +16 -2
  440. package/src/policy/llm-policy.ts +14 -1
  441. package/src/process/pid-liveness.ts +1 -1
  442. package/src/prompt-cache/openai.ts +10 -6
  443. package/src/prompt-cache/openrouter.ts +94 -0
  444. package/src/prompt-enhance/enhance.ts +46 -5
  445. package/src/prompt-library/family-prompt-coverage.ts +1 -0
  446. package/src/prompt-library/universal-preamble.ts +2 -2
  447. package/src/registry/discovery/openrouter-live-resolve.ts +122 -0
  448. package/src/registry/loader.ts +6 -1
  449. package/src/release-loop/checklist.ts +24 -9
  450. package/src/release-loop/feature-store.ts +3 -0
  451. package/src/release-loop/gate-shards.ts +48 -4
  452. package/src/release-loop/landed-to-green.ts +81 -0
  453. package/src/release-loop/light-rc.ts +11 -1
  454. package/src/release-loop/merged-pr-checklist.ts +10 -0
  455. package/src/release-loop/placement.ts +91 -22
  456. package/src/release-loop/rehearsal.ts +317 -0
  457. package/src/release-loop/release-schedule.ts +13 -1
  458. package/src/release-loop/rubric-types.ts +1 -0
  459. package/src/release-loop/rubric.ts +2 -2
  460. package/src/retro/daily.ts +23 -9
  461. package/src/seat-loop/seat-loop.ts +34 -1
  462. package/src/seat-loop/traffic-signal.ts +44 -0
  463. package/src/self-dev/ask-launch-flow.ts +2 -2
  464. package/src/self-dev/dev-cli.ts +67 -3
  465. package/src/self-dev/dev-pipeline.ts +4 -6
  466. package/src/self-dev/draft-residue.ts +463 -0
  467. package/src/self-dev/draft-sweep.ts +151 -10
  468. package/src/self-dev/draft-triage-rules.ts +27 -1
  469. package/src/self-dev/launch-preflight-text.ts +549 -0
  470. package/src/self-dev/launch-preflight.ts +10 -545
  471. package/src/self-dev/orchestrate-cli.ts +57 -2
  472. package/src/self-dev/orchestrate-summary-line.ts +13 -0
  473. package/src/self-dev/orchestrate.ts +8 -135
  474. package/src/self-dev/review-provider-fallback.ts +115 -19
  475. package/src/self-dev/run-store.ts +1 -3
  476. package/src/self-dev/run-supervisor.ts +3 -22
  477. package/src/self-dev/run-types.ts +178 -0
  478. package/src/self-dev/shard-aggregate.ts +61 -13
  479. package/src/self-dev/shard-plan.ts +5 -1
  480. package/src/self-dev/shard-run.ts +23 -5
  481. package/src/self-dev/supervisor-verdict-edges.ts +2 -4
  482. package/src/self-implement/blocked-draft-policy.ts +3 -19
  483. package/src/self-implement/draft-on-stop-mode.ts +18 -0
  484. package/src/self-implement/follow-up-goals.ts +114 -38
  485. package/src/self-implement/gate-baseline-reap.ts +157 -0
  486. package/src/self-implement/gate-baseline.ts +78 -16
  487. package/src/self-implement/gate-cli.ts +12 -2
  488. package/src/self-implement/gate-remote.ts +17 -6
  489. package/src/self-implement/goal-author.ts +24 -4
  490. package/src/self-implement/goal-digest.ts +19 -0
  491. package/src/self-implement/graph-overlay-condition.ts +4 -0
  492. package/src/self-implement/headless-elanous-driver.ts +11 -9
  493. package/src/self-implement/host-regate.ts +120 -29
  494. package/src/self-implement/l8-merge-queue.ts +67 -5
  495. package/src/self-implement/merge-train.ts +131 -0
  496. package/src/self-implement/off-diff-evidence.ts +9 -0
  497. package/src/self-implement/orchestrator.ts +133 -16
  498. package/src/self-implement/review-finding-recurrence.ts +28 -0
  499. package/src/self-implement/rework-policy.ts +2 -1
  500. package/src/self-implement/round-summary-card.ts +63 -0
  501. package/src/self-implement/run-ledger.ts +4 -3
  502. package/src/self-implement/run-step-projection.ts +147 -0
  503. package/src/self-implement/run-stop.ts +1 -1
  504. package/src/self-implement/seams.ts +36 -3
  505. package/src/self-implement/self-implement-cli.ts +3 -1
  506. package/src/self-implement/train-gate-remote.ts +158 -0
  507. package/src/session-runtime/index.ts +10 -1
  508. package/src/session-runtime/retry-api.ts +11 -1
  509. package/src/skills/gift-install.ts +119 -0
  510. package/src/skills/runner.ts +59 -2
  511. package/src/skills/skill-feedback.ts +31 -1
  512. package/src/skills/skill-tier.ts +1 -0
  513. package/src/smart-wizard/capability-index.ts +231 -0
  514. package/src/smart-wizard/rung.ts +74 -0
  515. package/src/steward/launch.ts +20 -9
  516. package/src/steward/triage.ts +4 -2
  517. package/src/storage/file-lock.ts +8 -1
  518. package/src/task-agent/actions.ts +4 -0
  519. package/src/task-agent/card-evidence.ts +59 -13
  520. package/src/task-agent/judge.ts +4 -3
  521. package/src/task-agent/land-worktree.ts +201 -0
  522. package/src/task-agent/live-move-history.ts +133 -0
  523. package/src/task-agent/live-moves.ts +106 -19
  524. package/src/task-agent/parent-host.ts +117 -8
  525. package/src/task-agent/rejudge-on-head.ts +297 -0
  526. package/src/task-agent/review-result-capture.ts +218 -0
  527. package/src/task-agent/shadow.ts +103 -7
  528. package/src/task-agent/task-hand.ts +136 -11
  529. package/src/task-orchestrator/surfaces/pod-child-providers.ts +29 -0
  530. package/src/task-orchestrator/surfaces/pod-command-job.ts +6 -3
  531. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +16 -2
  532. package/src/task-orchestrator/surfaces/pod-image-source.ts +212 -0
  533. package/src/task-orchestrator/surfaces/pod-lease.ts +93 -12
  534. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +25 -2
  535. package/src/task-orchestrator/surfaces/pod-pool.ts +66 -14
  536. package/src/task-orchestrator/surfaces/self-implement-pod.ts +259 -36
  537. package/src/task-orchestrator/surfaces/self-implement.ts +6 -2
  538. package/src/telegram-service.ts +5 -1
  539. package/src/telegram.ts +17 -4
  540. package/src/time/format.ts +13 -4
  541. package/src/tool-runtime/goal-author-runtime.ts +1 -0
  542. package/src/tool-runtime/self-cognition-catalog.ts +23 -0
  543. package/src/tool-runtime/self-cognition-runtimes.ts +2 -24
  544. package/src/user-config.ts +132 -24
  545. package/src/ux-sim/slash-menu-frames.ts +168 -0
  546. package/src/version/packed-revision.json +1 -1
  547. package/src/web-terminal/preview-tap-registry.ts +5 -2
  548. package/src/workflow-runtime/triggers/scheduler.ts +1 -0
  549. package/apps/pwa/out/_next/static/chunks/1109.78a7a3288c0259d9.js +0 -148
  550. package/apps/pwa/out/_next/static/chunks/115.1c6690b8604f81c4.js +0 -32
  551. package/apps/pwa/out/_next/static/chunks/1262.76a3f08e67c5f816.js +0 -309
  552. package/apps/pwa/out/_next/static/chunks/1307-08b716476f1d50af.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/1358d292.5c87f12cad6eaa91.js +0 -122
  554. package/apps/pwa/out/_next/static/chunks/1438.27a1a7b8f2308004.js +0 -149
  555. package/apps/pwa/out/_next/static/chunks/1442.02d85cd88f4c1eac.js +0 -79
  556. package/apps/pwa/out/_next/static/chunks/1501-1aad662d82ba43f7.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/1584.9e2dd53da6e6d4b1.js +0 -24
  558. package/apps/pwa/out/_next/static/chunks/1586.b989b0614afb77e6.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/1609.2ad355062870151f.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/1612-f6df0fc0eed7157b.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/1826-5d279da64bbbc2de.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/1923.37f1d5fe7ebe3860.js +0 -27
  563. package/apps/pwa/out/_next/static/chunks/195-fb1d7690bf30bab4.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/1986-33e13d648a9df765.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/1993.3fd074a2a246234e.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/211-9c9090c59e2c5907.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/2140.d2daf9ee96e295d1.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/2196-4700653d12a44b40.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/2212.0359851457473efc.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/224.583e562365a52f74.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/2328.0f37465646bafa7d.js +0 -36
  572. package/apps/pwa/out/_next/static/chunks/2372.bf71372184991937.js +0 -286
  573. package/apps/pwa/out/_next/static/chunks/2489-d238d3e2eb5b2bf5.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/2537-6c289376caa88ca1.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/2549-a8515c86f9e8cb96.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/2655.72cc6a97276c5acc.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/2699-325cc923ba7b8631.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/2743-ef6e8c3ced74cce5.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/2840-5458ad50c49cac6a.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/2856.f75d5baef7f49b74.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/311.e685738f92e6e2ec.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/3194-807b212fb8eae065.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/3324-d1d2979821dfa845.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/3344.0de4b0ec5a454b7a.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/335.a13f339e97893437.js +0 -94
  586. package/apps/pwa/out/_next/static/chunks/3394.646348f34b2500be.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/3443.6276909b53d72d53.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/3495.abd4254d808bf2dc.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/3558-bbb5ab553a0471d3.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/3721.ba5b82db0d9a5572.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/3857-5985236d9307f676.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/3916-3d02dd1fc257dd3c.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/3919.9ff7dc25afefee33.js +0 -74
  594. package/apps/pwa/out/_next/static/chunks/3998.bd9a69d9b50e9bd2.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/4003.ab6db1dc266576c9.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/4144-fad095b48a1862ee.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/4216.e8ac94b9fe6b96ab.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/4327.c44dc2b55cb43ee5.js +0 -34
  599. package/apps/pwa/out/_next/static/chunks/4401.94257d497b6d26bc.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/4559.17ca2cdbaa8d414f.js +0 -115
  601. package/apps/pwa/out/_next/static/chunks/4565-3d7e3fdeb43686a8.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/4706.97e734bd4c9816ca.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/4795-f372490b178583fc.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/4982.6e44352f751b9a1b.js +0 -77
  605. package/apps/pwa/out/_next/static/chunks/5342.49c5c5a530e62b50.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/5360-08a80abdf3a4da99.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/5431.66c58ab1327ee0b7.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/5633-d6852385000738ef.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/5717.bcfcb96e701b82e0.js +0 -90
  610. package/apps/pwa/out/_next/static/chunks/5755-30d102586789bf7f.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/5957.3f1a4012388dd962.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/5977-5b9e8a45a5b0c823.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/602.9bf02ac8e9502598.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/6020.3a1b347e2d2dfacc.js +0 -8
  615. package/apps/pwa/out/_next/static/chunks/6375.fce1d174ba6d0324.js +0 -64
  616. package/apps/pwa/out/_next/static/chunks/6546.92a828aef441271f.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/658.957fdb0a8c6c6c8e.js +0 -287
  618. package/apps/pwa/out/_next/static/chunks/6706.323590aabb8b1293.js +0 -226
  619. package/apps/pwa/out/_next/static/chunks/6747.b67947f293a4c02d.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/6868.000b24a3045c5574.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/6877-74399f69c7da1433.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/6946.bba74e9c96050f30.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/7033.a558f1b2f6912a53.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/7065.46029c26c53eac50.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/7087.6fae577d09249bc1.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/722.de8d9801e0f6d414.js +0 -41
  627. package/apps/pwa/out/_next/static/chunks/726.83532d69452ee24b.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/7290-f09c928a06c52e2d.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/7497.57981e9d7a75a52a.js +0 -24
  630. package/apps/pwa/out/_next/static/chunks/7672.4af122ad892117c7.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/771.6ab889a233e7dae7.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/7797-df5aa0381fdc078f.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/8060-cc008cc6fedfa818.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/8085-d065d0393c1760f5.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/8096.f7da0776cfde6300.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/8401-35e94e9091f5eb8d.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/8682-7061dd4fa7bd62ed.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/8695-846034ce44852c70.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/8769.815ca69879f608b4.js +0 -104
  640. package/apps/pwa/out/_next/static/chunks/8857-aa1cc4ac90af4d40.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/8f835b4f.048eeb02299e3e12.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/9068.5f2764fccf86c1b2.js +0 -93
  643. package/apps/pwa/out/_next/static/chunks/9103-60fbef33e66f0a46.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/9247-55bcfbb0e8057f59.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/935.4ddaa99fc1d1126c.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/9451.ebfb0dcc9c02250f.js +0 -23
  647. package/apps/pwa/out/_next/static/chunks/9559.e648369b1d57cf9a.js +0 -62
  648. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c1a96669158471ec.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/approvals/page-88459e0903da2803.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-d85c43f46f58716b.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/board/page-4e645600579ae952.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/botlab/page-87edbfd19117823b.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/bots/page-7f0c2b7801ac6a54.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/ceo/page-bf1f030a9d1adffd.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/chat/page-cbaf66b1e1804adf.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/control/page-9f5610caaa06178c.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/decisions/page-ec8f3575e339de74.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/design-check/page-86d753e460f1a989.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/editor/page-4166a7d51cf0a57d.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/exec/page-2a19c5cd3b562580.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/field/page-b6a09cde2e07521a.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/healthz/route-c1a96669158471ec.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/inside/page-f7eae1518ca0c353.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/intake/page-456a8573ad811381.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/layout-8462d6a543cbb2d9.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/live/page-2974cdfb87c0f9c9.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/live-run/page-f927ffa25f3c86d1.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/loops/page-abd86cd832aaa011.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/market/page-79daf68f6256adaa.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-8c3f168fc3f91939.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/morning/page-786fb4504d0f2fa9.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/not-found-75209f14597dcb8f.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/observatory/page-bf30affe3a85af7e.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-1187a44b7515434b.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-3d0910185a66ed54.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-f401ee1dd5a26e25.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/outputs/page-5dfe7604fd842784.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/page-76cf838050a8d681.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/reflection/page-7ec8e289b4c14df6.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-8c8ac17d52be2a79.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/app/sessions/page-d359ab048d63a9d9.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-b8b345c880bf78d1.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/settings/page-f151cc10ad026940.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-9875f103057da433.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/setup/layout-c1a96669158471ec.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/app/setup/page-9789328af9a9aa62.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/app/share/page-bf495a1e284f4e00.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/app/showroom/page-a263d94bca4be22a.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/app/tasks/page-3962eab8ec58d16e.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/app/term/page-9abcfac07e02a542.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/app/today/page-bee49f927c333abb.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/app/trace/page-bac2d56dcb02d955.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/app/vault/page-937cbcc13176295c.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-d09495594f7f480d.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/app/workflows/page-69cb93d1a2e57e0e.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/app/workspace/page-72ec543928d67c3e.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-82906eeda0186a7b.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/f6231284-45726550aba08fca.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/main-59fe95fed40c7a01.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/main-app-4ca74dbbee7057c6.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/pages/_app-13a0a886df4d97a1.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/pages/_error-6af8591cd3a3f038.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/webpack-f2b4016b9b981bc8.js +0 -1
  704. package/apps/pwa/out/_next/static/css/f2bd5257e6af88d8.css +0 -1
  705. /package/apps/pwa/out/_next/static/{aBi6EyMtLsrl7J8eH4kF7 → rfkMm4movqkqMebBrCXiR}/_ssgManifest.js +0 -0
@@ -9,6 +9,12 @@ family: gpt-6
9
9
  # sharing a catalog generation family"*. 그 기전을 쓴다(grok 이 이미 이 방식이다).
10
10
  # ⇒ 이제 `sol` 별칭의 후보는 {gpt-6-sol, gpt-5.6-sol} 이고 최신이 «하나»로 정해진다.
11
11
  familyShortcut: astra
12
+ # 📏 창·출력 상한 — 2026-10-10 MK(MODEL-ROUTING-MATRIX) · 출처 둘이 «같은 값»일 때만 채운다:
13
+ # ⑴ developers.openai.com/api/내부 문서 `gpt-6-astra` (2026-09-23 대조 · src/intelligence-map/model-catalog.ts 의 contextWindow 1_050_000 ⊕ sol·astra notes «입력 922K · 출력 128K»)
14
+ # ⑵ OpenRouter `GET /api/v1/models` 실호출 2026-10-10T05:10Z — openai/gpt-6-astra: context_length 1050000 · top_provider.max_completion_tokens 128000
15
+ # ⛔ 이 칸이 비어 있으면 `resolver` 의 minContextSize 판정이 `contextSize ?? 0` 으로 읽어 이 모델을 «창 0»으로 떨군다.
16
+ contextSize: 1050000
17
+ outputMaxTokens: 128000
12
18
  # 출시일 — 「unknown-missing-release-date」를 «승인 목록에 더하지 않고» 없앤다.
13
19
  # 출처: developers.openai.com/api/내부 문서 `gpt-6-astra` ⊕ 2026-09-09 구독 실측
14
20
  releaseDate: 2026-09-03
@@ -9,6 +9,12 @@ family: gpt-6
9
9
  # sharing a catalog generation family"*. 그 기전을 쓴다(grok 이 이미 이 방식이다).
10
10
  # ⇒ 이제 `sol` 별칭의 후보는 {gpt-6-sol, gpt-5.6-sol} 이고 최신이 «하나»로 정해진다.
11
11
  familyShortcut: luna
12
+ # 📏 창·출력 상한 — 2026-10-10 MK(MODEL-ROUTING-MATRIX) · 창은 출처 둘이 같은 값 · 출력은 ⑵ 하나(아래):
13
+ # ⑴ src/intelligence-map/model-catalog.ts 의 gpt-6-luna contextWindow 1_050_000 (09-23 대조) — 출력 128,000 의 luna 직접 근거는 ⑵ 하나다(같은 세대 sol·astra 의 OpenAI 문서가 출력 128K)
14
+ # ⑵ OpenRouter `GET /api/v1/models` 실호출 2026-10-10T05:10Z — openai/gpt-6-luna: context_length 1050000 · top_provider.max_completion_tokens 128000
15
+ # ⛔ 이 칸이 비어 있으면 `resolver` 의 minContextSize 판정이 `contextSize ?? 0` 으로 읽어 이 모델을 «창 0»으로 떨군다.
16
+ contextSize: 1050000
17
+ outputMaxTokens: 128000
12
18
  # 출시일 — 「unknown-missing-release-date」를 «승인 목록에 더하지 않고» 없앤다.
13
19
  # 출처: developers.openai.com/api/내부 문서 `gpt-6-luna` (2026-09-23 firecrawl 직접)
14
20
  releaseDate: 2026-09-22
@@ -9,6 +9,12 @@ family: gpt-6
9
9
  # sharing a catalog generation family"*. 그 기전을 쓴다(grok 이 이미 이 방식이다).
10
10
  # ⇒ 이제 `sol` 별칭의 후보는 {gpt-6-sol, gpt-5.6-sol} 이고 최신이 «하나»로 정해진다.
11
11
  familyShortcut: sol
12
+ # 📏 창·출력 상한 — 2026-10-10 MK(MODEL-ROUTING-MATRIX) · 출처 둘이 «같은 값»일 때만 채운다:
13
+ # ⑴ developers.openai.com/api/내부 문서 `gpt-6-sol` (2026-09-23 대조 · src/intelligence-map/model-catalog.ts 의 contextWindow 1_050_000 ⊕ sol·astra notes «입력 922K · 출력 128K»)
14
+ # ⑵ OpenRouter `GET /api/v1/models` 실호출 2026-10-10T05:10Z — openai/gpt-6-sol: context_length 1050000 · top_provider.max_completion_tokens 128000
15
+ # ⛔ 이 칸이 비어 있으면 `resolver` 의 minContextSize 판정이 `contextSize ?? 0` 으로 읽어 이 모델을 «창 0»으로 떨군다.
16
+ contextSize: 1050000
17
+ outputMaxTokens: 128000
12
18
  # 출시일 — 「unknown-missing-release-date」를 «승인 목록에 더하지 않고» 없앤다.
13
19
  # 출처: developers.openai.com/api/내부 문서 `gpt-6-sol` (2026-09-23 firecrawl 직접)
14
20
  releaseDate: 2026-09-22
@@ -0,0 +1,25 @@
1
+ graph_id: log-horizon-watch
2
+ loop:
3
+ title: Log retention horizon watch
4
+ owner: TC
5
+ trigger:
6
+ cron: '23 * * * *'
7
+ events: [manual]
8
+ version: 1
9
+ entry_node: sample
10
+ terminal_nodes: [done, failed]
11
+ nodes:
12
+ - node_id: sample
13
+ kind: agent
14
+ recipe: cmd:log-horizon-sample
15
+ max_visits: 1
16
+ - node_id: done
17
+ kind: gate
18
+ max_visits: 1
19
+ - node_id: failed
20
+ kind: gate
21
+ max_visits: 1
22
+ edges:
23
+ - from: sample
24
+ on: outcome
25
+ map: { ok: done, fail: failed, error: failed }
@@ -0,0 +1,3 @@
1
+ log-horizon-sample:
2
+ command: 'bun "$ELANOUS_GRAPH_DIR/../../src/mss/logging/horizon-watch.ts" --json'
3
+ timeout_ms: 120000
@@ -45,7 +45,7 @@ publish:
45
45
  approval: 'v{{input.version}} 공개 발행 — 되돌릴 수 없다. 승인하시겠습니까?'
46
46
  publish-command:
47
47
  command: 'bun scripts/release-loop/publish-node.ts'
48
- timeout_ms: 1800000
48
+ # The node may wait until input.publishAt; runPublish bounds the actual publication subprocess to 30 minutes.
49
49
  npm-publish:
50
50
  command: 'bun scripts/release-loop/npm-publish-node.ts'
51
51
  # 40m default wait + two 5m commands + up to 83 bounded 15s registry inspections.
@@ -14,13 +14,15 @@ nodes:
14
14
  - { node_id: version-release, kind: git, recipe: 'cmd:version-release', max_visits: 1 }
15
15
  - { node_id: cutoff, kind: judge, recipe: 'cmd:cutoff', max_visits: 1 }
16
16
  - { node_id: checklist-gate, kind: gate, recipe: 'cmd:checklist-gate', max_visits: 1 }
17
+ # cmd:docs dispatches by graph node ID: bounded prefetch before gate, TUI join after upgrade, docs write after both.
18
+ - { node_id: prefetch, kind: agent, recipe: 'cmd:docs', max_visits: 1 }
17
19
  - { node_id: gate, kind: gate, recipe: 'cmd:gate', max_visits: 1, notify: start }
18
20
  - { node_id: mac-smoke, kind: gate, recipe: 'cmd:mac-smoke', max_visits: 1 }
19
21
  - { node_id: export-check, kind: gate, recipe: 'cmd:export-check', max_visits: 1 }
20
22
  - { node_id: pwa, kind: gate, recipe: 'cmd:pwa', max_visits: 1, notify: start }
21
23
  - { node_id: prepare, kind: agent, recipe: 'cmd:prepare', max_visits: 1, notify: start }
22
24
  - { node_id: upgrade, kind: gate, recipe: 'cmd:upgrade', max_visits: 1 }
23
- - { node_id: tui, kind: gate, recipe: 'cmd:tui', max_visits: 1 }
25
+ - { node_id: tui, kind: gate, recipe: 'cmd:docs', max_visits: 1 }
24
26
  - { node_id: docs, kind: agent, recipe: 'cmd:docs', max_visits: 1 }
25
27
  - { node_id: known-issues, kind: agent, recipe: 'cmd:known-issues', max_visits: 1 }
26
28
  - { node_id: notes-check, kind: gate, recipe: 'cmd:notes-check', max_visits: 1 }
@@ -39,7 +41,9 @@ nodes:
39
41
  edges:
40
42
  - { from: version-release, on: outcome, map: { ok: cutoff, fail: failed, error: failed } }
41
43
  - { from: cutoff, on: outcome, map: { ok: checklist-gate, fail: failed, error: failed } }
42
- - { from: checklist-gate, on: outcome, map: { ok: gate, fail: failed, error: failed } }
44
+ - { from: checklist-gate, on: outcome, map: { ok: prefetch, fail: failed, error: failed } }
45
+ # Prefetch never gates: even a crashed prefetch node is a cache miss — the late nodes take their original paths.
46
+ - { from: prefetch, on: outcome, map: { ok: gate, fail: gate, error: gate } }
43
47
  - { from: gate, on: outcome, map: { ok: mac-smoke, fail: failed, error: failed } }
44
48
  # Warning-only: a macOS failure or unmeasured run never blocks publishing — auto-approve shows it as a warning row.
45
49
  - { from: mac-smoke, on: outcome, map: { ok: export-check, fail: export-check, error: export-check } }
@@ -0,0 +1,12 @@
1
+ tick:
2
+ command: >-
3
+ bun -e 'const repo=process.env.ELANOUS_GRAPH_DIR+"/../..";
4
+ const run=Bun.spawnSync(["bun", repo+"/bin/elanous.mjs", "release", "rehearsal", "tick", "--apply", "--json"],
5
+ {cwd:process.env.ELANOUS_REHEARSAL_GIT_CWD || repo,stdout:"pipe",stderr:"pipe"});
6
+ const stdout=new TextDecoder().decode(run.stdout).trim();
7
+ const stderr=new TextDecoder().decode(run.stderr).trim();
8
+ if (run.exitCode !== 0) { let why=""; try { why=JSON.parse(stdout).error ?? ""; } catch {} throw new Error(stderr || why || "rehearsal tick exit " + run.exitCode); }
9
+ const result=JSON.parse(stdout);
10
+ if (result.ok !== true) throw new Error(result.error ?? "rehearsal tick failed");
11
+ console.log(JSON.stringify({outcome:"ok",tick:result}));'
12
+ timeout_ms: 5400000
@@ -0,0 +1,17 @@
1
+ graph_id: release-rehearsal
2
+ loop:
3
+ title: 판 컷 전 가벼운 RC 리허설
4
+ description: 판 일정의 컷 −7h · −150m 단계를 15분마다 살펴서 단계당 한 번만 실행
5
+ owner: OP
6
+ trigger:
7
+ cron: '*/15 * * * *'
8
+ events: [manual]
9
+ version: 1
10
+ entry_node: tick
11
+ terminal_nodes: [done, failed]
12
+ nodes:
13
+ - { node_id: tick, kind: judge, recipe: 'cmd:tick', max_visits: 1 }
14
+ - { node_id: done, kind: gate, max_visits: 1 }
15
+ - { node_id: failed, kind: gate, max_visits: 1 }
16
+ edges:
17
+ - { from: tick, on: outcome, map: { ok: done, fail: failed, error: 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.22",
4
+ "version": "0.2.23",
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",
@@ -93,10 +93,13 @@
93
93
  "@agentclientprotocol/sdk": "1.5.0",
94
94
  "@antv/infographic": "^0.2.20",
95
95
  "@aws-sdk/client-secrets-manager": "^3.1043.0",
96
+ "@aws-sdk/credential-provider-node": "3.972.39",
96
97
  "@discordjs/voice": "^0.19.2",
97
98
  "@google-cloud/secret-manager": "^6.1.2",
98
99
  "@google/gemini-cli": "0.38.0",
99
100
  "@google/genai": "^1.51.0",
101
+ "@smithy/hash-node": "4.2.14",
102
+ "@smithy/signature-v4": "5.3.14",
100
103
  "@xterm/headless": "^6.0.0",
101
104
  "chalk": "^5.4.1",
102
105
  "commander": "^13.1.0",
@@ -1,15 +1,17 @@
1
1
  #!/usr/bin/env bun
2
2
  // 벤치 한 판(runId) → 팔 × 지표 표. RFC-fleet-supervisor-substrates-benchmark-and-token-accounting §F5 · 2026-09-25.
3
- // bun scripts/bench-report.ts --run <runId> [--since 24h] [--json]
4
- // 입력은 호스트 로그 셋뿐이다(새 저장소 0):
3
+ // bun scripts/bench-report.ts --run <runId> [--since 24h] [--json] [--bn1 <관측.json>]
4
+ // 기본 입력은 호스트 로그 셋뿐이다(새 저장소 0). BN1은 선택적 별도 관측 파일이다.
5
+ // 기본 로그 입력:
5
6
  // ① `self-dev.orchestrate substrate` — 팔 선언(benchArms: id·provider·model)
6
7
  // ② `self-implement.pod job-applied` — spaceId ↔ armId
7
8
  // ③ `self-dev.orchestrate job.done` — taskId·stage·prUrl·durationMs ⊕ (E4) gatePassed·reviewVerdict·reviewMustFixCount
8
9
  // ④ `llm-usage` site=`pod-rollup:*` — Pod 가 잰 사용량(armId 별)
9
10
  // ⛔ runId 로만 거른다 — `--all --include-test` 의 «모든 우주»가 섞여도 runId 는 한 판이다.
10
11
  // ⛔ 이음이 끊긴 칸은 0 으로 채우지 않고 `null`(못 이음)로 둔다.
11
- // ⛔ 이 표로 팔을 «비교»하지 않는다 — 팔 밖 모델 행(leak)이 0이고 팔마다 표본이 쌓인 뒤에만(A/B 매뉴얼 · 결론 금지).
12
+ // ⛔ 기본 표로 팔을 «비교»하지 않는다 — 팔 밖 모델 행(leak)이 0이고 팔마다 표본이 쌓인 뒤에만(A/B 매뉴얼 · 결론 금지). BN1도 네 팔 동일 골 측정 전 결론 금지.
12
13
  import { spawnSync } from 'node:child_process';
14
+ import { readFileSync } from 'node:fs';
13
15
  import { dirname, join } from 'node:path';
14
16
 
15
17
  export interface LogRow { category?: string; event?: string; data?: Record<string, unknown> | null }
@@ -120,6 +122,68 @@ export function buildBenchReport(rows: readonly LogRow[], runId: string): { runI
120
122
  return { runId, arms: [...arms.values()].sort((x, y) => (x.armId < y.armId ? -1 : 1)), unjoinedJobs, ...(image ? { image } : {}) };
121
123
  }
122
124
 
125
+ export const BN1_ARMS = ['Codex', 'OpenClaw', 'Hermes', '엘라누스'] as const;
126
+ export type Bn1Arm = typeof BN1_ARMS[number];
127
+ export interface Bn1Input {
128
+ runId: string;
129
+ goals: Array<{ id: string; text: string }>;
130
+ observations: Array<{
131
+ goalId: string;
132
+ arm: Bn1Arm;
133
+ completed: boolean | null;
134
+ humanInterventions: number | null;
135
+ durationMs: number | null;
136
+ costUsd: number | null;
137
+ evidence: string;
138
+ }>;
139
+ }
140
+
141
+ /** BN1 is a separate, opt-in experiment: no inference from pod stage, calls or known-cost subtotal. */
142
+ export function buildBn1Comparison(input: Bn1Input, runId: string) {
143
+ if (!input || typeof input.runId !== 'string' || !input.runId.trim() || input.runId !== runId || !Array.isArray(input.goals) || !input.goals.length || !Array.isArray(input.observations)) throw new Error('BN1: runId 또는 골 셋이 유효하지 않음');
144
+ const goals = new Set<string>();
145
+ for (const goal of input.goals) {
146
+ if (typeof goal?.id !== 'string' || !goal.id.trim() || typeof goal.text !== 'string' || !goal.text.trim() || goals.has(goal.id)) throw new Error('BN1: 빈 골 또는 중복 골');
147
+ goals.add(goal.id);
148
+ }
149
+ const observed = new Map<string, Bn1Input['observations'][number]>();
150
+ for (const row of input.observations) {
151
+ if (!row || typeof row.goalId !== 'string' || typeof row.arm !== 'string') throw new Error('BN1: 알 수 없거나 중복된 골/팔');
152
+ const key = `${row.goalId}\u0000${row.arm}`;
153
+ if (!goals.has(row.goalId) || !BN1_ARMS.includes(row.arm) || observed.has(key)) throw new Error('BN1: 알 수 없거나 중복된 골/팔');
154
+ if (typeof row.evidence !== 'string' || !row.evidence.trim()) throw new Error('BN1: 관측 근거가 없음');
155
+ if (row.completed !== null && typeof row.completed !== 'boolean') throw new Error('BN1: 완주 값은 boolean 또는 null');
156
+ for (const value of [row.humanInterventions, row.durationMs, row.costUsd]) {
157
+ if (value === undefined || (value !== null && (typeof value !== 'number' || !Number.isFinite(value) || value < 0))) throw new Error('BN1: 수치는 0 이상 또는 null');
158
+ }
159
+ if (row.humanInterventions !== null && !Number.isInteger(row.humanInterventions)) throw new Error('BN1: 사람 개입 수는 정수');
160
+ observed.set(key, row);
161
+ }
162
+ const comparedGoals = input.goals.map((goal) => {
163
+ const arms = BN1_ARMS.map((arm) => {
164
+ const row = observed.get(`${goal.id}\u0000${arm}`);
165
+ return { arm, completed: row?.completed ?? null, humanInterventions: row?.humanInterventions ?? null,
166
+ durationMs: row?.durationMs ?? null, costUsd: row?.costUsd ?? null, evidence: row?.evidence ?? null };
167
+ });
168
+ return { id: goal.id, text: goal.text, arms };
169
+ });
170
+ const fieldsComplete = comparedGoals.every((goal) => goal.arms.every((arm) =>
171
+ arm.completed !== null && arm.humanInterventions !== null && arm.durationMs !== null && arm.costUsd !== null && arm.evidence !== null));
172
+ return { runId, fieldsComplete, goals: comparedGoals };
173
+ }
174
+
175
+ export function renderBn1Comparison(rep: ReturnType<typeof buildBn1Comparison>): string {
176
+ const value = (v: number | boolean | null): string => v === null ? '못 잼' : typeof v === 'boolean' ? (v ? '완주' : '미완주') : String(v);
177
+ const cell = (text: string): string => text.replaceAll('|', '\\|').replaceAll('\n', '<br>');
178
+ return ['## BN1 · 같은 골 대조 (X1 격리 설치와 짝)', '',
179
+ `측정 칸 완비: ${rep.fieldsComplete ? '네 팔 관측값 기입 완료(출처와 조건 별도 검증 필요)' : '아니오 — 미관측 칸 존재'}`,
180
+ '', '| 골 | 공유 골 입력(미확정 가능) | 팔 | 끝까지 | 사람 개입 수 | 시간(ms) | 비용(USD) | 근거 |',
181
+ '|---|---|---|---|---|---|---|---|',
182
+ ...rep.goals.flatMap((goal) => goal.arms.map((row) => `| ${cell(goal.id)} | ${cell(goal.text)} | ${row.arm} | ${value(row.completed)} | ${value(row.humanInterventions)} | ${value(row.durationMs)} | ${value(row.costUsd)} | ${row.evidence === null ? '못 잼' : cell(row.evidence)} |`)),
183
+ '', 'X1 짝 실측(격리 설치·첫 실행, 개발 골 대조 아님): docs/measurements/X1-inner-pty-openclaw-hermes-install-2026-10-03.md',
184
+ '못 잼은 0이 아니라 미관측이다. 동일 골 네 팔의 근거가 모이기 전 비교 우열은 판정하지 않는다.'].join('\n');
185
+ }
186
+
123
187
  export function renderBenchReport(rep: ReturnType<typeof buildBenchReport>): string {
124
188
  const k = (n: number): string => (n >= 10_000 ? `${Math.round(n / 1000)}k` : String(n));
125
189
  const lines = [
@@ -146,6 +210,21 @@ if (import.meta.main) {
146
210
  const arg = (name: string): string | undefined => { const i = process.argv.indexOf(name); return i > 0 ? process.argv[i + 1] : undefined; };
147
211
  const runId = arg('--run');
148
212
  if (!runId) { console.error('사용: bun scripts/bench-report.ts --run <runId> [--since 24h] [--json]'); process.exit(2); }
213
+ const bn1Path = arg('--bn1');
214
+ if (process.argv.includes('--bn1') && (!bn1Path || bn1Path.startsWith('--'))) {
215
+ console.error('BN1 입력 실패: --bn1 <관측.json> 경로 필요');
216
+ process.exit(2);
217
+ }
218
+ let bn1: ReturnType<typeof buildBn1Comparison> | undefined;
219
+ if (bn1Path) {
220
+ try { bn1 = buildBn1Comparison(JSON.parse(readFileSync(bn1Path, 'utf8')) as Bn1Input, runId); }
221
+ catch (error) { console.error(`BN1 입력 실패: ${error instanceof Error ? error.message : String(error)}`); process.exit(2); }
222
+ }
223
+ // BN1 external arms have no self-dev pod logs. Do not require legacy bench arms for their report.
224
+ if (bn1) {
225
+ console.log(process.argv.includes('--json') ? JSON.stringify(bn1) : renderBn1Comparison(bn1));
226
+ process.exit(0);
227
+ }
149
228
  const bin = join(dirname(import.meta.dir), 'bin', 'elanous.mjs');
150
229
  const rows: LogRow[] = [];
151
230
  for (const q of [['--category', 'self-dev.orchestrate'], ['--category', 'self-implement.pod'], ['--event', 'llm-usage']]) {
@@ -24,6 +24,15 @@ function gitEnv(base: NodeJS.ProcessEnv = process.env): NodeJS.ProcessEnv {
24
24
  return env;
25
25
  }
26
26
 
27
+ /**
28
+ * tsc 를 띄울 env — 호출자(runTsc)가 넘긴 env(= tscEnv · 20GB 힙)를 «바탕»으로 GIT_* 만 걷는다.
29
+ * 🩸 2026-10-09: 이 자리가 `env: gitEnv()`(process.env 바탕)로 덮어 tscEnv 의 힙이 사라졌다 → 호스트 재게이트 tsc 가
30
+ * ≈4GB(V8 기본)에서 OOM · merge-ready 자식이 `host-regate-failed` 로 «실패» 기록(오늘 5건).
31
+ */
32
+ export function tscExecEnv(callerEnv: NodeJS.ProcessEnv | undefined): NodeJS.ProcessEnv {
33
+ return gitEnv(callerEnv ?? tscEnv());
34
+ }
35
+
27
36
  /** git 조회용 — 명령 실패는 호출자가 빈 출력과 구분할 수 있게 전파한다. */
28
37
  function sh(cmd: string, cwd = process.cwd()): string {
29
38
  return execSync(cmd, { encoding: 'utf8', stdio: ['ignore', 'pipe', 'pipe'], cwd, env: gitEnv() });
@@ -880,7 +889,7 @@ function inspectTscResult(tsc: TscRun, changed: ReadonlySet<string>, baseline: R
880
889
  export function runGate(io: Partial<GateIo> = {}): void {
881
890
  const cwd = io.cwd ?? process.cwd();
882
891
  const defaultChanged = () => changedTsFiles((cmd) => sh(cmd, cwd), process.env, cwd, io.baseRef);
883
- const { changedTsFiles: getChanged = defaultChanged, runTscCmd = (cmd: string) => runTsc(cmd, ((command, options) => execSync(command, { ...options, cwd, env: gitEnv() })) as typeof execSync), log = (message: string) => console.log(message), warn = (message: string) => console.warn(message), error = (message: string) => console.error(message), exit = ((code: number) => process.exit(code)) as GateIo['exit'] } = io;
892
+ const { changedTsFiles: getChanged = defaultChanged, runTscCmd = (cmd: string) => runTsc(cmd, ((command, options) => execSync(command, { ...options, cwd, env: tscExecEnv(options?.env) })) as typeof execSync), log = (message: string) => console.log(message), warn = (message: string) => console.warn(message), error = (message: string) => console.error(message), exit = ((code: number) => process.exit(code)) as GateIo['exit'] } = io;
884
893
  const readBaselineDiagnostics = io.readBaselineDiagnostics ?? ((base: string, command: string) => readMergeBaseDiagnostics(base, command, cwd));
885
894
  // Set 주입은 기존 테스트 심이며 기준 revision이 없다. 실제 ChangedTsFiles 경로만 Git 관측을 요구한다.
886
895
  const requiredExportFields = io.requiredExportFields ?? ((changed: ReadonlySet<string>, base: string) => base === 'injected test seam'
@@ -0,0 +1,148 @@
1
+ #!/bin/sh
2
+ # FENCE-LIGHT (0.2.23) — sourced by the installed hq-fence wrapper (src/hq/fence-wrapper.ts renderHqFenceWrapper),
3
+ # from the installed package root, only when "$CONFIG_DIR/hq/lease-cache" exists. Inherits ROLE, "$@", BUN, ENTRY,
4
+ # CONFIG_DIR, LOG, log_line, alert. Always exits.
5
+ #
6
+ # Cache line (written only by a successful holder renewal in hqHeartbeat; removed at every heartbeat start,
7
+ # by every successful lease action and by every CLI «do not run»):
8
+ # <holder> <generation> <expiresAt> <host> <machine> <confirmedAt>
9
+ #
10
+ # Fast path (no bun, no network) ONLY when every check below holds; anything else is DECISION=cli, i.e. the
11
+ # same installed CLI decision as before (`hq fence --role`), under the role's time limit.
12
+ # holder = cache host = ~/.elanous-hq/host · machine = `hostname` · confirmedAt <= now < confirmedAt+660
13
+ # now < expiresAt <= confirmedAt+660 · local.json starts {"holder":<it>,"generation":<it> · seen-generation <= it
14
+ # Every file one line; numbers without leading zeros (an arithmetic error must never abort before the CLI).
15
+ # There is no fast «skip»: a cache that names another holder goes to the CLI.
16
+ #
17
+ # Time limit per role (seconds). The watchdog is GNU timeout: it puts the fenced command in its own process
18
+ # group and signals only that group (TERM, then KILL after 5s) — never anything by name.
19
+ case "$ROLE" in
20
+ telegram-poller|release-run) LIMIT=3600 ;;
21
+ seat-loop) LIMIT=1800 ;;
22
+ cron|conatus) LIMIT=900 ;;
23
+ git-push|ledger-cli) LIMIT=120 ;;
24
+ *) LIMIT= ;;
25
+ esac
26
+
27
+ # Watchdog: PATH first (cron PATH is /usr/bin:/bin), then Homebrew coreutils. HQ_FENCE_WATCHDOGS overrides the
28
+ # absolute candidates (tests). None found = the legacy CLI command without a limit, with one evidence line.
29
+ TIMEOUT=
30
+ for t in timeout gtimeout ${HQ_FENCE_WATCHDOGS-/opt/homebrew/bin/timeout /opt/homebrew/bin/gtimeout /usr/local/bin/timeout /usr/local/bin/gtimeout}; do
31
+ case "$t" in
32
+ /*) if [ -x "$t" ]; then TIMEOUT=$t; break; fi ;;
33
+ *) p=$(command -v "$t" 2>/dev/null) && [ -n "$p" ] && { TIMEOUT=$p; break; } ;;
34
+ esac
35
+ done
36
+
37
+ DECISION=cli
38
+ WHY=
39
+ FL_CACHE="$CONFIG_DIR/hq/lease-cache"
40
+ FL_HOST_FILE="$HOME/.elanous-hq/host"
41
+ FL_LOCAL="$CONFIG_DIR/hq/local.json"
42
+ FL_SEEN="$HOME/.elanous-hq/seen-generation"
43
+ if [ -z "$LIMIT" ]; then WHY=unknown-role
44
+ elif [ $# -eq 0 ] || [ -z "$*" ]; then WHY=no-command
45
+ elif [ -z "$TIMEOUT" ]; then WHY=no-watchdog
46
+ elif [ -L "$FL_CACHE" ] || [ ! -f "$FL_CACHE" ] || [ ! -r "$FL_CACHE" ]; then WHY=cache-unreadable
47
+ elif [ -L "$FL_HOST_FILE" ] || [ ! -f "$FL_HOST_FILE" ] || [ ! -r "$FL_HOST_FILE" ]; then WHY=no-host-file
48
+ elif [ ! -f "$FL_LOCAL" ] || [ ! -r "$FL_LOCAL" ]; then WHY=no-local-state
49
+ else
50
+ HOLDER= GENERATION= EXPIRES= CACHE_HOST= CACHE_MACHINE= CONFIRMED= EXTRA= THIS_HOST= LOCAL_LINE= SEEN=
51
+ CACHE_MORE=0 LOCAL_MORE=0
52
+ # Each file must be exactly one newline-terminated line: a second read that succeeds, or that hits EOF
53
+ # with unterminated text, means more content.
54
+ { IFS=' ' read -r HOLDER GENERATION EXPIRES CACHE_HOST CACHE_MACHINE CONFIRMED EXTRA || CACHE_MORE=1
55
+ _FL_REST=; if IFS= read -r _FL_REST || [ -n "$_FL_REST" ]; then CACHE_MORE=1; fi; } < "$FL_CACHE"
56
+ IFS= read -r THIS_HOST < "$FL_HOST_FILE" || true
57
+ { IFS= read -r LOCAL_LINE || LOCAL_MORE=1
58
+ _FL_REST=; if IFS= read -r _FL_REST || [ -n "$_FL_REST" ]; then LOCAL_MORE=1; fi; } < "$FL_LOCAL"
59
+ WHY=malformed
60
+ case "$HOLDER" in ''|*[!A-Za-z0-9_.-]*) ;; *)
61
+ case "$CACHE_MACHINE" in ''|*[!A-Za-z0-9_.-]*) ;; *)
62
+ case "$GENERATION" in ''|0*|*[!0-9]*) ;; *)
63
+ case "$EXPIRES" in ''|0*|*[!0-9]*) ;; *)
64
+ case "$CONFIRMED" in ''|0*|*[!0-9]*) ;; *)
65
+ if [ "$CACHE_MORE" = 1 ] || [ -n "$EXTRA" ] || [ "${#GENERATION}" -gt 15 ] || [ "${#EXPIRES}" -gt 12 ] || [ "${#CONFIRMED}" -gt 12 ]; then WHY=malformed
66
+ elif [ "$HOLDER" != "$THIS_HOST" ] || [ "$CACHE_HOST" != "$THIS_HOST" ]; then WHY=not-this-host
67
+ else
68
+ THIS_MACHINE=$(hostname)
69
+ THIS_MACHINE=${THIS_MACHINE%.local}
70
+ NOW=$(date +%s)
71
+ if [ "$CACHE_MACHINE" != "$THIS_MACHINE" ]; then WHY=other-machine
72
+ elif [ "$CONFIRMED" -gt "$NOW" ] || [ "$NOW" -ge "$((CONFIRMED + 660))" ] \
73
+ || [ "$EXPIRES" -le "$NOW" ] || [ "$EXPIRES" -gt "$((CONFIRMED + 660))" ]; then WHY=stale
74
+ else
75
+ # The CLI's own host-local view must name the same holder and generation as its leading top-level
76
+ # fields — hq.ts writeLocal is JSON.stringify({ holder, generation, ... }) on one line. Anchored at «{»,
77
+ # so a nested or later «holder» never matches; any other shape goes to the CLI.
78
+ if [ "$LOCAL_MORE" = 1 ]; then WHY=local-malformed
79
+ else
80
+ case "$LOCAL_LINE" in
81
+ '{"holder":"'"$HOLDER"'","generation":'"$GENERATION"[,}]*) WHY= ;;
82
+ *) WHY=local-mismatch ;;
83
+ esac
84
+ fi
85
+ if [ -z "$WHY" ] && [ -f "$FL_SEEN" ]; then
86
+ IFS= read -r SEEN < "$FL_SEEN" || true
87
+ case "$SEEN" in
88
+ ''|0*|*[!0-9]*) WHY=seen-unreadable ;;
89
+ *) if [ "${#SEEN}" -gt 15 ] || [ "$SEEN" -gt "$GENERATION" ]; then WHY=seen-newer-generation; fi ;;
90
+ esac
91
+ fi
92
+ if [ -z "$WHY" ]; then DECISION=run; WHY=fresh-holder; fi
93
+ fi
94
+ fi
95
+ ;; esac ;; esac ;; esac ;; esac ;; esac
96
+ fi
97
+
98
+ if [ "$DECISION" = run ]; then
99
+ export ELANOUS_HQ_GENERATION="$GENERATION"
100
+ "$TIMEOUT" -k 5 "$LIMIT" /bin/sh -c "$*"
101
+ rc=$?
102
+ elif [ -n "$TIMEOUT" ] && [ -n "$LIMIT" ]; then
103
+ # Same installed CLI decision as the legacy wrapper, bounded by the role limit.
104
+ "$TIMEOUT" -k 5 "$LIMIT" "$BUN" "$ENTRY" --config-dir "$CONFIG_DIR" hq fence --role "$ROLE" -- /bin/sh -c "$*"
105
+ rc=$?
106
+ else
107
+ # Unknown role (the CLI rejects it) or no watchdog binary: exactly the legacy command, unbounded.
108
+ if [ "$WHY" = no-watchdog ]; then log_line "fence watchdog unavailable (role=$ROLE) - CLI fence without time limit"; fi
109
+ "$BUN" "$ENTRY" --config-dir "$CONFIG_DIR" hq fence --role "$ROLE" -- /bin/sh -c "$*"
110
+ rc=$?
111
+ fi
112
+
113
+ TIMED_OUT=0
114
+ if [ -n "$TIMEOUT" ] && [ -n "$LIMIT" ] && { [ "$rc" -eq 124 ] || [ "$rc" -eq 137 ]; }; then
115
+ TIMED_OUT=1
116
+ log_line "fence timeout role=$ROLE limit=${LIMIT}s rc=$rc decision=$DECISION reason=$WHY"
117
+ echo "hq-fence: timeout role=$ROLE limit=${LIMIT}s rc=$rc" >&2
118
+ fi
119
+
120
+ # LOOPCHECK-FENCE streak: the CLI records it on its own path; the fast path (and a CLI killed by the watchdog)
121
+ # records through bun only when it matters — a failure, or a success that must reset a nonzero streak.
122
+ if [ "$DECISION" = run ] || [ "$TIMED_OUT" = 1 ]; then
123
+ RECORD=0
124
+ if [ "$rc" -ne 0 ]; then RECORD=1
125
+ else
126
+ FL_OUTCOME="$CONFIG_DIR/hq/fence-outcomes/$ROLE.json"
127
+ if [ -f "$FL_OUTCOME" ]; then
128
+ OUTCOME_LINE=
129
+ IFS= read -r OUTCOME_LINE < "$FL_OUTCOME" || true
130
+ case "$OUTCOME_LINE" in '{"consecutiveFailures":0,'*) ;; *) RECORD=1 ;; esac
131
+ fi
132
+ fi
133
+ if [ "$RECORD" = 1 ]; then
134
+ "$TIMEOUT" -k 5 20 "$BUN" "$ENTRY" --config-dir "$CONFIG_DIR" hq fence-wrapper record "$ROLE" "$rc" \
135
+ || log_line "fence outcome record failed (role=$ROLE rc=$rc)"
136
+ fi
137
+ fi
138
+
139
+ if [ "$rc" -ne 0 ]; then
140
+ if [ -n "$TIMEOUT" ]; then
141
+ # Bounded: an unavailable owner channel must not strand a cron fence.
142
+ "$TIMEOUT" -k 5 20 "$BUN" "$ENTRY" --config-dir "$CONFIG_DIR" hq fence-wrapper alert "hq-fence: fence failed (rc=$rc, role=$ROLE)" \
143
+ || { echo "hq-fence: owner alert failed: fence failed (rc=$rc, role=$ROLE)" >&2; log_line "owner alert failed: fence failed (rc=$rc, role=$ROLE)"; }
144
+ else
145
+ alert "hq-fence: fence failed (rc=$rc, role=$ROLE)"
146
+ fi
147
+ fi
148
+ exit "$rc"
@@ -0,0 +1,51 @@
1
+ import { resolve } from 'node:path';
2
+ import ts from 'typescript';
3
+
4
+ /** Select root files affected by changed TypeScript files through the resolved reverse-import graph.
5
+ * Paths in rootNames are preserved for the compiler; changed paths may be relative to cwd.
6
+ * This is selection only: the caller owns project scope, hub policy and compiler execution.
7
+ */
8
+ export function selectAffectedRootNames(
9
+ rootNames: readonly string[],
10
+ changedFiles: ReadonlySet<string>,
11
+ compilerOptions: ts.CompilerOptions,
12
+ host: ts.ModuleResolutionHost = ts.sys,
13
+ cwd = process.cwd(),
14
+ ): string[] {
15
+ const absolute = (file: string) => resolve(cwd, file);
16
+ const roots = new Set(rootNames.map(absolute));
17
+ const queue = [...changedFiles].filter((file) => /\.[cm]?tsx?$/.test(file)).map(absolute);
18
+ // No changed TypeScript file: nothing can be affected, so the dependency graph is never read.
19
+ if (queue.length === 0) return [];
20
+ const reverse = new Map<string, Set<string>>();
21
+ const pending = [...roots];
22
+ const visited = new Set<string>();
23
+
24
+ while (pending.length > 0) {
25
+ const file = pending.pop()!;
26
+ if (visited.has(file)) continue;
27
+ visited.add(file);
28
+ const source = host.readFile?.(file);
29
+ if (source === undefined) throw new Error(`Cannot read typecheck root dependency: ${file}`);
30
+ for (const imported of ts.preProcessFile(source, true, true).importedFiles) {
31
+ const dependency = ts.resolveModuleName(imported.fileName, file, compilerOptions, host).resolvedModule?.resolvedFileName;
32
+ if (!dependency) continue;
33
+ const path = absolute(dependency);
34
+ if (!reverse.has(path)) reverse.set(path, new Set());
35
+ reverse.get(path)!.add(file);
36
+ if (!visited.has(path)) pending.push(path);
37
+ }
38
+ }
39
+
40
+ // A deleted module cannot be resolved from the current tree. Without a previous
41
+ // dependency graph, an empty reverse edge is not evidence that no root imports it.
42
+ if (queue.some((file) => !host.fileExists(file))) return [...rootNames];
43
+ const affected = new Set<string>();
44
+ while (queue.length > 0) {
45
+ const file = queue.pop()!;
46
+ if (affected.has(file)) continue;
47
+ affected.add(file);
48
+ for (const importer of reverse.get(file) ?? []) queue.push(importer);
49
+ }
50
+ return rootNames.filter((file) => affected.has(absolute(file)));
51
+ }
@@ -17,11 +17,15 @@ import { resolveGrokCredential } from '../src/grok/credential.js';
17
17
  import { debug } from '../src/debug/log.js';
18
18
  import { getOpenAiRelaySharedSecret, hydrateEnvFromKeyCache } from '../src/config.js';
19
19
  import { registerLogStoreSink } from '../src/mss/logging/log-store.js';
20
+ import { getUserConfig } from '../src/user-config.js';
20
21
 
21
22
  // ⛔ 독립 프로세스라 데몬의 부팅 배선을 안 탄다 — 스토어 싱크를 «직접» 단다.
22
23
  // 이걸 안 달면 debug.log 가 화면에만 남고 `elanous logs` 조회에 «영영 안 닿는다»
23
24
  // (2026-08-23 실측: nexus.openai-relay 는 닿았고 이 프로세스 자기 로그는 0건이었다).
24
- registerLogStoreSink(debug.registerSink.bind(debug), 'openai-relay');
25
+ // 🩸 10-09 22:2x: 보존 설정 없이 등록하면 기본 상한 500MB 로 시작 보존이 돈다 — 운영 config 는 4000MB 인데
26
+ // 레일 설치마다 재기동되는 이 프로세스가 1.1GB logs.db 의 행을 최대 50% 지웠다(«지운 주체가 안 보이는» 소실).
27
+ // 다른 독립 스크립트처럼 config 의 보존 값을 넘긴다.
28
+ registerLogStoreSink(debug.registerSink.bind(debug), 'openai-relay', getUserConfig().logs.retention);
25
29
 
26
30
  const MODELS_PATH = '/v1/models';
27
31
  const HEALTH_PATH = '/healthz';