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
@@ -1,36 +1,37 @@
1
1
  {
2
- "version": 1,
2
+ "version": 2,
3
3
  "runEvidence": {
4
- "scope": "ScenarioV0 YAML runs only; catalog entries reference reusable devices/tests, and list/show do not execute them",
4
+ "scope": "ScenarioV0 YAML runs only; catalog entries reference reusable devices/tests, and list/show/devices do not execute them",
5
5
  "runId": "uuid per execution",
6
6
  "event": { "category": "ux.sim.scenario", "name": "completed" },
7
- "persistence": "the isolated test instance logs/logs.db; query by exact category and data.runId",
7
+ "persistence": "ScenarioV0 and device logsRecorded=yes refer to rows persisted in the isolated test instance logs/logs.db (not production ~/.elanous/logs.db); eventNames lists persisted category/event pairs only, while debug-spy-only observations do not count.",
8
8
  "artifact": "<test-state>/ux-sim/evidence/<scenario>-seed-<seed>-run-<runId>.json"
9
9
  },
10
10
  "devices": [
11
- {"id": "fake-llm", "name": "Fake LLM", "implementation": ["src/ux-sim/fake-llm.ts"], "tests": ["src/ux-sim/fake-llm.test.ts"], "target": "LLM response and streaming boundary", "inputs": ["fixed or scripted response", "delay", "error/status"], "observations": ["captured calls", "stream chunks", "completion or failure"]},
12
- {"id": "fake-executable", "name": "Fake executable and PATH", "implementation": ["src/ux-sim/fake-bin.ts"], "tests": ["src/ux-sim/fake-bin.test.ts"], "target": "external executable process boundary", "inputs": ["stdout", "stderr", "exit code", "signal", "delay", "argv"], "observations": ["spawn arguments", "output", "exit result"]},
13
- {"id": "fake-github", "name": "Fake GitHub CLI and API", "implementation": ["src/ux-sim/fake-gh.ts"], "tests": ["src/ux-sim/fake-gh.test.ts"], "target": "PR list/edit/review/merge responses", "inputs": ["PR records", "pagination", "injected API failure"], "observations": ["requested operations", "deterministic response", "mutated fake state"]},
14
- {"id": "fake-kubectl", "name": "Fake kubectl", "implementation": ["src/ux-sim/fake-kubectl.ts"], "tests": ["src/ux-sim/fake-kubectl.test.ts"], "target": "Pod and Job query/termination boundary", "inputs": ["Pod/Job fixtures", "query result or failure"], "observations": ["kubectl argv", "returned resource state", "failure"]},
15
- {"id": "fake-herdr", "name": "Fake herdr", "implementation": ["src/ux-sim/fake-herdr.ts"], "tests": ["src/ux-sim/fake-herdr.test.ts"], "target": "pane lifecycle and report-agent handoff", "inputs": ["pane transitions", "missing report", "timeout"], "observations": ["pane state", "handoff result", "timeout classification"]},
16
- {"id": "fake-clock", "name": "Fake clock", "implementation": ["src/ux-sim/fake-clock.ts"], "tests": ["src/ux-sim/fake-clock.test.ts"], "target": "process-local time and timer boundary", "inputs": ["clock advance", "scheduled callback"], "observations": ["elapsed time", "fired timers"]},
17
- {"id": "temp-git-remote", "name": "Temporary Git remote", "implementation": ["src/ux-sim/temp-git-remote.ts"], "tests": ["src/ux-sim/temp-git-remote.test.ts"], "target": "real local git bare/clone boundary without GitHub", "inputs": ["temporary refs and commits"], "observations": ["local remote state", "branch and commit result"]},
18
- {"id": "fake-land-queue", "name": "Fake landing queue", "implementation": ["src/ux-sim/fake-land-queue.ts"], "tests": ["src/ux-sim/fake-land-queue.test.ts"], "target": "landing train scheduling", "inputs": ["load", "gate verdict", "priority", "cut window", "conflict"], "observations": ["queue choice", "wait/reject reason", "slot availability"]},
19
- {"id": "scenario-runner", "name": "Scenario file runner and human CLI", "implementation": ["src/ux-sim/scenario.ts", "src/ux-sim/mock-scenario-catalog.ts", "scripts/ux-sim.ts", "scenarios/ux-sim/provider-4xx-no-provider.yaml"], "tests": ["src/ux-sim/scenario.test.ts", "src/ux-sim/mock-scenario-catalog.test.ts"], "target": "registered test-only provider-response fault through the real Codex path; catalog list/show CLI", "inputs": ["scenario file", "seed", "registered HTTP/network fault", "MS-id"], "observations": ["widget snapshot", "debug event", "persistent logs.db row", "runId evidence artifact", "catalog listing/detail"]},
20
- {"id": "draft-inventory", "name": "Draft triage inventory simulator", "implementation": ["src/ux-sim/draft-inventory-builder.ts", "src/ux-sim/scenario.ts"], "tests": ["src/ux-sim/draft-inventory-builder.test.ts", "src/ux-sim/scenario.test.ts"], "target": "production draft triage decision distribution and protected/running safety", "inputs": ["deterministic 200-draft inventory", "merged twins", "open duplicates", "harvest references", "file lineage", "labels", "run state", "age"], "observations": ["real decideDraft/draftClaimState decisions", "scenario screen summary", "runId-scoped logs.db events", "evidence artifact"]},
21
- {"id": "linear-secretary", "name": "Integrated Linear secretary simulation", "implementation": ["src/ux-sim/linear-secretary.ts"], "tests": ["src/ux-sim/linear-secretary.test.ts"], "target": "test-only Telegram ambient intake through production intake/decision/browser coordinators with fake Linear and persisted isolated run evidence", "inputs": ["one-line request", "fake Linear GraphQL responses", "isolated browser capture"], "observations": ["child issues and progress", "browser attachment", "approval card", "runId-scoped event evidence", "external calls remain simulated"]},
22
- {"id": "release-graph-rig", "name": "Release graph simulation rig", "implementation": ["src/ux-sim/release-sim-rig.ts", "scripts/release-loop/gate-node-sim.ts", "scripts/release-loop/gate-autoheal-sim-evidence.ts", "scenarios/ux-sim/release-sim-rig.yaml"], "tests": ["src/ux-sim/release-sim-rig.test.ts", "scripts/release-loop/gate-flow-sim.test.ts", "scripts/release-loop/gate-node-sim.test.ts"], "target": "release graph routing, resume and failure paths", "inputs": ["node outcome", "evidence", "resume state"], "observations": ["visited nodes", "unexpected edges", "ledger events", "final graph state"]},
23
- {"id": "graph-engine-selector", "name": "Graph engine selection simulator", "implementation": ["src/ux-sim/graph-engine-sim.ts"], "tests": ["src/ux-sim/graph-engine-sim.test.ts"], "target": "production graph edge selection and growth policy from a synthetic component outcome", "inputs": ["graph", "component exit label", "optional growth"], "observations": ["selected edge", "growth applied", "source graph unchanged"]},
24
- {"id": "tui-interaction", "name": "TUI interaction and rendering", "implementation": ["src/ux-sim/interaction.ts", "src/ux-sim/turn-states.ts", "src/ux-sim/render-frame.ts", "src/ux-sim/headless-tui.ts", "src/ux-sim/input-history.ts", "src/ux-sim/slash-menu-frames.ts", "src/ux-sim/mock-seat-pty-frame.ts", "src/ux-sim/mock-seat-pty-frame-child.ts", "src/ux-sim/mock-seat-pty-sequence.ts", "src/ux-sim/mock-seat-pty-sequence-child.ts", "src/ux-sim/pty-key-modifiers-device.ts", "src/ux-sim/tty-foreground-steal-child.ts"], "tests": ["src/ux-sim/interaction.test.ts", "src/ux-sim/turn-states.test.ts", "src/ux-sim/render-frame.test.ts", "src/ux-sim/headless-tui.test.ts", "src/ux-sim/input-history.test.ts", "src/ux-sim/slash-menu-frames.test.ts", "src/ux-sim/mock-seat-pty-frame.test.ts", "src/ux-sim/mock-seat-pty-sequence.test.ts", "src/ux-sim/pty-key-modifiers-device.test.ts"], "target": "TUI event, state, frame, input history and PTY boundaries", "inputs": ["keys", "turn phase", "PTY bytes", "frame dimensions", "queued input"], "observations": ["production renderer output", "state transitions", "PTY input/output", "event history"]},
25
- {"id": "fault-injection", "name": "Fault injection devices", "implementation": ["src/ux-sim/fault-cred-expiry.ts", "src/ux-sim/fault-glm-no-credential.ts", "src/ux-sim/fault-needs-human-reason-repair.ts", "src/ux-sim/fault-nextmove-dispatch.ts", "src/ux-sim/fault-pod-child-result.ts", "src/ux-sim/fault-pod-codex-503.ts", "src/ux-sim/fault-pod-death.ts", "src/ux-sim/fault-pool-cap.ts", "src/ux-sim/fault-scope-escape-lift.ts", "src/ux-sim/fault-sqlite-busy.ts", "src/ux-sim/fault-tui-400-autoheal.ts", "src/ux-sim/gate-shard-host-reroute.ts"], "tests": ["src/ux-sim/fault-cred-expiry.test.ts", "src/ux-sim/fault-glm-no-credential.test.ts", "src/ux-sim/fault-needs-human-reason-repair.test.ts", "src/ux-sim/fault-nextmove-dispatch.test.ts", "src/ux-sim/fault-pod-child-result.test.ts", "src/ux-sim/fault-pod-codex-503.test.ts", "src/ux-sim/fault-pod-death.test.ts", "src/ux-sim/fault-pool-cap.test.ts", "src/ux-sim/fault-scope-escape-lift.test.ts", "src/ux-sim/fault-sqlite-busy.test.ts", "src/ux-sim/fault-tui-400-autoheal.test.ts", "src/ux-sim/gate-shard-host-reroute.test.ts"], "target": "credential, Pod, pool, routing, autoheal, scope and persistence failure boundaries", "inputs": ["explicit fault kind", "isolated fixture", "clock or resource outcome"], "observations": ["production decision function output", "reason/event", "recovery or refusal"]},
26
- {"id": "product-devices", "name": "Product and task-agent devices", "implementation": ["src/ux-sim/boot-daemon-tools-pty-shell-device.ts", "src/ux-sim/cli-config-audit-device.ts", "src/ux-sim/computer-use.ts", "src/ux-sim/dashboard-event-loop-stall-monitor-device.ts", "src/ux-sim/event-monkey.ts", "src/ux-sim/goal-device.ts", "src/ux-sim/goal-interim-trace.ts", "src/ux-sim/onboarding-first-run-device.ts", "src/ux-sim/resume-picker-device.ts", "src/ux-sim/skills-tools-shell-device.ts", "src/ux-sim/subagent-tools-device.ts", "src/ux-sim/task-agent-parent-host-device.ts", "src/ux-sim/task-agent-rejudge-on-head-device.ts", "src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts"], "tests": ["src/ux-sim/boot-daemon-tools-pty-shell-device.test.ts", "src/ux-sim/cli-config-audit-device.test.ts", "src/ux-sim/computer-use.test.ts", "src/ux-sim/dashboard-event-loop-stall-monitor-device.test.ts", "src/ux-sim/event-monkey.test.ts", "src/ux-sim/goal-device.test.ts", "src/ux-sim/onboarding-first-run-device.test.ts", "src/ux-sim/resume-picker-device.test.ts", "src/ux-sim/self-implement-author-clarification.test.ts", "src/ux-sim/skills-tools-shell-device.test.ts", "src/ux-sim/subagent-tools-device.test.ts", "src/ux-sim/task-agent-parent-host-device.test.ts", "src/ux-sim/task-agent-rejudge-on-head-device.test.ts", "src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.test.ts"], "target": "selected product, PTY, agent and orchestration seams", "inputs": ["UI state", "task outcome", "host/review decision", "tool result"], "observations": ["rendered state", "decision result", "event sequence", "stop reason"]},
27
- {"id": "turn-throw-sim", "name": "Delayed dashboard turn-body throw", "implementation": ["src/ux-sim/turn-throw-sim.ts", "src/dashboard/input/chat-main-plain-turn-runtime.ts", "src/dashboard/turn-busy-teardown.ts"], "tests": ["src/ux-sim/turn-throw-sim.test.ts", "src/dashboard/turn-busy-teardown.test.ts"], "target": "production plain-turn stage failure, turn-threw logging and busy teardown", "inputs": ["turn stage", "delay milliseconds", "queued external input"], "observations": ["tui.turn turn-threw phase=turn:<stage>", "turn.state idle", "one queued input delivered"]},
28
- {"id": "first-run-and-seminar", "name": "First-run authoring and seminar scenarios", "implementation": ["src/ux-sim/mock-authoring-first-run.ts", "src/ux-sim/mock-authoring-first-run-child.ts", "src/ux-sim/seminar-rehearsal.ts", "src/ux-sim/classic-tui-seat-scenarios.ts", "src/ux-sim/next-tui-seat-scenarios.ts", "src/ux-sim/session-id-seed.ts"], "tests": ["src/ux-sim/mock-authoring-first-run.test.ts", "src/ux-sim/seminar-rehearsal.test.ts", "src/ux-sim/classic-tui-seat-scenarios.test.ts", "src/ux-sim/next-tui-seat-scenarios.test.ts"], "target": "first-run, authoring and scripted TUI flows", "inputs": ["mock author response", "scenario steps", "seeded session id"], "observations": ["step result", "TUI snapshot", "completion and failure markers"]},
29
- {"id": "support-fakes", "name": "Additional fake and in-process CLI fixtures", "implementation": ["test/ux-sim/aimock-local.ts", "src/ux-sim/in-process-cli.ts", "src/ux-sim/browser-hand.ts", "src/ux-sim/fake-browser-page.ts", "src/ux-sim/fake-linear-device.ts", "src/ux-sim/service-key-setup.ts", "src/ux-sim/term-slash-device.ts"], "tests": ["src/ux-sim/aimock-local.test.ts", "src/ux-sim/in-process-cli.test.ts", "src/ux-sim/browser-hand.test.ts", "src/ux-sim/service-key-setup.test.ts", "src/ux-sim/term-slash-device.test.ts"], "target": "local fake LLM server, browser/linear fakes, service-key setup, terminal slash device and test CLI instance", "inputs": ["test state root", "fake endpoint response", "temporary git repository", "browser/page and service state"], "observations": ["isolated CLI result", "server requests", "repository state", "fake device interactions"]}
11
+ {"id": "fake-llm", "name": "Fake LLM", "implementation": ["src/ux-sim/fake-llm.ts"], "tests": ["src/ux-sim/fake-llm.test.ts"], "target": "LLM response and streaming boundary", "inputs": ["fixed or scripted response", "delay", "error/status"], "observations": ["captured calls", "stream chunks", "completion or failure"], "entryCommands": ["bun test src/ux-sim/fake-llm.test.ts"], "logsRecorded": "no", "eventNames": [], "recentUse": null},
12
+ {"id": "fake-executable", "name": "Fake executable and PATH", "implementation": ["src/ux-sim/fake-bin.ts"], "tests": ["src/ux-sim/fake-bin.test.ts"], "target": "external executable process boundary", "inputs": ["stdout", "stderr", "exit code", "signal", "delay", "argv"], "observations": ["spawn arguments", "output", "exit result"], "entryCommands": ["bun test src/ux-sim/fake-bin.test.ts"], "logsRecorded": "no", "eventNames": [], "recentUse": null},
13
+ {"id": "fake-github", "name": "Fake GitHub CLI and API", "implementation": ["src/ux-sim/fake-gh.ts"], "tests": ["src/ux-sim/fake-gh.test.ts"], "target": "PR list/edit/review/merge responses", "inputs": ["PR records", "pagination", "injected API failure"], "observations": ["requested operations", "deterministic response", "mutated fake state"], "entryCommands": ["bun test src/ux-sim/fake-gh.test.ts"], "logsRecorded": "no", "eventNames": [], "recentUse": null},
14
+ {"id": "fake-kubectl", "name": "Fake kubectl", "implementation": ["src/ux-sim/fake-kubectl.ts"], "tests": ["src/ux-sim/fake-kubectl.test.ts"], "target": "Pod and Job query/termination boundary", "inputs": ["Pod/Job fixtures", "query result or failure"], "observations": ["kubectl argv", "returned resource state", "failure"], "entryCommands": ["bun test src/ux-sim/fake-kubectl.test.ts"], "logsRecorded": "no", "eventNames": [], "recentUse": null},
15
+ {"id": "fake-herdr", "name": "Fake herdr", "implementation": ["src/ux-sim/fake-herdr.ts"], "tests": ["src/ux-sim/fake-herdr.test.ts"], "target": "pane lifecycle and report-agent handoff", "inputs": ["pane transitions", "missing report", "timeout"], "observations": ["pane state", "handoff result", "timeout classification"], "entryCommands": ["bun test src/ux-sim/fake-herdr.test.ts"], "logsRecorded": "no", "eventNames": [], "recentUse": null},
16
+ {"id": "fake-clock", "name": "Fake clock", "implementation": ["src/ux-sim/fake-clock.ts"], "tests": ["src/ux-sim/fake-clock.test.ts"], "target": "process-local time and timer boundary", "inputs": ["clock advance", "scheduled callback"], "observations": ["elapsed time", "fired timers"], "entryCommands": ["bun test src/ux-sim/fake-clock.test.ts"], "logsRecorded": "no", "eventNames": [], "recentUse": null},
17
+ {"id": "temp-git-remote", "name": "Temporary Git remote", "implementation": ["src/ux-sim/temp-git-remote.ts"], "tests": ["src/ux-sim/temp-git-remote.test.ts"], "target": "real local git bare/clone boundary without GitHub", "inputs": ["temporary refs and commits"], "observations": ["local remote state", "branch and commit result"], "entryCommands": ["bun test src/ux-sim/temp-git-remote.test.ts"], "logsRecorded": "no", "eventNames": [], "recentUse": null},
18
+ {"id": "fake-land-queue", "name": "Fake landing queue", "implementation": ["src/ux-sim/fake-land-queue.ts"], "tests": ["src/ux-sim/fake-land-queue.test.ts"], "target": "landing train scheduling", "inputs": ["load", "gate verdict", "priority", "cut window", "conflict"], "observations": ["queue choice", "wait/reject reason", "slot availability"], "entryCommands": ["bun test src/ux-sim/fake-land-queue.test.ts"], "logsRecorded": "no", "eventNames": [], "recentUse": null},
19
+ {"id": "scenario-runner", "name": "Scenario file runner and human CLI", "implementation": ["src/ux-sim/scenario.ts", "src/ux-sim/mock-scenario-catalog.ts", "scripts/ux-sim.ts", "scenarios/ux-sim/provider-4xx-no-provider.yaml"], "tests": ["src/ux-sim/scenario.test.ts", "src/ux-sim/mock-scenario-catalog.test.ts"], "target": "registered test-only provider-response fault through the real Codex path; catalog list/show CLI", "inputs": ["scenario file", "seed", "registered HTTP/network fault", "MS-id"], "observations": ["widget snapshot", "debug event", "persistent logs.db row", "runId evidence artifact", "catalog listing/detail"], "entryCommands": ["bun scripts/ux-sim.ts list", "bun bin/elanous.mjs --test sim run scenarios/ux-sim/provider-4xx-no-provider.yaml"], "logsRecorded": "conditional", "eventNames": ["llm.codex/request-rejected-shape", "ux.sim.scenario/completed"], "recentUse": null},
20
+ {"id": "draft-inventory", "name": "Draft triage inventory simulator", "implementation": ["src/ux-sim/draft-inventory-builder.ts", "src/ux-sim/scenario.ts"], "tests": ["src/ux-sim/draft-inventory-builder.test.ts", "src/ux-sim/scenario.test.ts"], "target": "production draft triage decision distribution and protected/running safety", "inputs": ["deterministic 200-draft inventory", "merged twins", "open duplicates", "harvest references", "file lineage", "labels", "run state", "age"], "observations": ["real decideDraft/draftClaimState decisions", "scenario screen summary", "runId-scoped isolated test logs.db events", "evidence artifact"], "entryCommands": ["bun test src/ux-sim/draft-inventory-builder.test.ts src/ux-sim/scenario.test.ts"], "logsRecorded": "yes", "eventNames": ["ux.sim.draft-inventory/assessed", "ux.sim.scenario/completed"], "recentUse": null},
21
+ {"id": "linear-secretary", "name": "Integrated Linear secretary simulation", "implementation": ["src/ux-sim/linear-secretary.ts"], "tests": ["src/ux-sim/linear-secretary.test.ts"], "target": "test-only Telegram ambient intake through production intake/decision/browser coordinators with fake Linear and persisted isolated run evidence", "inputs": ["one-line request", "fake Linear GraphQL responses", "isolated browser capture"], "observations": ["child issues and progress", "browser attachment", "approval card", "runId-scoped isolated test logs.db events", "external calls remain simulated"], "entryCommands": ["bun test src/ux-sim/linear-secretary.test.ts"], "logsRecorded": "yes", "eventNames": ["ux.sim.linear-secretary/completed", "ux.sim.linear-secretary/browser-capture-attached", "ux.sim.linear-secretary/approval-card-opened"], "recentUse": null},
22
+ {"id": "release-graph-rig", "name": "Release graph simulation rig", "implementation": ["src/ux-sim/release-sim-rig.ts", "scripts/release-loop/gate-node-sim.ts", "scripts/release-loop/gate-autoheal-sim-evidence.ts", "scenarios/ux-sim/release-sim-rig.yaml"], "tests": ["src/ux-sim/release-sim-rig.test.ts", "scripts/release-loop/release-graph-fanout-mock.test.ts", "scripts/release-loop/gate-flow-sim.test.ts", "scripts/release-loop/gate-node-sim.test.ts"], "target": "release graph routing, fan-out joins, resume and failure paths", "inputs": ["node outcomes", "branch overlap delays", "evidence", "resume state"], "observations": ["visited nodes", "fan-out branch results", "start-time overlap", "unexpected edges", "ledger events", "final graph state"], "entryCommands": ["bun test scripts/release-loop/release-graph-fanout-mock.test.ts", "bun test src/ux-sim/release-sim-rig.test.ts", "bun bin/elanous.mjs --test sim run scenarios/ux-sim/release-sim-rig.yaml"], "logsRecorded": "conditional", "eventNames": [], "recentUse": null},
23
+ {"id": "graph-engine-selector", "name": "Graph engine selection simulator", "implementation": ["src/ux-sim/graph-engine-sim.ts"], "tests": ["src/ux-sim/graph-engine-sim.test.ts"], "target": "production graph edge selection and growth policy from a synthetic component outcome", "inputs": ["graph", "component exit label", "optional growth"], "observations": ["selected edge", "growth applied", "source graph unchanged"], "entryCommands": ["bun test src/ux-sim/graph-engine-sim.test.ts"], "logsRecorded": "no", "eventNames": [], "recentUse": null},
24
+ {"id": "tui-interaction", "name": "TUI interaction and rendering", "implementation": ["src/ux-sim/interaction.ts", "src/ux-sim/turn-states.ts", "src/ux-sim/render-frame.ts", "src/ux-sim/headless-tui.ts", "src/ux-sim/input-history.ts", "src/ux-sim/slash-menu-frames.ts", "src/ux-sim/mock-seat-pty-frame.ts", "src/ux-sim/mock-seat-pty-frame-child.ts", "src/ux-sim/mock-seat-pty-sequence.ts", "src/ux-sim/mock-seat-pty-sequence-child.ts", "src/ux-sim/pty-key-modifiers-device.ts", "src/ux-sim/tty-foreground-steal-child.ts"], "tests": ["src/ux-sim/interaction.test.ts", "src/ux-sim/turn-states.test.ts", "src/ux-sim/render-frame.test.ts", "src/ux-sim/headless-tui.test.ts", "src/ux-sim/input-history.test.ts", "src/ux-sim/slash-menu-frames.test.ts", "src/ux-sim/mock-seat-pty-frame.test.ts", "src/ux-sim/mock-seat-pty-sequence.test.ts", "src/ux-sim/pty-key-modifiers-device.test.ts"], "target": "TUI event, state, frame, input history and PTY boundaries", "inputs": ["keys", "turn phase", "PTY bytes", "frame dimensions", "queued input"], "observations": ["production renderer output", "state transitions", "PTY input/output", "event history"], "entryCommands": ["bun test src/ux-sim/interaction.test.ts src/ux-sim/turn-states.test.ts src/ux-sim/render-frame.test.ts src/ux-sim/headless-tui.test.ts src/ux-sim/input-history.test.ts src/ux-sim/slash-menu-frames.test.ts src/ux-sim/mock-seat-pty-frame.test.ts src/ux-sim/mock-seat-pty-sequence.test.ts src/ux-sim/pty-key-modifiers-device.test.ts"], "logsRecorded": "no", "eventNames": [], "recentUse": null},
25
+ {"id": "fault-injection", "name": "Fault injection devices", "implementation": ["src/ux-sim/fault-cred-expiry.ts", "src/ux-sim/fault-glm-no-credential.ts", "src/ux-sim/fault-needs-human-reason-repair.ts", "src/ux-sim/fault-nextmove-dispatch.ts", "src/ux-sim/fault-pod-child-result.ts", "src/ux-sim/fault-pod-codex-503.ts", "src/ux-sim/fault-pod-death.ts", "src/ux-sim/fault-pool-cap.ts", "src/ux-sim/fault-scope-escape-lift.ts", "src/ux-sim/fault-sqlite-busy.ts", "src/ux-sim/fault-tui-400-autoheal.ts", "src/ux-sim/gate-shard-host-reroute.ts"], "tests": ["src/ux-sim/fault-cred-expiry.test.ts", "src/ux-sim/fault-glm-no-credential.test.ts", "src/ux-sim/fault-needs-human-reason-repair.test.ts", "src/ux-sim/fault-nextmove-dispatch.test.ts", "src/ux-sim/fault-pod-child-result.test.ts", "src/ux-sim/fault-pod-codex-503.test.ts", "src/ux-sim/fault-pod-death.test.ts", "src/ux-sim/fault-pool-cap.test.ts", "src/ux-sim/fault-scope-escape-lift.test.ts", "src/ux-sim/fault-sqlite-busy.test.ts", "src/ux-sim/fault-tui-400-autoheal.test.ts", "src/ux-sim/gate-shard-host-reroute.test.ts"], "target": "credential, Pod, pool, routing, autoheal, scope and persistence failure boundaries", "inputs": ["explicit fault kind", "isolated fixture", "clock or resource outcome"], "observations": ["production decision function output", "reason/event", "recovery or refusal"], "entryCommands": ["bun test src/ux-sim/fault-cred-expiry.test.ts src/ux-sim/fault-glm-no-credential.test.ts src/ux-sim/fault-needs-human-reason-repair.test.ts src/ux-sim/fault-nextmove-dispatch.test.ts src/ux-sim/fault-pod-child-result.test.ts src/ux-sim/fault-pod-codex-503.test.ts src/ux-sim/fault-pod-death.test.ts src/ux-sim/fault-pool-cap.test.ts src/ux-sim/fault-scope-escape-lift.test.ts src/ux-sim/fault-sqlite-busy.test.ts src/ux-sim/fault-tui-400-autoheal.test.ts src/ux-sim/gate-shard-host-reroute.test.ts"], "logsRecorded": "no", "eventNames": [], "recentUse": null},
26
+ {"id": "product-devices", "name": "Product and task-agent devices", "implementation": ["src/ux-sim/boot-daemon-tools-pty-shell-device.ts", "src/ux-sim/cli-config-audit-device.ts", "src/ux-sim/computer-use.ts", "src/ux-sim/dashboard-event-loop-stall-monitor-device.ts", "src/ux-sim/event-monkey.ts", "src/ux-sim/goal-device.ts", "src/ux-sim/goal-interim-trace.ts", "src/ux-sim/onboarding-first-run-device.ts", "src/ux-sim/resume-picker-device.ts", "src/ux-sim/skills-tools-shell-device.ts", "src/ux-sim/subagent-tools-device.ts", "src/ux-sim/task-agent-parent-host-device.ts", "src/ux-sim/task-agent-rejudge-on-head-device.ts", "src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts"], "tests": ["src/ux-sim/boot-daemon-tools-pty-shell-device.test.ts", "src/ux-sim/cli-config-audit-device.test.ts", "src/ux-sim/computer-use.test.ts", "src/ux-sim/dashboard-event-loop-stall-monitor-device.test.ts", "src/ux-sim/event-monkey.test.ts", "src/ux-sim/goal-device.test.ts", "src/ux-sim/onboarding-first-run-device.test.ts", "src/ux-sim/resume-picker-device.test.ts", "src/ux-sim/self-implement-author-clarification.test.ts", "src/ux-sim/skills-tools-shell-device.test.ts", "src/ux-sim/subagent-tools-device.test.ts", "src/ux-sim/task-agent-parent-host-device.test.ts", "src/ux-sim/task-agent-rejudge-on-head-device.test.ts", "src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.test.ts"], "target": "selected product, PTY, agent and orchestration seams", "inputs": ["UI state", "task outcome", "host/review decision", "tool result"], "observations": ["rendered state", "decision result", "event sequence", "stop reason"], "entryCommands": ["bun test src/ux-sim/boot-daemon-tools-pty-shell-device.test.ts src/ux-sim/cli-config-audit-device.test.ts src/ux-sim/computer-use.test.ts src/ux-sim/dashboard-event-loop-stall-monitor-device.test.ts src/ux-sim/event-monkey.test.ts src/ux-sim/goal-device.test.ts src/ux-sim/onboarding-first-run-device.test.ts src/ux-sim/resume-picker-device.test.ts src/ux-sim/self-implement-author-clarification.test.ts src/ux-sim/skills-tools-shell-device.test.ts src/ux-sim/subagent-tools-device.test.ts src/ux-sim/task-agent-parent-host-device.test.ts src/ux-sim/task-agent-rejudge-on-head-device.test.ts src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.test.ts"], "logsRecorded": "no", "eventNames": [], "recentUse": null},
27
+ {"id": "turn-throw-sim", "name": "Delayed dashboard turn-body throw", "implementation": ["src/ux-sim/turn-throw-sim.ts", "src/dashboard/input/chat-main-plain-turn-runtime.ts", "src/dashboard/turn-busy-teardown.ts"], "tests": ["src/ux-sim/turn-throw-sim.test.ts", "src/dashboard/turn-busy-teardown.test.ts"], "target": "production plain-turn stage failure, turn-threw logging and busy teardown", "inputs": ["turn stage", "delay milliseconds", "queued external input"], "observations": ["in-memory debug capture of tui.turn/turn-threw phase=turn:<stage> (not persisted to test logs.db)", "turn.state idle", "one queued input delivered"], "entryCommands": ["bun test src/ux-sim/turn-throw-sim.test.ts src/dashboard/turn-busy-teardown.test.ts"], "logsRecorded": "no", "eventNames": [], "recentUse": null},
28
+ {"id": "first-run-and-seminar", "name": "First-run authoring and seminar scenarios", "implementation": ["src/ux-sim/mock-authoring-first-run.ts", "src/ux-sim/mock-authoring-first-run-child.ts", "src/ux-sim/seminar-rehearsal.ts", "src/ux-sim/classic-tui-seat-scenarios.ts", "src/ux-sim/next-tui-seat-scenarios.ts", "src/ux-sim/session-id-seed.ts"], "tests": ["src/ux-sim/mock-authoring-first-run.test.ts", "src/ux-sim/seminar-rehearsal.test.ts", "src/ux-sim/classic-tui-seat-scenarios.test.ts", "src/ux-sim/next-tui-seat-scenarios.test.ts"], "target": "first-run, authoring and scripted TUI flows", "inputs": ["mock author response", "scenario steps", "seeded session id"], "observations": ["step result", "TUI snapshot", "completion and failure markers"], "entryCommands": ["bun test src/ux-sim/mock-authoring-first-run.test.ts src/ux-sim/seminar-rehearsal.test.ts src/ux-sim/classic-tui-seat-scenarios.test.ts src/ux-sim/next-tui-seat-scenarios.test.ts"], "logsRecorded": "no", "eventNames": [], "recentUse": null},
29
+ {"id": "support-fakes", "name": "Additional fake and in-process CLI fixtures", "implementation": ["test/ux-sim/aimock-local.ts", "src/ux-sim/in-process-cli.ts", "src/ux-sim/browser-hand.ts", "src/ux-sim/fake-browser-page.ts", "src/ux-sim/fake-linear-device.ts", "src/ux-sim/service-key-setup.ts", "src/ux-sim/term-slash-device.ts"], "tests": ["src/ux-sim/aimock-local.test.ts", "src/ux-sim/in-process-cli.test.ts", "src/ux-sim/browser-hand.test.ts", "src/ux-sim/service-key-setup.test.ts", "src/ux-sim/term-slash-device.test.ts", "test/telegram-surface-hitl.test.ts"], "target": "local fake LLM server, browser/linear fakes, service-key setup, terminal slash device and test CLI instance", "inputs": ["test state root", "fake endpoint response", "temporary git repository", "browser/page and service state"], "observations": ["isolated CLI result", "server requests", "repository state", "fake device interactions"], "entryCommands": ["bun test src/ux-sim/aimock-local.test.ts", "bun test test/telegram-surface-hitl.test.ts"], "logsRecorded": "no", "eventNames": [], "recentUse": null}
30
30
  ],
31
31
  "scenarios": [
32
32
  {"id": "UX-MS-01", "name": "Child report deficit with later harvest", "kind": "report-deficit", "device": "fault-injection", "implementation": ["src/ux-sim/fault-pod-child-result.ts"], "tests": ["src/ux-sim/fault-pod-child-result.test.ts"], "trigger": "A child completes with report-deficit while a later child has a harvestable PR.", "observe": ["failure classification remains report-deficit", "Pod terminal data stays attached", "later harvest remains independent"], "expected": "report-deficit is preserved and harvest result is visible"},
33
- {"id": "UX-MS-02", "name": "Release gate regression routing", "kind": "gate-regression", "device": "release-graph-rig", "implementation": ["src/ux-sim/release-sim-rig.ts", "scripts/release-loop/gate-node-sim.ts", "scripts/release-loop/gate-autoheal-sim-evidence.ts", "scenarios/ux-sim/release-sim-rig.yaml"], "tests": ["src/ux-sim/release-sim-rig.test.ts", "scripts/release-loop/gate-node-sim.test.ts", "scripts/release-loop/gate-flow-sim.test.ts"], "trigger": "Inject a regression verdict into the release gate node.", "observe": ["visited graph nodes", "unexpected edge list", "terminal status"], "expected": "failure follows the configured repair/review route, not publish"},
33
+ {"id": "UX-MS-02", "name": "Release gate regression routing", "kind": "gate-regression", "device": "release-graph-rig", "implementation": ["src/ux-sim/release-sim-rig.ts", "scripts/release-loop/gate-node-sim.ts", "scripts/release-loop/gate-autoheal-sim-evidence.ts", "scenarios/ux-sim/release-sim-rig.yaml"], "tests": ["src/ux-sim/release-sim-rig.test.ts", "scripts/release-loop/release-graph-fanout-mock.test.ts", "scripts/release-loop/gate-node-sim.test.ts", "scripts/release-loop/gate-flow-sim.test.ts"], "trigger": "Inject release node outcomes including concurrent warning and required branches.", "observe": ["visited graph nodes", "fan-out join branch outcomes", "start-time overlap", "unexpected edge list", "terminal status"], "expected": "warning failures remain visible but pass the join; required failures route to failed"},
34
+ {"id": "RELEASE-GRAPH-PREPUB-FANOUT", "name": "Pre-gate and pre-prepare required/warning fan-out", "kind": "release-graph-fanout", "device": "release-graph-rig", "implementation": ["graphs/release/release-loop.yaml", "src/ux-sim/release-sim-rig.ts", "scenarios/ux-sim/release-sim-rig.yaml"], "tests": ["scripts/release-loop/release-graph-fanout-mock.test.ts", "src/ux-sim/release-sim-rig.test.ts"], "trigger": "Run export-check with prefetch and mac-smoke with pwa concurrently before gate/prepare.", "observe": ["branch start-time overlap", "warning branch failure preserved", "required branch failure at join", "join outcome and next node"], "expected": "prefetch/mac-smoke failures continue; export-check/pwa failures route through release failure"},
34
35
  {"id": "UX-MS-03", "name": "Review cap and no-verdict boundary", "kind": "review-cap-no-verdict", "device": "product-devices", "implementation": ["src/ux-sim/task-agent-rejudge-on-head-device.ts"], "tests": ["src/ux-sim/task-agent-rejudge-on-head-device.test.ts"], "trigger": "Stored review count reaches the cap or a review result is absent.", "observe": ["review request count", "verdict classification", "decision reason"], "expected": "the cap blocks another request and missing verdict stays unmeasured"},
35
36
  {"id": "UX-MS-04", "name": "Pod credential failure", "kind": "pod-auth-failure", "device": "fault-injection", "implementation": ["src/ux-sim/fault-glm-no-credential.ts", "src/ux-sim/fault-pod-codex-503.ts"], "tests": ["src/ux-sim/fault-glm-no-credential.test.ts", "src/ux-sim/fault-pod-codex-503.test.ts"], "trigger": "Remove the child credential or inject a Codex 401/503 response.", "observe": ["credential readiness", "provider error event", "launch/recovery disposition"], "expected": "credential absence and temporary provider unavailability remain distinguishable"},
36
37
  {"id": "UX-MS-05", "name": "TUI and gate worker stall", "kind": "stall", "device": "product-devices", "implementation": ["src/ux-sim/dashboard-event-loop-stall-monitor-device.ts"], "tests": ["src/ux-sim/dashboard-event-loop-stall-monitor-device.test.ts", "scripts/release-loop/gate-pod-stall.test.ts"], "trigger": "Delay the UI event loop or stop gate shard output.", "observe": ["typing lag/stall sample", "stalled shard reason", "bounded completion"], "expected": "stall is named and unrelated work can finish"},
@@ -41,14 +42,15 @@
41
42
  {"id": "UX-MS-11", "name": "Codex request-shape 400 recovery boundary", "kind": "provider-request-rejected", "device": "scenario-runner", "implementation": ["scenarios/ux-sim/provider-4xx-no-provider.yaml", "src/ux-sim/scenario.ts"], "tests": ["src/ux-sim/scenario.test.ts"], "trigger": "Run the test-universe ScenarioV0 fixture with two injected HTTP 400 responses for the Codex request-shape boundary.", "observe": ["llm.codex/request-rejected-shape debug event", "response status and count", "ScenarioV0 completion event and runId evidence artifact"], "expected": "The isolated scenario records one request-rejected-shape event and one runId-scoped completion row."}
42
43
  ],
43
44
  "candidateAudit": {
44
- "source": "~/elanous-hq/seat-state/OP/MOCK-DEVICES-INVENTORY-1031.md §3",
45
- "baseCommit": "0d483f46e1ab9ea081cff933f8bb840790c44dde",
46
- "sourceRows": 34,
47
- "existingPaths": 33,
45
+ "source": "~/elanous-hq/seat-state/OP/MOCK-DEVICES-INVENTORY-1031.md §3 + targeted fake-Telegram consumer scan",
46
+ "baseCommit": "533845484cf2c901cfee902a3586354278e7cae8",
47
+ "sourceRows": 35,
48
+ "existingPaths": 34,
48
49
  "excludedPaths": 27,
49
50
  "sourceExclusions": [
50
51
  {"path": "scenarios/ux-sim/MK-MS-01.yaml", "reason": "Separately registered by open PR #34039 (MK-MS-01 E4 sequence); keep it outside this 33-candidate registration to avoid duplicate catalog ownership."}
51
52
  ],
53
+ "omissionCheck": {"requiredPaths": ["test/ux-sim/aimock-local.ts", "test/telegram-surface-hitl.test.ts"], "missingPaths": []},
52
54
  "candidates": [
53
55
  {"path": "scripts/tui-sim-bench.ts", "disposition": "excluded", "entryCommand": "not-applicable: benchmark requires an explicitly selected goal and provider", "logsRecorded": "no", "logsDetail": "Benchmark is not run by catalog discovery.", "excludeReason": "Measurement/benchmark tool, not a mock device."},
54
56
  {"path": "scripts/tui-sim.ts", "disposition": "excluded", "entryCommand": "bun scripts/tui-sim.ts start --id mock-catalog-example --test", "logsRecorded": "conditional", "logsDetail": "Writes its own simulation artifacts, not ScenarioV0 logs.", "excludeReason": "Standalone TUI driver; separate artifact contract."},
@@ -70,7 +72,7 @@
70
72
  {"path": "scenarios/heap-graph.yaml", "disposition": "excluded", "entryCommand": "not-applicable: consumed by the Playground renderer; no direct scenario CLI", "logsRecorded": "runner-dependent", "logsDetail": "No standalone command or UX ScenarioV0 completion contract.", "excludeReason": "Graph/playground scenario, outside UX mock-device scope."},
71
73
  {"path": "scenarios/iul-timeline-viewer.yaml", "disposition": "excluded", "entryCommand": "not-applicable: consumed by the IUL timeline viewer; no direct scenario CLI", "logsRecorded": "runner-dependent", "logsDetail": "No standalone command or UX ScenarioV0 completion contract.", "excludeReason": "Graph/playground scenario, outside UX mock-device scope."},
72
74
  {"path": "scenarios/ux-sim/provider-4xx-no-provider.yaml", "disposition": "scenario", "entryCommand": "bun bin/elanous.mjs --test sim run scenarios/ux-sim/provider-4xx-no-provider.yaml", "logsRecorded": "yes", "logsDetail": "ux.sim.scenario/completed in test logs.db; expects llm.codex/request-rejected-shape.", "deviceId": "scenario-runner", "scenarioIds": ["UX-MS-11"]},
73
- {"path": "scenarios/ux-sim/release-sim-rig.yaml", "disposition": "already-indexed", "entryCommand": "bun bin/elanous.mjs --test sim run scenarios/ux-sim/release-sim-rig.yaml", "logsRecorded": "yes", "logsDetail": "ScenarioV0 completion row is stored in isolated test logs.db; the evidence artifact is a separate JSON file.", "deviceId": "release-graph-rig", "scenarioIds": ["UX-MS-02"]},
75
+ {"path": "scenarios/ux-sim/release-sim-rig.yaml", "disposition": "already-indexed", "entryCommand": "bun bin/elanous.mjs --test sim run scenarios/ux-sim/release-sim-rig.yaml", "logsRecorded": "yes", "logsDetail": "ScenarioV0 completion row is stored in isolated test logs.db; the evidence artifact is a separate JSON file.", "deviceId": "release-graph-rig", "scenarioIds": ["UX-MS-02", "RELEASE-GRAPH-PREPUB-FANOUT"]},
74
76
  {"path": "tests/scenarios/4provider-feature-impl.yaml", "disposition": "excluded", "entryCommand": "eln repl --new --json --scenario tests/scenarios/4provider-feature-impl.yaml", "logsRecorded": "runner-dependent", "logsDetail": "REPL logs are separate; some scenarios invoke live models.", "excludeReason": "REPL/provider workflow, not reusable mock device; separate runner or live model dependency."},
75
77
  {"path": "tests/scenarios/capability-level-11.yaml", "disposition": "excluded", "entryCommand": "eln repl --new --json --scenario tests/scenarios/capability-level-11.yaml", "logsRecorded": "runner-dependent", "logsDetail": "REPL logs are separate; some scenarios invoke live models.", "excludeReason": "REPL/provider workflow, not reusable mock device; separate runner or live model dependency."},
76
78
  {"path": "tests/scenarios/codex-baseline.yaml", "disposition": "excluded", "entryCommand": "eln repl --new --json --scenario tests/scenarios/codex-baseline.yaml", "logsRecorded": "runner-dependent", "logsDetail": "REPL logs are separate; some scenarios invoke live models.", "excludeReason": "REPL/provider workflow, not reusable mock device; separate runner or live model dependency."},
@@ -82,7 +84,8 @@
82
84
  {"path": "tests/scenarios/repl-tool-doom-recovery.yaml", "disposition": "excluded", "entryCommand": "eln repl --new --json --scenario tests/scenarios/repl-tool-doom-recovery.yaml", "logsRecorded": "runner-dependent", "logsDetail": "REPL logs are separate; some scenarios invoke live models.", "excludeReason": "REPL/provider workflow, not reusable mock device; separate runner or live model dependency."},
83
85
  {"path": "src/playground-scenario/default-scenarios.ts", "disposition": "excluded", "entryCommand": "bun test src/playground-scenario/", "logsRecorded": "no", "logsDetail": "Scenario constants consumed by Playground tests.", "excludeReason": "Product demo inputs, not mock-device implementation."},
84
86
  {"path": "src/playground-scenario/fake-harness.ts", "disposition": "excluded", "entryCommand": "bun test src/playground-scenario/", "logsRecorded": "no", "logsDetail": "In-memory test harness consumed by Playground tests.", "excludeReason": "Test helper, no independent reusable mock interface."},
85
- {"path": "src/showroom/outbound/channels/stubs.ts", "disposition": "excluded", "entryCommand": "bun test src/showroom/outbound/channels/", "logsRecorded": "no", "logsDetail": "Stub results asserted by channel tests.", "excludeReason": "Outbound channel stub, not a UX simulation device."}
87
+ {"path": "src/showroom/outbound/channels/stubs.ts", "disposition": "excluded", "entryCommand": "bun test src/showroom/outbound/channels/", "logsRecorded": "no", "logsDetail": "Stub results asserted by channel tests.", "excludeReason": "Outbound channel stub, not a UX simulation device."},
88
+ {"path": "test/telegram-surface-hitl.test.ts", "disposition": "already-indexed", "entryCommand": "bun test test/telegram-surface-hitl.test.ts", "logsRecorded": "no", "logsDetail": "The test drives an in-memory fake TelegramBot and asserts captured interactions; it does not write app logs.db.", "deviceId": "support-fakes"}
86
89
  ]
87
90
  },
88
91
  "discovery": {
@@ -9,6 +9,10 @@ export interface MockScenarioDevice {
9
9
  target: string;
10
10
  inputs: string[];
11
11
  observations: string[];
12
+ entryCommands: string[];
13
+ logsRecorded: 'yes' | 'no' | 'conditional' | 'runner-dependent';
14
+ eventNames: string[];
15
+ recentUse: { observedAt: string; runId: string; event: string; scenarioId: string; command: string } | null;
12
16
  }
13
17
 
14
18
  export interface MockScenarioEntry {
@@ -35,7 +39,7 @@ export interface MockScenarioCandidate {
35
39
  }
36
40
 
37
41
  export interface MockScenarioCatalog {
38
- version: 1;
42
+ version: 2;
39
43
  runEvidence: {
40
44
  scope: string;
41
45
  runId: string;
@@ -52,6 +56,7 @@ export interface MockScenarioCatalog {
52
56
  existingPaths: number;
53
57
  excludedPaths: number;
54
58
  sourceExclusions: Array<{ path: string; reason: string }>;
59
+ omissionCheck: { requiredPaths: string[]; missingPaths: string[] };
55
60
  candidates: MockScenarioCandidate[];
56
61
  };
57
62
  discovery: { trackedRoot: string; candidateRoots: string[]; limits: string };
@@ -86,7 +91,7 @@ function uniqueIds(rows: unknown[], path: string): Set<string> {
86
91
 
87
92
  /** Validate the checked-in index before CLI output or scenario metadata is consumed. */
88
93
  export function parseMockScenarioCatalog(value: unknown): MockScenarioCatalog {
89
- if (!isRecord(value) || value.version !== 1) throw new Error('mock scenario catalog must declare version: 1');
94
+ if (!isRecord(value) || value.version !== 2) throw new Error('mock scenario catalog must declare version: 2');
90
95
  if (!Array.isArray(value.devices) || !Array.isArray(value.scenarios)) throw new Error('mock scenario catalog requires devices and scenarios arrays');
91
96
  const deviceIds = uniqueIds(value.devices, 'devices');
92
97
  uniqueIds(value.scenarios, 'scenarios');
@@ -101,6 +106,10 @@ export function parseMockScenarioCatalog(value: unknown): MockScenarioCatalog {
101
106
  target: requireString(row.target, `devices[${index}].target`),
102
107
  inputs: requireStringArray(row.inputs, `devices[${index}].inputs`),
103
108
  observations: requireStringArray(row.observations, `devices[${index}].observations`),
109
+ entryCommands: requireStringArray(row.entryCommands, `devices[${index}].entryCommands`),
110
+ logsRecorded: parseLogsRecorded(row.logsRecorded, `devices[${index}].logsRecorded`),
111
+ eventNames: requireStringArray(row.eventNames, `devices[${index}].eventNames`, true),
112
+ recentUse: parseRecentUse(row.recentUse, `devices[${index}].recentUse`),
104
113
  };
105
114
  });
106
115
  const scenarios = value.scenarios.map((row, index): MockScenarioEntry => {
@@ -195,6 +204,15 @@ export function parseMockScenarioCatalog(value: unknown): MockScenarioCatalog {
195
204
  ...(excludeReason ? { excludeReason } : {}),
196
205
  };
197
206
  });
207
+ const omissionCheck = value.candidateAudit.omissionCheck;
208
+ if (!isRecord(omissionCheck)) throw new Error('candidateAudit.omissionCheck is required');
209
+ const requiredPaths = requireStringArray(omissionCheck.requiredPaths, 'candidateAudit.omissionCheck.requiredPaths');
210
+ const missingPaths = requireStringArray(omissionCheck.missingPaths, 'candidateAudit.omissionCheck.missingPaths', true);
211
+ const indexedCandidatePaths = new Set([...candidates, ...sourceExclusions].map((row) => row.path));
212
+ for (const path of requiredPaths) {
213
+ if (!indexedCandidatePaths.has(path)) throw new Error(`candidateAudit.omissionCheck path is not accounted for: ${path}`);
214
+ }
215
+ if (missingPaths.some((path) => !requiredPaths.includes(path))) throw new Error('candidateAudit.omissionCheck.missingPaths must be required paths');
198
216
  const candidateAudit = value.candidateAudit;
199
217
  const sourceRows = candidateAudit.sourceRows;
200
218
  const baseCommit = candidateAudit.baseCommit;
@@ -213,7 +231,7 @@ export function parseMockScenarioCatalog(value: unknown): MockScenarioCatalog {
213
231
  const event = runEvidence.event;
214
232
  const discovery = value.discovery;
215
233
  return {
216
- version: 1,
234
+ version: 2,
217
235
  devices,
218
236
  scenarios,
219
237
  candidateAudit: {
@@ -223,6 +241,7 @@ export function parseMockScenarioCatalog(value: unknown): MockScenarioCatalog {
223
241
  existingPaths: Number(existingPaths),
224
242
  excludedPaths: Number(excludedPaths),
225
243
  sourceExclusions,
244
+ omissionCheck: { requiredPaths, missingPaths },
226
245
  candidates,
227
246
  },
228
247
  runEvidence: {
@@ -272,3 +291,36 @@ export function renderMockScenarioDetails(catalog: MockScenarioCatalog, id: stri
272
291
  `ScenarioV0 실행 증거: ${catalog.runEvidence.scope} · runId → ${catalog.runEvidence.event.category}/${catalog.runEvidence.event.name} → test logs.db · ${catalog.runEvidence.artifact}`,
273
292
  ];
274
293
  }
294
+
295
+ /** Read-only device inventory; it reports stored evidence metadata and never runs a device. */
296
+ export function renderMockScenarioDevices(catalog: MockScenarioCatalog): string[] {
297
+ return [
298
+ 'Mock device registry · read-only',
299
+ ...catalog.devices.map((device) => [
300
+ `${device.id}\t${device.name}`,
301
+ `entry=${device.entryCommands.join(' ⊕ ')}`,
302
+ `logs=${device.logsRecorded}`,
303
+ `events=${device.eventNames.length ? device.eventNames.join(',') : '(none recorded)'}`,
304
+ `recent=${device.recentUse ? `${device.recentUse.observedAt} runId=${device.recentUse.runId} event=${device.recentUse.event} scenario=${device.recentUse.scenarioId} cmd=${device.recentUse.command}` : '(not recorded)'}`,
305
+ ].join('\t')),
306
+ `omission check: required=${catalog.candidateAudit.omissionCheck.requiredPaths.length} missing=${catalog.candidateAudit.omissionCheck.missingPaths.length}`,
307
+ ];
308
+ }
309
+
310
+ function parseLogsRecorded(value: unknown, path: string): MockScenarioDevice['logsRecorded'] {
311
+ const result = requireString(value, path);
312
+ if (!['yes', 'no', 'conditional', 'runner-dependent'].includes(result)) throw new Error(`${path} is unknown: ${result}`);
313
+ return result as MockScenarioDevice['logsRecorded'];
314
+ }
315
+
316
+ function parseRecentUse(value: unknown, path: string): MockScenarioDevice['recentUse'] {
317
+ if (value === null) return null;
318
+ if (!isRecord(value)) throw new Error(`${path} must be an object or null`);
319
+ return {
320
+ observedAt: requireString(value.observedAt, `${path}.observedAt`),
321
+ runId: requireString(value.runId, `${path}.runId`),
322
+ event: requireString(value.event, `${path}.event`),
323
+ scenarioId: requireString(value.scenarioId, `${path}.scenarioId`),
324
+ command: requireString(value.command, `${path}.command`),
325
+ };
326
+ }
@@ -13,7 +13,8 @@ export interface ReleaseSimRigCase {
13
13
  id: string;
14
14
  mode?: 'baseline' | 'cut-tip-moved-after-resume';
15
15
  fault?: { node: string; outcome: 'fail' | 'error' | 'timeout'; evidence?: Record<string, unknown> };
16
- expect: { status: 'done' | 'failed' | 'resume-refused'; mustVisit: string[]; mustNotVisit: string[] };
16
+ nodeOutcomes?: Record<string, { outcome: 'ok' | 'fail' | 'error'; delayMs?: number }>;
17
+ expect: { status: 'done' | 'failed' | 'resume-refused'; mustVisit: string[]; mustNotVisit: string[]; overlap?: [string, string]; refusalIncludes?: string };
17
18
  }
18
19
 
19
20
  export interface ReleaseSimRigScenario {
@@ -32,7 +33,9 @@ export interface ReleaseSimRigCaseResult {
32
33
  path: string[];
33
34
  dispatchedNodes: string[];
34
35
  unexpectedEdges: Array<{ from: string; to: string; outcome: string; expectedTo?: string }>;
35
- checks: { status: boolean; mustVisit: boolean; mustNotVisit: boolean; ledgerEvents: boolean };
36
+ checks: { status: boolean; mustVisit: boolean; mustNotVisit: boolean; overlap: boolean; ledgerEvents: boolean };
37
+ fanOuts?: GraphRunState['fanOuts'];
38
+ nodeTimings?: Record<string, { startedAtMs: number; endedAtMs: number }>;
36
39
  injectedEvidence: Record<string, unknown>;
37
40
  ledgerEvents: Array<Record<string, unknown>>;
38
41
  statePath: string;
@@ -46,6 +49,7 @@ function unexpectedEdges(path: string[], state: GraphRunState, edges: Map<string
46
49
  const from = path[index]!;
47
50
  const to = path[index + 1]!;
48
51
  const edge = edges.get(from);
52
+ if (edge?.branches && edge.join === to) continue; // The runner records a fan-out's barrier as the parent-path successor.
49
53
  const output = nodes.get(from)?.output;
50
54
  let parsed: Record<string, unknown> = {};
51
55
  if (typeof output === 'string') {
@@ -100,8 +104,10 @@ function releaseGraphShape(): { nodeIds: Set<string>; edges: Map<string, Record<
100
104
  const edges = new Map<string, Record<string, unknown>>();
101
105
  for (const raw of graph.edges) {
102
106
  const edge = record(raw, 'release edge');
103
- if (typeof edge.from !== 'string' || edge.on !== 'outcome' || !edge.map || typeof edge.map !== 'object') {
104
- throw new Error('release simulation requires outcome edges with explicit maps');
107
+ const mapped = !!edge.map && typeof edge.map === 'object';
108
+ const branched = !!edge.branches && typeof edge.branches === 'object' && typeof edge.join === 'string';
109
+ if (typeof edge.from !== 'string' || edge.on !== 'outcome' || (!mapped && !branched)) {
110
+ throw new Error('release simulation requires outcome edges with explicit maps or fan-out joins');
105
111
  }
106
112
  if (edges.has(edge.from)) throw new Error(`release graph has multiple outcome edges from ${edge.from}`);
107
113
  edges.set(edge.from, edge);
@@ -128,7 +134,7 @@ export function parseReleaseSimRigScenario(source: string): ReleaseSimRigScenari
128
134
  const ids = new Set<string>();
129
135
  const cases = rawCases.map((raw, index): ReleaseSimRigCase => {
130
136
  const row = record(raw, `scenario.cases[${index}]`);
131
- exactKeys(row, ['id', 'mode', 'fault', 'expect'], `scenario.cases[${index}]`);
137
+ exactKeys(row, ['id', 'mode', 'fault', 'nodeOutcomes', 'expect'], `scenario.cases[${index}]`);
132
138
  if (typeof row.id !== 'string' || !/^[a-z0-9][a-z0-9-]{0,63}$/.test(row.id) || ids.has(row.id)) throw new Error(`scenario.cases[${index}].id must be unique lowercase text`);
133
139
  ids.add(row.id);
134
140
  let mode: ReleaseSimRigCase['mode'];
@@ -145,14 +151,35 @@ export function parseReleaseSimRigScenario(source: string): ReleaseSimRigScenari
145
151
  fault = { node: parsed.node, outcome: parsed.outcome, ...(parsed.evidence === undefined ? {} : { evidence: record(parsed.evidence, `scenario.cases[${index}].fault.evidence`) }) };
146
152
  }
147
153
  if ((mode === undefined) === (fault === undefined)) throw new Error(`scenario.cases[${index}] requires exactly one of mode or fault`);
154
+ const nodeOutcomes: ReleaseSimRigCase['nodeOutcomes'] = {};
155
+ if (row.nodeOutcomes !== undefined) {
156
+ const rawOutcomes = record(row.nodeOutcomes, `scenario.cases[${index}].nodeOutcomes`);
157
+ for (const [node, value] of Object.entries(rawOutcomes)) {
158
+ if (!nodeIds.has(node)) throw new Error(`scenario.cases[${index}].nodeOutcomes names unknown release node ${node}`);
159
+ const injection = record(value, `scenario.cases[${index}].nodeOutcomes.${node}`);
160
+ exactKeys(injection, ['outcome', 'delayMs'], `scenario.cases[${index}].nodeOutcomes.${node}`);
161
+ if (injection.outcome !== 'ok' && injection.outcome !== 'fail' && injection.outcome !== 'error') throw new Error(`scenario.cases[${index}].nodeOutcomes.${node}.outcome is invalid`);
162
+ if (injection.delayMs !== undefined && (!Number.isSafeInteger(injection.delayMs) || (injection.delayMs as number) < 0 || (injection.delayMs as number) > 60_000)) throw new Error(`scenario.cases[${index}].nodeOutcomes.${node}.delayMs must be 0–60000`);
163
+ nodeOutcomes[node] = { outcome: injection.outcome, ...(injection.delayMs === undefined ? {} : { delayMs: injection.delayMs as number }) };
164
+ }
165
+ }
148
166
  const expected = record(row.expect, `scenario.cases[${index}].expect`);
149
- exactKeys(expected, ['status', 'mustVisit', 'mustNotVisit'], `scenario.cases[${index}].expect`);
167
+ exactKeys(expected, ['status', 'mustVisit', 'mustNotVisit', 'overlap', 'refusalIncludes'], `scenario.cases[${index}].expect`);
150
168
  if (expected.status !== 'done' && expected.status !== 'failed' && expected.status !== 'resume-refused') throw new Error(`scenario.cases[${index}].expect.status is invalid`);
151
169
  const mustVisit = stringList(expected.mustVisit, `scenario.cases[${index}].expect.mustVisit`);
152
170
  const mustNotVisit = stringList(expected.mustNotVisit, `scenario.cases[${index}].expect.mustNotVisit`);
171
+ const refusalIncludes = expected.refusalIncludes;
172
+ if (refusalIncludes !== undefined && (typeof refusalIncludes !== 'string' || !refusalIncludes.trim())) throw new Error(`scenario.cases[${index}].expect.refusalIncludes must be nonempty text`);
173
+ let overlap: [string, string] | undefined;
174
+ if (expected.overlap !== undefined) {
175
+ const pair = stringList(expected.overlap, `scenario.cases[${index}].expect.overlap`);
176
+ if (pair.length !== 2 || pair[0] === pair[1] || pair.some((id) => !nodeIds.has(id))) throw new Error(`scenario.cases[${index}].expect.overlap must name two different release nodes`);
177
+ overlap = [pair[0]!, pair[1]!];
178
+ }
153
179
  for (const id of [...mustVisit, ...mustNotVisit]) if (!nodeIds.has(id)) throw new Error(`scenario.cases[${index}] names unknown release node ${id}`);
154
180
  if (mustVisit.some((id) => mustNotVisit.includes(id))) throw new Error(`scenario.cases[${index}] visits and excludes the same node`);
155
- return { id: row.id, ...(mode ? { mode } : {}), ...(fault ? { fault } : {}), expect: { status: expected.status, mustVisit, mustNotVisit } };
181
+ return { id: row.id, ...(mode ? { mode } : {}), ...(fault ? { fault } : {}), ...(Object.keys(nodeOutcomes).length ? { nodeOutcomes } : {}),
182
+ expect: { status: expected.status, mustVisit, mustNotVisit, ...(overlap ? { overlap } : {}), ...(typeof refusalIncludes === 'string' ? { refusalIncludes } : {}) } };
156
183
  });
157
184
  return { version: 1, kind: 'release-graph', id: root.id, isolation: 'test',
158
185
  input: { version: input.version, previousVersion: input.previousVersion }, cases };
@@ -182,11 +209,18 @@ async function runCase(scenario: ReleaseSimRigScenario, item: ReleaseSimRigCase,
182
209
  const runId = `release-sim-${scenario.id}-${item.id}`;
183
210
  const ledgerEvents: Array<Record<string, unknown>> = [];
184
211
  const dispatchedNodes: string[] = [];
212
+ const nodeTimings: NonNullable<ReleaseSimRigCaseResult['nodeTimings']> = {};
185
213
  const runBash = async (command: string, options: { env?: NodeJS.ProcessEnv }) => {
186
214
  const { nodeId } = parseContext(options.env ?? {});
187
215
  if (!command.trim()) throw new Error(`empty command at simulated node ${nodeId}`);
188
216
  dispatchedNodes.push(nodeId);
189
- const result = resultForNode(nodeId, item.fault, scenario.input.version);
217
+ const startedAtMs = performance.now();
218
+ const injection = item.nodeOutcomes?.[nodeId];
219
+ const result = injection ? resultForNode(nodeId, injection.outcome === 'ok' ? undefined : {
220
+ node: nodeId, outcome: injection.outcome, evidence: {},
221
+ }, scenario.input.version) : resultForNode(nodeId, item.fault, scenario.input.version);
222
+ if (injection?.delayMs) await new Promise((resolve) => setTimeout(resolve, injection.delayMs));
223
+ nodeTimings[nodeId] = { startedAtMs, endedAtMs: performance.now() };
190
224
  return { exitCode: result.exitCode, stdout: result.stdout, stderr: result.stderr };
191
225
  };
192
226
  const capture = (event: string, data: Record<string, unknown>) => ledgerEvents.push({ event, ...data });
@@ -209,15 +243,20 @@ async function runCase(scenario: ReleaseSimRigScenario, item: ReleaseSimRigCase,
209
243
  const interrupted = listGraphRuns(root).runs.find((run) => run.runId === runId);
210
244
  const stateFile = interrupted?.statePath ?? '';
211
245
  const path = interrupted?.path ?? [];
246
+ const visited = new Set([...path, ...Object.values(interrupted?.fanOuts ?? {}).flatMap((fanout) => Object.keys(fanout.branches))]);
212
247
  recordObservedEdges(path, ledgerEvents);
213
248
  const edgeIssues = interrupted ? unexpectedEdges(path, interrupted, edges) : [];
214
- const statusOk = item.expect.status === 'resume-refused' && refusal.includes('release command source differs from the saved cut tip');
215
- const visitOk = item.expect.mustVisit.every((id) => path.includes(id));
216
- const notVisitOk = item.expect.mustNotVisit.every((id) => !path.includes(id));
249
+ const statusOk = item.expect.status === 'resume-refused' && refusal.includes(item.expect.refusalIncludes ?? 'release command source differs from the saved cut tip');
250
+ const visitOk = item.expect.mustVisit.every((id) => visited.has(id));
251
+ const notVisitOk = item.expect.mustNotVisit.every((id) => !visited.has(id));
252
+ const overlapPair = item.expect.overlap;
253
+ const overlapOk = !overlapPair || (!!nodeTimings[overlapPair[0]] && !!nodeTimings[overlapPair[1]] &&
254
+ nodeTimings[overlapPair[0]]!.startedAtMs < nodeTimings[overlapPair[1]]!.endedAtMs &&
255
+ nodeTimings[overlapPair[1]]!.startedAtMs < nodeTimings[overlapPair[0]]!.endedAtMs);
217
256
  const ledgerOk = ledgerEvents.some((row) => row.event === 'node-end')
218
257
  && ledgerEvents.filter((row) => row.event === 'edge-observed').length === Math.max(0, path.length - 1);
219
- return { id: item.id, pass: statusOk && visitOk && notVisitOk && ledgerOk && edgeIssues.length === 0, status: statusOk ? 'resume-refused' : interrupted?.status ?? 'missing',
220
- path, dispatchedNodes, unexpectedEdges: edgeIssues, checks: { status: statusOk, mustVisit: visitOk, mustNotVisit: notVisitOk, ledgerEvents: ledgerOk }, injectedEvidence: {}, ledgerEvents,
258
+ return { id: item.id, pass: statusOk && visitOk && notVisitOk && overlapOk && ledgerOk && edgeIssues.length === 0, status: statusOk ? 'resume-refused' : interrupted?.status ?? 'missing',
259
+ path, dispatchedNodes, unexpectedEdges: edgeIssues, checks: { status: statusOk, mustVisit: visitOk, mustNotVisit: notVisitOk, overlap: overlapOk, ledgerEvents: ledgerOk }, injectedEvidence: {}, ledgerEvents,
221
260
  statePath: stateFile, ...(refusal ? { refusal } : {}) };
222
261
  }
223
262
 
@@ -225,17 +264,22 @@ async function runCase(scenario: ReleaseSimRigScenario, item: ReleaseSimRigCase,
225
264
  const state = await runGraph(RELEASE_GRAPH, { runId, input: scenario.input, pinChildUniverse: true, quiet: true,
226
265
  deps: { root, runBash, log: capture } });
227
266
  const path = state.path;
267
+ const visited = new Set([...path, ...Object.values(state.fanOuts ?? {}).flatMap((fanout) => Object.keys(fanout.branches))]);
228
268
  recordObservedEdges(path, ledgerEvents);
229
269
  const edgeIssues = unexpectedEdges(path, state, edges);
230
270
  const statusOk = state.status === item.expect.status;
231
- const visitOk = item.expect.mustVisit.every((id) => path.includes(id));
232
- const notVisitOk = item.expect.mustNotVisit.every((id) => !path.includes(id));
271
+ const visitOk = item.expect.mustVisit.every((id) => visited.has(id));
272
+ const notVisitOk = item.expect.mustNotVisit.every((id) => !visited.has(id));
273
+ const overlapPair = item.expect.overlap;
274
+ const overlapOk = !overlapPair || (!!nodeTimings[overlapPair[0]] && !!nodeTimings[overlapPair[1]] &&
275
+ nodeTimings[overlapPair[0]]!.startedAtMs < nodeTimings[overlapPair[1]]!.endedAtMs &&
276
+ nodeTimings[overlapPair[1]]!.startedAtMs < nodeTimings[overlapPair[0]]!.endedAtMs);
233
277
  const ledgerOk = ledgerEvents.some((row) => row.event === 'node-start') && ledgerEvents.some((row) => row.event === 'node-end')
234
278
  && ledgerEvents.filter((row) => row.event === 'edge-observed').length === Math.max(0, path.length - 1);
235
279
  const injectedEvidence = item.fault ? item.fault.evidence ?? {} : {};
236
- return { id: item.id, pass: statusOk && visitOk && notVisitOk && ledgerOk && edgeIssues.length === 0, status: state.status, path, dispatchedNodes, unexpectedEdges: edgeIssues,
237
- checks: { status: statusOk, mustVisit: visitOk, mustNotVisit: notVisitOk, ledgerEvents: ledgerOk }, injectedEvidence,
238
- ledgerEvents, statePath: state.statePath };
280
+ return { id: item.id, pass: statusOk && visitOk && notVisitOk && overlapOk && ledgerOk && edgeIssues.length === 0, status: state.status, path, dispatchedNodes, unexpectedEdges: edgeIssues,
281
+ checks: { status: statusOk, mustVisit: visitOk, mustNotVisit: notVisitOk, overlap: overlapOk, ledgerEvents: ledgerOk }, injectedEvidence,
282
+ fanOuts: state.fanOuts, nodeTimings, ledgerEvents, statePath: state.statePath };
239
283
  }
240
284
 
241
285
  export async function runReleaseSimRigScenario(source: string): Promise<ReleaseSimRigResult> {
@@ -1,7 +1,70 @@
1
1
  import { createServer, type Server } from 'node:http';
2
+ import {
3
+ CODEX_DEVICE_TOKEN_URL,
4
+ CODEX_DEVICE_USERCODE_URL,
5
+ CODEX_OAUTH_TOKEN_URL,
6
+ } from '../oauth/codex.js';
2
7
 
3
8
  export type FakeOpenAiApiMode = 'ok' | 'unauthorized' | 'rate-limited' | 'disconnect' | 'slow';
4
9
 
10
+ export type FakeCodexDeviceOAuthMode = 'complete' | 'denied' | 'expired-code';
11
+
12
+ export interface FakeCodexDeviceOAuth {
13
+ /** Route only the production loginWithCodex fetch seam; unknown URLs fail closed. */
14
+ fetchImpl: typeof fetch;
15
+ /** Safe request facts only. Codes, verifiers and tokens are never retained. */
16
+ requests: () => Array<{ endpoint: 'device-code' | 'device-poll' | 'token'; grantType?: string }>;
17
+ }
18
+
19
+ /** Fake OpenAI device-code endpoints for the real loginWithCodex production path. */
20
+ export function createFakeCodexDeviceOAuth(mode: FakeCodexDeviceOAuthMode = 'complete'): FakeCodexDeviceOAuth {
21
+ let polls = 0;
22
+ const calls: Array<{ endpoint: 'device-code' | 'device-poll' | 'token'; grantType?: string }> = [];
23
+ const fetchImpl = (async (input: RequestInfo | URL, init?: RequestInit) => {
24
+ const url = String(input);
25
+ if (url === CODEX_DEVICE_USERCODE_URL) {
26
+ calls.push({ endpoint: 'device-code' });
27
+ return new Response(JSON.stringify({
28
+ device_auth_id: 'fake-device-auth-id', user_code: 'FAKE-USER-CODE', interval: 0,
29
+ verification_uri: 'https://auth.openai.com/codex/device',
30
+ }), { status: 200, headers: { 'content-type': 'application/json' } });
31
+ }
32
+ if (url === CODEX_DEVICE_TOKEN_URL) {
33
+ calls.push({ endpoint: 'device-poll' });
34
+ polls++;
35
+ if (mode === 'denied') {
36
+ return new Response(JSON.stringify({ error: 'access_denied' }), { status: 400 });
37
+ }
38
+ if (mode === 'expired-code') {
39
+ return new Response(JSON.stringify({ error: 'expired_token' }), { status: 400 });
40
+ }
41
+ if (polls === 1) return new Response(JSON.stringify({ error: 'authorization_pending' }), { status: 403 });
42
+ return new Response(JSON.stringify({ authorization_code: 'fake-authorization-code', code_verifier: 'fake-code-verifier' }), { status: 200 });
43
+ }
44
+ if (url === CODEX_OAUTH_TOKEN_URL) {
45
+ const body = new URLSearchParams(typeof init?.body === 'string' ? init.body : '');
46
+ const grantType = body.get('grant_type') ?? undefined;
47
+ calls.push({ endpoint: 'token', ...(grantType ? { grantType } : {}) });
48
+ if (grantType === 'authorization_code') {
49
+ if (body.get('code') !== 'fake-authorization-code' || body.get('code_verifier') !== 'fake-code-verifier') {
50
+ return new Response(JSON.stringify({ error: 'invalid_grant' }), { status: 400 });
51
+ }
52
+ return new Response(JSON.stringify({
53
+ access_token: 'fake-initial-access-token', refresh_token: 'fake-initial-refresh-token', expires_in: 0,
54
+ }), { status: 200, headers: { 'content-type': 'application/json' } });
55
+ }
56
+ if (grantType === 'refresh_token' && body.get('refresh_token') === 'fake-initial-refresh-token') {
57
+ return new Response(JSON.stringify({
58
+ access_token: 'fake-refreshed-access-token', refresh_token: 'fake-rotated-refresh-token', expires_in: 3600,
59
+ }), { status: 200, headers: { 'content-type': 'application/json' } });
60
+ }
61
+ return new Response(JSON.stringify({ error: 'unsupported_grant_type' }), { status: 400 });
62
+ }
63
+ throw new Error('fake Codex OAuth blocked an unexpected endpoint');
64
+ }) as typeof fetch;
65
+ return { fetchImpl, requests: () => calls.map(call => ({ ...call })) };
66
+ }
67
+
5
68
  /** Local OpenAI-compatible /v1/models endpoint for testing the production key verifier. */
6
69
  export async function startFakeOpenAiCompatibleApi(mode: FakeOpenAiApiMode, delayMs = 350): Promise<{
7
70
  baseUrl: string;
@@ -1 +1 @@
1
- {"commit":"3d63e99aabe026e15c2e342227d354458d2ada73"}
1
+ {"commit":"0580f24a8d55c5fd3689092912fda3ebbe826034"}
@@ -1 +0,0 @@
1
- "use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[114],{20114:(t,e,n)=>{n.d(e,{Z:()=>$});var r=n(33236),l=n(77515),u=n(55824).hp;function o(t){let e=[];for(let n=0;n<t.length-1;n++)e.push({a:t[n],b:t[n+1]});return e}function i(t,e,n,r){let l=e.x-t.x,u=e.y-t.y,o=r.x-n.x,i=r.y-n.y,a=l*i-u*o;if(0===a)return null;let s=n.x-t.x,f=n.y-t.y,p=(s*i-f*o)/a,h=(s*u-f*l)/a;return p<=1e-6||p>=.999999||h<=1e-6||h>=.999999?null:{point:{x:t.x+p*l,y:t.y+p*u},tA:p,tB:h}}function a(t){return Math.abs(t.b.x-t.a.x)>=Math.abs(t.b.y-t.a.y)}function s(t,e,n){if("rounded"!==t.curve)return!1;let r=t.points,l=r[e],u=r[e+1];if(!l||!u)return!1;let o=Math.hypot(u.x-l.x,u.y-l.y),i=n*o,a=e>0?g(r[e-1],l,u,5):null;if(a&&i<a.cutLen)return!0;let s=e+2<r.length?g(l,u,r[e+2],5):null;return null!==s&&o-i<s.cutLen}function f(t){let e=[];for(let n=0;n<t.length;n++){let r=t[n],l=o(r.points);for(let u=n+1;u<t.length;u++){let n=t[u],f=o(n.points);for(let[t,u]of l.entries())for(let[l,o]of f.entries()){let f=i(u.a,u.b,o.a,o.b);if(!f||s(r,t,f.tA)||s(n,l,f.tB))continue;let p=a(u);p!==a(o)&&p?e.push({jumpEdgeId:r.id,otherEdgeId:n.id,segIndex:t,t:f.tA,point:f.point}):e.push({jumpEdgeId:n.id,otherEdgeId:r.id,segIndex:l,t:f.tB,point:f.point})}}}return e}function p(t){let e=Math.round(1e3*t)/1e3;return Number.isInteger(e),`${e}`}function h(t){return`${p(t.x)},${p(t.y)}`}function d(t){let e=t.b.x-t.a.x,n=t.b.y-t.a.y;return Math.abs(e)>=Math.abs(n)?+(e>=0):+(n>=0)}function y(t,e){if(t.length<2)return t.map(t=>({...t}));let n=t.map(t=>({...t})),l=e.arrowTypeStart&&r.hq[e.arrowTypeStart];if(l){let e=t[0],r=t[1],u=Math.atan2(r.y-e.y,r.x-e.x);n[0].x=e.x+l*Math.cos(u),n[0].y=e.y+l*Math.sin(u)}let u=e.arrowTypeEnd&&r.hq[e.arrowTypeEnd];if(u){let e=t.length,r=t[e-2],l=t[e-1],o=Math.atan2(l.y-r.y,l.x-r.x);n[e-1].x=l.x-u*Math.cos(o),n[e-1].y=l.y-u*Math.sin(o)}return n}function c(t,e,n,r,l){let u=t.point.x,o=t.point.y,i={x:u-e*t.r,y:o-n*t.r},a={x:u+e*t.r,y:o+n*t.r},s=[`L${h(i)}`];return"arc"===l?s.push(`A${p(t.r)},${p(t.r)} 0 0 ${r} ${h(a)}`):s.push(`M${h(a)}`),s}function g(t,e,n,r){let l=e.x-t.x,u=e.y-t.y,o=n.x-e.x,i=n.y-e.y,a=Math.hypot(l,u),s=Math.hypot(o,i);if(a<1e-5||s<1e-5)return null;let f=l/a,p=u/a,h=o/s,d=i/s,y=Math.acos(Math.max(-1,Math.min(1,f*h+p*d)));if(y<1e-5||1e-5>Math.abs(Math.PI-y))return null;let c=Math.min(r/Math.sin(y/2),a/2,s/2);return{startX:e.x-f*c,startY:e.y-p*c,endX:e.x+h*c,endY:e.y+d*c,ctrlX:e.x,ctrlY:e.y,cutLen:c}}function x(t,e,n){let r=t.points;if(r.length<2)return"";let l=y(r,t),u="rounded"===t.curve,i=o(l),a=new Map;for(let t of e){let e=i[t.segIndex];if(!e)continue;let r=Math.hypot(e.b.x-e.a.x,e.b.y-e.a.y),l=a.get(t.segIndex)??[];l.push({t:t.t,point:t.point,d:t.t*r,r:n.jumpRadius}),a.set(t.segIndex,l)}let s=[`M${h(l[0])}`];for(let t=0;t<i.length;t++){let e=i[t],r=Math.hypot(e.b.x-e.a.x,e.b.y-e.a.y),o=0===r?0:(e.b.x-e.a.x)/r,f=0===r?0:(e.b.y-e.a.y)/r,y=d(e),x=0;if(u&&t>0){let e=g(l[t-1],l[t],l[t+1]??l[t],5);e&&(x=e.cutLen)}let b=r,M=null;u&&t<i.length-1&&(M=g(l[t],l[t+1],l[t+2]??l[t+1],5))&&(b=r-M.cutLen);let m=.6*n.jumpRadius,$=[...a.get(t)??[]].sort((t,e)=>t.t-e.t).filter(t=>{let e=Math.min(t.d-x,b-t.d)-2;return t.r=Math.min(t.r,e),t.r>=m});for(let t=0;t<$.length-1;t++){let e=$[t+1].d-$[t].d;if($[t].r+$[t+1].r>e){let n=e/2;$[t].r=Math.min($[t].r,n),$[t+1].r=Math.min($[t+1].r,n)}}for(let t of $)t.r<m||s.push(...c(t,o,f,y,n.jumpStyle));u&&M?(s.push(`L${p(M.startX)},${p(M.startY)}`),s.push(`Q${p(M.ctrlX)},${p(M.ctrlY)} ${p(M.endX)},${p(M.endY)}`)):s.push(`L${h(e.b)}`)}return s.join(" ")}function b(t){return/^[\d\s+,.LMelm-]*$/.test(t)}function M(t){return!t||"linear"===t||"rounded"===t||"step"===t||"stepBefore"===t||"stepAfter"===t}function m(t){if(!t)return null;try{let e="function"==typeof atob?atob(t):u.from(t,"base64").toString(),n=JSON.parse(e);if(!Array.isArray(n))return null;let r=[];for(let t of n)t&&"number"==typeof t.x&&"number"==typeof t.y&&r.push({x:t.x,y:t.y});return r.length>=2?r:null}catch{return null}}function $(t,e,n){if(!n.enabled)return;let r=t.node();if(!r)return;let l=new Map;for(let t of e)l.set(t.id,t);let u=new Map;for(let t of r.querySelectorAll("path[data-id]")){let e=t.getAttribute("data-id");null===e||u.has(e)||u.set(e,t)}let o=[];for(let t of e){let e=u.get(t.id);if(!e)continue;let n=m(e.getAttribute("data-points"))??t.points;o.push({...t,points:n})}let i=f(o);if(0===i.length)return;let a=new Map;for(let t of i){let e=a.get(t.jumpEdgeId)??[];e.push(t),a.set(t.jumpEdgeId,e)}for(let t of o){let e=a.get(t.id);if(!e||0===e.length)continue;let r=l.get(t.id),o=r?.curve;if(void 0!==o&&!M(o))continue;let i=u.get(t.id);if(!i||void 0===o&&!b(i.getAttribute("d")??""))continue;let s=i.getAttribute("style")??"",f=/stroke-dasharray\s*:\s*0\s+([\d.]+)\s+[\d.]+\s+([\d.]+)/.exec(s),p=f?Number.parseFloat(f[1]):null,h=f?Number.parseFloat(f[2]):null,d=x(t,e,n);if(i.setAttribute("d",d),null!==p&&null!==h&&"function"==typeof i.getTotalLength){let t=Math.max(0,i.getTotalLength()-p-h),e=`0 ${p} ${t} ${h}`,n=s.replace(/stroke-dasharray\s*:[^;]*;?/g,`stroke-dasharray: ${e};`).replace(/;\s*;+/g,";");i.setAttribute("style",n)}}}(0,l.K)(o,"buildSegmentList"),(0,l.K)(i,"segmentIntersection"),(0,l.K)(a,"isHorizontalSeg"),(0,l.K)(s,"crossingSitsInRoundedCorner"),(0,l.K)(f,"findEdgeIntersections"),(0,l.K)(p,"fmt"),(0,l.K)(h,"pointToString"),(0,l.K)(d,"getArcSweepFlag"),(0,l.K)(y,"applyMarkerOffsets"),(0,l.K)(c,"emitJump"),(0,l.K)(g,"computeRoundedCorner"),(0,l.K)(x,"rewriteEdgePath"),(0,l.K)(b,"isStraightPath"),(0,l.K)(M,"curveSupportsLineHops"),(0,l.K)(m,"decodeDataPoints"),(0,l.K)($,"applyLineJumpsToSvg")}}]);