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
@@ -0,0 +1,185 @@
1
+ import type { LLMToolSpec } from '../llm.js';
2
+ import { isClassicMissionId, redactMissionResultPath } from './mission-cli-consumer.js';
3
+
4
+ export const CLASSIC_SIDETAB_MISSION_TOOL_NAME = 'RunSidetabMission';
5
+ export const CLASSIC_SIDETAB_MISSION_CANCEL_TOOL_NAME = 'CancelSidetabMission';
6
+ const AGENT_TOOL_NAME = 'Agent';
7
+
8
+ export interface ClassicSidetabMissionResult {
9
+ ok: boolean;
10
+ status?: 'running' | 'completed' | 'cancelled' | 'failed';
11
+ path?: string;
12
+ content?: string;
13
+ error?: string;
14
+ interactionId?: string;
15
+ }
16
+ export interface ClassicSidetabMissionToolResult {
17
+ status: 'running' | 'done' | 'error' | 'aborted';
18
+ body: string;
19
+ artifacts: string[];
20
+ id: string | null;
21
+ }
22
+
23
+ export interface ClassicSidetabMissionTool {
24
+ spec: LLMToolSpec;
25
+ dispatch(args: unknown, context?: ClassicSidetabMissionDispatchContext): Promise<ClassicSidetabMissionToolResult>;
26
+ }
27
+
28
+ export interface ClassicSidetabMissionIntegration {
29
+ getTools(tools: readonly LLMToolSpec[]): LLMToolSpec[];
30
+ dispatchTool(name: string, args: unknown, context?: ClassicSidetabMissionDispatchContext): Promise<ClassicSidetabMissionToolResult> | undefined;
31
+ }
32
+
33
+ export interface ClassicSidetabMissionDispatchContext {
34
+ callId?: string;
35
+ }
36
+
37
+ /** A classic ACP-only tool. Result paths remain internal; the final mission text returns to chat. */
38
+ export function createClassicSidetabMissionTool(
39
+ runMission: (agent: 'codex' | 'claude', mission: string, context?: ClassicSidetabMissionDispatchContext) => Promise<ClassicSidetabMissionResult>,
40
+ ): ClassicSidetabMissionTool {
41
+ return {
42
+ spec: {
43
+ name: CLASSIC_SIDETAB_MISSION_TOOL_NAME,
44
+ description: 'Run a stateless coding mission with the selected sidetab agent. Return a structured result with status, body, artifacts, and id; the parent chat uses it to continue the original task. Parent-turn cancellation does not cancel the mission; explicit mission-ID cancellation or the one-hour safety timeout can stop it.',
45
+ parameters: {
46
+ type: 'object',
47
+ properties: {
48
+ agent: { type: 'string', enum: ['codex', 'claude'], description: 'Visible coding agent to run.' },
49
+ mission: { type: 'string', minLength: 1, description: 'The work to perform.' },
50
+ },
51
+ required: ['agent', 'mission'],
52
+ additionalProperties: false,
53
+ },
54
+ },
55
+ async dispatch(args, context) {
56
+ const output = (status: ClassicSidetabMissionToolResult['status'], body: string, id: string | null = null): ClassicSidetabMissionToolResult => ({
57
+ status,
58
+ body,
59
+ artifacts: [],
60
+ id,
61
+ });
62
+ if (!args || typeof args !== 'object' || Array.isArray(args)) return output('error', 'arguments must be an object');
63
+ const input = args as Record<string, unknown>;
64
+ if (Object.keys(input).some(key => key !== 'agent' && key !== 'mission')) {
65
+ return output('error', 'arguments contain unsupported fields');
66
+ }
67
+ const agent = input.agent;
68
+ const mission = typeof input.mission === 'string' ? input.mission.trim() : '';
69
+ if (agent !== 'codex' && agent !== 'claude') return output('error', 'agent must be codex or claude');
70
+ if (!mission) return output('error', 'mission text is required');
71
+ let result: ClassicSidetabMissionResult;
72
+ try {
73
+ result = await runMission(agent, mission, context);
74
+ } catch {
75
+ return output('error', 'Sidetab mission failed before a result was available');
76
+ }
77
+ if (result.status === 'running') {
78
+ if (!result.interactionId) return output('error', 'Sidetab mission started without an interaction ID');
79
+ const body = result.content?.trim() || 'Independent sidetab job started; this conversation can continue.';
80
+ return output('running', redactMissionResultPath(body, result.path), result.interactionId);
81
+ }
82
+ // The dashboard production seam returns running; this terminal branch serves embedders and tests.
83
+ if (!result.ok) {
84
+ return output(result.status === 'cancelled' ? 'aborted' : 'error', 'Sidetab mission failed; no result was returned', result.interactionId ?? null);
85
+ }
86
+ const content = result.content?.trim();
87
+ if (!content) return output('error', 'Sidetab mission completed without an answer', result.interactionId ?? null);
88
+ if (!result.path) return output('error', 'Sidetab mission completed without an internal result reference', result.interactionId ?? null);
89
+ const userSafeContent = redactMissionResultPath(content, result.path);
90
+ if (!result.interactionId) return output('error', 'Sidetab mission completed without an interaction ID');
91
+ return output('done', userSafeContent, result.interactionId);
92
+ },
93
+ };
94
+ }
95
+
96
+ /** Keep classic ACP tool catalog and dispatch wired through the same production seam. */
97
+ export function createClassicSidetabMissionIntegration(
98
+ runMission: (agent: 'codex' | 'claude', mission: string, context?: ClassicSidetabMissionDispatchContext) => Promise<ClassicSidetabMissionResult>,
99
+ cancelMission?: (interactionId: string) => Promise<boolean>,
100
+ ): ClassicSidetabMissionIntegration {
101
+ const tool = createClassicSidetabMissionTool(runMission);
102
+ const dispatchAgentHand = async (args: unknown, context?: ClassicSidetabMissionDispatchContext): Promise<ClassicSidetabMissionToolResult> => {
103
+ const output = (status: ClassicSidetabMissionToolResult['status'], body: string, id: string | null = null): ClassicSidetabMissionToolResult => ({
104
+ status,
105
+ body,
106
+ artifacts: [],
107
+ id,
108
+ });
109
+ if (!args || typeof args !== 'object' || Array.isArray(args)) return output('error', 'arguments must be an object');
110
+ const input = args as Record<string, unknown>;
111
+ const hand = input.hand;
112
+ if (hand !== 'codex' && hand !== 'claude') return output('error', 'hand must be internal, codex, or claude');
113
+ const prompt = typeof input.prompt === 'string' ? input.prompt.trim() : '';
114
+ if (!prompt) return output('error', 'prompt is required');
115
+ try {
116
+ const result = await runMission(hand, prompt, context);
117
+ if (result.status === 'running') {
118
+ if (!result.interactionId) return output('error', 'Sidetab mission started without an interaction ID');
119
+ const body = result.content?.trim() || 'Independent sidetab agent started; this conversation can continue.';
120
+ return output('running', redactMissionResultPath(body, result.path), result.interactionId);
121
+ }
122
+ if (!result.ok) return output(result.status === 'cancelled' ? 'aborted' : 'error', 'Sidetab mission failed; no result was returned', result.interactionId ?? null);
123
+ const body = result.content?.trim();
124
+ if (!body) return output('error', 'Sidetab mission completed without an answer', result.interactionId ?? null);
125
+ if (!result.interactionId) return output('error', 'Sidetab mission completed without an interaction ID');
126
+ return output('done', redactMissionResultPath(body, result.path), result.interactionId);
127
+ } catch {
128
+ return output('error', 'Sidetab mission failed before a result was available');
129
+ }
130
+ };
131
+ const withHandOption = (spec: LLMToolSpec): LLMToolSpec => {
132
+ const parameters = spec.parameters;
133
+ const properties = parameters.properties && typeof parameters.properties === 'object' && !Array.isArray(parameters.properties)
134
+ ? parameters.properties as Record<string, unknown>
135
+ : {};
136
+ return {
137
+ ...spec,
138
+ description: `${spec.description}\nOptional hand: internal (default), codex, or claude. External hands start a visible sidetab agent and return immediately; completion arrives as a task notification. Parent-turn cancellation does not cancel the mission; explicit mission-ID cancellation or the one-hour safety timeout can stop it.`,
139
+ parameters: {
140
+ ...parameters,
141
+ properties: {
142
+ ...properties,
143
+ hand: { type: 'string', enum: ['internal', 'codex', 'claude'], description: 'Execution hand. Defaults to the built-in internal sub-agent.' },
144
+ },
145
+ },
146
+ };
147
+ };
148
+ return {
149
+ getTools: (tools) => [...tools.map(spec => spec.name === AGENT_TOOL_NAME ? withHandOption(spec) : spec), tool.spec, ...(cancelMission ? [{
150
+ name: CLASSIC_SIDETAB_MISSION_CANCEL_TOOL_NAME,
151
+ description: 'Explicitly cancel a running sidetab mission. Cancelling the parent conversation turn does not cancel its detached mission.',
152
+ parameters: {
153
+ type: 'object',
154
+ properties: { missionId: { type: 'string', format: 'uuid', description: 'The mission ID returned by RunSidetabMission.' } },
155
+ required: ['missionId'],
156
+ additionalProperties: false,
157
+ },
158
+ } satisfies LLMToolSpec] : [])],
159
+ dispatchTool: (name, args, context) => {
160
+ if (name === CLASSIC_SIDETAB_MISSION_TOOL_NAME) return tool.dispatch(args, context);
161
+ if (name === AGENT_TOOL_NAME) {
162
+ if (!args || typeof args !== 'object' || Array.isArray(args)) return dispatchAgentHand(args, context);
163
+ const hand = (args as Record<string, unknown>).hand;
164
+ if (hand === undefined || hand === 'internal') return undefined;
165
+ return dispatchAgentHand(args, context);
166
+ }
167
+ if (name !== CLASSIC_SIDETAB_MISSION_CANCEL_TOOL_NAME || !cancelMission) return undefined;
168
+ return (async () => {
169
+ if (!args || typeof args !== 'object' || Array.isArray(args)) return { status: 'error', body: 'arguments must be an object', artifacts: [], id: null };
170
+ const input = args as Record<string, unknown>;
171
+ if (Object.keys(input).some(key => key !== 'missionId')) return { status: 'error', body: 'arguments contain unsupported fields', artifacts: [], id: null };
172
+ const missionId = typeof input.missionId === 'string' ? input.missionId : '';
173
+ if (!isClassicMissionId(missionId)) {
174
+ return { status: 'error', body: 'missionId must be a UUID', artifacts: [], id: null };
175
+ }
176
+ try {
177
+ const cancelled = await cancelMission(missionId);
178
+ return { status: cancelled ? 'done' : 'error', body: cancelled ? 'Sidetab mission cancellation requested.' : 'Sidetab mission could not be cancelled.', artifacts: [], id: missionId };
179
+ } catch {
180
+ return { status: 'error', body: 'Sidetab mission could not be cancelled.', artifacts: [], id: missionId };
181
+ }
182
+ })();
183
+ },
184
+ };
185
+ }
@@ -4,7 +4,6 @@
4
4
  // layout via the plugin host.
5
5
 
6
6
  import { readFileSync, writeFileSync, existsSync, mkdirSync } from 'fs';
7
- import { join } from 'path';
8
7
  import { fileURLToPath } from 'node:url';
9
8
  import { createRunningBuildStatus } from './running-build-status.js';
10
9
  import { reportTuiAbortRequested, reportTuiProgress, reportTuiTurn } from '../pty-shell/tui-run-state.js';
@@ -165,7 +164,7 @@ function loadLastSelection(): LastSelection | null {
165
164
  import { getLocalSkills, executeSync } from '../sync.js';
166
165
  import { computeDiff } from '../smart.js';
167
166
  import { summarizeDiff, isAnalyzerAvailable } from '../grok.js';
168
- import { C, ICONS, ansi, initTui, closeTui, setExitNotice, readKey, setKeyTracer, render, termSize, pad, stripAnsi, hLine, showHelp, invalidateRenderCacheRow, wrapAnsiByWidth, injectKey } from '../tui.js';
167
+ import { C, ICONS, ansi, initTui, closeTui, setExitNotice, readKey, setKeyTracer, render, termSize, pad, stripAnsi, hLine, showHelp, invalidateRenderCacheRow, wrapAnsiByWidth, injectKey, setExternalTuiKeyRoute } from '../tui.js';
169
168
  import { paintCursor, type CursorState } from '../display/cursor-state.js';
170
169
  import type { CursorDecision } from '../display/cursor-owner.js';
171
170
  import type { Key, RenderOptions } from '../tui.js';
@@ -775,6 +774,21 @@ export function getEscAbortRunningCount(
775
774
  return Math.max(1, registeredRunning);
776
775
  }
777
776
  }
777
+
778
+ /** The classic dashboard's ACP callbacks use this exact tested mission adapter. */
779
+ export function createDashboardClassicSidetabMissionCallbacks(
780
+ runMission: (agent: 'codex' | 'claude', mission: string, context?: ClassicSidetabMissionDispatchContext) => Promise<ClassicSidetabMissionResult>,
781
+ cancelMission?: (interactionId: string) => Promise<boolean>,
782
+ ): ClassicSidetabMissionIntegration {
783
+ return createClassicSidetabMissionIntegration(runMission, cancelMission);
784
+ }
785
+
786
+ /** Bind the classic sidetab runtime to the ACP tool callbacks used by the dashboard. */
787
+ export function createDashboardClassicSidetabMissionAcpBridge(runtime: {
788
+ runMission: (agent: 'codex' | 'claude', mission: string) => Promise<ClassicSidetabMissionResult>;
789
+ }): ClassicSidetabMissionIntegration {
790
+ return createDashboardClassicSidetabMissionCallbacks((agent, mission) => runtime.runMission(agent, mission));
791
+ }
778
792
  import { needsOnboarding, resetOnboardingMarker } from '../onboarding.js';
779
793
  import {
780
794
  getUserConfig, reloadUserConfig, saveUserConfig,
@@ -955,7 +969,11 @@ import {
955
969
  runDashboardScratchExportAction,
956
970
  } from './context-menu-action-runtime.js';
957
971
  import { createDashboardTerminalPopupRuntime } from './terminal-popup-runtime.js';
958
- import { createDashboardSidetabRuntime } from './sidetab-runtime.js';
972
+ import { createDashboardSidetabRuntime, mergeLocalAgentSessions, runDashboardAgentMission } from './sidetab-runtime.js';
973
+ import { CLASSIC_SIDETAB_MISSION_TOOL_NAME, createClassicSidetabMissionIntegration, type ClassicSidetabMissionDispatchContext, type ClassicSidetabMissionIntegration, type ClassicSidetabMissionResult } from './classic-sidetab-mission.js';
974
+ import { cancelClassicMissionCli, startClassicMissionCli } from './mission-cli-consumer.js';
975
+ import { enqueueClassicSidetabMissionCompletion } from './classic-sidetab-mission-job.js';
976
+ import { loadSidetabRows } from '../sidetab-core/model.js';
959
977
  import { toggleDashboardAssistantRenderState } from './assistant-render-state-runtime.js';
960
978
  import { bootDashboardAcpBgSweep } from './acp-bg-sweep-boot.js';
961
979
  import { bootDashboardConfigTools } from './config-tools-boot.js';
@@ -1165,7 +1183,7 @@ import { userMessagePositions, truncateBeforeNthUser } from '../acp/session-fork
1165
1183
  import { resolveEscEscRewind } from '../chat/esc-esc-rewind.js';
1166
1184
  import { wirePersistence } from '../terminal/session-persistence.js';
1167
1185
  import { renderMarkdown as renderMarkdownGlow } from '../markdown-preview.js';
1168
- import { basename, dirname } from 'path';
1186
+ import { basename, dirname, isAbsolute, join, resolve } from 'path';
1169
1187
  import { statSync } from 'fs';
1170
1188
  import {
1171
1189
  FIGURES, toolHeader, toolResult,
@@ -7629,7 +7647,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7629
7647
  try { refreshSkills(skillView); refreshSkillFiles(skillView); } catch { /* missing root fine */ }
7630
7648
  // SK2 — a skill the index could not read is a one-line notice with the repair command, never a crash.
7631
7649
  try {
7632
- getSkillIndex();
7650
+ const skillIndexStartedAt = performance.now();
7651
+ const skillIndex = getSkillIndex();
7652
+ debug.log('tui.skill-index', 'startup-ready', {
7653
+ elapsedMs: Math.round((performance.now() - skillIndexStartedAt) * 10) / 10,
7654
+ skillCount: skillIndex.length,
7655
+ });
7633
7656
  const problems = skillIndexProblems();
7634
7657
  const notice = skillRepairNotice(problems);
7635
7658
  if (notice) chatLines.push(C.info(notice));
@@ -13552,6 +13575,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13552
13575
  const openInteractiveTerminalPopup = (req: TerminalPopupRequest): TerminalSession | null => {
13553
13576
  const { cols: tc, rows: tr } = termSize();
13554
13577
  let spawnedSessionId: string | null = null;
13578
+ let releaseExternalKeyRoute: () => void = () => {};
13555
13579
  const sessionLabel = req.kind === 'coding-agent' ? req.brand : 'shell';
13556
13580
 
13557
13581
  if (debug.enabled) {
@@ -13566,6 +13590,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13566
13590
  if (terminalModalRouter.current()?.id === s.id) {
13567
13591
  terminalModalRouter.set(null);
13568
13592
  }
13593
+ releaseExternalKeyRoute();
13569
13594
  try { s.modal?.dispose(); } catch { /* ignore */ }
13570
13595
  s.modal = null;
13571
13596
  chatLines.push(C.muted(` terminal exited: ${s.id}`));
@@ -13624,6 +13649,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13624
13649
  if (terminalModalRouter.current()?.id === sid) {
13625
13650
  terminalModalRouter.set(null);
13626
13651
  }
13652
+ releaseExternalKeyRoute();
13627
13653
  try {
13628
13654
  if (action === 'minimize') sessionRegistry.detach(sid);
13629
13655
  else sessionRegistry.kill(sid);
@@ -13694,7 +13720,13 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13694
13720
 
13695
13721
  if (session.modal) {
13696
13722
  terminalModalRouter.set(session.modal, {
13697
- onClose: () => { sessionRegistry.detach(session.id); draw(); },
13723
+ onClose: () => { releaseExternalKeyRoute(); sessionRegistry.detach(session.id); draw(); },
13724
+ });
13725
+ releaseExternalKeyRoute = setExternalTuiKeyRoute((key) => {
13726
+ if (terminalModalRouter.current()?.id !== session.id) return false;
13727
+ const result = terminalModalRouter.handleKey(toDashboardKeyEvent(key));
13728
+ if (result === 'closed') draw();
13729
+ return true;
13698
13730
  });
13699
13731
  if (debug.enabled) {
13700
13732
  debug.log('window.terminalModalRouter.set', session.modal.id, {
@@ -13747,6 +13779,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13747
13779
  const classicSidetabRuntime = createDashboardSidetabRuntime({
13748
13780
  currentSessionId: () => currentChatPersonaSessionId(),
13749
13781
  termSize,
13782
+ loadRows: (sessionId) => mergeLocalAgentSessions(loadSidetabRows(false, sessionId), sessionRegistry.list()),
13750
13783
  pushModal: (surface) => {
13751
13784
  attachSurfaceToWorkspace(surface, currentWorkspaceOwnerId());
13752
13785
  const handle = display.pushModal(surface);
@@ -13782,6 +13815,36 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13782
13815
  });
13783
13816
  },
13784
13817
  spawnShell: () => { spawnGlobalTerminalModal(); },
13818
+ spawnAgent: (agent) => {
13819
+ TerminalPopup.agent(agent === 'claude' ? 'claude-code' : 'codex').cwd(workingDir.cwd).open();
13820
+ },
13821
+ runMission: async (agent, mission, requestedOutputPath) => {
13822
+ return runDashboardAgentMission({
13823
+ agent,
13824
+ requestedOutputPath,
13825
+ open: () => TerminalPopup.agent(agent === 'claude' ? 'claude-code' : 'codex').cwd(workingDir.cwd).open() ?? undefined,
13826
+ modal: (session) => session.modal,
13827
+ outputPath: (session, requestedPath) => requestedPath
13828
+ ? (isAbsolute(requestedPath) ? requestedPath : resolve(session.cwd, requestedPath))
13829
+ : join(session.cwd, '.elanous', 'mission-results', `classic-sidetab-${Date.now()}.md`),
13830
+ run: async (session, modal, outputPath) => {
13831
+ const [{ runVisibleAgentMission }, { codexBackend, claudeBackend }] = await Promise.all([
13832
+ import('../sidetab-core/visible-agent-mission.js'),
13833
+ import('../agent-mission/driver.js'),
13834
+ ]);
13835
+ const backend = agent === 'codex' ? codexBackend : claudeBackend;
13836
+ return runVisibleAgentMission({
13837
+ pty: modal,
13838
+ mission,
13839
+ outputPath,
13840
+ handleTrust: (screen, write) => backend.handleTrust?.(screen, write) ?? false,
13841
+ });
13842
+ },
13843
+ close: (session) => {
13844
+ if (terminalModalRouter.current()?.id === session.id) terminalModalRouter.close();
13845
+ },
13846
+ });
13847
+ },
13785
13848
  detach: (row) => {
13786
13849
  if (row?.currentProcess) {
13787
13850
  chatLines.push(C.muted(' 현재 classic TUI는 분리할 수 없습니다'));
@@ -13822,6 +13885,26 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13822
13885
  },
13823
13886
  });
13824
13887
  closeClassicSidetabRuntime = () => classicSidetabRuntime.close();
13888
+ const classicSidetabMission = createDashboardClassicSidetabMissionCallbacks(async (agent, mission, context) => {
13889
+ const started = await startClassicMissionCli({
13890
+ agent,
13891
+ prompt: mission,
13892
+ onInteractionId: (interactionId) => debug.log('classic-sidetab.mission', 'started', {
13893
+ interactionId,
13894
+ toolCallId: context?.callId ?? null,
13895
+ }),
13896
+ });
13897
+ if (!('completion' in started)) return started;
13898
+ const job = started;
13899
+ enqueueClassicSidetabMissionCompletion(job, agent, (notification) => globalTaskNotificationQueue.enqueue(notification));
13900
+ return {
13901
+ ok: true,
13902
+ status: 'running',
13903
+ interactionId: job.interactionId,
13904
+ path: job.path,
13905
+ content: 'Independent sidetab job started; this conversation can continue.',
13906
+ };
13907
+ }, cancelClassicMissionCli);
13825
13908
  disposeClassicSigquit = registerClassicSigquitHandler(() => {
13826
13909
  classicSidetabRuntime.beginPrefix();
13827
13910
  });
@@ -15323,6 +15406,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15323
15406
  // pure assembly over already-loaded specs.
15324
15407
  getPreamble: ({ sessionId, userText }) => {
15325
15408
  const runtime = acpToolRuntime;
15409
+ const turnUserConfig = getUserConfig();
15410
+ const activeModel = inspectActiveProvider().model;
15326
15411
  const tools = runtime
15327
15412
  ? buildSessionRuntimeToolSpecs({
15328
15413
  userText,
@@ -15332,6 +15417,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15332
15417
  surface: acpTurnRef.turnProfile?.surface,
15333
15418
  })
15334
15419
  : [];
15420
+ const classicTools = runtime ? classicSidetabMission.getTools(tools) : tools;
15335
15421
  return [
15336
15422
  ...tuiChatPersonaMessages(currentChatPersonaSessionId(), chatPersonaSelection),
15337
15423
  ...buildDashboardTurnPreamble({
@@ -15339,13 +15425,15 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15339
15425
  sessionId,
15340
15426
  cwd: getSessionCwd(),
15341
15427
  turnProfile: acpTurnRef.turnProfile,
15342
- userConfig: getUserConfig(),
15428
+ userConfig: turnUserConfig,
15429
+ skillCatalog: applySkillFilter(getSkillIndex(), turnUserConfig.skills),
15430
+ skillCatalogModelId: activeModel,
15343
15431
  // Resolved per-turn so a mid-session model switch (codex →
15344
15432
  // claude or vice-versa) takes effect immediately. Drives the
15345
15433
  // codex-only behavioral addendum (fix L-1) inside the
15346
15434
  // universal preamble.
15347
- modelFamily: getModelFamily(inspectActiveProvider().model),
15348
- enabledTools: tools.map(t => t.name),
15435
+ modelFamily: getModelFamily(activeModel),
15436
+ enabledTools: classicTools.map(t => t.name),
15349
15437
  seatBoot: true,
15350
15438
  }),
15351
15439
  ];
@@ -15360,6 +15448,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15360
15448
  optionalTools: acpTurnRef.optionalSpecs,
15361
15449
  surface: acpTurnRef.turnProfile?.surface,
15362
15450
  });
15451
+ const classicTools = classicSidetabMission.getTools(tools);
15363
15452
  // ⭐ Remember this turn's catalog so a spawned sub-agent can inherit it.
15364
15453
  //
15365
15454
  // `dispatchAgent` computes `childTools = (hostTools ?? []).filter(...)`,
@@ -15367,8 +15456,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15367
15456
  // or edit anything, which is the whole point of delegating code work.
15368
15457
  // Exposing `Agent` without this wiring is worse than not exposing it:
15369
15458
  // the model picks a delegate that provably cannot act.
15370
- acpTurnToolSpecs = tools;
15371
- return tools;
15459
+ acpTurnToolSpecs = classicTools.filter(tool => tool.name !== CLASSIC_SIDETAB_MISSION_TOOL_NAME);
15460
+ return classicTools;
15372
15461
  },
15373
15462
  // R2 essential TUI execution boundary: ACP receives the same
15374
15463
  // Codex-first decision as every other surface. The core bridge now
@@ -15384,6 +15473,13 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15384
15473
  // Count at the server-side boundary, before any tool effect and
15385
15474
  // before the ACP notification can reach the TUI client.
15386
15475
  acpToolDispatchCount++;
15476
+ const classicMissionResult = classicSidetabMission.dispatchTool(name, args, {
15477
+ callId: ctx?.callId,
15478
+ });
15479
+ if (classicMissionResult) return classicMissionResult;
15480
+ // For Agent with no `hand` or `hand: internal`, the sidetab
15481
+ // interceptor deliberately returns undefined; keep the established
15482
+ // session-runtime Agent dispatcher below as the built-in fallback.
15387
15483
  const runtime = acpToolRuntime;
15388
15484
  const persist = acpPersistToolOutputPreview;
15389
15485
  if (!runtime || !persist) {
@@ -15403,6 +15499,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15403
15499
  signalAlreadyAborted: turnSignal.aborted,
15404
15500
  });
15405
15501
  const dispatchPromise = dispatchDashboardSessionRuntimeTool(name, args, {
15502
+ sessionId: ctx?.sessionId,
15406
15503
  contextUserText,
15407
15504
  turnRefUserText,
15408
15505
  muted: C.muted,
@@ -15434,6 +15531,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15434
15531
  dispatchToolRuntime: (toolName, input, toolCallId) =>
15435
15532
  runtime.dispatchToolByName(toolName, input, {
15436
15533
  surface: 'tui',
15534
+ parentSessionId: ctx?.sessionId,
15437
15535
  toolCallId,
15438
15536
  signal: hasParentTurnAbortSignal ? turnSignal : undefined,
15439
15537
  // ⭐ Agent-family context. Without these two the sub-agent runs
@@ -17535,6 +17633,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17535
17633
  const slashCtx: DashboardSlashContext = {
17536
17634
  ad: { run: (args) => dispatchDashboardAdSlash(adSlashRuntime, [...args], () => { draw(); }) },
17537
17635
  chatLines,
17636
+ classicSidetabAgent: {
17637
+ loadRows: (sessionId) => classicSidetabRuntime.loadRows(sessionId),
17638
+ openAgent: (agent) => classicSidetabRuntime.openAgent(agent),
17639
+ runMission: (agent, mission, outputPath) => classicSidetabRuntime.runMission(agent, mission, outputPath),
17640
+ },
17538
17641
  getStatusLines: getDashboardStatusLines,
17539
17642
  ...(clarificationSurfaceUx ? { surfaceUx: clarificationSurfaceUx } : {}),
17540
17643
  attachmentRowMap,
@@ -18765,16 +18868,26 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18765
18868
  // project. The raw index cache stays shared across callers —
18766
18869
  // this filter is applied on read.
18767
18870
  const skillsCfg = getUserConfig().skills;
18768
- const visibleIndex = applySkillFilter(getSkillIndex(), {
18871
+ const skillIndexStartedAt = performance.now();
18872
+ const skillIndex = getSkillIndex();
18873
+ const visibleIndex = applySkillFilter(skillIndex, {
18769
18874
  allow: skillsCfg.allow, deny: skillsCfg.deny,
18770
18875
  });
18876
+ try {
18877
+ debug.log('chat.turn.stage', 'skill-index-ready', {
18878
+ elapsedMs: Math.round((performance.now() - skillIndexStartedAt) * 10) / 10,
18879
+ skillCount: skillIndex.length,
18880
+ visibleSkillCount: visibleIndex.length,
18881
+ });
18882
+ } catch { /* observation must never delay a turn */ }
18771
18883
  let detection: DetectResult = { candidates: [], top: null, unambiguous: false };
18884
+ const routeStartedAt = performance.now();
18885
+ let routeOutcome: 'complete' | 'aborted' | 'failed' = 'failed';
18772
18886
  try {
18773
18887
  // Tier-aware full-menu routing (2026-07-20): pass the active
18774
18888
  // model tier so a T1 frontier model can route the whole skill
18775
18889
  // menu when keyword matching is weak/empty (Korean prompts).
18776
18890
  const detectTier = getModelTier(getUserConfig().llm.provider, getUserConfig().llm.model);
18777
- const routeStartedAt = Date.now();
18778
18891
  const route = await runAbortableDashboardSkillRoute({
18779
18892
  attachKeys: (ctrl: AbortController) => attachChatStreamingKeys(ctrl, { turnEnd: false }),
18780
18893
  detect: (signal) => detectDashboardSkillRoute(tok.text, visibleIndex, {
@@ -18789,12 +18902,14 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18789
18902
  }),
18790
18903
  });
18791
18904
  if (route.aborted) {
18792
- debug.log('skill.router', 'route-aborted-by-esc', { elapsedMs: Date.now() - routeStartedAt });
18905
+ debug.log('skill.router', 'route-aborted-by-esc', { elapsedMs: Math.round((performance.now() - routeStartedAt) * 10) / 10 });
18906
+ routeOutcome = 'aborted';
18793
18907
  thinking.stop({ status: 'interrupted' });
18794
18908
  draw();
18795
18909
  continue;
18796
18910
  }
18797
18911
  detection = route.detection;
18912
+ routeOutcome = 'complete';
18798
18913
  // Observability (2026-07-20) — the routing DECISION had no
18799
18914
  // debug category (only surfaced as a UI hint). Emit it so
18800
18915
  // `elanous logs --category skill.router` shows trigger/triage
@@ -18809,8 +18924,22 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18809
18924
  unambiguous: detection.unambiguous,
18810
18925
  });
18811
18926
  } catch (err) {
18812
- debug.log('skill.router', 'decision-error', { text: tok.text.slice(0, 80), error: (err as any)?.message ?? String(err) }, { level: 'error' });
18927
+ debug.log('skill.router', 'decision-error', {
18928
+ text: tok.text.slice(0, 80),
18929
+ error: (err as any)?.message ?? String(err),
18930
+ elapsedMs: Math.round((performance.now() - routeStartedAt) * 10) / 10,
18931
+ }, { level: 'error' });
18813
18932
  /* router must never block chat */
18933
+ } finally {
18934
+ try {
18935
+ debug.log('chat.turn.stage', 'skill-router-complete', {
18936
+ elapsedMs: Math.round((performance.now() - routeStartedAt) * 10) / 10,
18937
+ outcome: routeOutcome,
18938
+ llmFallback: userCfg.llmFallback,
18939
+ visibleSkillCount: visibleIndex.length,
18940
+ candidateCount: detection.candidates.length,
18941
+ });
18942
+ } catch { /* observation must never delay a turn */ }
18814
18943
  }
18815
18944
 
18816
18945
  // Session 21 — session-scoped decline short-circuit. If the
@@ -18945,6 +19074,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18945
19074
  getActivePluginName: () => pluginHost.active()?.name,
18946
19075
  },
18947
19076
  inputSource,
19077
+ chat.history
19078
+ .filter(message => message.role === 'user' && typeof message.content === 'string')
19079
+ .map(message => String(message.content)),
18948
19080
  ),
18949
19081
  buildTurnMessage: (args) => buildDashboardTurnMessage({
18950
19082
  userText: args.userText,
@@ -18986,6 +19118,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18986
19118
  cwd: args.cwd,
18987
19119
  turnProfile: args.turnProfile as SessionTurnProfile,
18988
19120
  userConfig: args.userConfig,
19121
+ skillCatalog: applySkillFilter(getSkillIndex(), args.userConfig.skills),
19122
+ skillCatalogModelId: inspectActiveProvider().model,
18989
19123
  enabledTools: tools.map(t => t.name),
18990
19124
  seatBoot: true,
18991
19125
  }),
@@ -28,6 +28,7 @@ import { homedir } from 'node:os';
28
28
  import type { TextInputInternalTurnYieldPort } from '../../chat/index.js';
29
29
  import { debug } from '../../debug/log.js';
30
30
  import type { PendingTaskNotification } from '../../agent/task-notification.js';
31
+ import { CLASSIC_SIDETAB_MISSION_LABEL } from '../classic-sidetab-mission-job.js';
31
32
  import { detectSeatTui, type SeatDetection } from '../seat-boot-preamble.js';
32
33
  import type { InternalTurnRejectReason, StartTurnIfIdleOptions, StartTurnIfIdleResult } from './internal-turn.js';
33
34
 
@@ -77,6 +78,16 @@ function displayName(n: Pick<PendingTaskNotification, 'label' | 'agentName'>): s
77
78
  return ((n.label ?? '').trim() || n.agentName).replace(/\s+/g, ' ').slice(0, 60);
78
79
  }
79
80
 
81
+ /** Late research results remain visible as one compact line without opening a turn. */
82
+ export function formatAgentSupplementNotice(
83
+ n: Pick<PendingTaskNotification, 'label' | 'agentName' | 'state' | 'output'>,
84
+ ): string {
85
+ const summary = n.output.replace(/\s+/gu, ' ').trim();
86
+ const excerpt = summary.length > 180 ? `${summary.slice(0, 177)}…` : summary;
87
+ const status = n.state === 'done' ? '' : ` (${n.state})`;
88
+ return `↳ 보강: ${displayName(n)}${status}${excerpt ? ` — ${excerpt}` : ' — 결과 없음'}`;
89
+ }
90
+
80
91
  /** 채팅 한 줄 — «✓ 위임 끝: <이름> — 다음 턴에 결과»(실패·중단이면 ✗ ⊕ 상태). */
81
92
  export function formatAgentWakeNotice(n: Pick<PendingTaskNotification, 'label' | 'agentName' | 'state'>): string {
82
93
  const name = displayName(n);
@@ -86,7 +97,10 @@ export function formatAgentWakeNotice(n: Pick<PendingTaskNotification, 'label' |
86
97
  }
87
98
 
88
99
  /** 자리 TUI 에서 여는 내부 턴의 입력 — 결과 본문은 turn-preamble 이 `<task-notification>` 으로 싣는다. */
89
- export function formatAgentWakePrompt(n: Pick<PendingTaskNotification, 'label' | 'agentName' | 'state'>): string {
100
+ export function formatAgentWakePrompt(n: Pick<PendingTaskNotification, 'taskId' | 'label' | 'agentName' | 'state'>): string {
101
+ if (n.label === CLASSIC_SIDETAB_MISSION_LABEL) {
102
+ return `[자동 재개] 사이드탭 미션 완료: ${n.taskId} (${n.state}) — <task-notification> 결과를 원래 요청과 대조해 수용·부분 수용·기각을 판단하고, 필요하면 원래 대화를 계속 진행`;
103
+ }
90
104
  return `[자동 재개] 위임 끝: ${displayName(n)} (${n.state}) — <task-notification> 의 결과를 읽고 이어서 처리`;
91
105
  }
92
106
 
@@ -141,6 +155,14 @@ export function createAgentWake(deps: AgentWakeDeps): AgentWakeController {
141
155
  return false;
142
156
  }
143
157
  handled.add(n.taskId);
158
+ if (n.completionDelivery === 'supplement') {
159
+ let notifyError: string | null = null;
160
+ try { deps.notify(formatAgentSupplementNotice(n)); } catch (error) {
161
+ notifyError = error instanceof Error ? error.message : String(error);
162
+ }
163
+ log('tui.agent-wake', 'supplemented', { ...base, shown: notifyError === null, ...(notifyError !== null ? { notifyError } : {}) });
164
+ return true;
165
+ }
144
166
  // 그리기 실패가 큐·형제 리스너를 막지 않는다 — 대신 관측에 남긴다(알림이 실제로 안 보였음을 볼 수 있게).
145
167
  let notifyError: string | null = null;
146
168
  try { deps.notify(formatAgentWakeNotice(n)); } catch (error) {
@@ -355,6 +355,7 @@ export async function runDashboardChatMainPlainTurn(
355
355
  // 기록되므로 request→first-token 구간은 그대로 측정된다. ISO 시각 좌표는
356
356
  // pty record 및 TUI-BOOT-TIME(src/index.ts) 부팅 계측과의 대응용이다.
357
357
  let firstTokenLogged = false;
358
+ let modelRequestStartedAt: number | null = null;
358
359
  const logFirstToken = (chunk: string): void => {
359
360
  if (firstTokenLogged || !chunk || abortCtrl.signal.aborted) return;
360
361
  firstTokenLogged = true;
@@ -362,6 +363,7 @@ export async function runDashboardChatMainPlainTurn(
362
363
  try {
363
364
  deps.debugLog?.('chat.turn', 'first-token', {
364
365
  ms: firstTokenAt - deps.turnStartedAt,
366
+ modelRequestMs: modelRequestStartedAt === null ? null : firstTokenAt - modelRequestStartedAt,
365
367
  turnStartedAt: deps.turnStartedAt,
366
368
  turnStartedAtIso,
367
369
  firstTokenAtIso: new Date(firstTokenAt).toISOString(),
@@ -391,6 +393,13 @@ export async function runDashboardChatMainPlainTurn(
391
393
  const attempt = async (stage: string): Promise<boolean> => {
392
394
  let emitted = false;
393
395
  try {
396
+ modelRequestStartedAt = Date.now();
397
+ try {
398
+ deps.debugLog?.('chat.turn.stage', 'model-request-start', {
399
+ attempt: stage,
400
+ msSinceTurnStart: modelRequestStartedAt - deps.turnStartedAt,
401
+ });
402
+ } catch { /* observation must never delay a turn */ }
394
403
  await deps.acpSession.send({
395
404
  ...opts,
396
405
  // 라우팅 줄은 브리지가 모델 호출 «전»에 보낸다 — 모델 출력이 아니므로 재시도를 막지 않는다.