elanous 0.2.43 → 0.2.44

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 (544) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/{Om5xS9jpjSXJCeTNGYEi4 → HMXsxdy5MIIcHPMHv1wD4}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{3557ac4a.c8931684475018ad.js → 08334415.f0e80896acbef722.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1032-78ba4f6391258cab.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1082-53f86a26e03d309d.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1109-7d0e264f6f2edbc7.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1124-7c26330402481143.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/118.2a89982fe4276880.js +23 -0
  10. package/apps/pwa/out/_next/static/chunks/1244.6c435dbf1bf21d8a.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1252.9e665904d3aa3b1a.js +32 -0
  12. package/apps/pwa/out/_next/static/chunks/1266.a46cc33cb6a72d75.js +104 -0
  13. package/apps/pwa/out/_next/static/chunks/{3955.6922286237f2ac2b.js → 1306.967240ede9a0f757.js} +2 -2
  14. package/apps/pwa/out/_next/static/chunks/1344.3b95f3bd1b77a3fe.js +94 -0
  15. package/apps/pwa/out/_next/static/chunks/{5628.6ddb2d5ffba4ff4c.js → 1401.22dfe92640a2b1ac.js} +4 -4
  16. package/apps/pwa/out/_next/static/chunks/1431-f7c78bd5be21e011.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/1451-cdd35a8a0b31834b.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/{2573.387a707f6f9d720c.js → 1694.18debfd77562e56d.js} +2 -2
  19. package/apps/pwa/out/_next/static/chunks/1708-f03d587b7a7545c8.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/1775-fa7152bdeff6c95f.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/178-4da509cd7266672a.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/{7910-6f139bcafd238b9f.js → 1850-522de4ee34957210.js} +1 -1
  23. package/apps/pwa/out/_next/static/chunks/1876-c6f6e0ddcc76c6a1.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/1976.097066b072432242.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/{1406.a1dc2ab6f8449374.js → 1978.eeb60a606dc5deac.js} +2 -2
  26. package/apps/pwa/out/_next/static/chunks/{3402.44b565b314f2263c.js → 2043.e233e3b5a3e790f5.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/2150.71b94e3348107c83.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2158.ebc6fc5a10280ab7.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/{3694.e0099884345f0198.js → 2216.802962c04f40a26e.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/2294.7890edcfa046c97d.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/235.c89aaae4bcd6233a.js +74 -0
  32. package/apps/pwa/out/_next/static/chunks/239.de075467b5523469.js +287 -0
  33. package/apps/pwa/out/_next/static/chunks/{1200.6a37c202f9f17e9a.js → 249.ba7051590d603c8f.js} +3 -3
  34. package/apps/pwa/out/_next/static/chunks/2571.a6ac4e26c8618403.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/2610.e149cd564a08913e.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/2705.9816f3c244f8b85f.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/2801.afeb8a4dae22f85f.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/{3935.16701e33f8982dc9.js → 2954.bbefc95d6b20e0d8.js} +1 -1
  39. package/apps/pwa/out/_next/static/chunks/{aa57532f.510551854ff239b1.js → 2e0f720a.a0697c08e3806a60.js} +1 -1
  40. package/apps/pwa/out/_next/static/chunks/3042.96ec235fe41c8d4e.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3097-8e358f158acef46b.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3205-93b1abe28b4fb16a.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3273.b4434f0dcae7eb29.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3311.9cbc43ea0c90d60c.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{5930.8b4df3b46c32b05a.js → 3349.b5f09ee474d9533e.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/{5866.366966af47fdde5d.js → 3503.a47a9755fb4d97b0.js} +1 -1
  47. package/apps/pwa/out/_next/static/chunks/3506-5f429b3b7e1392b0.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/{7900.096f455c7c1efc53.js → 3843.bad404d008893291.js} +2 -2
  49. package/apps/pwa/out/_next/static/chunks/3877-4b40e530b47e3bf9.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/435-ce2958253cf7de61.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/{8588.d1c6a2903727ce87.js → 4393.28fa5228d0eec217.js} +3 -3
  52. package/apps/pwa/out/_next/static/chunks/4404.7281c847c6e10dfc.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/{8062-7cd0bcc7f01455ba.js → 4415-b9d6a90960920a4a.js} +3 -3
  54. package/apps/pwa/out/_next/static/chunks/{8313-dfa1021bb58a46d6.js → 447-5b304de1fe098f43.js} +1 -1
  55. package/apps/pwa/out/_next/static/chunks/4484-8ebea83d431e6fae.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/{6944.309f4e3ea54d1537.js → 4502.bdcc877abd437a05.js} +1 -1
  57. package/apps/pwa/out/_next/static/chunks/4599-f95790fc5c65b8df.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/{3072.01338851ca21a6f7.js → 46.57c783fa4884714f.js} +2 -2
  59. package/apps/pwa/out/_next/static/chunks/463-b9114e411f33728e.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/4659.a57d1f0c5d754cd2.js +36 -0
  61. package/apps/pwa/out/_next/static/chunks/4722-a847e7a28115035f.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/{8986.8e2e4efbfa655c59.js → 4757.67c6d7473a038e78.js} +1 -1
  63. package/apps/pwa/out/_next/static/chunks/4874-c86f878ec4502ad3.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/4891.3f80ba517a3b2373.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/{8205.282ca4bb62d54a0a.js → 4998.810ca8833084caa9.js} +2 -2
  66. package/apps/pwa/out/_next/static/chunks/4f98febc.ea5841d4d616bfb2.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/{5789.2da35c258292e1e5.js → 5052.7dbb12a55d4f18f5.js} +1 -1
  68. package/apps/pwa/out/_next/static/chunks/5166-ca73b3e361085a6d.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/5180-039f4a18b07ad387.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/5232.5a2ce4daf7a9e11d.js +115 -0
  71. package/apps/pwa/out/_next/static/chunks/{9770.5f75bc6088b16109.js → 5439.3fec6dbce29ecb36.js} +1 -1
  72. package/apps/pwa/out/_next/static/chunks/{1313-19f737e0222c4444.js → 5612-074d9a5e00dfac6a.js} +1 -1
  73. package/apps/pwa/out/_next/static/chunks/5675-01989d524a84c505.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/5751.af641a1adf5ec697.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/5758-c6cb98714d18ab0c.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/578eded8.b582637306e16964.js +122 -0
  77. package/apps/pwa/out/_next/static/chunks/{3969.272ee7f9fd6c62e5.js → 5790.5eb06a653ebd8571.js} +1 -1
  78. package/apps/pwa/out/_next/static/chunks/5853-4033e5bd5afbe06b.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/5904.97d70bb7f46b2db7.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/{6540.c7bef57ad8f90a87.js → 5989.7ecd362c5c44b747.js} +3 -3
  81. package/apps/pwa/out/_next/static/chunks/{0ad6802e.ae7afb63fdcb4491.js → 5a34fb2f.52f1b4e1baebb48a.js} +3 -3
  82. package/apps/pwa/out/_next/static/chunks/{0966f8a1.745fcd44f64a87ea.js → 5a5078f8.2099200e5ea95e16.js} +1 -1
  83. package/apps/pwa/out/_next/static/chunks/6036-c302c34ff0b3d410.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/606.ef81c313381f4264.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/616.1af54a928b1ba704.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/6201.bc936f71f613a8e9.js +41 -0
  87. package/apps/pwa/out/_next/static/chunks/6204-fdc86e0e64c4f92d.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/{2144.25b292396712196d.js → 6245.1182e007e9d230d9.js} +2 -2
  89. package/apps/pwa/out/_next/static/chunks/{363bfab3.9623b9f89363541f.js → 63699a35.17262e162bc514b2.js} +1 -1
  90. package/apps/pwa/out/_next/static/chunks/6420.494801a80030160c.js +27 -0
  91. package/apps/pwa/out/_next/static/chunks/{d96660fb.cbc21a2a88539dbb.js → 6549dad0.2740b25e51bf8f05.js} +7 -7
  92. package/apps/pwa/out/_next/static/chunks/{5564.9e72532188f57586.js → 6881.9e7955847640c7fe.js} +4 -4
  93. package/apps/pwa/out/_next/static/chunks/6931.fcdfb94141e67b3d.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/6991-8e081c6ce38c0ba1.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{3903.3ef4656c67572764.js → 7010.1bbd17a7f2b3e376.js} +1 -1
  96. package/apps/pwa/out/_next/static/chunks/7029.d1466acf55fae2ed.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/7152-a123aa8e129c131f.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7455.196168fffac3b9c4.js +24 -0
  99. package/apps/pwa/out/_next/static/chunks/7638.6ca4770dd1129138.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/7649-f37d76260e5e2a5a.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/{2312.0c8b61e22d3136d7.js → 7679.32c40cdd14f20b4a.js} +1 -1
  102. package/apps/pwa/out/_next/static/chunks/7751.04bfbd16b4c6cd0a.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/7864.b1ff31d4030b8994.js +148 -0
  104. package/apps/pwa/out/_next/static/chunks/7869-c47bd2c075c1fefa.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/{4199.ce86b281fd0a60b7.js → 8442.2f09ca969d631615.js} +1 -1
  106. package/apps/pwa/out/_next/static/chunks/8445.2738dbd59a78c78c.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8447.5510c439f9938c6d.js +286 -0
  108. package/apps/pwa/out/_next/static/chunks/8551.f762945c2cda2e95.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/8635-57a9d8d9db70f4f1.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/{fb7d20d5-6892502b6ee39ca6.js → 86961958-4b0689a5048f756b.js} +1 -1
  111. package/apps/pwa/out/_next/static/chunks/8709.3c6019bb18f8554f.js +8 -0
  112. package/apps/pwa/out/_next/static/chunks/8759.c999528a0a907bf6.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/87f498e5-0881de09f2e44707.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/8843.c3197f904c952b81.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/{cb0f8df8.09a4a6be97e3fc5f.js → 892fd990.456232f326cc39c2.js} +1 -1
  116. package/apps/pwa/out/_next/static/chunks/{837-81336ebaca8198a8.js → 8965-135a2c9eaa2464cb.js} +1 -1
  117. package/apps/pwa/out/_next/static/chunks/8971-8d3b9c96f8a6c958.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9059.c8598d96f8e5e9cd.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9115.90447ae198b84eae.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9147.d9b0a02e0babc9b4.js +93 -0
  121. package/apps/pwa/out/_next/static/chunks/9204-83075f4b70c61cdc.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9244-c32ef14b5dc72bdf.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/930.2a9a30f964350c66.js +90 -0
  124. package/apps/pwa/out/_next/static/chunks/{8637.90f92d5c8db4732c.js → 9398.1f56e3f17795f43f.js} +1 -1
  125. package/apps/pwa/out/_next/static/chunks/9527.3e5ad31c891c5fcb.js +79 -0
  126. package/apps/pwa/out/_next/static/chunks/9571-4ac933e774d1225c.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-9fc644de2d8edae3.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/approvals/page-0c9dace2db62bee8.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f5e65c3dc9d89f2a.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/board/page-2a9c19b9a140b7b1.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/botlab/page-61533ad92141adfb.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/bots/page-112004ced6fd0329.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f733318c237a49d8.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/chat/page-51ea677d2d33bbc0.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/consult/page-428b41f2f9566e3c.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/control/page-1b29396ea90a61e5.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/decisions/page-cf83ec613ac904bf.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/design-check/page-3f4c0ecbc284bb5f.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/editor/page-b63c322f54f70cc6.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/exec/page-fe328c4ee9aac6b4.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/field/page-bfb855c584f0fb98.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/healthz/route-9fc644de2d8edae3.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/inside/page-47b1710c110eabd7.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/intake/page-42895214458bc6d2.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/layout-d03de0ebd8366e23.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/live/page-3ed6c47e4b1c61c2.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/live-run/page-ae653e9bf261c738.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/loops/page-23f3f0a0209c0ac4.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/market/page-88c691273aae66f9.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e187ac52a95538b3.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/morning/page-6e45828daed1295e.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/not-found-edb5d7287bb46186.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/observatory/page-4a7eaacd93c3f6a5.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ca073d43d74cc84.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1e9fee67b1199436.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-df1283ea963c6816.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/outputs/page-19fcf8d8301ccd18.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/page-5ab699e0303bbb40.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/reflection/page-7cde0d29756984c5.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-9d4c598e8ee22f7a.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/sessions/page-cc1609a71f44ec62.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-7659a9a1345bfaa9.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/settings/page-0afef60ecc0c4af5.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-a3553949f8f34f5f.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/setup/layout-9fc644de2d8edae3.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/setup/page-057a69702f3c67c7.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/share/page-c0f0e570f3f74c73.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/showroom/page-1825071ae34e3b89.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/tasks/page-6244e3e135d8ccfc.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/term/{page-0a815f34367b6db6.js → page-da787e8a10b8a82e.js} +1 -1
  171. package/apps/pwa/out/_next/static/chunks/app/today/page-1316d32498e2be42.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/trace/page-4df94572e343de2e.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/vault/page-708969f7475e88c1.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-c58add08c919a1dc.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/app/workflows/page-a24847f45e5d5bf9.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/app/workspace/page-acfec65a3a60e22e.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-3dfc598e6fbde245.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/framework-c658a626118411b7.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-4c73685fd891445b.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-6310f7e5de7dd01d.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-51c326bf48610be1.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-d0beadf754da59b0.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-acd243bfbf3f6732.js +1 -0
  184. package/apps/pwa/out/approvals/index.html +1 -1
  185. package/apps/pwa/out/approvals/index.txt +22 -22
  186. package/apps/pwa/out/autopilot/index.html +1 -1
  187. package/apps/pwa/out/autopilot/index.txt +22 -22
  188. package/apps/pwa/out/board/index.html +1 -1
  189. package/apps/pwa/out/board/index.txt +22 -22
  190. package/apps/pwa/out/botlab/index.html +1 -1
  191. package/apps/pwa/out/botlab/index.txt +21 -21
  192. package/apps/pwa/out/bots/index.html +1 -1
  193. package/apps/pwa/out/bots/index.txt +21 -21
  194. package/apps/pwa/out/ceo/index.html +1 -1
  195. package/apps/pwa/out/ceo/index.txt +22 -22
  196. package/apps/pwa/out/chat/index.html +1 -1
  197. package/apps/pwa/out/chat/index.txt +21 -21
  198. package/apps/pwa/out/consult/index.html +1 -1
  199. package/apps/pwa/out/consult/index.txt +22 -22
  200. package/apps/pwa/out/control/index.html +1 -1
  201. package/apps/pwa/out/control/index.txt +22 -22
  202. package/apps/pwa/out/decisions/index.html +1 -1
  203. package/apps/pwa/out/decisions/index.txt +21 -21
  204. package/apps/pwa/out/design-check/index.html +1 -1
  205. package/apps/pwa/out/design-check/index.txt +22 -22
  206. package/apps/pwa/out/editor/index.html +1 -1
  207. package/apps/pwa/out/editor/index.txt +22 -22
  208. package/apps/pwa/out/exec/index.html +1 -1
  209. package/apps/pwa/out/exec/index.txt +22 -22
  210. package/apps/pwa/out/field/index.html +1 -1
  211. package/apps/pwa/out/field/index.txt +22 -22
  212. package/apps/pwa/out/healthz +1 -1
  213. package/apps/pwa/out/index.html +1 -1
  214. package/apps/pwa/out/index.txt +21 -21
  215. package/apps/pwa/out/inside/index.html +1 -1
  216. package/apps/pwa/out/inside/index.txt +21 -21
  217. package/apps/pwa/out/intake/index.html +1 -1
  218. package/apps/pwa/out/intake/index.txt +22 -22
  219. package/apps/pwa/out/live/index.html +1 -1
  220. package/apps/pwa/out/live/index.txt +22 -22
  221. package/apps/pwa/out/live-run/index.html +1 -1
  222. package/apps/pwa/out/live-run/index.txt +22 -22
  223. package/apps/pwa/out/loops/index.html +1 -1
  224. package/apps/pwa/out/loops/index.txt +21 -21
  225. package/apps/pwa/out/market/index.html +1 -1
  226. package/apps/pwa/out/market/index.txt +21 -21
  227. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  228. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  229. package/apps/pwa/out/morning/index.html +1 -1
  230. package/apps/pwa/out/morning/index.txt +22 -22
  231. package/apps/pwa/out/observatory/index.html +1 -1
  232. package/apps/pwa/out/observatory/index.txt +22 -22
  233. package/apps/pwa/out/ops/checklist/index.html +1 -1
  234. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  235. package/apps/pwa/out/ops/release/index.html +1 -1
  236. package/apps/pwa/out/ops/release/index.txt +21 -21
  237. package/apps/pwa/out/ops/seats/index.html +1 -1
  238. package/apps/pwa/out/ops/seats/index.txt +21 -21
  239. package/apps/pwa/out/outputs/index.html +1 -1
  240. package/apps/pwa/out/outputs/index.txt +21 -21
  241. package/apps/pwa/out/reflection/index.html +1 -1
  242. package/apps/pwa/out/reflection/index.txt +22 -22
  243. package/apps/pwa/out/scheduler/index.html +1 -1
  244. package/apps/pwa/out/scheduler/index.txt +22 -22
  245. package/apps/pwa/out/sessions/index.html +1 -1
  246. package/apps/pwa/out/sessions/index.txt +21 -21
  247. package/apps/pwa/out/settings/devices/index.html +1 -1
  248. package/apps/pwa/out/settings/devices/index.txt +22 -22
  249. package/apps/pwa/out/settings/index.html +1 -1
  250. package/apps/pwa/out/settings/index.txt +22 -22
  251. package/apps/pwa/out/setup/done/index.html +1 -1
  252. package/apps/pwa/out/setup/done/index.txt +22 -22
  253. package/apps/pwa/out/setup/index.html +1 -1
  254. package/apps/pwa/out/setup/index.txt +22 -22
  255. package/apps/pwa/out/share/index.html +1 -1
  256. package/apps/pwa/out/share/index.txt +22 -22
  257. package/apps/pwa/out/showroom/index.html +1 -1
  258. package/apps/pwa/out/showroom/index.txt +21 -21
  259. package/apps/pwa/out/tasks/index.html +1 -1
  260. package/apps/pwa/out/tasks/index.txt +22 -22
  261. package/apps/pwa/out/term/index.html +1 -1
  262. package/apps/pwa/out/term/index.txt +22 -22
  263. package/apps/pwa/out/today/index.html +1 -1
  264. package/apps/pwa/out/today/index.txt +22 -22
  265. package/apps/pwa/out/trace/index.html +1 -1
  266. package/apps/pwa/out/trace/index.txt +22 -22
  267. package/apps/pwa/out/vault/index.html +1 -1
  268. package/apps/pwa/out/vault/index.txt +22 -22
  269. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  270. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  271. package/apps/pwa/out/workflows/index.html +1 -1
  272. package/apps/pwa/out/workflows/index.txt +22 -22
  273. package/apps/pwa/out/workspace/index.html +1 -1
  274. package/apps/pwa/out/workspace/index.txt +22 -22
  275. package/apps/pwa/out/worktrees/index.html +1 -1
  276. package/apps/pwa/out/worktrees/index.txt +22 -22
  277. package/graphs/overlays/README.md +6 -0
  278. package/graphs/release/release-loop.yaml +33 -17
  279. package/graphs/units/verbs/make-doc.yaml +1 -0
  280. package/package.json +1 -1
  281. package/scripts/bench-metering-plan.ts +229 -0
  282. package/scripts/demo/demo1104-parallel-host.ts +56 -0
  283. package/scripts/demo/demo1104-parallel.ts +72 -0
  284. package/scripts/public-leak-baseline.txt +0 -1
  285. package/scripts/release-loop/docs-node.ts +4 -2
  286. package/scripts/release-loop/gate-image-pin.ts +116 -2
  287. package/scripts/release-loop/gate-node.ts +217 -25
  288. package/scripts/release-loop/gate-progress-sim.ts +73 -0
  289. package/scripts/release-loop/notes-repair.ts +18 -1
  290. package/scripts/release-loop/preflight.ts +188 -8
  291. package/scripts/release-loop/render-warm-control-manifest.ts +22 -0
  292. package/scripts/release-loop/resume-release.ts +9 -7
  293. package/scripts/release-loop/resume.ts +13 -4
  294. package/scripts/release-loop/warm-control-forward.ts +178 -0
  295. package/scripts/retro-cycle.ts +30 -8
  296. package/scripts/rhythm/daily.ts +4 -1
  297. package/scripts/rhythm/linear-progress-sync.ts +28 -15
  298. package/scripts/ux-sim.ts +7 -1
  299. package/scripts/warm-pool-provider-config.ts +6 -1
  300. package/src/agent-mission/grok-auth-status.ts +78 -18
  301. package/src/agent-mission/mission-out.ts +2 -2
  302. package/src/agent-substrate/pr-reviewer.ts +147 -11
  303. package/src/agent-substrate/self-review-cli.ts +10 -2
  304. package/src/auto-research/research-fanout.ts +221 -0
  305. package/src/auto-research/research-turn.ts +282 -36
  306. package/src/autopilot/mission-codebase-gate.ts +7 -3
  307. package/src/cli/control-cli.ts +15 -6
  308. package/src/cli/log-event-names.ts +8 -0
  309. package/src/cli/setup-keys.ts +20 -8
  310. package/src/cli/tui-test-cli.ts +9 -5
  311. package/src/control-plane/ledger.ts +42 -4
  312. package/src/control-plane/member-tokens.ts +25 -2
  313. package/src/control-plane/ports.ts +8 -3
  314. package/src/control-plane/server.ts +26 -5
  315. package/src/core-turn/research-policy.ts +7 -1
  316. package/src/core-turn/run-core-turn.ts +186 -39
  317. package/src/core-turn/types.ts +2 -0
  318. package/src/dashboard/classic-sidetab-mission-job.ts +113 -24
  319. package/src/dashboard/classic-sidetab-mission-pair.ts +3 -2
  320. package/src/dashboard/classic-sidetab-mission-trio.ts +35 -12
  321. package/src/dashboard/classic-sidetab-mission.ts +2 -0
  322. package/src/dashboard/index.ts +9 -1
  323. package/src/dashboard/sidetab-runtime.ts +2 -0
  324. package/src/dashboard/visible-mission-diagnostics.ts +16 -0
  325. package/src/domains/retro-cycle-observation.ts +43 -0
  326. package/src/domains/retro-cycle.ts +13 -2
  327. package/src/domains/retro-proposals.ts +92 -0
  328. package/src/domains/retro-report.ts +6 -1
  329. package/src/graph-runner/graph-cli.ts +24 -1
  330. package/src/graph-runner/graph-grow-llm.ts +3 -1
  331. package/src/graph-runner/runner.ts +226 -30
  332. package/src/harness/harness-cli-command.ts +4 -2
  333. package/src/harness/harness-pod-dispatch.ts +3 -0
  334. package/src/index.ts +2 -2
  335. package/src/llm/child-first-llm-observation.ts +112 -0
  336. package/src/llm/provider-credentials.ts +60 -4
  337. package/src/llm/provider-failure-evidence.ts +44 -0
  338. package/src/llm.ts +170 -11
  339. package/src/mcp/client.ts +7 -0
  340. package/src/mcp/proxy-runtime.ts +6 -1
  341. package/src/mcp/server.ts +54 -0
  342. package/src/native-tool-catalog.ts +2 -2
  343. package/src/nexus/api/consult-requests.ts +18 -6
  344. package/src/nexus/api/discord-trigger-bot.ts +6 -6
  345. package/src/nexus/api/graphs-api.ts +4 -2
  346. package/src/nexus/api/grokbot-trigger-bot.ts +206 -0
  347. package/src/nexus/api/telegram-trigger-bot.ts +6 -6
  348. package/src/nexus/boot/register-mcp-clients.ts +114 -8
  349. package/src/nexus/index.ts +15 -0
  350. package/src/nexus/outbound/grokbot-adapter.ts +71 -0
  351. package/src/nexus/outbound/router.ts +33 -13
  352. package/src/oauth/codex-owner-mirror.ts +47 -10
  353. package/src/onboarding/first-run.ts +44 -6
  354. package/src/preview/terminal.ts +22 -7
  355. package/src/prompt-enhance/enhance.ts +10 -0
  356. package/src/pty-shell/pty-write-provenance.ts +21 -3
  357. package/src/pty-shell/registry.ts +9 -2
  358. package/src/release-loop/proposal-auto-place.ts +83 -0
  359. package/src/research/axis-fanout.ts +40 -5
  360. package/src/research/lenses/second-order.ts +312 -0
  361. package/src/self-dev/dev-cli.ts +3 -1
  362. package/src/self-dev/draft-sweep.ts +31 -10
  363. package/src/self-dev/draft-triage-rules.ts +60 -3
  364. package/src/self-dev/run-supervisor.ts +152 -2
  365. package/src/self-implement/goal-author.ts +208 -23
  366. package/src/self-implement/graph-overlay-yaml.ts +151 -0
  367. package/src/self-implement/graph-yaml.ts +68 -2
  368. package/src/self-implement/orchestrator.ts +62 -15
  369. package/src/self-implement/test-scenario-request.ts +37 -6
  370. package/src/session/chat.ts +2 -2
  371. package/src/session-runtime/index.ts +37 -5
  372. package/src/sidetab-core/model.ts +205 -10
  373. package/src/sidetab-core/visible-agent-mission-pair.ts +51 -0
  374. package/src/sidetab-core/visible-agent-mission.ts +105 -47
  375. package/src/skills/tools/omni-search.ts +4 -2
  376. package/src/task-agent/parent-host.ts +19 -1
  377. package/src/task-agent/recall-inject.ts +98 -0
  378. package/src/task-agent/task-hand.ts +26 -7
  379. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +19 -1
  380. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +15 -0
  381. package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +21 -9
  382. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +1 -1
  383. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +460 -96
  384. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +45 -3
  385. package/src/task-orchestrator/surfaces/self-implement-pod.ts +38 -8
  386. package/src/tool-hints/gate.ts +45 -14
  387. package/src/tool-hints/signals.ts +1 -1
  388. package/src/tool-hints/types.ts +2 -0
  389. package/src/tool-runtime/browser-hand-runtime.ts +11 -1
  390. package/src/tool-runtime/browser-runtime.ts +31 -18
  391. package/src/tool-runtime/elanous-linear-secretary-runtime.ts +152 -36
  392. package/src/tool-runtime/types.ts +2 -0
  393. package/src/tui/entry.ts +27 -7
  394. package/src/tui/sidetab/attach.ts +112 -0
  395. package/src/tui/sidetab/list.ts +3 -2
  396. package/src/tui-client/next-dashboard-runtime.ts +52 -0
  397. package/src/ux-sim/draft-inventory-builder.ts +2 -1
  398. package/src/ux-sim/linear-secretary.ts +4 -12
  399. package/src/ux-sim/mock-scenario-catalog.json +32 -29
  400. package/src/ux-sim/mock-scenario-catalog.ts +55 -3
  401. package/src/ux-sim/release-sim-rig.ts +62 -18
  402. package/src/ux-sim/service-key-setup.ts +63 -0
  403. package/src/version/packed-revision.json +1 -1
  404. package/apps/pwa/out/_next/static/chunks/114.2b90424d1a3ce84c.js +0 -1
  405. package/apps/pwa/out/_next/static/chunks/1151-5c2bb8f002ca2dd6.js +0 -1
  406. package/apps/pwa/out/_next/static/chunks/1261-a616d5728e02e624.js +0 -1
  407. package/apps/pwa/out/_next/static/chunks/1357.3bbef3976c37f94a.js +0 -1
  408. package/apps/pwa/out/_next/static/chunks/1362-20adddfaf662b0fa.js +0 -1
  409. package/apps/pwa/out/_next/static/chunks/1737-9491fc6ab29b9ec6.js +0 -1
  410. package/apps/pwa/out/_next/static/chunks/1803-4f91a8e7dcaf042c.js +0 -1
  411. package/apps/pwa/out/_next/static/chunks/1961.a81b12872c3e93a9.js +0 -23
  412. package/apps/pwa/out/_next/static/chunks/1970cf59.2d4d8ce5d6c81853.js +0 -1
  413. package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +0 -1
  414. package/apps/pwa/out/_next/static/chunks/2073-ba274e00e4f9efb4.js +0 -1
  415. package/apps/pwa/out/_next/static/chunks/2268-53861f339e0b65a2.js +0 -1
  416. package/apps/pwa/out/_next/static/chunks/273.f156eee28f11af77.js +0 -1
  417. package/apps/pwa/out/_next/static/chunks/2873.d2140e5a82546401.js +0 -1
  418. package/apps/pwa/out/_next/static/chunks/3091.a5a4143dea33d197.js +0 -90
  419. package/apps/pwa/out/_next/static/chunks/3095.dc44586a5f83b86d.js +0 -1
  420. package/apps/pwa/out/_next/static/chunks/3113.d7472bbc27d580c7.js +0 -1
  421. package/apps/pwa/out/_next/static/chunks/3228-9650b6447b6fa288.js +0 -1
  422. package/apps/pwa/out/_next/static/chunks/360.ae9f9f4c33c395e8.js +0 -79
  423. package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +0 -286
  424. package/apps/pwa/out/_next/static/chunks/3744.54f87db52acfd1ab.js +0 -1
  425. package/apps/pwa/out/_next/static/chunks/4311-6dd3144002cc0c2d.js +0 -1
  426. package/apps/pwa/out/_next/static/chunks/4426-2b230fad00c88930.js +0 -1
  427. package/apps/pwa/out/_next/static/chunks/4445.7990c76b3751a918.js +0 -115
  428. package/apps/pwa/out/_next/static/chunks/4447-14c5161fa59166c7.js +0 -1
  429. package/apps/pwa/out/_next/static/chunks/4856-b0b8075bba8c53f4.js +0 -1
  430. package/apps/pwa/out/_next/static/chunks/4870-de370d65e73c0bb5.js +0 -1
  431. package/apps/pwa/out/_next/static/chunks/4885-2c989165c4b29fad.js +0 -1
  432. package/apps/pwa/out/_next/static/chunks/4894.fec2ca9e99caefa2.js +0 -1
  433. package/apps/pwa/out/_next/static/chunks/5093.8f04b7f8cb899a95.js +0 -94
  434. package/apps/pwa/out/_next/static/chunks/5122-2bb177cebf89e19a.js +0 -1
  435. package/apps/pwa/out/_next/static/chunks/5154.5f56dc3902e3d275.js +0 -36
  436. package/apps/pwa/out/_next/static/chunks/529.64ff7257180b2ac9.js +0 -1
  437. package/apps/pwa/out/_next/static/chunks/5394.5dabeb0c62293a28.js +0 -93
  438. package/apps/pwa/out/_next/static/chunks/5461.08bf2404ff38ec85.js +0 -1
  439. package/apps/pwa/out/_next/static/chunks/5474-22e08a85583209b2.js +0 -1
  440. package/apps/pwa/out/_next/static/chunks/5567-265df39ed8fe9dcb.js +0 -1
  441. package/apps/pwa/out/_next/static/chunks/5570-a94ae19811cb2046.js +0 -1
  442. package/apps/pwa/out/_next/static/chunks/5574-b47c9ef2dceff1fd.js +0 -1
  443. package/apps/pwa/out/_next/static/chunks/5730.43d7ccc09988e646.js +0 -1
  444. package/apps/pwa/out/_next/static/chunks/5824.da9527b15a3221e5.js +0 -1
  445. package/apps/pwa/out/_next/static/chunks/5963-c4d8469c52a0828b.js +0 -1
  446. package/apps/pwa/out/_next/static/chunks/6001.ec4049ceb3c43418.js +0 -27
  447. package/apps/pwa/out/_next/static/chunks/6120-471f03db1e299c0c.js +0 -1
  448. package/apps/pwa/out/_next/static/chunks/6175-41479e643aca1878.js +0 -1
  449. package/apps/pwa/out/_next/static/chunks/6291.a2de4f9787637075.js +0 -104
  450. package/apps/pwa/out/_next/static/chunks/6400-6699907c3537436a.js +0 -1
  451. package/apps/pwa/out/_next/static/chunks/6428.1f4327d6ae5fdf9a.js +0 -287
  452. package/apps/pwa/out/_next/static/chunks/644.02cb026fa44bcd0a.js +0 -1
  453. package/apps/pwa/out/_next/static/chunks/6466-6c87d60d3dd174fb.js +0 -1
  454. package/apps/pwa/out/_next/static/chunks/6773.d4264665ab31bec0.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/6822.3c789f1a8443e774.js +0 -1
  456. package/apps/pwa/out/_next/static/chunks/7261-8ff69d3b2ee671fd.js +0 -1
  457. package/apps/pwa/out/_next/static/chunks/7266.084c6bbc70035140.js +0 -1
  458. package/apps/pwa/out/_next/static/chunks/7271.5c0100e7320aa856.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/7429-bf5731358c8f2f68.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/7464.01f7a0ae1215fbe7.js +0 -1
  461. package/apps/pwa/out/_next/static/chunks/7479.0fcad5f37eb64f0c.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/7483.427a2fe2049e388d.js +0 -148
  463. package/apps/pwa/out/_next/static/chunks/7502-be74718178e13e56.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/7530.0889722b19572065.js +0 -24
  465. package/apps/pwa/out/_next/static/chunks/7645.5b2ee3ad45c55ea3.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/7788.7d1c79f1a8e18946.js +0 -1
  467. package/apps/pwa/out/_next/static/chunks/7966.f71c8958d1637548.js +0 -1
  468. package/apps/pwa/out/_next/static/chunks/8073.f6cf2f2c71aafbd0.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/8201.190b94088980f430.js +0 -74
  470. package/apps/pwa/out/_next/static/chunks/8447.7963352ef5f71b76.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/8574-868e8129525ef6d9.js +0 -1
  472. package/apps/pwa/out/_next/static/chunks/868.6e953be05bcf6dca.js +0 -41
  473. package/apps/pwa/out/_next/static/chunks/8706-e1fe0309343a2273.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/8749-06384cdfc4520add.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/8861-cc1fa1c7b920fa8e.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/8967-7dfebf710c9dec9d.js +0 -1
  477. package/apps/pwa/out/_next/static/chunks/8997-3c564dbb3b58b055.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/923.2034d10ae91e9c20.js +0 -1
  479. package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/943.39ae5e82f4f1893f.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/9469.0500480de55fb205.js +0 -32
  482. package/apps/pwa/out/_next/static/chunks/9810-2543267050e58b82.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/9870.8419702475254745.js +0 -8
  484. package/apps/pwa/out/_next/static/chunks/9941-376d1b74d51b01a4.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/9958.385434ab04241758.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-deea1450b17cb8dc.js +0 -1
  487. package/apps/pwa/out/_next/static/chunks/app/approvals/page-70985b904f8650ef.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a2e15e33e56a4353.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/app/board/page-fc72ce2db12d6ca9.js +0 -1
  490. package/apps/pwa/out/_next/static/chunks/app/botlab/page-be03e41f9436ebd9.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/app/bots/page-35a35999382da3f2.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/app/ceo/page-3ff5b1e6ca88b848.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/app/chat/page-a65101300a0ee5c1.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/app/consult/page-3aca5b6d67dba511.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/app/control/page-45b8ab0a71e61314.js +0 -1
  496. package/apps/pwa/out/_next/static/chunks/app/decisions/page-53046e282d4cda8e.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/app/design-check/page-17809e60e8354c17.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/app/editor/page-fd2442d347bf5898.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/app/exec/page-e9d720d6fc082e21.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/app/field/page-6b8b4267bab0a677.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/app/healthz/route-deea1450b17cb8dc.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/app/inside/page-8bcf6233ac7c17af.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/app/intake/page-7cc25591cfc2126f.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/app/layout-053e871f35c9beba.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/app/live/page-eff819f0c2d5e084.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/app/live-run/page-4d7e9d8db5274a87.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/app/loops/page-2b2d8f5aa5f69ad4.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/app/market/page-0b8f92c5062e68b1.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1bd9d0fdac2ced3d.js +0 -1
  510. package/apps/pwa/out/_next/static/chunks/app/morning/page-9ee28f7df07428ea.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/app/not-found-44b7a1ff468c6648.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/app/observatory/page-cbc6523711dc1b65.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-fdad47899c2695be.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-79a8b5fee4c20871.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-03e8ac9606aeaffb.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/app/outputs/page-4cd55c55ec287e2f.js +0 -1
  517. package/apps/pwa/out/_next/static/chunks/app/page-db17b4305404161e.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/app/reflection/page-30041d848350fd02.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c540da022dbf86b0.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9399efc538da057f.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ca2d09128c585ca4.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/app/settings/page-0e2635aecd343038.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ef7f4399b6b7726e.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/app/setup/layout-deea1450b17cb8dc.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/app/setup/page-caf530535b875468.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/app/share/page-eaa20c1543a5fd8e.js +0 -1
  527. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c541eb1b75120f61.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/app/tasks/page-ab5e213eda9479f4.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/app/today/page-e858ba0ed9393b68.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/app/trace/page-1638ee9dd6e0582f.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/app/vault/page-4cf5a399109391f2.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b4396321238798ec.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/app/workflows/page-cb72bfd21006781a.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6135d0242afbc434.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a1dccf907eddb856.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/c7945435-b44d4dbe90ba0dcb.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/ea514caa.05a24f78d9dffe5f.js +0 -122
  538. package/apps/pwa/out/_next/static/chunks/framework-e8a911e19b1be41f.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/main-7022f418fabba021.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/main-app-e5f15df755756a1e.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/pages/_app-4525f91e36940c9b.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/pages/_error-140f0e519c085b0f.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/webpack-8f22ef63dcb865b1.js +0 -1
  544. /package/apps/pwa/out/_next/static/{Om5xS9jpjSXJCeTNGYEi4 → HMXsxdy5MIIcHPMHv1wD4}/_ssgManifest.js +0 -0
@@ -0,0 +1,112 @@
1
+ import type { RunLedgerEntry } from '../self-implement/run-ledger.js';
2
+ import { redactSecretText } from '../debug/log.js';
3
+
4
+ export interface ChildFirstLlmEvent {
5
+ readonly runId: string;
6
+ readonly event: 'child-first-llm-call' | 'child-first-tool-call';
7
+ readonly data: Record<string, unknown>;
8
+ }
9
+
10
+ export type ChildFirstLlmWriter = (event: ChildFirstLlmEvent) => void | Promise<void>;
11
+
12
+ /** Appends one first-provider-call timeline per child run. The writer is fail-soft by contract. */
13
+ export function createChildFirstLlmRecorder(write: ChildFirstLlmWriter) {
14
+ const started = new Set<string>();
15
+ const responded = new Set<string>();
16
+ const toolCalled = new Set<string>();
17
+ return {
18
+ async start(input: { runId: string; provider: string; model: string; accountName?: string; at?: string }): Promise<void> {
19
+ const runId = input.runId.trim();
20
+ if (!runId || started.has(runId)) return;
21
+ started.add(runId);
22
+ await write({
23
+ runId, event: 'child-first-llm-call',
24
+ data: { status: 'started', provider: input.provider, model: input.model,
25
+ accountName: input.accountName ?? null, startedAt: input.at ?? new Date().toISOString() },
26
+ });
27
+ },
28
+ async response(input: { runId: string; status: 'ok' | 'error'; httpStatus?: number; error?: unknown; at?: string }): Promise<void> {
29
+ const runId = input.runId.trim();
30
+ if (!runId || !started.has(runId) || responded.has(runId)) return;
31
+ responded.add(runId);
32
+ const raw = input.error instanceof Error ? input.error.message : input.error == null ? '' : String(input.error);
33
+ const firstLine = redactSecretText(raw.split(/\r?\n/u, 1)[0] ?? '').replace(/\s+/gu, ' ').slice(0, 240);
34
+ await write({
35
+ runId, event: 'child-first-llm-call',
36
+ data: { status: input.status, ...(input.httpStatus === undefined ? {} : { httpStatus: input.httpStatus }),
37
+ ...(firstLine ? { errorFirstLine: firstLine } : {}), respondedAt: input.at ?? new Date().toISOString() },
38
+ });
39
+ },
40
+ async firstToolCall(input: { runId: string; at?: string }): Promise<void> {
41
+ const runId = input.runId.trim();
42
+ if (!runId || !started.has(runId) || toolCalled.has(runId)) return;
43
+ toolCalled.add(runId);
44
+ await write({ runId, event: 'child-first-tool-call', data: { at: input.at ?? new Date().toISOString() } });
45
+ },
46
+ };
47
+ }
48
+
49
+ const defaultRecorder = createChildFirstLlmRecorder(async ({ runId, event, data }) => {
50
+ try {
51
+ const { appendRunLedgerEntry } = await import('../self-implement/run-ledger.js');
52
+ appendRunLedgerEntry({ timestamp: new Date().toISOString(), runId, event, data } satisfies RunLedgerEntry);
53
+ } catch { /* observation must never prevent an LLM call */ }
54
+ });
55
+
56
+ export function childRunIdForLlmObservation(env: NodeJS.ProcessEnv = process.env): string | undefined {
57
+ const runId = env.ELANOUS_RUN_ID?.trim();
58
+ return runId || undefined;
59
+ }
60
+
61
+ export function recordChildFirstLlmStart(input: { provider: string; model: string; accountName?: string }): Promise<void> {
62
+ const runId = childRunIdForLlmObservation();
63
+ return runId ? defaultRecorder.start({ runId, ...input }) : Promise.resolve();
64
+ }
65
+
66
+ export function recordChildFirstLlmResponse(input: { status: 'ok' | 'error'; httpStatus?: number; error?: unknown }): Promise<void> {
67
+ const runId = childRunIdForLlmObservation();
68
+ return runId ? defaultRecorder.response({ runId, ...input }) : Promise.resolve();
69
+ }
70
+
71
+ export function recordChildFirstToolCall(): Promise<void> {
72
+ const runId = childRunIdForLlmObservation();
73
+ return runId ? defaultRecorder.firstToolCall({ runId }) : Promise.resolve();
74
+ }
75
+
76
+ export interface ChildFirstLlmFact {
77
+ readonly status: 'started' | 'ok' | 'error';
78
+ readonly provider: string;
79
+ readonly model: string;
80
+ readonly accountName: string | null;
81
+ readonly startedAt: string;
82
+ readonly respondedAt?: string;
83
+ readonly httpStatus?: number;
84
+ readonly errorFirstLine?: string;
85
+ readonly firstToolCallAt?: string;
86
+ }
87
+
88
+ export function childFirstLlmFact(entries: readonly Pick<RunLedgerEntry, 'event' | 'data'>[]): ChildFirstLlmFact | undefined {
89
+ const start = entries.find((entry) => entry.event === 'child-first-llm-call' && entry.data.status === 'started');
90
+ if (!start || typeof start.data.provider !== 'string' || typeof start.data.model !== 'string' || typeof start.data.startedAt !== 'string') return undefined;
91
+ const response = entries.find((entry) => entry.event === 'child-first-llm-call' && (entry.data.status === 'ok' || entry.data.status === 'error'));
92
+ const tool = entries.find((entry) => entry.event === 'child-first-tool-call' && typeof entry.data.at === 'string');
93
+ const status = response?.data.status === 'ok' || response?.data.status === 'error' ? response.data.status : 'started';
94
+ return {
95
+ status, provider: start.data.provider, model: start.data.model,
96
+ accountName: typeof start.data.accountName === 'string' ? start.data.accountName : null,
97
+ startedAt: start.data.startedAt,
98
+ ...(typeof response?.data.respondedAt === 'string' ? { respondedAt: response.data.respondedAt } : {}),
99
+ ...(typeof response?.data.httpStatus === 'number' ? { httpStatus: response.data.httpStatus } : {}),
100
+ ...(typeof response?.data.errorFirstLine === 'string' ? { errorFirstLine: response.data.errorFirstLine } : {}),
101
+ ...(typeof tool?.data.at === 'string' ? { firstToolCallAt: tool.data.at } : {}),
102
+ };
103
+ }
104
+
105
+ export function childFirstLlmStatusLabel(fact: ChildFirstLlmFact): string {
106
+ return fact.status === 'error' && fact.httpStatus !== undefined ? `error(${fact.httpStatus})` : fact.status;
107
+ }
108
+
109
+ export function childFirstLlmReportFact(entries: readonly Pick<RunLedgerEntry, 'event' | 'data'>[]): (ChildFirstLlmFact & { readonly statusLabel: string }) | undefined {
110
+ const fact = childFirstLlmFact(entries);
111
+ return fact ? { ...fact, statusLabel: childFirstLlmStatusLabel(fact) } : undefined;
112
+ }
@@ -146,7 +146,7 @@ export function isKeylessProvider(provider: string | undefined): boolean {
146
146
  }
147
147
 
148
148
  /** 키가 어디서 왔나 — 관측·진단용(제1원칙: "왜 이 키인가"가 로그로 답해져야 한다). */
149
- type CredentialSource = 'rotation' | 'env' | 'inherited' | 'none';
149
+ type CredentialSource = 'rotation' | 'env' | 'secret-store' | 'inherited' | 'none';
150
150
 
151
151
  interface ResolvedCredential {
152
152
  /** 해석된 키. 없으면 undefined(호출자가 provider 기본 인증으로 폴백하거나 명시 실패). */
@@ -176,6 +176,8 @@ interface ResolveCredentialInput {
176
176
  /** base config 의 `llm.provider` — 전환 여부 판정용. */
177
177
  baseProvider?: string | undefined;
178
178
  env?: NodeJS.ProcessEnv;
179
+ /** 이미 조회한 SecretStore 값. 값은 런타임 메모리에서만 전달한다. */
180
+ secretStoreApiKey?: string | undefined;
179
181
  }
180
182
 
181
183
  /**
@@ -184,8 +186,9 @@ interface ResolveCredentialInput {
184
186
  * 우선순위(대표 결정 (a)):
185
187
  * ① `llm.rotation` 에서 같은 provider 엔트리의 apiKey (config·감사 가능)
186
188
  * ② `providerEnvKey(provider)` 로 읽은 env
187
- * ③ provider 가 **안 바뀐** 경우에 한해 base `llm.apiKey` 상속
188
- * ④ 없음 — 호출자가 판단(구독/OAuth provider 는 이게 정상일 수 있다)
189
+ * ③ 기존 SecretStore (`providerEnvKey` 와 같은 ID)
190
+ * ④ provider 가 **안 바뀐** 경우에 한해 base `llm.apiKey` 상속
191
+ * ⑤ 없음 — 호출자가 판단(구독/OAuth provider 는 이게 정상일 수 있다)
189
192
  *
190
193
  * ⚠️ ③ 이 마지막인 것이 이 수리의 핵심이다. 종전엔 ③ 이 **무조건 첫 번째**였고, 그래서 provider 가
191
194
  * 바뀌어도 옛 provider 의 키가 따라갔다(= 401 의 근본). provider 가 바뀌었으면 base 키는 **틀린 키**다.
@@ -230,7 +233,12 @@ export function resolveProviderCredential(input: ResolveCredentialInput): Resolv
230
233
  if (fromEnv) return { apiKey: fromEnv, source: 'env', envKey: candidate, ...withUrl };
231
234
  }
232
235
 
233
- // ③ 상속 — **provider 가 확실히 그대로일 때만.** 바뀌었으면 base 키는 다른 provider 것이라 틀렸다.
236
+ // ③ SecretStore — setup service-keys uses providerEnvKey(provider) as its secret ID.
237
+ // The value is never copied to config or observability fields.
238
+ const stored = input.secretStoreApiKey?.trim();
239
+ if (stored) return { apiKey: stored, source: 'secret-store', ...(envKey ? { envKey } : {}), ...withUrl };
240
+
241
+ // ④ 상속 — **provider 가 확실히 그대로일 때만.** 바뀌었으면 base 키는 다른 provider 것이라 틀렸다.
234
242
  // ⚠️ 리뷰 must-fix(#5488 2R): 종전 판정은 `!switched` 였는데 `baseProvider` 가 없으면 switched=false
235
243
  // 가 되어 **전환 여부를 모르는데 상속**했다 = 401 재현. 상속은 `provider === baseProvider` 가
236
244
  // **명시적으로 참**일 때만 허용한다(모르면 상속 안 함 = fail-closed).
@@ -246,6 +254,54 @@ export function resolveProviderCredential(input: ResolveCredentialInput): Resolv
246
254
  return { source: 'none', ...(envKey ? { envKey } : {}), ...withUrl };
247
255
  }
248
256
 
257
+ function canReadHostSecretStore(env: NodeJS.ProcessEnv): boolean {
258
+ if (env.NODE_ENV === 'test' || env.ELANOUS_TEST_HOME?.trim()) return false;
259
+ const bunMain = (globalThis as { Bun?: { main?: string } }).Bun?.main;
260
+ if (bunMain && /\.(test|spec)\.[cm]?[jt]sx?$/.test(bunMain)) return false;
261
+ try {
262
+ const { resolveCurrentInstance } = require('../instance/current.js') as typeof import('../instance/current.js');
263
+ if (resolveCurrentInstance().kind !== 'prod') return false;
264
+ // `input.env` is injectable for deterministic callers. Preserve the same
265
+ // test-universe rule when it supplies a non-production parent stamp.
266
+ if (env.ELANOUS_STATE_DIR?.trim()) {
267
+ const { resolveInstance } = require('../instance/resolve.js') as typeof import('../instance/resolve.js');
268
+ if (resolveInstance({ stampedStateDir: env.ELANOUS_STATE_DIR }).kind !== 'prod') return false;
269
+ }
270
+ return true;
271
+ } catch {
272
+ // If the operational universe cannot be established, fail closed on host secrets.
273
+ return false;
274
+ }
275
+ }
276
+
277
+ /** Async runtime lookup for keys written by `setup service-keys`. Existing
278
+ * rotation and environment precedence is resolved before the SecretStore is
279
+ * queried; a legacy same-provider config key remains the final compatibility
280
+ * source. The secret value is returned only to the caller for the live request. */
281
+ export async function resolveProviderCredentialAsync(
282
+ input: ResolveCredentialInput,
283
+ getSecret?: (id: string) => Promise<string | undefined>,
284
+ ): Promise<ResolvedCredential> {
285
+ const withoutStore = resolveProviderCredential(input);
286
+ if (withoutStore.source === 'rotation' || withoutStore.source === 'env') return withoutStore;
287
+ const secretId = providerEnvKey(input.provider);
288
+ if (!secretId) return withoutStore;
289
+ const env = input.env ?? process.env;
290
+ // Bun's test runner changes HOME, but the OS SecretStore (for example the
291
+ // macOS Keychain) is host-global. Never let those credentials alter a test's
292
+ // provider selection; callers can still inject a deterministic reader.
293
+ if (!getSecret && !canReadHostSecretStore(env)) return withoutStore;
294
+ let stored: string | undefined;
295
+ try {
296
+ if (getSecret) stored = await getSecret(secretId);
297
+ else {
298
+ const { getSecretAsync } = await import('../nexus/config/secrets/index.js');
299
+ stored = await getSecretAsync(secretId);
300
+ }
301
+ } catch { /* keep the legacy source fallback; never expose backend errors */ }
302
+ return resolveProviderCredential({ ...input, secretStoreApiKey: stored });
303
+ }
304
+
249
305
  /**
250
306
  * 해석 결과를 관측에 남긴다 — 제1원칙(관측 없으면 자기인지·힐링 불가). **키 값은 절대 싣지 않는다**(이름·출처만).
251
307
  * 키가 필요한 provider 인데 못 찾은 경우는 warn 으로 올려 401 이 나기 **전에** 보이게 한다.
@@ -0,0 +1,44 @@
1
+ export type ProviderFailureEvidence = {
2
+ httpStatus?: number;
3
+ providerErrorCode?: string;
4
+ providerErrorType?: string;
5
+ };
6
+
7
+ function record(value: unknown): Record<string, unknown> | undefined {
8
+ return value !== null && typeof value === 'object' ? value as Record<string, unknown> : undefined;
9
+ }
10
+
11
+ function safeCode(value: unknown): string | undefined {
12
+ return typeof value === 'string' && /^[A-Za-z0-9_.-]{1,100}$/.test(value) ? value : undefined;
13
+ }
14
+
15
+ /** Retain only non-secret structured fields from provider failures. */
16
+ export function providerFailureEvidence(error: unknown): ProviderFailureEvidence {
17
+ const source = record(error);
18
+ if (!source) return {};
19
+
20
+ let body: Record<string, unknown> | undefined;
21
+ if (typeof source.bodyText === 'string') {
22
+ try { body = record(JSON.parse(source.bodyText)); } catch { /* body is not structured JSON */ }
23
+ }
24
+ if (!body && typeof source.message === 'string') {
25
+ const jsonStart = source.message.indexOf('{');
26
+ if (jsonStart >= 0) {
27
+ try { body = record(JSON.parse(source.message.slice(jsonStart))); } catch { /* message may be clipped */ }
28
+ }
29
+ }
30
+
31
+ const nestedError = record(body?.error);
32
+ const status = source.status;
33
+ const httpStatus = typeof status === 'number' && Number.isInteger(status) && status >= 100 && status <= 599
34
+ ? status
35
+ : undefined;
36
+ const providerErrorCode = safeCode(nestedError?.code) ?? safeCode(body?.code);
37
+ const providerErrorType = safeCode(nestedError?.type) ?? safeCode(body?.type);
38
+
39
+ return {
40
+ ...(httpStatus !== undefined ? { httpStatus } : {}),
41
+ ...(providerErrorCode ? { providerErrorCode } : {}),
42
+ ...(providerErrorType ? { providerErrorType } : {}),
43
+ };
44
+ }
package/src/llm.ts CHANGED
@@ -29,10 +29,13 @@ import {
29
29
  import { debug, redactSecrets, redactSecretText } from './debug/log.js';
30
30
  import { estimateMessagesTokens } from './tokens.js';
31
31
  import { isVerifiedOpenGatewayModel } from './llm/opengateway-models.js';
32
+ import { resolveCodexAccountForRun } from './oauth/codex-account-store.js';
33
+ import { codexOwnerMirrorAuthPath, readCodexOwnerAccessMirror } from './oauth/codex-owner-mirror.js';
32
34
  import { llmUsageCostFields } from './budget/llm-cost.js';
33
35
  import { accumulateByokUsage } from './llm/openrouter-byok-cost.js';
34
36
  import { ACTION_PHASE_OPS_TOOLS, isSteeredShellRejection, REPAIR_PHASE_READ_ONLY_OPS_TOOLS } from './llm/tool-loop-steered-rejection.js';
35
37
  import { ToolCallTiming } from './chat/tool-call-timing.js';
38
+ import { recordChildFirstLlmResponse, recordChildFirstLlmStart, recordChildFirstToolCall } from './llm/child-first-llm-observation.js';
36
39
  import {
37
40
  dispatchWithParallelSafety,
38
41
  isSafeForParallel,
@@ -54,6 +57,7 @@ import {
54
57
  type ProviderFallbackTerminalVerdict,
55
58
  } from './session-runtime/retry-policy.js';
56
59
  import { ApiHttpError, fetchApiWithRetry, OverloadFailoverError, type FetchApiWithRetryOpts } from './session-runtime/retry-api.js';
60
+ import { providerFailureEvidence } from './llm/provider-failure-evidence.js';
57
61
  import { isShapeRelevantRejection, summarizeCodexRequestShape } from './llm-request-shape.js';
58
62
  import { BedrockProvider, isBedrockCompatibleModel, makeBedrockProvider } from './llm/bedrock-provider.js';
59
63
  import { OPEN_WEIGHT_TOOL_DISCIPLINE } from './llm/open-weight-discipline.js';
@@ -497,6 +501,9 @@ export interface LLMOpts {
497
501
  reasoningEffort?: 'minimal' | 'low' | 'medium' | 'high' | 'xhigh' | 'max';
498
502
  /** Tool definitions made available to the model for this turn. */
499
503
  tools?: LLMToolSpec[];
504
+ /** Optional tool pool exposed only to the first tool-loop request. The
505
+ * normal `tools` pool remains active for later requests and hydration. */
506
+ firstTurnTools?: LLMToolSpec[];
500
507
  /** Tool-calling forcing for THIS turn. In streamLLMWithTools it forces on
501
508
  * turn 0 only, then reverts to auto so the model can finalize. See ToolChoice. */
502
509
  toolChoice?: ToolChoice;
@@ -4395,6 +4402,16 @@ function providerDecisionCandidates(): Array<LLMProvider & { name: ProviderDecis
4395
4402
 
4396
4403
  /** Exported (OB1) so onboarding and `setup` judge «is there a usable ChatGPT/Codex login» exactly as the runtime does. */
4397
4404
  export function codexOAuthAvailable(): boolean {
4405
+ if (process.env.ELANOUS_REMOTE_CODEX_ACCESS_ONLY === '1') {
4406
+ try {
4407
+ const mirrorPath = codexOwnerMirrorAuthPath();
4408
+ const account = resolveCodexAccountForRun(process.env, { storePath: mirrorPath });
4409
+ readCodexOwnerAccessMirror(account.storeKey, { path: mirrorPath });
4410
+ return true;
4411
+ } catch {
4412
+ return false;
4413
+ }
4414
+ }
4398
4415
  try {
4399
4416
  const account = resolveCodexAccount(process.env, { storedHome: (key) => loadTokens(key)?.codexHome });
4400
4417
  if (loadTokens(account.storeKey)) return true;
@@ -5114,11 +5131,16 @@ async function consumeProviderText(
5114
5131
  export async function streamLLM(
5115
5132
  messages: LLMMessage[],
5116
5133
  onChunk: (delta: string, full: string) => void,
5117
- opts: LLMOpts & { provider?: LLMProvider; initialProvider?: LLMProvider; onResolvedProvider?: (provider: string, model: string) => void } = {},
5134
+ opts: LLMOpts & {
5135
+ provider?: LLMProvider;
5136
+ initialProvider?: LLMProvider;
5137
+ onResolvedProvider?: (provider: string, model: string) => void;
5138
+ skipProviders?: readonly string[];
5139
+ } = {},
5118
5140
  ): Promise<string> {
5119
5141
  const started = Date.now();
5120
- let activeProvider = opts.provider ?? opts.initialProvider ?? resolveDefaultProvider(opts.model);
5121
- const attemptedProviders = new Set<string>([activeProvider.name]);
5142
+ let activeProvider = opts.provider ?? opts.initialProvider ?? await resolveDefaultProviderAsync(opts.model);
5143
+ const attemptedProviders = new Set<string>([activeProvider.name, ...(opts.skipProviders ?? [])]);
5122
5144
  let blockedProviders: ProviderFallbackAttempt[] = [];
5123
5145
  let modelOverride = opts.model;
5124
5146
 
@@ -5131,6 +5153,11 @@ export async function streamLLM(
5131
5153
  const activeModel = finalized.model;
5132
5154
  if (getModelFamily(activeModel) === 'claude') assertNoTopLevelToolSchemaCombinators(opts.tools);
5133
5155
  opts.onResolvedProvider?.(activeProvider.name, activeModel);
5156
+ await recordChildFirstLlmStart({
5157
+ provider: activeProvider.name, model: activeModel,
5158
+ ...(activeProvider.name === 'openai-codex' && process.env.ELANOUS_CODEX_ACCOUNT?.trim()
5159
+ ? { accountName: process.env.ELANOUS_CODEX_ACCOUNT.trim() } : {}),
5160
+ });
5134
5161
  debug.log('llm.router', 'streamLLM', {
5135
5162
  provider: activeProvider.name,
5136
5163
  model: activeModel,
@@ -5153,6 +5180,7 @@ export async function streamLLM(
5153
5180
  );
5154
5181
  const full = consumed.full;
5155
5182
  if (consumed.ok) {
5183
+ await recordChildFirstLlmResponse({ status: 'ok' });
5156
5184
  if (consumed.usage !== 'unmeasured') {
5157
5185
  try {
5158
5186
  logAgentTurnUsage(activeModel, consumed.usage, { providerName: activeProvider.name, site: opts.usageSite ?? 'stream-llm', role: opts.usageRole, phase: opts.usagePhase, jobKind: opts.usageJobKind });
@@ -5171,6 +5199,11 @@ export async function streamLLM(
5171
5199
  }
5172
5200
 
5173
5201
  const err: any = consumed.error;
5202
+ await recordChildFirstLlmResponse({
5203
+ status: 'error',
5204
+ ...(Number.isSafeInteger(err?.status) ? { httpStatus: err.status as number } : Number.isSafeInteger(err?.statusCode) ? { httpStatus: err.statusCode as number } : {}),
5205
+ error: err,
5206
+ });
5174
5207
  if (err instanceof OverloadFailoverError && !opts.provider) {
5175
5208
  const switched = activeProvider.name === 'openai-codex'
5176
5209
  ? firstAvailableFallbackProvider(attemptedProviders, opts)
@@ -5197,6 +5230,7 @@ export async function streamLLM(
5197
5230
  model: activeModel,
5198
5231
  durationMs: Date.now() - started,
5199
5232
  message: reason,
5233
+ ...providerFailureEvidence(err),
5200
5234
  ...(isAuthRejectionError(err) ? { authRejected: true } : {}),
5201
5235
  }, { level: 'error' });
5202
5236
  if (opts.provider) {
@@ -5343,6 +5377,44 @@ export function resolveDefaultProvider(model?: string): LLMProvider {
5343
5377
  }
5344
5378
  }
5345
5379
 
5380
+ /** Async default resolver for requests that can use keys saved by setup service-keys. */
5381
+ export async function resolveDefaultProviderAsync(model?: string): Promise<LLMProvider> {
5382
+ try {
5383
+ // Preserve the established resolver as the default for every credential
5384
+ // source it already handles. Besides avoiding provider-factory churn, this
5385
+ // keeps registered providers and injected resolver implementations intact.
5386
+ const existingProvider = resolveDefaultProvider(model);
5387
+ const { getUserConfig } = require('./user-config.js') as typeof import('./user-config.js');
5388
+ const cfg = getUserConfig();
5389
+ const modelHint = cfg.llm.provider !== 'auto' && !isModelCompatible(cfg.llm.provider, model)
5390
+ ? undefined
5391
+ : model;
5392
+ const decision = decideProviderForConfig(cfg, modelHint);
5393
+ let usedSecretStore = false;
5394
+ const asyncProvider = await getProviderForConfigAsync(cfg, modelHint, undefined, process.env, () => {
5395
+ usedSecretStore = true;
5396
+ });
5397
+ const p = usedSecretStore ? asyncProvider : existingProvider;
5398
+ debug.log('llm.router', 'resolveDefaultProvider', {
5399
+ source: cfg.llm.provider === 'auto' ? 'user-config-auto-decision' : 'user-config',
5400
+ configProvider: cfg.llm.provider,
5401
+ configModel: cfg.llm.model,
5402
+ requestedModel: model,
5403
+ decisionProvider: decision.provider,
5404
+ decisionAuth: decision.auth,
5405
+ resolvedTo: p.name,
5406
+ resolvedModel: p.defaultModel,
5407
+ available: p.available(),
5408
+ }, { level: 'info' });
5409
+ return p;
5410
+ } catch {
5411
+ debug.log('llm.router', 'resolveDefaultProvider-secretstore-fallback', {
5412
+ reason: 'async-provider-resolution-failed',
5413
+ }, { level: 'warn' });
5414
+ return resolveDefaultProvider(model);
5415
+ }
5416
+ }
5417
+
5346
5418
  /** Handlers + result for `streamLLMWithTools`. */
5347
5419
  export interface StreamWithToolsHandlers {
5348
5420
  /** Streaming text delta — invoked for every text chunk across all turns. */
@@ -8596,7 +8668,7 @@ export async function streamLLMWithTools(
8596
8668
  const circuit = !opts.provider && !opts.initialProvider
8597
8669
  ? await import('./session-runtime/provider-circuit.js')
8598
8670
  : undefined;
8599
- const provider = opts.provider ?? opts.initialProvider ?? resolveDefaultProvider(opts.model);
8671
+ const provider = opts.provider ?? opts.initialProvider ?? await resolveDefaultProviderAsync(opts.model);
8600
8672
  const initial = finalizeStreamingProviderModel(provider, opts.model ?? provider.defaultModel);
8601
8673
  let activeProvider = initial.provider;
8602
8674
  let activeModel = initial.model;
@@ -8622,6 +8694,19 @@ export async function streamLLMWithTools(
8622
8694
  }
8623
8695
  }
8624
8696
  opts.onResolvedProvider?.(activeProvider.name, activeModel);
8697
+ await recordChildFirstLlmStart({
8698
+ provider: activeProvider.name, model: activeModel,
8699
+ ...(activeProvider.name === 'openai-codex' && process.env.ELANOUS_CODEX_ACCOUNT?.trim()
8700
+ ? { accountName: process.env.ELANOUS_CODEX_ACCOUNT.trim() } : {}),
8701
+ });
8702
+ const initialToolHandler = handlers.onToolCall;
8703
+ handlers = {
8704
+ ...handlers,
8705
+ onToolCall: (call) => {
8706
+ void recordChildFirstToolCall();
8707
+ initialToolHandler?.(call);
8708
+ },
8709
+ };
8625
8710
  const attemptedProviders = new Set<string>([
8626
8711
  activeProvider.name,
8627
8712
  ...(circuitBlockedInitialProvider ? [circuitBlockedInitialProvider] : []),
@@ -9171,7 +9256,9 @@ export async function streamLLMWithTools(
9171
9256
  const base = {
9172
9257
  ...opts,
9173
9258
  model: activeModel,
9174
- tools: completionNeedsFinalTurn && !keepToolsNoCall ? [] : activeTools,
9259
+ tools: completionNeedsFinalTurn && !keepToolsNoCall
9260
+ ? []
9261
+ : turn === 0 && opts.firstTurnTools ? opts.firstTurnTools : activeTools,
9175
9262
  remainingFallbacks,
9176
9263
  };
9177
9264
  if (keepToolsNoCall) return { ...base, toolChoice: 'none' as const };
@@ -9304,7 +9391,11 @@ export async function streamLLMWithTools(
9304
9391
  new Promise<{ idle: true }>((res) => { idleTimer = setTimeout(() => res({ idle: true }), streamIdleTimeoutMs); }),
9305
9392
  ]);
9306
9393
  if (step.idle) throw new StreamIdleTimeoutError(streamIdleTimeoutMs);
9394
+ await recordChildFirstLlmResponse({ status: 'ok' });
9307
9395
  } catch (err) {
9396
+ const status = Number.isSafeInteger((err as { status?: unknown })?.status) ? (err as { status: number }).status
9397
+ : Number.isSafeInteger((err as { statusCode?: unknown })?.statusCode) ? (err as { statusCode: number }).statusCode : undefined;
9398
+ await recordChildFirstLlmResponse({ status: 'error', ...(status === undefined ? {} : { httpStatus: status }), error: err });
9308
9399
  if (idleTimer) clearTimeout(idleTimer);
9309
9400
  releaseStreamAttempt(true, err);
9310
9401
  if (err instanceof ApiHttpError && err.status === 400 && providerToolSchemaDiagnostics) {
@@ -12810,14 +12901,14 @@ export function getProviderForConfig(
12810
12901
  }
12811
12902
  const crossFamilyModel = (model || userConfig.llm.model) && resolvedProviderName !== provider;
12812
12903
  if (crossFamilyModel) {
12813
- const keyPrefix = (userConfig.llm.apiKey || '').slice(0, 7);
12814
- const keyImplies = keyPrefix.startsWith('sk-ant')
12904
+ const key = userConfig.llm.apiKey || '';
12905
+ const keyImplies = key.startsWith('sk-ant')
12815
12906
  ? 'anthropic'
12816
- : keyPrefix.startsWith('xai-')
12907
+ : key.startsWith('xai-')
12817
12908
  ? 'grok'
12818
- : keyPrefix.startsWith('sk-')
12909
+ : key.startsWith('sk-')
12819
12910
  ? 'openai'
12820
- : keyPrefix
12911
+ : key
12821
12912
  ? 'unknown'
12822
12913
  : 'none';
12823
12914
  const keyMismatch =
@@ -12828,7 +12919,6 @@ export function getProviderForConfig(
12828
12919
  configProvider: provider,
12829
12920
  model: decision.model,
12830
12921
  implied: resolvedProviderName,
12831
- keyPrefix: keyPrefix || null,
12832
12922
  keyImplies,
12833
12923
  keyMismatch,
12834
12924
  }, { level: 'info' });
@@ -12873,6 +12963,75 @@ export function getProviderForConfig(
12873
12963
  // union without a case here fails loud at first call.
12874
12964
  throw new Error(`unknown provider: ${provider as string}`);
12875
12965
  }
12966
+
12967
+ /** Async counterpart used by production request paths. It overlays a SecretStore
12968
+ * credential only on the ephemeral config passed to the provider factory; the
12969
+ * persisted UserConfig is never mutated or saved. */
12970
+ export async function getProviderForConfigAsync(
12971
+ userConfig: UserConfig,
12972
+ model?: string,
12973
+ getSecret?: (id: string) => Promise<string | undefined>,
12974
+ env: NodeJS.ProcessEnv = process.env,
12975
+ onSecretStoreCredential?: () => void,
12976
+ ): Promise<LLMProvider> {
12977
+ const { resolveProviderCredentialAsync } = await import('./llm/provider-credentials.js');
12978
+ const decision = finalizeProviderModelCompatibility(decideProviderForConfig(userConfig, model));
12979
+ let target = decision.provider.startsWith('auto:')
12980
+ ? decision.provider.slice('auto:'.length)
12981
+ : decision.provider;
12982
+
12983
+ // decideProviderForConfig preserves the established env/subscription and
12984
+ // keyless-provider selection. This loop only runs when that resolver found
12985
+ // no synchronous candidate; it then checks persisted setup keys in the same
12986
+ // provider order.
12987
+ if (target === 'auto') {
12988
+ for (const candidate of PROVIDER_DECISION_ORDER) {
12989
+ const credential = await resolveProviderCredentialAsync({
12990
+ provider: candidate,
12991
+ rotation: userConfig.llm.rotation,
12992
+ baseProvider: userConfig.llm.provider,
12993
+ baseApiKey: userConfig.llm.apiKey,
12994
+ env,
12995
+ }, getSecret);
12996
+ if (credential.source !== 'none') {
12997
+ target = candidate;
12998
+ break;
12999
+ }
13000
+ }
13001
+ }
13002
+ if (target === 'auto') return getProviderForConfig(userConfig, model);
13003
+
13004
+ const resolvedModel = decision.provider === 'auto' || decision.model === '(none)'
13005
+ ? defaultModelForProvider(target as ConcreteProviderName)
13006
+ : decision.model;
13007
+
13008
+ const credential = await resolveProviderCredentialAsync({
13009
+ provider: target,
13010
+ rotation: userConfig.llm.rotation,
13011
+ baseProvider: userConfig.llm.provider,
13012
+ baseApiKey: userConfig.llm.apiKey,
13013
+ env,
13014
+ }, getSecret);
13015
+ // Keep the established provider registry/factory path unless this request
13016
+ // actually depends on a setup key. In particular, auto mode may have a
13017
+ // registered provider implementation (test doubles included) that must not
13018
+ // be replaced by a newly constructed provider with an empty ephemeral key.
13019
+ if (credential.source !== 'secret-store') return getProviderForConfig(userConfig, model);
13020
+ onSecretStoreCredential?.();
13021
+ const ephemeralConfig = {
13022
+ ...userConfig,
13023
+ llm: {
13024
+ ...userConfig.llm,
13025
+ provider: target as UserConfig['llm']['provider'],
13026
+ model: resolvedModel,
13027
+ apiKey: credential.apiKey,
13028
+ baseUrl: target === userConfig.llm.provider
13029
+ ? credential.baseUrl ?? userConfig.llm.baseUrl
13030
+ : credential.baseUrl,
13031
+ },
13032
+ };
13033
+ return getProviderForConfig(ephemeralConfig, resolvedModel);
13034
+ }
12876
13035
  import { getModelFamily, isGpt6GenerationModel, usesCodexBehaviorGuards } from './models/prompts.js';
12877
13036
  import type { ModelFamily } from './models/prompts.js';
12878
13037
 
package/src/mcp/client.ts CHANGED
@@ -91,6 +91,11 @@ export interface McpToolCallContent {
91
91
  [k: string]: unknown;
92
92
  }
93
93
 
94
+ /** Per-call MCP metadata. `elanousRunId` is only a correlation key. */
95
+ export interface McpCallMeta extends Record<string, unknown> {
96
+ elanousRunId?: string;
97
+ }
98
+
94
99
  /** The remote server answered with a JSON-RPC `error` envelope.
95
100
  *
96
101
  * ⛔⭐ **「서버가 안 된다고 했다」와 「서버에 못 닿았다」는 다른 값이다.**
@@ -749,11 +754,13 @@ export class McpClient {
749
754
  async callTool(
750
755
  name: string,
751
756
  args: Record<string, unknown>,
757
+ meta?: McpCallMeta,
752
758
  ): Promise<McpToolCallResult> {
753
759
  this.requireReady('callTool');
754
760
  const result = (await this.send('tools/call', {
755
761
  name,
756
762
  arguments: args,
763
+ ...(meta && Object.keys(meta).length > 0 ? { _meta: meta } : {}),
757
764
  })) as McpToolCallResult;
758
765
  return result;
759
766
  }
@@ -44,6 +44,7 @@ import {
44
44
  type FeedbackEnvelope,
45
45
  } from '../feedback/envelope.js';
46
46
  import { mcpMediaJobs, mcpResultImages } from '../feedback/media.js';
47
+ import { getHarnessRunId } from '../harness/harness-space.js';
47
48
  import { McpServerError } from './client.js';
48
49
  import type { McpClient, McpTool, McpToolCallResult } from './client.js';
49
50
 
@@ -278,7 +279,11 @@ export function createMcpProxyRuntime(
278
279
  };
279
280
  }
280
281
  try {
281
- const result = await opts.client.callTool(opts.mcpTool.name, req);
282
+ const runId = (ctx.runId || getHarnessRunId()).trim();
283
+ // The correlation id is needed only for Aside's delegated return path.
284
+ // Do not disclose the local run identity to other MCP servers.
285
+ const meta = opts.serverId === 'aside' && runId ? { elanousRunId: runId } : undefined;
286
+ const result = await opts.client.callTool(opts.mcpTool.name, req, meta);
282
287
  const converted = mcpResultToRunResult(result);
283
288
  emitMcpMediaFeedback(converted, ctx);
284
289
  const capped = capMcpOutput(converted, {