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
@@ -72,13 +72,25 @@ export async function detectDashboardSkillRoute(
72
72
  visibleIndex: SkillIndexEntry[],
73
73
  deps: DashboardSkillDetectionRuntimeDeps,
74
74
  ): Promise<DetectResult> {
75
+ const detectionStartedAt = performance.now();
75
76
  const detectKeyword = deps.detectKeyword ?? detectSkillTrigger;
76
77
  const detectWithLLM = deps.detectWithLLM ?? detectLLM;
77
78
  const parseClassifier = deps.parseClassifier ?? parseClassifierJson;
78
79
  const keywordDetection = detectKeyword(userText, visibleIndex, {});
79
- if (!deps.llmFallback) return keywordDetection;
80
+ if (!deps.llmFallback) {
81
+ try {
82
+ debug.log('skill.router.timing', 'detection-complete', {
83
+ mode: 'keyword',
84
+ elapsedMs: Math.round((performance.now() - detectionStartedAt) * 10) / 10,
85
+ skillCount: visibleIndex.length,
86
+ candidateCount: keywordDetection.candidates.length,
87
+ });
88
+ } catch { /* observation must never delay routing */ }
89
+ return keywordDetection;
90
+ }
80
91
 
81
92
  const classify = async (prompt: string, signal?: AbortSignal): Promise<LLMClassifyResult> => {
93
+ const roleStartedAt = performance.now();
82
94
  const resolved = resolveRoleLlm('classify');
83
95
  const provider = llm.PROVIDERS[resolved.provider];
84
96
  if (!provider) throw new Error(`Unknown classify provider: ${resolved.provider}`);
@@ -89,21 +101,49 @@ export async function detectDashboardSkillRoute(
89
101
  provider: resolved.provider,
90
102
  source: resolved.source,
91
103
  });
92
- const raw = await deps.streamLLM(
93
- [{ role: 'user', content: prompt }],
94
- () => {},
95
- { signal, maxTokens: 120, temperature: 0, model: resolved.model, provider, usageRole: 'classify' },
96
- );
104
+ try {
105
+ debug.log('skill.router.timing', 'classifier-role-ready', {
106
+ elapsedMs: Math.round((performance.now() - roleStartedAt) * 10) / 10,
107
+ provider: resolved.provider,
108
+ source: resolved.source,
109
+ });
110
+ } catch { /* observation must never delay routing */ }
111
+ const streamStartedAt = performance.now();
112
+ let raw: string;
113
+ try {
114
+ raw = await deps.streamLLM(
115
+ [{ role: 'user', content: prompt }],
116
+ () => {},
117
+ { signal, maxTokens: 120, temperature: 0, model: resolved.model, provider, usageRole: 'classify' },
118
+ );
119
+ } finally {
120
+ try {
121
+ debug.log('skill.router.timing', 'classifier-stream-complete', {
122
+ elapsedMs: Math.round((performance.now() - streamStartedAt) * 10) / 10,
123
+ provider: resolved.provider,
124
+ });
125
+ } catch { /* observation must never delay routing */ }
126
+ }
97
127
  return parseClassifier(raw);
98
128
  };
99
129
 
100
- return detectWithLLM(userText, visibleIndex, {
101
- classify,
102
- keywordScoreThreshold: deps.keywordScoreThreshold,
103
- llmConfidenceThreshold: deps.llmConfidenceThreshold,
104
- ...(deps.signal ? { signal: deps.signal } : {}),
105
- ...(deps.activeTier ? { activeTier: deps.activeTier } : {}),
106
- ...(deps.fullMenuTier ? { fullMenuTier: deps.fullMenuTier } : {}),
107
- ...(deps.fullMenuConfidenceThreshold != null ? { fullMenuConfidenceThreshold: deps.fullMenuConfidenceThreshold } : {}),
108
- });
130
+ try {
131
+ return await detectWithLLM(userText, visibleIndex, {
132
+ classify,
133
+ keywordScoreThreshold: deps.keywordScoreThreshold,
134
+ llmConfidenceThreshold: deps.llmConfidenceThreshold,
135
+ ...(deps.signal ? { signal: deps.signal } : {}),
136
+ ...(deps.activeTier ? { activeTier: deps.activeTier } : {}),
137
+ ...(deps.fullMenuTier ? { fullMenuTier: deps.fullMenuTier } : {}),
138
+ ...(deps.fullMenuConfidenceThreshold != null ? { fullMenuConfidenceThreshold: deps.fullMenuConfidenceThreshold } : {}),
139
+ });
140
+ } finally {
141
+ try {
142
+ debug.log('skill.router.timing', 'detection-complete', {
143
+ mode: 'llm-fallback',
144
+ elapsedMs: Math.round((performance.now() - detectionStartedAt) * 10) / 10,
145
+ skillCount: visibleIndex.length,
146
+ });
147
+ } catch { /* observation must never delay routing */ }
148
+ }
109
149
  }
@@ -422,6 +422,21 @@ const COST_SLASH_DESCRIPTOR = buildCostSlashCommand();
422
422
  const MEMORY_SLASH_DESCRIPTOR = buildMemorySlashCommand();
423
423
 
424
424
  export interface DashboardSlashContext {
425
+ /** Classic /side agent commands supplied by the dashboard host. */
426
+ classicSidetabAgent?: {
427
+ loadRows(sessionId?: string): import('../../sidetab-core/model.js').SidetabRow[];
428
+ openAgent(agent: 'codex' | 'claude'): void;
429
+ runMission(agent: 'codex' | 'claude', mission: string, outputPath?: string): Promise<{
430
+ ok: boolean;
431
+ path: string;
432
+ firstLine?: string;
433
+ promptReady: boolean;
434
+ missionVisible: boolean;
435
+ promptReturned: boolean;
436
+ completionMarker: boolean;
437
+ error?: string;
438
+ }>;
439
+ };
425
440
  // Chat surface refs / mutators
426
441
  chatLines: string[];
427
442
  /** Same status-line producer the agent immediate executor uses. Absent in tests → empty. */
@@ -41,6 +41,8 @@ import {
41
41
  import type { getUserConfig } from '../user-config.js';
42
42
  import { isNativeStructureEnabledForProvider, resolveActiveProvider } from '../user-config.js';
43
43
  import { measureInputLagTurnStart } from '../tui/input-lag-probe.js';
44
+ import { resolveModelContextWindow } from '../models/context-window.js';
45
+ import { buildInstalledSkillCatalogMessage, type InstalledSkillSummary } from './skill-catalog-preamble.js';
44
46
  import { effectiveInstanceRoot, prodInstanceRoot } from '../instance/resolve.js';
45
47
  import { buildSelfHealthLine, type InstalledRecord, type SelfHealthErrors } from '../pty-shell/tui-run-state.js';
46
48
  import type { PtyBuildIdentity } from '../pty-shell/pty-manifest.js';
@@ -71,6 +73,12 @@ export interface DashboardTurnPreambleContext {
71
73
  * one-liner directives (e.g. AskUserQuestion → use for tool-deny
72
74
  * clarification). Pass `tools.map(t => t.name)` from the caller. */
73
75
  enabledTools?: readonly string[];
76
+ /** Installed frontmatter summaries for the stable skill-routing prompt prefix. */
77
+ skillCatalog?: readonly InstalledSkillSummary[];
78
+ /** Active model context size, when known. Unknown models use the conservative helper default. */
79
+ skillCatalogContextWindow?: number | null;
80
+ /** Runtime-selected model can differ from the configured default model. */
81
+ skillCatalogModelId?: string;
74
82
  /** 🪪 L1 자리 부트 카드를 싣나(`seat-boot-preamble.ts`). 대화형 TUI 호출부만 켠다 — 기본 꺼짐이라
75
83
  * 다른 호출부·시험은 셸의 `COORD_ID` 에 따라 출력이 갈리지 않는다. */
76
84
  seatBoot?: boolean | SeatBootDeps;
@@ -100,6 +108,12 @@ export interface DashboardTurnPreambleContext {
100
108
  };
101
109
  }
102
110
 
111
+ /** Flag per-prompt system layers so the Codex Responses serializer keeps
112
+ * them out of the cached `instructions` prefix (TUI-PROMPT-CACHE-PREFIX). */
113
+ function markCacheVolatile(messages: readonly LLMMessage[]): LLMMessage[] {
114
+ return messages.map((m) => (m.role === 'system' ? { ...m, cacheVolatile: true } : m));
115
+ }
116
+
103
117
  export function buildControllerSystemMessage(controller: string, channels?: string): LLMMessage {
104
118
  return {
105
119
  role: 'system',
@@ -172,6 +186,15 @@ function buildDashboardTurnPreambleUnmeasured(
172
186
  ): LLMMessage[] {
173
187
  const builderMs: BuilderMs | null = debug.enabled ? {} : null;
174
188
  const startedAt = builderMs === null ? 0 : performance.now();
189
+ // This is the first stable block in the system preamble. Its cached content changes only
190
+ // when the installed/visible skill list or model context budget changes.
191
+ const skillCatalogBuild = ctx.skillCatalog
192
+ ? timed(builderMs, 'skillCatalog', () => buildInstalledSkillCatalogMessage(
193
+ ctx.skillCatalog!,
194
+ ctx.skillCatalogContextWindow ?? resolveModelContextWindow(ctx.skillCatalogModelId ?? ctx.userConfig.llm.model),
195
+ ))
196
+ : null;
197
+ const skillCatalogSystemMsgs = skillCatalogBuild?.message ? [skillCatalogBuild.message] : [];
175
198
  // Universal preamble — surface-agnostic anchor (AGENTS.md +
176
199
  // CLAUDE.md). Spread first so the project context lands BEFORE any
177
200
  // surface-specific guidance, mirroring Claude Code's Phase 0
@@ -294,21 +317,30 @@ function buildDashboardTurnPreambleUnmeasured(
294
317
  const controllerSystemMsgs = controller
295
318
  ? timed(builderMs, 'controller', () => [buildControllerSystemMessage(controller, controlEnv.channels)])
296
319
  : [];
297
- const preamble = [
320
+ // TUI-PROMPT-CACHE-PREFIX — only the universal anchor (AGENTS.md ·
321
+ // CLAUDE.md · tool discipline) is stable for the life of a session. Every
322
+ // other layer can change between prompts (boot card · memory · git
323
+ // snapshot · plan/approval mode · per-userText guidance · self health), so
324
+ // it is flagged `cacheVolatile`: the Codex serializer then keeps it out of
325
+ // `instructions` and sends it as a developer item after the cached history.
326
+ const preamble: LLMMessage[] = [
327
+ ...skillCatalogSystemMsgs,
298
328
  ...universalPreamble,
299
- ...seatBootSystemMsgs,
300
- ...planModeSystemMsgs,
301
- ...askSystemMsgs,
302
- ...approvalSystemMsgs,
303
- ...sandboxSystemMsgs,
304
- ...memorySystemMsgs,
305
- ...gitSnapshotSystemMsgs,
306
- ...surfaceSystemMsgs,
307
- ...selfOpsSystemMsgs,
308
- ...selfHealthSystemMsgs,
309
- ...controllerSystemMsgs,
310
- ...implDisciplineSystemMsgs,
311
- ...concisenessSystemMsgs,
329
+ ...markCacheVolatile([
330
+ ...seatBootSystemMsgs,
331
+ ...planModeSystemMsgs,
332
+ ...askSystemMsgs,
333
+ ...approvalSystemMsgs,
334
+ ...sandboxSystemMsgs,
335
+ ...memorySystemMsgs,
336
+ ...gitSnapshotSystemMsgs,
337
+ ...surfaceSystemMsgs,
338
+ ...selfOpsSystemMsgs,
339
+ ...selfHealthSystemMsgs,
340
+ ...controllerSystemMsgs,
341
+ ...implDisciplineSystemMsgs,
342
+ ...concisenessSystemMsgs,
343
+ ]),
312
344
  ];
313
345
  // Capture exactly what the ACP path's getPreamble emits so we can
314
346
  // verify what codex actually sees as system prompt at turn-start.
@@ -328,7 +360,9 @@ function buildDashboardTurnPreambleUnmeasured(
328
360
  if (notificationOnlyWake) {
329
361
  preamble.push({ role: 'system', content: '[알림 전용 턴] 이것은 완료 알림을 전달한 비요청 status receipt다. 작업 요청으로 취급하지 말고 Agent 또는 SelfImplement 위임을 시작하지 않는다. 포함된 결과를 바탕으로 한 번의 간결한 상태 요약만 답하고 멈춘다. 결과가 전달되지 않았다면 결과가 아직 제공되지 않았다고 알리고 내용을 추측하지 않는다.' });
330
362
  }
331
- const pendingNotifications = globalTaskNotificationQueue.drain();
363
+ const pendingNotifications = ctx.sessionId
364
+ ? globalTaskNotificationQueue.drainForParentSessionOrUnscoped(ctx.sessionId)
365
+ : globalTaskNotificationQueue.drain();
332
366
  taskNotificationCount = pendingNotifications.length;
333
367
  if (pendingNotifications.length === 0) {
334
368
  if (notificationOnlyWake) {
@@ -370,6 +404,7 @@ function buildDashboardTurnPreambleUnmeasured(
370
404
  hasTurnProfile: ctx.turnProfile != null,
371
405
  builderCounts: {
372
406
  universal: universalPreamble.length,
407
+ ...(ctx.skillCatalog ? { skillCatalog: skillCatalogSystemMsgs.length } : {}),
373
408
  seatBoot: seatBootSystemMsgs.length,
374
409
  planMode: planModeSystemMsgs.length,
375
410
  ask: askSystemMsgs.length,
@@ -390,6 +425,9 @@ function buildDashboardTurnPreambleUnmeasured(
390
425
  builderTotalMs: Math.round((performance.now() - startedAt) * 10) / 10,
391
426
  totalMessageCount: preamble.length,
392
427
  taskNotificationCount,
428
+ skillCatalogTokens: skillCatalogBuild?.estimatedTokens ?? 0,
429
+ skillCatalogBudgetTokens: skillCatalogBuild?.budgetTokens ?? 0,
430
+ skillCatalogMode: skillCatalogBuild?.mode ?? 'not-provided',
393
431
  totalChars: total,
394
432
  userTextPreview: ctx.userText.length > 80 ? `${ctx.userText.slice(0, 80)}…` : ctx.userText,
395
433
  });
@@ -5,7 +5,7 @@ import {
5
5
  type PromptBankStore,
6
6
  } from '../prompt-bank/index.js';
7
7
  import {
8
- resolveSessionTurnProfile,
8
+ resolveSessionTurnProfileWithHistory,
9
9
  type SessionTurnProfile,
10
10
  } from '../session-runtime/index.js';
11
11
  import type { InputSourceRef } from '../input/input-source-kind.js';
@@ -39,6 +39,7 @@ export function buildDashboardTurnPromptRuntime(
39
39
  turnId: string,
40
40
  deps: DashboardTurnPromptRuntimeDeps,
41
41
  inputSource?: InputSourceRef | null,
42
+ priorUserTexts: readonly string[] = [],
42
43
  ): DashboardTurnPromptRuntimeResult {
43
44
  const turnIntents = ['chat', ...classifyUserIntents(userText)];
44
45
  const promptBankInjection = deps.promptBankConfig.enabled && deps.promptBankConfig.dashboardTurns
@@ -62,8 +63,9 @@ export function buildDashboardTurnPromptRuntime(
62
63
  slots: ['context', 'tool-hint', 'user-prefix'],
63
64
  })
64
65
  : '';
65
- const turnProfile = resolveSessionTurnProfile({
66
+ const turnProfile = resolveSessionTurnProfileWithHistory({
66
67
  userText,
68
+ priorUserTexts,
67
69
  chatModeState: deps.chatModeState,
68
70
  inputSource,
69
71
  });
@@ -5,10 +5,10 @@ import { parse as parseYaml } from 'yaml';
5
5
  import { writeStdoutJson } from '../cli/stdout-json.js';
6
6
  import type { GraphVariantPlan } from '../self-implement/graph-variant.js';
7
7
  import { debug } from '../debug/log.js';
8
- import { decideGraphApproval, graphRunAlive, lastJsonObject, latestGraphRun, listGraphRuns, manageGraphRun, runGraph, type GraphRunState } from './runner.js';
8
+ import { decideGraphApproval, graphRunAlive, lastJsonObject, latestGraphRun, listGraphRuns, manageGraphRun, runGraph, type GraphRunOptions, type GraphRunState } from './runner.js';
9
9
 
10
- function findGraphFile(graphId: string): string | undefined {
11
- const roots = [resolve('graphs'), resolve(import.meta.dir, '../../graphs')];
10
+ function findGraphFile(graphId: string, extraRoots: string[] = []): string | undefined {
11
+ const roots = [...extraRoots.map((root) => resolve(root)), resolve('graphs'), resolve(import.meta.dir, '../../graphs')];
12
12
  for (const root of roots) {
13
13
  for (const dir of [root, ...['release', 'ops'].map((part) => join(root, part))]) {
14
14
  if (!existsSync(dir)) continue;
@@ -26,7 +26,10 @@ function findGraphFile(graphId: string): string | undefined {
26
26
  return undefined;
27
27
  }
28
28
 
29
- export function registerGraphCommands(program: Command, runsDeps: { root?: string; processStartMs?: (pid: number) => number | null } = {}): void {
29
+ export function registerGraphCommands(program: Command, runsDeps: {
30
+ root?: string; processStartMs?: (pid: number) => number | null; graphRoots?: string[];
31
+ runBash?: NonNullable<GraphRunOptions['deps']>['runBash'];
32
+ } = {}): void {
30
33
  const graph = program.command('graph').description('Run a declared command graph or inspect its latest run');
31
34
  graph.command('adapt-report')
32
35
  .description('Measure recorded graph path diversity, unit calls, adaptations and landings for one goal')
@@ -333,10 +336,23 @@ export function registerGraphCommands(program: Command, runsDeps: { root?: strin
333
336
  graph.command('approve <graph_id> <run_id>')
334
337
  .option('--reject', 'Reject instead of approving')
335
338
  .option('--by <name>', 'Record the approver name')
336
- .action((graphId: string, runId: string, opts: { reject?: boolean; by?: string }) => {
339
+ .action(async (graphId: string, runId: string, opts: { reject?: boolean; by?: string }) => {
337
340
  try {
338
- const state = decideGraphApproval(graphId, runId, opts.reject ? 'rejected' : 'approved', opts.by);
339
- console.log(`${state.graphId} ${state.runId}: ${state.pending?.decision}`);
341
+ // A release approval is the decision point for a live publish run. Resume its
342
+ // saved graph immediately so approval does not depend on a later manual tick.
343
+ // Resolve the release graph before recording the irreversible decision; if it
344
+ // is unavailable, leave the approval undecided so an operator can retry.
345
+ const releaseGraph = graphId === 'release-loop' ? findGraphFile(graphId, runsDeps.graphRoots) : undefined;
346
+ if (graphId === 'release-loop' && !releaseGraph) throw new Error('release-loop graph file not found; approval was not recorded');
347
+ const state = decideGraphApproval(graphId, runId, opts.reject ? 'rejected' : 'approved', opts.by, runsDeps.root);
348
+ if (releaseGraph) {
349
+ await (await import('../domains/standalone-log-sink.js')).registerStandaloneLogSink('graph');
350
+ const { graphTick } = await import('./graph-tick.js');
351
+ const result = await graphTick(releaseGraph, { resumeRunId: runId, deps: { root: runsDeps.root, runBash: runsDeps.runBash } });
352
+ console.log(`${state.graphId} ${state.runId}: ${state.pending?.decision} · ${result.action} ${result.status ?? ''}`.trim());
353
+ } else {
354
+ console.log(`${state.graphId} ${state.runId}: ${state.pending?.decision}`);
355
+ }
340
356
  } catch (error) {
341
357
  console.error(`graph approve: ${error instanceof Error ? error.message : String(error)}`);
342
358
  process.exitCode = 1;
@@ -8,10 +8,12 @@ import { peerEditRunGate } from '../nexus/api/graph-peer-edit.js';
8
8
  import { observeModelInputTokens } from '../harness/model-input-observation.js';
9
9
  import { effectiveInstanceRoot } from '../instance/resolve.js';
10
10
  import { DecisionLedger } from '../decisions/decision-ledger.js';
11
- import { latestGraphRun, runGraph, type GraphRunOptions, type GraphRunState } from './runner.js';
11
+ import { latestGraphRun, listGraphRuns, runGraph, type GraphRunOptions, type GraphRunState } from './runner.js';
12
12
 
13
13
  export interface GraphTickOptions {
14
14
  startIfIdle?: boolean;
15
+ /** Resume this exact persisted run instead of whichever run happens to be latest. */
16
+ resumeRunId?: string;
15
17
  input?: unknown;
16
18
  mineDir?: string;
17
19
  deps?: GraphRunOptions['deps'] & { notify?: () => void | Promise<void>; isAlive?: (pid: number) => boolean };
@@ -96,7 +98,13 @@ export async function graphTick(path: string, options: GraphTickOptions = {}): P
96
98
  if (refusedAfterNotify) return refusedAfterNotify;
97
99
  // The run identity and executed bytes must agree with the ledger and the gate.
98
100
  if (current.graphId !== graphId) throw new Error(`graph id changed during tick: ${graphId} -> ${current.graphId}`);
99
- const latest = latestGraphRun(graphId, root);
101
+ const latest = options.resumeRunId
102
+ ? listGraphRuns(root).runs.find(run => run.graphId === graphId && run.runId === options.resumeRunId) ?? null
103
+ : latestGraphRun(graphId, root);
104
+ if (options.resumeRunId && !latest) throw new Error(`graph run not found: ${graphId}/${options.resumeRunId}`);
105
+ if (options.resumeRunId && (latest?.status !== 'awaiting-approval' || !latest.pending?.decision)) {
106
+ throw new Error(`graph run is not awaiting a recorded decision: ${graphId}/${options.resumeRunId}`);
107
+ }
100
108
  const growthCard = latest?.growthPark
101
109
  ? (options.deps?.growthDecision?.list ?? ((filters: { status: 'all' }) => new DecisionLedger({ stateDir: root }).list(filters)))({ status: 'all' })
102
110
  .find(entry => entry.id === latest.growthPark?.decisionId && entry.refs?.includes(latest.growthPark.decisionRef))
@@ -1227,7 +1227,7 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
1227
1227
  ? (lastPriorOutput as Record<string, unknown>).result : undefined;
1228
1228
  const inputs: Record<string, unknown> = Object.create(null);
1229
1229
  for (const key of contract.inputs) {
1230
- const value = Object.hasOwn(supplied, key) ? supplied[key] : key === 'prior' ? priorResult : previous[key];
1230
+ const value = Object.hasOwn(supplied, key) ? supplied[key] : key === 'prior' ? (priorResult === undefined ? {} : priorResult) : previous[key];
1231
1231
  if (value !== undefined) inputs[key] = value;
1232
1232
  }
1233
1233
  const alreadySpent = state.path.length + (state.unitCalls ?? []).reduce((sum, call) => sum + call.steps, 0);
@@ -24,6 +24,7 @@
24
24
  // Reference: https://docs.x.ai/docs/guides/tools/overview
25
25
 
26
26
  import { getGrokApiKey, refreshKeyFromCache } from '../config.js';
27
+ import { resolveFreshGrokCredential } from './credential.js';
27
28
  import { debug } from '../debug/log.js';
28
29
 
29
30
  /** Agent Tools API endpoint (distinct from GROK_API_URL=chat/completions). */
@@ -58,6 +59,10 @@ export interface GrokAgentSearchOpts {
58
59
  /** Subscription proxy endpoint and required CLI headers. Omit for the metered xAI API. */
59
60
  baseUrl?: string;
60
61
  headers?: Record<string, string>;
62
+ /** Opt-in credential order for search callers; unset preserves the direct API-key behavior. */
63
+ credentialPreference?: 'api_key';
64
+ /** Model used only when resolving a fallback subscription credential. */
65
+ credentialModel?: string;
61
66
  }
62
67
 
63
68
  export interface GrokCitation {
@@ -89,7 +94,11 @@ export async function grokAgentSearch(
89
94
  query: string,
90
95
  opts: GrokAgentSearchOpts = {},
91
96
  ): Promise<GrokAgentSearchResult> {
92
- const apiKey = opts.apiKey ?? getGrokApiKey();
97
+ const credential = opts.credentialPreference
98
+ ? resolveFreshGrokCredential({ prefer: opts.credentialPreference, ...(opts.credentialModel ? { model: opts.credentialModel } : {}) })
99
+ : null;
100
+ if (credential) debug.log('grok.agent-search', 'credential-selected', { kind: credential.kind, source: credential.source });
101
+ const apiKey = opts.apiKey ?? credential?.token ?? getGrokApiKey();
93
102
  if (!apiKey) return { ok: false, status: 0, text: '', citations: [], error: 'missing-api-key' };
94
103
 
95
104
  const fetchImpl = opts.fetchImpl ?? (globalThis.fetch as unknown as FetchLike);
@@ -109,13 +118,14 @@ export async function grokAgentSearch(
109
118
 
110
119
  let res: Response;
111
120
  try {
112
- const endpoint = opts.baseUrl
113
- ? `${opts.baseUrl.replace(/\/$/, '').replace(/\/responses$/, '')}/responses`
121
+ const baseUrl = opts.baseUrl ?? credential?.baseUrl;
122
+ const endpoint = baseUrl
123
+ ? `${baseUrl.replace(/\/$/, '').replace(/\/responses$/, '')}/responses`
114
124
  : GROK_RESPONSES_URL;
115
125
  res = await fetchImpl(endpoint, {
116
126
  method: 'POST',
117
127
  signal: ac.signal,
118
- headers: { 'content-type': 'application/json', authorization: `Bearer ${apiKey}`, ...opts.headers },
128
+ headers: { 'content-type': 'application/json', authorization: `Bearer ${apiKey}`, ...credential?.headers, ...opts.headers },
119
129
  body: JSON.stringify({
120
130
  model,
121
131
  input,
@@ -1,11 +1,12 @@
1
- // ── Grok 자격 해석 — ⭐ **구독(OAuth)이 언제나 1순위, API 키는 2순위** ──
1
+ // ── Grok 자격 해석 — ⭐ 기본은 구독 1순위, 검색은 명시적으로 API 키 우선 ──
2
2
  //
3
3
  // 대표 지시 2026-08-13: *"엘라누스 안에서 grok 이 구독으로 도는 경우도 진행해야 합니다.
4
4
  // 구독이 있는 경우 api key 는 항상 2순위로 되게 해주세요."*
5
5
  //
6
- // ⛔ **왜 이 파일이 «하나»여야 하나** — elanous 에는 grok 이 나가는 경로가 둘이다:
6
+ // ⛔ **왜 이 파일이 «하나»여야 하나** — elanous 에는 grok 이 나가는 경로가 여럿이다:
7
7
  // ⑴ ACP 백엔드 `grok agent stdio` (자식 바이너리가 auth.json 을 직접 읽는다)
8
8
  // ⑵ LLM 프로바이더 `streamChat` (elanous 가 Bearer 를 «직접» 실어 보낸다)
9
+ // ⑶ 검색 검색만 `prefer: 'api_key'` 로 비용 출처를 분리하고, 키가 없으면 구독으로 폴백한다
9
10
  // 예전엔 ⑴만 구독을 강제(env 스크럽)하고 ⑵는 무조건 API 키였다. 규칙이 갈리면
10
11
  // 「구독을 켰는데 지갑이 열리는」 사고가 난다. ⇒ 두 경로가 이 파일 하나를 읽는다.
11
12
  //
@@ -29,6 +30,7 @@
29
30
  import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, statSync, writeFileSync } from 'node:fs';
30
31
  import { homedir } from 'node:os';
31
32
  import { join } from 'node:path';
33
+ import { keyFromCacheOrEnv } from '../config.js';
32
34
 
33
35
  /** 구독 프록시 베이스. ⛔ `api.x.ai` 가 «아니다** — 그쪽은 API 키(토큰 과금) 전용. */
34
36
  export const GROK_SUBSCRIPTION_BASE_URL = 'https://cli-chat-proxy.grok.com/v1';
@@ -312,11 +314,30 @@ function readGrokCredential(opts: {
312
314
  home?: string;
313
315
  model?: string;
314
316
  cliVersion?: string;
317
+ /** Search surfaces may prefer metered API credentials; all other callers retain subscription-first. */
318
+ prefer?: 'api_key';
315
319
  /** 구독을 «건너뛴다** — 401 을 맞은 뒤 호출자가 강등할 때만 쓴다. */
316
320
  skipSubscription?: boolean;
317
321
  } = {}): GrokCredential | null {
318
322
  const env = opts.env ?? process.env;
319
323
 
324
+ const readApiKey = (cacheFirst = false): GrokCredential | null => {
325
+ for (const name of ['XAI_API_KEY', 'GROK_API_KEY', 'GROK_CODE_XAI_API_KEY'] as const) {
326
+ const useCache = cacheFirst && (!opts.env || opts.env === process.env);
327
+ const value = useCache ? keyFromCacheOrEnv(name) : env[name];
328
+ if (value && value.length > 0) {
329
+ const source = env[name] === value ? name : `${name.toLowerCase()}-cache`;
330
+ return { kind: 'api_key', baseUrl: GROK_API_BASE_URL, token: value, headers: {}, source };
331
+ }
332
+ }
333
+ return null;
334
+ };
335
+
336
+ if (opts.prefer === 'api_key') {
337
+ const apiKey = readApiKey(true);
338
+ if (apiKey) return apiKey;
339
+ }
340
+
320
341
  if (opts.skipSubscription !== true) {
321
342
  const sub = readSubscriptionToken(grokAuthFilePath(opts.home));
322
343
  if (sub) {
@@ -335,18 +356,12 @@ function readGrokCredential(opts: {
335
356
  }
336
357
  }
337
358
 
338
- // 2순위 — API 키(토큰 과금). 이름 순서는 xAI 문서 관례를 따른다.
339
- for (const name of ['XAI_API_KEY', 'GROK_API_KEY', 'GROK_CODE_XAI_API_KEY'] as const) {
340
- const value = env[name];
341
- if (value && value.length > 0) {
342
- return { kind: 'api_key', baseUrl: GROK_API_BASE_URL, token: value, headers: {}, source: name };
343
- }
344
- }
345
- return null;
359
+ // Default callers keep subscription-first. Search surfaces opt into API-key-first above.
360
+ return readApiKey();
346
361
  }
347
362
 
348
363
  /** Read-only credential check for synchronous provider availability. Never refreshes or calls the network. */
349
- export function peekGrokCredential(opts: { home?: string; model?: string } = {}): GrokCredential | null {
364
+ export function peekGrokCredential(opts: { home?: string; model?: string; prefer?: 'api_key' } = {}): GrokCredential | null {
350
365
  return readGrokCredential(opts);
351
366
  }
352
367
 
@@ -607,6 +622,8 @@ export interface ResolveFreshGrokOpts {
607
622
  model?: string;
608
623
  cliVersion?: string;
609
624
  skipSubscription?: boolean;
625
+ /** Search surfaces may prefer API-key billing; omitted callers remain subscription-first. */
626
+ prefer?: 'api_key';
610
627
  /** ⛔ 테스트 심 — 실 바이너리 없이 계약을 문다. */
611
628
  execImpl?: (cmd: string, args: string[], timeoutMs: number) => void;
612
629
  now?: () => number;
@@ -107,7 +107,29 @@ export function podOrchestrateArgs(input: HarnessPodDispatchInput, goalFile: str
107
107
  ];
108
108
  }
109
109
 
110
- type PodDispatchDeps = { run?: (cmd: string, args: readonly string[], env: NodeJS.ProcessEnv) => number | null; readFile?: (path: string) => string; cwd?: string; spawnChild?: typeof spawn; onOutput?: (text: string) => void; recordRunLedgerEntry?: typeof appendRunLedgerEntry; nowMs?: number };
110
+ type PodDispatchExitObservation = {
111
+ status: number | null;
112
+ parentSignalReceived: NodeJS.Signals | null;
113
+ parentSignalReceivedAt: string | null;
114
+ parentSignalLastReceived?: NodeJS.Signals | null;
115
+ parentSignalLastReceivedAt?: string | null;
116
+ signalDelivery: 'requested' | 'child-not-running' | 'kill-failed' | null;
117
+ signalDeliveryFor?: NodeJS.Signals | null;
118
+ orchestratorProcessSignal: NodeJS.Signals | null;
119
+ observedAt: string;
120
+ };
121
+ type PodDispatchRunResult = number | null | PodDispatchExitObservation;
122
+ type PodDispatchDeps = { run?: (cmd: string, args: readonly string[], env: NodeJS.ProcessEnv) => PodDispatchRunResult; readFile?: (path: string) => string; cwd?: string; spawnChild?: typeof spawn; onOutput?: (text: string) => void; recordRunLedgerEntry?: typeof appendRunLedgerEntry; nowMs?: number };
123
+
124
+ export function classifyPodDispatchSignalSource(observation: Pick<PodDispatchExitObservation, 'parentSignalReceived' | 'signalDelivery' | 'orchestratorProcessSignal' | 'status'> & Partial<Pick<PodDispatchExitObservation, 'parentSignalLastReceived' | 'signalDeliveryFor'>>): 'parent-signal-forward-requested' | 'orchestrator-process-signaled' | 'unknown-143' | 'unknown-signal-exit' | 'non-signal-exit' {
125
+ const lastSignal = observation.parentSignalLastReceived ?? observation.parentSignalReceived;
126
+ const deliveryFor = observation.signalDeliveryFor ?? lastSignal;
127
+ if (lastSignal && observation.signalDelivery === 'requested' && deliveryFor === lastSignal) return 'parent-signal-forward-requested';
128
+ if (observation.orchestratorProcessSignal) return 'orchestrator-process-signaled';
129
+ if (observation.status === 143) return 'unknown-143';
130
+ if (observation.status === 130 || observation.status === null) return 'unknown-signal-exit';
131
+ return 'non-signal-exit';
132
+ }
111
133
 
112
134
  /** Default Pod source clones origin HEAD. Never infer its file occupation from an unrelated worktree. */
113
135
  function defaultPodSourceHeadAt(root: string): string | undefined {
@@ -294,39 +316,83 @@ export function dispatchHarnessOnPod(input: HarnessPodDispatchInput, deps: PodDi
294
316
  childLlmProvider: input.childLlmProvider ?? null, childLlmModel: input.childLlmModel ?? null,
295
317
  goalChars, ...(input.entrance === 'cli-harness-ask' ? { goalPath: input.input } : {}),
296
318
  });
297
- const run = deps.run ?? ((cmd: string, a: readonly string[], childEnv: NodeJS.ProcessEnv) => new Promise<number>((resolveStatus) => {
319
+ const run = deps.run ?? ((cmd: string, a: readonly string[], childEnv: NodeJS.ProcessEnv) => new Promise<PodDispatchExitObservation>((resolveStatus) => {
298
320
  const ownsOutput = Boolean(deps.onOutput);
299
321
  const child = (deps.spawnChild ?? spawn)(cmd, [...a], {
300
- stdio: ownsOutput ? ['ignore', 'pipe', 'pipe'] : 'inherit',
301
- env: childEnv,
322
+ stdio: ownsOutput ? ['ignore', 'pipe', 'pipe'] : 'inherit', env: childEnv,
302
323
  });
303
324
  child.stdout?.setEncoding('utf8');
304
325
  child.stdout?.on('data', (chunk: string) => { process.stdout.write(chunk); deps.onOutput?.(chunk); });
305
326
  if (ownsOutput) forwardChildStderr(child.stderr);
306
- let forwarded: NodeJS.Signals | undefined;
327
+ let parentSignalReceived: NodeJS.Signals | undefined;
328
+ let parentSignalReceivedAt: string | undefined;
329
+ let parentSignalLastReceived: NodeJS.Signals | undefined;
330
+ let parentSignalLastReceivedAt: string | undefined;
331
+ let signalDelivery: PodDispatchExitObservation['signalDelivery'];
332
+ let signalDeliveryFor: NodeJS.Signals | undefined;
307
333
  const forward = (signal: NodeJS.Signals) => {
308
- forwarded = signal;
309
- if (child.exitCode === null && child.signalCode === null) child.kill(signal);
334
+ const receivedAt = new Date().toISOString();
335
+ parentSignalReceived ??= signal;
336
+ parentSignalReceivedAt ??= receivedAt;
337
+ parentSignalLastReceived = signal;
338
+ parentSignalLastReceivedAt = receivedAt;
339
+ signalDeliveryFor = signal;
340
+ if (child.exitCode !== null || child.signalCode !== null) {
341
+ signalDelivery = 'child-not-running';
342
+ return;
343
+ }
344
+ try { signalDelivery = child.kill(signal) ? 'requested' : 'kill-failed'; }
345
+ catch { signalDelivery = 'kill-failed'; }
310
346
  };
311
347
  const onTerm = () => forward('SIGTERM');
312
348
  const onInt = () => forward('SIGINT');
313
349
  process.on('SIGTERM', onTerm);
314
350
  process.on('SIGINT', onInt);
315
351
  const cleanup = () => { process.off('SIGTERM', onTerm); process.off('SIGINT', onInt); };
316
- child.once('error', () => { cleanup(); resolveStatus(1); });
317
- child.once('close', (code, signal) => { cleanup(); resolveStatus(code ?? ((signal ?? forwarded) === 'SIGINT' ? 130 : 143)); });
352
+ child.once('error', () => {
353
+ cleanup();
354
+ resolveStatus({ status: 1, parentSignalReceived: parentSignalReceived ?? null, parentSignalReceivedAt: parentSignalReceivedAt ?? null,
355
+ parentSignalLastReceived: parentSignalLastReceived ?? null, parentSignalLastReceivedAt: parentSignalLastReceivedAt ?? null,
356
+ signalDelivery: signalDelivery ?? null, signalDeliveryFor: signalDeliveryFor ?? null,
357
+ orchestratorProcessSignal: null, observedAt: new Date().toISOString() });
358
+ });
359
+ child.once('close', (code, signal) => {
360
+ cleanup();
361
+ resolveStatus({
362
+ status: code ?? ((signal ?? parentSignalReceived) === 'SIGINT' ? 130 : 143),
363
+ parentSignalReceived: parentSignalReceived ?? null,
364
+ parentSignalReceivedAt: parentSignalReceivedAt ?? null,
365
+ parentSignalLastReceived: parentSignalLastReceived ?? null,
366
+ parentSignalLastReceivedAt: parentSignalLastReceivedAt ?? null,
367
+ signalDelivery: signalDelivery ?? null,
368
+ signalDeliveryFor: signalDeliveryFor ?? null,
369
+ orchestratorProcessSignal: signal ?? null,
370
+ observedAt: new Date().toISOString(),
371
+ });
372
+ });
318
373
  }));
374
+ const recordExit = (result: PodDispatchRunResult): number => {
375
+ const observation = typeof result === 'number' || result === null
376
+ ? { status: result, parentSignalReceived: null, parentSignalReceivedAt: null, parentSignalLastReceived: null, parentSignalLastReceivedAt: null,
377
+ signalDelivery: null, signalDeliveryFor: null, orchestratorProcessSignal: null, observedAt: new Date().toISOString() }
378
+ : result;
379
+ debug.log('harness.substrate', 'dispatch-pod-exit', {
380
+ entrance: input.entrance,
381
+ reporterSeat: input.seat ?? process.env.ELANOUS_HARNESS_SEAT ?? null,
382
+ reporterCommand: input.entrance === 'cli-harness-ask' ? 'harness ask' : 'harness say',
383
+ ...observation, signalSource: classifyPodDispatchSignalSource(observation),
384
+ });
385
+ return observation.status ?? 1;
386
+ };
319
387
  const cleanup = () => { if (tempDir) rmSync(tempDir, { recursive: true, force: true }); };
320
388
  try {
321
389
  const status = run(process.execPath, args, env);
322
- if (typeof status === 'number' || status === null) {
390
+ if (typeof status === 'number' || status === null || !('then' in status)) {
323
391
  cleanup();
324
- debug.log('harness.substrate', 'dispatch-pod-exit', { entrance: input.entrance, status });
325
- return status ?? 1;
392
+ return recordExit(status);
326
393
  }
327
- return status.then((code) => {
328
- debug.log('harness.substrate', 'dispatch-pod-exit', { entrance: input.entrance, status: code });
329
- return code;
394
+ return status.then((result) => {
395
+ return recordExit(result);
330
396
  }).finally(cleanup);
331
397
  } catch (error) {
332
398
  cleanup();