elanous 0.2.40 → 0.2.42

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 (685) hide show
  1. package/README.md +7 -7
  2. package/apps/pwa/out/404/index.html +1 -1
  3. package/apps/pwa/out/404.html +1 -1
  4. package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → X1ucLw10Cds_h614NoEnh}/_buildManifest.js +1 -1
  5. package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/{4769.9fd582071301f382.js → 1063.2fb8a9dc55c731f2.js} +1 -1
  7. package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +36 -0
  8. package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/{470.51a72a2348306455.js → 1262.e804feb8fd1acb8c.js} +2 -2
  10. package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/{7219-15bdd9a80661af8e.js → 1455-530ca16c7e71baff.js} +1 -1
  13. package/apps/pwa/out/_next/static/chunks/{1281.d81877e35b9068f4.js → 1487.2f67b79444062da6.js} +1 -1
  14. package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +32 -0
  16. package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +286 -0
  22. package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +23 -0
  23. package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +34 -0
  26. package/apps/pwa/out/_next/static/chunks/{1350.59f40e39e02d91b1.js → 2456.b6de0e1c05f28843.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/2690.0521c738b7749931.js +115 -0
  32. package/apps/pwa/out/_next/static/chunks/{5436.fdf6fa8ae3e9588d.js → 2974.595d1e29d040cb6a.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/{5383.bdfa5d886e39a826.js → 3207.a756c95e9ec8c3c8.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +93 -0
  35. package/apps/pwa/out/_next/static/chunks/{2177.df8547f9d7215c4e.js → 3347.f846266b5e5f3ede.js} +3 -3
  36. package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +41 -0
  37. package/apps/pwa/out/_next/static/chunks/{9184.45afbf44fec87574.js → 3482.a9ae9d2ad6a5bd97.js} +1 -1
  38. package/apps/pwa/out/_next/static/chunks/3507.97e1977bc4d5fb0a.js +2 -0
  39. package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +24 -0
  41. package/apps/pwa/out/_next/static/chunks/{8099.1cccf31c1baa7e1c.js → 3741.9cf76acaa2ee5298.js} +1 -1
  42. package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{4864a2ca.1c1c280a7772c5e5.js → 3d0154af.5331fec737ffe8c3.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4043.6b91203436c9c86b.js +309 -0
  48. package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +77 -0
  49. package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/{3330.7443183b7e6fdbdf.js → 4276.336d76d858fcdf1b.js} +1 -1
  51. package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +148 -0
  55. package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +74 -0
  56. package/apps/pwa/out/_next/static/chunks/{3b355b3d.6f73c98bf6f9c749.js → 50061469.0326382241ef3b2d.js} +1 -1
  57. package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +149 -0
  58. package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +27 -0
  60. package/apps/pwa/out/_next/static/chunks/{8d173e38.18a2f7b4e1848bdb.js → 53c73f84.373b6160adfa89a4.js} +1 -1
  61. package/apps/pwa/out/_next/static/chunks/{1537-6bb97b5214928ea9.js → 5431-72a1dbde59400691.js} +1 -1
  62. package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +287 -0
  70. package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/{261.0d471e8aded799f3.js → 6131.348b7d6bdcd267ce.js} +3 -3
  73. package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +90 -0
  74. package/apps/pwa/out/_next/static/chunks/{9175.2de5209a5ce6f68a.js → 6377.bc7df239edbff244.js} +1 -1
  75. package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{2226.2cf61ec781827219.js → 6632.0eac1c554f8f2ef3.js} +2 -2
  78. package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +104 -0
  82. package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +94 -0
  83. package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/{b84cad00.594027ebe0531fe2.js → 73d2eb0e.4966ad55293c801a.js} +3 -3
  90. package/apps/pwa/out/_next/static/chunks/{6257.c0037b8949239f5e.js → 7411.9b4b8b747dc7b802.js} +2 -2
  91. package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +24 -0
  92. package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/{9189505a.980427ac048c8c60.js → 7a98bc80.fa935989e829f9c2.js} +1 -1
  98. package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/8138.6c10b2a356d52fca.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/{2566.beaffc3a5e1fcd2e.js → 8262.ddc03e06b733f184.js} +1 -1
  101. package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +8 -0
  103. package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +79 -0
  105. package/apps/pwa/out/_next/static/chunks/{8272-025653884f9645d2.js → 8546-6f03f8ea34dd61d9.js} +1 -1
  106. package/apps/pwa/out/_next/static/chunks/{6051-0ae955eedb10adb9.js → 8673-bab689a55f7e13b9.js} +3 -3
  107. package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/{4351.0f37a6db2b34d50b.js → 9249.976f1e69a9d80754.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9415.69e4a21c60c7d2db.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{6749.0744ce6eb08d40e9.js → 9427.96aa912ddb5801e0.js} +16 -16
  119. package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{7611.85f045bf232053ac.js → 9633.ce5bddc56784da72.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/{3746-f80a78f220bf37b5.js → 9656-374232558fd528d0.js} +1 -1
  123. package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +62 -0
  124. package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/live-run/{page-83d27757e2b8060a.js → page-0e3d7b9421b79dac.js} +1 -1
  147. package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/term/{page-139d722de1dcd6c1.js → page-bf067887b3307423.js} +1 -1
  170. package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/{409c787b.e48c5bec8ec10456.js → b450776b.3db34d8d965f82d3.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/{ca3702f8.2913182e73889fa2.js → e8543907.5b040a5f22a0b0e5.js} +7 -7
  179. package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +1 -0
  184. package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +1 -0
  185. package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
  186. package/apps/pwa/out/approvals/index.html +1 -1
  187. package/apps/pwa/out/approvals/index.txt +22 -22
  188. package/apps/pwa/out/autopilot/index.html +1 -1
  189. package/apps/pwa/out/autopilot/index.txt +22 -22
  190. package/apps/pwa/out/board/index.html +1 -1
  191. package/apps/pwa/out/board/index.txt +22 -22
  192. package/apps/pwa/out/botlab/index.html +1 -1
  193. package/apps/pwa/out/botlab/index.txt +21 -21
  194. package/apps/pwa/out/bots/index.html +1 -1
  195. package/apps/pwa/out/bots/index.txt +21 -21
  196. package/apps/pwa/out/ceo/index.html +1 -1
  197. package/apps/pwa/out/ceo/index.txt +22 -22
  198. package/apps/pwa/out/chat/index.html +1 -1
  199. package/apps/pwa/out/chat/index.txt +21 -21
  200. package/apps/pwa/out/consult/index.html +1 -1
  201. package/apps/pwa/out/consult/index.txt +22 -22
  202. package/apps/pwa/out/control/index.html +1 -1
  203. package/apps/pwa/out/control/index.txt +22 -22
  204. package/apps/pwa/out/decisions/index.html +1 -1
  205. package/apps/pwa/out/decisions/index.txt +21 -21
  206. package/apps/pwa/out/design-check/index.html +1 -1
  207. package/apps/pwa/out/design-check/index.txt +22 -22
  208. package/apps/pwa/out/editor/index.html +1 -1
  209. package/apps/pwa/out/editor/index.txt +23 -24
  210. package/apps/pwa/out/exec/index.html +1 -1
  211. package/apps/pwa/out/exec/index.txt +22 -22
  212. package/apps/pwa/out/field/index.html +1 -1
  213. package/apps/pwa/out/field/index.txt +22 -22
  214. package/apps/pwa/out/healthz +1 -1
  215. package/apps/pwa/out/index.html +1 -1
  216. package/apps/pwa/out/index.txt +21 -21
  217. package/apps/pwa/out/inside/index.html +1 -1
  218. package/apps/pwa/out/inside/index.txt +22 -22
  219. package/apps/pwa/out/intake/index.html +1 -1
  220. package/apps/pwa/out/intake/index.txt +22 -22
  221. package/apps/pwa/out/live/index.html +1 -1
  222. package/apps/pwa/out/live/index.txt +23 -24
  223. package/apps/pwa/out/live-run/index.html +1 -1
  224. package/apps/pwa/out/live-run/index.txt +23 -24
  225. package/apps/pwa/out/loops/index.html +1 -1
  226. package/apps/pwa/out/loops/index.txt +21 -21
  227. package/apps/pwa/out/market/index.html +1 -1
  228. package/apps/pwa/out/market/index.txt +21 -21
  229. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  230. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  231. package/apps/pwa/out/morning/index.html +1 -1
  232. package/apps/pwa/out/morning/index.txt +22 -22
  233. package/apps/pwa/out/observatory/index.html +1 -1
  234. package/apps/pwa/out/observatory/index.txt +22 -22
  235. package/apps/pwa/out/ops/checklist/index.html +1 -1
  236. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  237. package/apps/pwa/out/ops/release/index.html +1 -1
  238. package/apps/pwa/out/ops/release/index.txt +21 -21
  239. package/apps/pwa/out/ops/seats/index.html +1 -1
  240. package/apps/pwa/out/ops/seats/index.txt +21 -21
  241. package/apps/pwa/out/outputs/index.html +1 -1
  242. package/apps/pwa/out/outputs/index.txt +21 -21
  243. package/apps/pwa/out/reflection/index.html +1 -1
  244. package/apps/pwa/out/reflection/index.txt +22 -22
  245. package/apps/pwa/out/scheduler/index.html +1 -1
  246. package/apps/pwa/out/scheduler/index.txt +22 -22
  247. package/apps/pwa/out/sessions/index.html +1 -1
  248. package/apps/pwa/out/sessions/index.txt +21 -21
  249. package/apps/pwa/out/settings/devices/index.html +1 -1
  250. package/apps/pwa/out/settings/devices/index.txt +22 -22
  251. package/apps/pwa/out/settings/index.html +1 -1
  252. package/apps/pwa/out/settings/index.txt +22 -22
  253. package/apps/pwa/out/setup/done/index.html +1 -1
  254. package/apps/pwa/out/setup/done/index.txt +22 -22
  255. package/apps/pwa/out/setup/index.html +1 -1
  256. package/apps/pwa/out/setup/index.txt +22 -22
  257. package/apps/pwa/out/share/index.html +1 -1
  258. package/apps/pwa/out/share/index.txt +22 -22
  259. package/apps/pwa/out/showroom/index.html +1 -1
  260. package/apps/pwa/out/showroom/index.txt +21 -21
  261. package/apps/pwa/out/tasks/index.html +1 -1
  262. package/apps/pwa/out/tasks/index.txt +22 -22
  263. package/apps/pwa/out/term/index.html +1 -1
  264. package/apps/pwa/out/term/index.txt +22 -22
  265. package/apps/pwa/out/today/index.html +1 -1
  266. package/apps/pwa/out/today/index.txt +22 -22
  267. package/apps/pwa/out/trace/index.html +1 -1
  268. package/apps/pwa/out/trace/index.txt +22 -22
  269. package/apps/pwa/out/vault/index.html +1 -1
  270. package/apps/pwa/out/vault/index.txt +22 -22
  271. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  272. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  273. package/apps/pwa/out/workflows/index.html +1 -1
  274. package/apps/pwa/out/workflows/index.txt +22 -22
  275. package/apps/pwa/out/workspace/index.html +1 -1
  276. package/apps/pwa/out/workspace/index.txt +22 -22
  277. package/apps/pwa/out/worktrees/index.html +1 -1
  278. package/apps/pwa/out/worktrees/index.txt +22 -22
  279. package/bin/elanous.mjs +6 -1
  280. package/catalog/models/openai/gpt-6.1-sol.yaml +16 -0
  281. package/catalog/models/openai/gpt-6.1-terra.yaml +16 -0
  282. package/docs/goal-context/04-mock-scenarios.md +13 -0
  283. package/graphs/catalog/catalog.yaml +1 -1
  284. package/graphs/demo/persona-teacher/lesson-pack.yaml +16 -0
  285. package/graphs/demo/persona-teacher/recipes.yaml +17 -0
  286. package/graphs/demo/persona-teacher/weekly-lesson.yaml +36 -0
  287. package/graphs/heal/heal-loop.yaml +1 -0
  288. package/graphs/overlays/stop-heal-ladder.yaml +136 -2
  289. package/graphs/release/release-loop.yaml +3 -1
  290. package/graphs/units/gate/gate.yaml +20 -0
  291. package/graphs/units/git/git.yaml +26 -0
  292. package/graphs/units/implement/implement.yaml +19 -0
  293. package/graphs/units/landing/landing.yaml +18 -0
  294. package/graphs/units/review/review.yaml +20 -0
  295. package/graphs/units/verbs/recipes.yaml +13 -10
  296. package/graphs/units/verbs/research.yaml +20 -0
  297. package/graphs/work/research-report.yaml +21 -3
  298. package/package.json +1 -1
  299. package/scripts/disk-steward.ts +46 -0
  300. package/scripts/fleet/node-setup.sh +50 -0
  301. package/scripts/graph-units/verbs/research.ts +55 -0
  302. package/scripts/heal/run-role.ts +99 -5
  303. package/scripts/land-global-checks.ts +6 -1
  304. package/scripts/lib/decompose-ab.ts +1 -0
  305. package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
  306. package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
  307. package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
  308. package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
  309. package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
  310. package/scripts/lib/tui-regress-checks.ts +33 -13
  311. package/scripts/llm-cost-ledger.ts +179 -8
  312. package/scripts/measure-nl-routing-corpus.ts +10 -2
  313. package/scripts/persona-teacher/weekly-lesson-node.ts +172 -0
  314. package/scripts/public-copy-lint.ts +163 -19
  315. package/scripts/ratchets/train-side-invariants.sh +0 -1
  316. package/scripts/release-loop/gate-autoheal.ts +117 -0
  317. package/scripts/release-loop/gate-baseline-receipt.ts +55 -10
  318. package/scripts/release-loop/gate-diff.ts +22 -3
  319. package/scripts/release-loop/gate-image-pin.ts +81 -0
  320. package/scripts/release-loop/gate-node-sim.ts +207 -0
  321. package/scripts/release-loop/gate-node.ts +489 -62
  322. package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
  323. package/scripts/release-loop/gate-radius-live.ts +97 -13
  324. package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
  325. package/scripts/release-loop/gate-shard-load-flaky.ts +256 -0
  326. package/scripts/release-loop/gate-train-receipts.ts +122 -0
  327. package/scripts/release-loop/gate-triage-node.ts +70 -10
  328. package/scripts/release-loop/resume-release.ts +330 -23
  329. package/scripts/release-loop/traffic-node.ts +6 -3
  330. package/scripts/release-loop/unattended-release.ts +4 -2
  331. package/scripts/shadow-authoring-probe.ts +20 -0
  332. package/scripts/ux-sim.ts +37 -3
  333. package/scripts/warm-pool-provider-config.ts +263 -0
  334. package/skills/omni-crawl/SKILL.md +5 -2
  335. package/skills/omni-crawl/scripts/main.ts +84 -23
  336. package/src/acp/core-turn-bridge.ts +99 -4
  337. package/src/agent/registry.ts +2 -0
  338. package/src/agent/task-notification.ts +25 -5
  339. package/src/agent/types.ts +6 -0
  340. package/src/agent-mission/mission-cli.ts +24 -0
  341. package/src/agent-mission/mission-out.ts +595 -0
  342. package/src/agent-mission/tool-install.ts +88 -2
  343. package/src/agent-substrate/context-strategy.ts +4 -4
  344. package/src/agent-substrate/self-review-cli.ts +267 -40
  345. package/src/auto-research/research-turn.ts +133 -51
  346. package/src/autopilot/discovery/wiki-claim-proposer.ts +22 -1
  347. package/src/autopilot/pr-manager.ts +38 -7
  348. package/src/autopilot/pty-control-loop.ts +2 -0
  349. package/src/boot/daemon-tools/self-implement.ts +46 -9
  350. package/src/budget/shadow-arms.ts +52 -0
  351. package/src/capture/tui-self-report.ts +22 -6
  352. package/src/chat/index.ts +1 -1
  353. package/src/chat/pickers/state.ts +7 -1
  354. package/src/cli/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
  355. package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
  356. package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
  357. package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
  358. package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
  359. package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
  360. package/src/cli/log-event-names.ts +5 -0
  361. package/src/cli/mcp-login.ts +8 -18
  362. package/src/cli/msg-cli.ts +57 -1
  363. package/src/cli/pr-land-heavy-remote.ts +47 -9
  364. package/src/cli/pr-land-overlap-evidence.ts +100 -1
  365. package/src/cli/pr-land-pod-shadow-job.ts +60 -0
  366. package/src/cli/release-checklist-read-cli.ts +20 -10
  367. package/src/cli/release-cli.ts +27 -1
  368. package/src/cli/research-cli.ts +4 -5
  369. package/src/cli/sim-cli.ts +7 -1
  370. package/src/cli/tasks-cli.ts +12 -4
  371. package/src/codex/models.ts +30 -15
  372. package/src/compact/auto.ts +8 -1
  373. package/src/control-plane/ledger.ts +52 -2
  374. package/src/control-plane/server.ts +16 -2
  375. package/src/core-turn/run-core-turn.ts +313 -89
  376. package/src/core-turn/run-goal-loop.ts +106 -2
  377. package/src/core-turn/types.ts +2 -0
  378. package/src/dashboard/acp-boot.ts +72 -3
  379. package/src/dashboard/classic-sidetab-mission-job.ts +58 -0
  380. package/src/dashboard/classic-sidetab-mission.ts +185 -0
  381. package/src/dashboard/index.ts +155 -15
  382. package/src/dashboard/input/agent-wake.ts +23 -1
  383. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +9 -0
  384. package/src/dashboard/mission-cli-consumer.ts +153 -0
  385. package/src/dashboard/seat-boot-preamble.ts +171 -1
  386. package/src/dashboard/side-basic-runtime.ts +54 -1
  387. package/src/dashboard/sidetab-runtime.ts +90 -1
  388. package/src/dashboard/skill-catalog-preamble.ts +101 -0
  389. package/src/dashboard/skill-detection-runtime.ts +55 -15
  390. package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
  391. package/src/dashboard/turn-preamble.ts +65 -16
  392. package/src/dashboard/turn-prompt-runtime.ts +4 -2
  393. package/src/disk-steward/judge.ts +73 -0
  394. package/src/disk-steward/ledger.ts +122 -0
  395. package/src/disk-steward/steward.ts +373 -0
  396. package/src/domains/guardian-tick.ts +191 -2
  397. package/src/graph-runner/graph-cli.ts +44 -7
  398. package/src/graph-runner/graph-tick.ts +10 -2
  399. package/src/graph-runner/in-process-registry.ts +37 -0
  400. package/src/graph-runner/runner.ts +34 -4
  401. package/src/grok/agent-search.ts +14 -4
  402. package/src/grok/credential.ts +28 -11
  403. package/src/grounding/ref-index.ts +19 -0
  404. package/src/grounding/sources-cli.ts +9 -1
  405. package/src/harness/harness-cli-command.ts +267 -14
  406. package/src/harness/harness-incidents.ts +312 -7
  407. package/src/harness/harness-pod-dispatch.ts +81 -15
  408. package/src/harness/harness-space.ts +15 -1
  409. package/src/harness/harness-stop.ts +155 -11
  410. package/src/harness/progress-worker-entry.ts +59 -0
  411. package/src/harness/progress-worker-runtime.ts +11 -0
  412. package/src/index.ts +52 -7
  413. package/src/instance/dev-project.ts +25 -0
  414. package/src/instance/spawn-elanous.ts +6 -4
  415. package/src/intelligence-map/model-alias.ts +6 -5
  416. package/src/intelligence-map/model-catalog.ts +59 -2
  417. package/src/llm/model-defaults.ts +4 -4
  418. package/src/llm.ts +208 -19
  419. package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
  420. package/src/loops/orchestrator/tick.ts +61 -0
  421. package/src/maturity/feature-maturity.ts +1 -1
  422. package/src/mcp/mcp-oauth.ts +3 -1
  423. package/src/model-tier/llm-tier-map.ts +9 -9
  424. package/src/model-tier/turn-tier.ts +1 -1
  425. package/src/msg/msg-mirror-github.ts +80 -0
  426. package/src/msg/msg-mirror-policy.ts +61 -0
  427. package/src/msg/msg-mirror-runner.ts +219 -0
  428. package/src/msg/msg-mirror-state.ts +33 -0
  429. package/src/msg/msg-store.ts +11 -0
  430. package/src/native-tool-catalog.ts +2 -2
  431. package/src/nexus/api/harness-traversal.ts +11 -0
  432. package/src/output-truncation.ts +41 -12
  433. package/src/pr-tool/census.ts +3 -2
  434. package/src/project/project-store.ts +48 -1
  435. package/src/pty-shell/tui-run-state.ts +188 -2
  436. package/src/release-loop/checklist-target-path-hint.ts +13 -0
  437. package/src/release-loop/checklist.ts +9 -1
  438. package/src/release-loop/gate-host-reservation.ts +144 -0
  439. package/src/release-loop/release-schedule.ts +90 -1
  440. package/src/repl/index.ts +43 -2
  441. package/src/research/axis-fanout.ts +121 -16
  442. package/src/research/bloom-exemplars.ts +137 -0
  443. package/src/research/gap-followup.ts +13 -1
  444. package/src/research/plugin-discovery.ts +36 -14
  445. package/src/research-bridge/invoke.ts +22 -5
  446. package/src/research-bridge/types.ts +2 -0
  447. package/src/self-dev/ask-launch-flow.ts +39 -25
  448. package/src/self-dev/decompose.ts +119 -5
  449. package/src/self-dev/dev-cli.ts +17 -17
  450. package/src/self-dev/graph-front-nodes.ts +23 -0
  451. package/src/self-dev/launch-preflight-text.ts +5 -6
  452. package/src/self-dev/launch-preflight.ts +9 -4
  453. package/src/self-dev/orchestrate.ts +27 -2
  454. package/src/self-dev/review-provider-fallback.ts +9 -2
  455. package/src/self-dev/run-supervisor.ts +226 -6
  456. package/src/self-dev/run-types.ts +7 -0
  457. package/src/self-implement/doctor-visit.ts +88 -0
  458. package/src/self-implement/gate-artifacts.ts +13 -0
  459. package/src/self-implement/gate-cli.ts +54 -24
  460. package/src/self-implement/gate-remote.ts +23 -5
  461. package/src/self-implement/goal-author-clarification.ts +31 -12
  462. package/src/self-implement/goal-author.ts +403 -8
  463. package/src/self-implement/graph-overlay-yaml.ts +7 -0
  464. package/src/self-implement/graph-stage-units.ts +172 -0
  465. package/src/self-implement/graph-templates.ts +162 -1
  466. package/src/self-implement/graph-variant.ts +37 -4
  467. package/src/self-implement/headless-elanous-driver.ts +31 -2
  468. package/src/self-implement/heal-intake.ts +112 -4
  469. package/src/self-implement/heal-triage.ts +20 -0
  470. package/src/self-implement/host-regate.ts +31 -8
  471. package/src/self-implement/knowhow-pack.ts +38 -0
  472. package/src/self-implement/merge-train.ts +5 -0
  473. package/src/self-implement/orchestrator.ts +359 -30
  474. package/src/self-implement/regate-detail.ts +38 -1
  475. package/src/self-implement/rework-child-provider.ts +25 -0
  476. package/src/self-implement/run-chart.ts +119 -0
  477. package/src/self-implement/run-ledger.ts +176 -17
  478. package/src/self-implement/run-stop.ts +208 -5
  479. package/src/self-implement/running-runs.ts +35 -12
  480. package/src/self-implement/self-implement-cli.ts +36 -4
  481. package/src/self-implement/stop-autoheal-operational.ts +43 -0
  482. package/src/self-implement/stop-autoheal.ts +28 -6
  483. package/src/session/chat.ts +69 -58
  484. package/src/session/request-size-guard.ts +123 -0
  485. package/src/session-runtime/index.ts +98 -4
  486. package/src/session-runtime/tier-flip.ts +3 -3
  487. package/src/sidetab-core/model.ts +150 -0
  488. package/src/sidetab-core/visible-agent-mission.ts +186 -0
  489. package/src/skills/name-match.ts +20 -0
  490. package/src/skills/tools/agent.ts +30 -2
  491. package/src/skills/tools/omni-search.ts +67 -5
  492. package/src/task-agent/parent-host.ts +14 -1
  493. package/src/task-agent/pod-distributor-entry.ts +3 -0
  494. package/src/task-agent/task-hand.ts +31 -1
  495. package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
  496. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +43 -0
  497. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
  498. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +29 -4
  499. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
  500. package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
  501. package/src/task-orchestrator/surfaces/pod-source-receive.ts +163 -13
  502. package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
  503. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +209 -39
  504. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
  505. package/src/task-orchestrator/surfaces/self-implement-pod.ts +280 -60
  506. package/src/task-orchestrator/surfaces/self-implement.ts +18 -0
  507. package/src/tokens.ts +35 -2
  508. package/src/tool-runtime/agent-runtime.ts +1 -0
  509. package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
  510. package/src/tool-runtime/skill-exec-runtime.ts +33 -13
  511. package/src/tool-runtime/types.ts +1 -0
  512. package/src/tui/entry.ts +24 -7
  513. package/src/tui/sidetab/attach.ts +47 -0
  514. package/src/tui/sidetab/list.ts +45 -0
  515. package/src/tui/sidetab/nl-tool.ts +2 -136
  516. package/src/tui/sidetab/peek.ts +52 -0
  517. package/src/tui-client/dashboard-session.ts +3 -0
  518. package/src/tui-client/local-chat-turn.ts +26 -13
  519. package/src/tui.ts +22 -0
  520. package/src/user-config.ts +11 -5
  521. package/src/ux-sim/fake-kubectl.ts +37 -3
  522. package/src/ux-sim/fault-needs-human-reason-repair.ts +107 -0
  523. package/src/ux-sim/fault-pod-child-result.ts +42 -0
  524. package/src/ux-sim/fault-pool-cap.ts +11 -6
  525. package/src/ux-sim/mock-scenario-catalog.json +41 -0
  526. package/src/ux-sim/mock-scenario-catalog.ts +156 -0
  527. package/src/ux-sim/release-sim-rig.ts +262 -0
  528. package/src/ux-sim/scenario.ts +116 -23
  529. package/src/ux-sim/seminar-rehearsal.ts +109 -0
  530. package/src/ux-sim/subagent-tools-device.ts +2 -2
  531. package/src/version/packed-revision.json +1 -1
  532. package/src/voice/voice-tts-singleton.ts +18 -3
  533. package/src/web-search/grok.ts +5 -9
  534. package/apps/pwa/out/_next/static/chunks/1060.014f1f01a17aec26.js +0 -115
  535. package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +0 -286
  538. package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +0 -149
  539. package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +0 -90
  541. package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +0 -104
  542. package/apps/pwa/out/_next/static/chunks/2047.8f23e210995d4548.js +0 -2
  543. package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/2066.a77257c8c350770a.js +0 -23
  545. package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/2499.02fbfd18126c10c0.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/2522.f2766b76d22c8bdf.js +0 -34
  550. package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +0 -27
  553. package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/2774-719820e3f5b2a3eb.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/2829-734fe8bf2eee7347.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +0 -24
  566. package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +0 -77
  567. package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +0 -36
  568. package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +0 -287
  571. package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +0 -74
  578. package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +0 -8
  583. package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +0 -62
  585. package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +0 -94
  589. package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +0 -32
  596. package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/6908.06008c67f6380ea9.js +0 -148
  600. package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/6cc1d1d6.9a98dd4622f1afc6.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +0 -93
  605. package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +0 -24
  609. package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/8357.1aaa713b052a78b1.js +0 -309
  616. package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/8639-92c11d069792429e.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +0 -41
  620. package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +0 -79
  625. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/app/botlab/page-ba957ff875a026a0.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/app/live/page-4edb8df90f4537ce.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/morning/page-fca2e59a81744d9e.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/workspace/page-ccde99f07aaf71f7.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/d8de0de2-dd0f4ac8e5ab1832.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +0 -1
  683. package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
  684. package/scripts/ratchets/next-tui-entry-budget.ts +0 -124
  685. /package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → X1ucLw10Cds_h614NoEnh}/_ssgManifest.js +0 -0
@@ -13,6 +13,7 @@ import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from '
13
13
  import { dirname, join } from 'node:path';
14
14
  import { homedir } from 'node:os';
15
15
  import type { ModelCatalog, ModelEntry } from './types.js';
16
+ import { resolveModelAlias } from './model-alias.js';
16
17
 
17
18
  // 2026-05-03 snapshot — added Kimi (Moonshot) / Qwen 3.6 (Alibaba) /
18
19
  // GLM 5.x (Zhipu) families. Open-weight vs cloud-only is captured by
@@ -172,16 +173,55 @@ export const BUILTIN_CATALOG: ModelCatalog = {
172
173
  inputPerMtok: 2,
173
174
  outputPerMtok: 10,
174
175
  local: false,
175
- tags: ['coding', 'reasoning', 'agentic', 'balanced', 'long-context'],
176
+ tags: ['coding', 'reasoning', 'agentic', 'balanced', 'legacy', 'long-context'],
176
177
  bestFor: ['daily-coding', 'multi-file-edit', 'autonomous-implementation', 'complex-architecture'],
177
178
  reservedOutputTokens: 12_000,
179
+ // Coarse capability tier (legacy state is recorded in tags; this schema has no `legacy` tier).
178
180
  tier: 'better',
179
181
  variantOf: 'gpt-6',
180
182
  effortAxis: 'sol',
181
183
  reasoningEffortCeiling: 'max',
182
184
  releasedAt: '2026-09-22',
183
185
  classification: { source: 'builtin', at: '2026-09-23' },
184
- notes: '대표 2026-09-23 운영 기본(medium) — 구 gpt-5.6-terra 대체. 구독·API 둘 다 확인. effort none/low/medium(기본)/high/xhigh/max · 1.05M ctx(입력 922K · 출력 128K) · 컷오프 2026-04-20. ⚠️ 272K 초과 프롬프트는 input·cache 2배 · output 1.5배로 «요청 전체»가 재과금된다.',
186
+ notes: 'Legacy GPT-6 Sol retained for explicit compatibility; GPT-6.1 Terra is the current Codex default. 1.05M context. Per OP 2026-10-28 price direction, its cached-input estimate matches GPT-6.1 Sol ($0.10/M).',
187
+ },
188
+ {
189
+ id: 'gpt-6.1-terra',
190
+ provider: 'openai-codex',
191
+ family: 'gpt-6',
192
+ contextWindow: 500_000,
193
+ inputPerMtok: 1,
194
+ outputPerMtok: 5,
195
+ local: false,
196
+ tags: ['coding', 'reasoning', 'agentic', 'balanced'],
197
+ bestFor: ['daily-coding', 'multi-file-edit', 'autonomous-implementation'],
198
+ reservedOutputTokens: 12_000,
199
+ tier: 'better',
200
+ variantOf: 'gpt-6',
201
+ effortAxis: 'terra',
202
+ reasoningEffortCeiling: 'max',
203
+ releasedAt: '2026-10-26',
204
+ classification: { source: 'builtin', at: '2026-10-28' },
205
+ notes: 'GPT-6.1 Terra · Codex CLI 0.164.0 카탈로그 실측 · 500K context · $1/$5, cached input $0.05/M. CLI 기본 effort=low; elanous 경로 기본 medium 유지.',
206
+ },
207
+ {
208
+ id: 'gpt-6.1-sol',
209
+ provider: 'openai-codex',
210
+ family: 'gpt-6',
211
+ contextWindow: 500_000,
212
+ inputPerMtok: 2,
213
+ outputPerMtok: 10,
214
+ local: false,
215
+ tags: ['coding', 'reasoning', 'agentic', 'frontier'],
216
+ bestFor: ['complex-architecture', 'long-horizon-agentic', 'deep-analysis'],
217
+ reservedOutputTokens: 16_000,
218
+ tier: 'best',
219
+ variantOf: 'gpt-6',
220
+ effortAxis: 'sol',
221
+ reasoningEffortCeiling: 'max',
222
+ releasedAt: '2026-10-26',
223
+ classification: { source: 'builtin', at: '2026-10-28' },
224
+ notes: 'GPT-6.1 Sol · Codex CLI 0.164.0 카탈로그 실측 · 500K context · $2/$10, cached input $0.10/M. CLI 기본 effort=low; elanous 경로 기본 medium 유지.',
185
225
  },
186
226
  {
187
227
  id: 'gpt-6-luna',
@@ -944,6 +984,23 @@ export function reasoningEffortCeiling(modelId: string | undefined): ReasoningEf
944
984
  return 'medium'; // local 등 미상 — 보수적
945
985
  }
946
986
 
987
+ export const CHILD_LLM_EFFORT_LADDER = ['minimal', 'low', 'medium', 'high', 'xhigh', 'max'] as const;
988
+
989
+ /** Shared explicit effort check for task hand and the dev entrypoint. */
990
+ export function childLlmEffortProblem(model: string, entered: string): string | undefined {
991
+ const effort = entered.trim().toLowerCase();
992
+ const ladder: readonly string[] = CHILD_LLM_EFFORT_LADDER;
993
+ if (!ladder.includes(effort)) {
994
+ return `--child-llm-effort 알 수 없음: ${entered} · 후보: ${CHILD_LLM_EFFORT_LADDER.join(', ')}`;
995
+ }
996
+ const ceiling = reasoningEffortCeiling(resolveModelAlias(model.trim()) ?? model.trim());
997
+ if (ceiling === 'none') return `--child-llm-effort 거부: ${model} 은 추론 노력을 «안 받는다»(ceiling=none)`;
998
+ if (ladder.indexOf(effort) > ladder.indexOf(ceiling)) {
999
+ return `--child-llm-effort 거부: ${effort} 가 ${model} 의 상한(${ceiling})을 넘는다`;
1000
+ }
1001
+ return undefined;
1002
+ }
1003
+
947
1004
  // ── Paths ──────────────────────────────────────────────────────────────
948
1005
 
949
1006
  export function getCatalogPath(home: string = homedir()): string {
@@ -49,12 +49,12 @@ export function setAutoProviderDecisionForTest(fn: (() => LLMProviderName | unde
49
49
  /** config/tier 해석이 «실패»했을 때만 타는 최후 폴백. 티어 사다리가 안 읽히는
50
50
  * 상황(부팅 초기·손상된 config)에서도 지점이 «성능 등급에 맞는» 모델을 얻게 한다. */
51
51
  const LEGACY_TIER_FALLBACK: Readonly<Record<ModelTier, string>> = {
52
- // 🩸 2026-09-23 — 이 폴백이 GPT-6 이관 뒤에도 gpt-5.6-* 였다(결정 지적 · GPT-6 에는 terra 가 없다).
52
+ // Keep the fallback aligned with the GPT-6.1 Codex ladder if config/tier lookup fails.
53
53
  // 사다리가 안 읽힐 때만 쓰이므로 codex 사다리의 «현재 값»과 같게 둔다(시험이 사다리와 대조한다).
54
54
  budget: 'gpt-6-luna',
55
- balanced: 'gpt-6-sol',
56
- better: 'gpt-6-sol',
57
- best: 'gpt-6-sol',
55
+ balanced: 'gpt-6.1-terra',
56
+ better: 'gpt-6.1-terra',
57
+ best: 'gpt-6.1-sol',
58
58
  loaded: 'gpt-6-astra',
59
59
  };
60
60
 
package/src/llm.ts CHANGED
@@ -3,6 +3,7 @@
3
3
  // Auto-routes based on model name prefix, or picks the first available provider.
4
4
 
5
5
  import { wellFormedLLMMessages } from './llm-wellformed.js';
6
+ import { truncateOutput } from './output-truncation.js';
6
7
  import { createHash, randomUUID } from 'node:crypto';
7
8
  import { testFakeLlmEnabled, testFakeLlmProvider } from './ux-sim/fake-llm.js';
8
9
  import { realpathSync } from 'node:fs';
@@ -26,6 +27,7 @@ import {
26
27
  DEFAULT_PROVIDER,
27
28
  } from './config.js';
28
29
  import { debug, redactSecrets, redactSecretText } from './debug/log.js';
30
+ import { estimateMessagesTokens } from './tokens.js';
29
31
  import { isVerifiedOpenGatewayModel } from './llm/opengateway-models.js';
30
32
  import { llmUsageCostFields } from './budget/llm-cost.js';
31
33
  import { accumulateByokUsage } from './llm/openrouter-byok-cost.js';
@@ -273,6 +275,13 @@ export interface LLMMessage {
273
275
  phase?: 'commentary' | 'partial_answer' | 'final_answer';
274
276
  /** Opaque Codex stateless reasoning items, before this assistant message. */
275
277
  codexReasoningItems?: Array<{ type: 'reasoning'; encrypted_content: string; summary: unknown[]; id?: string }>;
278
+ /** TUI-PROMPT-CACHE-PREFIX — a `system` message whose text changes between
279
+ * requests of one session (seat boot card · git snapshot · memory · self
280
+ * health · per-turn guidance). The Codex Responses serializer keeps these
281
+ * OUT of `instructions` (which must stay byte-stable for prompt-cache
282
+ * prefix reuse) and sends them as a `developer` item placed just before
283
+ * the latest user message. Other providers ignore the flag. */
284
+ cacheVolatile?: boolean;
276
285
  }
277
286
 
278
287
  /** JSONSchema-shaped tool definition sent to the provider (no handler). */
@@ -455,6 +464,9 @@ export interface LLMOpts {
455
464
  previousChars?: number;
456
465
  }) => void;
457
466
  };
467
+ /** Optional cap for text tool results accumulated into the conversation history.
468
+ * Oversized results are spilled to a local file and represented by head/tail. */
469
+ toolResultInlineLimitBytes?: number;
458
470
  /** Optional model role attached to this request's usage observation. */
459
471
  usageRole?: ModelRole;
460
472
  /** Optional per-call metering phase; absent calls keep the existing ledger shape. */
@@ -1703,6 +1715,15 @@ export interface MessagesToResponsesInputOpts {
1703
1715
  replayCodexReasoning?: boolean;
1704
1716
  acceptUserMessageImages?: boolean;
1705
1717
  onOrphanToolResult?: (callId: string) => void;
1718
+ /** TUI-PROMPT-CACHE-PREFIX — keep `instructions` stable for the prompt
1719
+ * cache prefix. When true: (a) leading `system` messages flagged
1720
+ * `cacheVolatile` are merged into ONE `developer` item inserted right
1721
+ * before the latest user text message (after the cached history), and
1722
+ * (b) `system` messages that appear after the conversation started
1723
+ * (loop self-notes, mid-turn hints) are emitted IN PLACE as `developer`
1724
+ * items instead of being folded into `instructions`. Default false keeps
1725
+ * the legacy "every system → instructions" fold. */
1726
+ stablePrefix?: boolean;
1706
1727
  }
1707
1728
 
1708
1729
  /** Exported for tests. Converts the unified LLMMessage shape into the
@@ -1743,6 +1764,11 @@ export function messagesToResponsesInput(
1743
1764
 
1744
1765
  const sys: string[] = [];
1745
1766
  const input: ResponsesInputItem[] = [];
1767
+ const stablePrefix = opts.stablePrefix === true;
1768
+ // Leading volatile system text (stablePrefix only) — spliced in before the
1769
+ // latest user text message once the whole input is assembled.
1770
+ const volatileSys: string[] = [];
1771
+ let conversationStarted = false;
1746
1772
  for (const m of messages) {
1747
1773
  // Build typed content blocks: text accumulated into one block,
1748
1774
  // images appended as separate input_image entries. The old
@@ -1869,9 +1895,20 @@ export function messagesToResponsesInput(
1869
1895
  }
1870
1896
 
1871
1897
  if (m.role === 'system') {
1898
+ if (stablePrefix && conversationStarted) {
1899
+ // Mid-conversation system note → in-place developer item. Folding it
1900
+ // into `instructions` would rewrite the cache prefix every round.
1901
+ if (textBuf) input.push({ role: 'developer', content: [{ type: 'input_text', text: textBuf }] });
1902
+ continue;
1903
+ }
1904
+ if (stablePrefix && m.cacheVolatile) {
1905
+ if (textBuf) volatileSys.push(textBuf);
1906
+ continue;
1907
+ }
1872
1908
  sys.push(textBuf);
1873
1909
  continue;
1874
1910
  }
1911
+ conversationStarted = true;
1875
1912
 
1876
1913
  // Stateless Codex requires the opaque reasoning item in its original
1877
1914
  // position before the corresponding assistant message/tool calls.
@@ -1897,6 +1934,13 @@ export function messagesToResponsesInput(
1897
1934
  }
1898
1935
  input.push(...trailingItems);
1899
1936
  }
1937
+ if (volatileSys.length > 0) {
1938
+ const developerItem: ResponsesInputItem = {
1939
+ role: 'developer',
1940
+ content: [{ type: 'input_text', text: volatileSys.join('\n\n') }],
1941
+ };
1942
+ input.splice(latestUserTextIndex(input), 0, developerItem);
1943
+ }
1900
1944
  if (input.length === 0) input.push({ role: 'user', content: [{ type: 'input_text', text: '' }] });
1901
1945
  return {
1902
1946
  instructions: sys.length ? sys.join('\n\n') : 'You are a helpful assistant.',
@@ -1904,6 +1948,17 @@ export function messagesToResponsesInput(
1904
1948
  };
1905
1949
  }
1906
1950
 
1951
+ /** Index of the latest user message carrying text/image content (not a bare
1952
+ * tool output). Volatile per-turn context goes right before it, so the
1953
+ * history before it stays a stable cached prefix. No such message → end. */
1954
+ function latestUserTextIndex(input: readonly ResponsesInputItem[]): number {
1955
+ for (let i = input.length - 1; i >= 0; i--) {
1956
+ const item = input[i]!;
1957
+ if ('role' in item && item.role === 'user') return i;
1958
+ }
1959
+ return input.length;
1960
+ }
1961
+
1907
1962
  /** store=true wave: compute the incremental tail when `current` is a
1908
1963
  * strict extension of `prev`. Returns null when the previous input
1909
1964
  * isn't usable as a baseline — caller falls back to full input + no
@@ -1956,6 +2011,35 @@ export function computePromptCacheKey(model: string, instructions: string): stri
1956
2011
  return createHash('sha256').update(`${model}::${prefix}`).digest('hex').slice(0, 32);
1957
2012
  }
1958
2013
 
2014
+ /** TUI-PROMPT-CACHE-PREFIX — per-conversation cache affinity for the Codex
2015
+ * Responses backend. Mirrors ref/codex `core/src/client.rs`
2016
+ * (`PromptCacheKey::SessionDerived` → the session id itself is the
2017
+ * `prompt_cache_key`, and the same id rides the `session-id` header —
2018
+ * `codex-api/src/requests/headers.rs`; the underscored `session_id` alias
2019
+ * was dropped upstream in #22193 because proxies reject `_` headers).
2020
+ *
2021
+ * Precedence: chat `sessionId` → harness run `ELANOUS_RUN_ID`. Neither →
2022
+ * null and the caller falls back to the legacy instructions-prefix key.
2023
+ * Ids that are long (> 64 chars — the prompt_cache_key limit) or carry
2024
+ * characters outside `[A-Za-z0-9._:-]` fold to `elanous-<sha256/32>`. */
2025
+ export function codexSessionCacheKey(
2026
+ sessionId: string | undefined,
2027
+ runId: string | undefined,
2028
+ ): { key: string; source: 'session' | 'run'; hashed: boolean } | null {
2029
+ const s = sessionId && sessionId.trim() ? sessionId : undefined;
2030
+ const r = runId && runId.trim() ? runId : undefined;
2031
+ const raw = s ?? r;
2032
+ if (!raw) return null;
2033
+ const source = s ? 'session' : 'run';
2034
+ if (raw.length <= 64 && /^[A-Za-z0-9._:-]+$/.test(raw)) return { key: raw, source, hashed: false };
2035
+ return { key: `elanous-${createHash('sha256').update(raw).digest('hex').slice(0, 32)}`, source, hashed: true };
2036
+ }
2037
+
2038
+ /** Short content hash for request-stability observation (logs only). */
2039
+ function stabilityHash(value: string): string {
2040
+ return createHash('sha256').update(value).digest('hex').slice(0, 16);
2041
+ }
2042
+
1959
2043
  /** Cycle order for the HUD pill click + `/reasoning` no-arg form. */
1960
2044
  export const REASONING_CYCLE: readonly import('./user-config.js').ReasoningLevel[] =
1961
2045
  ['off', 'low', 'medium', 'high', 'xhigh'] as const;
@@ -2236,8 +2320,12 @@ function buildCodexResponsesWireBody(
2236
2320
  previousResponseId?: string;
2237
2321
  },
2238
2322
  promptCache: boolean,
2323
+ /** Session-derived key (codexSessionCacheKey). Absent → legacy key. */
2324
+ sessionCacheKey?: string,
2239
2325
  ): Record<string, unknown> {
2240
- const cacheKey = promptCache ? computePromptCacheKey(body.model, body.instructions) : undefined;
2326
+ const cacheKey = promptCache
2327
+ ? (sessionCacheKey ?? computePromptCacheKey(body.model, body.instructions))
2328
+ : undefined;
2241
2329
  return {
2242
2330
  ...body,
2243
2331
  stream: true,
@@ -2255,8 +2343,9 @@ function buildCodexResponsesWireBody(
2255
2343
  function serializeCodexResponsesWireBody(
2256
2344
  body: Parameters<typeof buildCodexResponsesWireBody>[0],
2257
2345
  promptCache: boolean,
2346
+ sessionCacheKey?: string,
2258
2347
  ): string {
2259
- return JSON.stringify(buildCodexResponsesWireBody(body, promptCache));
2348
+ return JSON.stringify(buildCodexResponsesWireBody(body, promptCache, sessionCacheKey));
2260
2349
  }
2261
2350
 
2262
2351
  export async function* streamCodexResponsesEvents(
@@ -2316,9 +2405,14 @@ export async function* streamCodexResponsesEvents(
2316
2405
  onResponseCreated?: (id: string) => void;
2317
2406
  /** Unused configured fallbacks. Overload k times switches before retries. */
2318
2407
  remainingFallbacks?: number;
2408
+ /** TUI-PROMPT-CACHE-PREFIX — conversation id for cache affinity. When
2409
+ * set (or `ELANOUS_RUN_ID` is), `prompt_cache_key` is session-derived
2410
+ * and the `session-id` header is sent (ref/codex parity). */
2411
+ sessionId?: string;
2319
2412
  } = {},
2320
2413
  ): AsyncGenerator<LLMStreamEvent, void, unknown> {
2321
2414
  const startedAt = Date.now();
2415
+ const sessionAffinity = codexSessionCacheKey(extra.sessionId, process.env.ELANOUS_RUN_ID);
2322
2416
  // See comment in streamOpenAIEvents — we drop the raw body by
2323
2417
  // default. `/debug verbose on` restores the full body for deep
2324
2418
  // reproduction.
@@ -2336,6 +2430,16 @@ export async function* streamCodexResponsesEvents(
2336
2430
  inputChars: (() => { try { return JSON.stringify(body.input).length; } catch { return -1; } })(),
2337
2431
  toolChars: (() => { try { return JSON.stringify(body.tools ?? []).length; } catch { return -1; } })(),
2338
2432
  instructionChars: body.instructions.length,
2433
+ // TUI-PROMPT-CACHE-PREFIX — prefix stability: two requests of one
2434
+ // session must log the same instructionsHash ⊕ toolsHash ⊕ cacheKey.
2435
+ instructionsHash: stabilityHash(body.instructions),
2436
+ toolsHash: (() => { try { return stabilityHash(JSON.stringify(body.tools ?? [])); } catch { return 'unhashable'; } })(),
2437
+ toolChoice: body.tool_choice ?? null,
2438
+ promptCacheKey: extra.promptCache === false
2439
+ ? null
2440
+ : (sessionAffinity?.key ?? computePromptCacheKey(body.model, body.instructions)).slice(0, 24),
2441
+ cacheKeySource: extra.promptCache === false ? 'off' : (sessionAffinity?.source ?? 'instructions-prefix'),
2442
+ sessionHeader: sessionAffinity !== null,
2339
2443
  tools: observeRequestTools(body.tools),
2340
2444
  instructions: body.instructions.slice(0, 200),
2341
2445
  accountId: extra.accountId ? `${extra.accountId.slice(0, 8)}…` : '(none)',
@@ -2363,7 +2467,7 @@ export async function* streamCodexResponsesEvents(
2363
2467
  const promptCache = extra.promptCache !== false;
2364
2468
  // TUI-REQUEST-SIZE-COMPACT — the exact serializer is shared with the
2365
2469
  // preflight guard, so the size decision and fetch body cannot drift.
2366
- const wireBody = buildCodexResponsesWireBody(body, promptCache);
2470
+ const wireBody = buildCodexResponsesWireBody(body, promptCache, sessionAffinity?.key);
2367
2471
  const wireJson = extra.serializedWireBody ?? JSON.stringify(wireBody);
2368
2472
  debug.log('llm.request', 'request-size', {
2369
2473
  provider: 'openai-codex',
@@ -2387,6 +2491,9 @@ export async function* streamCodexResponsesEvents(
2387
2491
  // is treated as an old client → 400 "requires a newer version of
2388
2492
  // Codex". See getCodexUserAgent (oauth/codex.ts).
2389
2493
  'User-Agent': getCodexUserAgent(),
2494
+ // ChatGPT derives cache affinity from this header (ref/codex
2495
+ // client.rs `responses_session_id` → `build_session_headers`).
2496
+ ...(sessionAffinity ? { 'session-id': sessionAffinity.key } : {}),
2390
2497
  },
2391
2498
  body: wireJson,
2392
2499
  signal,
@@ -5824,8 +5931,19 @@ async function tryForceSynthesisPass(args: {
5824
5931
  * / error), this function emits a clear signal to wipe any
5825
5932
  * partial text it streamed. */
5826
5933
  streamingHandlers?: { onText: (delta: string, accumulated: string) => void };
5934
+ /** TUI-PROMPT-CACHE-PREFIX — the turn's session + tools. On Codex the pass
5935
+ * keeps the same tools array (tool_choice:'none') and session cache key so
5936
+ * it reuses the cached prefix instead of rewriting it with tools dropped. */
5937
+ sessionId?: string;
5938
+ tools?: LLMToolSpec[];
5827
5939
  }): Promise<string | null> {
5828
5940
  const { provider, model, history, turn, modelFamily, streamingHandlers } = args;
5941
+ const keepToolsNoCall = provider.name === 'openai-codex' && (args.tools?.length ?? 0) > 0;
5942
+ const synthesisOpts: LLMOpts = {
5943
+ model,
5944
+ ...(args.sessionId ? { sessionId: args.sessionId } : {}),
5945
+ ...(keepToolsNoCall ? { tools: args.tools, toolChoice: 'none' as const } : {}),
5946
+ };
5829
5947
  const synthesisPromptMsg: LLMMessage = {
5830
5948
  role: 'user',
5831
5949
  content:
@@ -5858,7 +5976,7 @@ async function tryForceSynthesisPass(args: {
5858
5976
  try {
5859
5977
  let collected = '';
5860
5978
  const MAX_OUTPUT_CHARS = 8000;
5861
- for await (const delta of provider.chat(synthesisHistory, { model, signal: f2Controller.signal })) {
5979
+ for await (const delta of provider.chat(synthesisHistory, { ...synthesisOpts, signal: f2Controller.signal })) {
5862
5980
  collected += delta;
5863
5981
  // Live progressive emit — TUI shows synthesis text as it
5864
5982
  // generates instead of all-at-once at the end (user-reported
@@ -7506,13 +7624,33 @@ function resultText(result: unknown): string {
7506
7624
  }
7507
7625
 
7508
7626
  /** skill_exec returns structured host metadata, but its model-facing tool result is the answer body. */
7509
- function toolResultContentForCall(toolName: string, result: unknown): string {
7627
+ function toolResultContentForCall(toolName: string, result: unknown, inlineLimitBytes?: number): string {
7628
+ let content: string;
7510
7629
  if (toolName === 'skill_exec' && result && typeof result === 'object'
7511
7630
  && typeof (result as { output?: unknown }).output === 'string') {
7512
- if ((result as { ok?: unknown }).ok === false) return JSON.stringify(result);
7513
- return (result as { output: string }).output;
7631
+ content = (result as { ok?: unknown }).ok === false
7632
+ ? JSON.stringify(result)
7633
+ : (result as { output: string }).output;
7634
+ } else {
7635
+ content = typeof result === 'string' ? result : JSON.stringify(result);
7636
+ }
7637
+ if (!Number.isFinite(inlineLimitBytes) || inlineLimitBytes === undefined || inlineLimitBytes <= 0) return content;
7638
+ const safeToolName = toolName.replace(/[^a-zA-Z0-9_-]/g, '_').slice(0, 48) || 'tool';
7639
+ const capped = truncateOutput(content, {
7640
+ toolName: `tool-result-${safeToolName}`,
7641
+ inlineLimit: inlineLimitBytes,
7642
+ headBytes: Math.floor(inlineLimitBytes * 0.6),
7643
+ tailBytes: Math.floor(inlineLimitBytes * 0.2),
7644
+ });
7645
+ if (capped.spilled) {
7646
+ debug.log('llm.router', 'tool-result.output-spilled', {
7647
+ tool: safeToolName,
7648
+ originalBytes: capped.originalBytes,
7649
+ inlineLimitBytes,
7650
+ savedPath: capped.savedPath,
7651
+ });
7514
7652
  }
7515
- return typeof result === 'string' ? result : JSON.stringify(result);
7653
+ return capped.output;
7516
7654
  }
7517
7655
 
7518
7656
  function detectExecutionFailure(result: unknown): boolean {
@@ -8865,6 +9003,10 @@ export async function streamLLMWithTools(
8865
9003
  // read-time projection 등 교체. 문맥관리를 substrate 프리미티브로 통일(streamLLMWithTools 인라인 산재 해소).
8866
9004
  const { createDefaultContextStrategy: _makeContextStrategy } = require('./agent-substrate/context-strategy.js') as typeof import('./agent-substrate/context-strategy.js');
8867
9005
  const _contextStrategy = opts.contextStrategy ?? _makeContextStrategy();
9006
+ // Latest provider prompt usage is the trigger baseline. Add estimated growth
9007
+ // appended to history after that request (usually tool output) at the next loop.
9008
+ let previousInputTokens: number | undefined;
9009
+ let previousRequestEstimatedTokens: number | undefined;
8868
9010
  let loopTermination: 'budget-exhausted' | 'aborted' = 'budget-exhausted';
8869
9011
  let terminalTurn = maxTurns;
8870
9012
 
@@ -8921,7 +9063,7 @@ export async function streamLLMWithTools(
8921
9063
  turn, historyLen: history.length,
8922
9064
  }, { level: 'info' });
8923
9065
 
8924
- // Mid-loop context backstop — with the codex/unlimited tool-loop cap
9066
+ // Turn context backstop — with the codex/unlimited tool-loop cap
8925
9067
  // removed, a long tool-heavy turn (esp. mission build) grows `history`
8926
9068
  // unbounded until it overflows the model context window and the provider
8927
9069
  // throws. ref codex / opencode bound exploration by COMPACTION, not a
@@ -8952,7 +9094,21 @@ export async function streamLLMWithTools(
8952
9094
  // ★ 조각2 — pluggable context 전략(기본=2-tier compaction·무회귀 이관). 판정+압축을 substrate 프리미티브가
8953
9095
  // 수행 → caller 는 splice/관측/breaker 만. 주입(opts.contextStrategy)으로 read-time projection 등 교체 가능.
8954
9096
  const beforeLen = history.length;
8955
- const outcome = await _contextStrategy.compact(history, { model: effectiveModel, ...(opts.sessionId ? { sessionId: opts.sessionId } : {}), config: acCfg });
9097
+ const outcome = await _contextStrategy.compact(history, {
9098
+ model: effectiveModel,
9099
+ ...(opts.sessionId ? { sessionId: opts.sessionId } : {}),
9100
+ config: acCfg,
9101
+ ...(previousInputTokens !== undefined ? {
9102
+ observedInputTokens: previousInputTokens + Math.max(
9103
+ 0,
9104
+ estimateMessagesTokens(history) - (previousRequestEstimatedTokens ?? estimateMessagesTokens(history)),
9105
+ ),
9106
+ } : {}),
9107
+ });
9108
+ // This usage event belongs to the request before this compaction
9109
+ // decision; do not carry it into another loop iteration.
9110
+ previousInputTokens = undefined;
9111
+ previousRequestEstimatedTokens = undefined;
8956
9112
  if (outcome.fired && outcome.reduced) {
8957
9113
  history.splice(0, history.length, ...outcome.messages);
8958
9114
  // ★ 관측(2026-07-21) — beforeTokens/afterTokens 포함(reduced 는 개수 아닌 **토큰** 감소로 판정).
@@ -9005,7 +9161,19 @@ export async function streamLLMWithTools(
9005
9161
  // revert to auto (see above).
9006
9162
  const buildTurnOpts = () => {
9007
9163
  const remainingFallbacks = opts.provider ? 0 : remainingFallbackProviderNames(attemptedProviders, opts).length;
9008
- const base = { ...opts, model: activeModel, tools: completionNeedsFinalTurn ? [] : activeTools, remainingFallbacks };
9164
+ // TUI-PROMPT-CACHE-PREFIX — on Codex the final-answer turn shares the
9165
+ // session cache key, so dropping tools would rewrite the cached prefix
9166
+ // (measured toolChars 67k → 2). Keep the same tools and forbid calls
9167
+ // with tool_choice:'none' instead. Other providers keep the legacy
9168
+ // empty tools (some ignore toolChoice).
9169
+ const keepToolsNoCall = completionNeedsFinalTurn && activeProvider.name === 'openai-codex';
9170
+ const base = {
9171
+ ...opts,
9172
+ model: activeModel,
9173
+ tools: completionNeedsFinalTurn && !keepToolsNoCall ? [] : activeTools,
9174
+ remainingFallbacks,
9175
+ };
9176
+ if (keepToolsNoCall) return { ...base, toolChoice: 'none' as const };
9009
9177
  return turn === 0 ? base : { ...base, toolChoice: undefined };
9010
9178
  };
9011
9179
  let turnOpts = buildTurnOpts();
@@ -9124,6 +9292,7 @@ export async function streamLLMWithTools(
9124
9292
  : turnOpts.toolChoice,
9125
9293
  };
9126
9294
  const providerMessages = mapProviderToolNamesInMessages(history, nameMap.toProviderName);
9295
+ previousRequestEstimatedTokens = estimateMessagesTokens(providerMessages);
9127
9296
  streamIter = restoreProviderToolCallNames(
9128
9297
  activeProvider.streamChat!(providerMessages, providerOpts),
9129
9298
  nameMap.toOriginalName,
@@ -9371,6 +9540,12 @@ export async function streamLLMWithTools(
9371
9540
  ...(ev.revisedPrompt !== undefined ? { revisedPrompt: ev.revisedPrompt } : {}),
9372
9541
  });
9373
9542
  } else if (ev.type === 'usage') {
9543
+ // Provider parsers normalize inputTokens to uncached input; cache
9544
+ // reads/writes are separate fields (prompt-cache/types.ts contract).
9545
+ const observedPromptTokens = (ev.usage.inputTokens ?? 0)
9546
+ + (ev.usage.cacheReadInputTokens ?? 0)
9547
+ + (ev.usage.cacheCreationInputTokens ?? 0);
9548
+ if (observedPromptTokens > 0) previousInputTokens = observedPromptTokens;
9374
9549
  // ⭐ 주 에이전트 턴의 토큰·비용을 «게이트 없이» 남긴다(2026-09-24 실측: 이 줄이 없어 3시간 `llm.usage`
9375
9550
  // 18행이 전부 곁가지 두 자리였고, 하니스 런 비용의 거의 전부가 관측 밖이었다). 곁가지와 같은 모양 ·
9376
9551
  // 모르는 모델은 금액 대신 `cost.kind='unknown'`. runId 는 debug.log 가 붙인다. 실패해도 턴은 계속.
@@ -11358,6 +11533,11 @@ export async function streamLLMWithTools(
11358
11533
  }
11359
11534
  const dispatchIndex = callsToDispatch.findIndex((candidate) => candidate.id === call.id);
11360
11535
  const { result, isError } = dispatchedResults[dispatchIndex]!;
11536
+ const toolResultInlineLimitBytes = opts.toolResultInlineLimitBytes === undefined
11537
+ ? undefined
11538
+ : activeProvider.name === 'openai-codex'
11539
+ ? Math.min(opts.toolResultInlineLimitBytes, 10 * 1024)
11540
+ : opts.toolResultInlineLimitBytes;
11361
11541
  const imageBearing = maybeImageBearingResult(result);
11362
11542
  if (imageBearing) {
11363
11543
  // Image-bearing tool result (Phase 1, 2026-05-05) — see
@@ -11370,7 +11550,7 @@ export async function streamLLMWithTools(
11370
11550
  tool_use_id: call.id,
11371
11551
  content: [
11372
11552
  { type: 'image', mediaType: imageBearing.mediaType, base64: imageBearing.dataB64 },
11373
- { type: 'text', text: JSON.stringify(imageBearing.rest) },
11553
+ { type: 'text', text: toolResultContentForCall(call.name, JSON.stringify(imageBearing.rest), toolResultInlineLimitBytes) },
11374
11554
  ],
11375
11555
  ...(isError ? { isError: true } : {}),
11376
11556
  });
@@ -11378,7 +11558,7 @@ export async function streamLLMWithTools(
11378
11558
  resultBlocks.push({
11379
11559
  type: 'tool_result',
11380
11560
  tool_use_id: call.id,
11381
- content: toolResultContentForCall(call.name, result),
11561
+ content: toolResultContentForCall(call.name, result, toolResultInlineLimitBytes),
11382
11562
  ...(isError ? { isError: true } : {}),
11383
11563
  });
11384
11564
  }
@@ -11521,6 +11701,8 @@ export async function streamLLMWithTools(
11521
11701
  history,
11522
11702
  turn,
11523
11703
  modelFamily,
11704
+ ...(opts.sessionId ? { sessionId: opts.sessionId } : {}),
11705
+ tools: activeTools,
11524
11706
  // Live progressive streaming — deltas emit through handlers
11525
11707
  // during collection so TUI shows synthesis text as it
11526
11708
  // generates instead of one big chunk at the end.
@@ -11764,11 +11946,11 @@ import {
11764
11946
  } from './oauth/codex.js';
11765
11947
  import { extractChatGPTClaims } from './oauth/jwt.js';
11766
11948
 
11767
- // ⭐ 2026-09-23 (대표) — 운영 기본을 GPT-6 Sol 로 옮겼다(구 gpt-5.6-terra).
11949
+ // ⭐ 2026-10-28 — current Codex default is GPT-6.1 Terra.
11768
11950
  // ⛔ 이 상수는 «최후 폴백»이다 — 정상 경로는 `llm-tier-map` 의 사다리를 탄다.
11769
- // 📏 구독 경로 실호출 확인(codex-cli 0.155.1 · 2026-09-23): `codex exec --model gpt-6-sol` ✅
11770
- // ⚠️ 0.154.0 에서는 같은 계정이 400 이었다 — 클라이언트 판이 게이트였다.
11771
- export const CODEX_DEFAULT_MODEL = 'gpt-6-sol';
11951
+ // Codex CLI 0.164.0: `codex exec -m gpt-6.1-terra` returned successfully on 2026-10-28.
11952
+ // Elanous ACP Codex app-server also returned on this model; Elanous's better-tier effort remains medium.
11953
+ export const CODEX_DEFAULT_MODEL = 'gpt-6.1-terra';
11772
11954
  export const CODEX_DEFAULT_URL = 'https://api.openai.com/v1/chat/completions';
11773
11955
 
11774
11956
  /** Build an OpenAI-compatible provider (grok / openai) using the
@@ -12167,6 +12349,7 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
12167
12349
  acceptToolImages: codexAcceptToolImages,
12168
12350
  acceptUserMessageImages: codexAcceptUserImages,
12169
12351
  replayCodexReasoning: !useStore,
12352
+ stablePrefix: true,
12170
12353
  onOrphanToolResult: (callId) => {
12171
12354
  try { debug.log('llm.codex', 'orphan-tool-output-dropped', { callId }); }
12172
12355
  catch { /* observation must not block the request */ }
@@ -12223,6 +12406,7 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
12223
12406
  ? messagesToResponsesInput(messages, {
12224
12407
  acceptToolImages: codexAcceptToolImages,
12225
12408
  acceptUserMessageImages: codexAcceptUserImages,
12409
+ stablePrefix: true,
12226
12410
  }).input
12227
12411
  : input);
12228
12412
  const wirePrevId = (delta && lastResponseId) ? lastResponseId : undefined;
@@ -12243,9 +12427,12 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
12243
12427
  };
12244
12428
  const requestGuard = opts.requestSizeGuard;
12245
12429
  const promptCache = opts.promptCache !== false;
12430
+ // TUI-PROMPT-CACHE-PREFIX — the preflight must measure the same body
12431
+ // streamCodexResponsesEvents would build (session-derived key).
12432
+ const sessionCacheKey = codexSessionCacheKey(opts.sessionId, process.env.ELANOUS_RUN_ID)?.key;
12246
12433
  let serializedWireBody: string | undefined;
12247
12434
  if (requestGuard) {
12248
- serializedWireBody = serializeCodexResponsesWireBody(requestBody, promptCache);
12435
+ serializedWireBody = serializeCodexResponsesWireBody(requestBody, promptCache, sessionCacheKey);
12249
12436
  let requestChars = serializedWireBody.length;
12250
12437
  const initialRequestChars = requestChars;
12251
12438
  let requestCompacted = false;
@@ -12264,9 +12451,10 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
12264
12451
  // Compaction runs only when store threading is off, matching
12265
12452
  // the original non-threaded wire input policy.
12266
12453
  replayCodexReasoning: !useStore,
12454
+ stablePrefix: true,
12267
12455
  });
12268
12456
  const compactBody = { ...requestBody, instructions: compactInput.instructions, input: compactInput.input };
12269
- const compactWireBody = serializeCodexResponsesWireBody(compactBody, promptCache);
12457
+ const compactWireBody = serializeCodexResponsesWireBody(compactBody, promptCache, sessionCacheKey);
12270
12458
  const compactChars = compactWireBody.length;
12271
12459
  if (compactChars < requestChars) {
12272
12460
  messages.splice(0, messages.length, ...compacted.messages);
@@ -12310,6 +12498,7 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
12310
12498
  yield* streamCodexResponsesEvents(responsesUrl, tokens.accessToken, requestBody, opts.signal, {
12311
12499
  accountId,
12312
12500
  promptCache,
12501
+ ...(opts.sessionId ? { sessionId: opts.sessionId } : {}),
12313
12502
  ...(serializedWireBody ? { serializedWireBody } : {}),
12314
12503
  // Capture the new response id from the SSE stream so the
12315
12504
  // next call can thread it. If the backend skips the event