elanous 0.2.41 → 0.2.43

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 (796) 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 → Om5xS9jpjSXJCeTNGYEi4}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{2fe2c302.41b517f88d6fe502.js → 0966f8a1.745fcd44f64a87ea.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{385e4574.e9886ab32759eda3.js → 0ad6802e.ae7afb63fdcb4491.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/114.2b90424d1a3ce84c.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1151-5c2bb8f002ca2dd6.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1200.6a37c202f9f17e9a.js +226 -0
  9. package/apps/pwa/out/_next/static/chunks/1261-a616d5728e02e624.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1313-19f737e0222c4444.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1357.3bbef3976c37f94a.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1362-20adddfaf662b0fa.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/{6874.d5cf7eb8edb2cabe.js → 1406.a1dc2ab6f8449374.js} +2 -2
  14. package/apps/pwa/out/_next/static/chunks/1737-9491fc6ab29b9ec6.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1803-4f91a8e7dcaf042c.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/{5744.b9415e18ad623100.js → 1961.a81b12872c3e93a9.js} +1 -1
  17. package/apps/pwa/out/_next/static/chunks/1970cf59.2d4d8ce5d6c81853.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/2073-ba274e00e4f9efb4.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/{5471.1e611302ed3a7c53.js → 2144.25b292396712196d.js} +2 -2
  21. package/apps/pwa/out/_next/static/chunks/{3230-49298c3b73ef2268.js → 2268-53861f339e0b65a2.js} +1 -1
  22. package/apps/pwa/out/_next/static/chunks/{9834.63ab2bbc3153172e.js → 2312.0c8b61e22d3136d7.js} +1 -1
  23. package/apps/pwa/out/_next/static/chunks/{1800.f7ff51dc4978a958.js → 2573.387a707f6f9d720c.js} +2 -2
  24. package/apps/pwa/out/_next/static/chunks/273.f156eee28f11af77.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2873.d2140e5a82546401.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/{9048.212083de42d25be3.js → 3072.01338851ca21a6f7.js} +2 -2
  27. package/apps/pwa/out/_next/static/chunks/3091.a5a4143dea33d197.js +90 -0
  28. package/apps/pwa/out/_next/static/chunks/3095.dc44586a5f83b86d.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/{2263.e09b6edea33bad2d.js → 3113.d7472bbc27d580c7.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/3228-9650b6447b6fa288.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/3402.44b565b314f2263c.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{addc2b32.8c4ff8f0aefe987d.js → 3557ac4a.c8931684475018ad.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/360.ae9f9f4c33c395e8.js +79 -0
  34. package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +286 -0
  35. package/apps/pwa/out/_next/static/chunks/{a0a01613.6d1cca322238d7fe.js → 363bfab3.9623b9f89363541f.js} +1 -1
  36. package/apps/pwa/out/_next/static/chunks/3694.e0099884345f0198.js +64 -0
  37. package/apps/pwa/out/_next/static/chunks/3744.54f87db52acfd1ab.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3903.3ef4656c67572764.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3935.16701e33f8982dc9.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3955.6922286237f2ac2b.js +24 -0
  41. package/apps/pwa/out/_next/static/chunks/3969.272ee7f9fd6c62e5.js +34 -0
  42. package/apps/pwa/out/_next/static/chunks/4199.ce86b281fd0a60b7.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/4311-6dd3144002cc0c2d.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4426-2b230fad00c88930.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{530.d26346e18089640a.js → 4445.7990c76b3751a918.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4447-14c5161fa59166c7.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4856-b0b8075bba8c53f4.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4870-de370d65e73c0bb5.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4885-2c989165c4b29fad.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4894.fec2ca9e99caefa2.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/5093.8f04b7f8cb899a95.js +94 -0
  52. package/apps/pwa/out/_next/static/chunks/5122-2bb177cebf89e19a.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/5154.5f56dc3902e3d275.js +36 -0
  54. package/apps/pwa/out/_next/static/chunks/529.64ff7257180b2ac9.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5394.5dabeb0c62293a28.js +93 -0
  56. package/apps/pwa/out/_next/static/chunks/5461.08bf2404ff38ec85.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/5474-22e08a85583209b2.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/{1219.7e17964e0e7cd8e5.js → 5564.9e72532188f57586.js} +3 -3
  59. package/apps/pwa/out/_next/static/chunks/5567-265df39ed8fe9dcb.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5570-a94ae19811cb2046.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5574-b47c9ef2dceff1fd.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5628.6ddb2d5ffba4ff4c.js +309 -0
  63. package/apps/pwa/out/_next/static/chunks/5730.43d7ccc09988e646.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{1178.1aa9cad0e7695427.js → 5789.2da35c258292e1e5.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/{4133.2056bb4d78f621af.js → 5824.da9527b15a3221e5.js} +1 -1
  66. package/apps/pwa/out/_next/static/chunks/5866.366966af47fdde5d.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/{4527.a69f2894d1bc9f4a.js → 5930.8b4df3b46c32b05a.js} +1 -1
  68. package/apps/pwa/out/_next/static/chunks/5963-c4d8469c52a0828b.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/6001.ec4049ceb3c43418.js +27 -0
  70. package/apps/pwa/out/_next/static/chunks/6120-471f03db1e299c0c.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6175-41479e643aca1878.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6291.a2de4f9787637075.js +104 -0
  73. package/apps/pwa/out/_next/static/chunks/6400-6699907c3537436a.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/6428.1f4327d6ae5fdf9a.js +287 -0
  75. package/apps/pwa/out/_next/static/chunks/644.02cb026fa44bcd0a.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6466-6c87d60d3dd174fb.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{9507.7026657a2f47eb64.js → 6540.c7bef57ad8f90a87.js} +16 -16
  78. package/apps/pwa/out/_next/static/chunks/6773.d4264665ab31bec0.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6822.3c789f1a8443e774.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/{5574.f35accf4f132b29d.js → 6944.309f4e3ea54d1537.js} +1 -1
  81. package/apps/pwa/out/_next/static/chunks/7261-8ff69d3b2ee671fd.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7266.084c6bbc70035140.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/7271.5c0100e7320aa856.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7429-bf5731358c8f2f68.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7464.01f7a0ae1215fbe7.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7479.0fcad5f37eb64f0c.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/7483.427a2fe2049e388d.js +148 -0
  88. package/apps/pwa/out/_next/static/chunks/7502-be74718178e13e56.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/7530.0889722b19572065.js +24 -0
  90. package/apps/pwa/out/_next/static/chunks/7645.5b2ee3ad45c55ea3.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7788.7d1c79f1a8e18946.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7900.096f455c7c1efc53.js +77 -0
  93. package/apps/pwa/out/_next/static/chunks/7910-6f139bcafd238b9f.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7966.f71c8958d1637548.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{5947-135e26537d80a6b9.js → 8062-7cd0bcc7f01455ba.js} +3 -3
  96. package/apps/pwa/out/_next/static/chunks/8073.f6cf2f2c71aafbd0.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8201.190b94088980f430.js +74 -0
  98. package/apps/pwa/out/_next/static/chunks/8205.282ca4bb62d54a0a.js +62 -0
  99. package/apps/pwa/out/_next/static/chunks/8313-dfa1021bb58a46d6.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/837-81336ebaca8198a8.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8447.7963352ef5f71b76.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8574-868e8129525ef6d9.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8588.d1c6a2903727ce87.js +149 -0
  104. package/apps/pwa/out/_next/static/chunks/8637.90f92d5c8db4732c.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/{2743.5d3f76948be32b34.js → 868.6e953be05bcf6dca.js} +2 -2
  106. package/apps/pwa/out/_next/static/chunks/8706-e1fe0309343a2273.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8749-06384cdfc4520add.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{5964-7e21164a8f2cf0ce.js → 8861-cc1fa1c7b920fa8e.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/8967-7dfebf710c9dec9d.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/{5159.115f1c2ca471386c.js → 8986.8e2e4efbfa655c59.js} +1 -1
  111. package/apps/pwa/out/_next/static/chunks/8997-3c564dbb3b58b055.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/923.2034d10ae91e9c20.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/943.39ae5e82f4f1893f.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9469.0500480de55fb205.js +32 -0
  116. package/apps/pwa/out/_next/static/chunks/9770.5f75bc6088b16109.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9810-2543267050e58b82.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9870.8419702475254745.js +8 -0
  119. package/apps/pwa/out/_next/static/chunks/9941-376d1b74d51b01a4.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9958.385434ab04241758.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{b2271e54.c1de3347976e90b0.js → aa57532f.510551854ff239b1.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-deea1450b17cb8dc.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-70985b904f8650ef.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a2e15e33e56a4353.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-fc72ce2db12d6ca9.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-be03e41f9436ebd9.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-35a35999382da3f2.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-3ff5b1e6ca88b848.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-a65101300a0ee5c1.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-3aca5b6d67dba511.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-45b8ab0a71e61314.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-53046e282d4cda8e.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-17809e60e8354c17.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-fd2442d347bf5898.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-e9d720d6fc082e21.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-6b8b4267bab0a677.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-deea1450b17cb8dc.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-8bcf6233ac7c17af.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-7cc25591cfc2126f.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-053e871f35c9beba.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-eff819f0c2d5e084.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-4d7e9d8db5274a87.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-2b2d8f5aa5f69ad4.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-0b8f92c5062e68b1.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1bd9d0fdac2ced3d.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-9ee28f7df07428ea.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-44b7a1ff468c6648.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-cbc6523711dc1b65.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-fdad47899c2695be.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-40f9e19149024298.js → page-79a8b5fee4c20871.js} +1 -1
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-03e8ac9606aeaffb.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-4cd55c55ec287e2f.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-db17b4305404161e.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-30041d848350fd02.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c540da022dbf86b0.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9399efc538da057f.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-a142dfb0331a05f5.js → page-ca2d09128c585ca4.js} +1 -1
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-0e2635aecd343038.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ef7f4399b6b7726e.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-deea1450b17cb8dc.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-caf530535b875468.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-eaa20c1543a5fd8e.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c541eb1b75120f61.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-ab5e213eda9479f4.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-0a815f34367b6db6.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-e858ba0ed9393b68.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-1638ee9dd6e0582f.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-4cf5a399109391f2.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b4396321238798ec.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-cb72bfd21006781a.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6135d0242afbc434.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a1dccf907eddb856.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{53aeb4ee-51c92f8d683f5220.js → c7945435-b44d4dbe90ba0dcb.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/{2fdf2931.b431eee4fb468bc3.js → cb0f8df8.09a4a6be97e3fc5f.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/{c0c1a699.0ba79f97005965d4.js → d96660fb.cbc21a2a88539dbb.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/ea514caa.05a24f78d9dffe5f.js +122 -0
  177. package/apps/pwa/out/_next/static/chunks/{83184dcd-0ee6247ff41eb3f2.js → fb7d20d5-6892502b6ee39ca6.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/framework-e8a911e19b1be41f.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-7022f418fabba021.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-e5f15df755756a1e.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-4525f91e36940c9b.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-140f0e519c085b0f.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-8f22ef63dcb865b1.js +1 -0
  184. package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
  185. package/apps/pwa/out/_next/static/css/d1f8bb401740a549.css +1 -0
  186. package/apps/pwa/out/approvals/index.html +1 -1
  187. package/apps/pwa/out/approvals/index.txt +23 -23
  188. package/apps/pwa/out/autopilot/index.html +1 -1
  189. package/apps/pwa/out/autopilot/index.txt +23 -23
  190. package/apps/pwa/out/board/index.html +1 -1
  191. package/apps/pwa/out/board/index.txt +23 -23
  192. package/apps/pwa/out/botlab/index.html +1 -1
  193. package/apps/pwa/out/botlab/index.txt +22 -22
  194. package/apps/pwa/out/bots/index.html +1 -1
  195. package/apps/pwa/out/bots/index.txt +22 -22
  196. package/apps/pwa/out/ceo/index.html +1 -1
  197. package/apps/pwa/out/ceo/index.txt +23 -23
  198. package/apps/pwa/out/chat/index.html +1 -1
  199. package/apps/pwa/out/chat/index.txt +22 -22
  200. package/apps/pwa/out/consult/index.html +1 -1
  201. package/apps/pwa/out/consult/index.txt +23 -23
  202. package/apps/pwa/out/control/index.html +1 -1
  203. package/apps/pwa/out/control/index.txt +23 -23
  204. package/apps/pwa/out/decisions/index.html +1 -1
  205. package/apps/pwa/out/decisions/index.txt +22 -22
  206. package/apps/pwa/out/design-check/index.html +1 -1
  207. package/apps/pwa/out/design-check/index.txt +23 -23
  208. package/apps/pwa/out/editor/index.html +1 -1
  209. package/apps/pwa/out/editor/index.txt +24 -25
  210. package/apps/pwa/out/exec/index.html +1 -1
  211. package/apps/pwa/out/exec/index.txt +23 -23
  212. package/apps/pwa/out/field/index.html +1 -1
  213. package/apps/pwa/out/field/index.txt +23 -23
  214. package/apps/pwa/out/healthz +1 -1
  215. package/apps/pwa/out/index.html +1 -1
  216. package/apps/pwa/out/index.txt +22 -22
  217. package/apps/pwa/out/inside/index.html +1 -1
  218. package/apps/pwa/out/inside/index.txt +23 -23
  219. package/apps/pwa/out/intake/index.html +1 -1
  220. package/apps/pwa/out/intake/index.txt +23 -23
  221. package/apps/pwa/out/live/index.html +1 -1
  222. package/apps/pwa/out/live/index.txt +24 -25
  223. package/apps/pwa/out/live-run/index.html +1 -1
  224. package/apps/pwa/out/live-run/index.txt +24 -25
  225. package/apps/pwa/out/loops/index.html +1 -1
  226. package/apps/pwa/out/loops/index.txt +22 -22
  227. package/apps/pwa/out/market/index.html +1 -1
  228. package/apps/pwa/out/market/index.txt +22 -22
  229. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  230. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  231. package/apps/pwa/out/morning/index.html +1 -1
  232. package/apps/pwa/out/morning/index.txt +23 -23
  233. package/apps/pwa/out/observatory/index.html +1 -1
  234. package/apps/pwa/out/observatory/index.txt +23 -23
  235. package/apps/pwa/out/ops/checklist/index.html +1 -1
  236. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  237. package/apps/pwa/out/ops/release/index.html +1 -1
  238. package/apps/pwa/out/ops/release/index.txt +22 -22
  239. package/apps/pwa/out/ops/seats/index.html +1 -1
  240. package/apps/pwa/out/ops/seats/index.txt +22 -22
  241. package/apps/pwa/out/outputs/index.html +1 -1
  242. package/apps/pwa/out/outputs/index.txt +22 -22
  243. package/apps/pwa/out/reflection/index.html +1 -1
  244. package/apps/pwa/out/reflection/index.txt +23 -23
  245. package/apps/pwa/out/scheduler/index.html +1 -1
  246. package/apps/pwa/out/scheduler/index.txt +23 -23
  247. package/apps/pwa/out/sessions/index.html +1 -1
  248. package/apps/pwa/out/sessions/index.txt +22 -22
  249. package/apps/pwa/out/settings/devices/index.html +1 -1
  250. package/apps/pwa/out/settings/devices/index.txt +23 -23
  251. package/apps/pwa/out/settings/index.html +1 -1
  252. package/apps/pwa/out/settings/index.txt +23 -23
  253. package/apps/pwa/out/setup/done/index.html +1 -1
  254. package/apps/pwa/out/setup/done/index.txt +23 -23
  255. package/apps/pwa/out/setup/index.html +1 -1
  256. package/apps/pwa/out/setup/index.txt +23 -23
  257. package/apps/pwa/out/share/index.html +1 -1
  258. package/apps/pwa/out/share/index.txt +23 -23
  259. package/apps/pwa/out/showroom/index.html +1 -1
  260. package/apps/pwa/out/showroom/index.txt +22 -22
  261. package/apps/pwa/out/tasks/index.html +1 -1
  262. package/apps/pwa/out/tasks/index.txt +23 -23
  263. package/apps/pwa/out/term/index.html +1 -1
  264. package/apps/pwa/out/term/index.txt +23 -23
  265. package/apps/pwa/out/today/index.html +1 -1
  266. package/apps/pwa/out/today/index.txt +23 -23
  267. package/apps/pwa/out/trace/index.html +1 -1
  268. package/apps/pwa/out/trace/index.txt +23 -23
  269. package/apps/pwa/out/vault/index.html +1 -1
  270. package/apps/pwa/out/vault/index.txt +23 -23
  271. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  272. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  273. package/apps/pwa/out/workflows/index.html +1 -1
  274. package/apps/pwa/out/workflows/index.txt +23 -23
  275. package/apps/pwa/out/workspace/index.html +1 -1
  276. package/apps/pwa/out/workspace/index.txt +23 -23
  277. package/apps/pwa/out/worktrees/index.html +1 -1
  278. package/apps/pwa/out/worktrees/index.txt +23 -23
  279. package/catalog/external-commands.yaml +5 -3
  280. package/catalog/meta/catalogVersion.yaml +2 -1
  281. package/catalog/signing/catalog-signing-public.pem +3 -0
  282. package/docs/goal-context/04-mock-scenarios.md +13 -0
  283. package/graphs/catalog/catalog.yaml +1 -1
  284. package/graphs/heal/heal-loop.yaml +1 -0
  285. package/graphs/intake/intake-daily.yaml +16 -0
  286. package/graphs/intake/news-sources.yaml +1 -0
  287. package/graphs/intake/recipes.yaml +7 -0
  288. package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
  289. package/graphs/overlays/stop-heal-ladder.yaml +113 -0
  290. package/graphs/profiles/local.yaml +5 -0
  291. package/graphs/profiles/pod.yaml +4 -0
  292. package/graphs/units/verbs/recipes.yaml +11 -11
  293. package/graphs/work/research-report.yaml +10 -2
  294. package/package.json +6 -2
  295. package/plugins/demo-absorption-briefing/plugin.json +18 -0
  296. package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
  297. package/plugins/demo-browser-hand/plugin.json +13 -0
  298. package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
  299. package/plugins/demo-linear-secretary/plugin.json +15 -0
  300. package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
  301. package/plugins/demo-plugin-wizard/plugin.json +11 -0
  302. package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
  303. package/plugins/demo-research/plugin.json +16 -0
  304. package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
  305. package/plugins/demo-video-briefing/plugin.json +15 -0
  306. package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
  307. package/scripts/build-signed-catalog.ts +48 -0
  308. package/scripts/ci-typecheck-main-delta.sh +88 -0
  309. package/scripts/codex-fallback-live-probe.ts +1 -1
  310. package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
  311. package/scripts/demo/demo1104-stage.config.ts +21 -0
  312. package/scripts/demo/demo1104-stage.ts +316 -0
  313. package/scripts/goal-method-audit.ts +17 -1
  314. package/scripts/graph-units/land-enqueue.ts +90 -0
  315. package/scripts/heal/run-role.ts +99 -5
  316. package/scripts/hooks/codex-notify.sh +32 -0
  317. package/scripts/install.sh +10 -38
  318. package/scripts/land-global-checks.ts +6 -1
  319. package/scripts/landing-heal/land-plan.ts +57 -0
  320. package/scripts/lib/decompose-ab.ts +1 -0
  321. package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
  322. package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
  323. package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
  324. package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
  325. package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
  326. package/scripts/lib/tui-regress-checks.ts +33 -13
  327. package/scripts/release-loop/auto-approve-node.ts +1 -1
  328. package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
  329. package/scripts/release-loop/gate-baseline-receipt.ts +47 -9
  330. package/scripts/release-loop/gate-image-pin.ts +81 -0
  331. package/scripts/release-loop/gate-method.ts +139 -0
  332. package/scripts/release-loop/gate-node-sim.ts +207 -0
  333. package/scripts/release-loop/gate-node.ts +463 -64
  334. package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
  335. package/scripts/release-loop/gate-radius-live.ts +97 -13
  336. package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
  337. package/scripts/release-loop/gate-traffic-mode.ts +151 -3
  338. package/scripts/release-loop/gate-train-receipts.ts +122 -0
  339. package/scripts/release-loop/node-verdict.ts +38 -25
  340. package/scripts/release-loop/preflight.ts +362 -8
  341. package/scripts/release-loop/resume-release.ts +83 -8
  342. package/scripts/release-loop/unattended-release.ts +20 -9
  343. package/scripts/rhythm/daily.ts +36 -4
  344. package/scripts/rhythm/linear-progress-sync.ts +298 -0
  345. package/scripts/ux-sim.ts +18 -1
  346. package/scripts/video-pipeline.ts +9 -1
  347. package/scripts/warm-pool-provider-config.ts +286 -0
  348. package/skills/omni-crawl/SKILL.md +5 -2
  349. package/skills/omni-crawl/scripts/main.ts +84 -23
  350. package/src/acp/agent-manager.ts +1 -0
  351. package/src/acp/codex-app-server-agent.ts +33 -0
  352. package/src/acp/codex-app-server-client.ts +153 -16
  353. package/src/acp/core-turn-bridge.ts +27 -9
  354. package/src/acp/event-router.ts +20 -1
  355. package/src/acp/server.ts +6 -0
  356. package/src/agent/registry.ts +2 -0
  357. package/src/agent/task-notification.ts +25 -5
  358. package/src/agent/types.ts +6 -0
  359. package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
  360. package/src/agent-mission/claude-headless.ts +4 -1
  361. package/src/agent-mission/codex-exec.ts +105 -0
  362. package/src/agent-mission/driver.ts +192 -11
  363. package/src/agent-mission/grok-auth-status.ts +47 -0
  364. package/src/agent-mission/hand-hooks.ts +101 -0
  365. package/src/agent-mission/mission-cli.ts +63 -4
  366. package/src/agent-mission/mission-hand-reply.ts +118 -0
  367. package/src/agent-mission/mission-line.ts +180 -0
  368. package/src/agent-mission/mission-out.ts +833 -0
  369. package/src/agent-mission/tool-install.ts +200 -3
  370. package/src/agent-substrate/context-strategy.ts +4 -4
  371. package/src/agent-substrate/self-review-cli.ts +178 -13
  372. package/src/agents/general-purpose.md +1 -1
  373. package/src/auto-research/research-turn.ts +211 -53
  374. package/src/autopilot/pr-manager.ts +69 -10
  375. package/src/autopilot/pty-control-loop.ts +2 -0
  376. package/src/boot/daemon-tools/self-implement.ts +3 -1
  377. package/src/boot/daemon-tools/web-search.ts +1 -2
  378. package/src/briefing/brief-items.ts +55 -11
  379. package/src/capture/tui-self-report.ts +22 -6
  380. package/src/chat/index.ts +1 -1
  381. package/src/cli/agent-cli.ts +2 -1
  382. package/src/cli/catalog-cli.ts +31 -0
  383. package/src/cli/connector-cli.ts +16 -0
  384. package/src/cli/doctor-fix.ts +2 -2
  385. package/src/cli/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
  386. package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
  387. package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
  388. package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
  389. package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
  390. package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
  391. package/src/cli/intake-source-cli.ts +44 -8
  392. package/src/cli/msg-cli.ts +32 -3
  393. package/src/cli/pr-cli.ts +21 -1
  394. package/src/cli/pr-land-heavy-remote.ts +75 -5
  395. package/src/cli/pr-land-overlap-evidence.ts +113 -2
  396. package/src/cli/pr-land-pod-shadow-job.ts +202 -4
  397. package/src/cli/pr-land-pod-shadow.ts +9 -2
  398. package/src/cli/release-checklist-read-cli.ts +57 -19
  399. package/src/cli/release-cli.ts +23 -3
  400. package/src/cli/research-cli.ts +13 -5
  401. package/src/cli/setup-cli.ts +166 -6
  402. package/src/cli/setup-keys.ts +187 -0
  403. package/src/cli/task-plugin-wizard-host.ts +114 -0
  404. package/src/cli/tasks-cli.ts +61 -9
  405. package/src/cli/tui-test-cli.ts +186 -0
  406. package/src/compact/auto.ts +8 -1
  407. package/src/config.ts +4 -2
  408. package/src/connectors/linear-daily-progress.ts +228 -0
  409. package/src/connectors/linear-projector.ts +34 -12
  410. package/src/connectors/linear.ts +151 -7
  411. package/src/control-plane/ledger.ts +52 -2
  412. package/src/control-plane/server.ts +16 -2
  413. package/src/core-turn/deep-turn-bloom.ts +67 -0
  414. package/src/core-turn/research-policy.ts +37 -0
  415. package/src/core-turn/run-core-turn.ts +606 -95
  416. package/src/core-turn/run-goal-loop.ts +18 -0
  417. package/src/core-turn/types.ts +4 -0
  418. package/src/dashboard/chat/acp-chat.ts +10 -0
  419. package/src/dashboard/classic-sidetab-mission-job.ts +161 -0
  420. package/src/dashboard/classic-sidetab-mission-pair.ts +81 -0
  421. package/src/dashboard/classic-sidetab-mission-trio.ts +219 -0
  422. package/src/dashboard/classic-sidetab-mission.ts +347 -0
  423. package/src/dashboard/index.ts +517 -18
  424. package/src/dashboard/input/agent-wake.ts +23 -1
  425. package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
  426. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +17 -0
  427. package/src/dashboard/mission-cli-consumer.ts +165 -0
  428. package/src/dashboard/plugin-wizard-runtime.ts +50 -0
  429. package/src/dashboard/plugin-wizard-tool.ts +55 -0
  430. package/src/dashboard/seat-boot-preamble.ts +171 -1
  431. package/src/dashboard/side-basic-runtime.ts +54 -1
  432. package/src/dashboard/sidetab-runtime.ts +90 -1
  433. package/src/dashboard/skill-catalog-preamble.ts +101 -0
  434. package/src/dashboard/skill-detection-runtime.ts +55 -15
  435. package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
  436. package/src/dashboard/terminal-popup-runtime.ts +6 -3
  437. package/src/dashboard/turn-preamble.ts +53 -15
  438. package/src/dashboard/turn-prompt-runtime.ts +4 -2
  439. package/src/decisions/linear-progress-summary.ts +78 -0
  440. package/src/decisions/linear-progress-sync.ts +152 -0
  441. package/src/domains/outbound-alert.ts +49 -11
  442. package/src/domains/telegram-kind-route.ts +16 -9
  443. package/src/graph-runner/arg-allowance.ts +13 -0
  444. package/src/graph-runner/graph-cli.ts +23 -7
  445. package/src/graph-runner/graph-run-api.ts +3 -1
  446. package/src/graph-runner/graph-tick.ts +10 -2
  447. package/src/graph-runner/runner.ts +86 -18
  448. package/src/graph-wizard/mission-compose.ts +407 -12
  449. package/src/grok/agent-search.ts +14 -4
  450. package/src/grok/credential.ts +28 -11
  451. package/src/harness/dispatch-backpressure.ts +54 -1
  452. package/src/harness/dispatch-shadow-compare.ts +74 -0
  453. package/src/harness/harness-cli-command.ts +11 -1
  454. package/src/harness/harness-pod-dispatch.ts +81 -15
  455. package/src/harness/harness-stop.ts +155 -11
  456. package/src/harness/skill-exec.ts +21 -9
  457. package/src/harness/skill-select.ts +1 -1
  458. package/src/hooks/error-report-cloud.ts +101 -0
  459. package/src/hooks/receiver.ts +29 -2
  460. package/src/index.ts +159 -13
  461. package/src/instance/spawn-elanous.ts +6 -4
  462. package/src/intake-plane/actions.ts +354 -0
  463. package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
  464. package/src/intake-plane/intake-sources.ts +78 -8
  465. package/src/intake-plane/items.ts +14 -4
  466. package/src/intake-plane/linear-mission-sync.ts +80 -0
  467. package/src/intake-plane/linear-secretary-runtime.ts +178 -0
  468. package/src/intake-plane/linear-wish.ts +227 -1
  469. package/src/life/life-cli.ts +168 -0
  470. package/src/life/life-kinds.ts +160 -0
  471. package/src/live-supply/budget-consumer.ts +78 -0
  472. package/src/live-supply/read.ts +3 -0
  473. package/src/live-supply/snapshot.ts +45 -0
  474. package/src/llm/provider-credentials.ts +8 -2
  475. package/src/llm.ts +168 -9
  476. package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
  477. package/src/loops/orchestrator/tick.ts +13 -0
  478. package/src/maturity/feature-maturity.ts +4 -4
  479. package/src/msg/msg-sse-server.ts +3 -3
  480. package/src/msg/msg-store.ts +177 -19
  481. package/src/native-tool-catalog.ts +38 -4
  482. package/src/nexus/api/harness-traversal.ts +11 -0
  483. package/src/nexus/api/http-server.ts +37 -1
  484. package/src/nexus/api/mcp-public-allowlist.ts +2 -0
  485. package/src/nexus/index.ts +7 -2
  486. package/src/nexus/outbound/format.ts +9 -0
  487. package/src/nexus/outbound/router.ts +98 -13
  488. package/src/nexus/setup-status.ts +9 -0
  489. package/src/nexus/state/state.ts +3 -0
  490. package/src/oauth/codex-account-store.ts +20 -7
  491. package/src/oauth/codex-owner-mirror.ts +44 -0
  492. package/src/oauth/codex.ts +17 -2
  493. package/src/oauth/fallback-chain.ts +47 -17
  494. package/src/onboarding/first-run-doctor.ts +8 -1
  495. package/src/onboarding/first-run.ts +85 -26
  496. package/src/onboarding/key-setup.ts +103 -0
  497. package/src/onboarding/menu-answer.ts +13 -0
  498. package/src/onboarding/secret-prompt.ts +37 -0
  499. package/src/plugins/install/plugin-install.ts +59 -0
  500. package/src/pr-tool/census.ts +133 -2
  501. package/src/pty-shell/pty-control-ipc.ts +4 -1
  502. package/src/pty-shell/tui-run-state.ts +188 -2
  503. package/src/registry/catalog-server.ts +232 -0
  504. package/src/registry/loader.ts +45 -1
  505. package/src/registry/types.ts +1 -2
  506. package/src/release-loop/checklist-target-path-hint.ts +13 -0
  507. package/src/release-loop/checklist.ts +9 -1
  508. package/src/repl/index.ts +43 -2
  509. package/src/research/axis-fanout.ts +136 -16
  510. package/src/research/bloom-exemplars.ts +3 -1
  511. package/src/research/gap-followup.ts +13 -1
  512. package/src/research/plugin-discovery.ts +36 -14
  513. package/src/research-bridge/invoke.ts +22 -5
  514. package/src/research-bridge/types.ts +2 -0
  515. package/src/self-dev/ask-launch-flow.ts +72 -1
  516. package/src/self-dev/decompose.ts +119 -5
  517. package/src/self-dev/dev-cli.ts +4 -1
  518. package/src/self-dev/dev-pipeline.ts +5 -0
  519. package/src/self-dev/draft-residue.ts +64 -5
  520. package/src/self-dev/graph-front-nodes.ts +2 -1
  521. package/src/self-dev/graph-journey-route.ts +76 -21
  522. package/src/self-dev/launch-preflight-text.ts +5 -6
  523. package/src/self-dev/launch-preflight.ts +58 -0
  524. package/src/self-dev/orchestrate.ts +13 -3
  525. package/src/self-dev/review-provider-fallback.ts +9 -2
  526. package/src/self-dev/run-supervisor.ts +42 -4
  527. package/src/self-dev/run-types.ts +4 -0
  528. package/src/self-dev/shard-aggregate.ts +4 -0
  529. package/src/self-dev/shard-run.ts +36 -15
  530. package/src/self-implement/abandoned-classification.ts +12 -3
  531. package/src/self-implement/budget-gate.ts +7 -0
  532. package/src/self-implement/child-llm-preference.ts +10 -1
  533. package/src/self-implement/doctor-visit.ts +118 -8
  534. package/src/self-implement/elanous-tui-spawn.ts +3 -0
  535. package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
  536. package/src/self-implement/gate-artifacts.ts +2 -1
  537. package/src/self-implement/goal-author-cli.ts +4 -2
  538. package/src/self-implement/goal-author.ts +684 -7
  539. package/src/self-implement/graph-overlay-yaml.ts +37 -4
  540. package/src/self-implement/graph-overlay.ts +3 -1
  541. package/src/self-implement/graph-profile-yaml.ts +107 -0
  542. package/src/self-implement/graph-yaml.ts +26 -3
  543. package/src/self-implement/headless-elanous-driver.ts +31 -2
  544. package/src/self-implement/heal-intake.ts +112 -4
  545. package/src/self-implement/heal-triage.ts +20 -0
  546. package/src/self-implement/host-regate.ts +27 -4
  547. package/src/self-implement/merge-train.ts +5 -0
  548. package/src/self-implement/off-diff-evidence.ts +249 -5
  549. package/src/self-implement/orchestrator.ts +365 -25
  550. package/src/self-implement/regate-detail.ts +38 -1
  551. package/src/self-implement/rework-child-provider.ts +25 -0
  552. package/src/self-implement/run-chart.ts +122 -0
  553. package/src/self-implement/run-ledger.ts +162 -11
  554. package/src/self-implement/run-stop.ts +188 -4
  555. package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
  556. package/src/self-implement/stop-autoheal.ts +13 -0
  557. package/src/self-implement/tdd-evidence-tags.ts +9 -0
  558. package/src/self-implement/train-gate-receipt.ts +166 -0
  559. package/src/self-implement/train-gate-remote.ts +62 -18
  560. package/src/session/chat.ts +40 -4
  561. package/src/session/session-fanout.ts +2 -0
  562. package/src/session/streaming/acp-stream-sink.ts +2 -1
  563. package/src/session/streaming/chunk-producer.ts +6 -0
  564. package/src/session/streaming/stream-compositor.ts +3 -2
  565. package/src/session-runtime/index.ts +135 -5
  566. package/src/session-runtime/retry-policy.ts +1 -1
  567. package/src/session-runtime/tier-flip.ts +3 -3
  568. package/src/setup/llm-env-detect.ts +3 -0
  569. package/src/setup/service-key-catalog.ts +46 -0
  570. package/src/setup/service-keys.ts +241 -0
  571. package/src/sidetab-core/model.ts +19 -5
  572. package/src/sidetab-core/visible-agent-mission.ts +262 -0
  573. package/src/skills/name-match.ts +20 -0
  574. package/src/skills/tools/agent.ts +53 -6
  575. package/src/skills/tools/omni-search.ts +173 -13
  576. package/src/task-agent/parent-host.ts +10 -0
  577. package/src/task-agent/pod-distributor-entry.ts +3 -0
  578. package/src/task-agent/repair-outcomes.ts +65 -0
  579. package/src/task-agent/task-hand.ts +47 -7
  580. package/src/task-orchestrator/dispatcher.ts +14 -1
  581. package/src/task-orchestrator/linear-capture-events.ts +55 -0
  582. package/src/task-orchestrator/store.ts +16 -5
  583. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +4 -0
  584. package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
  585. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +92 -1
  586. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
  587. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
  588. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
  589. package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
  590. package/src/task-orchestrator/surfaces/pod-source-receive.ts +178 -16
  591. package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
  592. package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
  593. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +237 -41
  594. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
  595. package/src/task-orchestrator/surfaces/self-implement-pod.ts +337 -51
  596. package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
  597. package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
  598. package/src/task-orchestrator/types.ts +14 -0
  599. package/src/telegram.ts +14 -16
  600. package/src/terminal/coding-agent.ts +14 -5
  601. package/src/terminal/session-registry.ts +1 -1
  602. package/src/tokens.ts +35 -2
  603. package/src/tool-hints/gate.ts +1 -0
  604. package/src/tool-runtime/agent-runtime.ts +2 -0
  605. package/src/tool-runtime/browser-hand-runtime.ts +381 -0
  606. package/src/tool-runtime/browser-runtime.ts +2 -1
  607. package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
  608. package/src/tool-runtime/elanous-linear-secretary-runtime.ts +57 -0
  609. package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
  610. package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
  611. package/src/tool-runtime/index.ts +6 -0
  612. package/src/tool-runtime/skill-exec-runtime.ts +33 -13
  613. package/src/tool-runtime/types.ts +4 -0
  614. package/src/tui/entry.ts +38 -5
  615. package/src/tui/sidetab/attach.ts +177 -1
  616. package/src/tui/sidetab/herdr-portal.ts +225 -0
  617. package/src/tui-client/local-chat-turn.ts +26 -13
  618. package/src/tui.ts +22 -0
  619. package/src/user-config.ts +34 -9
  620. package/src/user-intent/types.ts +4 -3
  621. package/src/ux-sim/browser-hand.ts +165 -0
  622. package/src/ux-sim/draft-inventory-builder.ts +198 -0
  623. package/src/ux-sim/fake-browser-page.ts +81 -0
  624. package/src/ux-sim/fake-kubectl.ts +37 -3
  625. package/src/ux-sim/fake-linear-device.ts +31 -0
  626. package/src/ux-sim/fault-pool-cap.ts +11 -6
  627. package/src/ux-sim/graph-engine-sim.ts +47 -0
  628. package/src/ux-sim/linear-secretary.ts +216 -0
  629. package/src/ux-sim/mock-scenario-catalog.json +93 -0
  630. package/src/ux-sim/mock-scenario-catalog.ts +274 -0
  631. package/src/ux-sim/onboarding-first-run-device.ts +31 -21
  632. package/src/ux-sim/scenario.ts +185 -48
  633. package/src/ux-sim/service-key-setup.ts +50 -0
  634. package/src/ux-sim/term-slash-device.ts +74 -0
  635. package/src/ux-sim/turn-throw-sim.ts +31 -0
  636. package/src/version/packed-revision.json +1 -1
  637. package/src/voice/voice-tts-singleton.ts +18 -3
  638. package/src/web-search/exa.ts +77 -0
  639. package/src/web-search/grok.ts +5 -9
  640. package/src/web-search/index.ts +30 -9
  641. package/src/web-search/provider.ts +4 -1
  642. package/src/web-search/x-intent.ts +5 -0
  643. package/apps/pwa/out/_next/static/chunks/1115.434ae2ecb0ad986d.js +0 -149
  644. package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +0 -36
  645. package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +0 -287
  647. package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/1661.0dd330f3d89f73f3.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +0 -90
  652. package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/1765.679b29625c8e88d4.js +0 -77
  654. package/apps/pwa/out/_next/static/chunks/1971-7efb628c471dc5a0.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/2073.689dcb2680113d76.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/2527-5c636a43c7cc5dde.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +0 -32
  665. package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +0 -79
  667. package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +0 -74
  671. package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/4156.ba4de4a3664f04b4.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +0 -148
  681. package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +0 -226
  682. package/apps/pwa/out/_next/static/chunks/4667.97e31aa38c95c475.js +0 -309
  683. package/apps/pwa/out/_next/static/chunks/4702.4a4adc1f16d7c93b.js +0 -64
  684. package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +0 -94
  691. package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +0 -8
  693. package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +0 -24
  696. package/apps/pwa/out/_next/static/chunks/5892.2526d962339662d8.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/5937.c2df9e3447e1f667.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +0 -286
  699. package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +0 -27
  703. package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/6552.a3840aa7da35ad68.js +0 -62
  705. package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +0 -24
  706. package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +0 -122
  708. package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/7191.fdc955f7d96064a4.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/8050-9b364bdef8f71927.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +0 -104
  720. package/apps/pwa/out/_next/static/chunks/8464-e24f10451b658aac.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/8880.64c445592f04acaf.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/9541.eb8e2f8480c7feca.js +0 -93
  733. package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/9579.4a8169600fff2058.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +0 -34
  738. package/apps/pwa/out/_next/static/chunks/9869.81a1e24ca682d5a0.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +0 -1
  740. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +0 -1
  741. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/app/botlab/page-14949db884bfa672.js +0 -1
  744. package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +0 -1
  748. package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +0 -1
  752. package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +0 -1
  758. package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +0 -1
  760. package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +0 -1
  763. package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +0 -1
  764. package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +0 -1
  765. package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +0 -1
  766. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +0 -1
  767. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +0 -1
  768. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +0 -1
  769. package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +0 -1
  770. package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +0 -1
  771. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +0 -1
  772. package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +0 -1
  773. package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +0 -1
  774. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +0 -1
  775. package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +0 -1
  776. package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +0 -1
  777. package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +0 -1
  778. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +0 -1
  779. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +0 -1
  780. package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +0 -1
  781. package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +0 -1
  782. package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +0 -1
  783. package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +0 -1
  784. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +0 -1
  785. package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +0 -1
  786. package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +0 -1
  787. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +0 -1
  788. package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +0 -1
  789. package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +0 -1
  790. package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +0 -1
  791. package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +0 -1
  792. package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +0 -1
  793. package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +0 -1
  794. package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
  795. package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
  796. /package/apps/pwa/out/_next/static/{GiOLWmt4MqDZePubBjA4Q → Om5xS9jpjSXJCeTNGYEi4}/_ssgManifest.js +0 -0
@@ -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,24 @@ 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
+ 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>,
785
+ ): ClassicSidetabMissionIntegration {
786
+ return createClassicSidetabMissionIntegration(runMission, cancelMission, runMissionPair, handReply, runMissionTrio);
787
+ }
788
+
789
+ /** Bind the classic sidetab runtime to the ACP tool callbacks used by the dashboard. */
790
+ export function createDashboardClassicSidetabMissionAcpBridge(runtime: {
791
+ runMission: (agent: 'codex' | 'claude', mission: string) => Promise<ClassicSidetabMissionResult>;
792
+ }): ClassicSidetabMissionIntegration {
793
+ return createDashboardClassicSidetabMissionCallbacks((agent, mission) => runtime.runMission(agent, mission));
794
+ }
778
795
  import { needsOnboarding, resetOnboardingMarker } from '../onboarding.js';
779
796
  import {
780
797
  getUserConfig, reloadUserConfig, saveUserConfig,
@@ -955,7 +972,16 @@ import {
955
972
  runDashboardScratchExportAction,
956
973
  } from './context-menu-action-runtime.js';
957
974
  import { createDashboardTerminalPopupRuntime } from './terminal-popup-runtime.js';
958
- import { createDashboardSidetabRuntime } from './sidetab-runtime.js';
975
+ import { createDashboardSidetabRuntime, mergeLocalAgentSessions, runDashboardAgentMission } from './sidetab-runtime.js';
976
+ 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';
977
+ import { cancelClassicMissionCli, startClassicMissionCli } from './mission-cli-consumer.js';
978
+ import { enqueueClassicSidetabMissionCompletion } from './classic-sidetab-mission-job.js';
979
+ import { startClassicSidetabMissionPair } from './classic-sidetab-mission-pair.js';
980
+ import { startClassicSidetabMissionTrio } from './classic-sidetab-mission-trio.js';
981
+ import { createDashboardPluginWizardRuntime } from './plugin-wizard-runtime.js';
982
+ import { TUI_PLUGIN_WIZARD_TOOL_NAME } from './plugin-wizard-tool.js';
983
+ import { probeGrokLogin } from '../agent-mission/grok-auth-status.js';
984
+ import { loadSidetabRows } from '../sidetab-core/model.js';
959
985
  import { toggleDashboardAssistantRenderState } from './assistant-render-state-runtime.js';
960
986
  import { bootDashboardAcpBgSweep } from './acp-bg-sweep-boot.js';
961
987
  import { bootDashboardConfigTools } from './config-tools-boot.js';
@@ -1094,8 +1120,10 @@ import {
1094
1120
  import { initElementObservability } from '../element-registry/index.js';
1095
1121
  import {
1096
1122
  createSearchPlannerState,
1123
+ buildSubagentSessionRuntimeToolSpecs,
1097
1124
  buildSessionRuntimeToolSpecs,
1098
1125
  buildSessionDashboardStatusLines,
1126
+ resolveDynamicSessionNativeToolSpecs,
1099
1127
  consumeSessionQuickControl,
1100
1128
  createSessionPostureState,
1101
1129
  enterSessionControlMode,
@@ -1165,7 +1193,7 @@ import { userMessagePositions, truncateBeforeNthUser } from '../acp/session-fork
1165
1193
  import { resolveEscEscRewind } from '../chat/esc-esc-rewind.js';
1166
1194
  import { wirePersistence } from '../terminal/session-persistence.js';
1167
1195
  import { renderMarkdown as renderMarkdownGlow } from '../markdown-preview.js';
1168
- import { basename, dirname } from 'path';
1196
+ import { basename, dirname, isAbsolute, join, resolve } from 'path';
1169
1197
  import { statSync } from 'fs';
1170
1198
  import {
1171
1199
  FIGURES, toolHeader, toolResult,
@@ -7629,7 +7657,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
7629
7657
  try { refreshSkills(skillView); refreshSkillFiles(skillView); } catch { /* missing root fine */ }
7630
7658
  // SK2 — a skill the index could not read is a one-line notice with the repair command, never a crash.
7631
7659
  try {
7632
- getSkillIndex();
7660
+ const skillIndexStartedAt = performance.now();
7661
+ const skillIndex = getSkillIndex();
7662
+ debug.log('tui.skill-index', 'startup-ready', {
7663
+ elapsedMs: Math.round((performance.now() - skillIndexStartedAt) * 10) / 10,
7664
+ skillCount: skillIndex.length,
7665
+ });
7633
7666
  const problems = skillIndexProblems();
7634
7667
  const notice = skillRepairNotice(problems);
7635
7668
  if (notice) chatLines.push(C.info(notice));
@@ -13547,11 +13580,12 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13547
13580
  // single line.
13548
13581
  type TerminalPopupRequest =
13549
13582
  | { kind: 'shell'; cwd: string; command?: string; env?: Record<string, string> }
13550
- | { kind: 'coding-agent'; brand: 'claude-code' | 'codex' | 'gemini'; cwd: string; extraArgs?: readonly string[] };
13583
+ | { kind: 'coding-agent'; brand: 'claude-code' | 'codex' | 'gemini' | 'grok'; cwd: string; extraArgs?: readonly string[]; env?: Record<string, string>; id?: string };
13551
13584
 
13552
13585
  const openInteractiveTerminalPopup = (req: TerminalPopupRequest): TerminalSession | null => {
13553
13586
  const { cols: tc, rows: tr } = termSize();
13554
13587
  let spawnedSessionId: string | null = null;
13588
+ let releaseExternalKeyRoute: () => void = () => {};
13555
13589
  const sessionLabel = req.kind === 'coding-agent' ? req.brand : 'shell';
13556
13590
 
13557
13591
  if (debug.enabled) {
@@ -13566,6 +13600,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13566
13600
  if (terminalModalRouter.current()?.id === s.id) {
13567
13601
  terminalModalRouter.set(null);
13568
13602
  }
13603
+ releaseExternalKeyRoute();
13569
13604
  try { s.modal?.dispose(); } catch { /* ignore */ }
13570
13605
  s.modal = null;
13571
13606
  chatLines.push(C.muted(` terminal exited: ${s.id}`));
@@ -13624,6 +13659,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13624
13659
  if (terminalModalRouter.current()?.id === sid) {
13625
13660
  terminalModalRouter.set(null);
13626
13661
  }
13662
+ releaseExternalKeyRoute();
13627
13663
  try {
13628
13664
  if (action === 'minimize') sessionRegistry.detach(sid);
13629
13665
  else sessionRegistry.kill(sid);
@@ -13660,7 +13696,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13660
13696
  {
13661
13697
  brand: req.brand,
13662
13698
  cwd: req.cwd,
13699
+ id: req.id,
13663
13700
  extraArgs: req.extraArgs ? [...req.extraArgs] : undefined,
13701
+ env: req.env,
13664
13702
  onExit: handleExit,
13665
13703
  onTitleAction: handleTitleAction,
13666
13704
  },
@@ -13673,6 +13711,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13673
13711
  const installLabel =
13674
13712
  req.brand === 'claude-code' ? 'Claude Code'
13675
13713
  : req.brand === 'gemini' ? 'Gemini CLI (@google/gemini-cli)'
13714
+ : req.brand === 'grok' ? 'Grok CLI'
13676
13715
  : 'Codex CLI';
13677
13716
  chatLines.push(C.muted(
13678
13717
  ` Install ${installLabel} first, then try again.`,
@@ -13694,7 +13733,13 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13694
13733
 
13695
13734
  if (session.modal) {
13696
13735
  terminalModalRouter.set(session.modal, {
13697
- onClose: () => { sessionRegistry.detach(session.id); draw(); },
13736
+ onClose: () => { releaseExternalKeyRoute(); sessionRegistry.detach(session.id); draw(); },
13737
+ });
13738
+ releaseExternalKeyRoute = setExternalTuiKeyRoute((key) => {
13739
+ if (terminalModalRouter.current()?.id !== session.id) return false;
13740
+ const result = terminalModalRouter.handleKey(toDashboardKeyEvent(key));
13741
+ if (result === 'closed') draw();
13742
+ return true;
13698
13743
  });
13699
13744
  if (debug.enabled) {
13700
13745
  debug.log('window.terminalModalRouter.set', session.modal.id, {
@@ -13747,6 +13792,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13747
13792
  const classicSidetabRuntime = createDashboardSidetabRuntime({
13748
13793
  currentSessionId: () => currentChatPersonaSessionId(),
13749
13794
  termSize,
13795
+ loadRows: (sessionId) => mergeLocalAgentSessions(loadSidetabRows(false, sessionId), sessionRegistry.list()),
13750
13796
  pushModal: (surface) => {
13751
13797
  attachSurfaceToWorkspace(surface, currentWorkspaceOwnerId());
13752
13798
  const handle = display.pushModal(surface);
@@ -13782,6 +13828,65 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13782
13828
  });
13783
13829
  },
13784
13830
  spawnShell: () => { spawnGlobalTerminalModal(); },
13831
+ spawnAgent: (agent) => {
13832
+ void (async () => {
13833
+ try {
13834
+ const prepared = await prepareClassicSidetabAgentCli(agent);
13835
+ if (!prepared.ready) {
13836
+ chatLines.push(C.warning(` ${prepared.message}`));
13837
+ chatScrollOffset = -1;
13838
+ draw();
13839
+ return;
13840
+ }
13841
+ TerminalPopup.agent(agent === 'claude' ? 'claude-code' : 'codex').cwd(workingDir.cwd).open();
13842
+ } catch {
13843
+ chatLines.push(C.warning(` ${agent}: 설치·로그인 상태를 확인하지 못했습니다`));
13844
+ chatScrollOffset = -1;
13845
+ draw();
13846
+ }
13847
+ })();
13848
+ },
13849
+ runMission: async (agent, mission, requestedOutputPath) => {
13850
+ try {
13851
+ const prepared = await prepareClassicSidetabAgentCli(agent);
13852
+ if (!prepared.ready) return {
13853
+ ok: false, path: requestedOutputPath ?? '', promptReady: false,
13854
+ missionVisible: false, promptReturned: false, completionMarker: false,
13855
+ error: prepared.message,
13856
+ };
13857
+ } catch {
13858
+ return {
13859
+ ok: false, path: requestedOutputPath ?? '', promptReady: false,
13860
+ missionVisible: false, promptReturned: false, completionMarker: false,
13861
+ error: `${agent}: 설치·로그인 상태를 확인하지 못했습니다`,
13862
+ };
13863
+ }
13864
+ return runDashboardAgentMission({
13865
+ agent,
13866
+ requestedOutputPath,
13867
+ open: () => TerminalPopup.agent(agent === 'claude' ? 'claude-code' : 'codex').cwd(workingDir.cwd).open() ?? undefined,
13868
+ modal: (session) => session.modal,
13869
+ outputPath: (session, requestedPath) => requestedPath
13870
+ ? (isAbsolute(requestedPath) ? requestedPath : resolve(session.cwd, requestedPath))
13871
+ : join(session.cwd, '.elanous', 'mission-results', `classic-sidetab-${Date.now()}.md`),
13872
+ run: async (session, modal, outputPath) => {
13873
+ const [{ runVisibleAgentMission }, { codexBackend, claudeBackend }] = await Promise.all([
13874
+ import('../sidetab-core/visible-agent-mission.js'),
13875
+ import('../agent-mission/driver.js'),
13876
+ ]);
13877
+ const backend = agent === 'codex' ? codexBackend : claudeBackend;
13878
+ return runVisibleAgentMission({
13879
+ pty: modal,
13880
+ mission,
13881
+ outputPath,
13882
+ handleTrust: (screen, write) => backend.handleTrust?.(screen, write) ?? false,
13883
+ });
13884
+ },
13885
+ close: (session) => {
13886
+ if (terminalModalRouter.current()?.id === session.id) terminalModalRouter.close();
13887
+ },
13888
+ });
13889
+ },
13785
13890
  detach: (row) => {
13786
13891
  if (row?.currentProcess) {
13787
13892
  chatLines.push(C.muted(' 현재 classic TUI는 분리할 수 없습니다'));
@@ -13822,6 +13927,270 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
13822
13927
  },
13823
13928
  });
13824
13929
  closeClassicSidetabRuntime = () => classicSidetabRuntime.close();
13930
+ const classicMissionPairSessions = createClassicSidetabMissionPairSessionRegistry();
13931
+ const cancelClassicSidetabMission = async (interactionId: string): Promise<boolean> => {
13932
+ const paired = classicMissionPairSessions.cancel(
13933
+ interactionId,
13934
+ (sessionId) => Boolean(sessionRegistry.get(sessionId)),
13935
+ (sessionId) => sessionRegistry.kill(sessionId),
13936
+ );
13937
+ return paired ?? cancelClassicMissionCli(interactionId);
13938
+ };
13939
+ const handReplyTargets = new Map<string, { missionId: string; attemptId: string; agent: 'codex' | 'claude'; token: string; nexusUrl: string; ptyId: string; runId: string }>();
13940
+ const prepareClassicSidetabAgentCli = async (agent: 'codex' | 'claude') => {
13941
+ const [{ prepareAgentCli }, { requestConfirmation }] = await Promise.all([
13942
+ import('../agent-mission/tool-install.js'), import('../hitl/confirm.js'),
13943
+ ]);
13944
+ return prepareAgentCli(agent, {
13945
+ onStatus: (line) => {
13946
+ chatLines.push(C.muted(` ${line}`));
13947
+ chatScrollOffset = -1;
13948
+ draw();
13949
+ },
13950
+ confirmInstall: async (prompt) => (await requestConfirmation({
13951
+ prompt,
13952
+ detail: '확인하면 공식 npm 설치 명령을 실행한 뒤 설치 버전과 로그인을 다시 확인합니다.',
13953
+ agentKind: 'agent-cli',
13954
+ onTimeout: () => false,
13955
+ })).answer,
13956
+ });
13957
+ };
13958
+ const pluginWizardPairCompletions = new Map<string, Promise<import('./classic-sidetab-mission-job.js').ClassicSidetabMissionPairCompletionResult>>();
13959
+ const classicSidetabMission = createDashboardClassicSidetabMissionCallbacks(async (agent, mission, context) => {
13960
+ const started = await startClassicMissionCli({
13961
+ agent,
13962
+ prompt: mission,
13963
+ ...(context?.linearIssueId ? { linearIssueId: context.linearIssueId } : {}),
13964
+ onInteractionId: (interactionId) => debug.log('classic-sidetab.mission', 'started', {
13965
+ interactionId,
13966
+ toolCallId: context?.callId ?? null,
13967
+ }),
13968
+ }, { prepareAgentCli: prepareClassicSidetabAgentCli });
13969
+ if (!('completion' in started)) return started;
13970
+ const job = started;
13971
+ enqueueClassicSidetabMissionCompletion(job, agent, (notification) => globalTaskNotificationQueue.enqueue(notification));
13972
+ return {
13973
+ ok: true,
13974
+ status: 'running',
13975
+ interactionId: job.interactionId,
13976
+ path: job.path,
13977
+ content: 'Independent sidetab job started; this conversation can continue.',
13978
+ };
13979
+ }, cancelClassicSidetabMission, async (agent, mission, parallelMission, context) => {
13980
+ for (const member of ['codex', 'claude'] as const) {
13981
+ const prepared = await prepareClassicSidetabAgentCli(member);
13982
+ if (!prepared.ready) {
13983
+ const failed = (error: string) => ({ ok: false, status: 'failed' as const, error });
13984
+ return {
13985
+ pairId: 'agent-cli-not-ready',
13986
+ codex: member === 'codex' ? failed(prepared.message) : failed('Pair 실행을 시작하지 않았습니다'),
13987
+ claude: member === 'claude' ? failed(prepared.message) : failed('Pair 실행을 시작하지 않았습니다'),
13988
+ };
13989
+ }
13990
+ }
13991
+ const [{ createMissionLineStore }, { missionChildEnv, renderMissionAgentInstructions, createMissionOutStore }, { effectiveInstanceRoot }, { resolveDaemonEndpoint }] = await Promise.all([
13992
+ import('../agent-mission/mission-line.js'), import('../agent-mission/mission-out.js'),
13993
+ import('../instance/resolve.js'), import('../nexus/daemon-endpoint.js'),
13994
+ ]);
13995
+ const stateRoot = effectiveInstanceRoot();
13996
+ const missionStore = createMissionOutStore(stateRoot);
13997
+ const endpoint = (process.env.ELANOUS_NEXUS_URL?.trim() || resolveDaemonEndpoint()?.baseUrl || '').replace(/\/$/, '');
13998
+ const handLines = new Map<string, { attemptId: string; handLine?: ReturnType<ReturnType<typeof createMissionLineStore>['issue']> }>();
13999
+ const spawnVisible = (member: 'codex' | 'claude', missionId: string, attemptId: string) => {
14000
+ const ptyId = crypto.randomUUID();
14001
+ const handLine = endpoint ? createMissionLineStore(stateRoot).issue({
14002
+ missionId, attemptId, agent: member,
14003
+ who: member === 'claude' ? 'Claude' : 'Codex', what: mission.replace(/\s+/g, ' ').trim().slice(0, 180) || 'sidetab mission',
14004
+ runId: ptyId, ptyId,
14005
+ }) : undefined;
14006
+ handLines.set(missionId, { attemptId, handLine });
14007
+ try {
14008
+ const env = handLine && endpoint
14009
+ ? 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'))
14010
+ : undefined;
14011
+ const session = TerminalPopup.agent(member === 'claude' ? 'claude-code' : 'codex').cwd(workingDir.cwd).id(ptyId).env(env ?? {}).open();
14012
+ if (session && terminalModalRouter.current()?.id === session.id) terminalModalRouter.close();
14013
+ if (session) debug.log('classic-sidetab.mission-pair', 'started', { pairMember: member, interactionId: session.id, toolCallId: context?.callId ?? null });
14014
+ return session;
14015
+ } catch {
14016
+ return null;
14017
+ }
14018
+ };
14019
+ const runVisible = async (member: 'codex' | 'claude', prompt: string, session: TerminalSession | null, missionId?: string): Promise<ClassicSidetabMissionResult> => {
14020
+ const outputPath = session
14021
+ ? join(session.cwd, '.elanous', 'mission-results', `classic-pair-${session.id}-${Date.now()}.md.tmp`)
14022
+ : '';
14023
+ if (!session) return { ok: false, status: 'failed', path: outputPath, error: `${member} sidetab PTY could not start` };
14024
+ let missionFinished = false;
14025
+ let askMonitor: Promise<void> | undefined;
14026
+ try {
14027
+ const [{ runVisibleAgentMission }, { codexBackend, claudeBackend }] = await Promise.all([
14028
+ import('../sidetab-core/visible-agent-mission.js'),
14029
+ import('../agent-mission/driver.js'),
14030
+ ]);
14031
+ const targetOutputPath = outputPath.slice(0, -4);
14032
+ missionStore.create({ missionId: missionId!, agent: member, prompt, cwd: session.cwd, outputPath, targetOutputPath });
14033
+ const lineIdentity = handLines.get(missionId!);
14034
+ if (lineIdentity?.handLine && endpoint) handReplyTargets.set(missionId!, {
14035
+ missionId: missionId!, attemptId: lineIdentity.attemptId, agent: member,
14036
+ token: lineIdentity.handLine.token, nexusUrl: endpoint, ptyId: session.id, runId: session.id,
14037
+ });
14038
+ const backend = member === 'codex' ? codexBackend : claudeBackend;
14039
+ askMonitor = (async () => {
14040
+ const seen = new Set<number>();
14041
+ while (!missionFinished) {
14042
+ for (const event of missionStore.replies(missionId!).filter((reply) => reply.kind === 'ask' && !seen.has(reply.sequence))) {
14043
+ seen.add(event.sequence);
14044
+ try {
14045
+ globalTaskNotificationQueue.enqueue({
14046
+ taskId: `${missionId}:ask:${event.sequence}`,
14047
+ ...(context?.parentSessionId ? { parentSessionId: context.parentSessionId } : {}),
14048
+ agentName: member === 'claude' ? 'Claude Code' : 'Codex',
14049
+ label: 'sidetab mission ask', state: 'done', truncated: false,
14050
+ output: JSON.stringify({
14051
+ missionId, sequence: event.sequence, runId: session.id, ptyId: session.id,
14052
+ actor: member, question: event.text, options: null,
14053
+ defaults: event.defaults ?? '', deadline: event.deadline ?? null,
14054
+ 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.',
14055
+ }),
14056
+ durationMs: 0, finishedAt: Date.now(),
14057
+ });
14058
+ } catch { /* notification delivery cannot interrupt the PTY mission */ }
14059
+ }
14060
+ await new Promise((resolve) => setTimeout(resolve, 400));
14061
+ }
14062
+ })();
14063
+ const resultPromise = Promise.resolve().then(() => runVisibleAgentMission({
14064
+ pty: {
14065
+ snapshot: () => session.preview.renderForLLM(),
14066
+ write: (bytes) => session.preview.write(bytes),
14067
+ isAlive: () => session.preview.isAlive,
14068
+ },
14069
+ mission: `${renderMissionAgentInstructions(missionId!, stateRoot)}\n\nTask:\n${prompt}`,
14070
+ outputPath,
14071
+ handleTrust: (screen, write) => backend.handleTrust?.(screen, write) ?? false,
14072
+ }));
14073
+ const result = await resultPromise.finally(() => { missionFinished = true; });
14074
+ await askMonitor;
14075
+ handReplyTargets.delete(missionId!);
14076
+ if (result.ok) await missionStore.complete(missionId!);
14077
+ else await missionStore.finish(missionId!, { status: 'failed', error: result.error ?? 'visible mission failed' });
14078
+ return { ...result, status: result.ok ? 'completed' as const : 'failed' as const, interactionId: missionId };
14079
+ } catch (error) {
14080
+ missionFinished = true;
14081
+ await askMonitor?.catch(() => undefined);
14082
+ if (missionId) handReplyTargets.delete(missionId);
14083
+ if (missionId && missionStore.read(missionId)?.status === 'running') {
14084
+ await missionStore.finish(missionId, { status: 'failed', error: error instanceof Error ? error.message : String(error) }).catch(() => undefined);
14085
+ }
14086
+ return { ok: false, status: 'failed' as const, interactionId: missionId, path: outputPath, error: error instanceof Error ? error.message : String(error) };
14087
+ }
14088
+ };
14089
+ const started = startClassicSidetabMissionPair({
14090
+ agent,
14091
+ mission,
14092
+ parallelMission,
14093
+ context,
14094
+ spawnVisible,
14095
+ runVisible,
14096
+ registry: classicMissionPairSessions,
14097
+ hasSession: (sessionId) => Boolean(sessionRegistry.get(sessionId)),
14098
+ killSession: (sessionId) => sessionRegistry.kill(sessionId),
14099
+ enqueue: (notification) => globalTaskNotificationQueue.enqueue(notification),
14100
+ });
14101
+ if (context?.callId?.startsWith('plugin-wizard:')) {
14102
+ pluginWizardPairCompletions.set(context.callId, started.completion);
14103
+ }
14104
+ void started.completion;
14105
+ return started.result;
14106
+ }, async (input) => {
14107
+ const target = handReplyTargets.get(input.missionId);
14108
+ if (!target) {
14109
+ const [{ effectiveInstanceRoot }, { createMissionOutStore }, { recordHeadlessMissionHandReply }] = await Promise.all([
14110
+ import('../instance/resolve.js'), import('../agent-mission/mission-out.js'), import('../agent-mission/mission-hand-reply.js'),
14111
+ ]);
14112
+ const store = createMissionOutStore(effectiveInstanceRoot());
14113
+ const result = await recordHeadlessMissionHandReply(input, store);
14114
+ return { ok: result.ok, body: result.ok ? `Recorded ${input.kind} on headless mission line (record-only; no PTY input).` : result.reason };
14115
+ }
14116
+ const { recordAndDeliverMissionHandReply } = await import('../agent-mission/mission-hand-reply.js');
14117
+ const result = await recordAndDeliverMissionHandReply({ target, ...input });
14118
+ const delivery = result.ok ? result.delivery === 'ask-ledger' ? 'recorded in the mission ledger for a matching ask waiter' : 'delivered through PTY arbiter' : '';
14119
+ 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})` : ''}.` };
14120
+ }, async (mission, context) => {
14121
+ const { codexBackend, claudeBackend, grokBackend } = await import('../agent-mission/driver.js');
14122
+ const spawnVisible = (member: ClassicSidetabMissionAgent, missionId: string) => {
14123
+ try {
14124
+ const brand = member === 'claude' ? 'claude-code' : member;
14125
+ const backend = member === 'codex' ? codexBackend : member === 'claude' ? claudeBackend : grokBackend;
14126
+ const session = TerminalPopup.agent(brand).cwd(workingDir.cwd).id(missionId).args(backend.args).open();
14127
+ if (session && terminalModalRouter.current()?.id === session.id) terminalModalRouter.close();
14128
+ if (session) debug.log('classic-sidetab.mission-trio', 'started', { member, interactionId: session.id, toolCallId: context?.callId ?? null });
14129
+ return session;
14130
+ } catch (error) {
14131
+ debug.log('classic-sidetab.mission-trio', 'spawn-failed', { member, reason: error instanceof Error ? error.message : String(error) }, { level: 'warn' });
14132
+ return null;
14133
+ }
14134
+ };
14135
+ const runVisible = async (member: ClassicSidetabMissionAgent, prompt: string, session: TerminalSession | null, missionId?: string): Promise<ClassicSidetabMissionResult> => {
14136
+ const outputPath = session ? join(session.cwd, '.elanous', 'mission-results', `classic-trio-${member}-${session.id}-${Date.now()}.md.tmp`) : '';
14137
+ if (!session) return { ok: false, status: 'failed', path: outputPath, error: `${member} sidetab PTY could not start` };
14138
+ try {
14139
+ const { runVisibleAgentMission } = await import('../sidetab-core/visible-agent-mission.js');
14140
+ const backend = member === 'codex' ? codexBackend : member === 'claude' ? claudeBackend : grokBackend;
14141
+ const result = await runVisibleAgentMission({
14142
+ pty: { snapshot: () => session.preview.renderForLLM(), write: (bytes) => session.preview.write(bytes), isAlive: () => session.preview.isAlive },
14143
+ mission: prompt,
14144
+ outputPath,
14145
+ handleTrust: (screen, write) => backend.handleTrust?.(screen, write) ?? false,
14146
+ });
14147
+ return { ...result, status: result.ok ? 'completed' : 'failed', interactionId: missionId, finalScreen: session.preview.renderForLLM() };
14148
+ } catch (error) {
14149
+ return {
14150
+ ok: false,
14151
+ status: 'failed',
14152
+ path: outputPath,
14153
+ interactionId: missionId,
14154
+ error: error instanceof Error ? error.message : String(error),
14155
+ finalScreen: session.preview.renderForLLM(),
14156
+ };
14157
+ }
14158
+ };
14159
+ const started = await startClassicSidetabMissionTrio({
14160
+ mission,
14161
+ context,
14162
+ checkGrokAuth: probeGrokLogin,
14163
+ spawnVisible: (member, missionId) => spawnVisible(member, missionId),
14164
+ runVisible,
14165
+ registry: classicMissionPairSessions,
14166
+ hasSession: (sessionId) => Boolean(sessionRegistry.get(sessionId)),
14167
+ killSession: (sessionId) => sessionRegistry.kill(sessionId),
14168
+ enqueue: (notification) => globalTaskNotificationQueue.enqueue(notification),
14169
+ });
14170
+ void started.completion;
14171
+ return started.result;
14172
+ });
14173
+ const tuiPluginWizard = createDashboardPluginWizardRuntime({
14174
+ getWorkspace: () => getSessionCwd(),
14175
+ runMissionPair: async ({ runId, prompt, context }) => {
14176
+ const pairCallId = `plugin-wizard:${runId}`;
14177
+ const started = await classicSidetabMission.dispatchTool('RunSidetabMission', {
14178
+ agent: 'codex', mission: prompt, parallelMission: prompt,
14179
+ }, { callId: pairCallId, ...(context?.parentSessionId ? { parentSessionId: context.parentSessionId } : {}) });
14180
+ const completion = pluginWizardPairCompletions.get(pairCallId);
14181
+ if (!completion || started?.status === 'error') {
14182
+ pluginWizardPairCompletions.delete(pairCallId);
14183
+ throw new Error(started?.body ?? 'Codex/Claude pair did not start');
14184
+ }
14185
+ try {
14186
+ const result = await completion;
14187
+ return {
14188
+ codex: { ok: result.codex.ok, ...(result.codex.content ? { content: result.codex.content } : {}), ...(result.codex.error ? { error: result.codex.error } : {}) },
14189
+ claude: { ok: result.claude.ok, ...(result.claude.content ? { content: result.claude.content } : {}), ...(result.claude.error ? { error: result.claude.error } : {}) },
14190
+ };
14191
+ } finally { pluginWizardPairCompletions.delete(pairCallId); }
14192
+ },
14193
+ });
13825
14194
  disposeClassicSigquit = registerClassicSigquitHandler(() => {
13826
14195
  classicSidetabRuntime.beginPrefix();
13827
14196
  });
@@ -15323,6 +15692,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15323
15692
  // pure assembly over already-loaded specs.
15324
15693
  getPreamble: ({ sessionId, userText }) => {
15325
15694
  const runtime = acpToolRuntime;
15695
+ const turnUserConfig = getUserConfig();
15696
+ const activeModel = inspectActiveProvider().model;
15326
15697
  const tools = runtime
15327
15698
  ? buildSessionRuntimeToolSpecs({
15328
15699
  userText,
@@ -15332,6 +15703,19 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15332
15703
  surface: acpTurnRef.turnProfile?.surface,
15333
15704
  })
15334
15705
  : [];
15706
+ const surface = acpTurnRef.turnProfile?.surface;
15707
+ const researchDefaults = surface?.id === 'research/agent'
15708
+ ? resolveDynamicSessionNativeToolSpecs({
15709
+ userText,
15710
+ defaultFamilyIds: surface.defaultNativeFamilyIds,
15711
+ surfaceId: surface.id,
15712
+ }).filter(tool => ['WebSearch', 'OmniSearch', 'WebFetch'].includes(tool.name))
15713
+ : [];
15714
+ const withSurfaceDefaults = [...new Map(
15715
+ [...researchDefaults, ...tools].map(tool => [tool.name, tool] as const),
15716
+ ).values()];
15717
+ const classicTools = runtime ? classicSidetabMission.getTools(withSurfaceDefaults) : withSurfaceDefaults;
15718
+ const tuiTools = tuiPluginWizard.getTools(classicTools);
15335
15719
  return [
15336
15720
  ...tuiChatPersonaMessages(currentChatPersonaSessionId(), chatPersonaSelection),
15337
15721
  ...buildDashboardTurnPreamble({
@@ -15339,20 +15723,22 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15339
15723
  sessionId,
15340
15724
  cwd: getSessionCwd(),
15341
15725
  turnProfile: acpTurnRef.turnProfile,
15342
- userConfig: getUserConfig(),
15726
+ userConfig: turnUserConfig,
15727
+ skillCatalog: applySkillFilter(getSkillIndex(), turnUserConfig.skills),
15728
+ skillCatalogModelId: activeModel,
15343
15729
  // Resolved per-turn so a mid-session model switch (codex →
15344
15730
  // claude or vice-versa) takes effect immediately. Drives the
15345
15731
  // codex-only behavioral addendum (fix L-1) inside the
15346
15732
  // universal preamble.
15347
- modelFamily: getModelFamily(inspectActiveProvider().model),
15348
- enabledTools: tools.map(t => t.name),
15733
+ modelFamily: getModelFamily(activeModel),
15734
+ enabledTools: tuiTools.map(t => t.name),
15349
15735
  seatBoot: true,
15350
15736
  }),
15351
15737
  ];
15352
15738
  },
15353
15739
  getTools: ({ userText }) => {
15354
15740
  const runtime = acpToolRuntime;
15355
- if (!runtime) return [];
15741
+ if (!runtime) return tuiPluginWizard.getTools([]);
15356
15742
  const tools = buildSessionRuntimeToolSpecs({
15357
15743
  userText,
15358
15744
  hostTools: pluginHost.hostLLMTools(),
@@ -15360,6 +15746,19 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15360
15746
  optionalTools: acpTurnRef.optionalSpecs,
15361
15747
  surface: acpTurnRef.turnProfile?.surface,
15362
15748
  });
15749
+ const surface = acpTurnRef.turnProfile?.surface;
15750
+ const researchDefaults = surface?.id === 'research/agent'
15751
+ ? resolveDynamicSessionNativeToolSpecs({
15752
+ userText,
15753
+ defaultFamilyIds: surface.defaultNativeFamilyIds,
15754
+ surfaceId: surface.id,
15755
+ }).filter(tool => ['WebSearch', 'OmniSearch', 'WebFetch'].includes(tool.name))
15756
+ : [];
15757
+ const withSurfaceDefaults = [...new Map(
15758
+ [...researchDefaults, ...tools].map(tool => [tool.name, tool] as const),
15759
+ ).values()];
15760
+ const classicTools = classicSidetabMission.getTools(withSurfaceDefaults);
15761
+ const tuiTools = tuiPluginWizard.getTools(classicTools);
15363
15762
  // ⭐ Remember this turn's catalog so a spawned sub-agent can inherit it.
15364
15763
  //
15365
15764
  // `dispatchAgent` computes `childTools = (hostTools ?? []).filter(...)`,
@@ -15367,8 +15766,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15367
15766
  // or edit anything, which is the whole point of delegating code work.
15368
15767
  // Exposing `Agent` without this wiring is worse than not exposing it:
15369
15768
  // the model picks a delegate that provably cannot act.
15370
- acpTurnToolSpecs = tools;
15371
- return tools;
15769
+ acpTurnToolSpecs = tuiTools.filter(tool => tool.name !== CLASSIC_SIDETAB_MISSION_TOOL_NAME && tool.name !== TUI_PLUGIN_WIZARD_TOOL_NAME);
15770
+ return tuiTools;
15372
15771
  },
15373
15772
  // R2 essential TUI execution boundary: ACP receives the same
15374
15773
  // Codex-first decision as every other surface. The core bridge now
@@ -15384,6 +15783,19 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15384
15783
  // Count at the server-side boundary, before any tool effect and
15385
15784
  // before the ACP notification can reach the TUI client.
15386
15785
  acpToolDispatchCount++;
15786
+ const pluginWizardResult = tuiPluginWizard.dispatchTool(name, args, {
15787
+ callId: ctx?.callId,
15788
+ parentSessionId: ctx?.sessionId,
15789
+ });
15790
+ if (pluginWizardResult) return await pluginWizardResult;
15791
+ const classicMissionResult = classicSidetabMission.dispatchTool(name, args, {
15792
+ callId: ctx?.callId,
15793
+ parentSessionId: ctx?.sessionId,
15794
+ });
15795
+ if (classicMissionResult) return classicMissionResult;
15796
+ // For Agent with no `hand` or `hand: internal`, the sidetab
15797
+ // interceptor deliberately returns undefined; keep the established
15798
+ // session-runtime Agent dispatcher below as the built-in fallback.
15387
15799
  const runtime = acpToolRuntime;
15388
15800
  const persist = acpPersistToolOutputPreview;
15389
15801
  if (!runtime || !persist) {
@@ -15403,6 +15815,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15403
15815
  signalAlreadyAborted: turnSignal.aborted,
15404
15816
  });
15405
15817
  const dispatchPromise = dispatchDashboardSessionRuntimeTool(name, args, {
15818
+ sessionId: ctx?.sessionId,
15406
15819
  contextUserText,
15407
15820
  turnRefUserText,
15408
15821
  muted: C.muted,
@@ -15410,6 +15823,7 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15410
15823
  draw,
15411
15824
  signal: turnSignal,
15412
15825
  toolCallId: ctx?.callId,
15826
+ inheritGeneralPurposeToolCatalog: true,
15413
15827
  // ⛔⭐ 폴백은 `''` 가 아니라 `undefined` 다 — 「안 넘김」과 「말했는데 어휘가 없음」은 «다른 값»이다.
15414
15828
  // harnessMentionState(session-runtime 소비처)는 `undefined → 'absent'` · `'' → 'not-matched'` 로
15415
15829
  // 가른다. `?? ''` 로 접으면 그 둘이 같은 값이 되고, 그것이 2026-08-06 에 「TUI 가 하니스에게
@@ -15434,14 +15848,42 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
15434
15848
  dispatchToolRuntime: (toolName, input, toolCallId) =>
15435
15849
  runtime.dispatchToolByName(toolName, input, {
15436
15850
  surface: 'tui',
15851
+ parentSessionId: ctx?.sessionId,
15437
15852
  toolCallId,
15438
15853
  signal: hasParentTurnAbortSignal ? turnSignal : undefined,
15854
+ inheritGeneralPurposeToolCatalog: true,
15439
15855
  // ⭐ Agent-family context. Without these two the sub-agent runs
15440
15856
  // text-only (see getTools above). `agentDispatchTool` routes the
15441
15857
  // child's calls back through THIS dispatcher so the child gets the
15442
15858
  // same policy/truncation treatment as the parent — not a second,
15443
15859
  // laxer path.
15444
15860
  agentHostTools: acpTurnToolSpecs,
15861
+ // Agent children inherit the full TUI-visible tool catalog,
15862
+ // not only this turn's surface/tier-selected model catalog.
15863
+ // Calls still route through this parent dispatcher, preserving
15864
+ // availability and dangerous-tool policy checks.
15865
+ buildChildToolCatalog: (childCwd) => {
15866
+ const childCatalog = buildSubagentSessionRuntimeToolSpecs({
15867
+ hostTools: pluginHost.hostLLMTools(),
15868
+ // Runtime can disappear between the parent turn and a child
15869
+ // spawn. In that case keep the captured TUI host catalog below.
15870
+ runtimeTools: runtime?.listToolRuntimes('tui') ?? [],
15871
+ optionalTools: acpTurnRef.optionalSpecs,
15872
+ });
15873
+ const specs = [...new Map(
15874
+ [...acpTurnToolSpecs, ...childCatalog]
15875
+ .filter(tool => tool.name !== CLASSIC_SIDETAB_MISSION_TOOL_NAME && tool.name !== TUI_PLUGIN_WIZARD_TOOL_NAME)
15876
+ .map(tool => [tool.name, tool] as const),
15877
+ ).values()];
15878
+ return {
15879
+ specs,
15880
+ dispatch: (childName: string, childArgs: Record<string, unknown>) =>
15881
+ acpDispatchToolSelf
15882
+ ? acpDispatchToolSelf(childName, childArgs, ctx)
15883
+ : Promise.resolve({ error: 'parent dispatcher unavailable' }),
15884
+ workingDirectory: childCwd,
15885
+ };
15886
+ },
15445
15887
  // ⛔ Forward the parent's `ctx` — without it `turnIndex` is lost and
15446
15888
  // the child's output is attributed to the wrong turn by the
15447
15889
  // truncation/persist path (and the search planner loses its
@@ -17535,6 +17977,11 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17535
17977
  const slashCtx: DashboardSlashContext = {
17536
17978
  ad: { run: (args) => dispatchDashboardAdSlash(adSlashRuntime, [...args], () => { draw(); }) },
17537
17979
  chatLines,
17980
+ classicSidetabAgent: {
17981
+ loadRows: (sessionId) => classicSidetabRuntime.loadRows(sessionId),
17982
+ openAgent: (agent) => classicSidetabRuntime.openAgent(agent),
17983
+ runMission: (agent, mission, outputPath) => classicSidetabRuntime.runMission(agent, mission, outputPath),
17984
+ },
17538
17985
  getStatusLines: getDashboardStatusLines,
17539
17986
  ...(clarificationSurfaceUx ? { surfaceUx: clarificationSurfaceUx } : {}),
17540
17987
  attachmentRowMap,
@@ -17671,11 +18118,32 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
17671
18118
  },
17672
18119
  agentLauncher: {
17673
18120
  open: (brand, agentArgs) => {
17674
- TerminalPopup
18121
+ const launch = () => TerminalPopup
17675
18122
  .agent(brand)
17676
18123
  .cwd(getSessionCwd())
17677
18124
  .args([...agentArgs])
17678
18125
  .open();
18126
+ if (brand === 'gemini') {
18127
+ launch();
18128
+ return;
18129
+ }
18130
+ const agent = brand === 'claude-code' ? 'claude' : 'codex';
18131
+ void (async () => {
18132
+ try {
18133
+ const prepared = await prepareClassicSidetabAgentCli(agent);
18134
+ if (!prepared.ready) {
18135
+ chatLines.push(C.warning(` ${prepared.message}`));
18136
+ chatScrollOffset = -1;
18137
+ draw();
18138
+ return;
18139
+ }
18140
+ launch();
18141
+ } catch {
18142
+ chatLines.push(C.warning(` ${agent}: 설치·로그인 상태를 확인하지 못했습니다`));
18143
+ chatScrollOffset = -1;
18144
+ draw();
18145
+ }
18146
+ })();
17679
18147
  },
17680
18148
  },
17681
18149
  theme: {
@@ -18765,16 +19233,26 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18765
19233
  // project. The raw index cache stays shared across callers —
18766
19234
  // this filter is applied on read.
18767
19235
  const skillsCfg = getUserConfig().skills;
18768
- const visibleIndex = applySkillFilter(getSkillIndex(), {
19236
+ const skillIndexStartedAt = performance.now();
19237
+ const skillIndex = getSkillIndex();
19238
+ const visibleIndex = applySkillFilter(skillIndex, {
18769
19239
  allow: skillsCfg.allow, deny: skillsCfg.deny,
18770
19240
  });
19241
+ try {
19242
+ debug.log('chat.turn.stage', 'skill-index-ready', {
19243
+ elapsedMs: Math.round((performance.now() - skillIndexStartedAt) * 10) / 10,
19244
+ skillCount: skillIndex.length,
19245
+ visibleSkillCount: visibleIndex.length,
19246
+ });
19247
+ } catch { /* observation must never delay a turn */ }
18771
19248
  let detection: DetectResult = { candidates: [], top: null, unambiguous: false };
19249
+ const routeStartedAt = performance.now();
19250
+ let routeOutcome: 'complete' | 'aborted' | 'failed' = 'failed';
18772
19251
  try {
18773
19252
  // Tier-aware full-menu routing (2026-07-20): pass the active
18774
19253
  // model tier so a T1 frontier model can route the whole skill
18775
19254
  // menu when keyword matching is weak/empty (Korean prompts).
18776
19255
  const detectTier = getModelTier(getUserConfig().llm.provider, getUserConfig().llm.model);
18777
- const routeStartedAt = Date.now();
18778
19256
  const route = await runAbortableDashboardSkillRoute({
18779
19257
  attachKeys: (ctrl: AbortController) => attachChatStreamingKeys(ctrl, { turnEnd: false }),
18780
19258
  detect: (signal) => detectDashboardSkillRoute(tok.text, visibleIndex, {
@@ -18789,12 +19267,14 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18789
19267
  }),
18790
19268
  });
18791
19269
  if (route.aborted) {
18792
- debug.log('skill.router', 'route-aborted-by-esc', { elapsedMs: Date.now() - routeStartedAt });
19270
+ debug.log('skill.router', 'route-aborted-by-esc', { elapsedMs: Math.round((performance.now() - routeStartedAt) * 10) / 10 });
19271
+ routeOutcome = 'aborted';
18793
19272
  thinking.stop({ status: 'interrupted' });
18794
19273
  draw();
18795
19274
  continue;
18796
19275
  }
18797
19276
  detection = route.detection;
19277
+ routeOutcome = 'complete';
18798
19278
  // Observability (2026-07-20) — the routing DECISION had no
18799
19279
  // debug category (only surfaced as a UI hint). Emit it so
18800
19280
  // `elanous logs --category skill.router` shows trigger/triage
@@ -18809,8 +19289,22 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18809
19289
  unambiguous: detection.unambiguous,
18810
19290
  });
18811
19291
  } catch (err) {
18812
- debug.log('skill.router', 'decision-error', { text: tok.text.slice(0, 80), error: (err as any)?.message ?? String(err) }, { level: 'error' });
19292
+ debug.log('skill.router', 'decision-error', {
19293
+ text: tok.text.slice(0, 80),
19294
+ error: (err as any)?.message ?? String(err),
19295
+ elapsedMs: Math.round((performance.now() - routeStartedAt) * 10) / 10,
19296
+ }, { level: 'error' });
18813
19297
  /* router must never block chat */
19298
+ } finally {
19299
+ try {
19300
+ debug.log('chat.turn.stage', 'skill-router-complete', {
19301
+ elapsedMs: Math.round((performance.now() - routeStartedAt) * 10) / 10,
19302
+ outcome: routeOutcome,
19303
+ llmFallback: userCfg.llmFallback,
19304
+ visibleSkillCount: visibleIndex.length,
19305
+ candidateCount: detection.candidates.length,
19306
+ });
19307
+ } catch { /* observation must never delay a turn */ }
18814
19308
  }
18815
19309
 
18816
19310
  // Session 21 — session-scoped decline short-circuit. If the
@@ -18945,6 +19439,9 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18945
19439
  getActivePluginName: () => pluginHost.active()?.name,
18946
19440
  },
18947
19441
  inputSource,
19442
+ chat.history
19443
+ .filter(message => message.role === 'user' && typeof message.content === 'string')
19444
+ .map(message => String(message.content)),
18948
19445
  ),
18949
19446
  buildTurnMessage: (args) => buildDashboardTurnMessage({
18950
19447
  userText: args.userText,
@@ -18986,6 +19483,8 @@ Mode- and sync-specific instructions are injected per-turn when relevant — do
18986
19483
  cwd: args.cwd,
18987
19484
  turnProfile: args.turnProfile as SessionTurnProfile,
18988
19485
  userConfig: args.userConfig,
19486
+ skillCatalog: applySkillFilter(getSkillIndex(), args.userConfig.skills),
19487
+ skillCatalogModelId: inspectActiveProvider().model,
18989
19488
  enabledTools: tools.map(t => t.name),
18990
19489
  seatBoot: true,
18991
19490
  }),