elanous 0.2.42 → 0.2.44

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 (764) 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/{X1ucLw10Cds_h614NoEnh → HMXsxdy5MIIcHPMHv1wD4}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/08334415.f0e80896acbef722.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/1032-78ba4f6391258cab.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1082-53f86a26e03d309d.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1109-7d0e264f6f2edbc7.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1124-7c26330402481143.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/{2160.a097e7b138ae1c55.js → 118.2a89982fe4276880.js} +1 -1
  10. package/apps/pwa/out/_next/static/chunks/1244.6c435dbf1bf21d8a.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1252.9e665904d3aa3b1a.js +32 -0
  12. package/apps/pwa/out/_next/static/chunks/1266.a46cc33cb6a72d75.js +104 -0
  13. package/apps/pwa/out/_next/static/chunks/1306.967240ede9a0f757.js +24 -0
  14. package/apps/pwa/out/_next/static/chunks/1344.3b95f3bd1b77a3fe.js +94 -0
  15. package/apps/pwa/out/_next/static/chunks/{4043.6b91203436c9c86b.js → 1401.22dfe92640a2b1ac.js} +4 -4
  16. package/apps/pwa/out/_next/static/chunks/1431-f7c78bd5be21e011.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/1451-cdd35a8a0b31834b.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/{6632.0eac1c554f8f2ef3.js → 1694.18debfd77562e56d.js} +2 -2
  19. package/apps/pwa/out/_next/static/chunks/1708-f03d587b7a7545c8.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/1775-fa7152bdeff6c95f.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/178-4da509cd7266672a.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/1850-522de4ee34957210.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/1876-c6f6e0ddcc76c6a1.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/1976.097066b072432242.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/{3507.97e1977bc4d5fb0a.js → 1978.eeb60a606dc5deac.js} +2 -2
  26. package/apps/pwa/out/_next/static/chunks/2043.e233e3b5a3e790f5.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2150.71b94e3348107c83.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2158.ebc6fc5a10280ab7.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2216.802962c04f40a26e.js +64 -0
  30. package/apps/pwa/out/_next/static/chunks/2294.7890edcfa046c97d.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/235.c89aaae4bcd6233a.js +74 -0
  32. package/apps/pwa/out/_next/static/chunks/{5885.0a3e52c8faccec98.js → 239.de075467b5523469.js} +2 -2
  33. package/apps/pwa/out/_next/static/chunks/249.ba7051590d603c8f.js +226 -0
  34. package/apps/pwa/out/_next/static/chunks/2571.a6ac4e26c8618403.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/2610.e149cd564a08913e.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/2705.9816f3c244f8b85f.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/2801.afeb8a4dae22f85f.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/2954.bbefc95d6b20e0d8.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/2e0f720a.a0697c08e3806a60.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3042.96ec235fe41c8d4e.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3097-8e358f158acef46b.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3205-93b1abe28b4fb16a.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3273.b4434f0dcae7eb29.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3311.9cbc43ea0c90d60c.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{1487.2f67b79444062da6.js → 3349.b5f09ee474d9533e.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/3503.a47a9755fb4d97b0.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/3506-5f429b3b7e1392b0.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/3843.bad404d008893291.js +77 -0
  49. package/apps/pwa/out/_next/static/chunks/3877-4b40e530b47e3bf9.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/435-ce2958253cf7de61.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4393.28fa5228d0eec217.js +149 -0
  52. package/apps/pwa/out/_next/static/chunks/4404.7281c847c6e10dfc.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/{8673-bab689a55f7e13b9.js → 4415-b9d6a90960920a4a.js} +3 -3
  54. package/apps/pwa/out/_next/static/chunks/447-5b304de1fe098f43.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/4484-8ebea83d431e6fae.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/{8262.ddc03e06b733f184.js → 4502.bdcc877abd437a05.js} +1 -1
  57. package/apps/pwa/out/_next/static/chunks/4599-f95790fc5c65b8df.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/{1262.e804feb8fd1acb8c.js → 46.57c783fa4884714f.js} +2 -2
  59. package/apps/pwa/out/_next/static/chunks/463-b9114e411f33728e.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/4659.a57d1f0c5d754cd2.js +36 -0
  61. package/apps/pwa/out/_next/static/chunks/4722-a847e7a28115035f.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/{1063.2fb8a9dc55c731f2.js → 4757.67c6d7473a038e78.js} +1 -1
  63. package/apps/pwa/out/_next/static/chunks/4874-c86f878ec4502ad3.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{6377.bc7df239edbff244.js → 4891.3f80ba517a3b2373.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/4998.810ca8833084caa9.js +62 -0
  66. package/apps/pwa/out/_next/static/chunks/4f98febc.ea5841d4d616bfb2.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/{3482.a9ae9d2ad6a5bd97.js → 5052.7dbb12a55d4f18f5.js} +1 -1
  68. package/apps/pwa/out/_next/static/chunks/5166-ca73b3e361085a6d.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/5180-039f4a18b07ad387.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/5232.5a2ce4daf7a9e11d.js +115 -0
  71. package/apps/pwa/out/_next/static/chunks/5439.3fec6dbce29ecb36.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/5612-074d9a5e00dfac6a.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/5675-01989d524a84c505.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/5751.af641a1adf5ec697.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/5758-c6cb98714d18ab0c.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/578eded8.b582637306e16964.js +122 -0
  77. package/apps/pwa/out/_next/static/chunks/5790.5eb06a653ebd8571.js +34 -0
  78. package/apps/pwa/out/_next/static/chunks/5853-4033e5bd5afbe06b.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/5904.97d70bb7f46b2db7.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/{3347.f846266b5e5f3ede.js → 5989.7ecd362c5c44b747.js} +3 -3
  81. package/apps/pwa/out/_next/static/chunks/{73d2eb0e.4966ad55293c801a.js → 5a34fb2f.52f1b4e1baebb48a.js} +3 -3
  82. package/apps/pwa/out/_next/static/chunks/{7a98bc80.fa935989e829f9c2.js → 5a5078f8.2099200e5ea95e16.js} +1 -1
  83. package/apps/pwa/out/_next/static/chunks/6036-c302c34ff0b3d410.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/606.ef81c313381f4264.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/616.1af54a928b1ba704.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/6201.bc936f71f613a8e9.js +41 -0
  87. package/apps/pwa/out/_next/static/chunks/6204-fdc86e0e64c4f92d.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/{7411.9b4b8b747dc7b802.js → 6245.1182e007e9d230d9.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/{b450776b.3db34d8d965f82d3.js → 63699a35.17262e162bc514b2.js} +1 -1
  90. package/apps/pwa/out/_next/static/chunks/6420.494801a80030160c.js +27 -0
  91. package/apps/pwa/out/_next/static/chunks/{e8543907.5b040a5f22a0b0e5.js → 6549dad0.2740b25e51bf8f05.js} +1 -1
  92. package/apps/pwa/out/_next/static/chunks/{9427.96aa912ddb5801e0.js → 6881.9e7955847640c7fe.js} +17 -17
  93. package/apps/pwa/out/_next/static/chunks/6931.fcdfb94141e67b3d.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/6991-8e081c6ce38c0ba1.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7010.1bbd17a7f2b3e376.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/7029.d1466acf55fae2ed.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/7152-a123aa8e129c131f.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7455.196168fffac3b9c4.js +24 -0
  99. package/apps/pwa/out/_next/static/chunks/7638.6ca4770dd1129138.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/7649-f37d76260e5e2a5a.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/7679.32c40cdd14f20b4a.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/7751.04bfbd16b4c6cd0a.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/7864.b1ff31d4030b8994.js +148 -0
  104. package/apps/pwa/out/_next/static/chunks/7869-c47bd2c075c1fefa.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/{8138.6c10b2a356d52fca.js → 8442.2f09ca969d631615.js} +1 -1
  106. package/apps/pwa/out/_next/static/chunks/8445.2738dbd59a78c78c.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8447.5510c439f9938c6d.js +286 -0
  108. package/apps/pwa/out/_next/static/chunks/{9415.69e4a21c60c7d2db.js → 8551.f762945c2cda2e95.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/8635-57a9d8d9db70f4f1.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/86961958-4b0689a5048f756b.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/8709.3c6019bb18f8554f.js +8 -0
  112. package/apps/pwa/out/_next/static/chunks/8759.c999528a0a907bf6.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/{9a852a62-6192a6ea9346ced3.js → 87f498e5-0881de09f2e44707.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/8843.c3197f904c952b81.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/{3d0154af.5331fec737ffe8c3.js → 892fd990.456232f326cc39c2.js} +1 -1
  116. package/apps/pwa/out/_next/static/chunks/8965-135a2c9eaa2464cb.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/8971-8d3b9c96f8a6c958.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9059.c8598d96f8e5e9cd.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9115.90447ae198b84eae.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9147.d9b0a02e0babc9b4.js +93 -0
  121. package/apps/pwa/out/_next/static/chunks/9204-83075f4b70c61cdc.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9244-c32ef14b5dc72bdf.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/930.2a9a30f964350c66.js +90 -0
  124. package/apps/pwa/out/_next/static/chunks/9398.1f56e3f17795f43f.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/9527.3e5ad31c891c5fcb.js +79 -0
  126. package/apps/pwa/out/_next/static/chunks/9571-4ac933e774d1225c.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-9fc644de2d8edae3.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/approvals/page-0c9dace2db62bee8.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f5e65c3dc9d89f2a.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/board/page-2a9c19b9a140b7b1.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/botlab/page-61533ad92141adfb.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/bots/page-112004ced6fd0329.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f733318c237a49d8.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/chat/page-51ea677d2d33bbc0.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/consult/page-428b41f2f9566e3c.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/control/page-1b29396ea90a61e5.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/decisions/page-cf83ec613ac904bf.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/design-check/page-3f4c0ecbc284bb5f.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/editor/page-b63c322f54f70cc6.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/exec/page-fe328c4ee9aac6b4.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/field/page-bfb855c584f0fb98.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/healthz/route-9fc644de2d8edae3.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/inside/page-47b1710c110eabd7.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/intake/page-42895214458bc6d2.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/layout-d03de0ebd8366e23.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/live/page-3ed6c47e4b1c61c2.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/live-run/page-ae653e9bf261c738.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/loops/page-23f3f0a0209c0ac4.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/market/page-88c691273aae66f9.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e187ac52a95538b3.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/morning/page-6e45828daed1295e.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/not-found-edb5d7287bb46186.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/observatory/page-4a7eaacd93c3f6a5.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ca073d43d74cc84.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1e9fee67b1199436.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-df1283ea963c6816.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/outputs/page-19fcf8d8301ccd18.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/page-5ab699e0303bbb40.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/reflection/page-7cde0d29756984c5.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-9d4c598e8ee22f7a.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/sessions/page-cc1609a71f44ec62.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-7659a9a1345bfaa9.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/settings/page-0afef60ecc0c4af5.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-a3553949f8f34f5f.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/setup/layout-9fc644de2d8edae3.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/setup/page-057a69702f3c67c7.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/share/page-c0f0e570f3f74c73.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/showroom/page-1825071ae34e3b89.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/tasks/page-6244e3e135d8ccfc.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/term/page-da787e8a10b8a82e.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/today/page-1316d32498e2be42.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/trace/page-4df94572e343de2e.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/vault/page-708969f7475e88c1.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-c58add08c919a1dc.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/app/workflows/page-a24847f45e5d5bf9.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/app/workspace/page-acfec65a3a60e22e.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-3dfc598e6fbde245.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/framework-c658a626118411b7.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-4c73685fd891445b.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-6310f7e5de7dd01d.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-51c326bf48610be1.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-d0beadf754da59b0.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-acd243bfbf3f6732.js +1 -0
  184. package/apps/pwa/out/_next/static/css/d1f8bb401740a549.css +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  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 +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/catalog/external-commands.yaml +5 -3
  279. package/catalog/meta/catalogVersion.yaml +2 -1
  280. package/catalog/signing/catalog-signing-public.pem +3 -0
  281. package/graphs/intake/intake-daily.yaml +16 -0
  282. package/graphs/intake/news-sources.yaml +1 -0
  283. package/graphs/intake/recipes.yaml +7 -0
  284. package/graphs/overlays/README.md +6 -0
  285. package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
  286. package/graphs/profiles/local.yaml +5 -0
  287. package/graphs/profiles/pod.yaml +4 -0
  288. package/graphs/release/release-loop.yaml +33 -17
  289. package/graphs/units/verbs/make-doc.yaml +1 -0
  290. package/package.json +6 -2
  291. package/plugins/demo-absorption-briefing/plugin.json +18 -0
  292. package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
  293. package/plugins/demo-browser-hand/plugin.json +13 -0
  294. package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
  295. package/plugins/demo-linear-secretary/plugin.json +15 -0
  296. package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
  297. package/plugins/demo-plugin-wizard/plugin.json +11 -0
  298. package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
  299. package/plugins/demo-research/plugin.json +16 -0
  300. package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
  301. package/plugins/demo-video-briefing/plugin.json +15 -0
  302. package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
  303. package/scripts/bench-metering-plan.ts +229 -0
  304. package/scripts/build-signed-catalog.ts +48 -0
  305. package/scripts/ci-typecheck-main-delta.sh +88 -0
  306. package/scripts/codex-fallback-live-probe.ts +1 -1
  307. package/scripts/demo/demo1104-parallel-host.ts +56 -0
  308. package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
  309. package/scripts/demo/demo1104-parallel.ts +72 -0
  310. package/scripts/demo/demo1104-stage.config.ts +21 -0
  311. package/scripts/demo/demo1104-stage.ts +316 -0
  312. package/scripts/goal-method-audit.ts +17 -1
  313. package/scripts/graph-units/land-enqueue.ts +90 -0
  314. package/scripts/hooks/codex-notify.sh +32 -0
  315. package/scripts/install.sh +10 -38
  316. package/scripts/landing-heal/land-plan.ts +57 -0
  317. package/scripts/public-leak-baseline.txt +0 -1
  318. package/scripts/release-loop/auto-approve-node.ts +1 -1
  319. package/scripts/release-loop/docs-node.ts +4 -2
  320. package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
  321. package/scripts/release-loop/gate-image-pin.ts +116 -2
  322. package/scripts/release-loop/gate-method.ts +139 -0
  323. package/scripts/release-loop/gate-node.ts +395 -43
  324. package/scripts/release-loop/gate-progress-sim.ts +73 -0
  325. package/scripts/release-loop/gate-traffic-mode.ts +151 -3
  326. package/scripts/release-loop/node-verdict.ts +38 -25
  327. package/scripts/release-loop/notes-repair.ts +18 -1
  328. package/scripts/release-loop/preflight.ts +544 -10
  329. package/scripts/release-loop/render-warm-control-manifest.ts +22 -0
  330. package/scripts/release-loop/resume-release.ts +9 -7
  331. package/scripts/release-loop/resume.ts +13 -4
  332. package/scripts/release-loop/unattended-release.ts +20 -9
  333. package/scripts/release-loop/warm-control-forward.ts +178 -0
  334. package/scripts/retro-cycle.ts +30 -8
  335. package/scripts/rhythm/daily.ts +39 -4
  336. package/scripts/rhythm/linear-progress-sync.ts +311 -0
  337. package/scripts/ux-sim.ts +7 -1
  338. package/scripts/video-pipeline.ts +9 -1
  339. package/scripts/warm-pool-provider-config.ts +35 -7
  340. package/src/acp/agent-manager.ts +1 -0
  341. package/src/acp/codex-app-server-agent.ts +33 -0
  342. package/src/acp/codex-app-server-client.ts +153 -16
  343. package/src/acp/core-turn-bridge.ts +17 -12
  344. package/src/acp/event-router.ts +20 -1
  345. package/src/acp/server.ts +6 -0
  346. package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
  347. package/src/agent-mission/claude-headless.ts +4 -1
  348. package/src/agent-mission/codex-exec.ts +105 -0
  349. package/src/agent-mission/driver.ts +192 -11
  350. package/src/agent-mission/grok-auth-status.ts +107 -0
  351. package/src/agent-mission/hand-hooks.ts +101 -0
  352. package/src/agent-mission/mission-cli.ts +56 -21
  353. package/src/agent-mission/mission-hand-reply.ts +118 -0
  354. package/src/agent-mission/mission-line.ts +180 -0
  355. package/src/agent-mission/mission-out.ts +256 -18
  356. package/src/agent-mission/tool-install.ts +122 -11
  357. package/src/agent-substrate/pr-reviewer.ts +147 -11
  358. package/src/agent-substrate/self-review-cli.ts +10 -2
  359. package/src/agents/general-purpose.md +1 -1
  360. package/src/auto-research/research-fanout.ts +221 -0
  361. package/src/auto-research/research-turn.ts +362 -31
  362. package/src/autopilot/mission-codebase-gate.ts +7 -3
  363. package/src/autopilot/pr-manager.ts +31 -3
  364. package/src/boot/daemon-tools/self-implement.ts +3 -1
  365. package/src/boot/daemon-tools/web-search.ts +1 -2
  366. package/src/briefing/brief-items.ts +55 -11
  367. package/src/cli/agent-cli.ts +2 -1
  368. package/src/cli/catalog-cli.ts +31 -0
  369. package/src/cli/connector-cli.ts +16 -0
  370. package/src/cli/control-cli.ts +15 -6
  371. package/src/cli/doctor-fix.ts +2 -2
  372. package/src/cli/intake-source-cli.ts +44 -8
  373. package/src/cli/log-event-names.ts +8 -0
  374. package/src/cli/msg-cli.ts +32 -3
  375. package/src/cli/pr-cli.ts +21 -1
  376. package/src/cli/pr-land-heavy-remote.ts +44 -6
  377. package/src/cli/pr-land-overlap-evidence.ts +13 -1
  378. package/src/cli/pr-land-pod-shadow-job.ts +143 -5
  379. package/src/cli/pr-land-pod-shadow.ts +9 -2
  380. package/src/cli/release-checklist-read-cli.ts +44 -16
  381. package/src/cli/release-cli.ts +23 -3
  382. package/src/cli/research-cli.ts +9 -0
  383. package/src/cli/setup-cli.ts +166 -6
  384. package/src/cli/setup-keys.ts +199 -0
  385. package/src/cli/task-plugin-wizard-host.ts +114 -0
  386. package/src/cli/tasks-cli.ts +54 -9
  387. package/src/cli/tui-test-cli.ts +190 -0
  388. package/src/config.ts +4 -2
  389. package/src/connectors/linear-daily-progress.ts +228 -0
  390. package/src/connectors/linear-projector.ts +34 -12
  391. package/src/connectors/linear.ts +151 -7
  392. package/src/control-plane/ledger.ts +42 -4
  393. package/src/control-plane/member-tokens.ts +25 -2
  394. package/src/control-plane/ports.ts +8 -3
  395. package/src/control-plane/server.ts +26 -5
  396. package/src/core-turn/deep-turn-bloom.ts +67 -0
  397. package/src/core-turn/research-policy.ts +43 -0
  398. package/src/core-turn/run-core-turn.ts +488 -51
  399. package/src/core-turn/types.ts +4 -0
  400. package/src/dashboard/chat/acp-chat.ts +10 -0
  401. package/src/dashboard/classic-sidetab-mission-job.ts +192 -0
  402. package/src/dashboard/classic-sidetab-mission-pair.ts +82 -0
  403. package/src/dashboard/classic-sidetab-mission-trio.ts +242 -0
  404. package/src/dashboard/classic-sidetab-mission.ts +169 -5
  405. package/src/dashboard/index.ts +387 -14
  406. package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
  407. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +8 -0
  408. package/src/dashboard/mission-cli-consumer.ts +20 -8
  409. package/src/dashboard/plugin-wizard-runtime.ts +50 -0
  410. package/src/dashboard/plugin-wizard-tool.ts +55 -0
  411. package/src/dashboard/sidetab-runtime.ts +3 -1
  412. package/src/dashboard/terminal-popup-runtime.ts +6 -3
  413. package/src/dashboard/visible-mission-diagnostics.ts +16 -0
  414. package/src/decisions/linear-progress-summary.ts +78 -0
  415. package/src/decisions/linear-progress-sync.ts +152 -0
  416. package/src/domains/outbound-alert.ts +49 -11
  417. package/src/domains/retro-cycle-observation.ts +43 -0
  418. package/src/domains/retro-cycle.ts +13 -2
  419. package/src/domains/retro-proposals.ts +92 -0
  420. package/src/domains/retro-report.ts +6 -1
  421. package/src/domains/telegram-kind-route.ts +16 -9
  422. package/src/graph-runner/arg-allowance.ts +13 -0
  423. package/src/graph-runner/graph-cli.ts +24 -1
  424. package/src/graph-runner/graph-grow-llm.ts +3 -1
  425. package/src/graph-runner/graph-run-api.ts +3 -1
  426. package/src/graph-runner/runner.ts +310 -46
  427. package/src/graph-wizard/mission-compose.ts +407 -12
  428. package/src/harness/dispatch-backpressure.ts +54 -1
  429. package/src/harness/dispatch-shadow-compare.ts +74 -0
  430. package/src/harness/harness-cli-command.ts +15 -3
  431. package/src/harness/harness-pod-dispatch.ts +3 -0
  432. package/src/harness/skill-exec.ts +21 -9
  433. package/src/harness/skill-select.ts +1 -1
  434. package/src/hooks/error-report-cloud.ts +101 -0
  435. package/src/hooks/receiver.ts +29 -2
  436. package/src/index.ts +129 -12
  437. package/src/intake-plane/actions.ts +354 -0
  438. package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
  439. package/src/intake-plane/intake-sources.ts +78 -8
  440. package/src/intake-plane/items.ts +14 -4
  441. package/src/intake-plane/linear-mission-sync.ts +80 -0
  442. package/src/intake-plane/linear-secretary-runtime.ts +178 -0
  443. package/src/intake-plane/linear-wish.ts +227 -1
  444. package/src/life/life-cli.ts +168 -0
  445. package/src/life/life-kinds.ts +160 -0
  446. package/src/live-supply/budget-consumer.ts +78 -0
  447. package/src/live-supply/read.ts +3 -0
  448. package/src/live-supply/snapshot.ts +45 -0
  449. package/src/llm/child-first-llm-observation.ts +112 -0
  450. package/src/llm/provider-credentials.ts +68 -6
  451. package/src/llm/provider-failure-evidence.ts +44 -0
  452. package/src/llm.ts +172 -12
  453. package/src/maturity/feature-maturity.ts +3 -3
  454. package/src/mcp/client.ts +7 -0
  455. package/src/mcp/proxy-runtime.ts +6 -1
  456. package/src/mcp/server.ts +54 -0
  457. package/src/msg/msg-sse-server.ts +3 -3
  458. package/src/msg/msg-store.ts +177 -19
  459. package/src/native-tool-catalog.ts +36 -2
  460. package/src/nexus/api/consult-requests.ts +18 -6
  461. package/src/nexus/api/discord-trigger-bot.ts +6 -6
  462. package/src/nexus/api/graphs-api.ts +4 -2
  463. package/src/nexus/api/grokbot-trigger-bot.ts +206 -0
  464. package/src/nexus/api/http-server.ts +37 -1
  465. package/src/nexus/api/mcp-public-allowlist.ts +2 -0
  466. package/src/nexus/api/telegram-trigger-bot.ts +6 -6
  467. package/src/nexus/boot/register-mcp-clients.ts +114 -8
  468. package/src/nexus/index.ts +22 -2
  469. package/src/nexus/outbound/format.ts +9 -0
  470. package/src/nexus/outbound/grokbot-adapter.ts +71 -0
  471. package/src/nexus/outbound/router.ts +121 -16
  472. package/src/nexus/setup-status.ts +9 -0
  473. package/src/nexus/state/state.ts +3 -0
  474. package/src/oauth/codex-account-store.ts +20 -7
  475. package/src/oauth/codex-owner-mirror.ts +81 -0
  476. package/src/oauth/codex.ts +17 -2
  477. package/src/oauth/fallback-chain.ts +47 -17
  478. package/src/onboarding/first-run-doctor.ts +8 -1
  479. package/src/onboarding/first-run.ts +126 -29
  480. package/src/onboarding/key-setup.ts +103 -0
  481. package/src/onboarding/menu-answer.ts +13 -0
  482. package/src/onboarding/secret-prompt.ts +37 -0
  483. package/src/plugins/install/plugin-install.ts +59 -0
  484. package/src/pr-tool/census.ts +130 -0
  485. package/src/preview/terminal.ts +22 -7
  486. package/src/prompt-enhance/enhance.ts +10 -0
  487. package/src/pty-shell/pty-control-ipc.ts +4 -1
  488. package/src/pty-shell/pty-write-provenance.ts +21 -3
  489. package/src/pty-shell/registry.ts +9 -2
  490. package/src/registry/catalog-server.ts +232 -0
  491. package/src/registry/loader.ts +45 -1
  492. package/src/registry/types.ts +1 -2
  493. package/src/release-loop/proposal-auto-place.ts +83 -0
  494. package/src/research/axis-fanout.ts +79 -29
  495. package/src/research/lenses/second-order.ts +312 -0
  496. package/src/self-dev/ask-launch-flow.ts +72 -1
  497. package/src/self-dev/dev-cli.ts +7 -2
  498. package/src/self-dev/dev-pipeline.ts +5 -0
  499. package/src/self-dev/draft-residue.ts +64 -5
  500. package/src/self-dev/draft-sweep.ts +31 -10
  501. package/src/self-dev/draft-triage-rules.ts +60 -3
  502. package/src/self-dev/graph-front-nodes.ts +2 -1
  503. package/src/self-dev/graph-journey-route.ts +76 -21
  504. package/src/self-dev/launch-preflight.ts +58 -0
  505. package/src/self-dev/orchestrate.ts +1 -1
  506. package/src/self-dev/run-supervisor.ts +152 -2
  507. package/src/self-dev/shard-aggregate.ts +4 -0
  508. package/src/self-dev/shard-run.ts +36 -15
  509. package/src/self-implement/abandoned-classification.ts +12 -3
  510. package/src/self-implement/budget-gate.ts +7 -0
  511. package/src/self-implement/child-llm-preference.ts +10 -1
  512. package/src/self-implement/doctor-visit.ts +30 -8
  513. package/src/self-implement/elanous-tui-spawn.ts +3 -0
  514. package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
  515. package/src/self-implement/gate-artifacts.ts +2 -1
  516. package/src/self-implement/goal-author-cli.ts +4 -2
  517. package/src/self-implement/goal-author.ts +549 -10
  518. package/src/self-implement/graph-overlay-yaml.ts +181 -4
  519. package/src/self-implement/graph-overlay.ts +3 -1
  520. package/src/self-implement/graph-profile-yaml.ts +107 -0
  521. package/src/self-implement/graph-yaml.ts +94 -5
  522. package/src/self-implement/off-diff-evidence.ts +249 -5
  523. package/src/self-implement/orchestrator.ts +298 -26
  524. package/src/self-implement/run-chart.ts +6 -3
  525. package/src/self-implement/run-ledger.ts +51 -1
  526. package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
  527. package/src/self-implement/tdd-evidence-tags.ts +9 -0
  528. package/src/self-implement/test-scenario-request.ts +37 -6
  529. package/src/self-implement/train-gate-receipt.ts +166 -0
  530. package/src/self-implement/train-gate-remote.ts +62 -18
  531. package/src/session/chat.ts +6 -4
  532. package/src/session/session-fanout.ts +2 -0
  533. package/src/session/streaming/acp-stream-sink.ts +2 -1
  534. package/src/session/streaming/chunk-producer.ts +6 -0
  535. package/src/session/streaming/stream-compositor.ts +3 -2
  536. package/src/session-runtime/index.ts +74 -6
  537. package/src/session-runtime/retry-policy.ts +1 -1
  538. package/src/setup/llm-env-detect.ts +3 -0
  539. package/src/setup/service-key-catalog.ts +46 -0
  540. package/src/setup/service-keys.ts +241 -0
  541. package/src/sidetab-core/model.ts +205 -10
  542. package/src/sidetab-core/visible-agent-mission-pair.ts +51 -0
  543. package/src/sidetab-core/visible-agent-mission.ts +182 -48
  544. package/src/skills/tools/agent.ts +23 -4
  545. package/src/skills/tools/omni-search.ts +127 -27
  546. package/src/task-agent/parent-host.ts +29 -1
  547. package/src/task-agent/recall-inject.ts +98 -0
  548. package/src/task-agent/repair-outcomes.ts +65 -0
  549. package/src/task-agent/task-hand.ts +46 -14
  550. package/src/task-orchestrator/dispatcher.ts +14 -1
  551. package/src/task-orchestrator/linear-capture-events.ts +55 -0
  552. package/src/task-orchestrator/store.ts +16 -5
  553. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +23 -1
  554. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +107 -1
  555. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
  556. package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +21 -9
  557. package/src/task-orchestrator/surfaces/pod-source-receive.ts +23 -11
  558. package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
  559. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +1 -1
  560. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +467 -77
  561. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +45 -3
  562. package/src/task-orchestrator/surfaces/self-implement-pod.ts +210 -14
  563. package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
  564. package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
  565. package/src/task-orchestrator/types.ts +14 -0
  566. package/src/telegram.ts +14 -16
  567. package/src/terminal/coding-agent.ts +14 -5
  568. package/src/terminal/session-registry.ts +1 -1
  569. package/src/tool-hints/gate.ts +46 -14
  570. package/src/tool-hints/signals.ts +1 -1
  571. package/src/tool-hints/types.ts +2 -0
  572. package/src/tool-runtime/agent-runtime.ts +1 -0
  573. package/src/tool-runtime/browser-hand-runtime.ts +391 -0
  574. package/src/tool-runtime/browser-runtime.ts +33 -19
  575. package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
  576. package/src/tool-runtime/elanous-linear-secretary-runtime.ts +173 -0
  577. package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
  578. package/src/tool-runtime/index.ts +6 -0
  579. package/src/tool-runtime/types.ts +5 -0
  580. package/src/tui/entry.ts +51 -8
  581. package/src/tui/sidetab/attach.ts +252 -11
  582. package/src/tui/sidetab/herdr-portal.ts +225 -0
  583. package/src/tui/sidetab/list.ts +3 -2
  584. package/src/tui-client/next-dashboard-runtime.ts +52 -0
  585. package/src/user-config.ts +34 -9
  586. package/src/user-intent/types.ts +4 -3
  587. package/src/ux-sim/browser-hand.ts +165 -0
  588. package/src/ux-sim/draft-inventory-builder.ts +199 -0
  589. package/src/ux-sim/fake-browser-page.ts +81 -0
  590. package/src/ux-sim/fake-linear-device.ts +31 -0
  591. package/src/ux-sim/graph-engine-sim.ts +47 -0
  592. package/src/ux-sim/linear-secretary.ts +208 -0
  593. package/src/ux-sim/mock-scenario-catalog.json +81 -26
  594. package/src/ux-sim/mock-scenario-catalog.ts +175 -5
  595. package/src/ux-sim/onboarding-first-run-device.ts +31 -21
  596. package/src/ux-sim/release-sim-rig.ts +62 -18
  597. package/src/ux-sim/scenario.ts +70 -26
  598. package/src/ux-sim/service-key-setup.ts +113 -0
  599. package/src/ux-sim/term-slash-device.ts +74 -0
  600. package/src/ux-sim/turn-throw-sim.ts +31 -0
  601. package/src/version/packed-revision.json +1 -1
  602. package/src/web-search/exa.ts +77 -0
  603. package/src/web-search/index.ts +30 -9
  604. package/src/web-search/provider.ts +4 -1
  605. package/src/web-search/x-intent.ts +5 -0
  606. package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +0 -36
  608. package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +0 -32
  614. package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +0 -286
  620. package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +0 -34
  623. package/apps/pwa/out/_next/static/chunks/2456.b6de0e1c05f28843.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/2690.0521c738b7749931.js +0 -115
  629. package/apps/pwa/out/_next/static/chunks/2974.595d1e29d040cb6a.js +0 -64
  630. package/apps/pwa/out/_next/static/chunks/3207.a756c95e9ec8c3c8.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +0 -93
  632. package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +0 -41
  633. package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +0 -24
  635. package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +0 -77
  641. package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +0 -148
  647. package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +0 -74
  648. package/apps/pwa/out/_next/static/chunks/50061469.0326382241ef3b2d.js +0 -122
  649. package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +0 -149
  650. package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +0 -27
  652. package/apps/pwa/out/_next/static/chunks/53c73f84.373b6160adfa89a4.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +0 -226
  664. package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +0 -90
  665. package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +0 -104
  671. package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +0 -94
  672. package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +0 -24
  679. package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +0 -8
  687. package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +0 -79
  689. package/apps/pwa/out/_next/static/chunks/8546-6f03f8ea34dd61d9.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/9249.976f1e69a9d80754.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/9656-374232558fd528d0.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +0 -62
  705. package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +0 -1
  738. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +0 -1
  740. package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +0 -1
  741. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +0 -1
  744. package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +0 -1
  748. package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +0 -1
  752. package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +0 -1
  758. package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +0 -1
  760. package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +0 -1
  763. package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
  764. /package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → HMXsxdy5MIIcHPMHv1wD4}/_ssgManifest.js +0 -0
@@ -779,8 +779,11 @@ export function getEscAbortRunningCount(
779
779
  export function createDashboardClassicSidetabMissionCallbacks(
780
780
  runMission: (agent: 'codex' | 'claude', mission: string, context?: ClassicSidetabMissionDispatchContext) => Promise<ClassicSidetabMissionResult>,
781
781
  cancelMission?: (interactionId: string) => Promise<boolean>,
782
+ runMissionPair?: (agent: 'codex' | 'claude', mission: string, parallelMission: string, context?: ClassicSidetabMissionDispatchContext) => Promise<ClassicSidetabMissionPairResult>,
783
+ handReply?: (input: ClassicSidetabHandReplyInput) => Promise<{ ok: boolean; body: string }>,
784
+ runMissionTrio?: (mission: string, context?: ClassicSidetabMissionDispatchContext) => Promise<ClassicSidetabMissionTrioResult>,
782
785
  ): ClassicSidetabMissionIntegration {
783
- return createClassicSidetabMissionIntegration(runMission, cancelMission);
786
+ return createClassicSidetabMissionIntegration(runMission, cancelMission, runMissionPair, handReply, runMissionTrio);
784
787
  }
785
788
 
786
789
  /** Bind the classic sidetab runtime to the ACP tool callbacks used by the dashboard. */
@@ -970,9 +973,15 @@ import {
970
973
  } from './context-menu-action-runtime.js';
971
974
  import { createDashboardTerminalPopupRuntime } from './terminal-popup-runtime.js';
972
975
  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';
976
+ import { visibleMissionFailureLogData } from './visible-mission-diagnostics.js';
977
+ import { CLASSIC_SIDETAB_MISSION_TOOL_NAME, createClassicSidetabMissionIntegration, createClassicSidetabMissionPairSessionRegistry, type ClassicSidetabHandReplyInput, type ClassicSidetabMissionAgent, type ClassicSidetabMissionDispatchContext, type ClassicSidetabMissionIntegration, type ClassicSidetabMissionPairResult, type ClassicSidetabMissionResult, type ClassicSidetabMissionTrioResult } from './classic-sidetab-mission.js';
974
978
  import { cancelClassicMissionCli, startClassicMissionCli } from './mission-cli-consumer.js';
975
979
  import { enqueueClassicSidetabMissionCompletion } from './classic-sidetab-mission-job.js';
980
+ import { startClassicSidetabMissionPair } from './classic-sidetab-mission-pair.js';
981
+ import { startClassicSidetabMissionTrio } from './classic-sidetab-mission-trio.js';
982
+ import { createDashboardPluginWizardRuntime } from './plugin-wizard-runtime.js';
983
+ import { TUI_PLUGIN_WIZARD_TOOL_NAME } from './plugin-wizard-tool.js';
984
+ import { probeGrokLogin } from '../agent-mission/grok-auth-status.js';
976
985
  import { loadSidetabRows } from '../sidetab-core/model.js';
977
986
  import { toggleDashboardAssistantRenderState } from './assistant-render-state-runtime.js';
978
987
  import { bootDashboardAcpBgSweep } from './acp-bg-sweep-boot.js';
@@ -1112,8 +1121,10 @@ import {
1112
1121
  import { initElementObservability } from '../element-registry/index.js';
1113
1122
  import {
1114
1123
  createSearchPlannerState,
1124
+ buildSubagentSessionRuntimeToolSpecs,
1115
1125
  buildSessionRuntimeToolSpecs,
1116
1126
  buildSessionDashboardStatusLines,
1127
+ resolveDynamicSessionNativeToolSpecs,
1117
1128
  consumeSessionQuickControl,
1118
1129
  createSessionPostureState,
1119
1130
  enterSessionControlMode,
@@ -13570,7 +13581,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13570
13581
  // single line.
13571
13582
  type TerminalPopupRequest =
13572
13583
  | { kind: 'shell'; cwd: string; command?: string; env?: Record<string, string> }
13573
- | { kind: 'coding-agent'; brand: 'claude-code' | 'codex' | 'gemini'; cwd: string; extraArgs?: readonly string[] };
13584
+ | { kind: 'coding-agent'; brand: 'claude-code' | 'codex' | 'gemini' | 'grok'; cwd: string; extraArgs?: readonly string[]; env?: Record<string, string>; id?: string };
13574
13585
 
13575
13586
  const openInteractiveTerminalPopup = (req: TerminalPopupRequest): TerminalSession | null => {
13576
13587
  const { cols: tc, rows: tr } = termSize();
@@ -13686,7 +13697,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13686
13697
  {
13687
13698
  brand: req.brand,
13688
13699
  cwd: req.cwd,
13700
+ id: req.id,
13689
13701
  extraArgs: req.extraArgs ? [...req.extraArgs] : undefined,
13702
+ env: req.env,
13690
13703
  onExit: handleExit,
13691
13704
  onTitleAction: handleTitleAction,
13692
13705
  },
@@ -13699,6 +13712,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13699
13712
  const installLabel =
13700
13713
  req.brand === 'claude-code' ? 'Claude Code'
13701
13714
  : req.brand === 'gemini' ? 'Gemini CLI (@google/gemini-cli)'
13715
+ : req.brand === 'grok' ? 'Grok CLI'
13702
13716
  : 'Codex CLI';
13703
13717
  chatLines.push(C.muted(
13704
13718
  ` Install ${installLabel} first, then try again.`,
@@ -13816,10 +13830,39 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13816
13830
  },
13817
13831
  spawnShell: () => { spawnGlobalTerminalModal(); },
13818
13832
  spawnAgent: (agent) => {
13819
- TerminalPopup.agent(agent === 'claude' ? 'claude-code' : 'codex').cwd(workingDir.cwd).open();
13833
+ void (async () => {
13834
+ try {
13835
+ const prepared = await prepareClassicSidetabAgentCli(agent);
13836
+ if (!prepared.ready) {
13837
+ chatLines.push(C.warning(` ${prepared.message}`));
13838
+ chatScrollOffset = -1;
13839
+ draw();
13840
+ return;
13841
+ }
13842
+ TerminalPopup.agent(agent === 'claude' ? 'claude-code' : 'codex').cwd(workingDir.cwd).open();
13843
+ } catch {
13844
+ chatLines.push(C.warning(` ${agent}: 설치·로그인 상태를 확인하지 못했습니다`));
13845
+ chatScrollOffset = -1;
13846
+ draw();
13847
+ }
13848
+ })();
13820
13849
  },
13821
13850
  runMission: async (agent, mission, requestedOutputPath) => {
13822
- return runDashboardAgentMission({
13851
+ try {
13852
+ const prepared = await prepareClassicSidetabAgentCli(agent);
13853
+ if (!prepared.ready) return {
13854
+ ok: false, path: requestedOutputPath ?? '', promptReady: false,
13855
+ missionVisible: false, promptReturned: false, completionMarker: false,
13856
+ error: prepared.message,
13857
+ };
13858
+ } catch {
13859
+ return {
13860
+ ok: false, path: requestedOutputPath ?? '', promptReady: false,
13861
+ missionVisible: false, promptReturned: false, completionMarker: false,
13862
+ error: `${agent}: 설치·로그인 상태를 확인하지 못했습니다`,
13863
+ };
13864
+ }
13865
+ const result = await runDashboardAgentMission({
13823
13866
  agent,
13824
13867
  requestedOutputPath,
13825
13868
  open: () => TerminalPopup.agent(agent === 'claude' ? 'claude-code' : 'codex').cwd(workingDir.cwd).open() ?? undefined,
@@ -13844,6 +13887,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13844
13887
  if (terminalModalRouter.current()?.id === session.id) terminalModalRouter.close();
13845
13888
  },
13846
13889
  });
13890
+ const failure = visibleMissionFailureLogData(agent, result);
13891
+ if (failure) debug.log('classic-sidetab.mission', 'failed', failure, { level: 'warn' });
13892
+ return result;
13847
13893
  },
13848
13894
  detach: (row) => {
13849
13895
  if (row?.currentProcess) {
@@ -13885,15 +13931,45 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13885
13931
  },
13886
13932
  });
13887
13933
  closeClassicSidetabRuntime = () => classicSidetabRuntime.close();
13934
+ const classicMissionPairSessions = createClassicSidetabMissionPairSessionRegistry();
13935
+ const cancelClassicSidetabMission = async (interactionId: string): Promise<boolean> => {
13936
+ const paired = classicMissionPairSessions.cancel(
13937
+ interactionId,
13938
+ (sessionId) => Boolean(sessionRegistry.get(sessionId)),
13939
+ (sessionId) => sessionRegistry.kill(sessionId),
13940
+ );
13941
+ return paired ?? cancelClassicMissionCli(interactionId);
13942
+ };
13943
+ const handReplyTargets = new Map<string, { missionId: string; attemptId: string; agent: 'codex' | 'claude'; token: string; nexusUrl: string; ptyId: string; runId: string }>();
13944
+ const prepareClassicSidetabAgentCli = async (agent: 'codex' | 'claude') => {
13945
+ const [{ prepareAgentCli }, { requestConfirmation }] = await Promise.all([
13946
+ import('../agent-mission/tool-install.js'), import('../hitl/confirm.js'),
13947
+ ]);
13948
+ return prepareAgentCli(agent, {
13949
+ onStatus: (line) => {
13950
+ chatLines.push(C.muted(` ${line}`));
13951
+ chatScrollOffset = -1;
13952
+ draw();
13953
+ },
13954
+ confirmInstall: async (prompt) => (await requestConfirmation({
13955
+ prompt,
13956
+ detail: '확인하면 공식 npm 설치 명령을 실행한 뒤 설치 버전과 로그인을 다시 확인합니다.',
13957
+ agentKind: 'agent-cli',
13958
+ onTimeout: () => false,
13959
+ })).answer,
13960
+ });
13961
+ };
13962
+ const pluginWizardPairCompletions = new Map<string, Promise<import('./classic-sidetab-mission-job.js').ClassicSidetabMissionPairCompletionResult>>();
13888
13963
  const classicSidetabMission = createDashboardClassicSidetabMissionCallbacks(async (agent, mission, context) => {
13889
13964
  const started = await startClassicMissionCli({
13890
13965
  agent,
13891
13966
  prompt: mission,
13967
+ ...(context?.linearIssueId ? { linearIssueId: context.linearIssueId } : {}),
13892
13968
  onInteractionId: (interactionId) => debug.log('classic-sidetab.mission', 'started', {
13893
13969
  interactionId,
13894
13970
  toolCallId: context?.callId ?? null,
13895
13971
  }),
13896
- });
13972
+ }, { prepareAgentCli: prepareClassicSidetabAgentCli });
13897
13973
  if (!('completion' in started)) return started;
13898
13974
  const job = started;
13899
13975
  enqueueClassicSidetabMissionCompletion(job, agent, (notification) => globalTaskNotificationQueue.enqueue(notification));
@@ -13904,7 +13980,225 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13904
13980
  path: job.path,
13905
13981
  content: 'Independent sidetab job started; this conversation can continue.',
13906
13982
  };
13907
- }, cancelClassicMissionCli);
13983
+ }, cancelClassicSidetabMission, async (agent, mission, parallelMission, context) => {
13984
+ for (const member of ['codex', 'claude'] as const) {
13985
+ const prepared = await prepareClassicSidetabAgentCli(member);
13986
+ if (!prepared.ready) {
13987
+ const failed = (error: string) => ({ ok: false, status: 'failed' as const, error });
13988
+ return {
13989
+ pairId: 'agent-cli-not-ready',
13990
+ codex: member === 'codex' ? failed(prepared.message) : failed('Pair 실행을 시작하지 않았습니다'),
13991
+ claude: member === 'claude' ? failed(prepared.message) : failed('Pair 실행을 시작하지 않았습니다'),
13992
+ };
13993
+ }
13994
+ }
13995
+ const [{ createMissionLineStore }, { missionChildEnv, renderMissionAgentInstructions, createMissionOutStore }, { effectiveInstanceRoot }, { resolveDaemonEndpoint }] = await Promise.all([
13996
+ import('../agent-mission/mission-line.js'), import('../agent-mission/mission-out.js'),
13997
+ import('../instance/resolve.js'), import('../nexus/daemon-endpoint.js'),
13998
+ ]);
13999
+ const stateRoot = effectiveInstanceRoot();
14000
+ const missionStore = createMissionOutStore(stateRoot);
14001
+ const endpoint = (process.env.ELANOUS_NEXUS_URL?.trim() || resolveDaemonEndpoint()?.baseUrl || '').replace(/\/$/, '');
14002
+ const handLines = new Map<string, { attemptId: string; handLine?: ReturnType<ReturnType<typeof createMissionLineStore>['issue']> }>();
14003
+ const spawnVisible = (member: 'codex' | 'claude', missionId: string, attemptId: string) => {
14004
+ const ptyId = crypto.randomUUID();
14005
+ const handLine = endpoint ? createMissionLineStore(stateRoot).issue({
14006
+ missionId, attemptId, agent: member,
14007
+ who: member === 'claude' ? 'Claude' : 'Codex', what: mission.replace(/\s+/g, ' ').trim().slice(0, 180) || 'sidetab mission',
14008
+ runId: ptyId, ptyId,
14009
+ }) : undefined;
14010
+ handLines.set(missionId, { attemptId, handLine });
14011
+ try {
14012
+ const env = handLine && endpoint
14013
+ ? Object.fromEntries(Object.entries(missionChildEnv(stateRoot, missionId, process.env, { ...handLine, agent: member, nexusUrl: endpoint, runId: ptyId, ptyId })).filter((entry): entry is [string, string] => typeof entry[1] === 'string'))
14014
+ : undefined;
14015
+ const session = TerminalPopup.agent(member === 'claude' ? 'claude-code' : 'codex').cwd(workingDir.cwd).id(ptyId).env(env ?? {}).open();
14016
+ if (session && terminalModalRouter.current()?.id === session.id) terminalModalRouter.close();
14017
+ if (session) debug.log('classic-sidetab.mission-pair', 'started', { pairMember: member, interactionId: session.id, toolCallId: context?.callId ?? null });
14018
+ return session;
14019
+ } catch {
14020
+ return null;
14021
+ }
14022
+ };
14023
+ const runVisible = async (member: 'codex' | 'claude', prompt: string, session: TerminalSession | null, missionId?: string): Promise<ClassicSidetabMissionResult> => {
14024
+ const outputPath = session
14025
+ ? join(session.cwd, '.elanous', 'mission-results', `classic-pair-${session.id}-${Date.now()}.md.tmp`)
14026
+ : '';
14027
+ if (!session) return { ok: false, status: 'failed', path: outputPath, error: `${member} sidetab PTY could not start` };
14028
+ let missionFinished = false;
14029
+ let askMonitor: Promise<void> | undefined;
14030
+ try {
14031
+ const [{ runVisibleAgentMission }, { codexBackend, claudeBackend }] = await Promise.all([
14032
+ import('../sidetab-core/visible-agent-mission.js'),
14033
+ import('../agent-mission/driver.js'),
14034
+ ]);
14035
+ const targetOutputPath = outputPath.slice(0, -4);
14036
+ missionStore.create({ missionId: missionId!, agent: member, prompt, cwd: session.cwd, outputPath, targetOutputPath });
14037
+ const lineIdentity = handLines.get(missionId!);
14038
+ if (lineIdentity?.handLine && endpoint) handReplyTargets.set(missionId!, {
14039
+ missionId: missionId!, attemptId: lineIdentity.attemptId, agent: member,
14040
+ token: lineIdentity.handLine.token, nexusUrl: endpoint, ptyId: session.id, runId: session.id,
14041
+ });
14042
+ const backend = member === 'codex' ? codexBackend : claudeBackend;
14043
+ askMonitor = (async () => {
14044
+ const seen = new Set<number>();
14045
+ while (!missionFinished) {
14046
+ for (const event of missionStore.replies(missionId!).filter((reply) => reply.kind === 'ask' && !seen.has(reply.sequence))) {
14047
+ seen.add(event.sequence);
14048
+ try {
14049
+ globalTaskNotificationQueue.enqueue({
14050
+ taskId: `${missionId}:ask:${event.sequence}`,
14051
+ ...(context?.parentSessionId ? { parentSessionId: context.parentSessionId } : {}),
14052
+ agentName: member === 'claude' ? 'Claude Code' : 'Codex',
14053
+ label: 'sidetab mission ask', state: 'done', truncated: false,
14054
+ output: JSON.stringify({
14055
+ missionId, sequence: event.sequence, runId: session.id, ptyId: session.id,
14056
+ actor: member, question: event.text, options: null,
14057
+ defaults: event.defaults ?? '', deadline: event.deadline ?? null,
14058
+ instruction: 'Call HandReply with missionId, replyTo=sequence, actor=agent, runId, kind=answer/correct, and text; correct also needs scope/stop/priority. After the deadline the child uses its default.',
14059
+ }),
14060
+ durationMs: 0, finishedAt: Date.now(),
14061
+ });
14062
+ } catch { /* notification delivery cannot interrupt the PTY mission */ }
14063
+ }
14064
+ await new Promise((resolve) => setTimeout(resolve, 400));
14065
+ }
14066
+ })();
14067
+ const resultPromise = Promise.resolve().then(() => runVisibleAgentMission({
14068
+ pty: {
14069
+ snapshot: () => session.preview.renderForLLM(),
14070
+ write: (bytes) => session.preview.write(bytes),
14071
+ isAlive: () => session.preview.isAlive,
14072
+ },
14073
+ mission: `${renderMissionAgentInstructions(missionId!, stateRoot)}\n\nTask:\n${prompt}`,
14074
+ outputPath,
14075
+ handleTrust: (screen, write) => backend.handleTrust?.(screen, write) ?? false,
14076
+ }));
14077
+ const result = await resultPromise.finally(() => { missionFinished = true; });
14078
+ await askMonitor;
14079
+ handReplyTargets.delete(missionId!);
14080
+ const failure = visibleMissionFailureLogData(member, result, missionId);
14081
+ if (failure) debug.log('classic-sidetab.mission-pair', 'member-failed', failure, { level: 'warn' });
14082
+ if (result.ok) await missionStore.complete(missionId!);
14083
+ else await missionStore.finish(missionId!, { status: 'failed', error: result.error ?? 'visible mission failed' });
14084
+ return { ...result, status: result.ok ? 'completed' as const : 'failed' as const, interactionId: missionId };
14085
+ } catch (error) {
14086
+ missionFinished = true;
14087
+ await askMonitor?.catch(() => undefined);
14088
+ if (missionId) handReplyTargets.delete(missionId);
14089
+ if (missionId && missionStore.read(missionId)?.status === 'running') {
14090
+ await missionStore.finish(missionId, { status: 'failed', error: error instanceof Error ? error.message : String(error) }).catch(() => undefined);
14091
+ }
14092
+ return { ok: false, status: 'failed' as const, interactionId: missionId, path: outputPath, error: error instanceof Error ? error.message : String(error) };
14093
+ }
14094
+ };
14095
+ const started = startClassicSidetabMissionPair({
14096
+ agent,
14097
+ mission,
14098
+ parallelMission,
14099
+ context,
14100
+ spawnVisible,
14101
+ runVisible,
14102
+ registry: classicMissionPairSessions,
14103
+ hasSession: (sessionId) => Boolean(sessionRegistry.get(sessionId)),
14104
+ killSession: (sessionId) => sessionRegistry.kill(sessionId),
14105
+ enqueue: (notification) => globalTaskNotificationQueue.enqueue(notification),
14106
+ });
14107
+ if (context?.callId?.startsWith('plugin-wizard:')) {
14108
+ pluginWizardPairCompletions.set(context.callId, started.completion);
14109
+ }
14110
+ void started.completion;
14111
+ return started.result;
14112
+ }, async (input) => {
14113
+ const target = handReplyTargets.get(input.missionId);
14114
+ if (!target) {
14115
+ const [{ effectiveInstanceRoot }, { createMissionOutStore }, { recordHeadlessMissionHandReply }] = await Promise.all([
14116
+ import('../instance/resolve.js'), import('../agent-mission/mission-out.js'), import('../agent-mission/mission-hand-reply.js'),
14117
+ ]);
14118
+ const store = createMissionOutStore(effectiveInstanceRoot());
14119
+ const result = await recordHeadlessMissionHandReply(input, store);
14120
+ return { ok: result.ok, body: result.ok ? `Recorded ${input.kind} on headless mission line (record-only; no PTY input).` : result.reason };
14121
+ }
14122
+ const { recordAndDeliverMissionHandReply } = await import('../agent-mission/mission-hand-reply.js');
14123
+ const result = await recordAndDeliverMissionHandReply({ target, ...input });
14124
+ const delivery = result.ok ? result.delivery === 'ask-ledger' ? 'recorded in the mission ledger for a matching ask waiter' : 'delivered through PTY arbiter' : '';
14125
+ return { ok: result.ok, body: result.ok ? `Recorded ${input.kind} and ${delivery} (line ${result.lineId}).` : `${result.reason}; recorded=${result.recorded}, delivered=${result.delivered}${result.lineId ? ` (line ${result.lineId})` : ''}.` };
14126
+ }, async (mission, context) => {
14127
+ const { codexBackend, claudeBackend, grokBackend } = await import('../agent-mission/driver.js');
14128
+ const spawnVisible = (member: ClassicSidetabMissionAgent, missionId: string) => {
14129
+ try {
14130
+ const brand = member === 'claude' ? 'claude-code' : member;
14131
+ const backend = member === 'codex' ? codexBackend : member === 'claude' ? claudeBackend : grokBackend;
14132
+ const session = TerminalPopup.agent(brand).cwd(workingDir.cwd).id(missionId).args(backend.args).open();
14133
+ if (session && terminalModalRouter.current()?.id === session.id) terminalModalRouter.close();
14134
+ if (session) debug.log('classic-sidetab.mission-trio', 'started', { member, interactionId: session.id, toolCallId: context?.callId ?? null });
14135
+ return session;
14136
+ } catch (error) {
14137
+ debug.log('classic-sidetab.mission-trio', 'spawn-failed', { member, reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' });
14138
+ return null;
14139
+ }
14140
+ };
14141
+ const runVisible = async (member: ClassicSidetabMissionAgent, prompt: string, session: TerminalSession | null, missionId?: string): Promise<ClassicSidetabMissionResult> => {
14142
+ const outputPath = session ? join(session.cwd, '.elanous', 'mission-results', `classic-trio-${member}-${session.id}-${Date.now()}.md.tmp`) : '';
14143
+ if (!session) return { ok: false, status: 'failed', path: outputPath, error: `${member} sidetab PTY could not start` };
14144
+ try {
14145
+ const { runVisibleAgentMission } = await import('../sidetab-core/visible-agent-mission.js');
14146
+ const backend = member === 'codex' ? codexBackend : member === 'claude' ? claudeBackend : grokBackend;
14147
+ const result = await runVisibleAgentMission({
14148
+ pty: { snapshot: () => session.preview.renderForLLM(), write: (bytes) => session.preview.write(bytes), isAlive: () => session.preview.isAlive },
14149
+ mission: prompt,
14150
+ outputPath,
14151
+ handleTrust: (screen, write) => backend.handleTrust?.(screen, write) ?? false,
14152
+ });
14153
+ const failure = visibleMissionFailureLogData(member, result, missionId);
14154
+ if (failure) debug.log('classic-sidetab.mission-trio', 'member-failed', failure, { level: 'warn' });
14155
+ return { ...result, status: result.ok ? 'completed' : 'failed', interactionId: missionId, finalScreen: session.preview.renderForLLM() };
14156
+ } catch (error) {
14157
+ return {
14158
+ ok: false,
14159
+ status: 'failed',
14160
+ path: outputPath,
14161
+ interactionId: missionId,
14162
+ error: error instanceof Error ? error.message : String(error),
14163
+ finalScreen: session.preview.renderForLLM(),
14164
+ };
14165
+ }
14166
+ };
14167
+ const started = await startClassicSidetabMissionTrio({
14168
+ mission,
14169
+ context,
14170
+ checkGrokAuth: probeGrokLogin,
14171
+ spawnVisible: (member, missionId) => spawnVisible(member, missionId),
14172
+ runVisible,
14173
+ registry: classicMissionPairSessions,
14174
+ hasSession: (sessionId) => Boolean(sessionRegistry.get(sessionId)),
14175
+ killSession: (sessionId) => sessionRegistry.kill(sessionId),
14176
+ enqueue: (notification) => globalTaskNotificationQueue.enqueue(notification),
14177
+ });
14178
+ void started.completion;
14179
+ return started.result;
14180
+ });
14181
+ const tuiPluginWizard = createDashboardPluginWizardRuntime({
14182
+ getWorkspace: () => getSessionCwd(),
14183
+ runMissionPair: async ({ runId, prompt, context }) => {
14184
+ const pairCallId = `plugin-wizard:${runId}`;
14185
+ const started = await classicSidetabMission.dispatchTool('RunSidetabMission', {
14186
+ agent: 'codex', mission: prompt, parallelMission: prompt,
14187
+ }, { callId: pairCallId, ...(context?.parentSessionId ? { parentSessionId: context.parentSessionId } : {}) });
14188
+ const completion = pluginWizardPairCompletions.get(pairCallId);
14189
+ if (!completion || started?.status === 'error') {
14190
+ pluginWizardPairCompletions.delete(pairCallId);
14191
+ throw new Error(started?.body ?? 'Codex/Claude pair did not start');
14192
+ }
14193
+ try {
14194
+ const result = await completion;
14195
+ return {
14196
+ codex: { ok: result.codex.ok, ...(result.codex.content ? { content: result.codex.content } : {}), ...(result.codex.error ? { error: result.codex.error } : {}) },
14197
+ claude: { ok: result.claude.ok, ...(result.claude.content ? { content: result.claude.content } : {}), ...(result.claude.error ? { error: result.claude.error } : {}) },
14198
+ };
14199
+ } finally { pluginWizardPairCompletions.delete(pairCallId); }
14200
+ },
14201
+ });
13908
14202
  disposeClassicSigquit = registerClassicSigquitHandler(() => {
13909
14203
  classicSidetabRuntime.beginPrefix();
13910
14204
  });
@@ -15417,7 +15711,19 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15417
15711
  surface: acpTurnRef.turnProfile?.surface,
15418
15712
  })
15419
15713
  : [];
15420
- const classicTools = runtime ? classicSidetabMission.getTools(tools) : tools;
15714
+ const surface = acpTurnRef.turnProfile?.surface;
15715
+ const researchDefaults = surface?.id === 'research/agent'
15716
+ ? resolveDynamicSessionNativeToolSpecs({
15717
+ userText,
15718
+ defaultFamilyIds: surface.defaultNativeFamilyIds,
15719
+ surfaceId: surface.id,
15720
+ }).filter(tool => ['WebSearch', 'OmniSearch', 'WebFetch'].includes(tool.name))
15721
+ : [];
15722
+ const withSurfaceDefaults = [...new Map(
15723
+ [...researchDefaults, ...tools].map(tool => [tool.name, tool] as const),
15724
+ ).values()];
15725
+ const classicTools = runtime ? classicSidetabMission.getTools(withSurfaceDefaults) : withSurfaceDefaults;
15726
+ const tuiTools = tuiPluginWizard.getTools(classicTools);
15421
15727
  return [
15422
15728
  ...tuiChatPersonaMessages(currentChatPersonaSessionId(), chatPersonaSelection),
15423
15729
  ...buildDashboardTurnPreamble({
@@ -15433,14 +15739,14 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15433
15739
  // codex-only behavioral addendum (fix L-1) inside the
15434
15740
  // universal preamble.
15435
15741
  modelFamily: getModelFamily(activeModel),
15436
- enabledTools: classicTools.map(t => t.name),
15742
+ enabledTools: tuiTools.map(t => t.name),
15437
15743
  seatBoot: true,
15438
15744
  }),
15439
15745
  ];
15440
15746
  },
15441
15747
  getTools: ({ userText }) => {
15442
15748
  const runtime = acpToolRuntime;
15443
- if (!runtime) return [];
15749
+ if (!runtime) return tuiPluginWizard.getTools([]);
15444
15750
  const tools = buildSessionRuntimeToolSpecs({
15445
15751
  userText,
15446
15752
  hostTools: pluginHost.hostLLMTools(),
@@ -15448,7 +15754,19 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15448
15754
  optionalTools: acpTurnRef.optionalSpecs,
15449
15755
  surface: acpTurnRef.turnProfile?.surface,
15450
15756
  });
15451
- const classicTools = classicSidetabMission.getTools(tools);
15757
+ const surface = acpTurnRef.turnProfile?.surface;
15758
+ const researchDefaults = surface?.id === 'research/agent'
15759
+ ? resolveDynamicSessionNativeToolSpecs({
15760
+ userText,
15761
+ defaultFamilyIds: surface.defaultNativeFamilyIds,
15762
+ surfaceId: surface.id,
15763
+ }).filter(tool => ['WebSearch', 'OmniSearch', 'WebFetch'].includes(tool.name))
15764
+ : [];
15765
+ const withSurfaceDefaults = [...new Map(
15766
+ [...researchDefaults, ...tools].map(tool => [tool.name, tool] as const),
15767
+ ).values()];
15768
+ const classicTools = classicSidetabMission.getTools(withSurfaceDefaults);
15769
+ const tuiTools = tuiPluginWizard.getTools(classicTools);
15452
15770
  // ⭐ Remember this turn's catalog so a spawned sub-agent can inherit it.
15453
15771
  //
15454
15772
  // `dispatchAgent` computes `childTools = (hostTools ?? []).filter(...)`,
@@ -15456,8 +15774,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15456
15774
  // or edit anything, which is the whole point of delegating code work.
15457
15775
  // Exposing `Agent` without this wiring is worse than not exposing it:
15458
15776
  // the model picks a delegate that provably cannot act.
15459
- acpTurnToolSpecs = classicTools.filter(tool => tool.name !== CLASSIC_SIDETAB_MISSION_TOOL_NAME);
15460
- return classicTools;
15777
+ acpTurnToolSpecs = tuiTools.filter(tool => tool.name !== CLASSIC_SIDETAB_MISSION_TOOL_NAME && tool.name !== TUI_PLUGIN_WIZARD_TOOL_NAME);
15778
+ return tuiTools;
15461
15779
  },
15462
15780
  // R2 essential TUI execution boundary: ACP receives the same
15463
15781
  // Codex-first decision as every other surface. The core bridge now
@@ -15473,8 +15791,14 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15473
15791
  // Count at the server-side boundary, before any tool effect and
15474
15792
  // before the ACP notification can reach the TUI client.
15475
15793
  acpToolDispatchCount++;
15794
+ const pluginWizardResult = tuiPluginWizard.dispatchTool(name, args, {
15795
+ callId: ctx?.callId,
15796
+ parentSessionId: ctx?.sessionId,
15797
+ });
15798
+ if (pluginWizardResult) return await pluginWizardResult;
15476
15799
  const classicMissionResult = classicSidetabMission.dispatchTool(name, args, {
15477
15800
  callId: ctx?.callId,
15801
+ parentSessionId: ctx?.sessionId,
15478
15802
  });
15479
15803
  if (classicMissionResult) return classicMissionResult;
15480
15804
  // For Agent with no `hand` or `hand: internal`, the sidetab
@@ -15507,6 +15831,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15507
15831
  draw,
15508
15832
  signal: turnSignal,
15509
15833
  toolCallId: ctx?.callId,
15834
+ inheritGeneralPurposeToolCatalog: true,
15510
15835
  // ⛔⭐ 폴백은 `''` 가 아니라 `undefined` 다 — 「안 넘김」과 「말했는데 어휘가 없음」은 «다른 값»이다.
15511
15836
  // harnessMentionState(session-runtime 소비처)는 `undefined → 'absent'` · `'' → 'not-matched'` 로
15512
15837
  // 가른다. `?? ''` 로 접으면 그 둘이 같은 값이 되고, 그것이 2026-08-06 에 「TUI 가 하니스에게
@@ -15534,12 +15859,39 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15534
15859
  parentSessionId: ctx?.sessionId,
15535
15860
  toolCallId,
15536
15861
  signal: hasParentTurnAbortSignal ? turnSignal : undefined,
15862
+ inheritGeneralPurposeToolCatalog: true,
15537
15863
  // ⭐ Agent-family context. Without these two the sub-agent runs
15538
15864
  // text-only (see getTools above). `agentDispatchTool` routes the
15539
15865
  // child's calls back through THIS dispatcher so the child gets the
15540
15866
  // same policy/truncation treatment as the parent — not a second,
15541
15867
  // laxer path.
15542
15868
  agentHostTools: acpTurnToolSpecs,
15869
+ // Agent children inherit the full TUI-visible tool catalog,
15870
+ // not only this turn's surface/tier-selected model catalog.
15871
+ // Calls still route through this parent dispatcher, preserving
15872
+ // availability and dangerous-tool policy checks.
15873
+ buildChildToolCatalog: (childCwd) => {
15874
+ const childCatalog = buildSubagentSessionRuntimeToolSpecs({
15875
+ hostTools: pluginHost.hostLLMTools(),
15876
+ // Runtime can disappear between the parent turn and a child
15877
+ // spawn. In that case keep the captured TUI host catalog below.
15878
+ runtimeTools: runtime?.listToolRuntimes('tui') ?? [],
15879
+ optionalTools: acpTurnRef.optionalSpecs,
15880
+ });
15881
+ const specs = [...new Map(
15882
+ [...acpTurnToolSpecs, ...childCatalog]
15883
+ .filter(tool => tool.name !== CLASSIC_SIDETAB_MISSION_TOOL_NAME && tool.name !== TUI_PLUGIN_WIZARD_TOOL_NAME)
15884
+ .map(tool => [tool.name, tool] as const),
15885
+ ).values()];
15886
+ return {
15887
+ specs,
15888
+ dispatch: (childName: string, childArgs: Record<string, unknown>) =>
15889
+ acpDispatchToolSelf
15890
+ ? acpDispatchToolSelf(childName, childArgs, ctx)
15891
+ : Promise.resolve({ error: 'parent dispatcher unavailable' }),
15892
+ workingDirectory: childCwd,
15893
+ };
15894
+ },
15543
15895
  // ⛔ Forward the parent's `ctx` — without it `turnIndex` is lost and
15544
15896
  // the child's output is attributed to the wrong turn by the
15545
15897
  // truncation/persist path (and the search planner loses its
@@ -17774,11 +18126,32 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17774
18126
  },
17775
18127
  agentLauncher: {
17776
18128
  open: (brand, agentArgs) => {
17777
- TerminalPopup
18129
+ const launch = () => TerminalPopup
17778
18130
  .agent(brand)
17779
18131
  .cwd(getSessionCwd())
17780
18132
  .args([...agentArgs])
17781
18133
  .open();
18134
+ if (brand === 'gemini') {
18135
+ launch();
18136
+ return;
18137
+ }
18138
+ const agent = brand === 'claude-code' ? 'claude' : 'codex';
18139
+ void (async () => {
18140
+ try {
18141
+ const prepared = await prepareClassicSidetabAgentCli(agent);
18142
+ if (!prepared.ready) {
18143
+ chatLines.push(C.warning(` ${prepared.message}`));
18144
+ chatScrollOffset = -1;
18145
+ draw();
18146
+ return;
18147
+ }
18148
+ launch();
18149
+ } catch {
18150
+ chatLines.push(C.warning(` ${agent}: 설치·로그인 상태를 확인하지 못했습니다`));
18151
+ chatScrollOffset = -1;
18152
+ draw();
18153
+ }
18154
+ })();
17782
18155
  },
17783
18156
  },
17784
18157
  theme: {
@@ -127,6 +127,29 @@ export function dispatchDashboardChatMainAcpSend(
127
127
  else interimBodyRanges.push({ start: assistantBodyStart, end: assistantBodyEnd });
128
128
  deps.setChatScrollToTail();
129
129
  },
130
+ replaceText: (fullText) => {
131
+ const insertionIndex = interimBodyRanges.length > 0
132
+ ? Math.min(...interimBodyRanges.map((range) => range.start))
133
+ : deps.chatLines.length;
134
+ for (const { start, end } of [...interimBodyRanges].reverse()) {
135
+ deps.chatLines.splice(start, end - start);
136
+ }
137
+ interimBodyRanges.length = 0;
138
+ accumulated = fullText;
139
+ firstChunk = false;
140
+ assistantTextActive = true;
141
+ assistantRunUsesPrefix = true;
142
+ assistantBodyText = fullText;
143
+ assistantBodyStart = insertionIndex;
144
+ const rendered = deps.formatAssistantLines(fullText);
145
+ rendered.forEach((line, index) => {
146
+ deps.chatLines.splice(insertionIndex + index, 0,
147
+ index === 0 ? `${deps.formatAssistantPrefix(display)} ${line}` : ` ${line}`);
148
+ });
149
+ assistantBodyEnd = insertionIndex + rendered.length;
150
+ interimBodyRanges.push({ start: insertionIndex, end: assistantBodyEnd });
151
+ deps.setChatScrollToTail();
152
+ },
130
153
  foldGoalInterim: (text) => {
131
154
  const verdict = classifyInterimReply(text.split('\n'));
132
155
  if (verdict.interim && interimBodyRanges.length > 0) {
@@ -9,6 +9,7 @@ import type { DashboardTurnBlockAttachLike } from '../turn-message-runtime.js';
9
9
  import type { DashboardAssistantRenderState } from '../turn-tail-runtime.js';
10
10
  import type { SearchPlannerState } from '../../session-runtime/index.js';
11
11
  import { runDashboardPlainTurnStream } from './dashboard-plain-turn-stream.js';
12
+ import { runConfiguredTurnThrowSim, type TurnThrowSim } from '../../ux-sim/turn-throw-sim.js';
12
13
  import {
13
14
  formatFailureNotice, matchFailureText, recordFailureSignatureMatch,
14
15
  } from '../../self-health/signatures.js';
@@ -103,6 +104,8 @@ export interface DashboardChatMainPlainTurnRuntimeDeps {
103
104
  readToolDispatchCount?: () => number | null;
104
105
 
105
106
  attachChatStreamingKeys: (abortCtrl: AbortController) => () => void;
107
+ /** Test-injectable turn-body failure. Omitted in ordinary callers; the configured simulation remains inert by default. */
108
+ turnThrowSim?: TurnThrowSim;
106
109
  /** ⭐ 관측 심 — 형제 `chat-main-entry-runtime` 과 «같은 형태»다(재발명 0 · `OBS-T124`). */
107
110
  debugLog?: (category: string, event: string, payload: Record<string, unknown>, opts?: { level?: 'warn' }) => void;
108
111
  createOptionalSpecs: () => Promise<unknown[]>;
@@ -228,6 +231,7 @@ export async function runDashboardChatMainPlainTurn(
228
231
  cleanedUp = true;
229
232
  attachedCleanupEsc();
230
233
  };
234
+ await (deps.turnThrowSim ?? runConfiguredTurnThrowSim)(stage);
231
235
  // ⛔⭐⭐⭐ **「스트리밍 키 사다리가 «이 턴»에 걸렸나」를 값으로 남긴다**(2026-08-19 · `OBS-T124`).
232
236
  //
233
237
  // 🚨 왜 필요한가 — 대표 제보(*"스트리밍 중 친 발화가 큐에 안 쌓인다"*)를 라이브로 재현했더니
@@ -270,6 +274,7 @@ export async function runDashboardChatMainPlainTurn(
270
274
  // message actually carries the pixels/bytes, not just the token.
271
275
  await deps.loadAttachments(deps.contextRegistry);
272
276
  stage = 'loadAttachments';
277
+ await (deps.turnThrowSim ?? runConfiguredTurnThrowSim)(stage);
273
278
  if (finishIfAborted()) return;
274
279
 
275
280
  const { userMsg } = deps.buildTurnMessage({
@@ -290,6 +295,7 @@ export async function runDashboardChatMainPlainTurn(
290
295
  typeof userMsg.content === 'string' ? userMsg.content : '',
291
296
  );
292
297
  stage = 'beginCodeEditTurn';
298
+ await (deps.turnThrowSim ?? runConfiguredTurnThrowSim)(stage);
293
299
  if (finishIfAborted()) return;
294
300
 
295
301
  const preamble = deps.buildTurnPreamble({
@@ -309,6 +315,7 @@ export async function runDashboardChatMainPlainTurn(
309
315
  const compactChanged = prePassApplied && (deps.chat.history.length !== beforeCompact.length
310
316
  || deps.chat.history.some((message, index) => message !== beforeCompact[index]));
311
317
  stage = 'runAutoCompact';
318
+ await (deps.turnThrowSim ?? runConfiguredTurnThrowSim)(stage);
312
319
  if (finishIfAborted()) return;
313
320
 
314
321
  deps.pushChatLine('');
@@ -317,6 +324,7 @@ export async function runDashboardChatMainPlainTurn(
317
324
  let assistantStart = deps.chatLines.length;
318
325
  let optionalSpecs = await deps.createOptionalSpecs();
319
326
  stage = 'createOptionalSpecs';
327
+ await (deps.turnThrowSim ?? runConfiguredTurnThrowSim)(stage);
320
328
  if (finishIfAborted()) return;
321
329
  if (deps.control) {
322
330
  const signal = findRecentQuickPassSignal({