elanous 0.2.40 → 0.2.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (685) hide show
  1. package/README.md +7 -7
  2. package/apps/pwa/out/404/index.html +1 -1
  3. package/apps/pwa/out/404.html +1 -1
  4. package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → X1ucLw10Cds_h614NoEnh}/_buildManifest.js +1 -1
  5. package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/{4769.9fd582071301f382.js → 1063.2fb8a9dc55c731f2.js} +1 -1
  7. package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +36 -0
  8. package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/{470.51a72a2348306455.js → 1262.e804feb8fd1acb8c.js} +2 -2
  10. package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/{7219-15bdd9a80661af8e.js → 1455-530ca16c7e71baff.js} +1 -1
  13. package/apps/pwa/out/_next/static/chunks/{1281.d81877e35b9068f4.js → 1487.2f67b79444062da6.js} +1 -1
  14. package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +32 -0
  16. package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +286 -0
  22. package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +23 -0
  23. package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +34 -0
  26. package/apps/pwa/out/_next/static/chunks/{1350.59f40e39e02d91b1.js → 2456.b6de0e1c05f28843.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/2690.0521c738b7749931.js +115 -0
  32. package/apps/pwa/out/_next/static/chunks/{5436.fdf6fa8ae3e9588d.js → 2974.595d1e29d040cb6a.js} +1 -1
  33. package/apps/pwa/out/_next/static/chunks/{5383.bdfa5d886e39a826.js → 3207.a756c95e9ec8c3c8.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +93 -0
  35. package/apps/pwa/out/_next/static/chunks/{2177.df8547f9d7215c4e.js → 3347.f846266b5e5f3ede.js} +3 -3
  36. package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +41 -0
  37. package/apps/pwa/out/_next/static/chunks/{9184.45afbf44fec87574.js → 3482.a9ae9d2ad6a5bd97.js} +1 -1
  38. package/apps/pwa/out/_next/static/chunks/3507.97e1977bc4d5fb0a.js +2 -0
  39. package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +24 -0
  41. package/apps/pwa/out/_next/static/chunks/{8099.1cccf31c1baa7e1c.js → 3741.9cf76acaa2ee5298.js} +1 -1
  42. package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{4864a2ca.1c1c280a7772c5e5.js → 3d0154af.5331fec737ffe8c3.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4043.6b91203436c9c86b.js +309 -0
  48. package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +77 -0
  49. package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/{3330.7443183b7e6fdbdf.js → 4276.336d76d858fcdf1b.js} +1 -1
  51. package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +148 -0
  55. package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +74 -0
  56. package/apps/pwa/out/_next/static/chunks/{3b355b3d.6f73c98bf6f9c749.js → 50061469.0326382241ef3b2d.js} +1 -1
  57. package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +149 -0
  58. package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +27 -0
  60. package/apps/pwa/out/_next/static/chunks/{8d173e38.18a2f7b4e1848bdb.js → 53c73f84.373b6160adfa89a4.js} +1 -1
  61. package/apps/pwa/out/_next/static/chunks/{1537-6bb97b5214928ea9.js → 5431-72a1dbde59400691.js} +1 -1
  62. package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +287 -0
  70. package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/{261.0d471e8aded799f3.js → 6131.348b7d6bdcd267ce.js} +3 -3
  73. package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +90 -0
  74. package/apps/pwa/out/_next/static/chunks/{9175.2de5209a5ce6f68a.js → 6377.bc7df239edbff244.js} +1 -1
  75. package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{2226.2cf61ec781827219.js → 6632.0eac1c554f8f2ef3.js} +2 -2
  78. package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +104 -0
  82. package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +94 -0
  83. package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/{b84cad00.594027ebe0531fe2.js → 73d2eb0e.4966ad55293c801a.js} +3 -3
  90. package/apps/pwa/out/_next/static/chunks/{6257.c0037b8949239f5e.js → 7411.9b4b8b747dc7b802.js} +2 -2
  91. package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +24 -0
  92. package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/{9189505a.980427ac048c8c60.js → 7a98bc80.fa935989e829f9c2.js} +1 -1
  98. package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/8138.6c10b2a356d52fca.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/{2566.beaffc3a5e1fcd2e.js → 8262.ddc03e06b733f184.js} +1 -1
  101. package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +8 -0
  103. package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +79 -0
  105. package/apps/pwa/out/_next/static/chunks/{8272-025653884f9645d2.js → 8546-6f03f8ea34dd61d9.js} +1 -1
  106. package/apps/pwa/out/_next/static/chunks/{6051-0ae955eedb10adb9.js → 8673-bab689a55f7e13b9.js} +3 -3
  107. package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/{4351.0f37a6db2b34d50b.js → 9249.976f1e69a9d80754.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9415.69e4a21c60c7d2db.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{6749.0744ce6eb08d40e9.js → 9427.96aa912ddb5801e0.js} +16 -16
  119. package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/{7611.85f045bf232053ac.js → 9633.ce5bddc56784da72.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/{3746-f80a78f220bf37b5.js → 9656-374232558fd528d0.js} +1 -1
  123. package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +62 -0
  124. package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/live-run/{page-83d27757e2b8060a.js → page-0e3d7b9421b79dac.js} +1 -1
  147. package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/term/{page-139d722de1dcd6c1.js → page-bf067887b3307423.js} +1 -1
  170. package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/{409c787b.e48c5bec8ec10456.js → b450776b.3db34d8d965f82d3.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/{ca3702f8.2913182e73889fa2.js → e8543907.5b040a5f22a0b0e5.js} +7 -7
  179. package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +1 -0
  184. package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +1 -0
  185. package/apps/pwa/out/_next/static/css/{b9d8151e48998417.css → 62c858ad53854f47.css} +1 -1
  186. package/apps/pwa/out/approvals/index.html +1 -1
  187. package/apps/pwa/out/approvals/index.txt +22 -22
  188. package/apps/pwa/out/autopilot/index.html +1 -1
  189. package/apps/pwa/out/autopilot/index.txt +22 -22
  190. package/apps/pwa/out/board/index.html +1 -1
  191. package/apps/pwa/out/board/index.txt +22 -22
  192. package/apps/pwa/out/botlab/index.html +1 -1
  193. package/apps/pwa/out/botlab/index.txt +21 -21
  194. package/apps/pwa/out/bots/index.html +1 -1
  195. package/apps/pwa/out/bots/index.txt +21 -21
  196. package/apps/pwa/out/ceo/index.html +1 -1
  197. package/apps/pwa/out/ceo/index.txt +22 -22
  198. package/apps/pwa/out/chat/index.html +1 -1
  199. package/apps/pwa/out/chat/index.txt +21 -21
  200. package/apps/pwa/out/consult/index.html +1 -1
  201. package/apps/pwa/out/consult/index.txt +22 -22
  202. package/apps/pwa/out/control/index.html +1 -1
  203. package/apps/pwa/out/control/index.txt +22 -22
  204. package/apps/pwa/out/decisions/index.html +1 -1
  205. package/apps/pwa/out/decisions/index.txt +21 -21
  206. package/apps/pwa/out/design-check/index.html +1 -1
  207. package/apps/pwa/out/design-check/index.txt +22 -22
  208. package/apps/pwa/out/editor/index.html +1 -1
  209. package/apps/pwa/out/editor/index.txt +23 -24
  210. package/apps/pwa/out/exec/index.html +1 -1
  211. package/apps/pwa/out/exec/index.txt +22 -22
  212. package/apps/pwa/out/field/index.html +1 -1
  213. package/apps/pwa/out/field/index.txt +22 -22
  214. package/apps/pwa/out/healthz +1 -1
  215. package/apps/pwa/out/index.html +1 -1
  216. package/apps/pwa/out/index.txt +21 -21
  217. package/apps/pwa/out/inside/index.html +1 -1
  218. package/apps/pwa/out/inside/index.txt +22 -22
  219. package/apps/pwa/out/intake/index.html +1 -1
  220. package/apps/pwa/out/intake/index.txt +22 -22
  221. package/apps/pwa/out/live/index.html +1 -1
  222. package/apps/pwa/out/live/index.txt +23 -24
  223. package/apps/pwa/out/live-run/index.html +1 -1
  224. package/apps/pwa/out/live-run/index.txt +23 -24
  225. package/apps/pwa/out/loops/index.html +1 -1
  226. package/apps/pwa/out/loops/index.txt +21 -21
  227. package/apps/pwa/out/market/index.html +1 -1
  228. package/apps/pwa/out/market/index.txt +21 -21
  229. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  230. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  231. package/apps/pwa/out/morning/index.html +1 -1
  232. package/apps/pwa/out/morning/index.txt +22 -22
  233. package/apps/pwa/out/observatory/index.html +1 -1
  234. package/apps/pwa/out/observatory/index.txt +22 -22
  235. package/apps/pwa/out/ops/checklist/index.html +1 -1
  236. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  237. package/apps/pwa/out/ops/release/index.html +1 -1
  238. package/apps/pwa/out/ops/release/index.txt +21 -21
  239. package/apps/pwa/out/ops/seats/index.html +1 -1
  240. package/apps/pwa/out/ops/seats/index.txt +21 -21
  241. package/apps/pwa/out/outputs/index.html +1 -1
  242. package/apps/pwa/out/outputs/index.txt +21 -21
  243. package/apps/pwa/out/reflection/index.html +1 -1
  244. package/apps/pwa/out/reflection/index.txt +22 -22
  245. package/apps/pwa/out/scheduler/index.html +1 -1
  246. package/apps/pwa/out/scheduler/index.txt +22 -22
  247. package/apps/pwa/out/sessions/index.html +1 -1
  248. package/apps/pwa/out/sessions/index.txt +21 -21
  249. package/apps/pwa/out/settings/devices/index.html +1 -1
  250. package/apps/pwa/out/settings/devices/index.txt +22 -22
  251. package/apps/pwa/out/settings/index.html +1 -1
  252. package/apps/pwa/out/settings/index.txt +22 -22
  253. package/apps/pwa/out/setup/done/index.html +1 -1
  254. package/apps/pwa/out/setup/done/index.txt +22 -22
  255. package/apps/pwa/out/setup/index.html +1 -1
  256. package/apps/pwa/out/setup/index.txt +22 -22
  257. package/apps/pwa/out/share/index.html +1 -1
  258. package/apps/pwa/out/share/index.txt +22 -22
  259. package/apps/pwa/out/showroom/index.html +1 -1
  260. package/apps/pwa/out/showroom/index.txt +21 -21
  261. package/apps/pwa/out/tasks/index.html +1 -1
  262. package/apps/pwa/out/tasks/index.txt +22 -22
  263. package/apps/pwa/out/term/index.html +1 -1
  264. package/apps/pwa/out/term/index.txt +22 -22
  265. package/apps/pwa/out/today/index.html +1 -1
  266. package/apps/pwa/out/today/index.txt +22 -22
  267. package/apps/pwa/out/trace/index.html +1 -1
  268. package/apps/pwa/out/trace/index.txt +22 -22
  269. package/apps/pwa/out/vault/index.html +1 -1
  270. package/apps/pwa/out/vault/index.txt +22 -22
  271. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  272. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  273. package/apps/pwa/out/workflows/index.html +1 -1
  274. package/apps/pwa/out/workflows/index.txt +22 -22
  275. package/apps/pwa/out/workspace/index.html +1 -1
  276. package/apps/pwa/out/workspace/index.txt +22 -22
  277. package/apps/pwa/out/worktrees/index.html +1 -1
  278. package/apps/pwa/out/worktrees/index.txt +22 -22
  279. package/bin/elanous.mjs +6 -1
  280. package/catalog/models/openai/gpt-6.1-sol.yaml +16 -0
  281. package/catalog/models/openai/gpt-6.1-terra.yaml +16 -0
  282. package/docs/goal-context/04-mock-scenarios.md +13 -0
  283. package/graphs/catalog/catalog.yaml +1 -1
  284. package/graphs/demo/persona-teacher/lesson-pack.yaml +16 -0
  285. package/graphs/demo/persona-teacher/recipes.yaml +17 -0
  286. package/graphs/demo/persona-teacher/weekly-lesson.yaml +36 -0
  287. package/graphs/heal/heal-loop.yaml +1 -0
  288. package/graphs/overlays/stop-heal-ladder.yaml +136 -2
  289. package/graphs/release/release-loop.yaml +3 -1
  290. package/graphs/units/gate/gate.yaml +20 -0
  291. package/graphs/units/git/git.yaml +26 -0
  292. package/graphs/units/implement/implement.yaml +19 -0
  293. package/graphs/units/landing/landing.yaml +18 -0
  294. package/graphs/units/review/review.yaml +20 -0
  295. package/graphs/units/verbs/recipes.yaml +13 -10
  296. package/graphs/units/verbs/research.yaml +20 -0
  297. package/graphs/work/research-report.yaml +21 -3
  298. package/package.json +1 -1
  299. package/scripts/disk-steward.ts +46 -0
  300. package/scripts/fleet/node-setup.sh +50 -0
  301. package/scripts/graph-units/verbs/research.ts +55 -0
  302. package/scripts/heal/run-role.ts +99 -5
  303. package/scripts/land-global-checks.ts +6 -1
  304. package/scripts/lib/decompose-ab.ts +1 -0
  305. package/scripts/lib/fixtures/tui-regress/help-insufficient-commands.txt +15 -0
  306. package/scripts/lib/fixtures/tui-regress/help-live.txt +42 -0
  307. package/scripts/lib/fixtures/tui-regress/help-missing-keys.txt +21 -0
  308. package/scripts/lib/fixtures/tui-regress/help-original.txt +51 -0
  309. package/scripts/lib/fixtures/tui-regress/help-shifted-input.txt +26 -0
  310. package/scripts/lib/tui-regress-checks.ts +33 -13
  311. package/scripts/llm-cost-ledger.ts +179 -8
  312. package/scripts/measure-nl-routing-corpus.ts +10 -2
  313. package/scripts/persona-teacher/weekly-lesson-node.ts +172 -0
  314. package/scripts/public-copy-lint.ts +163 -19
  315. package/scripts/ratchets/train-side-invariants.sh +0 -1
  316. package/scripts/release-loop/gate-autoheal.ts +117 -0
  317. package/scripts/release-loop/gate-baseline-receipt.ts +55 -10
  318. package/scripts/release-loop/gate-diff.ts +22 -3
  319. package/scripts/release-loop/gate-image-pin.ts +81 -0
  320. package/scripts/release-loop/gate-node-sim.ts +207 -0
  321. package/scripts/release-loop/gate-node.ts +489 -62
  322. package/scripts/release-loop/gate-pod-image-sticky-plan.ts +99 -0
  323. package/scripts/release-loop/gate-radius-live.ts +97 -13
  324. package/scripts/release-loop/gate-shard-dispatch.ts +43 -0
  325. package/scripts/release-loop/gate-shard-load-flaky.ts +256 -0
  326. package/scripts/release-loop/gate-train-receipts.ts +122 -0
  327. package/scripts/release-loop/gate-triage-node.ts +70 -10
  328. package/scripts/release-loop/resume-release.ts +330 -23
  329. package/scripts/release-loop/traffic-node.ts +6 -3
  330. package/scripts/release-loop/unattended-release.ts +4 -2
  331. package/scripts/shadow-authoring-probe.ts +20 -0
  332. package/scripts/ux-sim.ts +37 -3
  333. package/scripts/warm-pool-provider-config.ts +263 -0
  334. package/skills/omni-crawl/SKILL.md +5 -2
  335. package/skills/omni-crawl/scripts/main.ts +84 -23
  336. package/src/acp/core-turn-bridge.ts +99 -4
  337. package/src/agent/registry.ts +2 -0
  338. package/src/agent/task-notification.ts +25 -5
  339. package/src/agent/types.ts +6 -0
  340. package/src/agent-mission/mission-cli.ts +24 -0
  341. package/src/agent-mission/mission-out.ts +595 -0
  342. package/src/agent-mission/tool-install.ts +88 -2
  343. package/src/agent-substrate/context-strategy.ts +4 -4
  344. package/src/agent-substrate/self-review-cli.ts +267 -40
  345. package/src/auto-research/research-turn.ts +133 -51
  346. package/src/autopilot/discovery/wiki-claim-proposer.ts +22 -1
  347. package/src/autopilot/pr-manager.ts +38 -7
  348. package/src/autopilot/pty-control-loop.ts +2 -0
  349. package/src/boot/daemon-tools/self-implement.ts +46 -9
  350. package/src/budget/shadow-arms.ts +52 -0
  351. package/src/capture/tui-self-report.ts +22 -6
  352. package/src/chat/index.ts +1 -1
  353. package/src/chat/pickers/state.ts +7 -1
  354. package/src/cli/fixtures/review-loop-breaker/opwaiver-32646-1694ccc7a170.json +1 -0
  355. package/src/cli/fixtures/review-loop-breaker/opwaiver-32853-bd8f73595c83.json +1 -0
  356. package/src/cli/fixtures/review-loop-breaker/opwaiver-33097-1cc85900413c.json +1 -0
  357. package/src/cli/fixtures/review-loop-breaker/opwaiver-33106-972f31e4a3ca.json +1 -0
  358. package/src/cli/fixtures/review-loop-breaker/opwaiver-33113-3ab51f05968f.json +1 -0
  359. package/src/cli/fixtures/review-loop-breaker/pr-33097-1cc85900413c.json +1 -0
  360. package/src/cli/log-event-names.ts +5 -0
  361. package/src/cli/mcp-login.ts +8 -18
  362. package/src/cli/msg-cli.ts +57 -1
  363. package/src/cli/pr-land-heavy-remote.ts +47 -9
  364. package/src/cli/pr-land-overlap-evidence.ts +100 -1
  365. package/src/cli/pr-land-pod-shadow-job.ts +60 -0
  366. package/src/cli/release-checklist-read-cli.ts +20 -10
  367. package/src/cli/release-cli.ts +27 -1
  368. package/src/cli/research-cli.ts +4 -5
  369. package/src/cli/sim-cli.ts +7 -1
  370. package/src/cli/tasks-cli.ts +12 -4
  371. package/src/codex/models.ts +30 -15
  372. package/src/compact/auto.ts +8 -1
  373. package/src/control-plane/ledger.ts +52 -2
  374. package/src/control-plane/server.ts +16 -2
  375. package/src/core-turn/run-core-turn.ts +313 -89
  376. package/src/core-turn/run-goal-loop.ts +106 -2
  377. package/src/core-turn/types.ts +2 -0
  378. package/src/dashboard/acp-boot.ts +72 -3
  379. package/src/dashboard/classic-sidetab-mission-job.ts +58 -0
  380. package/src/dashboard/classic-sidetab-mission.ts +185 -0
  381. package/src/dashboard/index.ts +155 -15
  382. package/src/dashboard/input/agent-wake.ts +23 -1
  383. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +9 -0
  384. package/src/dashboard/mission-cli-consumer.ts +153 -0
  385. package/src/dashboard/seat-boot-preamble.ts +171 -1
  386. package/src/dashboard/side-basic-runtime.ts +54 -1
  387. package/src/dashboard/sidetab-runtime.ts +90 -1
  388. package/src/dashboard/skill-catalog-preamble.ts +101 -0
  389. package/src/dashboard/skill-detection-runtime.ts +55 -15
  390. package/src/dashboard/slash-runtime/dashboard-handlers.ts +15 -0
  391. package/src/dashboard/turn-preamble.ts +65 -16
  392. package/src/dashboard/turn-prompt-runtime.ts +4 -2
  393. package/src/disk-steward/judge.ts +73 -0
  394. package/src/disk-steward/ledger.ts +122 -0
  395. package/src/disk-steward/steward.ts +373 -0
  396. package/src/domains/guardian-tick.ts +191 -2
  397. package/src/graph-runner/graph-cli.ts +44 -7
  398. package/src/graph-runner/graph-tick.ts +10 -2
  399. package/src/graph-runner/in-process-registry.ts +37 -0
  400. package/src/graph-runner/runner.ts +34 -4
  401. package/src/grok/agent-search.ts +14 -4
  402. package/src/grok/credential.ts +28 -11
  403. package/src/grounding/ref-index.ts +19 -0
  404. package/src/grounding/sources-cli.ts +9 -1
  405. package/src/harness/harness-cli-command.ts +267 -14
  406. package/src/harness/harness-incidents.ts +312 -7
  407. package/src/harness/harness-pod-dispatch.ts +81 -15
  408. package/src/harness/harness-space.ts +15 -1
  409. package/src/harness/harness-stop.ts +155 -11
  410. package/src/harness/progress-worker-entry.ts +59 -0
  411. package/src/harness/progress-worker-runtime.ts +11 -0
  412. package/src/index.ts +52 -7
  413. package/src/instance/dev-project.ts +25 -0
  414. package/src/instance/spawn-elanous.ts +6 -4
  415. package/src/intelligence-map/model-alias.ts +6 -5
  416. package/src/intelligence-map/model-catalog.ts +59 -2
  417. package/src/llm/model-defaults.ts +4 -4
  418. package/src/llm.ts +208 -19
  419. package/src/loops/orchestrator/coordinator-shadow.ts +226 -0
  420. package/src/loops/orchestrator/tick.ts +61 -0
  421. package/src/maturity/feature-maturity.ts +1 -1
  422. package/src/mcp/mcp-oauth.ts +3 -1
  423. package/src/model-tier/llm-tier-map.ts +9 -9
  424. package/src/model-tier/turn-tier.ts +1 -1
  425. package/src/msg/msg-mirror-github.ts +80 -0
  426. package/src/msg/msg-mirror-policy.ts +61 -0
  427. package/src/msg/msg-mirror-runner.ts +219 -0
  428. package/src/msg/msg-mirror-state.ts +33 -0
  429. package/src/msg/msg-store.ts +11 -0
  430. package/src/native-tool-catalog.ts +2 -2
  431. package/src/nexus/api/harness-traversal.ts +11 -0
  432. package/src/output-truncation.ts +41 -12
  433. package/src/pr-tool/census.ts +3 -2
  434. package/src/project/project-store.ts +48 -1
  435. package/src/pty-shell/tui-run-state.ts +188 -2
  436. package/src/release-loop/checklist-target-path-hint.ts +13 -0
  437. package/src/release-loop/checklist.ts +9 -1
  438. package/src/release-loop/gate-host-reservation.ts +144 -0
  439. package/src/release-loop/release-schedule.ts +90 -1
  440. package/src/repl/index.ts +43 -2
  441. package/src/research/axis-fanout.ts +121 -16
  442. package/src/research/bloom-exemplars.ts +137 -0
  443. package/src/research/gap-followup.ts +13 -1
  444. package/src/research/plugin-discovery.ts +36 -14
  445. package/src/research-bridge/invoke.ts +22 -5
  446. package/src/research-bridge/types.ts +2 -0
  447. package/src/self-dev/ask-launch-flow.ts +39 -25
  448. package/src/self-dev/decompose.ts +119 -5
  449. package/src/self-dev/dev-cli.ts +17 -17
  450. package/src/self-dev/graph-front-nodes.ts +23 -0
  451. package/src/self-dev/launch-preflight-text.ts +5 -6
  452. package/src/self-dev/launch-preflight.ts +9 -4
  453. package/src/self-dev/orchestrate.ts +27 -2
  454. package/src/self-dev/review-provider-fallback.ts +9 -2
  455. package/src/self-dev/run-supervisor.ts +226 -6
  456. package/src/self-dev/run-types.ts +7 -0
  457. package/src/self-implement/doctor-visit.ts +88 -0
  458. package/src/self-implement/gate-artifacts.ts +13 -0
  459. package/src/self-implement/gate-cli.ts +54 -24
  460. package/src/self-implement/gate-remote.ts +23 -5
  461. package/src/self-implement/goal-author-clarification.ts +31 -12
  462. package/src/self-implement/goal-author.ts +403 -8
  463. package/src/self-implement/graph-overlay-yaml.ts +7 -0
  464. package/src/self-implement/graph-stage-units.ts +172 -0
  465. package/src/self-implement/graph-templates.ts +162 -1
  466. package/src/self-implement/graph-variant.ts +37 -4
  467. package/src/self-implement/headless-elanous-driver.ts +31 -2
  468. package/src/self-implement/heal-intake.ts +112 -4
  469. package/src/self-implement/heal-triage.ts +20 -0
  470. package/src/self-implement/host-regate.ts +31 -8
  471. package/src/self-implement/knowhow-pack.ts +38 -0
  472. package/src/self-implement/merge-train.ts +5 -0
  473. package/src/self-implement/orchestrator.ts +359 -30
  474. package/src/self-implement/regate-detail.ts +38 -1
  475. package/src/self-implement/rework-child-provider.ts +25 -0
  476. package/src/self-implement/run-chart.ts +119 -0
  477. package/src/self-implement/run-ledger.ts +176 -17
  478. package/src/self-implement/run-stop.ts +208 -5
  479. package/src/self-implement/running-runs.ts +35 -12
  480. package/src/self-implement/self-implement-cli.ts +36 -4
  481. package/src/self-implement/stop-autoheal-operational.ts +43 -0
  482. package/src/self-implement/stop-autoheal.ts +28 -6
  483. package/src/session/chat.ts +69 -58
  484. package/src/session/request-size-guard.ts +123 -0
  485. package/src/session-runtime/index.ts +98 -4
  486. package/src/session-runtime/tier-flip.ts +3 -3
  487. package/src/sidetab-core/model.ts +150 -0
  488. package/src/sidetab-core/visible-agent-mission.ts +186 -0
  489. package/src/skills/name-match.ts +20 -0
  490. package/src/skills/tools/agent.ts +30 -2
  491. package/src/skills/tools/omni-search.ts +67 -5
  492. package/src/task-agent/parent-host.ts +14 -1
  493. package/src/task-agent/pod-distributor-entry.ts +3 -0
  494. package/src/task-agent/task-hand.ts +31 -1
  495. package/src/task-orchestrator/surfaces/pod-distributor.ts +48 -0
  496. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +43 -0
  497. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +38 -1
  498. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +29 -4
  499. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +33 -6
  500. package/src/task-orchestrator/surfaces/pod-source-bundle.ts +45 -9
  501. package/src/task-orchestrator/surfaces/pod-source-receive.ts +163 -13
  502. package/src/task-orchestrator/surfaces/pod-source-spec.ts +3 -3
  503. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +209 -39
  504. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +80 -3
  505. package/src/task-orchestrator/surfaces/self-implement-pod.ts +280 -60
  506. package/src/task-orchestrator/surfaces/self-implement.ts +18 -0
  507. package/src/tokens.ts +35 -2
  508. package/src/tool-runtime/agent-runtime.ts +1 -0
  509. package/src/tool-runtime/elanous-skills-list-runtime.ts +5 -1
  510. package/src/tool-runtime/skill-exec-runtime.ts +33 -13
  511. package/src/tool-runtime/types.ts +1 -0
  512. package/src/tui/entry.ts +24 -7
  513. package/src/tui/sidetab/attach.ts +47 -0
  514. package/src/tui/sidetab/list.ts +45 -0
  515. package/src/tui/sidetab/nl-tool.ts +2 -136
  516. package/src/tui/sidetab/peek.ts +52 -0
  517. package/src/tui-client/dashboard-session.ts +3 -0
  518. package/src/tui-client/local-chat-turn.ts +26 -13
  519. package/src/tui.ts +22 -0
  520. package/src/user-config.ts +11 -5
  521. package/src/ux-sim/fake-kubectl.ts +37 -3
  522. package/src/ux-sim/fault-needs-human-reason-repair.ts +107 -0
  523. package/src/ux-sim/fault-pod-child-result.ts +42 -0
  524. package/src/ux-sim/fault-pool-cap.ts +11 -6
  525. package/src/ux-sim/mock-scenario-catalog.json +41 -0
  526. package/src/ux-sim/mock-scenario-catalog.ts +156 -0
  527. package/src/ux-sim/release-sim-rig.ts +262 -0
  528. package/src/ux-sim/scenario.ts +116 -23
  529. package/src/ux-sim/seminar-rehearsal.ts +109 -0
  530. package/src/ux-sim/subagent-tools-device.ts +2 -2
  531. package/src/version/packed-revision.json +1 -1
  532. package/src/voice/voice-tts-singleton.ts +18 -3
  533. package/src/web-search/grok.ts +5 -9
  534. package/apps/pwa/out/_next/static/chunks/1060.014f1f01a17aec26.js +0 -115
  535. package/apps/pwa/out/_next/static/chunks/1415.79821ec7ae99acdb.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/1452.162bb2d9d699e82a.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/147.f92f63bbc5e85fa5.js +0 -286
  538. package/apps/pwa/out/_next/static/chunks/1661.fb425a1d8a065b72.js +0 -149
  539. package/apps/pwa/out/_next/static/chunks/1671-1c22b40b50b208f2.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/1758.0204d3f48783c49d.js +0 -90
  541. package/apps/pwa/out/_next/static/chunks/1806.027bf78b6a94d340.js +0 -104
  542. package/apps/pwa/out/_next/static/chunks/2047.8f23e210995d4548.js +0 -2
  543. package/apps/pwa/out/_next/static/chunks/2061-7f2bbc53ae96c88b.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/2066.a77257c8c350770a.js +0 -23
  545. package/apps/pwa/out/_next/static/chunks/2096-a938496bc996dcbd.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/2200-9a453b8f99687d49.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/2281-b8cede695c6c650e.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/2499.02fbfd18126c10c0.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/2522.f2766b76d22c8bdf.js +0 -34
  550. package/apps/pwa/out/_next/static/chunks/2615.3c9738153de3ef3f.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/2727.e703d99ac414916d.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/2752.7904b8df0254d0ae.js +0 -27
  553. package/apps/pwa/out/_next/static/chunks/2762-5051a862dfa40e99.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/2767-31784bfedf8e245d.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/2774-719820e3f5b2a3eb.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/2812-f016aa0dda149287.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/2829-734fe8bf2eee7347.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/311-32dcac79970985e8.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/3175-f93f7495cd28253c.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/3184.8da993f5502d2140.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/3231-d7c981db0ff8bdcc.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/3250.151309c5176d6b4b.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/3517.a5aa1797a9dbf2ee.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/3567-45f676877ed9e8a5.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/3819.8a1de79b2e8c7298.js +0 -24
  566. package/apps/pwa/out/_next/static/chunks/39.9b37b0be4c128a83.js +0 -77
  567. package/apps/pwa/out/_next/static/chunks/4023.a19045970a9ce16a.js +0 -36
  568. package/apps/pwa/out/_next/static/chunks/413-24c8284bda08241d.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/4135.e45d6ebc29e20647.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/4283.65502f5d0e6ff6c0.js +0 -287
  571. package/apps/pwa/out/_next/static/chunks/4305-4e28fa92a7b34a5b.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/4335-50efa61fd7613142.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/4720.ecbd1693fa151068.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/483.725e4a61be922788.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/4969-4b209d7307410c00.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/5068-c7f53862f83c0917.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/5315.bc96711c24dfefe2.js +0 -74
  578. package/apps/pwa/out/_next/static/chunks/5542.efbf14f16baed4dd.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/5622.94893f5aea7185d0.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/5644.8f401a25601d05fc.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/5658.35f70eb9871a54bf.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/5721.7bdc0e904c76ab51.js +0 -8
  583. package/apps/pwa/out/_next/static/chunks/5790-eef0ca20884a6bdf.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/5802.ef0d8598ca68fe84.js +0 -62
  585. package/apps/pwa/out/_next/static/chunks/5890.fb974729788dcb71.js +0 -1
  586. package/apps/pwa/out/_next/static/chunks/5924.5ef25cddd36d5dbf.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/5979-e59c099ebf8d1f35.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/6020.714cfeada2315e2e.js +0 -94
  589. package/apps/pwa/out/_next/static/chunks/6027-dfe0349d8c50f698.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/6178.bc4730c86cf74536.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/6273.d808b0dcb3c2b155.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/6292.6ef1df64fa6a4c8a.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/647-af8dd920ba46533c.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/6541-170dc5c59e135c0c.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/6624.981ef7caeb680560.js +0 -32
  596. package/apps/pwa/out/_next/static/chunks/6742-a1ad4a94ba7bc37a.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/6836-493dc55c39187949.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/6856-53ac421c06039a18.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/6908.06008c67f6380ea9.js +0 -148
  600. package/apps/pwa/out/_next/static/chunks/6915.096931864206f522.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/6925.5e181fb7dcf90193.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/6cc1d1d6.9a98dd4622f1afc6.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/7203-800e11037adc41eb.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/7279.6170f591105936bb.js +0 -93
  605. package/apps/pwa/out/_next/static/chunks/7349-373165c7fbdcc3df.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/7514-a533ba0ca1cae4f4.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/7515.1ad6efe157fa4448.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/7521.d919cc1fab80c1d9.js +0 -24
  609. package/apps/pwa/out/_next/static/chunks/7538.90e97bbdf9178cff.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/7825-39203196a12579b2.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/7869.5e1a9a12fd70d6c7.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/8086.1ab9103c41be884f.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/8179-e61fffbdb70f1152.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/8265.bdeb991b34db6a06.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/8357.1aaa713b052a78b1.js +0 -309
  616. package/apps/pwa/out/_next/static/chunks/8638-e42615f2166165b5.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/8639-92c11d069792429e.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/8691.54e22831d5e8ccf8.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/9069.657590a84afb8fac.js +0 -41
  620. package/apps/pwa/out/_next/static/chunks/9125-ae588d88a0293b93.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/9311.f9f641a46a508611.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/9371-a6fee8378ebfa3ee.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/9421-3aa9ff4fa7f63d8a.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/9992.07ce73c10bd5e6a1.js +0 -79
  625. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76394dc618d322c8.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/app/approvals/page-1b948637c37b3abd.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-c63400f1bcf3e47c.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/app/board/page-95d0957267819586.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/app/botlab/page-ba957ff875a026a0.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/app/bots/page-bb6fd0714879cb87.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/app/ceo/page-8f9038520d2acbef.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/app/chat/page-d4b48397e05fce2c.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/app/consult/page-72d5744245dc0c27.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/app/control/page-37625dc8300fa43a.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/app/decisions/page-fbef9d160272dbc1.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/app/design-check/page-58424168df84928e.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/app/editor/page-72c12ba430ac57c0.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/app/exec/page-d53f3e9ed806d7e0.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/app/field/page-4d2fbd45feee0829.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76394dc618d322c8.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/app/inside/page-8783dc0ed7590a2c.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/app/intake/page-3706cb390606e930.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/app/layout-9b0a86598e0111fd.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/app/live/page-4edb8df90f4537ce.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/loops/page-47398b9ba1cc5e1b.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/market/page-fb86f55cfe2e681d.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e22345fc8fd47b1b.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/morning/page-fca2e59a81744d9e.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/not-found-6e96bda63100b31e.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/observatory/page-4d17ad8e0db8cea4.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-121f92766c33beaa.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-43f14212c545f92d.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ccec2023e7a974ec.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/outputs/page-b04f33f548b89a94.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/page-c8792823c0917021.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/reflection/page-8c0e32782ceef4cb.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-94bd3922eb230ce8.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bca565887bafa03c.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ac1dffafe649fc6c.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/settings/page-52374edb5e23e455.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ad4ebca120d43ca7.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76394dc618d322c8.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/setup/page-718b89ce4b4ae4e4.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/share/page-204eca33eeeaddec.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/showroom/page-e58ba9bcdb9ac0f9.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/tasks/page-98f6dd50bafd7734.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/today/page-5a4bdd72bff27057.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/trace/page-6f6ab17d44f984ce.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/vault/page-aabb7bd15fb72da9.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e4322319164a4436.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/workflows/page-e9efc0c8f32e2371.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/workspace/page-ccde99f07aaf71f7.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-80464aced9614390.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/c696986b.5dc8bb1143af16d1.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/d5d3cefc-373c4eb722ed848b.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/d8de0de2-dd0f4ac8e5ab1832.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/framework-002b472a66935d31.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/main-49b88d47292c0476.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/main-app-fff2549cb10a133f.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/pages/_app-32abbbba3f3b76b7.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/pages/_error-9d9cfef60c60dd7a.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/webpack-cc7f483fa294034a.js +0 -1
  683. package/apps/pwa/out/_next/static/css/d0a48dc099ed86cf.css +0 -1
  684. package/scripts/ratchets/next-tui-entry-budget.ts +0 -124
  685. /package/apps/pwa/out/_next/static/{HjeK7zONHfR7op1hKXp4k → X1ucLw10Cds_h614NoEnh}/_ssgManifest.js +0 -0
@@ -123,6 +123,8 @@ export interface PodChildEvidence {
123
123
  /** Bounded, redacted diagnostics copied only from a failed child terminal result. */
124
124
  error?: string;
125
125
  detail?: string;
126
+ /** Tail of the child detail, retained separately so long reports keep their final diagnostic lines. */
127
+ detailTail?: string;
126
128
  stderr?: string;
127
129
  /** Bounded, redacted complete Pod log tail. Separate from child stderr to avoid replacing stronger child facts. */
128
130
  podLogTail?: string[];
@@ -130,6 +132,8 @@ export interface PodChildEvidence {
130
132
  podLogUnavailable?: string;
131
133
  exitCode?: number;
132
134
  classification?: string;
135
+ /** Why the child assigned its failure classification; independent from the label itself. */
136
+ classificationBasis?: string;
133
137
  scopeEscape?: true;
134
138
  outOfScopeEdits?: unknown;
135
139
  /** SCOPE-ESCAPE-AS-REFINE — why held out-of-scope edits stop the run (deletion · protected path · cap). Present only with scopeEscape. */
@@ -156,6 +160,14 @@ export interface PodChildEvidence {
156
160
  goalPlanRevision?: SelfDevJobResult['goalPlanRevision'];
157
161
  }
158
162
 
163
+ function utf8Tail(value: string, maxBytes: number): string {
164
+ const bytes = Buffer.from(value, 'utf8');
165
+ let start = Math.max(0, bytes.length - maxBytes);
166
+ // Move past continuation bytes so decoding starts at a complete UTF-8 code point.
167
+ while (start < bytes.length && (bytes[start]! & 0xc0) === 0x80) start++;
168
+ return bytes.subarray(start).toString('utf8');
169
+ }
170
+
159
171
  const SCOPE_STOP_REASON_ORDER: readonly ScopeStopReason[] = SCOPE_STOP_REASONS;
160
172
 
161
173
  /** Stop reasons for held out-of-scope edits: the child's own `scopeStopReasons` (orchestrator decideScopeExpansion) plus
@@ -218,12 +230,18 @@ export function podChildEvidenceFromResult(o: Record<string, unknown>): PodChild
218
230
  const classification = scopeEscape ? 'scope-escape'
219
231
  : typeof abandoned?.classification === 'string' ? redactSecretText(abandoned.classification)
220
232
  : typeof o.failureClassification === 'string' ? redactSecretText(o.failureClassification) : undefined;
233
+ const rawClassificationBasis = abandoned?.classificationBasis ?? o.classificationBasis;
234
+ const classificationBasis = typeof rawClassificationBasis === 'string' && rawClassificationBasis.trim()
235
+ ? redactSecretText(rawClassificationBasis).slice(0, 200) : undefined;
221
236
  const evidence: PodChildEvidence = {
222
237
  ...(failedText(o.error) ? { error: failedText(o.error) } : {}),
223
238
  ...(failedText(o.detail) ? { detail: failedText(o.detail) } : {}),
239
+ ...(o.ok === false && typeof o.detail === 'string' && o.detail.trim()
240
+ ? { detailTail: utf8Tail(redactSecretText(o.detail), 4_096) } : {}),
224
241
  ...(failedText(o.stderr) ? { stderr: failedText(o.stderr) } : {}),
225
242
  ...(failureExitCode !== undefined ? { exitCode: failureExitCode } : {}),
226
243
  ...(classification ? { classification } : {}),
244
+ ...(classificationBasis ? { classificationBasis } : {}),
227
245
  ...(scopeEscape ? { scopeEscape: true, scopeStopReasons } : {}),
228
246
  ...(outOfScopeEdits !== undefined ? { outOfScopeEdits } : {}),
229
247
  ...(newScope ? { newScope } : {}),
package/src/tokens.ts CHANGED
@@ -33,7 +33,32 @@ export function estimateTokens(text: string): number {
33
33
  return Math.ceil(ascii / 4 + wide / 2);
34
34
  }
35
35
 
36
- export interface MessageLike { role: string; content: string | unknown[] }
36
+ export interface MessageLike {
37
+ role: string;
38
+ content: string | unknown[];
39
+ /** Opaque reasoning replayed by the Codex Responses adapter. */
40
+ codexReasoningItems?: unknown[];
41
+ }
42
+
43
+ function estimateStructuredTokens(value: unknown, ancestors = new Set<object>()): number {
44
+ if (typeof value === 'string') return estimateTokens(value);
45
+ if (value === null || typeof value !== 'object') return 1;
46
+ if (ancestors.has(value)) return 200; // malformed cyclic extension: conservative block floor
47
+ ancestors.add(value);
48
+ let total = 2; // JSON brackets/braces
49
+ if (Array.isArray(value)) {
50
+ total += Math.ceil(value.length / 4); // commas
51
+ for (const item of value) total += estimateStructuredTokens(item, ancestors);
52
+ } else {
53
+ const entries = Object.entries(value);
54
+ total += Math.ceil(entries.length / 4); // commas
55
+ for (const [key, item] of entries) {
56
+ total += estimateTokens(key) + 1 + estimateStructuredTokens(item, ancestors);
57
+ }
58
+ }
59
+ ancestors.delete(value);
60
+ return total;
61
+ }
37
62
 
38
63
  export function estimateMessagesTokens(messages: MessageLike[]): number {
39
64
  let total = 0;
@@ -44,7 +69,12 @@ export function estimateMessagesTokens(messages: MessageLike[]): number {
44
69
  for (const block of m.content) {
45
70
  if (!block || typeof block !== 'object') continue;
46
71
  const obj = block as Record<string, unknown>;
47
- if (typeof obj.text === 'string') {
72
+ if (obj.type === 'tool_use' || obj.type === 'tool_result') {
73
+ // These payloads are replayed as structured JSON; fixed block cost
74
+ // misses large args/results. Retain the old 200-token floor for
75
+ // tiny blocks so many small calls cannot under-trigger compaction.
76
+ total += Math.max(200, estimateStructuredTokens(obj));
77
+ } else if (typeof obj.text === 'string') {
48
78
  total += estimateTokens(obj.text);
49
79
  } else if (typeof obj.content === 'string') {
50
80
  // Wave 2 (2026-05-04) · tool_result block content matters
@@ -58,6 +88,9 @@ export function estimateMessagesTokens(messages: MessageLike[]): number {
58
88
  }
59
89
  }
60
90
  }
91
+ if (m.role === 'assistant' && m.codexReasoningItems?.length) {
92
+ total += estimateStructuredTokens(m.codexReasoningItems);
93
+ }
61
94
  }
62
95
  return total;
63
96
  }
@@ -10,6 +10,7 @@ export const agentRuntime: ToolRuntime<Record<string, unknown>, AgentToolResult>
10
10
  spec: buildAgentTool(),
11
11
  async run(req, ctx) {
12
12
  return await dispatchAgent(req, {
13
+ ...(ctx.parentSessionId ? { parentSessionId: ctx.parentSessionId } : {}),
13
14
  ...(ctx.agentCwd ? { cwd: ctx.agentCwd } : {}),
14
15
  hostTools: ctx.agentHostTools,
15
16
  dispatchTool: ctx.agentDispatchTool,
@@ -15,6 +15,7 @@ import { join } from 'node:path';
15
15
  import { readdir, readFile } from 'node:fs/promises';
16
16
  import { defaultSkillDirs } from '../user-config.js';
17
17
  import { SKILLS_LIST_DESCRIPTION } from '../onboarding/entry-hints.js';
18
+ import { normalizeSkillName } from '../skills/name-match.js';
18
19
  import type { LLMToolSpec } from '../llm.js';
19
20
  import type { ToolRuntime } from './types.js';
20
21
 
@@ -69,6 +70,7 @@ export async function dispatchElanousSkillsList(
69
70
  const skillsDir = dirs[0] ?? ''; // 단일 경로 계약 보존(첫 dir)·전체는 skillsDirs
70
71
  const label = dirs.join(', '); // 표시용(다중 루트면 콤마 결합)
71
72
  const query = (args.query ?? '').toLowerCase();
73
+ const normalizedQuery = normalizeSkillName(query);
72
74
  const seen = new Set<string>();
73
75
  const entries: ElanousSkillsListEntry[] = [];
74
76
  const errors: string[] = [];
@@ -91,7 +93,9 @@ export async function dispatchElanousSkillsList(
91
93
  }
92
94
  }
93
95
  let filtered = entries;
94
- if (query.length > 0) filtered = entries.filter((e) => e.name.toLowerCase().includes(query));
96
+ if (query.length > 0) filtered = entries.filter((e) =>
97
+ e.name.toLowerCase().includes(query)
98
+ || (normalizedQuery.length > 0 && normalizeSkillName(e.name).includes(normalizedQuery)));
95
99
  filtered.sort((a, b) => a.name.localeCompare(b.name));
96
100
  // 모든 dir 열거 실패(산출 0)면 실패 보고(단일 dir 부재 계약 보존).
97
101
  if (entries.length === 0 && errors.length > 0 && errors.length === dirs.length) {
@@ -3,6 +3,8 @@ import * as harnessSkillExec from '../harness/skill-exec.js';
3
3
  import { invokeResearch } from '../research-bridge/invoke.js';
4
4
  import * as skillIndex from '../skills/index.js';
5
5
  import type { SkillIndexEntry } from '../skills/index.js';
6
+ import { dirname } from 'node:path';
7
+ import { resolveSkillName } from '../skills/name-match.js';
6
8
  import { getUserConfig } from '../user-config.js';
7
9
  import type { LLMToolSpec } from '../llm.js';
8
10
  import type { ToolRuntime } from './types.js';
@@ -17,7 +19,7 @@ export interface SkillExecRunOptions {
17
19
  }
18
20
 
19
21
  export interface SkillExecArgs {
20
- /** Exact name of the skill to execute. */
22
+ /** Installed skill name; spaces/punctuation may be omitted if the match is unique. */
21
23
  skill: string;
22
24
  /** Task text passed verbatim to the named skill. */
23
25
  task: string;
@@ -33,6 +35,8 @@ export interface SkillExecResult extends Record<string, unknown> {
33
35
 
34
36
  export interface SkillExecDiscoveryDeps {
35
37
  discoverPlugin?: (gap: string, deps?: { signal?: AbortSignal }) => Promise<{ card: string }>;
38
+ /** Test seam for the bounded plugin-discovery follow-up. */
39
+ discoveryTimeoutMs?: number;
36
40
  }
37
41
 
38
42
  export type SkillExecIndexProvider = () => readonly SkillIndexEntry[];
@@ -71,13 +75,13 @@ function obtainSkillIndex(): readonly SkillIndexEntry[] {
71
75
  export function buildSkillExecTool(): LLMToolSpec {
72
76
  return {
73
77
  name: 'skill_exec',
74
- description: 'Execute one explicitly named allowlisted skill with the supplied task. If you do not know the exact skill name, call elanous_skills_list first. Does not infer a skill name.',
78
+ description: 'Execute one explicitly named allowlisted skill with the supplied task. Names may omit spaces or punctuation (for example, "krflow" resolves to "kr-flow") only when the installed match is unique. Call elanous_skills_list when uncertain.',
75
79
  parameters: {
76
80
  type: 'object',
77
81
  properties: {
78
82
  skill: {
79
83
  type: 'string',
80
- description: 'Exact name of the skill to execute.',
84
+ description: 'Installed skill name; spaces and punctuation may be omitted when the match is unique.',
81
85
  },
82
86
  task: {
83
87
  type: 'string',
@@ -95,9 +99,19 @@ export async function dispatchSkillExec(
95
99
  deps: SkillExecDiscoveryDeps = {},
96
100
  options: SkillExecRunOptions = {},
97
101
  ): Promise<SkillExecResult> {
98
- const { skill, task } = args;
102
+ const { skill: requestedSkill, task } = args;
103
+ if (requestedSkill !== requestedSkill.trim()) {
104
+ return { skill: requestedSkill, ok: false, output: REJECT_OUTPUT(requestedSkill) };
105
+ }
99
106
  const extra = getUserConfig().skillRouter.harnessExecAllowlist;
100
107
  const index = obtainSkillIndex();
108
+ const resolution = resolveSkillName(requestedSkill, index);
109
+ const skill = resolution.entry?.name ?? requestedSkill;
110
+ if (resolution.ambiguous.length > 0) {
111
+ const candidates = resolution.ambiguous.map((entry) => entry.name).sort().join(', ');
112
+ return { skill: requestedSkill, ok: false, output: `스킬 이름이 여러 항목과 일치합니다: ${candidates}. elanous_skills_list에서 정확한 이름을 골라 다시 호출하세요.` };
113
+ }
114
+ const selected = resolution.entry;
101
115
  const allowlist = harnessSkillExec.resolveHarnessExecAllowlist(
102
116
  extra,
103
117
  (rejected, reason) => observe('allowlist-reject', { skill: rejected, reason }),
@@ -163,13 +177,18 @@ export async function dispatchSkillExec(
163
177
  let interruption: 'skill-exec-timeout' | 'skill-exec-cancelled' | undefined;
164
178
  try {
165
179
  const outcome = await Promise.race([
166
- invokeResearch(task, { skill, signal: child.signal, onProgress: (delta) => {
167
- progressChunks += 1;
168
- progressBytes += delta.length;
169
- if (progressChunks === 1 || progressChunks % 32 === 0) {
170
- observe('progress', { skill, progressChunks, progressBytes });
171
- }
172
- } }).then((value) => ({ result: value })),
180
+ invokeResearch(task, {
181
+ skill,
182
+ ...(selected ? { skillRootDir: dirname(selected.skillDir) } : {}),
183
+ signal: child.signal,
184
+ onProgress: (delta) => {
185
+ progressChunks += 1;
186
+ progressBytes += delta.length;
187
+ if (progressChunks === 1 || progressChunks % 32 === 0) {
188
+ observe('progress', { skill, progressChunks, progressBytes });
189
+ }
190
+ },
191
+ }).then((value) => ({ result: value })),
173
192
  interrupted.then((reason) => ({ interruption: reason })),
174
193
  ]);
175
194
  settled = true;
@@ -195,10 +214,11 @@ export async function dispatchSkillExec(
195
214
  // A low-quality research result is a capability gap. Keep the original failure,
196
215
  // and attach a bounded discovery card rather than silently switching tools.
197
216
  let discoveryCard: string | undefined;
198
- if (!result.ok && /\b(?:no data|no evidence|missing|unavailable|not found|empty)\b|(?:자료가 없|데이터가 없|자료 부족|미확인|찾지 못)/i
217
+ const localSkillMissing = /not found under (?:~\/\.claude\/skills|\/)/i.test(result.error ?? '');
218
+ if (!result.ok && !localSkillMissing && /\b(?:no data|no evidence|missing|unavailable|not found|empty)\b|(?:자료가 없|데이터가 없|자료 부족|미확인|찾지 못)/i
199
219
  .test(`${result.output} ${result.error ?? ''}`)) {
200
220
  const controller = new AbortController();
201
- const timer = setTimeout(() => controller.abort(new Error('plugin discovery time budget exhausted')), 10_000);
221
+ const timer = setTimeout(() => controller.abort(new Error('plugin discovery time budget exhausted')), deps.discoveryTimeoutMs ?? 10_000);
202
222
  try {
203
223
  const discovery = deps.discoverPlugin ?? (await import('../research/plugin-discovery.js')).discoverResearchPlugin;
204
224
  const found = await discovery(task, { signal: controller.signal });
@@ -56,6 +56,7 @@ export interface ToolRuntimeContext {
56
56
  * supported (e.g. streaming fetch, long-running agent calls). */
57
57
  signal?: AbortSignal;
58
58
  /** Parent catalog and dispatcher inherited by an Agent runtime's child. */
59
+ parentSessionId?: string;
59
60
  agentHostTools?: LLMToolSpec[];
60
61
  /** Host-selected working directory for an Agent spawned through MCP. */
61
62
  agentCwd?: string;
package/src/tui/entry.ts CHANGED
@@ -346,15 +346,23 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
346
346
  const sidetabLines = sidetabOpen
347
347
  ? sidetabApi!.formatSidetabLines(sidetabRows, sidetabSelected, sidetabWidth, Math.max(1, rows - 1), sidetabMode)
348
348
  : [];
349
- const screenLines = sidetabOpen
350
- ? lines.map((line, index) => `${sidetabLines[index] ?? ' '.repeat(sidetabWidth)}│${line}`)
351
- : lines;
349
+ const screenLineCount = sidetabOpen ? Math.max(lines.length, sidetabLines.length) : lines.length;
350
+ const screenLines = Array.from({ length: screenLineCount }, (_, index) => {
351
+ const line = lines[index] ?? '';
352
+ return sidetabOpen ? `${sidetabLines[index] ?? ' '.repeat(sidetabWidth)}│${line}` : line;
353
+ });
352
354
  process.stdout.write(`\x1b[H\x1b[2J${screenLines.join('\n')}\x1b[${promptRow};${prompt.cursorCol + (sidetabOpen ? sidetabWidth + 1 : 0)}H\x1b[?25h`);
353
355
  if (sidetabAttachments?.hasModal() && !paintingCoordinatorFrame) sidetabAttachments.refresh();
354
356
  };
355
357
 
356
358
  const ensureSidetabAttachments = async (): Promise<void> => {
357
359
  if (sidetabAttachments) return;
360
+ const installer = await import('../agent-mission/tool-install.js') as unknown as {
361
+ detectAgentCli?: (agent: 'codex' | 'claude') => Promise<{
362
+ agent: 'codex' | 'claude'; installed: boolean; version: string | null;
363
+ login: 'ready' | 'needed' | 'unknown'; message: string;
364
+ }>;
365
+ };
358
366
  sidetabAttachments = (await import('./sidetab/attach.js')).createSidetabAttachmentController({
359
367
  drawBase: () => {
360
368
  paintingCoordinatorFrame = true;
@@ -362,6 +370,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
362
370
  },
363
371
  termSize: () => ({ cols: process.stdout.columns || 80, rows: process.stdout.rows || 24 }),
364
372
  setStatus: (message) => { status = safeStatusText(message); },
373
+ ...(installer.detectAgentCli ? { detectAgentCli: installer.detectAgentCli } : {}),
365
374
  drawRemoteFrame: (frame) => {
366
375
  sidetabRemoteFrame = frame || null;
367
376
  if (sidetabRemoteFrame !== null) {
@@ -573,7 +582,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
573
582
  .then(({ runLocalChatTurn, onLocalChatBackgroundStatus, onLocalChatSelfHealthStatus }) => {
574
583
  observeSession(turnSessionId, onLocalChatBackgroundStatus, onLocalChatSelfHealthStatus);
575
584
  let firstResponseSeen = false;
576
- return runLocalChatTurn(turnSessionId, turnText, abort.signal, undefined, undefined, (delta) => {
585
+ return runLocalChatTurn(turnSessionId, turnText, abort.signal, undefined, undefined, (delta, replace = false) => {
577
586
  // 스트림 텍스트 = 진전 신호 — 마지막 진전 시각을 올린다(녹음기 없으면 아무 일도 안 한다).
578
587
  reportTuiProgress();
579
588
  // 첫 응답 경계: 첫 스트림 델타에서 턴 시작 트레이스를 닫는다(endedBy=stream-open).
@@ -583,7 +592,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
583
592
  }
584
593
  // The first model token is visible before the final JSONL frame. Keep only
585
594
  // a bounded tail until session history becomes the canonical display.
586
- streamingReply = (streamingReply + delta).slice(-32_768);
595
+ streamingReply = replace ? delta.slice(-32_768) : (streamingReply + delta).slice(-32_768);
587
596
  activity = streamReplyLines(streamingReply, process.stdout.columns || 80);
588
597
  const now = performance.now();
589
598
  if (streamRenderAt === 0 || now - streamRenderAt >= 33) {
@@ -690,8 +699,9 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
690
699
  try {
691
700
  {
692
701
  const { createNextTuiWakeup, setNextTuiWakeupTool } = await import('../tui-client/next-wakeup.js');
693
- const { setNextSidetabHandler } = await import('../tui-client/local-chat-turn.js');
702
+ const { setNextSidetabHandler, setNextSidetabIpcEnabled } = await import('../tui-client/local-chat-turn.js');
694
703
  const { createNextSidetabHostHandler } = await import('./sidetab/nl-tool.js');
704
+ setNextSidetabIpcEnabled(true);
695
705
  wakeup = createNextTuiWakeup({
696
706
  isTurnRunning: () => busy,
697
707
  getBufferText: () => editor.text,
@@ -720,6 +730,7 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
720
730
  attach: async (row) => { await ensureSidetabAttachments(); const ok = sidetabAttachments!.select(row); render(); return { ok, action: 'attach', target: row.id }; },
721
731
  detach: () => { if (sidetabAttachments?.hasRemoteView()) sidetabAttachments.showMain(); else if (sidetabAttachments?.hasModal()) { sidetabAttachments.handleKey({ name: '\\', ctrl: true, shift: false, raw: '' }); sidetabAttachments.handleKey({ name: 'd', ctrl: false, shift: false, raw: 'd' }); } render(); return { ok: true, action: 'detach' }; },
722
732
  spawn: async (character) => { await ensureSidetabAttachments(); const ok = sidetabAttachments!.spawn(character); refreshSidetabRows(); render(); return { ok, action: 'new', character }; },
733
+ runMission: async (agent, mission) => { await ensureSidetabAttachments(); const result = await sidetabAttachments!.runMission(agent, mission); refreshSidetabRows(); render(); return result; },
723
734
  kill: async (row) => { await ensureSidetabAttachments(); const ok = sidetabAttachments!.kill(row); refreshSidetabRows(); render(); return { ok, action: 'kill', target: row.id }; },
724
735
  }));
725
736
  const gate = wakeup.gate;
@@ -1258,10 +1269,15 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
1258
1269
  }
1259
1270
  if (submitted === '/help' || submitted === '/help next') {
1260
1271
  activity.push(
1272
+ 'Commands',
1261
1273
  'Next TUI: /side · /sidetab — 세션/PTY 목록',
1262
1274
  '사이드탭: Ctrl+\\ 토글 · ↑↓ 선택 · 빈 prompt Enter=attach · /side new · /side kill',
1263
1275
  '새 PTY: s shell · e elanous · c codex 구독 · l claude code 구독',
1264
1276
  'PTY 분리: Ctrl+\\ 후 d · /term help 는 읽기 전용 목록 명령',
1277
+ '',
1278
+ 'Keys',
1279
+ 'Enter 전송 · Esc 취소 · PgUp/PgDn 대화 스크롤 · Ctrl+Q 종료',
1280
+ 'Ctrl+\\ 사이드탭 토글 · ↑/↓ 목록 이동 · Esc 입력으로 돌아오기',
1265
1281
  );
1266
1282
  status = 'Enter 전송';
1267
1283
  render();
@@ -1383,8 +1399,9 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
1383
1399
  const { setNextTuiWakeupTool } = await import('../tui-client/next-wakeup.js');
1384
1400
  setNextTuiWakeupTool(null);
1385
1401
  }
1386
- const { setNextSidetabHandler } = await import('../tui-client/local-chat-turn.js');
1402
+ const { setNextSidetabHandler, setNextSidetabIpcEnabled } = await import('../tui-client/local-chat-turn.js');
1387
1403
  setNextSidetabHandler(null);
1404
+ setNextSidetabIpcEnabled(false);
1388
1405
  turnAbort?.abort();
1389
1406
  await turnDone;
1390
1407
  backgroundSubscription.stop?.();
@@ -1,4 +1,5 @@
1
1
  import { randomUUID } from 'node:crypto';
2
+ import { join } from 'node:path';
2
3
  import { resolveBackendSpawn, claudeBackend, codexBackend } from '../../agent-mission/driver.js';
3
4
  import { DisplayCoordinator } from '../../display/coordinator.js';
4
5
  import { createDisplayEventBus } from '../../display/events.js';
@@ -6,6 +7,7 @@ import { createTerminalModalRouter } from '../../terminal/terminal-modal-router.
6
7
  import { getSessionCwd } from '../../session/working-dir.js';
7
8
  import { TerminalSessionRegistry, type TerminalSession } from '../../terminal/session-registry.js';
8
9
  import { requestRemotePtyControl } from '../../pty-shell/pty-control-ipc.js';
10
+ import { runVisibleAgentMission } from '../../sidetab-core/visible-agent-mission.js';
9
11
  import type { Key } from '../../tui.js';
10
12
  import type { SidetabRow } from './list.js';
11
13
 
@@ -16,6 +18,7 @@ export interface SidetabAttachmentController {
16
18
  select(row: SidetabRow): boolean;
17
19
  showMain(): void;
18
20
  spawn(character: SidetabCharacter): boolean;
21
+ runMission(agent: 'codex' | 'claude', mission: string): Promise<Awaited<ReturnType<typeof runVisibleAgentMission>>>;
19
22
  kill(row: SidetabRow): boolean;
20
23
  handleKey(key: Key): boolean;
21
24
  hasModal(): boolean;
@@ -24,11 +27,21 @@ export interface SidetabAttachmentController {
24
27
  close(): void;
25
28
  }
26
29
 
30
+ export interface AgentCliDetection {
31
+ agent: 'codex' | 'claude';
32
+ installed: boolean;
33
+ version: string | null;
34
+ login: 'ready' | 'needed' | 'unknown';
35
+ message: string;
36
+ }
37
+
27
38
  export function createSidetabAttachmentController(deps: {
28
39
  drawBase(): void;
29
40
  termSize(): { cols: number; rows: number };
30
41
  setStatus(message: string): void;
31
42
  drawRemoteFrame(frame: string): void;
43
+ /** Owned by OPT; a missing detector keeps the hook inert until its API lands. */
44
+ detectAgentCli?(agent: 'codex' | 'claude'): Promise<AgentCliDetection>;
32
45
  }): SidetabAttachmentController {
33
46
  const eventBus = createDisplayEventBus();
34
47
  const coordinator = new DisplayCoordinator({
@@ -45,6 +58,7 @@ export function createSidetabAttachmentController(deps: {
45
58
  let remoteFrameTimer: ReturnType<typeof setInterval> | null = null;
46
59
  let remoteFramePending = false;
47
60
  let remoteHasFrame = false;
61
+ let lastSpawnedSession: TerminalSession | null = null;
48
62
 
49
63
  const stopRemote = (): void => {
50
64
  if (remoteFrameTimer !== null) clearInterval(remoteFrameTimer);
@@ -164,6 +178,7 @@ export function createSidetabAttachmentController(deps: {
164
178
  }
165
179
  },
166
180
  }, { termCols: cols, termRows: rows });
181
+ lastSpawnedSession = session;
167
182
  if (character === 'codex' || character === 'claude') {
168
183
  deps.setStatus(`${character} 실행 · agent-mission 구독 경로 scrub 적용(${unsetEnv?.length ?? 0}개 env 제거)`);
169
184
  }
@@ -204,6 +219,38 @@ export function createSidetabAttachmentController(deps: {
204
219
  },
205
220
  showMain,
206
221
  spawn,
222
+ async runMission(agent, mission) {
223
+ if (deps.detectAgentCli) {
224
+ let detection: AgentCliDetection;
225
+ try { detection = await deps.detectAgentCli(agent); }
226
+ catch (error) {
227
+ const message = `${agent} CLI 확인에 실패했습니다: ${error instanceof Error ? error.message : String(error)}`;
228
+ deps.setStatus(message);
229
+ return { ok: false, path: '', promptReady: false, missionVisible: false, completionMarker: false, error: message };
230
+ }
231
+ if (!detection.installed) {
232
+ const message = `${detection.message} · 설치 확인 후 미션을 다시 요청하세요`;
233
+ deps.setStatus(message);
234
+ return { ok: false, path: '', promptReady: false, missionVisible: false, completionMarker: false, error: message };
235
+ }
236
+ }
237
+ lastSpawnedSession = null;
238
+ if (!spawn(agent) || !lastSpawnedSession?.modal) {
239
+ return { ok: false, path: '', promptReady: false, missionVisible: false, completionMarker: false, error: `${agent} side-tab PTY could not start` };
240
+ }
241
+ const session = lastSpawnedSession;
242
+ const outputPath = join(session.cwd, '.elanous', 'mission-results', `sidetab-${Date.now()}.md`);
243
+ const backend = agent === 'codex' ? codexBackend : claudeBackend;
244
+ const result = await runVisibleAgentMission({
245
+ pty: session.modal,
246
+ mission,
247
+ outputPath,
248
+ handleTrust: (screen, write) => backend.handleTrust?.(screen, write) ?? false,
249
+ });
250
+ showMain();
251
+ deps.setStatus(result.ok ? `미션 결과 확인 · ${result.path}` : `미션 확인 실패 · ${result.error}`);
252
+ return result;
253
+ },
207
254
  kill(row) {
208
255
  if (row.currentProcess) {
209
256
  deps.setStatus('현재 TUI 세션은 사이드탭에서 종료할 수 없습니다');
@@ -1,2 +1,47 @@
1
1
  /** Compatibility entry point for existing Next TUI callers. Shared behavior lives in sidetab-core. */
2
2
  export * from '../../sidetab-core/model.js';
3
+ import {
4
+ formatSidetabLines as formatCoreSidetabLines,
5
+ loadSidetabRows as loadCoreSidetabRows,
6
+ type SidetabRow,
7
+ } from '../../sidetab-core/model.js';
8
+ import { listPtyManifestRows } from '../../pty-shell/pty-manifest.js';
9
+ import { formatSidetabPeekLines } from './peek.js';
10
+
11
+ type PreviewSidetabRow = SidetabRow & { readonly previewSource?: string };
12
+
13
+ /** Attach the latest manifest snapshot without changing the shared row contract. */
14
+ export function loadSidetabRows(all = false, currentSessionId?: string): SidetabRow[] {
15
+ const snapshots = new Map<string, string>(listPtyManifestRows().map((row) => [row.id, row.snapshot || row.frame] as const));
16
+ return loadCoreSidetabRows(all, currentSessionId).map((row) => ({
17
+ ...row,
18
+ previewSource: snapshots.get(row.id) ?? '',
19
+ }));
20
+ }
21
+
22
+ /** Render the core list and reserve a bounded tail preview for the selected PTY row. */
23
+ export function formatSidetabLines(
24
+ rows: readonly SidetabRow[],
25
+ selected: number,
26
+ width: number,
27
+ height = Number.POSITIVE_INFINITY,
28
+ mode: 'list' | 'new' = 'list',
29
+ ): string[] {
30
+ const selectedRow = rows[selected] as PreviewSidetabRow | undefined;
31
+ const peekLines = mode === 'list' && selectedRow
32
+ ? formatSidetabPeekLines(selectedRow.previewSource ?? '', width)
33
+ : [];
34
+ if (peekLines.length === 0) return formatCoreSidetabLines(rows, selected, width, height, mode);
35
+
36
+ const reservedRows = peekLines.length + 1;
37
+ const coreLines = formatCoreSidetabLines(rows, selected, width, Math.max(0, height - reservedRows), mode);
38
+ // The core formatter reserves the leading ` › ` token for selection; a
39
+ // session label may itself contain `›`, so searching anywhere in the line
40
+ // can place the preview under the wrong row.
41
+ const selectedLine = coreLines.findIndex((line) => line.startsWith(' › '));
42
+ if (selectedLine < 0) return coreLines;
43
+
44
+ const lines = [...coreLines];
45
+ lines.splice(selectedLine + 1, 0, ' '.repeat(width), ...peekLines);
46
+ return Number.isFinite(height) ? lines.slice(0, Math.max(0, Math.floor(height))) : lines;
47
+ }
@@ -1,136 +1,2 @@
1
- import type { LLMToolSpec } from '../../llm.js';
2
- import type { SidetabRow } from './list.js';
3
-
4
- export const NEXT_SIDETAB_TOOL_NAME = 'NextSidetab';
5
- const CALL = 'elanous.sidetab.call';
6
- const RESULT = 'elanous.sidetab.result';
7
-
8
- export type NextSidetabAction = 'list' | 'switch' | 'attach' | 'detach' | 'new' | 'kill';
9
- export interface NextSidetabRequest {
10
- action: NextSidetabAction;
11
- target?: string;
12
- character?: 'shell' | 'elanous';
13
- confirm?: boolean;
14
- }
15
- export interface NextSidetabCall { type: typeof CALL; callId: string; request: NextSidetabRequest }
16
- export interface NextSidetabResult { type: typeof RESULT; callId: string; result: unknown }
17
- export type NextSidetabHandler = (request: NextSidetabRequest) => Promise<unknown>;
18
- export interface NextSidetabHostDeps {
19
- rows(): readonly SidetabRow[] | Promise<readonly SidetabRow[]>;
20
- selected(): number;
21
- switchSession(row: SidetabRow): Promise<unknown>;
22
- attach(row: SidetabRow): Promise<unknown>;
23
- detach(): unknown;
24
- spawn(character: 'shell' | 'elanous'): unknown;
25
- kill(row: SidetabRow): unknown;
26
- }
27
- export interface NextSidetabIpcProcess {
28
- send?: (message: unknown) => boolean | void;
29
- on(event: 'message', listener: (message: unknown) => void): unknown;
30
- }
31
-
32
- export const nextSidetabToolSpec: LLMToolSpec = {
33
- name: NEXT_SIDETAB_TOOL_NAME,
34
- description: 'Control the Next TUI side tab: list/view sessions and PTYs, switch sessions, attach or detach, start a local shell or elanous PTY, or kill a PTY. Ask the user to confirm before calling kill with confirm=true. Starting coding agents is not supported.',
35
- parameters: {
36
- type: 'object',
37
- properties: {
38
- action: { type: 'string', enum: ['list', 'switch', 'attach', 'detach', 'new', 'kill'] },
39
- target: { type: 'string', description: 'Optional exact or partial row id/label; required for targeted actions.' },
40
- character: { type: 'string', enum: ['shell', 'elanous'], description: 'Only used with action=new.' },
41
- confirm: { type: 'boolean', description: 'Must be true only after the user explicitly confirmed killing the selected PTY.' },
42
- },
43
- required: ['action'],
44
- additionalProperties: false,
45
- },
46
- };
47
-
48
- export function isNextSidetabCall(value: unknown): value is NextSidetabCall {
49
- const call = value as Partial<NextSidetabCall> | null;
50
- return Boolean(call && call.type === CALL && typeof call.callId === 'string'
51
- && call.request && typeof call.request === 'object');
52
- }
53
-
54
- export async function answerNextSidetabCall(handler: NextSidetabHandler, call: NextSidetabCall): Promise<NextSidetabResult> {
55
- try { return { type: RESULT, callId: call.callId, result: await handler(call.request) }; }
56
- catch (error) {
57
- return { type: RESULT, callId: call.callId, result: { error: error instanceof Error ? error.message : String(error) } };
58
- }
59
- }
60
-
61
- export function createNextSidetabHostHandler(deps: NextSidetabHostDeps): NextSidetabHandler {
62
- return async (request) => {
63
- if (!request || !['list', 'switch', 'attach', 'detach', 'new', 'kill'].includes(request.action)) {
64
- return { error: '지원하지 않는 사이드탭 동작입니다' };
65
- }
66
- if (request.action === 'new') {
67
- if (request.character !== 'shell' && request.character !== 'elanous') return { error: 'character는 shell 또는 elanous여야 합니다' };
68
- return deps.spawn(request.character);
69
- }
70
- if (request.action === 'detach') return deps.detach();
71
- const rows = await deps.rows();
72
- if (request.action === 'list') return rows.map(({ id, label, kind, badge, sessionId }) => ({ id, label, kind, badge, ...(sessionId ? { sessionId } : {}) }));
73
- const target = request.target?.trim();
74
- const exact = target ? rows.find((item) => item.id === target)
75
- ?? rows.find((item) => item.label.toLowerCase() === target.toLowerCase()) : undefined;
76
- const partial = target && !exact ? rows.filter((item) => item.label.toLowerCase().includes(target.toLowerCase())) : [];
77
- if (partial.length > 1) return { error: `사이드탭 항목이 여러 개 일치합니다: ${target}` };
78
- const row = exact ?? partial[0] ?? (target ? undefined : rows[deps.selected()]);
79
- if (!row) return { error: target ? `사이드탭 항목을 찾지 못했습니다: ${target}` : '선택된 사이드탭 항목이 없습니다' };
80
- if (request.action === 'switch') return row.kind === 'tui' ? deps.switchSession(row) : { error: 'Next TUI 세션만 전환할 수 있습니다' };
81
- if (request.action === 'attach') return deps.attach(row);
82
- if (row.currentProcess) return { error: '현재 TUI 세션은 사이드탭에서 종료할 수 없습니다' };
83
- if (request.confirm !== true) return { needsConfirmation: true, message: `PTY 종료 확인 필요: ${row.label}` };
84
- return deps.kill(row);
85
- };
86
- }
87
-
88
- export function createReplNextSidetabTool(
89
- proc: NextSidetabIpcProcess,
90
- env: NodeJS.ProcessEnv = process.env,
91
- timeoutMs = 15_000,
92
- ): { spec: LLMToolSpec; dispatch: (args: Record<string, unknown>) => Promise<unknown> } | null {
93
- if (env.ELANOUS_NEXT_TUI_SIDETAB_IPC !== '1' || typeof proc.send !== 'function') return null;
94
- const send = proc.send.bind(proc);
95
- const waiting = new Map<string, (result: unknown) => void>();
96
- let sequence = 0;
97
- const listener = (message: unknown): void => {
98
- const result = message as Partial<NextSidetabResult> | null;
99
- if (!result || result.type !== RESULT || typeof result.callId !== 'string') return;
100
- const resolve = waiting.get(result.callId);
101
- if (!resolve) return;
102
- waiting.delete(result.callId);
103
- resolve(result.result);
104
- };
105
- proc.on('message', listener);
106
- return {
107
- spec: nextSidetabToolSpec,
108
- dispatch: (args) => new Promise((resolve) => {
109
- const callId = `s${++sequence}`;
110
- const timer = setTimeout(() => {
111
- if (!waiting.delete(callId)) return;
112
- resolve({ error: 'Next TUI did not answer the side-tab request' });
113
- }, timeoutMs);
114
- waiting.set(callId, (result) => { clearTimeout(timer); resolve(result); });
115
- try {
116
- send({ type: CALL, callId, request: args as unknown as NextSidetabRequest } satisfies NextSidetabCall);
117
- } catch (error) {
118
- waiting.delete(callId);
119
- clearTimeout(timer);
120
- resolve({ error: `Next TUI IPC send failed: ${error instanceof Error ? error.message : String(error)}` });
121
- }
122
- }),
123
- };
124
- }
125
-
126
- export function registerNextSidetabReplTool(
127
- specs: LLMToolSpec[],
128
- dispatchByName: Map<string, (args: Record<string, unknown>) => Promise<unknown>>,
129
- proc: NextSidetabIpcProcess,
130
- env: NodeJS.ProcessEnv = process.env,
131
- ): void {
132
- const tool = createReplNextSidetabTool(proc, env);
133
- if (!tool) return;
134
- specs.push(tool.spec);
135
- dispatchByName.set(tool.spec.name, tool.dispatch);
136
- }
1
+ /** Compatibility entry point for Next TUI callers. Shared contracts and policy live in sidetab-core. */
2
+ export * from '../../sidetab-core/model.js';