elanous 0.2.42 → 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 (764) 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/{X1ucLw10Cds_h614NoEnh → HMXsxdy5MIIcHPMHv1wD4}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/08334415.f0e80896acbef722.js +1 -0
  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/{2160.a097e7b138ae1c55.js → 118.2a89982fe4276880.js} +1 -1
  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/1306.967240ede9a0f757.js +24 -0
  14. package/apps/pwa/out/_next/static/chunks/1344.3b95f3bd1b77a3fe.js +94 -0
  15. package/apps/pwa/out/_next/static/chunks/{4043.6b91203436c9c86b.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/{6632.0eac1c554f8f2ef3.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/1850-522de4ee34957210.js +1 -0
  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/{3507.97e1977bc4d5fb0a.js → 1978.eeb60a606dc5deac.js} +2 -2
  26. package/apps/pwa/out/_next/static/chunks/2043.e233e3b5a3e790f5.js +1 -0
  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/2216.802962c04f40a26e.js +64 -0
  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/{5885.0a3e52c8faccec98.js → 239.de075467b5523469.js} +2 -2
  33. package/apps/pwa/out/_next/static/chunks/249.ba7051590d603c8f.js +226 -0
  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/2954.bbefc95d6b20e0d8.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/2e0f720a.a0697c08e3806a60.js +1 -0
  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/{1487.2f67b79444062da6.js → 3349.b5f09ee474d9533e.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/3503.a47a9755fb4d97b0.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/3506-5f429b3b7e1392b0.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/3843.bad404d008893291.js +77 -0
  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/4393.28fa5228d0eec217.js +149 -0
  52. package/apps/pwa/out/_next/static/chunks/4404.7281c847c6e10dfc.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/{8673-bab689a55f7e13b9.js → 4415-b9d6a90960920a4a.js} +3 -3
  54. package/apps/pwa/out/_next/static/chunks/447-5b304de1fe098f43.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/4484-8ebea83d431e6fae.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/{8262.ddc03e06b733f184.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/{1262.e804feb8fd1acb8c.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/{1063.2fb8a9dc55c731f2.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/{6377.bc7df239edbff244.js → 4891.3f80ba517a3b2373.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/4998.810ca8833084caa9.js +62 -0
  66. package/apps/pwa/out/_next/static/chunks/4f98febc.ea5841d4d616bfb2.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/{3482.a9ae9d2ad6a5bd97.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/5439.3fec6dbce29ecb36.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/5612-074d9a5e00dfac6a.js +1 -0
  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/5790.5eb06a653ebd8571.js +34 -0
  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/{3347.f846266b5e5f3ede.js → 5989.7ecd362c5c44b747.js} +3 -3
  81. package/apps/pwa/out/_next/static/chunks/{73d2eb0e.4966ad55293c801a.js → 5a34fb2f.52f1b4e1baebb48a.js} +3 -3
  82. package/apps/pwa/out/_next/static/chunks/{7a98bc80.fa935989e829f9c2.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/{7411.9b4b8b747dc7b802.js → 6245.1182e007e9d230d9.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/{b450776b.3db34d8d965f82d3.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/{e8543907.5b040a5f22a0b0e5.js → 6549dad0.2740b25e51bf8f05.js} +1 -1
  92. package/apps/pwa/out/_next/static/chunks/{9427.96aa912ddb5801e0.js → 6881.9e7955847640c7fe.js} +17 -17
  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/7010.1bbd17a7f2b3e376.js +1 -0
  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/7679.32c40cdd14f20b4a.js +1 -0
  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/{8138.6c10b2a356d52fca.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/{9415.69e4a21c60c7d2db.js → 8551.f762945c2cda2e95.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/8635-57a9d8d9db70f4f1.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/86961958-4b0689a5048f756b.js +1 -0
  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/{9a852a62-6192a6ea9346ced3.js → 87f498e5-0881de09f2e44707.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/8843.c3197f904c952b81.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/{3d0154af.5331fec737ffe8c3.js → 892fd990.456232f326cc39c2.js} +1 -1
  116. package/apps/pwa/out/_next/static/chunks/8965-135a2c9eaa2464cb.js +1 -0
  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/9398.1f56e3f17795f43f.js +1 -0
  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-da787e8a10b8a82e.js +1 -0
  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/_next/static/css/d1f8bb401740a549.css +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/catalog/external-commands.yaml +5 -3
  279. package/catalog/meta/catalogVersion.yaml +2 -1
  280. package/catalog/signing/catalog-signing-public.pem +3 -0
  281. package/graphs/intake/intake-daily.yaml +16 -0
  282. package/graphs/intake/news-sources.yaml +1 -0
  283. package/graphs/intake/recipes.yaml +7 -0
  284. package/graphs/overlays/README.md +6 -0
  285. package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
  286. package/graphs/profiles/local.yaml +5 -0
  287. package/graphs/profiles/pod.yaml +4 -0
  288. package/graphs/release/release-loop.yaml +33 -17
  289. package/graphs/units/verbs/make-doc.yaml +1 -0
  290. package/package.json +6 -2
  291. package/plugins/demo-absorption-briefing/plugin.json +18 -0
  292. package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
  293. package/plugins/demo-browser-hand/plugin.json +13 -0
  294. package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
  295. package/plugins/demo-linear-secretary/plugin.json +15 -0
  296. package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
  297. package/plugins/demo-plugin-wizard/plugin.json +11 -0
  298. package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
  299. package/plugins/demo-research/plugin.json +16 -0
  300. package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
  301. package/plugins/demo-video-briefing/plugin.json +15 -0
  302. package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
  303. package/scripts/bench-metering-plan.ts +229 -0
  304. package/scripts/build-signed-catalog.ts +48 -0
  305. package/scripts/ci-typecheck-main-delta.sh +88 -0
  306. package/scripts/codex-fallback-live-probe.ts +1 -1
  307. package/scripts/demo/demo1104-parallel-host.ts +56 -0
  308. package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
  309. package/scripts/demo/demo1104-parallel.ts +72 -0
  310. package/scripts/demo/demo1104-stage.config.ts +21 -0
  311. package/scripts/demo/demo1104-stage.ts +316 -0
  312. package/scripts/goal-method-audit.ts +17 -1
  313. package/scripts/graph-units/land-enqueue.ts +90 -0
  314. package/scripts/hooks/codex-notify.sh +32 -0
  315. package/scripts/install.sh +10 -38
  316. package/scripts/landing-heal/land-plan.ts +57 -0
  317. package/scripts/public-leak-baseline.txt +0 -1
  318. package/scripts/release-loop/auto-approve-node.ts +1 -1
  319. package/scripts/release-loop/docs-node.ts +4 -2
  320. package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
  321. package/scripts/release-loop/gate-image-pin.ts +116 -2
  322. package/scripts/release-loop/gate-method.ts +139 -0
  323. package/scripts/release-loop/gate-node.ts +395 -43
  324. package/scripts/release-loop/gate-progress-sim.ts +73 -0
  325. package/scripts/release-loop/gate-traffic-mode.ts +151 -3
  326. package/scripts/release-loop/node-verdict.ts +38 -25
  327. package/scripts/release-loop/notes-repair.ts +18 -1
  328. package/scripts/release-loop/preflight.ts +544 -10
  329. package/scripts/release-loop/render-warm-control-manifest.ts +22 -0
  330. package/scripts/release-loop/resume-release.ts +9 -7
  331. package/scripts/release-loop/resume.ts +13 -4
  332. package/scripts/release-loop/unattended-release.ts +20 -9
  333. package/scripts/release-loop/warm-control-forward.ts +178 -0
  334. package/scripts/retro-cycle.ts +30 -8
  335. package/scripts/rhythm/daily.ts +39 -4
  336. package/scripts/rhythm/linear-progress-sync.ts +311 -0
  337. package/scripts/ux-sim.ts +7 -1
  338. package/scripts/video-pipeline.ts +9 -1
  339. package/scripts/warm-pool-provider-config.ts +35 -7
  340. package/src/acp/agent-manager.ts +1 -0
  341. package/src/acp/codex-app-server-agent.ts +33 -0
  342. package/src/acp/codex-app-server-client.ts +153 -16
  343. package/src/acp/core-turn-bridge.ts +17 -12
  344. package/src/acp/event-router.ts +20 -1
  345. package/src/acp/server.ts +6 -0
  346. package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
  347. package/src/agent-mission/claude-headless.ts +4 -1
  348. package/src/agent-mission/codex-exec.ts +105 -0
  349. package/src/agent-mission/driver.ts +192 -11
  350. package/src/agent-mission/grok-auth-status.ts +107 -0
  351. package/src/agent-mission/hand-hooks.ts +101 -0
  352. package/src/agent-mission/mission-cli.ts +56 -21
  353. package/src/agent-mission/mission-hand-reply.ts +118 -0
  354. package/src/agent-mission/mission-line.ts +180 -0
  355. package/src/agent-mission/mission-out.ts +256 -18
  356. package/src/agent-mission/tool-install.ts +122 -11
  357. package/src/agent-substrate/pr-reviewer.ts +147 -11
  358. package/src/agent-substrate/self-review-cli.ts +10 -2
  359. package/src/agents/general-purpose.md +1 -1
  360. package/src/auto-research/research-fanout.ts +221 -0
  361. package/src/auto-research/research-turn.ts +362 -31
  362. package/src/autopilot/mission-codebase-gate.ts +7 -3
  363. package/src/autopilot/pr-manager.ts +31 -3
  364. package/src/boot/daemon-tools/self-implement.ts +3 -1
  365. package/src/boot/daemon-tools/web-search.ts +1 -2
  366. package/src/briefing/brief-items.ts +55 -11
  367. package/src/cli/agent-cli.ts +2 -1
  368. package/src/cli/catalog-cli.ts +31 -0
  369. package/src/cli/connector-cli.ts +16 -0
  370. package/src/cli/control-cli.ts +15 -6
  371. package/src/cli/doctor-fix.ts +2 -2
  372. package/src/cli/intake-source-cli.ts +44 -8
  373. package/src/cli/log-event-names.ts +8 -0
  374. package/src/cli/msg-cli.ts +32 -3
  375. package/src/cli/pr-cli.ts +21 -1
  376. package/src/cli/pr-land-heavy-remote.ts +44 -6
  377. package/src/cli/pr-land-overlap-evidence.ts +13 -1
  378. package/src/cli/pr-land-pod-shadow-job.ts +143 -5
  379. package/src/cli/pr-land-pod-shadow.ts +9 -2
  380. package/src/cli/release-checklist-read-cli.ts +44 -16
  381. package/src/cli/release-cli.ts +23 -3
  382. package/src/cli/research-cli.ts +9 -0
  383. package/src/cli/setup-cli.ts +166 -6
  384. package/src/cli/setup-keys.ts +199 -0
  385. package/src/cli/task-plugin-wizard-host.ts +114 -0
  386. package/src/cli/tasks-cli.ts +54 -9
  387. package/src/cli/tui-test-cli.ts +190 -0
  388. package/src/config.ts +4 -2
  389. package/src/connectors/linear-daily-progress.ts +228 -0
  390. package/src/connectors/linear-projector.ts +34 -12
  391. package/src/connectors/linear.ts +151 -7
  392. package/src/control-plane/ledger.ts +42 -4
  393. package/src/control-plane/member-tokens.ts +25 -2
  394. package/src/control-plane/ports.ts +8 -3
  395. package/src/control-plane/server.ts +26 -5
  396. package/src/core-turn/deep-turn-bloom.ts +67 -0
  397. package/src/core-turn/research-policy.ts +43 -0
  398. package/src/core-turn/run-core-turn.ts +488 -51
  399. package/src/core-turn/types.ts +4 -0
  400. package/src/dashboard/chat/acp-chat.ts +10 -0
  401. package/src/dashboard/classic-sidetab-mission-job.ts +192 -0
  402. package/src/dashboard/classic-sidetab-mission-pair.ts +82 -0
  403. package/src/dashboard/classic-sidetab-mission-trio.ts +242 -0
  404. package/src/dashboard/classic-sidetab-mission.ts +169 -5
  405. package/src/dashboard/index.ts +387 -14
  406. package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
  407. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +8 -0
  408. package/src/dashboard/mission-cli-consumer.ts +20 -8
  409. package/src/dashboard/plugin-wizard-runtime.ts +50 -0
  410. package/src/dashboard/plugin-wizard-tool.ts +55 -0
  411. package/src/dashboard/sidetab-runtime.ts +3 -1
  412. package/src/dashboard/terminal-popup-runtime.ts +6 -3
  413. package/src/dashboard/visible-mission-diagnostics.ts +16 -0
  414. package/src/decisions/linear-progress-summary.ts +78 -0
  415. package/src/decisions/linear-progress-sync.ts +152 -0
  416. package/src/domains/outbound-alert.ts +49 -11
  417. package/src/domains/retro-cycle-observation.ts +43 -0
  418. package/src/domains/retro-cycle.ts +13 -2
  419. package/src/domains/retro-proposals.ts +92 -0
  420. package/src/domains/retro-report.ts +6 -1
  421. package/src/domains/telegram-kind-route.ts +16 -9
  422. package/src/graph-runner/arg-allowance.ts +13 -0
  423. package/src/graph-runner/graph-cli.ts +24 -1
  424. package/src/graph-runner/graph-grow-llm.ts +3 -1
  425. package/src/graph-runner/graph-run-api.ts +3 -1
  426. package/src/graph-runner/runner.ts +310 -46
  427. package/src/graph-wizard/mission-compose.ts +407 -12
  428. package/src/harness/dispatch-backpressure.ts +54 -1
  429. package/src/harness/dispatch-shadow-compare.ts +74 -0
  430. package/src/harness/harness-cli-command.ts +15 -3
  431. package/src/harness/harness-pod-dispatch.ts +3 -0
  432. package/src/harness/skill-exec.ts +21 -9
  433. package/src/harness/skill-select.ts +1 -1
  434. package/src/hooks/error-report-cloud.ts +101 -0
  435. package/src/hooks/receiver.ts +29 -2
  436. package/src/index.ts +129 -12
  437. package/src/intake-plane/actions.ts +354 -0
  438. package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
  439. package/src/intake-plane/intake-sources.ts +78 -8
  440. package/src/intake-plane/items.ts +14 -4
  441. package/src/intake-plane/linear-mission-sync.ts +80 -0
  442. package/src/intake-plane/linear-secretary-runtime.ts +178 -0
  443. package/src/intake-plane/linear-wish.ts +227 -1
  444. package/src/life/life-cli.ts +168 -0
  445. package/src/life/life-kinds.ts +160 -0
  446. package/src/live-supply/budget-consumer.ts +78 -0
  447. package/src/live-supply/read.ts +3 -0
  448. package/src/live-supply/snapshot.ts +45 -0
  449. package/src/llm/child-first-llm-observation.ts +112 -0
  450. package/src/llm/provider-credentials.ts +68 -6
  451. package/src/llm/provider-failure-evidence.ts +44 -0
  452. package/src/llm.ts +172 -12
  453. package/src/maturity/feature-maturity.ts +3 -3
  454. package/src/mcp/client.ts +7 -0
  455. package/src/mcp/proxy-runtime.ts +6 -1
  456. package/src/mcp/server.ts +54 -0
  457. package/src/msg/msg-sse-server.ts +3 -3
  458. package/src/msg/msg-store.ts +177 -19
  459. package/src/native-tool-catalog.ts +36 -2
  460. package/src/nexus/api/consult-requests.ts +18 -6
  461. package/src/nexus/api/discord-trigger-bot.ts +6 -6
  462. package/src/nexus/api/graphs-api.ts +4 -2
  463. package/src/nexus/api/grokbot-trigger-bot.ts +206 -0
  464. package/src/nexus/api/http-server.ts +37 -1
  465. package/src/nexus/api/mcp-public-allowlist.ts +2 -0
  466. package/src/nexus/api/telegram-trigger-bot.ts +6 -6
  467. package/src/nexus/boot/register-mcp-clients.ts +114 -8
  468. package/src/nexus/index.ts +22 -2
  469. package/src/nexus/outbound/format.ts +9 -0
  470. package/src/nexus/outbound/grokbot-adapter.ts +71 -0
  471. package/src/nexus/outbound/router.ts +121 -16
  472. package/src/nexus/setup-status.ts +9 -0
  473. package/src/nexus/state/state.ts +3 -0
  474. package/src/oauth/codex-account-store.ts +20 -7
  475. package/src/oauth/codex-owner-mirror.ts +81 -0
  476. package/src/oauth/codex.ts +17 -2
  477. package/src/oauth/fallback-chain.ts +47 -17
  478. package/src/onboarding/first-run-doctor.ts +8 -1
  479. package/src/onboarding/first-run.ts +126 -29
  480. package/src/onboarding/key-setup.ts +103 -0
  481. package/src/onboarding/menu-answer.ts +13 -0
  482. package/src/onboarding/secret-prompt.ts +37 -0
  483. package/src/plugins/install/plugin-install.ts +59 -0
  484. package/src/pr-tool/census.ts +130 -0
  485. package/src/preview/terminal.ts +22 -7
  486. package/src/prompt-enhance/enhance.ts +10 -0
  487. package/src/pty-shell/pty-control-ipc.ts +4 -1
  488. package/src/pty-shell/pty-write-provenance.ts +21 -3
  489. package/src/pty-shell/registry.ts +9 -2
  490. package/src/registry/catalog-server.ts +232 -0
  491. package/src/registry/loader.ts +45 -1
  492. package/src/registry/types.ts +1 -2
  493. package/src/release-loop/proposal-auto-place.ts +83 -0
  494. package/src/research/axis-fanout.ts +79 -29
  495. package/src/research/lenses/second-order.ts +312 -0
  496. package/src/self-dev/ask-launch-flow.ts +72 -1
  497. package/src/self-dev/dev-cli.ts +7 -2
  498. package/src/self-dev/dev-pipeline.ts +5 -0
  499. package/src/self-dev/draft-residue.ts +64 -5
  500. package/src/self-dev/draft-sweep.ts +31 -10
  501. package/src/self-dev/draft-triage-rules.ts +60 -3
  502. package/src/self-dev/graph-front-nodes.ts +2 -1
  503. package/src/self-dev/graph-journey-route.ts +76 -21
  504. package/src/self-dev/launch-preflight.ts +58 -0
  505. package/src/self-dev/orchestrate.ts +1 -1
  506. package/src/self-dev/run-supervisor.ts +152 -2
  507. package/src/self-dev/shard-aggregate.ts +4 -0
  508. package/src/self-dev/shard-run.ts +36 -15
  509. package/src/self-implement/abandoned-classification.ts +12 -3
  510. package/src/self-implement/budget-gate.ts +7 -0
  511. package/src/self-implement/child-llm-preference.ts +10 -1
  512. package/src/self-implement/doctor-visit.ts +30 -8
  513. package/src/self-implement/elanous-tui-spawn.ts +3 -0
  514. package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
  515. package/src/self-implement/gate-artifacts.ts +2 -1
  516. package/src/self-implement/goal-author-cli.ts +4 -2
  517. package/src/self-implement/goal-author.ts +549 -10
  518. package/src/self-implement/graph-overlay-yaml.ts +181 -4
  519. package/src/self-implement/graph-overlay.ts +3 -1
  520. package/src/self-implement/graph-profile-yaml.ts +107 -0
  521. package/src/self-implement/graph-yaml.ts +94 -5
  522. package/src/self-implement/off-diff-evidence.ts +249 -5
  523. package/src/self-implement/orchestrator.ts +298 -26
  524. package/src/self-implement/run-chart.ts +6 -3
  525. package/src/self-implement/run-ledger.ts +51 -1
  526. package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
  527. package/src/self-implement/tdd-evidence-tags.ts +9 -0
  528. package/src/self-implement/test-scenario-request.ts +37 -6
  529. package/src/self-implement/train-gate-receipt.ts +166 -0
  530. package/src/self-implement/train-gate-remote.ts +62 -18
  531. package/src/session/chat.ts +6 -4
  532. package/src/session/session-fanout.ts +2 -0
  533. package/src/session/streaming/acp-stream-sink.ts +2 -1
  534. package/src/session/streaming/chunk-producer.ts +6 -0
  535. package/src/session/streaming/stream-compositor.ts +3 -2
  536. package/src/session-runtime/index.ts +74 -6
  537. package/src/session-runtime/retry-policy.ts +1 -1
  538. package/src/setup/llm-env-detect.ts +3 -0
  539. package/src/setup/service-key-catalog.ts +46 -0
  540. package/src/setup/service-keys.ts +241 -0
  541. package/src/sidetab-core/model.ts +205 -10
  542. package/src/sidetab-core/visible-agent-mission-pair.ts +51 -0
  543. package/src/sidetab-core/visible-agent-mission.ts +182 -48
  544. package/src/skills/tools/agent.ts +23 -4
  545. package/src/skills/tools/omni-search.ts +127 -27
  546. package/src/task-agent/parent-host.ts +29 -1
  547. package/src/task-agent/recall-inject.ts +98 -0
  548. package/src/task-agent/repair-outcomes.ts +65 -0
  549. package/src/task-agent/task-hand.ts +46 -14
  550. package/src/task-orchestrator/dispatcher.ts +14 -1
  551. package/src/task-orchestrator/linear-capture-events.ts +55 -0
  552. package/src/task-orchestrator/store.ts +16 -5
  553. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +23 -1
  554. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +107 -1
  555. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
  556. package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +21 -9
  557. package/src/task-orchestrator/surfaces/pod-source-receive.ts +23 -11
  558. package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
  559. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +1 -1
  560. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +467 -77
  561. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +45 -3
  562. package/src/task-orchestrator/surfaces/self-implement-pod.ts +210 -14
  563. package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
  564. package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
  565. package/src/task-orchestrator/types.ts +14 -0
  566. package/src/telegram.ts +14 -16
  567. package/src/terminal/coding-agent.ts +14 -5
  568. package/src/terminal/session-registry.ts +1 -1
  569. package/src/tool-hints/gate.ts +46 -14
  570. package/src/tool-hints/signals.ts +1 -1
  571. package/src/tool-hints/types.ts +2 -0
  572. package/src/tool-runtime/agent-runtime.ts +1 -0
  573. package/src/tool-runtime/browser-hand-runtime.ts +391 -0
  574. package/src/tool-runtime/browser-runtime.ts +33 -19
  575. package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
  576. package/src/tool-runtime/elanous-linear-secretary-runtime.ts +173 -0
  577. package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
  578. package/src/tool-runtime/index.ts +6 -0
  579. package/src/tool-runtime/types.ts +5 -0
  580. package/src/tui/entry.ts +51 -8
  581. package/src/tui/sidetab/attach.ts +252 -11
  582. package/src/tui/sidetab/herdr-portal.ts +225 -0
  583. package/src/tui/sidetab/list.ts +3 -2
  584. package/src/tui-client/next-dashboard-runtime.ts +52 -0
  585. package/src/user-config.ts +34 -9
  586. package/src/user-intent/types.ts +4 -3
  587. package/src/ux-sim/browser-hand.ts +165 -0
  588. package/src/ux-sim/draft-inventory-builder.ts +199 -0
  589. package/src/ux-sim/fake-browser-page.ts +81 -0
  590. package/src/ux-sim/fake-linear-device.ts +31 -0
  591. package/src/ux-sim/graph-engine-sim.ts +47 -0
  592. package/src/ux-sim/linear-secretary.ts +208 -0
  593. package/src/ux-sim/mock-scenario-catalog.json +81 -26
  594. package/src/ux-sim/mock-scenario-catalog.ts +175 -5
  595. package/src/ux-sim/onboarding-first-run-device.ts +31 -21
  596. package/src/ux-sim/release-sim-rig.ts +62 -18
  597. package/src/ux-sim/scenario.ts +70 -26
  598. package/src/ux-sim/service-key-setup.ts +113 -0
  599. package/src/ux-sim/term-slash-device.ts +74 -0
  600. package/src/ux-sim/turn-throw-sim.ts +31 -0
  601. package/src/version/packed-revision.json +1 -1
  602. package/src/web-search/exa.ts +77 -0
  603. package/src/web-search/index.ts +30 -9
  604. package/src/web-search/provider.ts +4 -1
  605. package/src/web-search/x-intent.ts +5 -0
  606. package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +0 -36
  608. package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +0 -32
  614. package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +0 -286
  620. package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +0 -34
  623. package/apps/pwa/out/_next/static/chunks/2456.b6de0e1c05f28843.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/2690.0521c738b7749931.js +0 -115
  629. package/apps/pwa/out/_next/static/chunks/2974.595d1e29d040cb6a.js +0 -64
  630. package/apps/pwa/out/_next/static/chunks/3207.a756c95e9ec8c3c8.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +0 -93
  632. package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +0 -41
  633. package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +0 -24
  635. package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +0 -77
  641. package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +0 -148
  647. package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +0 -74
  648. package/apps/pwa/out/_next/static/chunks/50061469.0326382241ef3b2d.js +0 -122
  649. package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +0 -149
  650. package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +0 -27
  652. package/apps/pwa/out/_next/static/chunks/53c73f84.373b6160adfa89a4.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +0 -226
  664. package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +0 -90
  665. package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +0 -104
  671. package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +0 -94
  672. package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +0 -24
  679. package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +0 -8
  687. package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +0 -79
  689. package/apps/pwa/out/_next/static/chunks/8546-6f03f8ea34dd61d9.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/9249.976f1e69a9d80754.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/9656-374232558fd528d0.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +0 -62
  705. package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +0 -1
  738. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +0 -1
  740. package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +0 -1
  741. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +0 -1
  744. package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +0 -1
  748. package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +0 -1
  752. package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +0 -1
  758. package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +0 -1
  760. package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +0 -1
  763. package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
  764. /package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → HMXsxdy5MIIcHPMHv1wD4}/_ssgManifest.js +0 -0
@@ -29,6 +29,7 @@
29
29
 
30
30
  import { BUILTIN_CATALOG } from '../intelligence-map/model-catalog.js';
31
31
  import { debug } from '../debug/log.js';
32
+ import { PROVIDER_ENV_SPEC } from '../setup/llm-env-detect.js';
32
33
 
33
34
  /** provider → API-key env var. catalog 이 envKey 를 안 다는 provider 의 명시 보정.
34
35
  * ⚠️ catalog 파생이 이미 값을 주는 provider 는 **여기 적지 않는다** — 이중 진실을 만들지 않기 위해. */
@@ -145,7 +146,7 @@ export function isKeylessProvider(provider: string | undefined): boolean {
145
146
  }
146
147
 
147
148
  /** 키가 어디서 왔나 — 관측·진단용(제1원칙: "왜 이 키인가"가 로그로 답해져야 한다). */
148
- type CredentialSource = 'rotation' | 'env' | 'inherited' | 'none';
149
+ type CredentialSource = 'rotation' | 'env' | 'secret-store' | 'inherited' | 'none';
149
150
 
150
151
  interface ResolvedCredential {
151
152
  /** 해석된 키. 없으면 undefined(호출자가 provider 기본 인증으로 폴백하거나 명시 실패). */
@@ -175,6 +176,8 @@ interface ResolveCredentialInput {
175
176
  /** base config 의 `llm.provider` — 전환 여부 판정용. */
176
177
  baseProvider?: string | undefined;
177
178
  env?: NodeJS.ProcessEnv;
179
+ /** 이미 조회한 SecretStore 값. 값은 런타임 메모리에서만 전달한다. */
180
+ secretStoreApiKey?: string | undefined;
178
181
  }
179
182
 
180
183
  /**
@@ -183,8 +186,9 @@ interface ResolveCredentialInput {
183
186
  * 우선순위(대표 결정 (a)):
184
187
  * ① `llm.rotation` 에서 같은 provider 엔트리의 apiKey (config·감사 가능)
185
188
  * ② `providerEnvKey(provider)` 로 읽은 env
186
- * ③ provider 가 **안 바뀐** 경우에 한해 base `llm.apiKey` 상속
187
- * ④ 없음 — 호출자가 판단(구독/OAuth provider 는 이게 정상일 수 있다)
189
+ * ③ 기존 SecretStore (`providerEnvKey` 와 같은 ID)
190
+ * ④ provider 가 **안 바뀐** 경우에 한해 base `llm.apiKey` 상속
191
+ * ⑤ 없음 — 호출자가 판단(구독/OAuth provider 는 이게 정상일 수 있다)
188
192
  *
189
193
  * ⚠️ ③ 이 마지막인 것이 이 수리의 핵심이다. 종전엔 ③ 이 **무조건 첫 번째**였고, 그래서 provider 가
190
194
  * 바뀌어도 옛 provider 의 키가 따라갔다(= 401 의 근본). provider 가 바뀌었으면 base 키는 **틀린 키**다.
@@ -221,10 +225,20 @@ export function resolveProviderCredential(input: ResolveCredentialInput): Resolv
221
225
 
222
226
  // ② env — provider 별 표준 env var.
223
227
  const envKey = providerEnvKey(provider);
224
- const fromEnv = envKey ? env[envKey]?.trim() : undefined;
225
- if (fromEnv) return { apiKey: fromEnv, source: 'env', ...(envKey ? { envKey } : {}), ...withUrl };
228
+ const envSpec = PROVIDER_ENV_SPEC.find((spec) => spec.provider === provider);
229
+ const envCandidates = [...new Set([envKey, envSpec?.primaryKeyEnv, ...(envSpec?.aliasKeyEnvs ?? [])]
230
+ .filter((name): name is string => Boolean(name)))];
231
+ for (const candidate of envCandidates) {
232
+ const fromEnv = env[candidate]?.trim();
233
+ if (fromEnv) return { apiKey: fromEnv, source: 'env', envKey: candidate, ...withUrl };
234
+ }
235
+
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 };
226
240
 
227
- // ③ 상속 — **provider 가 확실히 그대로일 때만.** 바뀌었으면 base 키는 다른 provider 것이라 틀렸다.
241
+ // ④ 상속 — **provider 가 확실히 그대로일 때만.** 바뀌었으면 base 키는 다른 provider 것이라 틀렸다.
228
242
  // ⚠️ 리뷰 must-fix(#5488 2R): 종전 판정은 `!switched` 였는데 `baseProvider` 가 없으면 switched=false
229
243
  // 가 되어 **전환 여부를 모르는데 상속**했다 = 401 재현. 상속은 `provider === baseProvider` 가
230
244
  // **명시적으로 참**일 때만 허용한다(모르면 상속 안 함 = fail-closed).
@@ -240,6 +254,54 @@ export function resolveProviderCredential(input: ResolveCredentialInput): Resolv
240
254
  return { source: 'none', ...(envKey ? { envKey } : {}), ...withUrl };
241
255
  }
242
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
+
243
305
  /**
244
306
  * 해석 결과를 관측에 남긴다 — 제1원칙(관측 없으면 자기인지·힐링 불가). **키 값은 절대 싣지 않는다**(이름·출처만).
245
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;
@@ -4577,7 +4594,8 @@ function configuredFallbackChainSteps(): readonly string[] {
4577
4594
  try {
4578
4595
  const { getUserConfig } = require('./user-config.js') as typeof import('./user-config.js');
4579
4596
  const { normalizeFallbackChain } = require('./oauth/fallback-chain.js') as typeof import('./oauth/fallback-chain.js');
4580
- return normalizeFallbackChain(getUserConfig().llm.fallbackChain).chain;
4597
+ const llm = getUserConfig().llm;
4598
+ return normalizeFallbackChain(llm.fallbackChain, llm.provider).chain;
4581
4599
  } catch (err) {
4582
4600
  // ⛔ 조용히 삼키면 「설정을 못 읽었다」가 「폴백 후보가 없다」로 «둔갑»한다 —
4583
4601
  // 호출자는 그것을 `fallback candidates exhausted` 로 보고 사람에게 그렇게 말한다.
@@ -5113,11 +5131,16 @@ async function consumeProviderText(
5113
5131
  export async function streamLLM(
5114
5132
  messages: LLMMessage[],
5115
5133
  onChunk: (delta: string, full: string) => void,
5116
- 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
+ } = {},
5117
5140
  ): Promise<string> {
5118
5141
  const started = Date.now();
5119
- let activeProvider = opts.provider ?? opts.initialProvider ?? resolveDefaultProvider(opts.model);
5120
- 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 ?? [])]);
5121
5144
  let blockedProviders: ProviderFallbackAttempt[] = [];
5122
5145
  let modelOverride = opts.model;
5123
5146
 
@@ -5130,6 +5153,11 @@ export async function streamLLM(
5130
5153
  const activeModel = finalized.model;
5131
5154
  if (getModelFamily(activeModel) === 'claude') assertNoTopLevelToolSchemaCombinators(opts.tools);
5132
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
+ });
5133
5161
  debug.log('llm.router', 'streamLLM', {
5134
5162
  provider: activeProvider.name,
5135
5163
  model: activeModel,
@@ -5152,6 +5180,7 @@ export async function streamLLM(
5152
5180
  );
5153
5181
  const full = consumed.full;
5154
5182
  if (consumed.ok) {
5183
+ await recordChildFirstLlmResponse({ status: 'ok' });
5155
5184
  if (consumed.usage !== 'unmeasured') {
5156
5185
  try {
5157
5186
  logAgentTurnUsage(activeModel, consumed.usage, { providerName: activeProvider.name, site: opts.usageSite ?? 'stream-llm', role: opts.usageRole, phase: opts.usagePhase, jobKind: opts.usageJobKind });
@@ -5170,6 +5199,11 @@ export async function streamLLM(
5170
5199
  }
5171
5200
 
5172
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
+ });
5173
5207
  if (err instanceof OverloadFailoverError && !opts.provider) {
5174
5208
  const switched = activeProvider.name === 'openai-codex'
5175
5209
  ? firstAvailableFallbackProvider(attemptedProviders, opts)
@@ -5196,6 +5230,7 @@ export async function streamLLM(
5196
5230
  model: activeModel,
5197
5231
  durationMs: Date.now() - started,
5198
5232
  message: reason,
5233
+ ...providerFailureEvidence(err),
5199
5234
  ...(isAuthRejectionError(err) ? { authRejected: true } : {}),
5200
5235
  }, { level: 'error' });
5201
5236
  if (opts.provider) {
@@ -5342,6 +5377,44 @@ export function resolveDefaultProvider(model?: string): LLMProvider {
5342
5377
  }
5343
5378
  }
5344
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
+
5345
5418
  /** Handlers + result for `streamLLMWithTools`. */
5346
5419
  export interface StreamWithToolsHandlers {
5347
5420
  /** Streaming text delta — invoked for every text chunk across all turns. */
@@ -8595,7 +8668,7 @@ export async function streamLLMWithTools(
8595
8668
  const circuit = !opts.provider && !opts.initialProvider
8596
8669
  ? await import('./session-runtime/provider-circuit.js')
8597
8670
  : undefined;
8598
- const provider = opts.provider ?? opts.initialProvider ?? resolveDefaultProvider(opts.model);
8671
+ const provider = opts.provider ?? opts.initialProvider ?? await resolveDefaultProviderAsync(opts.model);
8599
8672
  const initial = finalizeStreamingProviderModel(provider, opts.model ?? provider.defaultModel);
8600
8673
  let activeProvider = initial.provider;
8601
8674
  let activeModel = initial.model;
@@ -8621,6 +8694,19 @@ export async function streamLLMWithTools(
8621
8694
  }
8622
8695
  }
8623
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
+ };
8624
8710
  const attemptedProviders = new Set<string>([
8625
8711
  activeProvider.name,
8626
8712
  ...(circuitBlockedInitialProvider ? [circuitBlockedInitialProvider] : []),
@@ -9170,7 +9256,9 @@ export async function streamLLMWithTools(
9170
9256
  const base = {
9171
9257
  ...opts,
9172
9258
  model: activeModel,
9173
- tools: completionNeedsFinalTurn && !keepToolsNoCall ? [] : activeTools,
9259
+ tools: completionNeedsFinalTurn && !keepToolsNoCall
9260
+ ? []
9261
+ : turn === 0 && opts.firstTurnTools ? opts.firstTurnTools : activeTools,
9174
9262
  remainingFallbacks,
9175
9263
  };
9176
9264
  if (keepToolsNoCall) return { ...base, toolChoice: 'none' as const };
@@ -9303,7 +9391,11 @@ export async function streamLLMWithTools(
9303
9391
  new Promise<{ idle: true }>((res) => { idleTimer = setTimeout(() => res({ idle: true }), streamIdleTimeoutMs); }),
9304
9392
  ]);
9305
9393
  if (step.idle) throw new StreamIdleTimeoutError(streamIdleTimeoutMs);
9394
+ await recordChildFirstLlmResponse({ status: 'ok' });
9306
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 });
9307
9399
  if (idleTimer) clearTimeout(idleTimer);
9308
9400
  releaseStreamAttempt(true, err);
9309
9401
  if (err instanceof ApiHttpError && err.status === 400 && providerToolSchemaDiagnostics) {
@@ -12809,14 +12901,14 @@ export function getProviderForConfig(
12809
12901
  }
12810
12902
  const crossFamilyModel = (model || userConfig.llm.model) && resolvedProviderName !== provider;
12811
12903
  if (crossFamilyModel) {
12812
- const keyPrefix = (userConfig.llm.apiKey || '').slice(0, 7);
12813
- const keyImplies = keyPrefix.startsWith('sk-ant')
12904
+ const key = userConfig.llm.apiKey || '';
12905
+ const keyImplies = key.startsWith('sk-ant')
12814
12906
  ? 'anthropic'
12815
- : keyPrefix.startsWith('xai-')
12907
+ : key.startsWith('xai-')
12816
12908
  ? 'grok'
12817
- : keyPrefix.startsWith('sk-')
12909
+ : key.startsWith('sk-')
12818
12910
  ? 'openai'
12819
- : keyPrefix
12911
+ : key
12820
12912
  ? 'unknown'
12821
12913
  : 'none';
12822
12914
  const keyMismatch =
@@ -12827,7 +12919,6 @@ export function getProviderForConfig(
12827
12919
  configProvider: provider,
12828
12920
  model: decision.model,
12829
12921
  implied: resolvedProviderName,
12830
- keyPrefix: keyPrefix || null,
12831
12922
  keyImplies,
12832
12923
  keyMismatch,
12833
12924
  }, { level: 'info' });
@@ -12872,6 +12963,75 @@ export function getProviderForConfig(
12872
12963
  // union without a case here fails loud at first call.
12873
12964
  throw new Error(`unknown provider: ${provider as string}`);
12874
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
+ }
12875
13035
  import { getModelFamily, isGpt6GenerationModel, usesCodexBehaviorGuards } from './models/prompts.js';
12876
13036
  import type { ModelFamily } from './models/prompts.js';
12877
13037
 
@@ -59,10 +59,10 @@ export const FEATURE_MATURITY = {
59
59
  },
60
60
  // Canonical CLI command names only; aliases inherit their command's grade.
61
61
  cliRoot: {
62
- preview: 'beta', pty: 'beta', pr: 'beta', repo: 'beta', role: 'beta', machine: 'beta', image: 'beta', 'agent-env': 'beta',
62
+ preview: 'beta', pty: 'beta', pr: 'beta', repo: 'beta', role: 'beta', machine: 'beta', image: 'beta', 'agent-env': 'beta', catalog: 'beta',
63
63
  where: 'stable', bench: 'beta', shadow: 'beta', llm: 'beta', storage: 'beta', leader: 'beta',
64
64
  pod: 'beta', browser: 'beta', questions: 'beta', usage: 'stable', live: 'beta',
65
- research: 'beta', release: 'beta', rfc: 'beta', know: 'beta', freeze: 'beta', herdr: 'beta', flow: 'beta', seat: 'beta', hq: 'beta', steward: 'beta', coord: 'beta', context: 'beta', 'model-watch': 'beta', doctor: 'stable',
65
+ research: 'beta', release: 'beta', rfc: 'beta', know: 'beta', life: 'beta', freeze: 'beta', herdr: 'beta', flow: 'beta', seat: 'beta', hq: 'beta', steward: 'beta', coord: 'beta', context: 'beta', 'model-watch': 'beta', doctor: 'stable',
66
66
  control: 'beta', resources: 'beta', hooks: 'beta', setup: 'stable', start: 'stable',
67
67
  grounding: 'beta', graph: 'beta', loop: 'stable', resource: 'beta', card: 'stable', 'launch-head': 'beta',
68
68
  a2a: 'beta', plugin: 'stable', make: 'beta', skills: 'beta', connect: 'beta', import: 'beta',
@@ -82,7 +82,7 @@ export const FEATURE_MATURITY = {
82
82
  onboarding: 'beta', login: 'stable', session: 'beta', chat: 'stable', repl: 'stable',
83
83
  agent: 'stable', registry: 'beta', tier: 'stable', local: 'beta', scheduler: 'beta',
84
84
  attach: 'beta', wf: 'beta', nexus: 'stable', phone: 'beta', token: 'beta',
85
- acp: 'beta', voice: 'beta', sim: 'beta',
85
+ acp: 'beta', voice: 'beta', sim: 'beta', tui: 'system',
86
86
  'run-detached': 'system', dogfood: 'system', run: 'system',
87
87
  },
88
88
  // Canonical names only; aliases inherit their command's grade at lookup.
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, {
package/src/mcp/server.ts CHANGED
@@ -29,6 +29,7 @@ import { buildCliAgentTools } from '../cli/agent-cli.js';
29
29
  import { getUserConfig } from '../user-config.js';
30
30
  import type { TokenScope } from '../auth/scope.js';
31
31
  import { filterToolsForScope, isToolAllowedForScope } from '../nexus/api/mcp-public-allowlist.js';
32
+ import { normalizeRunId } from '../harness/harness-space.js';
32
33
 
33
34
  // ─── JSON-RPC shapes ─────────────────────────────────────────────
34
35
 
@@ -102,6 +103,30 @@ export interface McpServerContext {
102
103
  tokenScope?: TokenScope;
103
104
  }
104
105
 
106
+ /** Accept only an already-safe run identifier from standard MCP params._meta. */
107
+ function mcpRunId(params: Record<string, unknown> | undefined): string | undefined {
108
+ const meta = params?._meta;
109
+ if (!meta || typeof meta !== 'object' || Array.isArray(meta)) return undefined;
110
+ const value = (meta as Record<string, unknown>).elanousRunId;
111
+ if (typeof value !== 'string' || !/^[A-Za-z0-9_-]{1,64}$/.test(value)) return undefined;
112
+ const normalized = normalizeRunId(value);
113
+ return normalized === value ? value : undefined;
114
+ }
115
+
116
+ function logAsideRunIdDrop(toolName: string, params: Record<string, unknown> | undefined): void {
117
+ const meta = params?._meta;
118
+ const raw = meta && typeof meta === 'object' && !Array.isArray(meta)
119
+ ? (meta as Record<string, unknown>).elanousRunId
120
+ : undefined;
121
+ const reason = typeof raw !== 'string'
122
+ ? 'missing-or-non-string'
123
+ : !/^[A-Za-z0-9_-]{1,64}$/.test(raw)
124
+ ? 'invalid-format'
125
+ : normalizeRunId(raw) !== raw ? 'not-normalized' : 'validation-rejected';
126
+ try { debug.log('mcp-server.aside', 'elanous-tool-call-run-id-dropped', { toolName, reason }); }
127
+ catch { /* observation must not block the caller */ }
128
+ }
129
+
105
130
  /** Emit a `system.mcp.proxy_call` user-intent event for a single
106
131
  * tool dispatch. Best-effort — sink failures swallowed upstream by
107
132
  * `userIntentLogger.emit`, and the outer try/catch keeps the
@@ -177,8 +202,20 @@ export async function handleMcpRequest(
177
202
  const args = (req.params?.arguments as Record<string, unknown>) ?? {};
178
203
  const surface = ctx.surface ?? 'mcp';
179
204
  const rt = getToolRuntime(name);
205
+ const runId = ctx.clientName === 'aside' ? mcpRunId(req.params) : undefined;
206
+ if (ctx.clientName === 'aside' && !runId) logAsideRunIdDrop(name, req.params);
207
+ const asideReturn = runId !== undefined;
180
208
  const isExposedOnSurface = listToolRuntimes(surface).some(runtime => runtime.id === rt?.id);
181
209
  if (!rt || !isExposedOnSurface) {
210
+ if (asideReturn) {
211
+ try {
212
+ debug.log('mcp-server.aside', 'elanous-tool-call', { runId, toolName: name });
213
+ debug.log('mcp-server.aside', 'elanous-tool-result', {
214
+ runId, toolName: name, ok: false,
215
+ errorClass: rt ? 'tool_not_exposed' : 'unknown_tool',
216
+ });
217
+ } catch { /* observation must not block the caller */ }
218
+ }
182
219
  emitProxyCallIntent(name, ctx.origin, false, 'unknown_tool');
183
220
  return {
184
221
  ...base,
@@ -186,6 +223,10 @@ export async function handleMcpRequest(
186
223
  };
187
224
  }
188
225
  try {
226
+ if (asideReturn) {
227
+ try { debug.log('mcp-server.aside', 'elanous-tool-call', { runId, toolName: name }); }
228
+ catch { /* observation must not block the caller */ }
229
+ }
189
230
  const isMcpAgent = surface === 'mcp' && rt.id === 'agent';
190
231
  const agentArgs = isMcpAgent
191
232
  ? { ...args, run_in_background: args.run_in_background ?? true }
@@ -198,6 +239,7 @@ export async function handleMcpRequest(
198
239
  const out = await dispatchToolByName(name, agentArgs, {
199
240
  surface,
200
241
  ...(ctx.clientName ? { mcpClient: ctx.clientName } : {}),
242
+ ...(runId ? { runId } : {}),
201
243
  ...(agentTools ? {
202
244
  agentHostTools: agentTools.specs,
203
245
  agentCwd,
@@ -212,10 +254,22 @@ export async function handleMcpRequest(
212
254
  background: agentArgs.run_in_background === true,
213
255
  });
214
256
  }
257
+ if (asideReturn) {
258
+ const resultRecord = out && typeof out === 'object' ? out as Record<string, unknown> : {};
259
+ const toolOk = resultRecord.ok === false || resultRecord.isError === true
260
+ ? false
261
+ : resultRecord.ok === true ? true : null;
262
+ try { debug.log('mcp-server.aside', 'elanous-tool-result', { runId, toolName: name, ok: toolOk }); }
263
+ catch { /* observation must not block the caller */ }
264
+ }
215
265
  emitProxyCallIntent(name, ctx.origin, true);
216
266
  return { ...base, result: toMcpToolCallResult(out) };
217
267
  } catch (err) {
218
268
  const msg = err instanceof Error ? err.message : String(err);
269
+ if (asideReturn) {
270
+ try { debug.log('mcp-server.aside', 'elanous-tool-result', { runId, toolName: name, ok: false, errorClass: err instanceof Error ? err.name : 'unknown' }); }
271
+ catch { /* observation must not block the caller */ }
272
+ }
219
273
  emitProxyCallIntent(name, ctx.origin, false, msg);
220
274
  throw err;
221
275
  }