elanous 0.2.40 → 0.2.41

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 (558) 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 → GiOLWmt4MqDZePubBjA4Q}/_buildManifest.js +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1115.434ae2ecb0ad986d.js +149 -0
  6. package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +36 -0
  7. package/apps/pwa/out/_next/static/chunks/{9184.45afbf44fec87574.js → 1178.1aa9cad0e7695427.js} +1 -1
  8. package/apps/pwa/out/_next/static/chunks/{2829-734fe8bf2eee7347.js → 1197-54da59d250a6e476.js} +1 -1
  9. package/apps/pwa/out/_next/static/chunks/{6749.0744ce6eb08d40e9.js → 1219.7e17964e0e7cd8e5.js} +3 -3
  10. package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +287 -0
  11. package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1661.0dd330f3d89f73f3.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +90 -0
  16. package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/1765.679b29625c8e88d4.js +77 -0
  18. package/apps/pwa/out/_next/static/chunks/{2226.2cf61ec781827219.js → 1800.f7ff51dc4978a958.js} +2 -2
  19. package/apps/pwa/out/_next/static/chunks/1971-7efb628c471dc5a0.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/{9175.2de5209a5ce6f68a.js → 2073.689dcb2680113d76.js} +1 -1
  22. package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/{5383.bdfa5d886e39a826.js → 2263.e09b6edea33bad2d.js} +1 -1
  25. package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2527-5c636a43c7cc5dde.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/{9069.657590a84afb8fac.js → 2743.5d3f76948be32b34.js} +2 -2
  31. package/apps/pwa/out/_next/static/chunks/{6624.981ef7caeb680560.js → 2773.0e80b9d325fb5635.js} +2 -2
  32. package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/{4864a2ca.1c1c280a7772c5e5.js → 2fdf2931.b431eee4fb468bc3.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/{9189505a.980427ac048c8c60.js → 2fe2c302.41b517f88d6fe502.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/{9992.07ce73c10bd5e6a1.js → 3097.864e92bdaa2f4d15.js} +2 -2
  36. package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3230-49298c3b73ef2268.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +74 -0
  41. package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{b84cad00.594027ebe0531fe2.js → 385e4574.e9886ab32759eda3.js} +3 -3
  46. package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4133.2056bb4d78f621af.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/{8086.1ab9103c41be884f.js → 4156.ba4de4a3664f04b4.js} +1 -1
  50. package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +148 -0
  53. package/apps/pwa/out/_next/static/chunks/{1281.d81877e35b9068f4.js → 4527.a69f2894d1bc9f4a.js} +1 -1
  54. package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +226 -0
  55. package/apps/pwa/out/_next/static/chunks/{8357.1aaa713b052a78b1.js → 4667.97e31aa38c95c475.js} +4 -4
  56. package/apps/pwa/out/_next/static/chunks/{5436.fdf6fa8ae3e9588d.js → 4702.4a4adc1f16d7c93b.js} +1 -1
  57. package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +94 -0
  64. package/apps/pwa/out/_next/static/chunks/{4769.9fd582071301f382.js → 5159.115f1c2ca471386c.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/530.d26346e18089640a.js +115 -0
  67. package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +8 -0
  68. package/apps/pwa/out/_next/static/chunks/{d8de0de2-dd0f4ac8e5ab1832.js → 53aeb4ee-51c92f8d683f5220.js} +1 -1
  69. package/apps/pwa/out/_next/static/chunks/{6257.c0037b8949239f5e.js → 5471.1e611302ed3a7c53.js} +2 -2
  70. package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/{2566.beaffc3a5e1fcd2e.js → 5574.f35accf4f132b29d.js} +1 -1
  73. package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +24 -0
  74. package/apps/pwa/out/_next/static/chunks/{2066.a77257c8c350770a.js → 5744.b9415e18ad623100.js} +1 -1
  75. package/apps/pwa/out/_next/static/chunks/5892.2526d962339662d8.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/{4351.0f37a6db2b34d50b.js → 5937.c2df9e3447e1f667.js} +1 -1
  77. package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +286 -0
  78. package/apps/pwa/out/_next/static/chunks/{6051-0ae955eedb10adb9.js → 5947-135e26537d80a6b9.js} +3 -3
  79. package/apps/pwa/out/_next/static/chunks/{3746-f80a78f220bf37b5.js → 5964-7e21164a8f2cf0ce.js} +1 -1
  80. package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +27 -0
  84. package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/6552.a3840aa7da35ad68.js +62 -0
  86. package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +24 -0
  87. package/apps/pwa/out/_next/static/chunks/{2047.8f23e210995d4548.js → 6874.d5cf7eb8edb2cabe.js} +2 -2
  88. package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +122 -0
  90. package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7191.fdc955f7d96064a4.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/{8272-025653884f9645d2.js → 8050-9b364bdef8f71927.js} +1 -1
  99. package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/83184dcd-0ee6247ff41eb3f2.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +104 -0
  103. package/apps/pwa/out/_next/static/chunks/{2281-b8cede695c6c650e.js → 8464-e24f10451b658aac.js} +1 -1
  104. package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/{5622.94893f5aea7185d0.js → 8880.64c445592f04acaf.js} +1 -1
  108. package/apps/pwa/out/_next/static/chunks/{1452.162bb2d9d699e82a.js → 8981.c706964c8ba27aff.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/{470.51a72a2348306455.js → 9048.212083de42d25be3.js} +2 -2
  110. package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/{2177.df8547f9d7215c4e.js → 9507.7026657a2f47eb64.js} +16 -16
  117. package/apps/pwa/out/_next/static/chunks/9541.eb8e2f8480c7feca.js +93 -0
  118. package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/{7515.1ad6efe157fa4448.js → 9579.4a8169600fff2058.js} +1 -1
  120. package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +34 -0
  123. package/apps/pwa/out/_next/static/chunks/{2499.02fbfd18126c10c0.js → 9834.63ab2bbc3153172e.js} +1 -1
  124. package/apps/pwa/out/_next/static/chunks/9869.81a1e24ca682d5a0.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/{409c787b.e48c5bec8ec10456.js → a0a01613.6d1cca322238d7fe.js} +1 -1
  126. package/apps/pwa/out/_next/static/chunks/{6cc1d1d6.9a98dd4622f1afc6.js → addc2b32.8c4ff8f0aefe987d.js} +1 -1
  127. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-ba957ff875a026a0.js → page-14949db884bfa672.js} +1 -1
  132. package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-40f9e19149024298.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a142dfb0331a05f5.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/{c696986b.5dc8bb1143af16d1.js → b2271e54.c1de3347976e90b0.js} +1 -1
  179. package/apps/pwa/out/_next/static/chunks/{ca3702f8.2913182e73889fa2.js → c0c1a699.0ba79f97005965d4.js} +1 -1
  180. package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +1 -0
  184. package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +1 -0
  185. package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +1 -0
  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 +22 -22
  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 +21 -21
  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 +22 -22
  223. package/apps/pwa/out/live-run/index.html +1 -1
  224. package/apps/pwa/out/live-run/index.txt +22 -22
  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/graphs/demo/persona-teacher/lesson-pack.yaml +16 -0
  283. package/graphs/demo/persona-teacher/recipes.yaml +17 -0
  284. package/graphs/demo/persona-teacher/weekly-lesson.yaml +36 -0
  285. package/graphs/overlays/stop-heal-ladder.yaml +23 -2
  286. package/graphs/release/release-loop.yaml +3 -1
  287. package/graphs/units/gate/gate.yaml +20 -0
  288. package/graphs/units/git/git.yaml +26 -0
  289. package/graphs/units/implement/implement.yaml +19 -0
  290. package/graphs/units/landing/landing.yaml +18 -0
  291. package/graphs/units/review/review.yaml +20 -0
  292. package/graphs/units/verbs/recipes.yaml +3 -0
  293. package/graphs/units/verbs/research.yaml +20 -0
  294. package/graphs/work/research-report.yaml +11 -1
  295. package/package.json +1 -1
  296. package/scripts/disk-steward.ts +46 -0
  297. package/scripts/fleet/node-setup.sh +50 -0
  298. package/scripts/graph-units/verbs/research.ts +55 -0
  299. package/scripts/llm-cost-ledger.ts +179 -8
  300. package/scripts/measure-nl-routing-corpus.ts +10 -2
  301. package/scripts/persona-teacher/weekly-lesson-node.ts +172 -0
  302. package/scripts/public-copy-lint.ts +163 -19
  303. package/scripts/ratchets/train-side-invariants.sh +0 -1
  304. package/scripts/release-loop/gate-autoheal.ts +117 -0
  305. package/scripts/release-loop/gate-baseline-receipt.ts +8 -1
  306. package/scripts/release-loop/gate-diff.ts +22 -3
  307. package/scripts/release-loop/gate-node.ts +205 -17
  308. package/scripts/release-loop/gate-shard-load-flaky.ts +256 -0
  309. package/scripts/release-loop/gate-triage-node.ts +70 -10
  310. package/scripts/release-loop/resume-release.ts +247 -15
  311. package/scripts/release-loop/traffic-node.ts +6 -3
  312. package/scripts/release-loop/unattended-release.ts +4 -2
  313. package/scripts/shadow-authoring-probe.ts +20 -0
  314. package/scripts/ux-sim.ts +19 -2
  315. package/src/acp/core-turn-bridge.ts +86 -4
  316. package/src/agent-substrate/self-review-cli.ts +91 -29
  317. package/src/auto-research/research-turn.ts +10 -1
  318. package/src/autopilot/discovery/wiki-claim-proposer.ts +22 -1
  319. package/src/boot/daemon-tools/self-implement.ts +46 -9
  320. package/src/budget/shadow-arms.ts +52 -0
  321. package/src/chat/pickers/state.ts +7 -1
  322. package/src/cli/log-event-names.ts +5 -0
  323. package/src/cli/mcp-login.ts +8 -18
  324. package/src/cli/msg-cli.ts +57 -1
  325. package/src/cli/pr-land-heavy-remote.ts +15 -9
  326. package/src/cli/release-cli.ts +27 -1
  327. package/src/cli/sim-cli.ts +7 -1
  328. package/src/cli/tasks-cli.ts +5 -4
  329. package/src/codex/models.ts +30 -15
  330. package/src/core-turn/run-core-turn.ts +3 -0
  331. package/src/core-turn/run-goal-loop.ts +88 -2
  332. package/src/dashboard/acp-boot.ts +72 -3
  333. package/src/dashboard/index.ts +6 -0
  334. package/src/dashboard/turn-preamble.ts +12 -1
  335. package/src/disk-steward/judge.ts +73 -0
  336. package/src/disk-steward/ledger.ts +122 -0
  337. package/src/disk-steward/steward.ts +373 -0
  338. package/src/domains/guardian-tick.ts +191 -2
  339. package/src/graph-runner/graph-cli.ts +21 -0
  340. package/src/graph-runner/in-process-registry.ts +37 -0
  341. package/src/graph-runner/runner.ts +33 -3
  342. package/src/grounding/ref-index.ts +19 -0
  343. package/src/grounding/sources-cli.ts +9 -1
  344. package/src/harness/harness-cli-command.ts +267 -14
  345. package/src/harness/harness-incidents.ts +312 -7
  346. package/src/harness/harness-space.ts +15 -1
  347. package/src/harness/progress-worker-entry.ts +59 -0
  348. package/src/harness/progress-worker-runtime.ts +11 -0
  349. package/src/index.ts +18 -2
  350. package/src/instance/dev-project.ts +25 -0
  351. package/src/intelligence-map/model-alias.ts +6 -5
  352. package/src/intelligence-map/model-catalog.ts +59 -2
  353. package/src/llm/model-defaults.ts +4 -4
  354. package/src/llm.ts +42 -11
  355. package/src/loops/orchestrator/tick.ts +48 -0
  356. package/src/mcp/mcp-oauth.ts +3 -1
  357. package/src/model-tier/llm-tier-map.ts +9 -9
  358. package/src/model-tier/turn-tier.ts +1 -1
  359. package/src/msg/msg-mirror-github.ts +80 -0
  360. package/src/msg/msg-mirror-policy.ts +61 -0
  361. package/src/msg/msg-mirror-runner.ts +219 -0
  362. package/src/msg/msg-mirror-state.ts +33 -0
  363. package/src/msg/msg-store.ts +11 -0
  364. package/src/output-truncation.ts +41 -12
  365. package/src/project/project-store.ts +48 -1
  366. package/src/release-loop/gate-host-reservation.ts +144 -0
  367. package/src/release-loop/release-schedule.ts +90 -1
  368. package/src/research/bloom-exemplars.ts +135 -0
  369. package/src/self-dev/ask-launch-flow.ts +39 -25
  370. package/src/self-dev/dev-cli.ts +17 -17
  371. package/src/self-dev/graph-front-nodes.ts +23 -0
  372. package/src/self-dev/launch-preflight.ts +9 -4
  373. package/src/self-dev/orchestrate.ts +15 -0
  374. package/src/self-dev/run-supervisor.ts +185 -3
  375. package/src/self-dev/run-types.ts +3 -0
  376. package/src/self-implement/gate-artifacts.ts +13 -0
  377. package/src/self-implement/gate-cli.ts +54 -24
  378. package/src/self-implement/gate-remote.ts +23 -5
  379. package/src/self-implement/goal-author-clarification.ts +31 -12
  380. package/src/self-implement/goal-author.ts +77 -5
  381. package/src/self-implement/graph-stage-units.ts +172 -0
  382. package/src/self-implement/graph-templates.ts +162 -1
  383. package/src/self-implement/graph-variant.ts +37 -4
  384. package/src/self-implement/host-regate.ts +4 -4
  385. package/src/self-implement/knowhow-pack.ts +38 -0
  386. package/src/self-implement/orchestrator.ts +235 -21
  387. package/src/self-implement/run-ledger.ts +64 -6
  388. package/src/self-implement/run-stop.ts +21 -2
  389. package/src/self-implement/running-runs.ts +35 -12
  390. package/src/self-implement/self-implement-cli.ts +36 -4
  391. package/src/self-implement/stop-autoheal-operational.ts +43 -0
  392. package/src/self-implement/stop-autoheal.ts +15 -6
  393. package/src/session/chat.ts +31 -54
  394. package/src/session/request-size-guard.ts +123 -0
  395. package/src/sidetab-core/model.ts +136 -0
  396. package/src/task-agent/parent-host.ts +14 -1
  397. package/src/task-agent/task-hand.ts +4 -1
  398. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +43 -0
  399. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +29 -4
  400. package/src/task-orchestrator/surfaces/self-implement-pod.ts +116 -16
  401. package/src/task-orchestrator/surfaces/self-implement.ts +18 -0
  402. package/src/tui/entry.ts +10 -3
  403. package/src/tui/sidetab/list.ts +45 -0
  404. package/src/tui/sidetab/nl-tool.ts +2 -136
  405. package/src/tui/sidetab/peek.ts +52 -0
  406. package/src/tui-client/dashboard-session.ts +3 -0
  407. package/src/user-config.ts +11 -5
  408. package/src/ux-sim/fault-needs-human-reason-repair.ts +107 -0
  409. package/src/ux-sim/fault-pod-child-result.ts +42 -0
  410. package/src/ux-sim/release-sim-rig.ts +262 -0
  411. package/src/ux-sim/seminar-rehearsal.ts +109 -0
  412. package/src/ux-sim/subagent-tools-device.ts +2 -2
  413. package/src/version/packed-revision.json +1 -1
  414. package/apps/pwa/out/_next/static/chunks/1060.014f1f01a17aec26.js +0 -115
  415. package/apps/pwa/out/_next/static/chunks/1350.59f40e39e02d91b1.js +0 -1
  416. package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +0 -1
  417. package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +0 -286
  418. package/apps/pwa/out/_next/static/chunks/1537-6bb97b5214928ea9.js +0 -1
  419. package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +0 -149
  420. package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +0 -1
  421. package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +0 -90
  422. package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +0 -104
  423. package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +0 -1
  424. package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +0 -1
  425. package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +0 -1
  426. package/apps/pwa/out/_next/static/chunks/2522.f2766b76d22c8bdf.js +0 -34
  427. package/apps/pwa/out/_next/static/chunks/261.0d471e8aded799f3.js +0 -226
  428. package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +0 -1
  429. package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +0 -1
  430. package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +0 -27
  431. package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +0 -1
  432. package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +0 -1
  433. package/apps/pwa/out/_next/static/chunks/2774-719820e3f5b2a3eb.js +0 -1
  434. package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +0 -1
  435. package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +0 -1
  436. package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +0 -1
  437. package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +0 -1
  438. package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +0 -1
  439. package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +0 -1
  440. package/apps/pwa/out/_next/static/chunks/3330.7443183b7e6fdbdf.js +0 -1
  441. package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +0 -1
  442. package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +0 -1
  443. package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +0 -24
  444. package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +0 -77
  445. package/apps/pwa/out/_next/static/chunks/3b355b3d.6f73c98bf6f9c749.js +0 -122
  446. package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +0 -36
  447. package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +0 -1
  448. package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +0 -1
  449. package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +0 -287
  450. package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +0 -1
  451. package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +0 -1
  452. package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +0 -1
  453. package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +0 -1
  454. package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +0 -1
  456. package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +0 -74
  457. package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +0 -1
  458. package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +0 -8
  461. package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +0 -62
  463. package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +0 -1
  465. package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +0 -94
  467. package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +0 -1
  468. package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +0 -1
  472. package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/6908.06008c67f6380ea9.js +0 -148
  477. package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +0 -1
  479. package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/7219-15bdd9a80661af8e.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +0 -93
  482. package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +0 -24
  485. package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +0 -1
  486. package/apps/pwa/out/_next/static/chunks/7611.85f045bf232053ac.js +0 -1
  487. package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/8099.1cccf31c1baa7e1c.js +0 -1
  490. package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +0 -1
  493. package/apps/pwa/out/_next/static/chunks/8639-92c11d069792429e.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/8d173e38.18a2f7b4e1848bdb.js +0 -1
  496. package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +0 -1
  508. package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +0 -1
  510. package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +0 -1
  513. package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +0 -1
  517. package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/app/live/page-4edb8df90f4537ce.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/app/live-run/page-83d27757e2b8060a.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/app/morning/page-fca2e59a81744d9e.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +0 -1
  525. package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +0 -1
  527. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/app/term/page-139d722de1dcd6c1.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/app/workspace/page-ccde99f07aaf71f7.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +0 -1
  557. package/scripts/ratchets/next-tui-entry-budget.ts +0 -124
  558. /package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → GiOLWmt4MqDZePubBjA4Q}/_ssgManifest.js +0 -0
@@ -70,7 +70,10 @@ export function recordPodSourceIoSummary(logs: string, job: string, runId: strin
70
70
  if (!ioSummary) return;
71
71
  try {
72
72
  const measured = JSON.parse(ioSummary) as Record<string, unknown>;
73
- log('pod.source', 'io-summary', { job, runId, runIdSource, ...measured, hostOriginCalls });
73
+ const pushCounterReady = /^ELANOUS_POD_GIT_PUSH_COUNTER ready\r?$/m.test(logs);
74
+ const pushCalls = (logs.match(/^ELANOUS_POD_GIT_PUSH_ATTEMPT\r?$/gm) ?? []).length;
75
+ log('pod.source', 'io-summary', { job, runId, runIdSource, ...measured, hostOriginCalls,
76
+ ...(pushCounterReady ? { pushCalls } : {}) });
74
77
  } catch (error) {
75
78
  log('pod.source', 'io-summary-invalid', { job, runId, runIdSource, reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' });
76
79
  }
@@ -137,7 +140,7 @@ import { ZAI_POD_EGRESS_LABEL, checkZaiPodSecret, countActiveZaiJobs, decideZaiP
137
140
  import { ZAI_CODING_DEFAULT_MODEL, ZAI_OPENROUTER_FALLBACK_MODEL, zaiSettingsFromConfig, type ZaiCodingPlanSettings } from '../../llm/zai-coding-plan.js';
138
141
  import { normalizePlanningFallbackReason, selectEnhanceLlm } from '../../prompt-enhance/enhance.js';
139
142
  import { inferProviderFromModel } from '../../llm.js';
140
- import { classifyPodExit, extractPodFailureReason, podChildFailureAttribution, podDeadlineResultMarker, podJobConditionReason, podTerminalRow, POD_TERMINATION_JOB_JSONPATH, POD_TERMINATION_PODS_JSONPATH, readPodTermination, type PodExitClass, type PodTermination } from './pod-failure-reason.js';
143
+ import { classifyPodExit, extractPodFailureReason, podChildEvidenceLedgerRow, podChildFailureAttribution, podDeadlineResultMarker, podJobConditionReason, podTerminalRow, POD_TERMINATION_JOB_JSONPATH, POD_TERMINATION_PODS_JSONPATH, readPodTermination, type PodExitClass, type PodTermination } from './pod-failure-reason.js';
141
144
  import { kubectlTransientReason, retryKubectlTransient } from './kubectl-transient-retry.js';
142
145
  import { OLD_DOOR_STAMP_ENV } from '../../self-dev/old-door.js';
143
146
  import { resolveDefaultSourceHead, seedMirrorOnce, type MirrorSeedResult } from './pod-mirror-seed.js';
@@ -771,9 +774,10 @@ export function podGitPushGuardScript(runId?: string): string {
771
774
  ' *) echo "[pod] git-guard: refused push to $rref (only this run\'s branches)" >&2; exit 1 ;;',
772
775
  ' esac',
773
776
  'done',
777
+ 'case "$2" in https://github.com/*|http://github.com/*|git@github.com:*|ssh://git@github.com/*) printf \'ELANOUS_POD_GIT_PUSH_ATTEMPT\\n\' >&2 ;; esac',
774
778
  'exit 0',
775
779
  'ELANOUS_PRE_PUSH',
776
- `chmod 755 "${POD_GIT_HOOKS_DIR}/pre-push" && git config --global core.hooksPath "${POD_GIT_HOOKS_DIR}"`,
780
+ `chmod 755 "${POD_GIT_HOOKS_DIR}/pre-push" && git config --global core.hooksPath "${POD_GIT_HOOKS_DIR}" && printf 'ELANOUS_POD_GIT_PUSH_COUNTER ready\\n'`,
777
781
  ].join('\n');
778
782
  }
779
783
 
@@ -1604,19 +1608,42 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
1604
1608
  }
1605
1609
  if (options.siWarmAttempt) {
1606
1610
  const done = (async (): Promise<SelfImplementJobDone> => {
1611
+ // POD-REUSE-REQUEST-CLEAN-FU — one fail-soft row per request decision. `runId` is the
1612
+ // ledger partition (warm child, then parent run, then the legacy spaceId fallback);
1613
+ // `correlationId` always names the request's spaceId. `warm-path-selected` is recorded
1614
+ // before transport, so only the later return/quarantine row settles whether reuse completed.
1615
+ // A ledger write failure is an observation failure only.
1616
+ const recordWarmRequestDecision = (data: Record<string, unknown>, runId?: string) => {
1617
+ const parentRunId = env.ELANOUS_RUN_ID;
1618
+ const ledgerRunId = runId ?? parentRunId ?? input.spaceId;
1619
+ const runIdSource = runId ? 'warm-child-run' : parentRunId ? 'parent-run' : 'space-id-fallback';
1620
+ try { writeWarmLedger({ runId: ledgerRunId, event: 'pod-reuse-request-decision',
1621
+ data: { ...data, correlationId: input.spaceId, runIdSource } }); }
1622
+ catch (error) { debug.log('pod.reuse', 'ledger-unavailable', { spaceId: input.spaceId,
1623
+ event: 'pod-reuse-request-decision',
1624
+ reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' }); }
1625
+ };
1607
1626
  let attempt: SiWarmChildAttempt;
1608
1627
  try {
1609
1628
  const acquired = await options.siWarmAttempt!(input);
1610
1629
  if (!acquired) {
1611
1630
  // No lease was fenced: use the existing one-shot Job path.
1631
+ recordWarmRequestDecision({ spaceId: input.spaceId, outcome: 'cold-job',
1632
+ workerId: null, leaseId: null, generation: null, podUid: null });
1612
1633
  const { siWarmAttempt: _unused, siWarmHostPostprocess: _postprocess, ...coldOptions } = options;
1613
1634
  return podSelfImplementSpawn(coldOptions)(input).done;
1614
1635
  }
1615
1636
  attempt = acquired;
1637
+ recordWarmRequestDecision({ spaceId: input.spaceId, outcome: 'warm-path-selected',
1638
+ workerId: acquired.command?.workerId ?? null, leaseId: acquired.command?.leaseId ?? null,
1639
+ generation: acquired.command?.generation ?? null, podUid: acquired.command?.podUid ?? null },
1640
+ acquired.command?.runId);
1616
1641
  }
1617
1642
  catch (error) {
1618
1643
  // A lost exec reply may conceal an already opened PR. Never start another child here.
1619
1644
  const message = error instanceof Error ? error.message : String(error);
1645
+ recordWarmRequestDecision({ spaceId: input.spaceId, outcome: 'acquire-failed', reason: message,
1646
+ workerId: null, leaseId: null, generation: null, podUid: null });
1620
1647
  debug.log('pod.reuse', 'attempt-unavailable', { spaceId: input.spaceId, reason: message }, { level: 'warn' });
1621
1648
  return { exitCode: 1, output: '', error: { code: 'si-warm-reconcile-only', message } };
1622
1649
  }
@@ -1985,7 +2012,8 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
1985
2012
  return 'pool-slot-unavailable';
1986
2013
  };
1987
2014
  const recordSlotObservation = (attempt: { observationKey: string; requestedAtMs: number; requestedAt: string },
1988
- outcome: 'requested' | 'queued' | 'admitted' | 'rejected', reasonCode: string): void => {
2015
+ outcome: 'requested' | 'queued' | 'admitted' | 'rejected', reasonCode: string,
2016
+ cancellation?: { abortReason?: string; waitReason: string | null }): void => {
1989
2017
  const pool = options.pool;
1990
2018
  let occupants: Record<string, number> | null = null;
1991
2019
  try { occupants = pool ? pool.snapshot() : null; } catch { /* observation must not change scheduling */ }
@@ -1994,6 +2022,8 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
1994
2022
  observationKey: attempt.observationKey, runId: childRunId, host: resolveHostId(env),
1995
2023
  requestedAt: attempt.requestedAt, waitedMs: Math.max(0, slotNow() - attempt.requestedAtMs),
1996
2024
  queued: outcome === 'queued', poolCapacity, occupants, reasonCode, parentId: ledgerRunId, outcome,
2025
+ ...(cancellation ? { waitReason: cancellation.waitReason,
2026
+ ...(cancellation.abortReason === undefined ? {} : { abortReason: cancellation.abortReason }) } : {}),
1997
2027
  };
1998
2028
  debug.log('pod.slot', outcome, data, { level: outcome === 'admitted' || outcome === 'requested' ? 'info' : 'warn' });
1999
2029
  try {
@@ -2045,6 +2075,7 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
2045
2075
  const attempt = { observationKey: `${childRunId}:pod-slot:${requestedAtMs}:${++slotAttemptNumber}`,
2046
2076
  requestedAtMs, requestedAt: new Date(requestedAtMs).toISOString() };
2047
2077
  let firstSlotReasonCode: string | undefined;
2078
+ stageReason['pool-slot'] = null;
2048
2079
  let slotQueuedRecorded = false;
2049
2080
  const stop = watchStall('pool-slot');
2050
2081
  // MINIH-MODE (0.2.37): the location is declared by the launch env — absent/unknown keeps the configured
@@ -2110,7 +2141,10 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
2110
2141
  let member: PodPoolMember | null;
2111
2142
  try { member = await acquireSlot(); } catch (error) { podAdmitError(error); throw error; }
2112
2143
  if (options.pool && !member) {
2113
- if (lastSlotAttempt) recordSlotObservation(lastSlotAttempt, 'rejected', lastSlotReasonCode ?? 'aborted');
2144
+ if (lastSlotAttempt) recordSlotObservation(lastSlotAttempt, 'rejected', lastSlotReasonCode ?? 'aborted', {
2145
+ waitReason: stageReason['pool-slot'] ?? null,
2146
+ ...(typeof input.signal?.reason === 'string' ? { abortReason: input.signal.reason } : {}),
2147
+ });
2114
2148
  exitJourneyNode('pool-admit', { provenance: 'self-implement-pod', outcome: 'refused', data: { spaceId: input.spaceId, reason: 'no-slot' } });
2115
2149
  return { exitCode: null, output: '', error: { code: 'aborted', message: 'aborted before a pool slot opened', ...(lastSlotReasonCode ? { reasonCode: lastSlotReasonCode } : {}) } };
2116
2150
  }
@@ -3005,7 +3039,8 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3005
3039
  }
3006
3040
  }
3007
3041
  try {
3008
- appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-child-run', data: { childRunId: liveChildRunId, job: name, attempt: oomRetried ? 2 : 1, ...(goalFile ? { goalFile } : {}) } }, ledgerDir);
3042
+ appendRunLedgerEntry({ runId: ledgerRunId, timestamp: new Date((options.now ?? Date.now)()).toISOString(),
3043
+ event: 'pod-child-run', data: { childRunId: liveChildRunId, job: name, attempt: oomRetried ? 2 : 1, ...(goalFile ? { goalFile } : {}) } }, ledgerDir);
3009
3044
  appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-job-applied', data: { job: name, childRunId: liveChildRunId, jobUid: lifecycleJobUid, host: member?.sshHost ?? resolveHostId(env), context, namespace } }, ledgerDir);
3010
3045
  if (lastPlacement) appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-placement', data: { job: name, childRunId: liveChildRunId, attempt: oomRetried ? 2 : 1, member: lastPlacement.member, kind: lastPlacement.kind, outcome: lastPlacement.outcome, preferred: lastPlacement.preferred, reason: lastPlacement.reason } }, ledgerDir);
3011
3046
  appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-memory-selected', data: { job: name, childRunId: liveChildRunId, attempt: oomRetried ? 2 : 1, limit: memoryLimit, ...(appliedMemoryRequest ? { request: appliedMemoryRequest } : {}), tier: oomRetried ? retryTier : memoryTier, source: oomRetried ? 'oom-retry' : memorySource, reason: oomRetried ? 'OOMKilled' : memoryReason, declaredGoalType: selectedGoalType } }, ledgerDir);
@@ -3181,8 +3216,8 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3181
3216
  if (seen !== null) {
3182
3217
  releaseAdmission?.observed?.();
3183
3218
  state = seen === 0 ? 'complete' : 'failed';
3184
- // The child's own rc (the Pod's terminated state may lag like the condition) — exit-code paths read it as before.
3185
- if (seen !== 0) containerExitCode = seen;
3219
+ // The child's own rc is the parent's exit code even when 0 — the condition path below yields none here.
3220
+ containerExitCode = seen;
3186
3221
  if (seen !== 0) podTermination = readPodTermination({ kubectl, namespace, job: name, path: 'result-marker', jobUid: lifecycleJobUid });
3187
3222
  if (seen !== 0) captureFailedJob(liveChildRunId);
3188
3223
  debug.log('self-implement.pod', 'result-marker-early', { job: name, waitedMs: Date.now() - waitStartedAt, rc: seen });
@@ -3498,12 +3533,57 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3498
3533
  // exitCode stays null when the container's code was not read (never filled in as 0).
3499
3534
  const finishedRow = { job: name, run: launchRunId, ...(liveChildRunId !== launchRunId ? { childRun: liveChildRunId } : {}),
3500
3535
  attempt: oomRetried ? 2 : 1, phase: state, exitCode: containerExitCode,
3501
- reason: failedReason || containerReason || (state === 'complete' ? 'complete' : 'unknown') };
3536
+ reason: failedReason || containerReason || (state === 'complete' ? 'complete' : 'unknown'),
3537
+ // POD-TERMINAL-EVIDENCE-JOIN: keep classifier and termination cause on this Job/childRun/attempt row.
3538
+ failureClassification: disposition?.failureClassification ?? null,
3539
+ classificationBasis: disposition?.childEvidence?.classificationBasis ?? null,
3540
+ // The child-run status is a different axis from the implementation's abandoned classification.
3541
+ // Preserve it even when the child did not emit a parseable self-implement disposition.
3542
+ podExitClass: state === 'failed' ? classifyPodExit({ containerReason: containerReason ?? null,
3543
+ containerExitCode: containerExitCode ?? null, jobReason: failedReason || null, logs }).class : null,
3544
+ childFailureStage: childFailure?.stage ?? null,
3545
+ terminationReason: typeof disposition?.childEvidence?.terminationReason === 'string'
3546
+ ? redactSecretText(disposition.childEvidence.terminationReason).slice(0, 200) : null };
3502
3547
  try { appendRunLedgerEntry({ runId: ledgerRunId, event: POD_LAUNCH_FINISHED_EVENT, timestamp: new Date((options.now ?? Date.now)()).toISOString(), data: finishedRow }, ledgerDir); }
3503
3548
  catch (error) { debug.log('pod.provenance', 'history-unavailable', { job: name, row: 'finished', reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' }); }
3504
3549
  debug.log('pod.provenance', 'job-finished', finishedRow);
3505
- debug.log('self-implement.pod', 'job-finished', { job: name, ...(member ? { context: member.context } : {}), state, containerReason, stage: disposition?.stage ?? null, prUrl: disposition?.prUrl ?? null, childRunId: liveChildRunId, ledgerCompleteness,
3550
+ // Keep report-deficit incidents queryable as one bounded event. The child detail field is
3551
+ // intentionally capped elsewhere, so cause evidence must not depend on that full payload.
3552
+ const reportDeficit = disposition?.failureClassification === 'report-deficit';
3553
+ const noResultIncident = state === 'failed' && failedReason !== 'DeadlineExceeded' && !disposition;
3554
+ if (reportDeficit || noResultIncident) {
3555
+ const evidence = disposition?.childEvidence;
3556
+ const diagnosticLines = [
3557
+ ...(Array.isArray(evidence?.podLogTail) ? evidence.podLogTail : []),
3558
+ ...(typeof evidence?.detail === 'string' ? evidence.detail.split('\n') : []),
3559
+ ...(typeof evidence?.detailTail === 'string' ? evidence.detailTail.split('\n') : []),
3560
+ ...(typeof evidence?.stderr === 'string' ? evidence.stderr.split('\n') : []),
3561
+ ...(Array.isArray(noResultLogEvidence?.logTail) ? noResultLogEvidence.logTail as string[] : []),
3562
+ ...(Array.isArray(noResultLogEvidence?.podLogTail) ? noResultLogEvidence.podLogTail as string[] : []),
3563
+ ...(typeof noResultLogEvidence?.stderr === 'string' ? noResultLogEvidence.stderr.split('\n') : []),
3564
+ ].slice(-12).map((line) => redactSecretText(line).slice(0, 500));
3565
+ debug.log('pod.child', reportDeficit ? 'report-deficit-cause' : 'terminal-cause', {
3566
+ job: name, run: launchRunId, childRun: liveChildRunId, attempt: oomRetried ? 2 : 1,
3567
+ // A missing parsed result is an incident trigger, not proof of the child's classifier.
3568
+ classification: disposition?.failureClassification ?? null,
3569
+ ...(noResultIncident ? { trigger: 'no-result' } : {}),
3570
+ podExitClass: finishedRow.podExitClass,
3571
+ classificationBasis: evidence?.classificationBasis ?? null,
3572
+ phase: state, exitCode: containerExitCode,
3573
+ reason: failedReason || containerReason || 'unknown',
3574
+ terminationReason: evidence?.terminationReason ?? null,
3575
+ providerErrors: disposition?.providerErrors ?? null,
3576
+ oomKilled, podTermination: podTermination ?? null,
3577
+ detailTail: evidence?.detailTail ?? null,
3578
+ lastLines: diagnosticLines,
3579
+ }, { level: 'warn', compact: { stringMax: 4_500 } });
3580
+ }
3581
+ debug.log('self-implement.pod', 'job-finished', { job: name, ...(member ? { context: member.context } : {}), state, containerReason, stage: disposition?.stage ?? null, prUrl: disposition?.prUrl ?? null, childRunId: liveChildRunId, attempt: oomRetried ? 2 : 1, ledgerCompleteness,
3582
+ ...(noResultLogEvidence ? { stopEvidenceTail: podStopEvidenceTail(noResultLogEvidence) } : {}),
3506
3583
  ...(podTermination ? { podTermination } : {}),
3584
+ failureClassification: finishedRow.failureClassification,
3585
+ classificationBasis: finishedRow.classificationBasis,
3586
+ terminationReason: finishedRow.terminationReason,
3507
3587
  ...(state === 'failed' && !oomKilled && failedReason !== 'DeadlineExceeded'
3508
3588
  ? { ...(childFailure ? { childStage: childFailure.stage } : disposition?.stage ? { childStage: disposition.stage } : {}),
3509
3589
  // POD-NORESULT: a parsed result row without error text is not a missing result line (UX 10-07 01:01: 28 of 28 exit-2 Jobs printed one).
@@ -3569,7 +3649,10 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3569
3649
  if (!await acquireAdmission()) return admissionFailure();
3570
3650
  member = await acquireSlot();
3571
3651
  if (options.pool && !member) {
3572
- if (lastSlotAttempt) recordSlotObservation(lastSlotAttempt, 'rejected', lastSlotReasonCode ?? 'aborted');
3652
+ if (lastSlotAttempt) recordSlotObservation(lastSlotAttempt, 'rejected', lastSlotReasonCode ?? 'aborted', {
3653
+ waitReason: stageReason['pool-slot'] ?? null,
3654
+ ...(typeof input.signal?.reason === 'string' ? { abortReason: input.signal.reason } : {}),
3655
+ });
3573
3656
  return { exitCode: null, output: '', error: { code: 'aborted', message: 'aborted before a pool slot opened', ...(lastSlotReasonCode ? { reasonCode: lastSlotReasonCode } : {}) } };
3574
3657
  }
3575
3658
  if (member) context = member.context;
@@ -3595,13 +3678,21 @@ export function podSelfImplementSpawn(options: PodSpawnOptions = {}): SelfImplem
3595
3678
  }
3596
3679
  // The host still has the complete Pod log here. The CLI only retains a short stdout tail,
3597
3680
  // so preserve the parsed child facts in the parent ledger before that tail is returned.
3598
- if (state === 'failed' || state === 'aborted' || noResultLogEvidence || (state === 'complete' && noResultDiagnostic !== null)) {
3681
+ const childEvidenceRow = podChildEvidenceLedgerRow({
3682
+ job: name,
3683
+ childRunId: liveChildRunId,
3684
+ state,
3685
+ result: disposition ?? null,
3686
+ noResultDiagnostic,
3687
+ noResultLogEvidence,
3688
+ podTermination,
3689
+ });
3690
+ if (childEvidenceRow) {
3599
3691
  // Every terminal attempt writes a marker, including one with no parseable child facts.
3600
3692
  // The next attempt must never inherit an earlier Pod's classification.
3601
- const childEvidence = noResultLogEvidence
3602
- ? { ...(disposition?.childEvidence ?? {}), ...noResultLogEvidence }
3603
- : disposition?.childEvidence ?? null;
3604
- try { appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-child-evidence', data: { childEvidence, childRunId: liveChildRunId, job: name, ...(podTermination ? { podTermination } : {}) } }, ledgerDir); }
3693
+ // Also persist completed Jobs whose child result is unsuccessful; Kubernetes
3694
+ // Completed is container success, not proof the requested work converged.
3695
+ try { appendRunLedgerEntry({ runId: ledgerRunId, event: 'pod-child-evidence', data: childEvidenceRow }, ledgerDir); }
3605
3696
  catch (error) { debug.log('self-implement.pod', 'child-evidence-write-failed', { job: name, childRunId: liveChildRunId, reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' }); }
3606
3697
  }
3607
3698
  let prLookup: OpenPrByBranch | undefined;
@@ -3831,6 +3922,15 @@ function boundedPodLogText(source: string, maxChars: number): string {
3831
3922
  return redacted.length > maxChars ? `${redacted.slice(0, maxChars)}…[truncated]` : redacted;
3832
3923
  }
3833
3924
 
3925
+ /** A compact, redacted stop clue carried on the attempt-scoped finished row. */
3926
+ function podStopEvidenceTail(evidence: Record<string, unknown>): string[] {
3927
+ const raw = Array.isArray(evidence.logTail) ? evidence.logTail
3928
+ : Array.isArray(evidence.podLogTail) ? evidence.podLogTail
3929
+ : typeof evidence.stderr === 'string' ? evidence.stderr.split(/\r\n|\n|\r/u) : [];
3930
+ return raw.slice(-12).filter((line): line is string => typeof line === 'string' && line.length > 0)
3931
+ .map((line) => redactSecretText(line).slice(0, 240));
3932
+ }
3933
+
3834
3934
  /** 로그 꼬리 — 마지막 N줄만, 한 줄씩 비밀값 마스킹. */
3835
3935
  export function podNoResultLogTailLines(source: string, maxLines: number = POD_NO_RESULT_LOG_TAIL_LINES): string[] {
3836
3936
  const lines = source.replace(/\r\n/g, '\n').split('\n');
@@ -123,6 +123,8 @@ export interface PodChildEvidence {
123
123
  /** Bounded, redacted diagnostics copied only from a failed child terminal result. */
124
124
  error?: string;
125
125
  detail?: string;
126
+ /** Tail of the child detail, retained separately so long reports keep their final diagnostic lines. */
127
+ detailTail?: string;
126
128
  stderr?: string;
127
129
  /** Bounded, redacted complete Pod log tail. Separate from child stderr to avoid replacing stronger child facts. */
128
130
  podLogTail?: string[];
@@ -130,6 +132,8 @@ export interface PodChildEvidence {
130
132
  podLogUnavailable?: string;
131
133
  exitCode?: number;
132
134
  classification?: string;
135
+ /** Why the child assigned its failure classification; independent from the label itself. */
136
+ classificationBasis?: string;
133
137
  scopeEscape?: true;
134
138
  outOfScopeEdits?: unknown;
135
139
  /** SCOPE-ESCAPE-AS-REFINE — why held out-of-scope edits stop the run (deletion · protected path · cap). Present only with scopeEscape. */
@@ -156,6 +160,14 @@ export interface PodChildEvidence {
156
160
  goalPlanRevision?: SelfDevJobResult['goalPlanRevision'];
157
161
  }
158
162
 
163
+ function utf8Tail(value: string, maxBytes: number): string {
164
+ const bytes = Buffer.from(value, 'utf8');
165
+ let start = Math.max(0, bytes.length - maxBytes);
166
+ // Move past continuation bytes so decoding starts at a complete UTF-8 code point.
167
+ while (start < bytes.length && (bytes[start]! & 0xc0) === 0x80) start++;
168
+ return bytes.subarray(start).toString('utf8');
169
+ }
170
+
159
171
  const SCOPE_STOP_REASON_ORDER: readonly ScopeStopReason[] = SCOPE_STOP_REASONS;
160
172
 
161
173
  /** Stop reasons for held out-of-scope edits: the child's own `scopeStopReasons` (orchestrator decideScopeExpansion) plus
@@ -218,12 +230,18 @@ export function podChildEvidenceFromResult(o: Record<string, unknown>): PodChild
218
230
  const classification = scopeEscape ? 'scope-escape'
219
231
  : typeof abandoned?.classification === 'string' ? redactSecretText(abandoned.classification)
220
232
  : typeof o.failureClassification === 'string' ? redactSecretText(o.failureClassification) : undefined;
233
+ const rawClassificationBasis = abandoned?.classificationBasis ?? o.classificationBasis;
234
+ const classificationBasis = typeof rawClassificationBasis === 'string' && rawClassificationBasis.trim()
235
+ ? redactSecretText(rawClassificationBasis).slice(0, 200) : undefined;
221
236
  const evidence: PodChildEvidence = {
222
237
  ...(failedText(o.error) ? { error: failedText(o.error) } : {}),
223
238
  ...(failedText(o.detail) ? { detail: failedText(o.detail) } : {}),
239
+ ...(o.ok === false && typeof o.detail === 'string' && o.detail.trim()
240
+ ? { detailTail: utf8Tail(redactSecretText(o.detail), 4_096) } : {}),
224
241
  ...(failedText(o.stderr) ? { stderr: failedText(o.stderr) } : {}),
225
242
  ...(failureExitCode !== undefined ? { exitCode: failureExitCode } : {}),
226
243
  ...(classification ? { classification } : {}),
244
+ ...(classificationBasis ? { classificationBasis } : {}),
227
245
  ...(scopeEscape ? { scopeEscape: true, scopeStopReasons } : {}),
228
246
  ...(outOfScopeEdits !== undefined ? { outOfScopeEdits } : {}),
229
247
  ...(newScope ? { newScope } : {}),
package/src/tui/entry.ts CHANGED
@@ -346,9 +346,11 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
346
346
  const sidetabLines = sidetabOpen
347
347
  ? sidetabApi!.formatSidetabLines(sidetabRows, sidetabSelected, sidetabWidth, Math.max(1, rows - 1), sidetabMode)
348
348
  : [];
349
- const screenLines = sidetabOpen
350
- ? lines.map((line, index) => `${sidetabLines[index] ?? ' '.repeat(sidetabWidth)}│${line}`)
351
- : lines;
349
+ const screenLineCount = sidetabOpen ? Math.max(lines.length, sidetabLines.length) : lines.length;
350
+ const screenLines = Array.from({ length: screenLineCount }, (_, index) => {
351
+ const line = lines[index] ?? '';
352
+ return sidetabOpen ? `${sidetabLines[index] ?? ' '.repeat(sidetabWidth)}│${line}` : line;
353
+ });
352
354
  process.stdout.write(`\x1b[H\x1b[2J${screenLines.join('\n')}\x1b[${promptRow};${prompt.cursorCol + (sidetabOpen ? sidetabWidth + 1 : 0)}H\x1b[?25h`);
353
355
  if (sidetabAttachments?.hasModal() && !paintingCoordinatorFrame) sidetabAttachments.refresh();
354
356
  };
@@ -1258,10 +1260,15 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
1258
1260
  }
1259
1261
  if (submitted === '/help' || submitted === '/help next') {
1260
1262
  activity.push(
1263
+ 'Commands',
1261
1264
  'Next TUI: /side · /sidetab — 세션/PTY 목록',
1262
1265
  '사이드탭: Ctrl+\\ 토글 · ↑↓ 선택 · 빈 prompt Enter=attach · /side new · /side kill',
1263
1266
  '새 PTY: s shell · e elanous · c codex 구독 · l claude code 구독',
1264
1267
  'PTY 분리: Ctrl+\\ 후 d · /term help 는 읽기 전용 목록 명령',
1268
+ '',
1269
+ 'Keys',
1270
+ 'Enter 전송 · Esc 취소 · PgUp/PgDn 대화 스크롤 · Ctrl+Q 종료',
1271
+ 'Ctrl+\\ 사이드탭 토글 · ↑/↓ 목록 이동 · Esc 입력으로 돌아오기',
1265
1272
  );
1266
1273
  status = 'Enter 전송';
1267
1274
  render();
@@ -1,2 +1,47 @@
1
1
  /** Compatibility entry point for existing Next TUI callers. Shared behavior lives in sidetab-core. */
2
2
  export * from '../../sidetab-core/model.js';
3
+ import {
4
+ formatSidetabLines as formatCoreSidetabLines,
5
+ loadSidetabRows as loadCoreSidetabRows,
6
+ type SidetabRow,
7
+ } from '../../sidetab-core/model.js';
8
+ import { listPtyManifestRows } from '../../pty-shell/pty-manifest.js';
9
+ import { formatSidetabPeekLines } from './peek.js';
10
+
11
+ type PreviewSidetabRow = SidetabRow & { readonly previewSource?: string };
12
+
13
+ /** Attach the latest manifest snapshot without changing the shared row contract. */
14
+ export function loadSidetabRows(all = false, currentSessionId?: string): SidetabRow[] {
15
+ const snapshots = new Map<string, string>(listPtyManifestRows().map((row) => [row.id, row.snapshot || row.frame] as const));
16
+ return loadCoreSidetabRows(all, currentSessionId).map((row) => ({
17
+ ...row,
18
+ previewSource: snapshots.get(row.id) ?? '',
19
+ }));
20
+ }
21
+
22
+ /** Render the core list and reserve a bounded tail preview for the selected PTY row. */
23
+ export function formatSidetabLines(
24
+ rows: readonly SidetabRow[],
25
+ selected: number,
26
+ width: number,
27
+ height = Number.POSITIVE_INFINITY,
28
+ mode: 'list' | 'new' = 'list',
29
+ ): string[] {
30
+ const selectedRow = rows[selected] as PreviewSidetabRow | undefined;
31
+ const peekLines = mode === 'list' && selectedRow
32
+ ? formatSidetabPeekLines(selectedRow.previewSource ?? '', width)
33
+ : [];
34
+ if (peekLines.length === 0) return formatCoreSidetabLines(rows, selected, width, height, mode);
35
+
36
+ const reservedRows = peekLines.length + 1;
37
+ const coreLines = formatCoreSidetabLines(rows, selected, width, Math.max(0, height - reservedRows), mode);
38
+ // The core formatter reserves the leading ` › ` token for selection; a
39
+ // session label may itself contain `›`, so searching anywhere in the line
40
+ // can place the preview under the wrong row.
41
+ const selectedLine = coreLines.findIndex((line) => line.startsWith(' › '));
42
+ if (selectedLine < 0) return coreLines;
43
+
44
+ const lines = [...coreLines];
45
+ lines.splice(selectedLine + 1, 0, ' '.repeat(width), ...peekLines);
46
+ return Number.isFinite(height) ? lines.slice(0, Math.max(0, Math.floor(height))) : lines;
47
+ }
@@ -1,136 +1,2 @@
1
- import type { LLMToolSpec } from '../../llm.js';
2
- import type { SidetabRow } from './list.js';
3
-
4
- export const NEXT_SIDETAB_TOOL_NAME = 'NextSidetab';
5
- const CALL = 'elanous.sidetab.call';
6
- const RESULT = 'elanous.sidetab.result';
7
-
8
- export type NextSidetabAction = 'list' | 'switch' | 'attach' | 'detach' | 'new' | 'kill';
9
- export interface NextSidetabRequest {
10
- action: NextSidetabAction;
11
- target?: string;
12
- character?: 'shell' | 'elanous';
13
- confirm?: boolean;
14
- }
15
- export interface NextSidetabCall { type: typeof CALL; callId: string; request: NextSidetabRequest }
16
- export interface NextSidetabResult { type: typeof RESULT; callId: string; result: unknown }
17
- export type NextSidetabHandler = (request: NextSidetabRequest) => Promise<unknown>;
18
- export interface NextSidetabHostDeps {
19
- rows(): readonly SidetabRow[] | Promise<readonly SidetabRow[]>;
20
- selected(): number;
21
- switchSession(row: SidetabRow): Promise<unknown>;
22
- attach(row: SidetabRow): Promise<unknown>;
23
- detach(): unknown;
24
- spawn(character: 'shell' | 'elanous'): unknown;
25
- kill(row: SidetabRow): unknown;
26
- }
27
- export interface NextSidetabIpcProcess {
28
- send?: (message: unknown) => boolean | void;
29
- on(event: 'message', listener: (message: unknown) => void): unknown;
30
- }
31
-
32
- export const nextSidetabToolSpec: LLMToolSpec = {
33
- name: NEXT_SIDETAB_TOOL_NAME,
34
- description: 'Control the Next TUI side tab: list/view sessions and PTYs, switch sessions, attach or detach, start a local shell or elanous PTY, or kill a PTY. Ask the user to confirm before calling kill with confirm=true. Starting coding agents is not supported.',
35
- parameters: {
36
- type: 'object',
37
- properties: {
38
- action: { type: 'string', enum: ['list', 'switch', 'attach', 'detach', 'new', 'kill'] },
39
- target: { type: 'string', description: 'Optional exact or partial row id/label; required for targeted actions.' },
40
- character: { type: 'string', enum: ['shell', 'elanous'], description: 'Only used with action=new.' },
41
- confirm: { type: 'boolean', description: 'Must be true only after the user explicitly confirmed killing the selected PTY.' },
42
- },
43
- required: ['action'],
44
- additionalProperties: false,
45
- },
46
- };
47
-
48
- export function isNextSidetabCall(value: unknown): value is NextSidetabCall {
49
- const call = value as Partial<NextSidetabCall> | null;
50
- return Boolean(call && call.type === CALL && typeof call.callId === 'string'
51
- && call.request && typeof call.request === 'object');
52
- }
53
-
54
- export async function answerNextSidetabCall(handler: NextSidetabHandler, call: NextSidetabCall): Promise<NextSidetabResult> {
55
- try { return { type: RESULT, callId: call.callId, result: await handler(call.request) }; }
56
- catch (error) {
57
- return { type: RESULT, callId: call.callId, result: { error: error instanceof Error ? error.message : String(error) } };
58
- }
59
- }
60
-
61
- export function createNextSidetabHostHandler(deps: NextSidetabHostDeps): NextSidetabHandler {
62
- return async (request) => {
63
- if (!request || !['list', 'switch', 'attach', 'detach', 'new', 'kill'].includes(request.action)) {
64
- return { error: '지원하지 않는 사이드탭 동작입니다' };
65
- }
66
- if (request.action === 'new') {
67
- if (request.character !== 'shell' && request.character !== 'elanous') return { error: 'character는 shell 또는 elanous여야 합니다' };
68
- return deps.spawn(request.character);
69
- }
70
- if (request.action === 'detach') return deps.detach();
71
- const rows = await deps.rows();
72
- if (request.action === 'list') return rows.map(({ id, label, kind, badge, sessionId }) => ({ id, label, kind, badge, ...(sessionId ? { sessionId } : {}) }));
73
- const target = request.target?.trim();
74
- const exact = target ? rows.find((item) => item.id === target)
75
- ?? rows.find((item) => item.label.toLowerCase() === target.toLowerCase()) : undefined;
76
- const partial = target && !exact ? rows.filter((item) => item.label.toLowerCase().includes(target.toLowerCase())) : [];
77
- if (partial.length > 1) return { error: `사이드탭 항목이 여러 개 일치합니다: ${target}` };
78
- const row = exact ?? partial[0] ?? (target ? undefined : rows[deps.selected()]);
79
- if (!row) return { error: target ? `사이드탭 항목을 찾지 못했습니다: ${target}` : '선택된 사이드탭 항목이 없습니다' };
80
- if (request.action === 'switch') return row.kind === 'tui' ? deps.switchSession(row) : { error: 'Next TUI 세션만 전환할 수 있습니다' };
81
- if (request.action === 'attach') return deps.attach(row);
82
- if (row.currentProcess) return { error: '현재 TUI 세션은 사이드탭에서 종료할 수 없습니다' };
83
- if (request.confirm !== true) return { needsConfirmation: true, message: `PTY 종료 확인 필요: ${row.label}` };
84
- return deps.kill(row);
85
- };
86
- }
87
-
88
- export function createReplNextSidetabTool(
89
- proc: NextSidetabIpcProcess,
90
- env: NodeJS.ProcessEnv = process.env,
91
- timeoutMs = 15_000,
92
- ): { spec: LLMToolSpec; dispatch: (args: Record<string, unknown>) => Promise<unknown> } | null {
93
- if (env.ELANOUS_NEXT_TUI_SIDETAB_IPC !== '1' || typeof proc.send !== 'function') return null;
94
- const send = proc.send.bind(proc);
95
- const waiting = new Map<string, (result: unknown) => void>();
96
- let sequence = 0;
97
- const listener = (message: unknown): void => {
98
- const result = message as Partial<NextSidetabResult> | null;
99
- if (!result || result.type !== RESULT || typeof result.callId !== 'string') return;
100
- const resolve = waiting.get(result.callId);
101
- if (!resolve) return;
102
- waiting.delete(result.callId);
103
- resolve(result.result);
104
- };
105
- proc.on('message', listener);
106
- return {
107
- spec: nextSidetabToolSpec,
108
- dispatch: (args) => new Promise((resolve) => {
109
- const callId = `s${++sequence}`;
110
- const timer = setTimeout(() => {
111
- if (!waiting.delete(callId)) return;
112
- resolve({ error: 'Next TUI did not answer the side-tab request' });
113
- }, timeoutMs);
114
- waiting.set(callId, (result) => { clearTimeout(timer); resolve(result); });
115
- try {
116
- send({ type: CALL, callId, request: args as unknown as NextSidetabRequest } satisfies NextSidetabCall);
117
- } catch (error) {
118
- waiting.delete(callId);
119
- clearTimeout(timer);
120
- resolve({ error: `Next TUI IPC send failed: ${error instanceof Error ? error.message : String(error)}` });
121
- }
122
- }),
123
- };
124
- }
125
-
126
- export function registerNextSidetabReplTool(
127
- specs: LLMToolSpec[],
128
- dispatchByName: Map<string, (args: Record<string, unknown>) => Promise<unknown>>,
129
- proc: NextSidetabIpcProcess,
130
- env: NodeJS.ProcessEnv = process.env,
131
- ): void {
132
- const tool = createReplNextSidetabTool(proc, env);
133
- if (!tool) return;
134
- specs.push(tool.spec);
135
- dispatchByName.set(tool.spec.name, tool.dispatch);
136
- }
1
+ /** Compatibility entry point for Next TUI callers. Shared contracts and policy live in sidetab-core. */
2
+ export * from '../../sidetab-core/model.js';
@@ -0,0 +1,52 @@
1
+ const graphemes = new Intl.Segmenter(undefined, { granularity: 'grapheme' });
2
+
3
+ const ANSI_CONTROL = /\x1b(?:\[[0-?]*[ -/]*[@-~]|\][^\x07]*(?:\x07|\x1b\\)|[PX^_].*?\x1b\\|.)/gs;
4
+ const NON_TEXT_CONTROL = /[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]/g;
5
+ const MAX_PEEK_SOURCE_CHARS = 16_384;
6
+
7
+ function fitLine(value: string, width: number): string {
8
+ if (width <= 0) return '';
9
+ if (Bun.stringWidth(value) <= width) return value;
10
+ const maxTextWidth = Math.max(0, width - 1);
11
+ let result = '';
12
+ let used = 0;
13
+ for (const { segment } of graphemes.segment(value)) {
14
+ const cells = Bun.stringWidth(segment);
15
+ if (used + cells > maxTextWidth) break;
16
+ result += segment;
17
+ used += cells;
18
+ }
19
+ return `${result}…`;
20
+ }
21
+
22
+ /** Return up to three recent plain-text output lines for the selected sidebar row. */
23
+ export function formatSidetabPeekLines(
24
+ source: string,
25
+ width: number,
26
+ maxLines = 3,
27
+ ): string[] {
28
+ if (!source || width < 5 || maxLines <= 0) return [];
29
+
30
+ let start = Math.max(0, source.length - MAX_PEEK_SOURCE_CHARS);
31
+ // Keep a surrogate pair intact when the bounded tail starts in its second code unit.
32
+ const firstCodeUnit = source.charCodeAt(start);
33
+ if (start > 0 && firstCodeUnit >= 0xdc00 && firstCodeUnit <= 0xdfff) start++;
34
+ let bounded = source.slice(start);
35
+ // The cut may land in an ANSI sequence or line. Drop that partial prefix; recent complete lines follow it.
36
+ if (start > 0) {
37
+ const firstLineBreak = bounded.search(/[\r\n]/);
38
+ if (firstLineBreak >= 0) bounded = bounded.slice(firstLineBreak + 1);
39
+ }
40
+
41
+ const clean = bounded
42
+ .replace(ANSI_CONTROL, '')
43
+ .replace(NON_TEXT_CONTROL, '')
44
+ .replace(/\r\n?/g, '\n');
45
+ const recent = clean.split('\n')
46
+ .map((line) => line.trimEnd())
47
+ .filter((line) => line.trim().length > 0)
48
+ .slice(-Math.min(3, Math.floor(maxLines)));
49
+ const prefix = ' ↳ ';
50
+ const textWidth = Math.max(1, width - Bun.stringWidth(prefix));
51
+ return recent.map((line) => `${prefix}${fitLine(line, textWidth)}`);
52
+ }
@@ -211,6 +211,9 @@ export class DashboardSession {
211
211
  ? { resolveMaxToolTurns: opts.resolveMaxToolTurns }
212
212
  : {}),
213
213
  ...(opts.abortPollMs !== undefined ? { abortPollMs: opts.abortPollMs } : {}),
214
+ // TUI-TOKEN-GUARD-WIRE — the host history write-back for the request-size cap.
215
+ ...(opts.compactPersistedHistory ? { compactPersistedHistory: opts.compactPersistedHistory } : {}),
216
+ ...(opts.requestSizeMaxChars !== undefined ? { requestSizeMaxChars: opts.requestSizeMaxChars } : {}),
214
217
  });
215
218
 
216
219
  const serverPromise = runAcpServer({