elanous 0.2.41 → 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 (589) 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/{GiOLWmt4MqDZePubBjA4Q → X1ucLw10Cds_h614NoEnh}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/{5159.115f1c2ca471386c.js → 1063.2fb8a9dc55c731f2.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +36 -0
  7. package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/{9048.212083de42d25be3.js → 1262.e804feb8fd1acb8c.js} +2 -2
  9. package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/{4527.a69f2894d1bc9f4a.js → 1487.2f67b79444062da6.js} +1 -1
  13. package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +32 -0
  15. package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +286 -0
  21. package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +23 -0
  22. package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +34 -0
  25. package/apps/pwa/out/_next/static/chunks/2456.b6de0e1c05f28843.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/{530.d26346e18089640a.js → 2690.0521c738b7749931.js} +1 -1
  31. package/apps/pwa/out/_next/static/chunks/{4702.4a4adc1f16d7c93b.js → 2974.595d1e29d040cb6a.js} +1 -1
  32. package/apps/pwa/out/_next/static/chunks/{2263.e09b6edea33bad2d.js → 3207.a756c95e9ec8c3c8.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/{9541.eb8e2f8480c7feca.js → 3285.89ee2f298682f5e5.js} +2 -2
  34. package/apps/pwa/out/_next/static/chunks/{9507.7026657a2f47eb64.js → 3347.f846266b5e5f3ede.js} +16 -16
  35. package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +41 -0
  36. package/apps/pwa/out/_next/static/chunks/{1178.1aa9cad0e7695427.js → 3482.a9ae9d2ad6a5bd97.js} +1 -1
  37. package/apps/pwa/out/_next/static/chunks/3507.97e1977bc4d5fb0a.js +2 -0
  38. package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +24 -0
  40. package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/{1661.0dd330f3d89f73f3.js → 3837.a210d7d0db8d8abd.js} +1 -1
  42. package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/{2fdf2931.b431eee4fb468bc3.js → 3d0154af.5331fec737ffe8c3.js} +1 -1
  45. package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/4043.6b91203436c9c86b.js +309 -0
  47. package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +77 -0
  48. package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +148 -0
  54. package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +74 -0
  55. package/apps/pwa/out/_next/static/chunks/50061469.0326382241ef3b2d.js +122 -0
  56. package/apps/pwa/out/_next/static/chunks/{1115.434ae2ecb0ad986d.js → 5112.4b9f300124fab7b3.js} +3 -3
  57. package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +27 -0
  59. package/apps/pwa/out/_next/static/chunks/53c73f84.373b6160adfa89a4.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +287 -0
  69. package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +226 -0
  72. package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +90 -0
  73. package/apps/pwa/out/_next/static/chunks/{2073.689dcb2680113d76.js → 6377.bc7df239edbff244.js} +1 -1
  74. package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/{1800.f7ff51dc4978a958.js → 6632.0eac1c554f8f2ef3.js} +1 -1
  77. package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +104 -0
  81. package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +94 -0
  82. package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/{2527-5c636a43c7cc5dde.js → 7279-c199ea83f34338fa.js} +1 -1
  85. package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/{385e4574.e9886ab32759eda3.js → 73d2eb0e.4966ad55293c801a.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/{5471.1e611302ed3a7c53.js → 7411.9b4b8b747dc7b802.js} +2 -2
  90. package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +24 -0
  91. package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/{2fe2c302.41b517f88d6fe502.js → 7a98bc80.fa935989e829f9c2.js} +1 -1
  97. package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/8138.6c10b2a356d52fca.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/{5574.f35accf4f132b29d.js → 8262.ddc03e06b733f184.js} +1 -1
  100. package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +8 -0
  102. package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +79 -0
  104. package/apps/pwa/out/_next/static/chunks/{8050-9b364bdef8f71927.js → 8546-6f03f8ea34dd61d9.js} +1 -1
  105. package/apps/pwa/out/_next/static/chunks/{5947-135e26537d80a6b9.js → 8673-bab689a55f7e13b9.js} +3 -3
  106. package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/{5937.c2df9e3447e1f667.js → 9249.976f1e69a9d80754.js} +1 -1
  111. package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/{1971-7efb628c471dc5a0.js → 9353-12bfff0c130104cf.js} +1 -1
  116. package/apps/pwa/out/_next/static/chunks/{7191.fdc955f7d96064a4.js → 9415.69e4a21c60c7d2db.js} +1 -1
  117. package/apps/pwa/out/_next/static/chunks/{1219.7e17964e0e7cd8e5.js → 9427.96aa912ddb5801e0.js} +16 -16
  118. package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{5964-7e21164a8f2cf0ce.js → 9656-374232558fd528d0.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/{6552.a3840aa7da35ad68.js → 9832.f4a98c878ecf2c0a.js} +1 -1
  123. package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/{a0a01613.6d1cca322238d7fe.js → b450776b.3db34d8d965f82d3.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/{c0c1a699.0ba79f97005965d4.js → e8543907.5b040a5f22a0b0e5.js} +7 -7
  178. package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +1 -0
  184. package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +22 -22
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +22 -22
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +22 -22
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +21 -21
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +21 -21
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +22 -22
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +21 -21
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +22 -22
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +22 -22
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +21 -21
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +22 -22
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -24
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +22 -22
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +22 -22
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +21 -21
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +22 -22
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -24
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -24
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +21 -21
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +21 -21
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +22 -22
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +22 -22
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +21 -21
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +21 -21
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +21 -21
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +22 -22
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +22 -22
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +21 -21
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +22 -22
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +22 -22
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +22 -22
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +22 -22
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +22 -22
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +21 -21
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +22 -22
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +22 -22
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +22 -22
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +22 -22
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +22 -22
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +22 -22
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +22 -22
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +22 -22
  278. package/docs/goal-context/04-mock-scenarios.md +13 -0
  279. package/graphs/catalog/catalog.yaml +1 -1
  280. package/graphs/heal/heal-loop.yaml +1 -0
  281. package/graphs/overlays/stop-heal-ladder.yaml +113 -0
  282. package/graphs/units/verbs/recipes.yaml +11 -11
  283. package/graphs/work/research-report.yaml +10 -2
  284. package/package.json +1 -1
  285. package/scripts/heal/run-role.ts +99 -5
  286. package/scripts/land-global-checks.ts +6 -1
  287. package/scripts/lib/decompose-ab.ts +1 -0
  288. package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
  289. package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
  290. package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
  291. package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
  292. package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
  293. package/scripts/lib/tui-regress-checks.ts +33 -13
  294. package/scripts/release-loop/gate-baseline-receipt.ts +47 -9
  295. package/scripts/release-loop/gate-image-pin.ts +81 -0
  296. package/scripts/release-loop/gate-node-sim.ts +207 -0
  297. package/scripts/release-loop/gate-node.ts +285 -46
  298. package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
  299. package/scripts/release-loop/gate-radius-live.ts +97 -13
  300. package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
  301. package/scripts/release-loop/gate-train-receipts.ts +122 -0
  302. package/scripts/release-loop/resume-release.ts +83 -8
  303. package/scripts/ux-sim.ts +18 -1
  304. package/scripts/warm-pool-provider-config.ts +263 -0
  305. package/skills/omni-crawl/SKILL.md +5 -2
  306. package/skills/omni-crawl/scripts/main.ts +84 -23
  307. package/src/acp/core-turn-bridge.ts +13 -0
  308. package/src/agent/registry.ts +2 -0
  309. package/src/agent/task-notification.ts +25 -5
  310. package/src/agent/types.ts +6 -0
  311. package/src/agent-mission/mission-cli.ts +24 -0
  312. package/src/agent-mission/mission-out.ts +595 -0
  313. package/src/agent-mission/tool-install.ts +88 -2
  314. package/src/agent-substrate/context-strategy.ts +4 -4
  315. package/src/agent-substrate/self-review-cli.ts +178 -13
  316. package/src/auto-research/research-turn.ts +123 -50
  317. package/src/autopilot/pr-manager.ts +38 -7
  318. package/src/autopilot/pty-control-loop.ts +2 -0
  319. package/src/capture/tui-self-report.ts +22 -6
  320. package/src/chat/index.ts +1 -1
  321. package/src/cli/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
  322. package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
  323. package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
  324. package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
  325. package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
  326. package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
  327. package/src/cli/pr-land-heavy-remote.ts +32 -0
  328. package/src/cli/pr-land-overlap-evidence.ts +100 -1
  329. package/src/cli/pr-land-pod-shadow-job.ts +60 -0
  330. package/src/cli/release-checklist-read-cli.ts +20 -10
  331. package/src/cli/research-cli.ts +4 -5
  332. package/src/cli/tasks-cli.ts +7 -0
  333. package/src/compact/auto.ts +8 -1
  334. package/src/control-plane/ledger.ts +52 -2
  335. package/src/control-plane/server.ts +16 -2
  336. package/src/core-turn/run-core-turn.ts +311 -90
  337. package/src/core-turn/run-goal-loop.ts +18 -0
  338. package/src/core-turn/types.ts +2 -0
  339. package/src/dashboard/classic-sidetab-mission-job.ts +58 -0
  340. package/src/dashboard/classic-sidetab-mission.ts +185 -0
  341. package/src/dashboard/index.ts +149 -15
  342. package/src/dashboard/input/agent-wake.ts +23 -1
  343. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +9 -0
  344. package/src/dashboard/mission-cli-consumer.ts +153 -0
  345. package/src/dashboard/seat-boot-preamble.ts +171 -1
  346. package/src/dashboard/side-basic-runtime.ts +54 -1
  347. package/src/dashboard/sidetab-runtime.ts +90 -1
  348. package/src/dashboard/skill-catalog-preamble.ts +101 -0
  349. package/src/dashboard/skill-detection-runtime.ts +55 -15
  350. package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
  351. package/src/dashboard/turn-preamble.ts +53 -15
  352. package/src/dashboard/turn-prompt-runtime.ts +4 -2
  353. package/src/graph-runner/graph-cli.ts +23 -7
  354. package/src/graph-runner/graph-tick.ts +10 -2
  355. package/src/graph-runner/runner.ts +1 -1
  356. package/src/grok/agent-search.ts +14 -4
  357. package/src/grok/credential.ts +28 -11
  358. package/src/harness/harness-pod-dispatch.ts +81 -15
  359. package/src/harness/harness-stop.ts +155 -11
  360. package/src/index.ts +34 -5
  361. package/src/instance/spawn-elanous.ts +6 -4
  362. package/src/llm.ts +166 -8
  363. package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
  364. package/src/loops/orchestrator/tick.ts +13 -0
  365. package/src/maturity/feature-maturity.ts +1 -1
  366. package/src/native-tool-catalog.ts +2 -2
  367. package/src/nexus/api/harness-traversal.ts +11 -0
  368. package/src/pr-tool/census.ts +3 -2
  369. package/src/pty-shell/tui-run-state.ts +188 -2
  370. package/src/release-loop/checklist-target-path-hint.ts +13 -0
  371. package/src/release-loop/checklist.ts +9 -1
  372. package/src/repl/index.ts +43 -2
  373. package/src/research/axis-fanout.ts +121 -16
  374. package/src/research/bloom-exemplars.ts +3 -1
  375. package/src/research/gap-followup.ts +13 -1
  376. package/src/research/plugin-discovery.ts +36 -14
  377. package/src/research-bridge/invoke.ts +22 -5
  378. package/src/research-bridge/types.ts +2 -0
  379. package/src/self-dev/decompose.ts +119 -5
  380. package/src/self-dev/launch-preflight-text.ts +5 -6
  381. package/src/self-dev/orchestrate.ts +12 -2
  382. package/src/self-dev/review-provider-fallback.ts +9 -2
  383. package/src/self-dev/run-supervisor.ts +42 -4
  384. package/src/self-dev/run-types.ts +4 -0
  385. package/src/self-implement/doctor-visit.ts +88 -0
  386. package/src/self-implement/goal-author.ts +326 -3
  387. package/src/self-implement/graph-overlay-yaml.ts +7 -0
  388. package/src/self-implement/headless-elanous-driver.ts +31 -2
  389. package/src/self-implement/heal-intake.ts +112 -4
  390. package/src/self-implement/heal-triage.ts +20 -0
  391. package/src/self-implement/host-regate.ts +27 -4
  392. package/src/self-implement/merge-train.ts +5 -0
  393. package/src/self-implement/orchestrator.ts +126 -11
  394. package/src/self-implement/regate-detail.ts +38 -1
  395. package/src/self-implement/rework-child-provider.ts +25 -0
  396. package/src/self-implement/run-chart.ts +119 -0
  397. package/src/self-implement/run-ledger.ts +112 -11
  398. package/src/self-implement/run-stop.ts +188 -4
  399. package/src/self-implement/stop-autoheal.ts +13 -0
  400. package/src/session/chat.ts +38 -4
  401. package/src/session-runtime/index.ts +98 -4
  402. package/src/session-runtime/tier-flip.ts +3 -3
  403. package/src/sidetab-core/model.ts +19 -5
  404. package/src/sidetab-core/visible-agent-mission.ts +186 -0
  405. package/src/skills/name-match.ts +20 -0
  406. package/src/skills/tools/agent.ts +30 -2
  407. package/src/skills/tools/omni-search.ts +67 -5
  408. package/src/task-agent/pod-distributor-entry.ts +3 -0
  409. package/src/task-agent/task-hand.ts +27 -0
  410. package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
  411. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
  412. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
  413. package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
  414. package/src/task-orchestrator/surfaces/pod-source-receive.ts +163 -13
  415. package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
  416. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +209 -39
  417. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
  418. package/src/task-orchestrator/surfaces/self-implement-pod.ts +165 -45
  419. package/src/tokens.ts +35 -2
  420. package/src/tool-runtime/agent-runtime.ts +1 -0
  421. package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
  422. package/src/tool-runtime/skill-exec-runtime.ts +33 -13
  423. package/src/tool-runtime/types.ts +1 -0
  424. package/src/tui/entry.ts +14 -4
  425. package/src/tui/sidetab/attach.ts +47 -0
  426. package/src/tui-client/local-chat-turn.ts +26 -13
  427. package/src/tui.ts +22 -0
  428. package/src/ux-sim/fake-kubectl.ts +37 -3
  429. package/src/ux-sim/fault-pool-cap.ts +11 -6
  430. package/src/ux-sim/mock-scenario-catalog.json +41 -0
  431. package/src/ux-sim/mock-scenario-catalog.ts +156 -0
  432. package/src/ux-sim/scenario.ts +116 -23
  433. package/src/version/packed-revision.json +1 -1
  434. package/src/voice/voice-tts-singleton.ts +18 -3
  435. package/src/web-search/grok.ts +5 -9
  436. package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +0 -36
  437. package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +0 -1
  438. package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +0 -287
  439. package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +0 -1
  440. package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +0 -1
  441. package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +0 -1
  442. package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +0 -90
  443. package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +0 -1
  444. package/apps/pwa/out/_next/static/chunks/1765.679b29625c8e88d4.js +0 -77
  445. package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +0 -1
  446. package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +0 -1
  447. package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +0 -1
  448. package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +0 -1
  449. package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +0 -1
  450. package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +0 -1
  451. package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +0 -1
  452. package/apps/pwa/out/_next/static/chunks/2743.5d3f76948be32b34.js +0 -41
  453. package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +0 -32
  454. package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +0 -79
  456. package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +0 -1
  457. package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +0 -1
  458. package/apps/pwa/out/_next/static/chunks/3230-49298c3b73ef2268.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +0 -74
  461. package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +0 -1
  463. package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +0 -1
  465. package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +0 -1
  467. package/apps/pwa/out/_next/static/chunks/4133.2056bb4d78f621af.js +0 -1
  468. package/apps/pwa/out/_next/static/chunks/4156.ba4de4a3664f04b4.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +0 -148
  472. package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +0 -226
  473. package/apps/pwa/out/_next/static/chunks/4667.97e31aa38c95c475.js +0 -309
  474. package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +0 -1
  477. package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +0 -1
  479. package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +0 -94
  481. package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +0 -1
  482. package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +0 -8
  483. package/apps/pwa/out/_next/static/chunks/53aeb4ee-51c92f8d683f5220.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +0 -24
  487. package/apps/pwa/out/_next/static/chunks/5744.b9415e18ad623100.js +0 -23
  488. package/apps/pwa/out/_next/static/chunks/5892.2526d962339662d8.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +0 -286
  490. package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +0 -27
  494. package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +0 -24
  496. package/apps/pwa/out/_next/static/chunks/6874.d5cf7eb8edb2cabe.js +0 -2
  497. package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +0 -122
  499. package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/83184dcd-0ee6247ff41eb3f2.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +0 -104
  510. package/apps/pwa/out/_next/static/chunks/8464-e24f10451b658aac.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/8880.64c445592f04acaf.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +0 -1
  517. package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/9579.4a8169600fff2058.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +0 -34
  527. package/apps/pwa/out/_next/static/chunks/9834.63ab2bbc3153172e.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/9869.81a1e24ca682d5a0.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/addc2b32.8c4ff8f0aefe987d.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/app/botlab/page-14949db884bfa672.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-40f9e19149024298.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a142dfb0331a05f5.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/b2271e54.c1de3347976e90b0.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +0 -1
  588. package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
  589. /package/apps/pwa/out/_next/static/{GiOLWmt4MqDZePubBjA4Q → X1ucLw10Cds_h614NoEnh}/_ssgManifest.js +0 -0
package/src/llm.ts CHANGED
@@ -27,6 +27,7 @@ import {
27
27
  DEFAULT_PROVIDER,
28
28
  } from './config.js';
29
29
  import { debug, redactSecrets, redactSecretText } from './debug/log.js';
30
+ import { estimateMessagesTokens } from './tokens.js';
30
31
  import { isVerifiedOpenGatewayModel } from './llm/opengateway-models.js';
31
32
  import { llmUsageCostFields } from './budget/llm-cost.js';
32
33
  import { accumulateByokUsage } from './llm/openrouter-byok-cost.js';
@@ -274,6 +275,13 @@ export interface LLMMessage {
274
275
  phase?: 'commentary' | 'partial_answer' | 'final_answer';
275
276
  /** Opaque Codex stateless reasoning items, before this assistant message. */
276
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;
277
285
  }
278
286
 
279
287
  /** JSONSchema-shaped tool definition sent to the provider (no handler). */
@@ -1707,6 +1715,15 @@ export interface MessagesToResponsesInputOpts {
1707
1715
  replayCodexReasoning?: boolean;
1708
1716
  acceptUserMessageImages?: boolean;
1709
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;
1710
1727
  }
1711
1728
 
1712
1729
  /** Exported for tests. Converts the unified LLMMessage shape into the
@@ -1747,6 +1764,11 @@ export function messagesToResponsesInput(
1747
1764
 
1748
1765
  const sys: string[] = [];
1749
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;
1750
1772
  for (const m of messages) {
1751
1773
  // Build typed content blocks: text accumulated into one block,
1752
1774
  // images appended as separate input_image entries. The old
@@ -1873,9 +1895,20 @@ export function messagesToResponsesInput(
1873
1895
  }
1874
1896
 
1875
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
+ }
1876
1908
  sys.push(textBuf);
1877
1909
  continue;
1878
1910
  }
1911
+ conversationStarted = true;
1879
1912
 
1880
1913
  // Stateless Codex requires the opaque reasoning item in its original
1881
1914
  // position before the corresponding assistant message/tool calls.
@@ -1901,6 +1934,13 @@ export function messagesToResponsesInput(
1901
1934
  }
1902
1935
  input.push(...trailingItems);
1903
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
+ }
1904
1944
  if (input.length === 0) input.push({ role: 'user', content: [{ type: 'input_text', text: '' }] });
1905
1945
  return {
1906
1946
  instructions: sys.length ? sys.join('\n\n') : 'You are a helpful assistant.',
@@ -1908,6 +1948,17 @@ export function messagesToResponsesInput(
1908
1948
  };
1909
1949
  }
1910
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
+
1911
1962
  /** store=true wave: compute the incremental tail when `current` is a
1912
1963
  * strict extension of `prev`. Returns null when the previous input
1913
1964
  * isn't usable as a baseline — caller falls back to full input + no
@@ -1960,6 +2011,35 @@ export function computePromptCacheKey(model: string, instructions: string): stri
1960
2011
  return createHash('sha256').update(`${model}::${prefix}`).digest('hex').slice(0, 32);
1961
2012
  }
1962
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
+
1963
2043
  /** Cycle order for the HUD pill click + `/reasoning` no-arg form. */
1964
2044
  export const REASONING_CYCLE: readonly import('./user-config.js').ReasoningLevel[] =
1965
2045
  ['off', 'low', 'medium', 'high', 'xhigh'] as const;
@@ -2240,8 +2320,12 @@ function buildCodexResponsesWireBody(
2240
2320
  previousResponseId?: string;
2241
2321
  },
2242
2322
  promptCache: boolean,
2323
+ /** Session-derived key (codexSessionCacheKey). Absent → legacy key. */
2324
+ sessionCacheKey?: string,
2243
2325
  ): Record<string, unknown> {
2244
- const cacheKey = promptCache ? computePromptCacheKey(body.model, body.instructions) : undefined;
2326
+ const cacheKey = promptCache
2327
+ ? (sessionCacheKey ?? computePromptCacheKey(body.model, body.instructions))
2328
+ : undefined;
2245
2329
  return {
2246
2330
  ...body,
2247
2331
  stream: true,
@@ -2259,8 +2343,9 @@ function buildCodexResponsesWireBody(
2259
2343
  function serializeCodexResponsesWireBody(
2260
2344
  body: Parameters<typeof buildCodexResponsesWireBody>[0],
2261
2345
  promptCache: boolean,
2346
+ sessionCacheKey?: string,
2262
2347
  ): string {
2263
- return JSON.stringify(buildCodexResponsesWireBody(body, promptCache));
2348
+ return JSON.stringify(buildCodexResponsesWireBody(body, promptCache, sessionCacheKey));
2264
2349
  }
2265
2350
 
2266
2351
  export async function* streamCodexResponsesEvents(
@@ -2320,9 +2405,14 @@ export async function* streamCodexResponsesEvents(
2320
2405
  onResponseCreated?: (id: string) => void;
2321
2406
  /** Unused configured fallbacks. Overload k times switches before retries. */
2322
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;
2323
2412
  } = {},
2324
2413
  ): AsyncGenerator<LLMStreamEvent, void, unknown> {
2325
2414
  const startedAt = Date.now();
2415
+ const sessionAffinity = codexSessionCacheKey(extra.sessionId, process.env.ELANOUS_RUN_ID);
2326
2416
  // See comment in streamOpenAIEvents — we drop the raw body by
2327
2417
  // default. `/debug verbose on` restores the full body for deep
2328
2418
  // reproduction.
@@ -2340,6 +2430,16 @@ export async function* streamCodexResponsesEvents(
2340
2430
  inputChars: (() => { try { return JSON.stringify(body.input).length; } catch { return -1; } })(),
2341
2431
  toolChars: (() => { try { return JSON.stringify(body.tools ?? []).length; } catch { return -1; } })(),
2342
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,
2343
2443
  tools: observeRequestTools(body.tools),
2344
2444
  instructions: body.instructions.slice(0, 200),
2345
2445
  accountId: extra.accountId ? `${extra.accountId.slice(0, 8)}…` : '(none)',
@@ -2367,7 +2467,7 @@ export async function* streamCodexResponsesEvents(
2367
2467
  const promptCache = extra.promptCache !== false;
2368
2468
  // TUI-REQUEST-SIZE-COMPACT — the exact serializer is shared with the
2369
2469
  // preflight guard, so the size decision and fetch body cannot drift.
2370
- const wireBody = buildCodexResponsesWireBody(body, promptCache);
2470
+ const wireBody = buildCodexResponsesWireBody(body, promptCache, sessionAffinity?.key);
2371
2471
  const wireJson = extra.serializedWireBody ?? JSON.stringify(wireBody);
2372
2472
  debug.log('llm.request', 'request-size', {
2373
2473
  provider: 'openai-codex',
@@ -2391,6 +2491,9 @@ export async function* streamCodexResponsesEvents(
2391
2491
  // is treated as an old client → 400 "requires a newer version of
2392
2492
  // Codex". See getCodexUserAgent (oauth/codex.ts).
2393
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 } : {}),
2394
2497
  },
2395
2498
  body: wireJson,
2396
2499
  signal,
@@ -5828,8 +5931,19 @@ async function tryForceSynthesisPass(args: {
5828
5931
  * / error), this function emits a clear signal to wipe any
5829
5932
  * partial text it streamed. */
5830
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[];
5831
5939
  }): Promise<string | null> {
5832
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
+ };
5833
5947
  const synthesisPromptMsg: LLMMessage = {
5834
5948
  role: 'user',
5835
5949
  content:
@@ -5862,7 +5976,7 @@ async function tryForceSynthesisPass(args: {
5862
5976
  try {
5863
5977
  let collected = '';
5864
5978
  const MAX_OUTPUT_CHARS = 8000;
5865
- 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 })) {
5866
5980
  collected += delta;
5867
5981
  // Live progressive emit — TUI shows synthesis text as it
5868
5982
  // generates instead of all-at-once at the end (user-reported
@@ -8889,6 +9003,10 @@ export async function streamLLMWithTools(
8889
9003
  // read-time projection 등 교체. 문맥관리를 substrate 프리미티브로 통일(streamLLMWithTools 인라인 산재 해소).
8890
9004
  const { createDefaultContextStrategy: _makeContextStrategy } = require('./agent-substrate/context-strategy.js') as typeof import('./agent-substrate/context-strategy.js');
8891
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;
8892
9010
  let loopTermination: 'budget-exhausted' | 'aborted' = 'budget-exhausted';
8893
9011
  let terminalTurn = maxTurns;
8894
9012
 
@@ -8976,7 +9094,21 @@ export async function streamLLMWithTools(
8976
9094
  // ★ 조각2 — pluggable context 전략(기본=2-tier compaction·무회귀 이관). 판정+압축을 substrate 프리미티브가
8977
9095
  // 수행 → caller 는 splice/관측/breaker 만. 주입(opts.contextStrategy)으로 read-time projection 등 교체 가능.
8978
9096
  const beforeLen = history.length;
8979
- 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;
8980
9112
  if (outcome.fired && outcome.reduced) {
8981
9113
  history.splice(0, history.length, ...outcome.messages);
8982
9114
  // ★ 관측(2026-07-21) — beforeTokens/afterTokens 포함(reduced 는 개수 아닌 **토큰** 감소로 판정).
@@ -9029,7 +9161,19 @@ export async function streamLLMWithTools(
9029
9161
  // revert to auto (see above).
9030
9162
  const buildTurnOpts = () => {
9031
9163
  const remainingFallbacks = opts.provider ? 0 : remainingFallbackProviderNames(attemptedProviders, opts).length;
9032
- 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 };
9033
9177
  return turn === 0 ? base : { ...base, toolChoice: undefined };
9034
9178
  };
9035
9179
  let turnOpts = buildTurnOpts();
@@ -9148,6 +9292,7 @@ export async function streamLLMWithTools(
9148
9292
  : turnOpts.toolChoice,
9149
9293
  };
9150
9294
  const providerMessages = mapProviderToolNamesInMessages(history, nameMap.toProviderName);
9295
+ previousRequestEstimatedTokens = estimateMessagesTokens(providerMessages);
9151
9296
  streamIter = restoreProviderToolCallNames(
9152
9297
  activeProvider.streamChat!(providerMessages, providerOpts),
9153
9298
  nameMap.toOriginalName,
@@ -9397,6 +9542,10 @@ export async function streamLLMWithTools(
9397
9542
  } else if (ev.type === 'usage') {
9398
9543
  // Provider parsers normalize inputTokens to uncached input; cache
9399
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;
9400
9549
  // ⭐ 주 에이전트 턴의 토큰·비용을 «게이트 없이» 남긴다(2026-09-24 실측: 이 줄이 없어 3시간 `llm.usage`
9401
9550
  // 18행이 전부 곁가지 두 자리였고, 하니스 런 비용의 거의 전부가 관측 밖이었다). 곁가지와 같은 모양 ·
9402
9551
  // 모르는 모델은 금액 대신 `cost.kind='unknown'`. runId 는 debug.log 가 붙인다. 실패해도 턴은 계속.
@@ -11552,6 +11701,8 @@ export async function streamLLMWithTools(
11552
11701
  history,
11553
11702
  turn,
11554
11703
  modelFamily,
11704
+ ...(opts.sessionId ? { sessionId: opts.sessionId } : {}),
11705
+ tools: activeTools,
11555
11706
  // Live progressive streaming — deltas emit through handlers
11556
11707
  // during collection so TUI shows synthesis text as it
11557
11708
  // generates instead of one big chunk at the end.
@@ -12198,6 +12349,7 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
12198
12349
  acceptToolImages: codexAcceptToolImages,
12199
12350
  acceptUserMessageImages: codexAcceptUserImages,
12200
12351
  replayCodexReasoning: !useStore,
12352
+ stablePrefix: true,
12201
12353
  onOrphanToolResult: (callId) => {
12202
12354
  try { debug.log('llm.codex', 'orphan-tool-output-dropped', { callId }); }
12203
12355
  catch { /* observation must not block the request */ }
@@ -12254,6 +12406,7 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
12254
12406
  ? messagesToResponsesInput(messages, {
12255
12407
  acceptToolImages: codexAcceptToolImages,
12256
12408
  acceptUserMessageImages: codexAcceptUserImages,
12409
+ stablePrefix: true,
12257
12410
  }).input
12258
12411
  : input);
12259
12412
  const wirePrevId = (delta && lastResponseId) ? lastResponseId : undefined;
@@ -12274,9 +12427,12 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
12274
12427
  };
12275
12428
  const requestGuard = opts.requestSizeGuard;
12276
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;
12277
12433
  let serializedWireBody: string | undefined;
12278
12434
  if (requestGuard) {
12279
- serializedWireBody = serializeCodexResponsesWireBody(requestBody, promptCache);
12435
+ serializedWireBody = serializeCodexResponsesWireBody(requestBody, promptCache, sessionCacheKey);
12280
12436
  let requestChars = serializedWireBody.length;
12281
12437
  const initialRequestChars = requestChars;
12282
12438
  let requestCompacted = false;
@@ -12295,9 +12451,10 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
12295
12451
  // Compaction runs only when store threading is off, matching
12296
12452
  // the original non-threaded wire input policy.
12297
12453
  replayCodexReasoning: !useStore,
12454
+ stablePrefix: true,
12298
12455
  });
12299
12456
  const compactBody = { ...requestBody, instructions: compactInput.instructions, input: compactInput.input };
12300
- const compactWireBody = serializeCodexResponsesWireBody(compactBody, promptCache);
12457
+ const compactWireBody = serializeCodexResponsesWireBody(compactBody, promptCache, sessionCacheKey);
12301
12458
  const compactChars = compactWireBody.length;
12302
12459
  if (compactChars < requestChars) {
12303
12460
  messages.splice(0, messages.length, ...compacted.messages);
@@ -12341,6 +12498,7 @@ function makeCodexProvider(cfg: UCLLMConfig): LLMProvider {
12341
12498
  yield* streamCodexResponsesEvents(responsesUrl, tokens.accessToken, requestBody, opts.signal, {
12342
12499
  accountId,
12343
12500
  promptCache,
12501
+ ...(opts.sessionId ? { sessionId: opts.sessionId } : {}),
12344
12502
  ...(serializedWireBody ? { serializedWireBody } : {}),
12345
12503
  // Capture the new response id from the SSE stream so the
12346
12504
  // next call can thread it. If the backend skips the event
@@ -0,0 +1,226 @@
1
+ /**
2
+ * COORD-ENTRANCE-FOLD · 0.2.42 칸 · TASK-AGENT(OP 디스패처) — 셸 디스패처 은퇴 결정 카드.
3
+ *
4
+ * 배경: 대표 10-19 «중간층(런 닥터 r3·rework · 입구 디스패처)이 0.2.35 최우선 병목» ·
5
+ * seat-state/OP/PLAN-mid-tier-loops-2026-10-19.md §5.
6
+ *
7
+ * 판정 신호: 조율자 그림자가 ④ 빌더로 같은 칸·같은 지시서를 달력 기준 3일 연속
8
+ * 디스패치하면 «셸 디스패처 은퇴» 결정 카드를 기존 결정 원장(src/decisions/decision-ledger.ts,
9
+ * `decisions/decisions.jsonl`) 부가 형식 그대로 정확히 1장 올린다.
10
+ *
11
+ * 그림자 디스패치 원장(<root>/seat-state/OP/coordinator-shadow-dispatch.jsonl)은
12
+ * 조율자 그림자 디스패처가 한 줄씩 적는 JSONL 이다:
13
+ * {"date":"2026-03-02","agent":"builder-4","cell":"src/x/y.ts","directive":"DIR-123"}
14
+ * (별칭 허용: date=day · agent=target · cell=lane · directive=directiveId)
15
+ */
16
+ import { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs';
17
+ import { dirname, join } from 'node:path';
18
+ import { DecisionLedger } from '../../decisions/decision-ledger.js';
19
+ import { withFileLockSync } from '../../storage/file-lock.js';
20
+ import { findGitDir } from '../../git-fs/locate.js';
21
+
22
+ export interface CoordinatorShadowDispatch {
23
+ /** 달력 날짜(YYYY-MM-DD, 생산 기록은 UTC ISO 날짜). */
24
+ date: string;
25
+ /** 대상 에이전트(예: builder-4). */
26
+ agent: string;
27
+ /** 작업을 받은 과제 소유 seat (`tasks hand --seat`). */
28
+ recipient?: string;
29
+ /** 칸(대상 경로). */
30
+ cell: string;
31
+ /** 지시서 id. */
32
+ directive: string;
33
+ }
34
+
35
+ export interface CoordinatorShadowStreak {
36
+ agent: string;
37
+ recipient?: string;
38
+ cell: string;
39
+ directive: string;
40
+ /** 연속을 이룬 세 달력 날짜(직전2일·오늘, 오름차순). */
41
+ dates: [string, string, string];
42
+ }
43
+
44
+ export interface CoordinatorShadowTickOptions {
45
+ /** 저장소/worktree 루트 — 그림자 디스패치 원장 기준 경로. 생산 기본: cwd 트리. */
46
+ root?: string;
47
+ /** 결정 원장 stateDir. 생산 기본: elanousStateRoot(). */
48
+ stateDir?: string;
49
+ /** 시계 주입(생산: 실제 Date). */
50
+ now?: () => Date;
51
+ /** 원장 행 직접 주입(시험용 — 생산 호출 경로는 그대로 지나간다). */
52
+ dispatches?: CoordinatorShadowDispatch[];
53
+ }
54
+
55
+ export interface CoordinatorShadowTickResult {
56
+ /** 판정 기준일(YYYY-MM-DD). */
57
+ checked: string;
58
+ evidence: CoordinatorShadowStreak | null;
59
+ /** 올라간(또는 이미 있던) 결정 카드 id. */
60
+ cardId?: string;
61
+ /** 같은 스탬프(칸+지시서+마지막 날) 카드가 이미 있어 1장만 유지됐을 때. */
62
+ skipped?: 'duplicate';
63
+ }
64
+
65
+ /** 그림자 디스패치 원장 생산 기본 경로. */
66
+ export function coordinatorShadowJournalPath(root: string): string {
67
+ return join(root, 'seat-state', 'OP', 'coordinator-shadow-dispatch.jsonl');
68
+ }
69
+
70
+ /** Resolve the containing checkout when the CLI was started from a repository subdirectory. */
71
+ export function resolveCoordinatorShadowRoot(cwd = process.cwd()): string {
72
+ return findGitDir(cwd)?.root ?? cwd;
73
+ }
74
+
75
+ /** launcher가 work-order를 받아들인 뒤 그림자 근거만 덧붙인다. 발사 결정·인자는 읽거나 바꾸지 않는다. */
76
+ export function recordCoordinatorShadowDispatch(
77
+ root: string,
78
+ row: CoordinatorShadowDispatch,
79
+ ): void {
80
+ const path = coordinatorShadowJournalPath(root);
81
+ mkdirSync(dirname(path), { recursive: true });
82
+ withFileLockSync(`${path}.lock`, () => appendFileSync(path, `${JSON.stringify(row)}\n`));
83
+ }
84
+
85
+ /** ④ 빌더 판별 — «빌더④» «④빌더» «builder-4» «builder_4» «builder 4» «b4» 계열을 받는다. */
86
+ function fourthBuilderAgentKey(agent: string): string | null {
87
+ const key = agent.normalize('NFC').replace(/\s+/g, '').toLowerCase();
88
+ return /^(?:builder|b)[-_]?4$/.test(key) || /^④?빌더4$/.test(key) || key === '④빌더' || key === '빌더④'
89
+ ? 'builder-4'
90
+ : null;
91
+ }
92
+
93
+ export function isFourthBuilderAgent(agent: string): boolean {
94
+ return fourthBuilderAgentKey(agent) !== null;
95
+ }
96
+
97
+ function shiftDay(isoDay: string, delta: number): string {
98
+ const date = new Date(`${isoDay}T00:00:00Z`);
99
+ date.setUTCDate(date.getUTCDate() + delta);
100
+ return date.toISOString().slice(0, 10);
101
+ }
102
+
103
+ const DAY_PATTERN = /^\d{4}-\d{2}-\d{2}$/;
104
+
105
+ /**
106
+ * 조율자 그림자 디스패치 기록에서 오늘과 직전 2일치를 읽어,
107
+ * 대상이 ④ 빌더이고 칸·지시서가 같은 달력 기준 3일 연속인 모든 쌍을 반환한다.
108
+ * 연속 끊김(칸·지시서·대상이 다르거나 하루 무디스패치)이면 해당 streak 는 성립하지 않는다.
109
+ */
110
+ export function detectBuilderThreeDayStreak(
111
+ dispatches: readonly CoordinatorShadowDispatch[],
112
+ today: string,
113
+ ): CoordinatorShadowStreak | null {
114
+ return detectBuilderThreeDayStreaks(dispatches, today)[0] ?? null;
115
+ }
116
+
117
+ /** 오늘의 3일 창에서 모든 적격 (agent, cell, directive) 쌍을 돌려 각 쌍의 카드를 독립 판정한다. */
118
+ export function detectBuilderThreeDayStreaks(
119
+ dispatches: readonly CoordinatorShadowDispatch[],
120
+ today: string,
121
+ ): CoordinatorShadowStreak[] {
122
+ if (!DAY_PATTERN.test(today)) throw new Error(`calendar day required: ${today}`);
123
+ const window: [string, string, string] = [shiftDay(today, -2), shiftDay(today, -1), today];
124
+ const groups = new Map<string, { agent: string; recipient?: string; recipientDate?: string; cell: string; directive: string; days: Set<string> }>();
125
+ for (const row of dispatches) {
126
+ if (!row || typeof row.date !== 'string' || !DAY_PATTERN.test(row.date)) continue;
127
+ const builderKey = fourthBuilderAgentKey(String(row.agent ?? ''));
128
+ if (!builderKey) continue;
129
+ const recipient = typeof row.recipient === 'string' ? row.recipient : undefined;
130
+ const cell = String(row.cell ?? '');
131
+ const directive = String(row.directive ?? '');
132
+ if (!cell || !directive) continue;
133
+ const key = `${builderKey}\u0000${cell}\u0000${directive}`;
134
+ const group = groups.get(key) ?? { agent: row.agent, cell, directive, days: new Set<string>() };
135
+ if (recipient && window.includes(row.date as typeof window[number])
136
+ && (!group.recipientDate || row.date >= group.recipientDate)) {
137
+ group.recipient = recipient;
138
+ group.recipientDate = row.date;
139
+ }
140
+ group.days.add(row.date);
141
+ groups.set(key, group);
142
+ }
143
+ const keys = [...groups.keys()].sort();
144
+ return keys.flatMap(key => {
145
+ const group = groups.get(key)!;
146
+ return window.every(day => group.days.has(day))
147
+ ? [{ agent: group.agent, ...(group.recipient ? { recipient: group.recipient } : {}), cell: group.cell, directive: group.directive, dates: [...window] as [string, string, string] }]
148
+ : [];
149
+ });
150
+ }
151
+
152
+ function readDispatchJournal(path: string): CoordinatorShadowDispatch[] {
153
+ if (!existsSync(path)) return [];
154
+ const rows: CoordinatorShadowDispatch[] = [];
155
+ for (const line of readFileSync(path, 'utf8').split('\n')) {
156
+ if (!line.trim()) continue;
157
+ let raw: Record<string, unknown>;
158
+ try { raw = JSON.parse(line) as Record<string, unknown>; } catch { continue; }
159
+ // JSON.parse 가 성공하는 비객체 행(`null`·스칼라 등)도 파손 행이다 — 판독에서 건너뛴다.
160
+ if (typeof raw !== 'object' || raw === null) continue;
161
+ const date = raw.day ?? raw.date;
162
+ const agent = raw.target ?? raw.agent;
163
+ const recipient = raw.recipient ?? raw.seat;
164
+ const cell = raw.lane ?? raw.cell;
165
+ const directive = raw.directiveId ?? raw.directive;
166
+ if (typeof date === 'string' && typeof agent === 'string' && typeof cell === 'string' && typeof directive === 'string') {
167
+ rows.push({ date, agent, ...(typeof recipient === 'string' ? { recipient } : {}), cell, directive });
168
+ }
169
+ }
170
+ return rows;
171
+ }
172
+
173
+ /** «셸 디스패처 은퇴» 결정 카드의 영구 idempotency ref(같은 칸+지시서에는 한 장만). */
174
+ export function retirementCardStamp(evidence: CoordinatorShadowStreak): string {
175
+ return `coordinator-shadow-streak:${evidence.cell}:${evidence.directive}`;
176
+ }
177
+
178
+ /**
179
+ * 조율자 루프의 하루 틱 — 그림자 디스패치 3일 연속 판정 → 셸 디스패처 은퇴 결정 카드 1장.
180
+ * 카드는 기존 결정 원장(DecisionLedger.raise) 부가 형식 그대로 append 되고,
181
+ * 같은 3일 창에서 성립한 모든 칸+지시서 쌍을 각자 판정하고, 카드가 이미 있으면 재사용한다.
182
+ * (날짜가 바뀌어도 쌍마다 1장 유지).
183
+ */
184
+ export async function tick(options: CoordinatorShadowTickOptions = {}): Promise<CoordinatorShadowTickResult> {
185
+ const root = resolveCoordinatorShadowRoot(options.root ?? process.cwd());
186
+ const now = options.now ?? (() => new Date());
187
+ const dispatches = options.dispatches ?? readDispatchJournal(coordinatorShadowJournalPath(root));
188
+ const today = now().toISOString().slice(0, 10);
189
+ const evidences = detectBuilderThreeDayStreaks(dispatches, today);
190
+ const evidence = evidences[0] ?? null;
191
+ if (!evidence) return { checked: today, evidence: null };
192
+
193
+ const ledger = new DecisionLedger({ ...(options.stateDir ? { stateDir: options.stateDir } : {}), now, repoRoot: root });
194
+ const outcomes = evidences.map(item => {
195
+ const stamp = retirementCardStamp(item);
196
+ const alreadyRaised = ledger.list({ status: 'all' }).some(entry =>
197
+ Array.isArray(entry.refs) && entry.refs.includes(stamp));
198
+ const entry = ledger.raiseOnce({
199
+ title: `셸 디스패처 은퇴 — ${item.cell} × ${item.directive} 3일 연속`,
200
+ category: 'other',
201
+ scqa: {
202
+ s: '조율자 그림자가 ④ 빌더로 같은 칸·같은 지시서를 달력 기준 3일 연속 디스패치했다.',
203
+ c: '중간층 입구 디스패처가 같은 지시를 반복 산출하는 0.2.35 최우선 병목 신호가 실측됐다.',
204
+ q: '셸 디스패처를 은퇴시키고 입구를 조율자 그림자로 고정할까?',
205
+ a: '셸 디스패처 은퇴 결정 카드를 원장에 올리고 후속 조치를 연다.',
206
+ },
207
+ options: [
208
+ { key: 'a', label: '은퇴 승인', consequence: '입구 디스패처를 조율자 그림자로 고정하고 셸 디스패처를 은퇴시킨다' },
209
+ { key: 'b', label: '관찰 연장', consequence: '은퇴를 보류하고 3일 연속 판정 관찰을 계속한다' },
210
+ ],
211
+ recommendation: { option: 'a', why: '같은 칸·같은 지시서가 달력 기준 3일 연속 — 판정 신호 충족' },
212
+ raisedBy: { agent: 'orchestrator-tick', track: 'OP' },
213
+ refs: [
214
+ stamp,
215
+ `agent:${item.agent}`,
216
+ ...(item.recipient ? [`recipient:${item.recipient}`] : []),
217
+ `cell:${item.cell}`,
218
+ `directive:${item.directive}`,
219
+ `dates:${item.dates.join(',')}`,
220
+ ],
221
+ }, stamp);
222
+ return { evidence: item, cardId: entry.id, alreadyRaised };
223
+ });
224
+ return { checked: today, evidence, cardId: outcomes[0]!.cardId,
225
+ ...(outcomes.every(outcome => outcome.alreadyRaised) ? { skipped: 'duplicate' as const } : {}) };
226
+ }
@@ -1062,6 +1062,13 @@ export async function degradationDeps(node: Node, deps: { config?: () => Partial
1062
1062
  return mode === 'live' ? { degradation: () => ({ llm: signal.llm, board: signal.board }) } : {};
1063
1063
  }
1064
1064
 
1065
+ // COORD-ENTRANCE-FOLD (0.2.42 칸 · TASK-AGENT OP 디스패처) — 조율자 루프 하루 틱 생산 진입이
1066
+ // tick() 을 호출하게 배선한다: 그림자 디스패치(날짜·대상 에이전트·칸·지시서 id)에서 ④ 빌더
1067
+ // 같은 칸·같은 지시서 달력 기준 3일 연속을 감지하면 «셸 디스패처 은퇴» 결정 카드를 기존 결정
1068
+ // 원장(DecisionLedger) 부가 형식 그대로 1장 적는다(같은 스탬프=칸+지시서 중복 방지).
1069
+ // 구현 본체: src/loops/orchestrator/coordinator-shadow.ts · 완료 경계 시험: tick.test.ts.
1070
+ import { tick as runCoordinatorShadowTick } from './coordinator-shadow.js';
1071
+
1065
1072
  if (import.meta.main) {
1066
1073
  const node = process.argv[2];
1067
1074
  const index = process.argv.indexOf('--window');
@@ -1078,6 +1085,12 @@ if (import.meta.main) {
1078
1085
  void (async () => {
1079
1086
  try { await (await import('../../domains/standalone-log-sink.js')).registerStandaloneLogSink('orchestrator'); }
1080
1087
  catch { /* local execution can still use the per-run file */ }
1088
+ // 관측(그림자 틱)은 본 루프를 봉쇄할 수 없다: 파손 원장 등으로 reject 하면 원인만 warn 로그로 남기고 본 노드 실행은 계속한다.
1089
+ try { await runCoordinatorShadowTick({}); }
1090
+ catch (error) {
1091
+ try { debug.log('loop.orchestrator', 'coordinator-shadow-tick-failed', { node, error: String(error).slice(0, 200) }, { level: 'warn' }); }
1092
+ catch { /* even the diagnostic sink must not block the node */ }
1093
+ }
1081
1094
  await runOrchestratorNode(node as Node, { window: window as Window | undefined, ...await degradationDeps(node as Node) });
1082
1095
  })().catch(error => { console.error(`orchestrator ${node}: ${String(error)}`); process.exitCode = 1; });
1083
1096
  }
@@ -77,7 +77,7 @@ export const FEATURE_MATURITY = {
77
77
  'provider:rotate': 'beta', 'provider:use': 'beta', 'status-bar': 'beta',
78
78
  schedule: 'beta', guardian: 'beta', intake: 'beta', logs: 'stable', retro: 'beta', ad: 'beta', docs: 'beta',
79
79
  decisions: 'beta', directives: 'beta', claims: 'beta', lesson: 'beta', fleet: 'beta', ops: 'stable', outputs: 'beta', publish: 'beta',
80
- env: 'beta', 'agent-mission': 'beta', dev: 'beta', keys: 'beta', finance: 'beta',
80
+ env: 'beta', 'agent-mission': 'beta', mission: 'beta', dev: 'beta', keys: 'beta', finance: 'beta',
81
81
  config: 'stable', tasks: 'stable', brief: 'beta', notify: 'beta', away: 'beta', labels: 'beta', msg: 'beta', ask: 'stable',
82
82
  onboarding: 'beta', login: 'stable', session: 'beta', chat: 'stable', repl: 'stable',
83
83
  agent: 'stable', registry: 'beta', tier: 'stable', local: 'beta', scheduler: 'beta',
@@ -676,8 +676,8 @@ export const nativeToolCatalog: NativeToolCatalogEntry[] = [
676
676
  kind: 'execute',
677
677
  aliases: ['SkillExec', 'skill_exec'],
678
678
  displayName: 'SkillExec',
679
- description: 'Execute one explicitly named allowlisted skill with the supplied task. If you do not know the exact skill name, call elanous_skills_list first. Does not infer a skill name.',
680
- promptSummary: '`SkillExec(skill, task)` (execute an explicitly named allowlisted skill; call elanous_skills_list first when its exact name is unknown)',
679
+ description: 'Execute one explicitly named allowlisted skill with the supplied task. Names may omit spaces or punctuation (for example, "krflow" resolves to "kr-flow") only when the installed match is unique. Call elanous_skills_list when uncertain.',
680
+ promptSummary: '`SkillExec(skill, task)` (resolve omitted spaces or punctuation only when the installed skill name is unique; call elanous_skills_list when uncertain)',
681
681
  host: ['skill', 'tui', 'mcp'],
682
682
  safety: ['process'],
683
683
  supportsParallel: false,