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
@@ -39,6 +39,18 @@ function readInstalledLockHash(repoDir: string): string | null {
39
39
  } catch { return null; }
40
40
  }
41
41
 
42
+ function pathIsAbsent(path: string): boolean {
43
+ try { lstatSync(path); return false; }
44
+ catch (error) { return (error as NodeJS.ErrnoException).code === 'ENOENT'; }
45
+ }
46
+
47
+ function isRealDirectory(path: string): boolean {
48
+ try {
49
+ const stat = lstatSync(path);
50
+ return stat.isDirectory() && !stat.isSymbolicLink();
51
+ } catch { return false; }
52
+ }
53
+
42
54
  /** Record the image's installed dependency lock once source verification ties it to the worker key. */
43
55
  function rememberInstalledLockHash(repoDir: string, lockHash: string): void {
44
56
  try {
@@ -261,7 +273,35 @@ export class WarmWorkerRuntime {
261
273
  }, { level: 'warn' }); } catch { /* observation cannot revive an unsafe worker */ }
262
274
  return { reply: null, quarantineWorker: true, reason: 'cleanup-failed', artifactsDir };
263
275
  }
264
- mkdirSync(this.options.scratchDir, { recursive: true });
276
+ try {
277
+ (this.options.removeScratch ?? ((path: string) => rmSync(path, { recursive: true, force: true })))(this.options.scratchDir);
278
+ // A successful rm call is not proof of cleanup: a stub can be a no-op, and an
279
+ // attacker can replace the path with a symlink before the next mkdir.
280
+ if (!pathIsAbsent(this.options.scratchDir)) throw new Error('scratch path remains after removal');
281
+ } catch {
282
+ this.quarantined = true;
283
+ try { debug.log('pod.reuse', 'clean-failed', {
284
+ runId: command.runId, attemptId: command.attemptId, workerId: command.workerId,
285
+ // The worker outcome stays cleanup-failed for callers; this event reason identifies the scratch phase.
286
+ // Include only a path that lstat can still observe; a failed rm may also have removed it.
287
+ reason: 'scratch-removal-failed',
288
+ remainingPaths: pathIsAbsent(this.options.scratchDir) ? [] : [this.options.scratchDir],
289
+ }, { level: 'warn' }); } catch { /* observation cannot revive an unsafe worker */ }
290
+ return { reply: null, quarantineWorker: true, reason: 'cleanup-failed', artifactsDir };
291
+ }
292
+ try {
293
+ // Non-recursive mkdir refuses a path that was recreated (for example as a
294
+ // symlink) after the absence check. Validate the resulting path type as well.
295
+ mkdirSync(this.options.scratchDir);
296
+ if (!isRealDirectory(this.options.scratchDir)) throw new Error('scratch path is not a real directory');
297
+ } catch {
298
+ this.quarantined = true;
299
+ try { debug.log('pod.reuse', 'clean-failed', {
300
+ runId: command.runId, attemptId: command.attemptId, workerId: command.workerId,
301
+ reason: 'scratch-directory-unsafe', remainingPaths: [this.options.scratchDir],
302
+ }, { level: 'warn' }); } catch { /* observation cannot revive an unsafe worker */ }
303
+ return { reply: null, quarantineWorker: true, reason: 'cleanup-failed', artifactsDir };
304
+ }
265
305
  mkdirSync(artifactsRoot, { recursive: true });
266
306
  mkdirSync(artifactsDir, { recursive: true, mode: 0o700 });
267
307
  const startedAt = now();
@@ -304,8 +344,10 @@ export class WarmWorkerRuntime {
304
344
  reason = 'execution-error';
305
345
  break;
306
346
  } finally {
307
- try { (this.options.removeScratch ?? ((path: string) => rmSync(path, { recursive: true } )))(sandbox); }
308
- catch { this.quarantined = true; reason = 'cleanup-failed'; }
347
+ try {
348
+ (this.options.removeScratch ?? ((path: string) => rmSync(path, { recursive: true, force: true })))(sandbox);
349
+ if (!pathIsAbsent(sandbox)) throw new Error('request sandbox remains after removal');
350
+ } catch { this.quarantined = true; reason = 'cleanup-failed'; }
309
351
  }
310
352
  if (now() >= command.deadlineAt) reason = 'execution-error';
311
353
  if (reason !== 'complete') break;
@@ -22,7 +22,7 @@ import { isVerifiedOpenGatewayModel } from '../../llm/opengateway-models.js';
22
22
  import { configuredOpenGatewayKeys } from '../../llm/provider-credentials.js';
23
23
  import { collectPodLedgers, createPodLedgerFollower } from './pod-ledger-collect.js';
24
24
  import { captureFailedPodJobs } from './pod-ledger-events.js';
25
- import { collectPodArtifacts, podNoResultDiagnostic, POD_SALVAGE_BUNDLE_FILE_LIMIT, POD_SALVAGE_BUNDLE_TOTAL_LIMIT } from './pod-artifact-return.js';
25
+ import { collectPodArtifacts, podNoResultChildError, podNoResultDiagnostic, POD_SALVAGE_BUNDLE_FILE_LIMIT, POD_SALVAGE_BUNDLE_TOTAL_LIMIT } from './pod-artifact-return.js';
26
26
  import { readPodRepairArtifact } from './pod-repair-commit.js';
27
27
  import { isValidAccountName, resolveCodexAccount } from '../../oauth/codex-account.js';
28
28
  import { createCodexAccessMirror } from '../../oauth/codex-access-mirror.js';
@@ -32,6 +32,7 @@ import { finishPodFragment, writePodFragment } from '../../harness/self-send-tar
32
32
  import { mintRunId, normalizeRunId } from '../../harness/harness-space.js';
33
33
  import { TA_LAND_ENV } from '../../task-agent/task-hand.js';
34
34
  import { appendRunLedgerEntry, loadRunLedger, runLedgerDir, runLedgerPath, type RunLedgerEntry } from '../../self-implement/run-ledger.js';
35
+ import { childFirstLlmFact, childFirstLlmReportFact } from '../../llm/child-first-llm-observation.js';
35
36
  import { recordRunStop } from '../../self-implement/run-stop.js';
36
37
  import { gateFailureReceipt, gateFailureReceiptLines } from '../../self-implement/gate-failure-signature.js';
37
38
  import { runSuffixKey } from '../../self-implement/salvage-branches.js';
@@ -148,6 +149,19 @@ import { findGitDir } from '../../git-fs/locate.js';
148
149
  import { hostLeaseBaseDir } from '../../pod-lease/host-lease.js';
149
150
  import { acquireLockAsync } from '../../storage/file-lock.js';
150
151
  import { debug, redactSecretText } from '../../debug/log.js';
152
+
153
+ function readPodChildFirstLlmFact(runId: string, ledgerDir: string, report = false) {
154
+ try {
155
+ const entries = loadRunLedger(runId, ledgerDir) ?? [];
156
+ return report ? childFirstLlmReportFact(entries) : childFirstLlmFact(entries);
157
+ } catch (error) {
158
+ debug.log('self-implement.pod', 'child-first-llm-ledger-unavailable', {
159
+ childRunId: runId,
160
+ reason: error instanceof Error ? error.message : String(error),
161
+ }, { level: 'warn' });
162
+ return undefined;
163
+ }
164
+ }
151
165
  import { enterJourneyNode, exitJourneyNode, passJourneyNode } from '../../self-dev/graph-journey-nodes.js';
152
166
  import { routeJourneyEdge } from '../../self-dev/graph-journey-route.js';
153
167
  import { selectLiveDetail } from '../../live/detail-switch.js';
@@ -1003,9 +1017,11 @@ function podCodexAccountScript(accounts: readonly string[]): string {
1003
1017
  return [
1004
1018
  'mkdir -p "$HOME/.elanous" "$HOME/.codex"',
1005
1019
  // Names travel as JSON data, never as shell syntax. Reconstruct the account-store keys that elanous resolves at runtime.
1006
- `POD_CODEX_ACCOUNTS='${JSON.stringify(accounts)}' bun -e 'const fs=require("node:fs"),path=require("node:path");const names=JSON.parse(process.env.POD_CODEX_ACCOUNTS),home=process.env.HOME;const providers={};let version;for(let i=0;i<names.length;i++){const payload=JSON.parse(fs.readFileSync("/creds/codex-"+i+".json","utf8"));const row=JSON.parse(payload.elanousAuth);if(i===0)version=row.version;const entry=row.providers["openai-codex"];if(!entry)throw Error("missing codex account credential "+i);const codexHome=path.join(home,".elanous/codex-accounts",String(i));fs.mkdirSync(codexHome,{recursive:true});fs.writeFileSync(path.join(codexHome,"auth.json"),payload.codexAuth,{mode:0o600});fs.chmodSync(path.join(codexHome,"auth.json"),0o600);providers[names[i]==="default"?"openai-codex":"openai-codex:"+names[i]]={...entry,codexHome}}if(!providers["openai-codex"])providers["openai-codex"]=providers["openai-codex:"+names[0]];fs.writeFileSync(path.join(home,".elanous/auth.json"),JSON.stringify({version,providers}),{mode:0o600});fs.chmodSync(path.join(home,".elanous/auth.json"),0o600);fs.copyFileSync(path.join(home,".elanous/codex-accounts/0/auth.json"),path.join(home,".codex/auth.json"));fs.chmodSync(path.join(home,".codex/auth.json"),0o600)' || exit 5`,
1020
+ `POD_CODEX_ACCOUNTS='${JSON.stringify(accounts)}' bun -e 'const fs=require("node:fs"),path=require("node:path");const names=JSON.parse(process.env.POD_CODEX_ACCOUNTS),home=process.env.HOME;const providers={},mirrorProviders={};let version;for(let i=0;i<names.length;i++){const payload=JSON.parse(fs.readFileSync("/creds/codex-"+i+".json","utf8"));const row=JSON.parse(payload.elanousAuth);if(i===0)version=row.version;const entry=row.providers["openai-codex"];if(!entry||!entry.tokens||typeof entry.tokens.accessToken!=="string"||!entry.tokens.accessToken||typeof entry.tokens.expiresAt!=="number"||!Number.isFinite(entry.tokens.expiresAt))throw Error("missing Codex access snapshot "+i);const accountKey=names[i]==="default"?"openai-codex":"openai-codex:"+names[i];const codexHome=path.join(home,".elanous/codex-accounts",String(i));fs.mkdirSync(codexHome,{recursive:true});fs.writeFileSync(path.join(codexHome,"auth.json"),payload.codexAuth,{mode:0o600});fs.chmodSync(path.join(codexHome,"auth.json"),0o600);providers[accountKey]={...entry,codexHome};mirrorProviders[accountKey]={authMode:"chatgpt",tokens:{accessToken:entry.tokens.accessToken,expiresAt:entry.tokens.expiresAt,refreshToken:"",refresh_token:""}}}if(!providers["openai-codex"])providers["openai-codex"]=providers["openai-codex:"+names[0]];if(!mirrorProviders["openai-codex"])mirrorProviders["openai-codex"]=mirrorProviders["openai-codex:"+names[0]];fs.writeFileSync(path.join(home,".elanous/auth.json"),JSON.stringify({version,providers}),{mode:0o600});fs.chmodSync(path.join(home,".elanous/auth.json"),0o600);const mirrorDir=path.join(home,".elanous/remote-parent-credentials/cli-mirror");fs.mkdirSync(mirrorDir,{recursive:true,mode:0o700});fs.chmodSync(mirrorDir,0o700);const mirrorPath=path.join(mirrorDir,"auth.json");fs.writeFileSync(mirrorPath,JSON.stringify({version,providers:mirrorProviders}),{mode:0o600});fs.chmodSync(mirrorPath,0o600);fs.copyFileSync(path.join(home,".elanous/codex-accounts/0/auth.json"),path.join(home,".codex/auth.json"));fs.chmodSync(path.join(home,".codex/auth.json"),0o600)' || exit 5`,
1007
1021
  `export ELANOUS_CODEX_ACCOUNT='${accounts[0]!.replace(/'/g, `'\\''`)}'`,
1008
1022
  'export ELANOUS_CODEX_ACCOUNT_HOME="$HOME/.elanous/codex-accounts/0" CODEX_HOME="$HOME/.elanous/codex-accounts/0"',
1023
+ 'export ELANOUS_REMOTE_CODEX_ACCESS_ONLY=1',
1024
+ 'export ELANOUS_REMOTE_CODEX_MIRROR_PATH="$HOME/.elanous/remote-parent-credentials/cli-mirror/auth.json"',
1009
1025
  podQuotaPolicyExport(),
1010
1026
  ].join('\n');
1011
1027
  }
@@ -1504,7 +1520,9 @@ if [ "$found" -eq 0 ]; then echo ELANOUS_RUN_LEDGER_NONE; fi`,
1504
1520
  // ⭐ 런 계약(graph-run-contract.ts) — 이 칸이 «실제로» Pod 이고, 부모가 정한 계약도 Pod 다. 안의 그래프가 노드마다 대조한다.
1505
1521
  { name: ACTUAL_SUBSTRATE_ENV, value: 'pod' }, { name: RUN_CONTRACT_ENV, value: carryRunContract({ substrate: 'pod' }) },
1506
1522
  ...Object.entries(o.armEnv ?? {}).map(([name, value]) => ({ name, value })),
1507
- ...o.passEnv.map((key) => ({ name: key, valueFrom: { secretKeyRef: { name: `${o.name}-creds`, key: `env-${key}` } } })),
1523
+ // Growth admission is host-validated control state, never a caller-provided Secret env.
1524
+ ...o.passEnv.filter((key) => key !== 'ELANOUS_GRAPH_GROWTH_SCOPE')
1525
+ .map((key) => ({ name: key, valueFrom: { secretKeyRef: { name: `${o.name}-creds`, key: `env-${key}` } } })),
1508
1526
  ...(o.bedrock ? bedrockPodEnv(o.bedrock) : []),
1509
1527
  ...(o.zai || o.zaiFallback ? zaiPodEnv(o.zai ?? o.zaiFallback!) : []),
1510
1528
  ],
@@ -2631,7 +2649,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
2631
2649
  }
2632
2650
  }
2633
2651
  // Grok 자격은 전용 Secret 키 하나로만 보낸다 — passEnv 의 API 키 중복 전달은 막는다.
2634
- const passKeys = [...new Set([...(options.passEnv ?? []), ...(openrouterCredentialNeeded && openrouterKey ? ['OPENROUTER_API_KEY'] : []), ...(openGateway ? ['OPENGATEWAY_API_KEY'] : []), ...(anthropic ? ['ANTHROPIC_API_KEY'] : [])])].filter((key) => key !== 'ELANOUS_LIVE_DETAIL_UNTIL'
2652
+ const passKeys = [...new Set([...(options.passEnv ?? []), ...(openrouterCredentialNeeded && openrouterKey ? ['OPENROUTER_API_KEY'] : []), ...(openGateway ? ['OPENGATEWAY_API_KEY'] : []), ...(anthropic ? ['ANTHROPIC_API_KEY'] : [])])].filter((key) => key !== 'ELANOUS_GRAPH_GROWTH_SCOPE' && key !== 'ELANOUS_LIVE_DETAIL_UNTIL'
2635
2653
  && key !== POD_GITHUB_CREDENTIAL_TOKEN_ENV && key !== POD_GITHUB_CREDENTIAL_URL_ENV
2636
2654
  && (!grok || !['XAI_API_KEY', 'GROK_API_KEY', 'GROK_CODE_XAI_API_KEY'].includes(key)));
2637
2655
  const skillEnvs: Record<string, string> = options.skillEnv
@@ -2811,7 +2829,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
2811
2829
  const hostKey = (k: string): string | undefined => k === 'OPENROUTER_API_KEY' && openrouterCredentialNeeded ? openrouterKey : k === 'OPENGATEWAY_API_KEY' && openGateway ? openGatewayKey : k === 'ANTHROPIC_API_KEY' && anthropic ? anthropicKey : env[k] ?? (options.readKeyCache ?? defaultReadKeyCache)(k);
2812
2830
  const hostFallbackNames = hostConfig.llm.fallbackChain;
2813
2831
  const zaiOverage = zaiLaunchOverage ?? zaiSettingsFromConfig(hostConfig.llm).overage;
2814
- const normalizedFallback = normalizeFallbackChain(hostFallbackNames);
2832
+ const normalizedFallback = normalizeFallbackChain(hostFallbackNames, hostConfig.llm.provider);
2815
2833
  let fallbackSteps = normalizedFallback.chain;
2816
2834
  let zaiFallbackSpec: ZaiPodSpec | undefined;
2817
2835
  const codexChild = options.provider === undefined || options.provider === 'openai-codex';
@@ -2996,10 +3014,11 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
2996
3014
  ...(credentialRelay ? [POD_CREDENTIAL_TOKEN_ENV] : []),
2997
3015
  ...(githubRelay ? [POD_GITHUB_CREDENTIAL_TOKEN_ENV] : []),
2998
3016
  ];
3017
+ const podGrowthScope = env.ELANOUS_GRAPH_GROWTH_SCOPE === 'harness' ? 'harness' : undefined;
2999
3018
  const detail = selectLiveDetail(options.liveDetailFile ? { path: options.liveDetailFile } : {}).state;
3000
3019
  const detailUntil = detail && (detail.scope === 'all' || detail.scope === parentRunId || detail.scope === launchRunId) && detail.until > Date.now()
3001
3020
  ? String(detail.until) : undefined;
3002
- const armEnv = Object.fromEntries(Object.entries(options.armEnv ?? {}).filter(([key]) => key !== 'ELANOUS_LIVE_DETAIL_UNTIL' && !key.startsWith('ELANOUS_PROMPT_ENHANCE_') && key !== POD_GITHUB_CREDENTIAL_TOKEN_ENV && key !== POD_GITHUB_CREDENTIAL_URL_ENV && (!hostRefresh || !['GH_TOKEN', 'GITHUB_TOKEN', 'GH_CONFIG_DIR'].includes(key))));
3021
+ const armEnv = Object.fromEntries(Object.entries(options.armEnv ?? {}).filter(([key]) => key !== 'ELANOUS_GRAPH_GROWTH_SCOPE' && key !== 'ELANOUS_LIVE_DETAIL_UNTIL' && !key.startsWith('ELANOUS_PROMPT_ENHANCE_') && key !== POD_GITHUB_CREDENTIAL_TOKEN_ENV && key !== POD_GITHUB_CREDENTIAL_URL_ENV && (!hostRefresh || !['GH_TOKEN', 'GITHUB_TOKEN', 'GH_CONFIG_DIR'].includes(key))));
3003
3022
  const seat = env.ELANOUS_HARNESS_SEAT;
3004
3023
  const authorEnv = authorChoice ? {
3005
3024
  ...(authorChoice.modelSource !== 'default' || inferProviderFromModel(authorChoice.model) === 'openai-codex' ? {
@@ -3018,9 +3037,10 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3018
3037
  const reviewDeferredToHost = input.autoMerge === true
3019
3038
  && resolvePodHostAcpReview(options.hostAcpReview, env, options.kubectl ? () => undefined : getUserConfig).enabled;
3020
3039
  if (reviewDeferredToHost) debug.log('self-implement.pod', 'review-deferred-armed', { job: name, env: REVIEW_DEFERRED_TO_HOST_ENV, ...(reviewerPin ? { reviewerPinUnused: reviewerPin } : {}) });
3021
- const jobArmEnv = grounding || credentialRelay || githubRelay || env.ELANOUS_DISPATCH_RECORDED === '1' || options.armEnv || detailUntil || seat || env.ELANOUS_POD_AUTHOR_ON_POD === '1' || reviewerPin || reviewDeferredToHost || budgetSnapshot
3040
+ const jobArmEnv = grounding || credentialRelay || githubRelay || podGrowthScope || env.ELANOUS_DISPATCH_RECORDED === '1' || options.armEnv || detailUntil || seat || env.ELANOUS_POD_AUTHOR_ON_POD === '1' || reviewerPin || reviewDeferredToHost || budgetSnapshot
3022
3041
  ? {
3023
3042
  ...armEnv,
3043
+ ...(podGrowthScope ? { ELANOUS_GRAPH_GROWTH_SCOPE: podGrowthScope } : {}),
3024
3044
  ...(budgetSnapshot ? { [BUDGET_SNAPSHOT_ENV]: encodeBudgetSnapshot(budgetSnapshot) } : {}),
3025
3045
  ...authorEnv,
3026
3046
  ...(reviewerPin ? { [roleLlmEnvName('review')]: reviewerPin } : {}),
@@ -3667,7 +3687,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3667
3687
  }
3668
3688
  }
3669
3689
  }
3670
- const childFailure = state === 'failed' && !oomKilled && failedReason !== 'DeadlineExceeded'
3690
+ let childFailure = state === 'failed' && !oomKilled && failedReason !== 'DeadlineExceeded'
3671
3691
  ? lastPodChildFailure(logs) : null;
3672
3692
  let childPrFailure: ReturnType<typeof podPrOpenFailure> = null;
3673
3693
  if (childFailure) {
@@ -3692,6 +3712,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3692
3712
  };
3693
3713
  }
3694
3714
  let noResultDiagnostic: string | null = null;
3715
+ let noResultLedgerText: string | null = null;
3695
3716
  let noResultLedgerObservation: { available: boolean; bytes: number; rows: number; lastEvent: string | null } = {
3696
3717
  available: false, bytes: 0, rows: 0, lastEvent: null,
3697
3718
  };
@@ -3701,6 +3722,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3701
3722
  if (noResultCandidate) {
3702
3723
  try {
3703
3724
  const ledgerText = readFileSync(runLedgerPath(liveChildRunId, ledgerDir), 'utf8');
3725
+ noResultLedgerText = ledgerText;
3704
3726
  const ledgerRows = ledgerText.split('\n').filter(Boolean);
3705
3727
  let lastEvent: string | null = null;
3706
3728
  try {
@@ -3713,6 +3735,10 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3713
3735
  catch { /* ledger not returned: do not invent a stage */ }
3714
3736
  noResultDiagnostic ??= 'child terminal result missing; last ledger stage=unknown; round=unknown; mustFix=unknown';
3715
3737
  }
3738
+ if (!childFailure && state === 'failed' && noResultCandidate && noResultLedgerText) {
3739
+ const childError = podNoResultChildError(noResultLedgerText);
3740
+ if (childError) childFailure = { stage: 'pr-open-failed', error: childError, rawError: childError };
3741
+ }
3716
3742
  // POD-FAIL-EVIDENCE-CAPTURE: failed Pods are collected/deleted immediately after terminal handling.
3717
3743
  // Preserve a bounded log tail for every non-OOM/non-deadline failure, including known child stages:
3718
3744
  // the terminal result line can be followed by the useful stderr that explains the actual exit.
@@ -3792,6 +3818,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3792
3818
  const noResultIncident = state === 'failed' && failedReason !== 'DeadlineExceeded' && !disposition;
3793
3819
  if (reportDeficit || noResultIncident) {
3794
3820
  const evidence = disposition?.childEvidence;
3821
+ const firstLlm = readPodChildFirstLlmFact(liveChildRunId, ledgerDir, true);
3795
3822
  const diagnosticLines = [
3796
3823
  ...(Array.isArray(evidence?.podLogTail) ? evidence.podLogTail : []),
3797
3824
  ...(typeof evidence?.detail === 'string' ? evidence.detail.split('\n') : []),
@@ -3812,6 +3839,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3812
3839
  reason: failedReason || containerReason || 'unknown',
3813
3840
  terminationReason: evidence?.terminationReason ?? null,
3814
3841
  providerErrors: disposition?.providerErrors ?? null,
3842
+ firstLlm: firstLlm ?? null,
3815
3843
  oomKilled, podTermination: podTermination ?? null,
3816
3844
  detailTail: evidence?.detailTail ?? null,
3817
3845
  lastLines: diagnosticLines,
@@ -3926,6 +3954,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3926
3954
  const childProviderFailure = podChildProviderFailureFact(logs, {
3927
3955
  providerHint: options.provider ?? podChildProviderOf(podDelegatedChildLlm(jobArgs)?.provider),
3928
3956
  });
3957
+ const childFirstLlm = readPodChildFirstLlmFact(liveChildRunId, ledgerDir);
3929
3958
  const childEvidenceRow = podChildEvidenceLedgerRow({
3930
3959
  job: name,
3931
3960
  childRunId: liveChildRunId,
@@ -3935,6 +3964,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3935
3964
  noResultLogEvidence,
3936
3965
  podTermination,
3937
3966
  providerFailure: childProviderFailure,
3967
+ firstLlm: childFirstLlm,
3938
3968
  });
3939
3969
  if (childEvidenceRow) {
3940
3970
  // Every terminal attempt writes a marker, including one with no parseable child facts.
@@ -36,7 +36,7 @@ export function evaluateGate(
36
36
  const key = cacheKey(catalog, hints, signals);
37
37
  const cached = CACHE.get(key);
38
38
  if (cached) {
39
- recordGateEvaluation(catalog.length, cached.filtered.length, {
39
+ recordGateEvaluation(catalog, cached, {
40
40
  defaultEnabled: notRunStage(),
41
41
  probe: notRunStage(),
42
42
  intentScope: notRunStage(),
@@ -58,10 +58,12 @@ export function evaluateGate(
58
58
  };
59
59
  const boost = new Map<string, number>();
60
60
  const paramDefaults = new Map<string, Record<string, unknown>>();
61
+ const excludedReasons = new Map<string, string>();
61
62
 
62
63
  // ─── Step 1: seed with defaultEnabled entries ──────────────────
63
64
  for (const tool of catalog) {
64
65
  if (tool.defaultEnabled) enabled.add(tool.id);
66
+ else excludedReasons.set(tool.id, 'default-disabled');
65
67
  }
66
68
  stages.defaultEnabled = executedStage(catalog.length, enabled.size);
67
69
 
@@ -74,6 +76,7 @@ export function evaluateGate(
74
76
  const mode = tool.probe.onFail ?? 'hide';
75
77
  if (mode === 'hide') enabled.delete(tool.id);
76
78
  else if (mode === 'disable') enabled.delete(tool.id);
79
+ if (mode === 'hide' || mode === 'disable') excludedReasons.set(tool.id, `probe-${mode}`);
77
80
  // 'warn': leave enabled; caller may read hintReasons to surface
78
81
  }
79
82
  stages.probe = executedStage(beforeProbe, enabled.size);
@@ -93,7 +96,10 @@ export function evaluateGate(
93
96
  for (const tool of catalog) {
94
97
  const scope: ToolIntentScope = tool.intentScope ?? 'always';
95
98
  if (scope === 'always') continue;
96
- if (!activeScopes.has(scope)) enabled.delete(tool.id);
99
+ if (!activeScopes.has(scope)) {
100
+ enabled.delete(tool.id);
101
+ excludedReasons.set(tool.id, `intent-scope:${scope}`);
102
+ }
97
103
  }
98
104
  stages.intentScope = executedStage(beforeIntentScope, enabled.size);
99
105
  }
@@ -107,7 +113,10 @@ export function evaluateGate(
107
113
  for (const tool of catalog) {
108
114
  if (!tool.minTier) continue;
109
115
  const need = tierRank[tool.minTier] ?? 2;
110
- if (activeRank < need) enabled.delete(tool.id);
116
+ if (activeRank < need) {
117
+ enabled.delete(tool.id);
118
+ excludedReasons.set(tool.id, `min-tier:${tool.minTier}`);
119
+ }
111
120
  }
112
121
  stages.minTier = executedStage(beforeMinTier, enabled.size);
113
122
  }
@@ -126,8 +135,14 @@ export function evaluateGate(
126
135
  if (seenForKind.has(comboKey)) continue;
127
136
  seenForKind.set(comboKey, { toolId, kind: h.kind });
128
137
 
129
- if (h.kind === 'enable') enabled.add(toolId);
130
- if (h.kind === 'disable') enabled.delete(toolId);
138
+ if (h.kind === 'enable') {
139
+ enabled.add(toolId);
140
+ excludedReasons.delete(toolId);
141
+ }
142
+ if (h.kind === 'disable') {
143
+ enabled.delete(toolId);
144
+ excludedReasons.set(toolId, 'hint-disabled');
145
+ }
131
146
  if (h.kind === 'prefer') boost.set(toolId, (boost.get(toolId) ?? 0) + 2);
132
147
  if (h.kind === 'boost') boost.set(toolId, (boost.get(toolId) ?? 0) + 1);
133
148
  if (h.kind === 'avoid') boost.set(toolId, (boost.get(toolId) ?? 0) - 1);
@@ -181,11 +196,21 @@ export function evaluateGate(
181
196
  const beforeModelFamilyCap = keep.length;
182
197
  const cap = signals.researchAgent ? 16 : 8;
183
198
  if (keep.length > cap) {
184
- keep = keep
199
+ const requiredResearchTools = signals.intentResearch
200
+ ? ['web_search', 'web_fetch'].filter(id => enabled.has(id))
201
+ : [];
202
+ const required = new Set(requiredResearchTools);
203
+ const ranked = keep
204
+ .filter(id => !required.has(id))
185
205
  .map(id => ({ id, score: boost.get(id) ?? 0 }))
186
206
  .sort((a, b) => b.score - a.score || a.id.localeCompare(b.id))
187
- .slice(0, cap)
207
+ .slice(0, Math.max(0, cap - requiredResearchTools.length))
188
208
  .map(x => x.id);
209
+ keep = [...requiredResearchTools, ...ranked];
210
+ const selectedBeforeStableSort = new Set(keep);
211
+ for (const id of enabled) {
212
+ if (!selectedBeforeStableSort.has(id)) excludedReasons.set(id, 'model-family-cap');
213
+ }
189
214
  }
190
215
  stages.modelFamilyCap = executedStage(beforeModelFamilyCap, keep.length);
191
216
  }
@@ -204,6 +229,7 @@ export function evaluateGate(
204
229
  boost: Object.fromEntries(boost),
205
230
  paramDefaults: Object.fromEntries(paramDefaults),
206
231
  hintReasons,
232
+ excludedReasons: Object.fromEntries(excludedReasons),
207
233
  };
208
234
 
209
235
  if (CACHE.size >= CACHE_MAX) {
@@ -212,7 +238,7 @@ export function evaluateGate(
212
238
  if (firstKey !== undefined) CACHE.delete(firstKey);
213
239
  }
214
240
  CACHE.set(key, decision);
215
- recordGateEvaluation(catalog.length, decision.filtered.length, stages, false);
241
+ recordGateEvaluation(catalog, decision, stages, false);
216
242
  return decision;
217
243
  }
218
244
 
@@ -237,18 +263,23 @@ function executedStage(before: number, after: number): GateStage {
237
263
  }
238
264
 
239
265
  function recordGateEvaluation(
240
- catalogCount: number,
241
- filteredCount: number,
266
+ catalog: NativeToolCatalogEntry[],
267
+ decision: GateDecision,
242
268
  stages: GateStages,
243
269
  cacheHit: boolean,
244
270
  ): void {
245
- // This is a per-call summary: names stay out so high-cardinality catalogs do not flood observability.
271
+ const active = new Set(decision.filtered);
246
272
  debug.log('capability.resolve', 'tool-gate-evaluated', {
247
273
  cacheHit,
248
- catalogCount,
249
- filteredCount,
250
- removedCount: catalogCount - filteredCount,
274
+ catalogCount: catalog.length,
275
+ filteredCount: decision.filtered.length,
276
+ removedCount: catalog.length - decision.filtered.length,
251
277
  stages,
278
+ activeTools: decision.filtered.map((id) => catalog.find((tool) => tool.id === id)?.displayName ?? id),
279
+ excludedTools: catalog.filter((tool) => !active.has(tool.id)).map((tool) => ({
280
+ name: tool.displayName,
281
+ reason: decision.excludedReasons?.[tool.id] ?? 'unclassified-filter',
282
+ })),
252
283
  });
253
284
  }
254
285
 
@@ -120,7 +120,7 @@ const RESEARCH_ASCII_RE = /\b(research|find out|look up|investigate|latest (on|n
120
120
  const RESEARCH_KO_RE = /(최신|뉴스|찾아(?:줘|봐)|알아봐|조사|리서치)/;
121
121
  const RESEARCH_SKILL_RE = /\b(?:omni[ -]market|omni[ -]crawl|social[ -]pulse)\b/i;
122
122
  const RESEARCH_EXPLANATION_RE = /(?:왜|이유|원인|전망|분석|비교|조사|\bwhy\b|\bcause\b|\boutlook\b|\banalysis\b|\bcompare\b)/i;
123
- const RESEARCH_TOPIC_RE = /(?:금리|채권|시장|경제|물가|환율|주가|기업|산업|정책|선거|역사|기후|질병|의학|과학|\bbond\b|\byield\b|\bmarket\b|\beconomy\b|\binflation\b|\bstock\b|\bpolicy\b|\belection\b|\bhistory\b|\bclimate\b|\bhealth\b|\bscience\b)/i;
123
+ const RESEARCH_TOPIC_RE = /(?:금리|채권|시장|경제|물가|환율|주가|기업|산업|정책|선거|역사|기후|질병|의학|과학|반도체|HBM\d?|메모리|공급망|양산|인증|마이크론|삼성전자|SK하이닉스|\bbond\b|\byield\b|\bmarket\b|\beconomy\b|\binflation\b|\bstock\b|\bpolicy\b|\belection\b|\bhistory\b|\bclimate\b|\bhealth\b|\bscience\b)/i;
124
124
  const RESEARCH_CODING_RE = /(?:코드|함수|버그|테스트|빌드|커밋|하니스|설정|오류|구현|수리|고쳐|수정|저장소|\brepo\b|\bcode\b|\bfunction\b|\bbug\b|\btest\b|\bbuild\b|\bcommit\b|\bconfig\b|\bimplement\b|\bfix\b)/i;
125
125
  const DEEP_RESEARCH_INTENT_TERMS = [
126
126
  'research', 'deep research', 'triangulate', 'compare sources',
@@ -102,4 +102,6 @@ export interface GateDecision {
102
102
  paramDefaults: Record<string, Record<string, unknown>>;
103
103
  /** Reasons surfaced by current hints — for prompt injection. */
104
104
  hintReasons: string[];
105
+ /** Why a catalog entry was not selected, keyed by stable catalog id. */
106
+ excludedReasons?: Record<string, string>;
105
107
  }
@@ -14,6 +14,7 @@ import { requestConfirmation } from '../hitl/confirm.js';
14
14
  import type { ToolRuntime, ToolRuntimeContext } from './types.js';
15
15
  import { coordinateBrowserRoundtrip } from '../agent-mission/browser-roundtrip-coordinator.js';
16
16
  import { appendRunLedgerEntry } from '../self-implement/run-ledger.js';
17
+ import { getHarnessRunId } from '../harness/harness-space.js';
17
18
 
18
19
  const UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
19
20
  const SELECTION_COMMENT = '이것도 반영';
@@ -194,6 +195,15 @@ async function loadPersona(id: string) {
194
195
 
195
196
  /** Attached-CDP browser action stays behind harness browser-act's armed, host and reversibility checks. */
196
197
  export async function dispatchBrowserHand(args: BrowserHandArgs, _ctx?: ToolRuntimeContext, deps: BrowserHandDeps = {}): Promise<BrowserHandResult> {
198
+ const runId = _ctx?.runId || getHarnessRunId() || undefined;
199
+ const browserActDeps = {
200
+ ...deps.browserActDeps,
201
+ ...(_ctx?.runId
202
+ ? { getRunId: () => _ctx.runId! }
203
+ : deps.browserActDeps?.getRunId
204
+ ? {}
205
+ : { getRunId: () => runId ?? null }),
206
+ };
197
207
  const url = args.url.trim();
198
208
  const target = args.target.trim();
199
209
  const issueId = args.linearSubtaskId.trim();
@@ -240,7 +250,7 @@ export async function dispatchBrowserHand(args: BrowserHandArgs, _ctx?: ToolRunt
240
250
  };
241
251
  return (deps.browserAct ?? performBrowserAction)({
242
252
  url: actionUrl, target, armed: true, entryPoint: 'tool-runtime/browser-hand', ...(persona ? { persona } : {}),
243
- }, { ...deps.browserActDeps, observe, reversibilityPolicy: 'navigation-only' });
253
+ }, { ...browserActDeps, observe, reversibilityPolicy: 'navigation-only' });
244
254
  };
245
255
  try { sourceText = await inspect(url, pagePort); } catch { /* unavailable observation stays unknown */ }
246
256
  let block = blockedKind(sourceText);
@@ -50,9 +50,9 @@ export interface BrowserRuntimeDeps {
50
50
  observe?: BrowserActionObserver;
51
51
  }
52
52
 
53
- function observeBrowserAction(data: Record<string, unknown>): void {
53
+ function observeBrowserAction(data: Record<string, unknown>, explicitRunId?: string): void {
54
54
  try {
55
- const runId = getHarnessRunId() || null;
55
+ const runId = explicitRunId || getHarnessRunId() || null;
56
56
  (deps.observe ?? ((event, detail) => debug.log('harness.browser-action', event, detail)))('executed', {
57
57
  runId,
58
58
  sessionId: 'browser-runtime',
@@ -95,17 +95,20 @@ async function defaultCloseClient(): Promise<void> {
95
95
  singletonPromise = null;
96
96
  }
97
97
 
98
- let deps: BrowserRuntimeDeps = {
98
+ const DEFAULT_DEPS: BrowserRuntimeDeps = {
99
99
  getClient: defaultGetClient,
100
100
  closeClient: defaultCloseClient,
101
101
  };
102
+ let deps: BrowserRuntimeDeps = DEFAULT_DEPS;
102
103
  let attachedControlSignalBus: ReturnType<typeof defaultControlSignalBus> | null = null;
104
+ let detachBrowserControlSignalConsumer: (() => void) | null = null;
103
105
 
104
106
  function ensureBrowserControlSignalConsumer(): void {
105
107
  const bus = defaultControlSignalBus();
106
108
  if (attachedControlSignalBus === bus) return;
109
+ detachBrowserControlSignalConsumer?.();
107
110
  attachedControlSignalBus = bus;
108
- bus.subscribe(
111
+ detachBrowserControlSignalConsumer = bus.subscribe(
109
112
  { kind: 'browser-cdp-stop', minUrgency: 'quick-pass', surface: 'browser' },
110
113
  () => {
111
114
  void deps.closeClient?.();
@@ -117,6 +120,14 @@ export function setBrowserRuntimeDeps(next: Partial<BrowserRuntimeDeps>): void {
117
120
  deps = { ...deps, ...next };
118
121
  }
119
122
 
123
+ /** Reset dependency injection after a run-scoped observability test. */
124
+ export function _resetBrowserRuntimeDepsForTest(): void {
125
+ detachBrowserControlSignalConsumer?.();
126
+ detachBrowserControlSignalConsumer = null;
127
+ deps = DEFAULT_DEPS;
128
+ attachedControlSignalBus = null;
129
+ }
130
+
120
131
  export async function closeBrowserRuntime(): Promise<void> {
121
132
  if (deps.closeClient) await deps.closeClient();
122
133
  }
@@ -189,6 +200,7 @@ const MAX_NAV_TIMEOUT_MS = 60_000;
189
200
 
190
201
  export async function dispatchBrowserNavigate(args: BrowserNavigateArgs, ctx?: ToolRuntimeContext): Promise<BrowserNavigateResult> {
191
202
  ensureBrowserControlSignalConsumer();
203
+ const runId = ctx?.runId || getHarnessRunId() || undefined;
192
204
  const url = String(args.url ?? '').trim();
193
205
  const input = args.input;
194
206
  // Input is never an implicit side effect of navigation. Approval is scoped
@@ -215,7 +227,7 @@ export async function dispatchBrowserNavigate(args: BrowserNavigateArgs, ctx?: T
215
227
  if (!approved) return { output: '# BrowserNavigate: input not approved', finalUrl: '', title: '', loadMs: 0 };
216
228
  }
217
229
  if (!url) {
218
- observeBrowserAction({ action: 'navigate', url: '', target: 'url', ok: false, error: 'url is required' });
230
+ observeBrowserAction({ action: 'navigate', url: '', target: 'url', ok: false, error: 'url is required' }, runId);
219
231
  return { output: '# BrowserNavigate: error\nurl is required', finalUrl: '', title: '', loadMs: 0 };
220
232
  }
221
233
  const waitForLoad = args.waitForLoad !== false;
@@ -226,12 +238,12 @@ export async function dispatchBrowserNavigate(args: BrowserNavigateArgs, ctx?: T
226
238
  client = await deps.getClient();
227
239
  } catch (err) {
228
240
  const error = err instanceof Error ? err.message : String(err);
229
- observeBrowserAction({ action: 'navigate', url, target: url, ok: false, error });
241
+ observeBrowserAction({ action: 'navigate', url, target: url, ok: false, error }, runId);
230
242
  throw err;
231
243
  }
232
244
  if (!client) {
233
245
  const availability = getBrowserCdpAvailability();
234
- observeBrowserAction({ action: 'navigate', url, target: url, ok: false, error: 'chrome-unavailable' });
246
+ observeBrowserAction({ action: 'navigate', url, target: url, ok: false, error: 'chrome-unavailable' }, runId);
235
247
  return {
236
248
  output: `# BrowserNavigate: Chrome unavailable\n${availability.note}`,
237
249
  finalUrl: '',
@@ -264,7 +276,7 @@ export async function dispatchBrowserNavigate(args: BrowserNavigateArgs, ctx?: T
264
276
  await client.navigate(url);
265
277
  } catch (err) {
266
278
  const error = err instanceof Error ? err.message : String(err);
267
- observeBrowserAction({ action: 'navigate', url, target: url, ok: false, error, loadMs: Date.now() - started });
279
+ observeBrowserAction({ action: 'navigate', url, target: url, ok: false, error, loadMs: Date.now() - started }, runId);
268
280
  return {
269
281
  output: `# BrowserNavigate: error\n${error}`,
270
282
  finalUrl: url,
@@ -333,7 +345,7 @@ export async function dispatchBrowserNavigate(args: BrowserNavigateArgs, ctx?: T
333
345
  timedOut ? 'warning: load event timed out' : '',
334
346
  ].filter(Boolean).join('\n');
335
347
 
336
- observeBrowserAction({ action: 'navigate', url: finalUrl, target: url, ok: true, titleLength: title.length, loadMs, timedOut });
348
+ observeBrowserAction({ action: 'navigate', url: finalUrl, target: url, ok: true, titleLength: title.length, loadMs, timedOut }, runId);
337
349
  return { output, finalUrl, title, loadMs, timedOut: timedOut || undefined };
338
350
  }
339
351
 
@@ -405,8 +417,9 @@ function escapeForJs(s: string): string {
405
417
  return s.replace(/\\/g, '\\\\').replace(/'/g, "\\'");
406
418
  }
407
419
 
408
- export async function dispatchBrowserRead(args: BrowserReadArgs): Promise<BrowserReadResult> {
420
+ export async function dispatchBrowserRead(args: BrowserReadArgs, ctx?: ToolRuntimeContext): Promise<BrowserReadResult> {
409
421
  ensureBrowserControlSignalConsumer();
422
+ const runId = ctx?.runId || getHarnessRunId() || undefined;
410
423
  const mode: BrowserReadMode = args.mode ?? 'text';
411
424
  const selector = typeof args.selector === 'string' ? args.selector.trim() : '';
412
425
  const maxChars = Math.min(
@@ -419,12 +432,12 @@ export async function dispatchBrowserRead(args: BrowserReadArgs): Promise<Browse
419
432
  client = await deps.getClient();
420
433
  } catch (err) {
421
434
  const error = err instanceof Error ? err.message : String(err);
422
- observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: false, error, attachmentRef: null, captureOutcome: mode === 'screenshot' ? 'error' : 'not-requested' });
435
+ observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: false, error, attachmentRef: null, captureOutcome: mode === 'screenshot' ? 'error' : 'not-requested' }, runId);
423
436
  throw err;
424
437
  }
425
438
  if (!client) {
426
439
  const availability = getBrowserCdpAvailability();
427
- observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: false, error: 'chrome-unavailable', attachmentRef: null, captureOutcome: mode === 'screenshot' ? 'unavailable' : 'not-requested' });
440
+ observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: false, error: 'chrome-unavailable', attachmentRef: null, captureOutcome: mode === 'screenshot' ? 'unavailable' : 'not-requested' }, runId);
428
441
  return {
429
442
  output: `# BrowserRead: Chrome unavailable\n${availability.note}`,
430
443
  mode,
@@ -435,7 +448,7 @@ export async function dispatchBrowserRead(args: BrowserReadArgs): Promise<Browse
435
448
  try {
436
449
  const png = await client.screenshot({ format: 'png' });
437
450
  const b64 = png.toString('base64');
438
- observeBrowserAction({ action: 'read', target: 'screenshot', mode, ok: true, bytes: png.byteLength, base64Length: b64.length, attachmentRef: null, captureOutcome: 'inline-base64' });
451
+ observeBrowserAction({ action: 'read', target: 'screenshot', mode, ok: true, bytes: png.byteLength, base64Length: b64.length, attachmentRef: null, captureOutcome: 'inline-base64' }, runId);
439
452
  return {
440
453
  output: `# BrowserRead: screenshot (${png.byteLength} bytes PNG, ${b64.length} chars base64)`,
441
454
  mode,
@@ -443,7 +456,7 @@ export async function dispatchBrowserRead(args: BrowserReadArgs): Promise<Browse
443
456
  };
444
457
  } catch (err) {
445
458
  const error = err instanceof Error ? err.message : String(err);
446
- observeBrowserAction({ action: 'read', target: 'screenshot', mode, ok: false, error, attachmentRef: null, captureOutcome: 'error' });
459
+ observeBrowserAction({ action: 'read', target: 'screenshot', mode, ok: false, error, attachmentRef: null, captureOutcome: 'error' }, runId);
447
460
  return {
448
461
  output: `# BrowserRead: screenshot error\n${error}`,
449
462
  mode,
@@ -462,7 +475,7 @@ export async function dispatchBrowserRead(args: BrowserReadArgs): Promise<Browse
462
475
  value = v == null ? '' : String(v);
463
476
  } catch (err) {
464
477
  const error = err instanceof Error ? err.message : String(err);
465
- observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: false, error, attachmentRef: null, captureOutcome: 'not-requested' });
478
+ observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: false, error, attachmentRef: null, captureOutcome: 'not-requested' }, runId);
466
479
  return {
467
480
  output: `# BrowserRead: evaluate error\n${error}`,
468
481
  mode,
@@ -472,7 +485,7 @@ export async function dispatchBrowserRead(args: BrowserReadArgs): Promise<Browse
472
485
  const truncated = value.length > maxChars;
473
486
  const out = truncated ? value.slice(0, maxChars) : value;
474
487
 
475
- observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: true, charLength: value.length, returnedChars: out.length, truncated, attachmentRef: null, captureOutcome: 'not-requested' });
488
+ observeBrowserAction({ action: 'read', target: selector || 'document.body', mode, ok: true, charLength: value.length, returnedChars: out.length, truncated, attachmentRef: null, captureOutcome: 'not-requested' }, runId);
476
489
  return {
477
490
  output: [
478
491
  `# BrowserRead (${mode}${selector ? ` · selector=${selector}` : ''})`,
@@ -490,8 +503,8 @@ export async function dispatchBrowserRead(args: BrowserReadArgs): Promise<Browse
490
503
  export const browserReadRuntime: ToolRuntime<BrowserReadArgs, BrowserReadResult> = {
491
504
  id: 'browser_read',
492
505
  spec: buildBrowserReadTool(),
493
- async run(req, _ctx: ToolRuntimeContext) {
494
- return dispatchBrowserRead(req);
506
+ async run(req, ctx: ToolRuntimeContext) {
507
+ return dispatchBrowserRead(req, ctx);
495
508
  },
496
509
  };
497
510