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
@@ -4,7 +4,8 @@ import { sanitizeForPtyInput } from '../agent-mission/provision.js';
4
4
 
5
5
  export interface VisibleMissionPty {
6
6
  snapshot(): string;
7
- write(bytes: string): void;
7
+ /** A false result means the PTY input handle rejected the write. */
8
+ write(bytes: string): boolean | number | void;
8
9
  isAlive(): boolean;
9
10
  }
10
11
 
@@ -15,11 +16,17 @@ export interface VisibleMissionResult {
15
16
  firstLine?: string;
16
17
  promptReady: boolean;
17
18
  missionVisible: boolean;
19
+ /** Every UTF-8 byte in the mission prompt was accepted by the PTY input handle. */
20
+ missionTyped?: boolean;
21
+ /** Enter was accepted only after the complete mission became visible. */
22
+ missionSubmitted?: boolean;
18
23
  promptReturned: boolean;
19
24
  completionMarker: boolean;
20
25
  /** Bounded first PTY frame, retained to diagnose startup screens that intercepted input. */
21
26
  initialScreen?: string;
22
27
  startupScreen?: AgentStartupScreen;
28
+ failureStage?: 'prompt-readiness' | 'mission-write' | 'mission-visibility' | 'mission-submit' | 'mission-completion' | 'result-read' | 'marker-write' | 'marker-visibility' | 'marker-submit' | 'marker-completion' | 'pty-error';
29
+ failureScreen?: string;
23
30
  error?: string;
24
31
  }
25
32
 
@@ -42,6 +49,30 @@ export interface VisibleMissionDeps {
42
49
  }
43
50
 
44
51
  const sleepDefault = (ms: number): Promise<void> => new Promise(resolve => setTimeout(resolve, ms));
52
+ const INPUT_CHUNK_BYTES = 256;
53
+ const INPUT_CHUNK_DELAY_MS = 10;
54
+
55
+ async function writeMissionInput(text: string, pty: VisibleMissionPty, sleep: (ms: number) => Promise<void>): Promise<{ complete: boolean; acceptedBytes: number; totalBytes: number }> {
56
+ let chunk = '';
57
+ let chunkBytes = 0;
58
+ let acceptedBytes = 0;
59
+ const totalBytes = Buffer.byteLength(text, 'utf8');
60
+ for (const char of text) {
61
+ const charBytes = Buffer.byteLength(char, 'utf8');
62
+ if (chunk && chunkBytes + charBytes > INPUT_CHUNK_BYTES) {
63
+ if (pty.write(chunk) === false) return { complete: false, acceptedBytes, totalBytes };
64
+ acceptedBytes += chunkBytes;
65
+ await sleep(INPUT_CHUNK_DELAY_MS);
66
+ chunk = '';
67
+ chunkBytes = 0;
68
+ }
69
+ chunk += char;
70
+ chunkBytes += charBytes;
71
+ }
72
+ if (chunk && pty.write(chunk) === false) return { complete: false, acceptedBytes, totalBytes };
73
+ acceptedBytes += chunkBytes;
74
+ return { complete: true, acceptedBytes, totalBytes };
75
+ }
45
76
 
46
77
  export function isAgentInputPrompt(screen: string): boolean {
47
78
  const plain = stripAnsi(screen);
@@ -66,12 +97,22 @@ export async function runVisibleAgentMission(deps: VisibleMissionDeps): Promise<
66
97
  const readFile = deps.readFile ?? ((path: string) => readFileSync(path, 'utf8'));
67
98
  let promptReady = false;
68
99
  let missionVisible = false;
100
+ let missionTyped = false;
101
+ let missionSubmitted = false;
69
102
  let promptReturned = false;
70
103
  let completionMarker = false;
71
104
  let initialScreen: string | undefined;
72
105
  let startupScreen: AgentStartupScreen | undefined;
73
106
  let codexUpdateSkipSent = false;
74
107
  let startupScreenReported = false;
108
+ let lastObservedScreen = '';
109
+ const completionDeadline = Date.now() + (deps.completionTimeoutMs ?? 300_000);
110
+ const stageDeadline = (timeoutMs: number): number => Math.min(completionDeadline, Date.now() + timeoutMs);
111
+ const snapshot = (): string => { lastObservedScreen = deps.pty.snapshot(); return lastObservedScreen; };
112
+ const safeSnapshot = (): string => { try { return snapshot(); } catch { return lastObservedScreen; } };
113
+ const failure = (result: Omit<VisibleMissionResult, 'ok' | 'failureStage' | 'failureScreen'>, stage: NonNullable<VisibleMissionResult['failureStage']>, screen = safeSnapshot()): VisibleMissionResult => ({
114
+ ...result, missionTyped, missionSubmitted, ok: false, failureStage: stage, failureScreen: screenTail(screen),
115
+ });
75
116
  const observeStartupScreen = (screen: string): AgentStartupScreen | undefined => {
76
117
  const detected = classifyAgentStartupScreen(deps.agent, screen);
77
118
  // This field describes the blocker present in the current/final frame,
@@ -86,7 +127,10 @@ export async function runVisibleAgentMission(deps: VisibleMissionDeps): Promise<
86
127
  return detected;
87
128
  };
88
129
  try {
89
- const readyDeadline = Date.now() + (deps.readyTimeoutMs ?? 60_000);
130
+ // Readiness is settled by the observed prompt/input echo; this is only one
131
+ // shared safety cap, not a per-stage 60s/5s guess.
132
+ const safetyCapMs = deps.completionTimeoutMs ?? 300_000;
133
+ const readyDeadline = stageDeadline(deps.readyTimeoutMs ?? safetyCapMs);
90
134
  let lastScreen = '';
91
135
 
92
136
  while (Date.now() < readyDeadline) {
@@ -94,14 +138,14 @@ export async function runVisibleAgentMission(deps: VisibleMissionDeps): Promise<
94
138
  // The process may exit before the first poll; its final frame can still
95
139
  // identify the startup screen that prevented the prompt from appearing.
96
140
  try {
97
- lastScreen = deps.pty.snapshot();
98
- initialScreen ??= lastScreen.slice(-1_200);
141
+ lastScreen = snapshot();
142
+ initialScreen ??= redactSensitive(stripAnsi(lastScreen)).slice(-1_200);
99
143
  observeStartupScreen(lastScreen);
100
144
  } catch { /* an exited remote PTY may no longer expose its final frame */ }
101
- return { ok: false, path: deps.outputPath, promptReady: false, missionVisible: false, promptReturned: false, completionMarker: false, ...(initialScreen ? { initialScreen } : {}), ...(startupScreen ? { startupScreen } : {}), error: 'Agent PTY exited before its prompt appeared' };
145
+ return failure({ path: deps.outputPath, promptReady: false, missionVisible: false, promptReturned: false, completionMarker: false, ...(initialScreen ? { initialScreen } : {}), ...(startupScreen ? { startupScreen } : {}), error: 'Agent PTY exited before its prompt appeared' }, 'prompt-readiness', lastScreen);
102
146
  }
103
- lastScreen = deps.pty.snapshot();
104
- initialScreen ??= lastScreen.slice(-1_200);
147
+ lastScreen = snapshot();
148
+ initialScreen ??= redactSensitive(stripAnsi(lastScreen)).slice(-1_200);
105
149
  const detectedScreen = observeStartupScreen(lastScreen);
106
150
  if (detectedScreen) {
107
151
  if (detectedScreen === 'codex-update-choice') {
@@ -128,43 +172,49 @@ export async function runVisibleAgentMission(deps: VisibleMissionDeps): Promise<
128
172
  await sleep(pollMs);
129
173
  }
130
174
  if (!promptReady) {
131
- return {
132
- ok: false, path: deps.outputPath, promptReady: false, missionVisible: false, promptReturned: false, completionMarker: false,
175
+ return failure({
176
+ path: deps.outputPath, promptReady: false, missionVisible: false, promptReturned: false, completionMarker: false,
133
177
  initialScreen,
134
178
  ...(startupScreen ? { startupScreen } : {}),
135
- error: 'Agent input prompt was not observed before the startup timeout',
136
- };
179
+ error: 'Agent input prompt was not observed before the startup safety cap',
180
+ }, 'prompt-readiness', lastScreen);
137
181
  }
138
182
 
139
183
  const mission = sanitizeForPtyInput(deps.mission, 4_000);
140
- if (!mission) return { ok: false, path: deps.outputPath, promptReady, missionVisible: false, promptReturned: false, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Mission text is empty after input sanitization' };
184
+ if (!mission) return failure({ path: deps.outputPath, promptReady, missionVisible: false, promptReturned: false, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Mission text is empty after input sanitization' }, 'mission-write');
141
185
  try {
142
186
  readFile(deps.outputPath);
143
- return { ok: false, path: deps.outputPath, promptReady, missionVisible: false, promptReturned: false, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Result path already exists; refusing to reuse a previous mission file' };
187
+ return failure({ path: deps.outputPath, promptReady, missionVisible: false, promptReturned: false, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Result path already exists; refusing to reuse a previous mission file' }, 'result-read');
144
188
  } catch (error) {
145
189
  if (!isFileNotFound(error)) {
146
- return { ok: false, path: deps.outputPath, promptReady, missionVisible: false, promptReturned: false, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: `Could not verify a fresh result path: ${error instanceof Error ? error.message : String(error)}` };
190
+ return failure({ path: deps.outputPath, promptReady, missionVisible: false, promptReturned: false, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: `Could not verify a fresh result path: ${error instanceof Error ? error.message : String(error)}` }, 'result-read');
147
191
  }
148
192
  }
149
193
  const missionPrompt = `Write the result to the exact file path ${deps.outputPath} (create parent directories if needed). ${mission}`;
150
- deps.pty.write(missionPrompt);
151
- const visibleMissionTail = mission.slice(-Math.min(24, mission.length));
152
- const visibilityDeadline = Date.now() + (deps.visibilityTimeoutMs ?? 5_000);
194
+ const missionWrite = await writeMissionInput(missionPrompt, deps.pty, sleep);
195
+ missionTyped = missionWrite.complete;
196
+ if (!missionTyped) {
197
+ return failure({ path: deps.outputPath, promptReady, missionVisible: false, promptReturned: false, completionMarker: false, initialScreen, ...(startupScreen ? { startupScreen } : {}), error: `Mission input write was rejected after ${missionWrite.acceptedBytes}/${missionWrite.totalBytes} UTF-8 bytes` }, 'mission-write');
198
+ }
199
+ const visibleMissionTail = Array.from(mission).slice(-24).join('');
200
+ const visibilityDeadline = stageDeadline(deps.visibilityTimeoutMs ?? safetyCapMs);
153
201
  while (Date.now() < visibilityDeadline) {
154
- const visibleText = normalizeVisibleText(deps.pty.snapshot());
202
+ const visibleText = normalizeVisibleText(snapshot());
155
203
  if (visibleText.includes(normalizeVisibleText(visibleMissionTail))) { missionVisible = true; break; }
156
204
  await sleep(Math.min(pollMs || 25, Math.max(1, visibilityDeadline - Date.now())));
157
205
  }
158
206
  if (!missionVisible) {
159
- return { ok: false, path: deps.outputPath, promptReady, missionVisible: false, promptReturned: false, completionMarker: false, initialScreen, ...(startupScreen ? { startupScreen } : {}), error: 'Mission text was not visible in the agent PTY before submission' };
207
+ return failure({ path: deps.outputPath, promptReady, missionVisible: false, promptReturned: false, completionMarker: false, initialScreen, ...(startupScreen ? { startupScreen } : {}), error: 'Mission text was not visible in the agent PTY before submission' }, 'mission-visibility');
160
208
  }
161
- deps.pty.write('\r');
209
+ if (deps.pty.write('\r') === false) {
210
+ return failure({ path: deps.outputPath, promptReady, missionVisible, promptReturned: false, completionMarker: false, initialScreen, ...(startupScreen ? { startupScreen } : {}), error: 'Mission submit key was rejected by the agent PTY' }, 'mission-submit');
211
+ }
212
+ missionSubmitted = true;
162
213
 
163
- const completionDeadline = Date.now() + (deps.completionTimeoutMs ?? 300_000);
164
214
  let resultFileObserved = false;
165
215
  while (Date.now() < completionDeadline) {
166
216
  if (!deps.pty.isAlive()) break;
167
- lastScreen = deps.pty.snapshot();
217
+ lastScreen = snapshot();
168
218
  if (deps.handleTrust(lastScreen, bytes => deps.pty.write(bytes))) {
169
219
  await sleep(500);
170
220
  continue;
@@ -179,40 +229,44 @@ export async function runVisibleAgentMission(deps: VisibleMissionDeps): Promise<
179
229
  await sleep(pollMs);
180
230
  }
181
231
  if (!resultFileObserved) {
182
- return { ok: false, path: deps.outputPath, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Agent did not create a non-empty result file before the timeout' };
232
+ return failure({ path: deps.outputPath, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Agent did not create a non-empty result file before the timeout' }, 'mission-completion', lastScreen);
183
233
  }
184
234
  if (!promptReturned) {
185
- return { ok: false, path: deps.outputPath, promptReady, missionVisible, promptReturned: false, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Agent did not return to its input prompt after writing the result file' };
235
+ return failure({ path: deps.outputPath, promptReady, missionVisible, promptReturned: false, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Agent did not return to its input prompt after writing the result file' }, 'mission-completion', lastScreen);
186
236
  }
187
237
 
188
238
  let content: string;
189
239
  try { content = readFile(deps.outputPath); }
190
240
  catch (error) {
191
- return { ok: false, path: deps.outputPath, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: `Result file disappeared after the agent returned: ${error instanceof Error ? error.message : String(error)}` };
241
+ return failure({ path: deps.outputPath, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: `Result file disappeared after the agent returned: ${error instanceof Error ? error.message : String(error)}` }, 'result-read', safeSnapshot());
192
242
  }
193
243
  const firstLine = content.split(/\r?\n/).map(line => line.trim()).find(Boolean);
194
- if (!firstLine) return { ok: false, path: deps.outputPath, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Result file is empty' };
244
+ if (!firstLine) return failure({ path: deps.outputPath, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Result file is empty' }, 'result-read');
195
245
 
196
246
  // Keep the marker request separate and short: the marker itself never occurs
197
247
  // in the mission prompt, so only the agent's final output can satisfy it.
198
248
  const completionMarkerText = `M-${randomUUID().replaceAll('-', '').slice(0, 12)}`;
199
249
  const completionMarkerPath = `${deps.outputPath}.completion-${completionMarkerText}`;
200
250
  const markerPrompt = `Say ${completionMarkerText} alone and write it to the exact file path ${completionMarkerPath}.`;
201
- deps.pty.write(markerPrompt);
202
- const markerVisibleDeadline = Date.now() + (deps.visibilityTimeoutMs ?? 5_000);
251
+ if (deps.pty.write(markerPrompt) === false) {
252
+ return failure({ path: deps.outputPath, firstLine, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Completion marker input write was rejected by the agent PTY' }, 'marker-write');
253
+ }
254
+ const markerVisibleDeadline = stageDeadline(deps.visibilityTimeoutMs ?? safetyCapMs);
203
255
  let markerRequestVisible = false;
204
256
  while (Date.now() < markerVisibleDeadline) {
205
- const markerInputScreen = stripAnsi(deps.pty.snapshot()).replace(/\s+/g, ' ');
257
+ const markerInputScreen = stripAnsi(snapshot()).replace(/\s+/g, ' ');
206
258
  if (markerInputScreen.includes(completionMarkerText)) { markerRequestVisible = true; break; }
207
259
  await sleep(Math.min(pollMs || 25, Math.max(1, markerVisibleDeadline - Date.now())));
208
260
  }
209
261
  if (!markerRequestVisible) {
210
- return { ok: false, path: deps.outputPath, firstLine, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Completion marker request was not visible in the agent PTY' };
262
+ return failure({ path: deps.outputPath, firstLine, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Completion marker request was not visible in the agent PTY' }, 'marker-visibility');
263
+ }
264
+ if (screenShowsCompletionMarker(snapshot(), completionMarkerText)) {
265
+ return failure({ path: deps.outputPath, firstLine, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Completion marker appeared in the PTY input before submission' }, 'marker-submit');
211
266
  }
212
- if (screenShowsCompletionMarker(deps.pty.snapshot(), completionMarkerText)) {
213
- return { ok: false, path: deps.outputPath, firstLine, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Completion marker appeared in the PTY input before submission' };
267
+ if (deps.pty.write('\r') === false) {
268
+ return failure({ path: deps.outputPath, firstLine, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Completion marker submit key was rejected by the agent PTY' }, 'marker-submit');
214
269
  }
215
- deps.pty.write('\r');
216
270
 
217
271
  while (Date.now() < completionDeadline) {
218
272
  try {
@@ -220,26 +274,16 @@ export async function runVisibleAgentMission(deps: VisibleMissionDeps): Promise<
220
274
  } catch { /* the agent has not written the completion marker file yet */ }
221
275
  if (!deps.pty.isAlive()) break;
222
276
  try {
223
- if (screenShowsCompletionMarker(deps.pty.snapshot(), completionMarkerText)) { completionMarker = true; break; }
277
+ if (screenShowsCompletionMarker(snapshot(), completionMarkerText)) { completionMarker = true; break; }
224
278
  } catch { /* detached PTYs may no longer expose a screen snapshot */ }
225
279
  await sleep(pollMs);
226
280
  }
227
281
  if (!completionMarker) {
228
- return { ok: false, path: deps.outputPath, firstLine, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Agent did not show its completion marker before the timeout' };
282
+ return failure({ path: deps.outputPath, firstLine, promptReady, missionVisible, promptReturned, completionMarker: false, ...(startupScreen ? { startupScreen } : {}), error: 'Agent did not show its completion marker before the timeout' }, 'marker-completion');
229
283
  }
230
- return { ok: true, path: deps.outputPath, content, firstLine, promptReady, missionVisible, promptReturned, completionMarker, initialScreen, ...(startupScreen ? { startupScreen } : {}) };
284
+ return { ok: true, path: deps.outputPath, content, firstLine, promptReady, missionVisible, missionTyped, missionSubmitted, promptReturned, completionMarker, initialScreen, ...(startupScreen ? { startupScreen } : {}) };
231
285
  } catch (error) {
232
- return {
233
- ok: false,
234
- path: deps.outputPath,
235
- promptReady,
236
- missionVisible,
237
- promptReturned,
238
- completionMarker,
239
- ...(initialScreen ? { initialScreen } : {}),
240
- ...(startupScreen ? { startupScreen } : {}),
241
- error: error instanceof Error ? error.message : String(error),
242
- };
286
+ return failure({ path: deps.outputPath, promptReady, missionVisible, promptReturned, completionMarker, ...(initialScreen ? { initialScreen } : {}), ...(startupScreen ? { startupScreen } : {}), error: error instanceof Error ? error.message : String(error) }, 'pty-error');
243
287
  }
244
288
  }
245
289
 
@@ -248,6 +292,20 @@ function screenShowsCompletionMarker(screen: string, marker: string): boolean {
248
292
  return new RegExp(`^\\s*(?:(?:[•⏺└│╰⎿])\\s*)?${escaped}\\s*$`, 'm').test(stripAnsi(screen));
249
293
  }
250
294
 
295
+ function screenTail(screen: string): string {
296
+ return redactSensitive(stripAnsi(screen)).slice(-1_200);
297
+ }
298
+
299
+ function redactSensitive(screen: string): string {
300
+ return screen
301
+ .replace(/(authorization\s*:\s*(?:basic|bearer|token|apikey|api[- ]key)\s+)(?:"[^"\r\n]*"|'[^'\r\n]*'|\S+)/gi, '$1[redacted]')
302
+ .replace(/((?:[A-Z0-9_]*(?:api[_-]?key|api[_-]?token|access[_-]?key|secret|password|credential|auth[_-]?token|refresh[_-]?token)))\s*[:=]\s*(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\r\n]*)/gi, '$1=[redacted credential]')
303
+ .replace(/Bearer\s+\S+/gi, 'Bearer [redacted]')
304
+ .replace(/(?:sk|xai|gsk|gh[pousr])-[A-Za-z0-9_-]{8,}/g, '[redacted credential]')
305
+ .replace(/[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}/gi, '[redacted email]')
306
+ .replace(/(account[-_ ]+token)\s*[:=]?\s*(?:"[^"\r\n]*"|'[^'\r\n]*'|[^\s,;]+)/gi, '$1=[redacted credential]');
307
+ }
308
+
251
309
  function stripAnsi(screen: string): string {
252
310
  return screen.replace(/\u001b\][^\u0007]*(?:\u0007|\u001b\\)/g, '')
253
311
  .replace(/\u001b\[[0-?]*[ -/]*[@-~]/g, '');
@@ -40,6 +40,7 @@ export type OmniSearchEngineEvent =
40
40
  | { engine: string; phase: 'complete'; hits: number; durationMs: number; error?: string };
41
41
 
42
42
  export interface OmniSearchDispatchOpts {
43
+ signal?: AbortSignal;
43
44
  /** Observational only: callback failures must not interrupt a provider search. */
44
45
  onEngine?: (event: OmniSearchEngineEvent) => void;
45
46
  onSource?: (source: WebSearchHit & { engine: string }) => void;
@@ -239,10 +240,11 @@ async function dispatchWithProviders(
239
240
  : remainingMs;
240
241
  if (timeoutMs <= 0) throw new DOMException('Research search budget exhausted', 'TimeoutError');
241
242
  const controller = new AbortController();
243
+ const signal = opts.signal ? AbortSignal.any([controller.signal, opts.signal]) : controller.signal;
242
244
  let timer: ReturnType<typeof setTimeout> | undefined;
243
245
  try {
244
246
  result = await Promise.race([
245
- p.search(query, controller.signal),
247
+ p.search(query, signal),
246
248
  new Promise<never>((_, reject) => {
247
249
  timer = setTimeout(() => {
248
250
  controller.abort();
@@ -254,7 +256,7 @@ async function dispatchWithProviders(
254
256
  if (timer !== undefined) clearTimeout(timer);
255
257
  }
256
258
  } else {
257
- result = await p.search(query);
259
+ result = await p.search(query, opts.signal);
258
260
  }
259
261
  perEngine[p.id] = { hits: result.hits, durationMs: Date.now() - start };
260
262
  for (const hit of result.hits) {
@@ -281,6 +281,7 @@ export interface ParentHostPreflight { ok: boolean; gaps: string[]; warnings: st
281
281
  export function preflightScript(target: ParentHostConfig): string {
282
282
  const elanous = remotePath(target.elanous ?? DEFAULT_REMOTE_ELANOUS);
283
283
  const configDir = remotePath(target.configDir ?? DEFAULT_REMOTE_CONFIG_DIR);
284
+ const codexCliMirrorDir = remotePath(REMOTE_CODEX_CLI_MIRROR_DIR);
284
285
  const grokCredentialFloorSeconds = Math.ceil(PARENT_CHILD_CREDENTIAL_MIN_REMAINING_MS / 1_000);
285
286
  return [
286
287
  `echo "version=$(${elanous} --version 2>/dev/null | tail -1 | cut -d' ' -f1)"`,
@@ -290,7 +291,10 @@ export function preflightScript(target: ParentHostConfig): string {
290
291
  `command -v kubectl >/dev/null 2>&1 && echo kubectl=1`,
291
292
  `{ command -v grok >/dev/null 2>&1 || [ -x "$HOME/.grok/bin/grok" ]; } && echo grokCli=1`,
292
293
  `{ command -v codex >/dev/null 2>&1 || [ -x "$HOME/.local/bin/codex" ]; } && echo codexCli=1`,
293
- `n=$(grep -Ec '^[[:space:]]*"openai-codex(:[^"]*)?"[[:space:]]*:[[:space:]]*\\{' ${configDir}/auth.json 2>/dev/null); echo "codexAccounts=\${n:-0}"`,
294
+ // Default auth retains its historical provider-profile count, including expired entries.
295
+ // The CLI mirror is access-only; unusable/expired profiles do not count and duplicates do not count twice.
296
+ // A missing remote Bun is reported as unknown rather than a misleading zero.
297
+ `codexCount=$(grep -Ec '^[[:space:]]*"openai-codex(:[^"]*)?"[[:space:]]*:[[:space:]]*\\{' ${configDir}/auth.json 2>/dev/null); codexAccountsDefault=\${codexCount:-0}; if command -v bun >/dev/null 2>&1; then codexProbe=$(bun -e 'const fs=require("node:fs");const read=(p)=>{try{return JSON.parse(fs.readFileSync(p,"utf8"))}catch{return {}}};const isCodex=(key)=>/^openai-codex(?::[^\"]+)?$/.test(key);const parent=read(process.argv[1]).providers||{};const mirror=read(process.argv[2]).providers||{};const activeMirror=Object.entries(mirror).filter(([key,p])=>isCodex(key)&&typeof p?.tokens?.accessToken==="string"&&p.tokens.accessToken.length>0&&!p.tokens.refreshToken&&!p.tokens.refresh_token&&typeof p.tokens.expiresAt==="number"&&Number.isFinite(p.tokens.expiresAt)&&p.tokens.expiresAt>Date.now());const additional=activeMirror.filter(([key])=>!Object.prototype.hasOwnProperty.call(parent,key)).length;process.stdout.write([activeMirror.length,additional].join("|"))' ${configDir}/auth.json ${codexCliMirrorDir}/auth.json 2>/dev/null); codexProbeStatus=measured; else codexProbe=''; codexProbeStatus=unknown; fi; case "$codexProbe" in *'|'*) codexAccountsMirror=\${codexProbe%%|*}; codexAccountsMirrorAdditional=\${codexProbe#*|};; *) codexProbeStatus=unknown; codexAccountsMirror=unknown; codexAccountsMirrorAdditional=0;; esac; codexAccounts=$((codexAccountsDefault + codexAccountsMirrorAdditional)); echo "codexAccountsDefault=\${codexAccountsDefault}"; echo "codexAccountsMirror=\${codexAccountsMirror}"; echo "codexAccountsMirrorAdditional=\${codexAccountsMirrorAdditional}"; echo "codexAccountsMirrorStatus=\${codexProbeStatus}"; echo "codexAccounts=\${codexAccounts}"`,
294
298
  `{ grep -Eq '"key"[[:space:]]*:[[:space:]]*"[^"]+"' "$HOME/.grok/auth.json" 2>/dev/null || [ -n "\${XAI_API_KEY:-}\${GROK_API_KEY:-}\${GROK_CODE_XAI_API_KEY:-}" ]; } && echo grok=1`,
295
299
  // The remote host owns its device-auth session. Ignore the legacy HQ mirror entry; it can outlive and mask the host credential.
296
300
  // Read only expiry metadata, never credential values, and compare against the shared minimum lifetime.
@@ -366,6 +370,7 @@ export function judgeParentHostCredentials(facts: Record<string, string>): strin
366
370
  if (facts.unreachable) return [];
367
371
  const warnings: string[] = [];
368
372
  if (!(Number(facts.codexAccounts) > 1)) warnings.push('codex-accounts-low');
373
+ if (facts.codexAccountsMirrorStatus === 'unknown') warnings.push('codex-account-mirror-unmeasured');
369
374
  if (facts.grok !== '1') warnings.push('grok-credential-missing');
370
375
  if (facts.openrouter !== '1') warnings.push('openrouter-key-missing');
371
376
  return warnings;
@@ -391,6 +396,19 @@ export function preflightParentHost(input: PreflightInput): ParentHostPreflight
391
396
  } catch { /* fail-soft */ }
392
397
  }
393
398
  const warnings = judgeParentHostCredentials(facts);
399
+ try {
400
+ debug.log('task-agent.parent-host', 'codex-account-candidates', {
401
+ host: input.target.host,
402
+ sources: [
403
+ { path: `${input.target.configDir ?? '~/.elanous'}/auth.json`, count: Number(facts.codexAccountsDefault) || 0 },
404
+ { path: `${REMOTE_CODEX_CLI_MIRROR_DIR.replace(/^\$HOME/, '~')}/auth.json`,
405
+ count: facts.codexAccountsMirrorStatus === 'unknown' ? null : Number(facts.codexAccountsMirror) || 0,
406
+ additional: facts.codexAccountsMirrorStatus === 'unknown' ? null : Number(facts.codexAccountsMirrorAdditional) || 0 },
407
+ ],
408
+ mirrorStatus: facts.codexAccountsMirrorStatus ?? 'unknown',
409
+ totalCandidates: Number(facts.codexAccounts) || 0,
410
+ });
411
+ } catch { /* fail-soft */ }
394
412
  if (warnings.length) {
395
413
  try {
396
414
  debug.log('task-agent.parent-host', 'credential-warning', {
@@ -0,0 +1,98 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { readPriorMustFix, PRIOR_RESULT_NOT_RECOVERED } from './review-prior-fix.js';
3
+ import type { TaskCard } from './task-hand.js';
4
+
5
+ export const RECALL_MAX_ITEMS = 8;
6
+ export const RECALL_MAX_CHARS = 2000;
7
+
8
+ export interface PriorLessons {
9
+ block?: string;
10
+ priorCards: number;
11
+ items: number;
12
+ chars: number;
13
+ truncated: boolean;
14
+ }
15
+
16
+ type ReviewResultReader = (path: string) => string;
17
+
18
+ function compact(value: string): string {
19
+ return value.replace(/\s+/gu, ' ').trim();
20
+ }
21
+
22
+ /** Same-cell failure and review lessons for the next hand; no broad memory query. */
23
+ export function priorLessonsFor(
24
+ checklistId: string,
25
+ cards: readonly TaskCard[],
26
+ readReviewResult: ReviewResultReader = (path) => readFileSync(path, 'utf8'),
27
+ ): PriorLessons {
28
+ const prior = cards
29
+ .filter((card) => card.checklistId === checklistId)
30
+ .slice()
31
+ .sort((a, b) => b.createdAt.localeCompare(a.createdAt));
32
+ const candidates: Array<{ cardId: string; text: string }> = [];
33
+
34
+ for (const card of prior) {
35
+ if (card.status === 'failed' || card.status === 'launch-failed') {
36
+ const failure = [...card.history].reverse().find((event) => ['failed', 'run-failed', 'launch-failed',
37
+ 'graph-run-failed', 'tier-split-failed', 'device-first-launch-failed'].includes(event.event));
38
+ const reason = compact(failure?.detail ?? failure?.reason ?? '');
39
+ candidates.push({ cardId: card.id, text: `${card.status} 사유: ${reason || '실패 사유 미기록'}` });
40
+ }
41
+ for (const request of card.reviewRequests ?? []) {
42
+ const result = readPriorMustFix(request.resultPath, request.pr, request.head, readReviewResult);
43
+ if (result.status === 'recovered') {
44
+ for (const finding of result.items) {
45
+ const normalized = compact(finding);
46
+ if (normalized) candidates.push({ cardId: card.id, text: `PR #${request.pr} must-fix: ${normalized}` });
47
+ }
48
+ } else {
49
+ candidates.push({ cardId: card.id, text: `PR #${request.pr} · ${PRIOR_RESULT_NOT_RECOVERED} (${result.reason})` });
50
+ }
51
+ }
52
+ }
53
+
54
+ if (candidates.length === 0) return { priorCards: prior.length, items: 0, chars: 0, truncated: false };
55
+
56
+ const itemLimited = candidates.length > RECALL_MAX_ITEMS;
57
+ const itemMarker = `… 항목 상한 ${RECALL_MAX_ITEMS}건 초과분 생략`;
58
+ const charMarker = `… 글자 상한 ${RECALL_MAX_CHARS}자에서 나머지 생략`;
59
+ const selected: typeof candidates = [];
60
+ const pool = candidates.slice(0, RECALL_MAX_ITEMS);
61
+ const headingFor = (items: typeof candidates) => items.length
62
+ ? `## 앞선 교훈(같은 칸 · 카드 ${[...new Set(items.map((item) => item.cardId))].join(', ')})`
63
+ : '## 앞선 교훈(같은 칸)';
64
+ let charLimited = false;
65
+ for (const candidate of pool) {
66
+ const next = [...selected, candidate];
67
+ const heading = headingFor(next);
68
+ const lines = [heading, ...next.map((item) => `- ${item.cardId}: ${item.text}`)];
69
+ const reserve = [...(itemLimited ? [itemMarker] : []), charMarker];
70
+ if ([...lines, ...reserve].join('\n').length > RECALL_MAX_CHARS) {
71
+ charLimited = true;
72
+ break;
73
+ }
74
+ selected.push(candidate);
75
+ }
76
+ const heading = headingFor(selected);
77
+ const lines = [heading, ...selected.map((item) => `- ${item.cardId}: ${item.text}`)];
78
+ const markers = [
79
+ ...(itemLimited ? [itemMarker] : []),
80
+ ...(charLimited || selected.length < pool.length ? [charMarker] : []),
81
+ ];
82
+ // A single oversized card is omitted as a whole, never sliced through its id or lesson text.
83
+ if (!selected.length) markers.unshift(`… 첫 항목이 ${RECALL_MAX_CHARS}자 상한을 넘어 생략`);
84
+ let block = [...lines, ...markers].join('\n');
85
+ while (block.length > RECALL_MAX_CHARS && selected.length) {
86
+ selected.pop();
87
+ charLimited = true;
88
+ const shortenedHeading = headingFor(selected);
89
+ const shortenedLines = [shortenedHeading, ...selected.map((item) => `- ${item.cardId}: ${item.text}`)];
90
+ const shortenedMarkers = [
91
+ ...(itemLimited ? [itemMarker] : []), charMarker,
92
+ ...(!selected.length ? [`… 첫 항목이 ${RECALL_MAX_CHARS}자 상한을 넘어 생략`] : []),
93
+ ];
94
+ block = [...shortenedLines, ...shortenedMarkers].join('\n');
95
+ }
96
+ return { block, priorCards: prior.length, items: selected.length,
97
+ chars: block.length, truncated: itemLimited || charLimited };
98
+ }
@@ -23,6 +23,7 @@ import { readBudgetInputsLive, type BudgetInputs } from '../self-implement/budge
23
23
  import { HARNESS_RUN_ID_ENV, mintRunId, normalizeRunId } from '../harness/harness-space.js';
24
24
  import { newLaunchUtteranceId, recordLaunchUtterance } from '../harness/launch-utterance-ledger.js';
25
25
  import { debug } from '../debug/log.js';
26
+ import { priorLessonsFor } from './recall-inject.js';
26
27
  import { effectiveInstanceRoot } from '../instance/resolve.js';
27
28
  import { LAUNCH_DOOR_RECEIPT_ENV, openLaunchRequestDoor, type LaunchRequestDoor } from '../execution-loop/launch-gate.js';
28
29
  import { withFileLockSync } from '../storage/file-lock.js';
@@ -1280,6 +1281,7 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
1280
1281
  const { normalizeEvidenceCommandLines } = await import('./evidence-command-normalize.js');
1281
1282
  const normalized = normalizeEvidenceCommandLines(opts.text.trim());
1282
1283
  let text = normalized.text;
1284
+ let metadataText = text;
1283
1285
  if (!text) throw new Error('과제 한 줄이 비어 있다');
1284
1286
  for (const warning of normalized.warnings) {
1285
1287
  console.error(`⚠ ${warning}`);
@@ -1319,6 +1321,18 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
1319
1321
  const completion = opts.completion ?? 'code-pr';
1320
1322
  const now = (opts.now ?? (() => new Date()))();
1321
1323
  const id = opts.id ?? `${TASK_CARD_PREFIX}${now.toISOString().slice(0, 10).replaceAll('-', '')}-${randomBytes(3).toString('hex')}`;
1324
+ if (opts.checklistId) {
1325
+ const priorCards = withFileLockSync(`${path}.lock`, () =>
1326
+ Object.values(readState(path).tasks ?? {}).filter((card) => card.id !== id));
1327
+ const recall = priorLessonsFor(opts.checklistId, priorCards);
1328
+ if (recall.block) {
1329
+ text = `${text}\n\n${recall.block}`;
1330
+ }
1331
+ try {
1332
+ debug.log('task-agent', 'recall-inject-filled', { card: id, checklistId: opts.checklistId,
1333
+ priorCards: recall.priorCards, items: recall.items, chars: recall.chars, truncated: recall.truncated });
1334
+ } catch { /* fail-soft observation */ }
1335
+ }
1322
1336
  let project: TaskCard['project'];
1323
1337
  let targetIsGit: boolean | null = null;
1324
1338
  if (opts.project) {
@@ -1449,17 +1463,19 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
1449
1463
  // Injected launchers are test seams and opt in explicitly at the contract test.
1450
1464
  if (opts.live && opts.preflightGoalDoneBoundary && !selectionFailure && tierSplitBlocked === undefined && move?.kind === 'launch') {
1451
1465
  readTaskAgentState(path);
1452
- const drafted = draftMissingGoalDoneBoundary(text, targetPaths);
1466
+ const metadataBeforeDraft = metadataText;
1467
+ const drafted = draftMissingGoalDoneBoundary(metadataText, targetPaths);
1453
1468
  if (drafted.added.length > 0) {
1454
- text = drafted.document;
1469
+ metadataText = drafted.document;
1470
+ text = `${text}${drafted.document.slice(metadataBeforeDraft.length)}`;
1455
1471
  card = { ...card, text };
1456
1472
  move = graphRun && graphRunPath ? { kind: 'launch' as const, command: ['graph', 'run', graphRunPath], reason: `조합 launcher graph-run — ${graphRun.file}` } : nextMoveFor(card, opts.landed);
1457
1473
  try { debug.log('task-agent.hand', 'boundary-autodrafted', { taskId: id, labels: drafted.added, targetPathCount: targetPaths.length }); } catch { /* fail-soft */ }
1458
1474
  }
1459
- const { missing } = inspectGoalDoneBoundary(text);
1475
+ const { missing } = inspectGoalDoneBoundary(metadataText);
1460
1476
  if (missing.length > 0) throw new Error(`goal-revision-required: 완료 경계 누락 ${missing.join(' · ')}`);
1461
1477
  // ENTRANCE-EVIDENCE-COMMAND-ONLY — 존재 검사와 구분된 형태 판정: 증거 명령 줄은 명령 원문만 받는다.
1462
- const formViolations = goalEvidenceCommandFormViolations(text);
1478
+ const formViolations = goalEvidenceCommandFormViolations(metadataText);
1463
1479
  if (formViolations.length > 0) {
1464
1480
  throw new Error(`goal-revision-required: 완료 경계 증거 명령은 명령 원문이어야 한다 ${formViolations.join(' · ')} — 증거 명령 줄에 설명 접미(예: → 0 fail)나 백틱 장식을 붙이지 말고 명령만 적은 뒤 다시 넘기세요`);
1465
1481
  }
@@ -1520,6 +1536,7 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
1520
1536
  runId,
1521
1537
  input: { ask: text, context: project ? { worktree: project.target } : {}, prior: {} },
1522
1538
  quiet: true,
1539
+ deps: { growthScope: 'task-agent' },
1523
1540
  });
1524
1541
  } catch (error) {
1525
1542
  // 조합 파일·대상 node가 없으면 runGraph 가 구체 사유로 던진다 — 임의 성공 처리하지 않는다.
@@ -1705,13 +1722,15 @@ export async function handTask(opts: HandTaskOptions): Promise<HandTaskResult> {
1705
1722
  writeCard(path, launched);
1706
1723
  // INFLIGHT-REGISTRY — 출발 때 맥락을 남긴다(머지 때 같은 파일 줄의 의도를 스마트 머지가 읽는다 · 착지하면 지운다).
1707
1724
  try {
1708
- const [head = '', ...rest] = text.split(/\r?\n/);
1725
+ // Preserve any completion-boundary draft while keeping the recall-only suffix out of intent/path metadata.
1726
+ const inflightText = metadataText;
1727
+ const [head = '', ...rest] = inflightText.split(/\r?\n/);
1709
1728
  const intentLines = (/^\s*(?:대상\s*경로|target\s*paths?)\s*[::]/i.test(head) ? rest : [head, ...rest])
1710
1729
  .filter((line) => !/^\s*(?:[-*]\s*)?완료 경계 (?:코드|실물|증거 명령)\s*:/.test(line));
1711
1730
  registerInflight({
1712
1731
  runId: boundRunId ?? runId, cell: card.checklistId ?? card.id, cardId: card.id,
1713
- intent: intentLines.join(' ').trim() || text,
1714
- files: parseAskTargetPathHints(text),
1732
+ intent: intentLines.join(' ').trim() || inflightText,
1733
+ files: parseAskTargetPathHints(inflightText),
1715
1734
  }, { path: join(dirname(path), INFLIGHT_REGISTRY_FILE), ...(opts.now ? { now: opts.now } : {}) });
1716
1735
  } catch (error) {
1717
1736
  try { debug.log('pr-tool.inflight', 'register-failed', { taskId: id, error: String((error as Error)?.message ?? error).slice(0, 200) }, { level: 'warn' }); } catch { /* fail-soft */ }
@@ -1,7 +1,7 @@
1
1
  import { lstatSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
2
  import { isAbsolute, join, relative, resolve, sep } from 'node:path';
3
3
  import { gunzipSync } from 'node:zlib';
4
- import { debug } from '../../debug/log.js';
4
+ import { debug, redactSecretText } from '../../debug/log.js';
5
5
  import { getDefaultLogStore, type LogStore } from '../../mss/logging/log-store.js';
6
6
  import { fromJsonl, type LogRecord } from '../../mss/logging/record.js';
7
7
 
@@ -118,6 +118,24 @@ export function podNoResultDiagnostic(ledger: string): string | null {
118
118
  return stage ? `child terminal result missing; last ledger stage=${stage}; round=${round ?? 'unknown'}; mustFix=${mustFix ?? 'unknown'}` : null;
119
119
  }
120
120
 
121
+ /** A failed child can lose its terminal JSON line after recording the actionable PR-open error. */
122
+ export function podNoResultChildError(ledger: string): string | null {
123
+ let error = '';
124
+ for (const line of ledger.split(/\r?\n/)) {
125
+ try {
126
+ const entry = JSON.parse(line) as { event?: unknown; data?: Record<string, unknown> };
127
+ if (entry?.event === 'pr-open-failed' && entry.data && typeof entry.data === 'object') {
128
+ error = typeof entry.data.error === 'string' ? entry.data.error : '';
129
+ }
130
+ // A later successful PR open proves the earlier guard failure was recovered.
131
+ if (entry?.event === 'pr-opened') error = '';
132
+ } catch { /* malformed lines do not replace a valid failure row */ }
133
+ }
134
+ if (!error) return null;
135
+ const line = redactSecretText(error).replace(/[\r\n\t\x00-\x1f\x7f]+/g, ' ').replace(/\s+/gu, ' ').trim();
136
+ return line.length > 240 ? `${line.slice(0, 228)}…[truncated]` : line;
137
+ }
138
+
121
139
  /** Import valid JSONL log records into the launching host store, with durable per-job line receipts. */
122
140
  export function importPodLogs(bytes: Buffer, job: string, store: LogStore | null = getDefaultLogStore()): { imported: number; skipped: number } {
123
141
  if (!store) return { imported: 0, skipped: 0 };
@@ -139,6 +139,18 @@ export interface PodProviderFailureFact {
139
139
  readonly httpStatusCode?: number;
140
140
  }
141
141
 
142
+ export interface PodFirstLlmFact {
143
+ readonly status: 'started' | 'ok' | 'error';
144
+ readonly provider: string;
145
+ readonly model: string;
146
+ readonly accountName: string | null;
147
+ readonly startedAt: string;
148
+ readonly respondedAt?: string;
149
+ readonly httpStatus?: number;
150
+ readonly errorFirstLine?: string;
151
+ readonly firstToolCallAt?: string;
152
+ }
153
+
142
154
  export const POD_EXIT_CLASSES = ['oom-killed', 'deadline-exceeded', 'gh-login-failed', 'pod-secret', 'ask-reprompt', 'provider-error', 'child-unconverged', 'child-error', 'no-result-line', 'unknown'] as const;
143
155
 
144
156
  export type PodExitClass = typeof POD_EXIT_CLASSES[number];
@@ -163,6 +175,8 @@ export function podChildEvidenceLedgerRow(input: {
163
175
  podTermination?: PodTermination | null;
164
176
  /** OBS-GAP-BATCH-1030 — 실패 행에만 붙는 두 스칼라(provider · HTTP status). 없으면 종전 행 그대로. */
165
177
  providerFailure?: PodProviderFailureFact | null;
178
+ /** POD-CHILD-FIRST-LLM-CALL-OBS — collected child-ledger first-call timeline. */
179
+ firstLlm?: PodFirstLlmFact | null;
166
180
  }): Record<string, unknown> | null {
167
181
  const { result } = input;
168
182
  const persist = input.state === 'failed' || input.state === 'aborted' || input.noResultLogEvidence != null
@@ -185,6 +199,7 @@ export function podChildEvidenceLedgerRow(input: {
185
199
  job: input.job,
186
200
  ...(input.providerFailure?.provider ? { provider: input.providerFailure.provider } : {}),
187
201
  ...(input.providerFailure?.httpStatusCode !== undefined ? { httpStatusCode: input.providerFailure.httpStatusCode } : {}),
202
+ ...(input.firstLlm ? { firstLlm: input.firstLlm } : {}),
188
203
  ...(input.podTermination ? { podTermination: input.podTermination } : {}),
189
204
  ...(childResult && Object.keys(childResult).length > 0 ? { childResult } : {}),
190
205
  };