elanous 0.2.35 → 0.2.36

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 (686) 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/chunks/{d06f9160.a3d9062f95de8ad7.js → 053a429e.9a63436527cc751c.js} +1 -1
  4. package/apps/pwa/out/_next/static/chunks/109.f196abf3484bb97f.js +287 -0
  5. package/apps/pwa/out/_next/static/chunks/{4346.8601952e73bf5803.js → 1201.afbfc5b1c5e5cbe4.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/1517.9275b89572098ff3.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1574.ad11f8db8396ab45.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1614.7a8c5c40aee0261f.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/1871-f1eb29d8dbb4065b.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/190.285c832bd9626f8c.js +64 -0
  11. package/apps/pwa/out/_next/static/chunks/2193.0ea24c4a7aa1d004.js +36 -0
  12. package/apps/pwa/out/_next/static/chunks/223-ad865c1e80491d78.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/2265-f0d90b6dbec05f81.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/2267.eb4a62a209f09ec4.js +149 -0
  15. package/apps/pwa/out/_next/static/chunks/2341-86cd06c0cf01aa33.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/2352.9abc42422bade876.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/2397-c1653a816061842d.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/{3103.0df8da390948bb84.js → 2500.cbc1257b774aae52.js} +1 -1
  19. package/apps/pwa/out/_next/static/chunks/{7644.17e37ba6f1d4226e.js → 2683.c9773a0c589b031b.js} +3 -3
  20. package/apps/pwa/out/_next/static/chunks/2709.8e1889034255fc5f.js +24 -0
  21. package/apps/pwa/out/_next/static/chunks/{4718-17d2af636796a330.js → 275-02ea4c2a33980422.js} +3 -3
  22. package/apps/pwa/out/_next/static/chunks/2812ca6a.3b9f4a7a08885744.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/284.ac77c0db55bfd3a8.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/{8714.ff0b7ce3ec3e3ae2.js → 2941.3c3546f96bc6efa7.js} +1 -1
  25. package/apps/pwa/out/_next/static/chunks/2976.b000698a3c6512dc.js +24 -0
  26. package/apps/pwa/out/_next/static/chunks/{9214.63a510d39178e997.js → 2986.45d7652e4f13557e.js} +2 -2
  27. package/apps/pwa/out/_next/static/chunks/3031-85328a92fcce4da6.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/3136.30aaaa5fa03662a3.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/{3677-4215f826f6aa68e5.js → 3148-98efd4869d660a87.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/3155.2587a55196ecb394.js +226 -0
  31. package/apps/pwa/out/_next/static/chunks/3277.785db1cf09f98601.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/3320-f9c77381f85a2c0a.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/3324.a09703033abcbd2f.js +34 -0
  34. package/apps/pwa/out/_next/static/chunks/3386-91049feabff9a94e.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/339.80afb7e8839372af.js +8 -0
  36. package/apps/pwa/out/_next/static/chunks/3410.7f9af5ab77cbe65f.js +115 -0
  37. package/apps/pwa/out/_next/static/chunks/3538.a445e50bb359d068.js +32 -0
  38. package/apps/pwa/out/_next/static/chunks/3540c645.2595a6af01a97672.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3621.581b2054cc14bee4.js +286 -0
  40. package/apps/pwa/out/_next/static/chunks/3676.8c28d16fd84ca843.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/{9512.5a76207a730e0491.js → 3727.7949ccaacaa71242.js} +2 -2
  42. package/apps/pwa/out/_next/static/chunks/375-b84540853523fe52.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/{8557-e7898769499cd56f.js → 3757-180308bc61021b05.js} +1 -1
  44. package/apps/pwa/out/_next/static/chunks/379.ee262e37586fe1ae.js +74 -0
  45. package/apps/pwa/out/_next/static/chunks/{359-2250789a2d3499e7.js → 3840-5825d56d46976a92.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/3969-81054381eaec4c4c.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/{da5176c6.6773b6c5994e1d99.js → 3a3d9966.cc4d4585a2708e7c.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/4067-bf9aa60547972937.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4116.a84a92a2492c080e.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4176.e5729c93c29151eb.js +104 -0
  51. package/apps/pwa/out/_next/static/chunks/4227-e6c84686bc8946ca.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/{9952.5daf5f94063a2b3e.js → 4286.b70c4520306817e8.js} +1 -1
  53. package/apps/pwa/out/_next/static/chunks/4304.e9b2512834a9e23e.js +23 -0
  54. package/apps/pwa/out/_next/static/chunks/4327.b9e08a71c0009348.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/{938.66ad1ef0e5abae1c.js → 4615.8525eb0add35eba6.js} +1 -1
  56. package/apps/pwa/out/_next/static/chunks/4946.bd106eafd668f248.js +148 -0
  57. package/apps/pwa/out/_next/static/chunks/5085-bce4904931767ca6.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/5125.2eb9968b83767193.js +93 -0
  59. package/apps/pwa/out/_next/static/chunks/5128-75b733fd74a9a1eb.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/{6236.e18cced2d5ba6afb.js → 528.38ce20ef8aa251ff.js} +16 -16
  61. package/apps/pwa/out/_next/static/chunks/5489f3fe.4bb1458b09f6dead.js +122 -0
  62. package/apps/pwa/out/_next/static/chunks/{3408.21d1570602f4b6c0.js → 552.b7d061ad91eeac51.js} +2 -2
  63. package/apps/pwa/out/_next/static/chunks/5560-2a4648f6a30f16e7.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/5711.957b095705c12560.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/{1530.0e612369b6fd7ea0.js → 575.d929793a53f27c4b.js} +1 -1
  66. package/apps/pwa/out/_next/static/chunks/5772-e29e14f8ff127122.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/5887.5b2f5b44ce0f7e9a.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/5899-4c112a2d908cf97f.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/599.c39c571b6733f2a2.js +41 -0
  70. package/apps/pwa/out/_next/static/chunks/6041.1b65efb796ebc2a5.js +79 -0
  71. package/apps/pwa/out/_next/static/chunks/6057-765c0a26028c86b2.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6142.f289e0d039f453a6.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/6199-6bcd61d2a3910e04.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/6236.cdf7293e710a9b2d.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/6387-237e079dac9a3ae6.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6448-b6d272d074276e14.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/6466-92e65a48490b68a9.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/6566.926a1d1b7c911442.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6580-cdc0e4a634ce4708.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/6659-b242dc31b20b3f29.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6690.c5d9b321b1f79384.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/671-e9b6ad0c771c5514.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6862.bcbf89dd0f4496b3.js +27 -0
  84. package/apps/pwa/out/_next/static/chunks/6912-7b375ee48732c767.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/6925.562d532110879886.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/{7385.50a308a477bdfc21.js → 6943.c6b24124853a47b2.js} +1 -1
  87. package/apps/pwa/out/_next/static/chunks/{630.fe5a46428d63b013.js → 727.7deb87749b0a343a.js} +1 -1
  88. package/apps/pwa/out/_next/static/chunks/{2018.a741297bce759490.js → 7481.39f7a4654907bf6e.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/7545.b1aa42cd15503319.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/7551-416d298c2dc4a9ab.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/{8444.4c26b379ca2b9596.js → 771.c3cdb6c1f7f47c02.js} +17 -17
  92. package/apps/pwa/out/_next/static/chunks/7784.1f0ac4a16d190cf4.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/7870-309de463786ac1fc.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7888-e29b151bb6a3bb8b.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{3589.5444a06bcf6e775c.js → 7891.03f910124a737985.js} +1 -1
  96. package/apps/pwa/out/_next/static/chunks/7905-6ba78d9234608f79.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8037.e254fd797aa224d1.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/8207.f527886b7c464529.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/856.50bda61439d465e6.js +62 -0
  100. package/apps/pwa/out/_next/static/chunks/{b2f6ba4d.fb56fdbbf798df33.js → 873d6c12.09bd499f57171543.js} +1 -1
  101. package/apps/pwa/out/_next/static/chunks/{5101.e32282718f99ed6f.js → 8904.7d51af2dc033965c.js} +2 -2
  102. package/apps/pwa/out/_next/static/chunks/9031-92e9b487edb681ee.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/9060.5410d9f6a95f6287.js +90 -0
  104. package/apps/pwa/out/_next/static/chunks/{5637.281e5dec4ea6ecf1.js → 914.8abefd48d579547b.js} +2 -2
  105. package/apps/pwa/out/_next/static/chunks/9187-c87a2207d4ac5d46.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/{4705-194e64e47ca0fbdb.js → 9250-072df22eaadaa6b5.js} +1 -1
  107. package/apps/pwa/out/_next/static/chunks/9289.3e92f278821e18e0.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/9319.7816d3cc741cd34f.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/9327-e016bb9f1674d24f.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/9365.3de48bf75193ff9a.js +77 -0
  111. package/apps/pwa/out/_next/static/chunks/9383.5b5e9aa56b5fea97.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9387-cb929573ef436f39.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9489.c27becacc3283dec.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/{8637.47f5b35afcae5e6b.js → 9514.131c52cc75fe6439.js} +1 -1
  115. package/apps/pwa/out/_next/static/chunks/9536.28962663c7734376.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/9686-12286f5bbf15a5a0.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9776.289d40cc5a4c342a.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/{1674.2a65fd5668e1cc5f.js → 9789.60f723d18097ec30.js} +1 -1
  119. package/apps/pwa/out/_next/static/chunks/989.f0c17523c5e61f65.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9972-1df393aa8d4f7d52.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9f31e478.fefcbcd3c388ebc5.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-96750aba7430959f.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4105e5bbbb043024.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5d4fa75c2acb113e.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-a79a9bdb3b2142bf.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-f1c2047484992a35.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-15ffc49b2d8c70e2.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-67d53a3fc8734135.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-e30c8dc696491336.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-2136e04fa77696e2.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-fecd2814790c2e12.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-280aa4a98fc5bb44.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-c14e96b65fb4b883.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-187dac74825ed6bf.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-6bc7246ea8c92448.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-083747f1d4518f61.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-96750aba7430959f.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-15ca95a16ec96e1f.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-a8ac031b3810eb64.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-8835f93110494cda.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-e2de2e59111c9aad.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-f2b2e4bf6e981450.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-5b92b7f75df20948.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-468eddf2b1a84ecb.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-2af16e62c12f22df.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-18b40867a77a5793.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-fe934f2979f5a4a2.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-3eec435537357170.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ff88cbfd2aa99fc8.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-a5b39fb780c70ab5.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-ae465dde1d1b3933.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-e7abc34a48a6f71e.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-cab9674fde9ead26.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-1da49bc8712284d0.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5e8aa657551ac912.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-fcc36f36c6dc1fe2.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d22db22f2a7296ca.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-d12dc7b1773878f0.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-99debec9ea7fbec0.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-96750aba7430959f.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-2a088a78bad7e924.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-2e8ed57db7e69993.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-4b3a16213c2ae8fe.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f098747ddf38c98b.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-c15958835534404b.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-68279e3c843c1fd7.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-a34a74453367a39d.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-8767a7db2155a5bd.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-bd5976683460d7f2.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-b7364835e7f2ef54.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-311af16b3ee0ffca.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-fb670757274ae990.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{0368f25d-ad84af92fefee68f.js → ccae1c4b-0cf414f5eff1b10d.js} +1 -1
  174. package/apps/pwa/out/_next/static/chunks/{cbe38a15.5a032598e39970c6.js → ceba0382.650712b56b85b582.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/{b6705a4f-b9a9047de9eecfd0.js → da5ecc5c-b005ad8cac737d57.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/{56d372f2.681ab4ec4c998fae.js → f9a61e4d.1fc2c1dbdd49fe46.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/framework-6d497cbf1eef04c6.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/main-app-012f5edec932f337.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-da5aeb809edc94a2.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/pages/_app-5ee319af6f749dfe.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_error-4bc84653a718d6c6.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/webpack-8a96cf6775c73d6e.js +1 -0
  183. package/apps/pwa/out/_next/static/{T1mBQqmkwKDLGtyisDCOd → uC-N0emedeNOFuaBQFv-I}/_buildManifest.js +1 -1
  184. package/apps/pwa/out/approvals/index.html +1 -1
  185. package/apps/pwa/out/approvals/index.txt +22 -22
  186. package/apps/pwa/out/autopilot/index.html +1 -1
  187. package/apps/pwa/out/autopilot/index.txt +22 -22
  188. package/apps/pwa/out/board/index.html +1 -1
  189. package/apps/pwa/out/board/index.txt +22 -22
  190. package/apps/pwa/out/botlab/index.html +1 -1
  191. package/apps/pwa/out/botlab/index.txt +21 -21
  192. package/apps/pwa/out/bots/index.html +1 -1
  193. package/apps/pwa/out/bots/index.txt +21 -21
  194. package/apps/pwa/out/ceo/index.html +1 -1
  195. package/apps/pwa/out/ceo/index.txt +22 -22
  196. package/apps/pwa/out/chat/index.html +1 -1
  197. package/apps/pwa/out/chat/index.txt +21 -21
  198. package/apps/pwa/out/consult/index.html +1 -1
  199. package/apps/pwa/out/consult/index.txt +22 -22
  200. package/apps/pwa/out/control/index.html +1 -1
  201. package/apps/pwa/out/control/index.txt +22 -22
  202. package/apps/pwa/out/decisions/index.html +1 -1
  203. package/apps/pwa/out/decisions/index.txt +21 -21
  204. package/apps/pwa/out/design-check/index.html +1 -1
  205. package/apps/pwa/out/design-check/index.txt +22 -22
  206. package/apps/pwa/out/editor/index.html +1 -1
  207. package/apps/pwa/out/editor/index.txt +22 -22
  208. package/apps/pwa/out/exec/index.html +1 -1
  209. package/apps/pwa/out/exec/index.txt +22 -22
  210. package/apps/pwa/out/field/index.html +1 -1
  211. package/apps/pwa/out/field/index.txt +22 -22
  212. package/apps/pwa/out/healthz +1 -1
  213. package/apps/pwa/out/index.html +1 -1
  214. package/apps/pwa/out/index.txt +21 -21
  215. package/apps/pwa/out/inside/index.html +1 -1
  216. package/apps/pwa/out/inside/index.txt +21 -21
  217. package/apps/pwa/out/intake/index.html +1 -1
  218. package/apps/pwa/out/intake/index.txt +22 -22
  219. package/apps/pwa/out/live/index.html +1 -1
  220. package/apps/pwa/out/live/index.txt +22 -22
  221. package/apps/pwa/out/live-run/index.html +1 -1
  222. package/apps/pwa/out/live-run/index.txt +22 -22
  223. package/apps/pwa/out/loops/index.html +1 -1
  224. package/apps/pwa/out/loops/index.txt +21 -21
  225. package/apps/pwa/out/market/index.html +1 -1
  226. package/apps/pwa/out/market/index.txt +21 -21
  227. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  228. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  229. package/apps/pwa/out/morning/index.html +1 -1
  230. package/apps/pwa/out/morning/index.txt +22 -22
  231. package/apps/pwa/out/observatory/index.html +1 -1
  232. package/apps/pwa/out/observatory/index.txt +22 -22
  233. package/apps/pwa/out/ops/checklist/index.html +1 -1
  234. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  235. package/apps/pwa/out/ops/release/index.html +1 -1
  236. package/apps/pwa/out/ops/release/index.txt +21 -21
  237. package/apps/pwa/out/ops/seats/index.html +1 -1
  238. package/apps/pwa/out/ops/seats/index.txt +21 -21
  239. package/apps/pwa/out/outputs/index.html +1 -1
  240. package/apps/pwa/out/outputs/index.txt +21 -21
  241. package/apps/pwa/out/reflection/index.html +1 -1
  242. package/apps/pwa/out/reflection/index.txt +22 -22
  243. package/apps/pwa/out/scheduler/index.html +1 -1
  244. package/apps/pwa/out/scheduler/index.txt +22 -22
  245. package/apps/pwa/out/sessions/index.html +1 -1
  246. package/apps/pwa/out/sessions/index.txt +21 -21
  247. package/apps/pwa/out/settings/devices/index.html +1 -1
  248. package/apps/pwa/out/settings/devices/index.txt +22 -22
  249. package/apps/pwa/out/settings/index.html +1 -1
  250. package/apps/pwa/out/settings/index.txt +22 -22
  251. package/apps/pwa/out/setup/done/index.html +1 -1
  252. package/apps/pwa/out/setup/done/index.txt +22 -22
  253. package/apps/pwa/out/setup/index.html +1 -1
  254. package/apps/pwa/out/setup/index.txt +22 -22
  255. package/apps/pwa/out/share/index.html +1 -1
  256. package/apps/pwa/out/share/index.txt +22 -22
  257. package/apps/pwa/out/showroom/index.html +1 -1
  258. package/apps/pwa/out/showroom/index.txt +21 -21
  259. package/apps/pwa/out/tasks/index.html +1 -1
  260. package/apps/pwa/out/tasks/index.txt +22 -22
  261. package/apps/pwa/out/term/index.html +1 -1
  262. package/apps/pwa/out/term/index.txt +22 -22
  263. package/apps/pwa/out/today/index.html +1 -1
  264. package/apps/pwa/out/today/index.txt +22 -22
  265. package/apps/pwa/out/trace/index.html +1 -1
  266. package/apps/pwa/out/trace/index.txt +22 -22
  267. package/apps/pwa/out/vault/index.html +1 -1
  268. package/apps/pwa/out/vault/index.txt +22 -22
  269. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  270. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  271. package/apps/pwa/out/workflows/index.html +1 -1
  272. package/apps/pwa/out/workflows/index.txt +22 -22
  273. package/apps/pwa/out/workspace/index.html +1 -1
  274. package/apps/pwa/out/workspace/index.txt +22 -22
  275. package/apps/pwa/out/worktrees/index.html +1 -1
  276. package/apps/pwa/out/worktrees/index.txt +22 -22
  277. package/docs/goal-context/05-authoring-lessons.jsonl +47 -0
  278. package/docs/goal-context/README.md +3 -0
  279. package/graphs/default-loop.yaml +6 -1
  280. package/graphs/implement-loop.yaml +24 -0
  281. package/graphs/release/recipes.yaml +6 -0
  282. package/graphs/release/release-loop.yaml +17 -4
  283. package/graphs/wizard/recipes.yaml +44 -0
  284. package/graphs/wizard/wizard-loop.yaml +44 -0
  285. package/graphs/work/research-report.yaml +2 -0
  286. package/package.json +1 -1
  287. package/scripts/ci-typecheck-changed.ts +139 -5
  288. package/scripts/coord-role-pack.ts +1 -1
  289. package/scripts/first10-gate.ts +416 -0
  290. package/scripts/fleet/wsl-node-setup.sh +432 -0
  291. package/scripts/release-loop/docs-node.ts +204 -8
  292. package/scripts/release-loop/gate-node.ts +249 -53
  293. package/scripts/release-loop/node-verdict.ts +2 -0
  294. package/scripts/release-loop/resume-cap.ts +14 -34
  295. package/scripts/release-loop/resume-release.ts +37 -11
  296. package/scripts/release-loop/traffic-node.ts +59 -0
  297. package/scripts/release-loop/traffic-transition.ts +159 -0
  298. package/scripts/rhythm/daily.ts +137 -3
  299. package/scripts/ux-sim.ts +53 -0
  300. package/skills/README.md +1 -0
  301. package/src/acp/core-turn-bridge.ts +48 -6
  302. package/src/agent/delegate-hint.ts +16 -0
  303. package/src/agent/runner.ts +82 -2
  304. package/src/agent/task-notification.ts +56 -10
  305. package/src/agent/types.ts +4 -0
  306. package/src/agent-substrate/pr-reviewer.ts +55 -3
  307. package/src/agent-substrate/review-intent.ts +29 -2
  308. package/src/agent-substrate/review-observation.ts +3 -0
  309. package/src/agent-substrate/self-review-cli.ts +168 -16
  310. package/src/autopilot/mission-codebase-gate.ts +141 -12
  311. package/src/autopilot/pr-manager.ts +25 -5
  312. package/src/boot/daemon-tools/self-implement.ts +1 -0
  313. package/src/budget/usage-outcomes.ts +8 -4
  314. package/src/capture/tui-self-report.ts +102 -0
  315. package/src/chat/goal-continue-verdict.ts +41 -0
  316. package/src/chat/index.ts +30 -4
  317. package/src/chat/internal-turn-origin.ts +1 -0
  318. package/src/chat/paste-fold.ts +86 -0
  319. package/src/chat/tool-render/block.ts +32 -0
  320. package/src/chat/tool-render/dispatch.ts +2 -20
  321. package/src/chat/tool-render/result-text.ts +98 -0
  322. package/src/chat/turn-typeahead.ts +70 -7
  323. package/src/cli/config-audit.ts +119 -0
  324. package/src/cli/doctor-cli.ts +22 -0
  325. package/src/cli/guardian-cli.ts +10 -0
  326. package/src/cli/herdr-cli.ts +34 -0
  327. package/src/cli/light-entry-route.ts +6 -3
  328. package/src/cli/log-event-names.ts +2 -0
  329. package/src/cli/make-cli.ts +247 -11
  330. package/src/cli/msg-cli.ts +117 -3
  331. package/src/cli/pr-cli.ts +29 -16
  332. package/src/cli/pr-land-base-read.ts +11 -2
  333. package/src/cli/pr-land-heavy-remote.ts +6 -3
  334. package/src/cli/pr-land-overlap-evidence.ts +23 -4
  335. package/src/cli/pr-land-recovery.ts +117 -1
  336. package/src/cli/pty-takeover-cli.ts +8 -7
  337. package/src/cli/release-cli.ts +21 -5
  338. package/src/cli/release-single-flight.ts +1 -1
  339. package/src/cli/tasks-card-show.ts +162 -0
  340. package/src/cli/tasks-cli.ts +574 -356
  341. package/src/cli/tasks-read-cli.ts +197 -0
  342. package/src/core-turn/run-core-turn.ts +4 -2
  343. package/src/core-turn/run-goal-loop.ts +73 -16
  344. package/src/core-turn/types.ts +6 -1
  345. package/src/dashboard/context/keys.ts +8 -31
  346. package/src/dashboard/index.ts +202 -49
  347. package/src/dashboard/input/agent-wake.ts +7 -1
  348. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +146 -3
  349. package/src/dashboard/input/chat-main-slash-command.ts +4 -2
  350. package/src/dashboard/input/goal-continue.ts +210 -0
  351. package/src/dashboard/input/goal-interim.ts +2 -0
  352. package/src/dashboard/input/internal-turn.ts +2 -8
  353. package/src/dashboard/input/seat-autowake.ts +9 -7
  354. package/src/dashboard/input/turn-autoheal.ts +52 -0
  355. package/src/dashboard/seat-boot-preamble.ts +132 -5
  356. package/src/dashboard/slash-runtime/chat-persona.ts +65 -8
  357. package/src/dashboard/slash-runtime/dashboard-handlers.ts +3 -2
  358. package/src/dashboard/slash-runtime/model-choices.ts +15 -0
  359. package/src/dashboard/stale-install-check.ts +3 -99
  360. package/src/debug/batch-queue.ts +119 -0
  361. package/src/debug/tui-log-tag.ts +67 -0
  362. package/src/display/agent-surface.ts +7 -0
  363. package/src/domains/standalone-log-sink.ts +15 -2
  364. package/src/esc-abort-gate.ts +69 -0
  365. package/src/git-fs/worktree.ts +95 -1
  366. package/src/graph-runner/graph-cli.ts +18 -0
  367. package/src/graph-runner/runner.ts +20 -11
  368. package/src/graph-wizard/generate.ts +108 -4
  369. package/src/graph-wizard/steps.ts +15 -0
  370. package/src/grounding/proactive-ground.ts +86 -0
  371. package/src/harness/control-inbox.ts +49 -1
  372. package/src/harness/harness-cli-command.ts +51 -7
  373. package/src/harness/harness-incidents.ts +52 -1
  374. package/src/harness/pod-control-send.ts +33 -5
  375. package/src/harness/self-send-remote.ts +69 -0
  376. package/src/harness/self-send-routing-guard.ts +6 -0
  377. package/src/harness/self-send-target.ts +4 -3
  378. package/src/index.ts +327 -12
  379. package/src/input-core/context-key-runtime.ts +21 -0
  380. package/src/light-cli.ts +6 -1
  381. package/src/llm-wellformed.ts +70 -0
  382. package/src/llm.ts +35 -4
  383. package/src/loops/msg-wake.ts +35 -39
  384. package/src/loops/orchestrator/inbox.ts +59 -11
  385. package/src/loops/orchestrator/knowhow-pack.ts +364 -0
  386. package/src/loops/orchestrator/tick.ts +5 -1
  387. package/src/maturity/feature-maturity.ts +1 -1
  388. package/src/models/prompts.ts +17 -2
  389. package/src/msg/msg-post-office.ts +116 -0
  390. package/src/mss/logging/log-store.ts +79 -22
  391. package/src/nexus/api/decisions-route.ts +38 -18
  392. package/src/nexus/api/graph-wizard-api.ts +20 -2
  393. package/src/nexus/boot/register-mcp-clients.ts +263 -38
  394. package/src/nexus/onboarding/first-boot-wizard.ts +56 -8
  395. package/src/onboarding/first-run.ts +37 -6
  396. package/src/onboarding/web-first.ts +43 -11
  397. package/src/ops/overview-collect.ts +12 -6
  398. package/src/ops/overview.ts +3 -3
  399. package/src/persona/loader.ts +11 -0
  400. package/src/persona/types.ts +8 -0
  401. package/src/prompt-library/session-guidance.ts +14 -0
  402. package/src/provider-summary.ts +8 -0
  403. package/src/pty-shell/herdr-agent-report.ts +118 -9
  404. package/src/pty-shell/herdr-prompt.ts +266 -0
  405. package/src/pty-shell/pty-control-ipc.ts +151 -8
  406. package/src/pty-shell/pty-special-keys.ts +42 -2
  407. package/src/pty-shell/stale-install-check.ts +99 -0
  408. package/src/pty-shell/tui-run-state.ts +14 -2
  409. package/src/release-loop/auto-start.ts +20 -2
  410. package/src/release-loop/checklist.ts +76 -4
  411. package/src/release-loop/rehearsal.ts +36 -20
  412. package/src/repl/index.ts +19 -1
  413. package/src/seat-loop/knowhow-lint.ts +1 -1
  414. package/src/self-dev/decompose-proposal.ts +172 -20
  415. package/src/self-dev/decompose.ts +61 -0
  416. package/src/self-dev/dev-cli.ts +37 -3
  417. package/src/self-dev/dev-pipeline.ts +8 -2
  418. package/src/self-dev/draft-triage-rules.ts +31 -0
  419. package/src/self-dev/glm-credential-guard.ts +77 -0
  420. package/src/self-dev/graph-journey-nodes.ts +1 -0
  421. package/src/self-dev/graph-journey-route.ts +12 -2
  422. package/src/self-dev/orchestrate-cli.ts +68 -3
  423. package/src/self-dev/orchestrate.ts +116 -17
  424. package/src/self-dev/run-supervisor.ts +55 -2
  425. package/src/self-dev/run-types.ts +1 -1
  426. package/src/self-health/autoheal.ts +153 -0
  427. package/src/self-health/signatures.ts +6 -0
  428. package/src/self-implement/device-first.ts +116 -0
  429. package/src/self-implement/doctor-visit.ts +239 -1
  430. package/src/self-implement/evidence-command-budget.ts +80 -0
  431. package/src/self-implement/goal-author-cli.ts +1 -0
  432. package/src/self-implement/goal-author-decompose.ts +265 -4
  433. package/src/self-implement/goal-author.ts +33 -8
  434. package/src/self-implement/goal-elaborate.ts +176 -22
  435. package/src/self-implement/goal-refine.ts +3 -0
  436. package/src/self-implement/graph-variant.ts +40 -6
  437. package/src/self-implement/headless-elanous-driver.ts +19 -3
  438. package/src/self-implement/off-diff-evidence.ts +58 -6
  439. package/src/self-implement/orchestrator.ts +222 -21
  440. package/src/self-implement/pod-warm-pool-profile.ts +1 -0
  441. package/src/self-implement/pwa-import-graph.ts +1 -1
  442. package/src/self-implement/rework-policy.ts +30 -0
  443. package/src/self-implement/run-ledger.ts +108 -0
  444. package/src/self-implement/run-ttl.ts +38 -24
  445. package/src/self-implement/scope-adjacency.ts +3 -1
  446. package/src/self-implement/seams.ts +60 -4
  447. package/src/self-implement/wiring-check.ts +358 -0
  448. package/src/shell-env-bootstrap.ts +11 -4
  449. package/src/skills/runner.ts +4 -2
  450. package/src/skills/tools/agent.ts +290 -48
  451. package/src/skills/tools/schedule-wakeup.ts +23 -4
  452. package/src/skills/tools/shell.ts +61 -6
  453. package/src/skills/tools/terminal-modal-inject.ts +1 -2
  454. package/src/skills/tools/terminal-modal.ts +10 -8
  455. package/src/skills/url-router.ts +41 -1
  456. package/src/smart-wizard/run.ts +66 -0
  457. package/src/status/bar.ts +34 -6
  458. package/src/status/status-provider-info.ts +37 -6
  459. package/src/steward/rejudge-tick.ts +10 -2
  460. package/src/steward/ta-repair-event-collect.ts +17 -6
  461. package/src/task-agent/actions.ts +3 -1
  462. package/src/task-agent/land-queue.ts +21 -8
  463. package/src/task-agent/live-moves.ts +22 -6
  464. package/src/task-agent/mission.ts +30 -0
  465. package/src/task-agent/rejudge-on-head.ts +15 -0
  466. package/src/task-agent/repair-cycle.ts +138 -32
  467. package/src/task-agent/repair-next-move.ts +31 -3
  468. package/src/task-agent/repair-outcomes.ts +29 -0
  469. package/src/task-agent/repair-worker.ts +14 -4
  470. package/src/task-agent/shadow.ts +41 -3
  471. package/src/task-agent/task-card-prefix.ts +2 -0
  472. package/src/task-agent/task-hand.ts +477 -22
  473. package/src/task-agent/task-parent-role-llm.ts +36 -0
  474. package/src/task-agent/tier-split.ts +78 -9
  475. package/src/task-orchestrator/surfaces/pod-account-broker.ts +9 -0
  476. package/src/task-orchestrator/surfaces/pod-child-reuse.ts +146 -0
  477. package/src/task-orchestrator/surfaces/pod-command-job.ts +86 -5
  478. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +215 -3
  479. package/src/task-orchestrator/surfaces/pod-launch-history.ts +133 -0
  480. package/src/task-orchestrator/surfaces/pod-manifest-test-normalize.ts +11 -0
  481. package/src/task-orchestrator/surfaces/pod-pool.ts +76 -4
  482. package/src/task-orchestrator/surfaces/pod-provenance.ts +8 -2
  483. package/src/task-orchestrator/surfaces/pod-repair-commit.ts +18 -3
  484. package/src/task-orchestrator/surfaces/pod-si-warm-entry.ts +16 -0
  485. package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +224 -0
  486. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +201 -0
  487. package/src/task-orchestrator/surfaces/pod-si-warm-provider.ts +444 -0
  488. package/src/task-orchestrator/surfaces/pod-si-warm-runner.ts +387 -0
  489. package/src/task-orchestrator/surfaces/pod-si-warm-transport.ts +157 -0
  490. package/src/task-orchestrator/surfaces/pod-warm-worker-protocol.ts +4 -0
  491. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +485 -36
  492. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +3 -0
  493. package/src/task-orchestrator/surfaces/self-implement-pod.ts +396 -19
  494. package/src/task-orchestrator/surfaces/self-implement.ts +42 -2
  495. package/src/tool-runtime/index.ts +15 -2
  496. package/src/tool-runtime/mcp-proxy-bootstrap.ts +29 -0
  497. package/src/tty-foreground.ts +155 -0
  498. package/src/tui/chat/goal-interim.ts +173 -0
  499. package/src/tui/chat/log-view.ts +205 -18
  500. package/src/tui/chat/self-health-status.ts +232 -0
  501. package/src/tui/entry.ts +370 -81
  502. package/src/tui/input/composer.ts +8 -1
  503. package/src/tui/slash/compact-command.ts +7 -0
  504. package/src/tui/slash/compact.ts +1 -7
  505. package/src/tui/slash/resume.ts +75 -0
  506. package/src/tui-client/local-chat-turn.ts +45 -2
  507. package/src/tui-client/next-dashboard-runtime.ts +8 -0
  508. package/src/tui-client/next-loop-command.ts +70 -0
  509. package/src/tui-client/next-wakeup.ts +191 -0
  510. package/src/tui.ts +37 -0
  511. package/src/ui/modal-adapter.ts +2 -2
  512. package/src/ux-sim/classic-tui-seat-scenarios.ts +516 -0
  513. package/src/ux-sim/cli-config-audit-device.ts +121 -0
  514. package/src/ux-sim/dashboard-event-loop-stall-monitor-device.ts +238 -0
  515. package/src/ux-sim/event-monkey.ts +3 -2
  516. package/src/ux-sim/fake-bin.ts +45 -0
  517. package/src/ux-sim/fake-herdr.ts +238 -0
  518. package/src/ux-sim/fake-llm.ts +111 -6
  519. package/src/ux-sim/fault-glm-no-credential.ts +116 -0
  520. package/src/ux-sim/fault-nextmove-dispatch.ts +102 -1
  521. package/src/ux-sim/fault-scope-escape-lift.ts +33 -6
  522. package/src/ux-sim/fault-tui-400-autoheal.ts +297 -0
  523. package/src/ux-sim/goal-device.ts +619 -0
  524. package/src/ux-sim/in-process-cli.ts +22 -5
  525. package/src/ux-sim/mock-authoring-first-run-child.ts +35 -0
  526. package/src/ux-sim/mock-authoring-first-run.ts +97 -0
  527. package/src/ux-sim/mock-seat-pty-frame-child.ts +29 -0
  528. package/src/ux-sim/mock-seat-pty-frame.ts +297 -0
  529. package/src/ux-sim/mock-seat-pty-sequence-child.ts +21 -0
  530. package/src/ux-sim/mock-seat-pty-sequence.ts +206 -0
  531. package/src/ux-sim/next-tui-seat-scenarios.ts +631 -0
  532. package/src/ux-sim/onboarding-first-run-device.ts +269 -0
  533. package/src/ux-sim/pty-key-modifiers-device.ts +85 -0
  534. package/src/ux-sim/subagent-tools-device.ts +81 -0
  535. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +250 -0
  536. package/src/ux-sim/tty-foreground-steal-child.ts +21 -0
  537. package/src/version/packed-revision.json +1 -1
  538. package/apps/pwa/out/_next/static/chunks/1165.bad13fc9151a7288.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/13.02a07436dec15f89.js +0 -32
  540. package/apps/pwa/out/_next/static/chunks/1540.af38731fa7c4a3e0.js +0 -41
  541. package/apps/pwa/out/_next/static/chunks/1850.f2b470ba5a471da0.js +0 -24
  542. package/apps/pwa/out/_next/static/chunks/193.62da94cd0b88323b.js +0 -74
  543. package/apps/pwa/out/_next/static/chunks/1975.260f6d249fac5f7c.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/1982-67cd8dfe8682325f.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/1993-c0007b7ad0c0ef41.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/1999-bb415351c8a2846c.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/1c735de4.f993a30bbd3c57c4.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/1dc5a567.9b092bfae3d7099b.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/2085.8f950b4bda1cbbc7.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/2159-6179a961376956b9.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/216.b5c2a421aa1d28a5.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/2251.49fbe369f74c372c.js +0 -148
  553. package/apps/pwa/out/_next/static/chunks/2286-2939577360d3dcc0.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/2625.5d870aa999f33db1.js +0 -34
  555. package/apps/pwa/out/_next/static/chunks/2668.34d21539e62bf111.js +0 -77
  556. package/apps/pwa/out/_next/static/chunks/2833-0fe47af99ed13c29.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/2930.d0edb4f108787ef7.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/2973.77318e7d85f59477.js +0 -62
  559. package/apps/pwa/out/_next/static/chunks/3123.2bee9ba15d320bd2.js +0 -90
  560. package/apps/pwa/out/_next/static/chunks/3162-6cf652bf7124d8cf.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/3577-7340009f7007a795.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/3618.f514792d6c59d7fd.js +0 -36
  563. package/apps/pwa/out/_next/static/chunks/3669.343f9119aa276001.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/3736.c2efad489604cc3b.js +0 -79
  565. package/apps/pwa/out/_next/static/chunks/3817.f9aeab2bb6675d73.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/3f7c4ee5.3dde54f01a816613.js +0 -122
  567. package/apps/pwa/out/_next/static/chunks/4182-0b9b1251c29cc0cf.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/4441-875b97f5821ed58a.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/4582.bd68683c076649e3.js +0 -286
  570. package/apps/pwa/out/_next/static/chunks/4605-6e623f55aec77422.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/4607.5cc27468628eb4bf.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/4627.f07508b3936fd6c0.js +0 -24
  573. package/apps/pwa/out/_next/static/chunks/4747-c22262c093e46807.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/4775-178215aed0daba61.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/4815-6ffb8c3c991cc45d.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/4834-beca8b47ad29a898.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/5023-fb4802b6d2492b02.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/5154.a118f3957ed14e36.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/5210-a2e0015e3d4d5d9c.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/5356.84ac712cc15928bf.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/5401.22352141b6fd336e.js +0 -23
  582. package/apps/pwa/out/_next/static/chunks/5483-dd5d7697f6bdb106.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/5662.02eaa029af05ad46.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/5760.22456f433c6f42c0.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/5852.db1f7449f4f74612.js +0 -287
  586. package/apps/pwa/out/_next/static/chunks/5891-0f11a7d7362a9072.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/5943.264d14a44ca32513.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/604-1b3c39df083c02aa.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/6121-5f97072330738caf.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/6193.07d8ca5af4b09086.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/6203-b3fea3a60d69ff14.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/6286.d638fb5953e2e757.js +0 -8
  593. package/apps/pwa/out/_next/static/chunks/6301.ae0245f507e4395e.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/6673.fbbe5699f6ea5991.js +0 -27
  595. package/apps/pwa/out/_next/static/chunks/6777-f6d301efb5de828d.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/6786.423f24c88de034c7.js +0 -93
  597. package/apps/pwa/out/_next/static/chunks/6854-cef64a948c5e122d.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/6866-79aa5b4e47cac6aa.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/6b89c8bd.24df687a820500b3.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/7037-fe27f001db30d323.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/7080.2d826860534fd88e.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/7118.8731be28c3ebb14b.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/7196.44241bc1df3e26fe.js +0 -149
  604. package/apps/pwa/out/_next/static/chunks/7235.c7c4e6cb5c693c2d.js +0 -104
  605. package/apps/pwa/out/_next/static/chunks/7706-58bfb1546637f217.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/7839.5b91455338c9fd3f.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/7857-31f13ee96f4011aa.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/81.f74cb60312fe4001.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/8219.baa715d1deee80e2.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/8256.e3ac8421a71f82f4.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/8310-444a6a895c402f12.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/8423.f7dda8aca4fcaae5.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/8437-8d5492094b166cfa.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/8496.75649af8652c74f4.js +0 -226
  615. package/apps/pwa/out/_next/static/chunks/8576.65bb654b524f3614.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/8609.558ce2f8f9aea2be.js +0 -64
  617. package/apps/pwa/out/_next/static/chunks/8614.caec96cfb91f4ae7.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/8732.367f44a916202353.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/9141-7fd1f73a5400bdc2.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/921.c4267d0d69a65404.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/9261.3962c3321b047691.js +0 -115
  622. package/apps/pwa/out/_next/static/chunks/936-26efd1a0efdd44d3.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/9627-4b9efe616b27e2e2.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/967-2aa39b2d04b4c690.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/9734.40eb1e558c29ccea.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/9908.3aa54f7a586a73dc.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/9954-ca8d29752bdbb45a.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/9974-507fa67cb94066dd.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-ce9e00f7fb45506a.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/app/approvals/page-fa59d6d17daa3389.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-53f68bbe7bd4b774.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/app/board/page-1c500fbb9f4a7a04.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/app/botlab/page-99d72673aa5c307c.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/app/bots/page-d2d5adc1e9484c88.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/app/ceo/page-c607c5aae637f1cc.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/app/chat/page-fa8c23596d555c0f.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/app/consult/page-bdab8c5e855c8416.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/app/control/page-406b47745b53f269.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/app/decisions/page-a4276386b7051f50.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/app/design-check/page-8a26bab9ad375f25.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/app/editor/page-775f48aa1dc7a2d5.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/app/exec/page-1c4dd5f959d0c558.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/app/field/page-c48938a8377c9f70.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/app/healthz/route-ce9e00f7fb45506a.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/inside/page-c6e7905859425aa9.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/intake/page-c280f4252452e830.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/layout-cf8c57498f20970a.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/live/page-ca3a17caf409fc83.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/live-run/page-26e6c18a1a750cf6.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/loops/page-3abc872cc6aeee39.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/market/page-f7481b7b2174fe3d.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1ae7ef8077680337.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/morning/page-47c5d4db587266bd.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/not-found-415f1e243c7ccb13.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/observatory/page-73f380f17b76f95c.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-2991073ad66ee2d9.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1f5a60f70cb4dd0c.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-fbad60d1e358fb2c.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/outputs/page-bac7dee94e5eae4a.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/page-398047d6949e8ca5.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2d33a2231540ca89.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-5bf1e6bf70bcb96c.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/sessions/page-ba59c19376a0917d.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-111f187139add30f.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/settings/page-acaae197d5be5779.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0df20b0f546a0d7d.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/setup/layout-ce9e00f7fb45506a.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/setup/page-27e1202d24b8fe35.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/share/page-bda78c50a78363e5.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/showroom/page-da592691293d9c9f.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f832994317a2e9f0.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/term/page-dc0a532f5b9196ec.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/today/page-cfccbbeae0473404.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/trace/page-527e2073af84c81b.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/vault/page-bac86e9112671357.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-6d59dff410e9d76a.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/workflows/page-53a61f8be09f02d2.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/workspace/page-db8f559e763c17f9.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-c02aa4cc66455093.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/framework-50e6acebc630849b.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/main-7a1ae342d5ed75e6.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/main-app-7ad7d505ba1f92b4.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/pages/_app-02edba75232cb235.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/pages/_error-97d6ebae3e8eee4a.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/webpack-e986adaa429163e8.js +0 -1
  686. /package/apps/pwa/out/_next/static/{T1mBQqmkwKDLGtyisDCOd → uC-N0emedeNOFuaBQFv-I}/_ssgManifest.js +0 -0
@@ -171,7 +171,6 @@ import {
171
171
  buildLlmRequestInstallTool,
172
172
  dispatchLlmRequestInstall,
173
173
  } from './tools/llm-install.js';
174
- import { createInjectApprover } from '../dashboard/runtime/approvers.js';
175
174
  import {
176
175
  buildBrowserOpenTool,
177
176
  buildBrowserNavigateTool,
@@ -1526,7 +1525,10 @@ async function executeSkillUnrecorded(
1526
1525
  TerminalModalFocus: (a) => dispatchTerminalModalFocus(a),
1527
1526
  TerminalModalDetach: (a) => dispatchTerminalModalDetach(a),
1528
1527
  TerminalModalKill: (a) => dispatchTerminalModalKill(a),
1529
- TerminalModalInject: (a) => dispatchTerminalModalInject(a, { approver: createInjectApprover() }),
1528
+ TerminalModalInject: async (a) => {
1529
+ const { createInjectApprover } = await import('../dashboard/runtime/approvers.js');
1530
+ return dispatchTerminalModalInject(a, { approver: createInjectApprover() });
1531
+ },
1530
1532
  // H5 P2 · embodied-agent TTY observability.
1531
1533
  SnapshotPtyState: (a) => dispatchSnapshotPtyState(a),
1532
1534
  ListPtySnapshots: (a) => dispatchListPtySnapshots(a),
@@ -119,11 +119,121 @@ export function countSessionBackgroundFanout(session: object): number {
119
119
  return backgroundFanoutSlots.get(session) ?? 0;
120
120
  }
121
121
 
122
- /** Release one of this session's fan-out slots (floors at zero). */
122
+ /** Release one of this session's fan-out slots (floors at zero) and hand the
123
+ * freed slot to the next waiting launch (see `admitNextBackgroundAdmission`). */
123
124
  function releaseBackgroundFanoutSlot(session: object): void {
124
125
  const live = backgroundFanoutSlots.get(session);
125
126
  if (live === undefined || live <= 1) backgroundFanoutSlots.delete(session);
126
127
  else backgroundFanoutSlots.set(session, live - 1);
128
+ admitNextBackgroundAdmission(session);
129
+ }
130
+
131
+ /** Admission class for a waiting background launch. A launch that names a
132
+ * concrete agent definition is a SUBAGENT spawn (the parent asked for a
133
+ * specific worker); the default general-purpose fan-out is a GENERAL worker.
134
+ * Subagent spawns enter the shared queue first because they carry the
135
+ * parent's explicit delegation intent — a general worker can be re-issued
136
+ * in the foreground at no cost, a named subagent cannot. */
137
+ export type BackgroundAdmissionPriority = 'subagent' | 'general';
138
+
139
+ /** A launch waiting for a fan-out slot. `seq` is the process-wide arrival
140
+ * ordinal; equal-priority entries are admitted oldest-first (FIFO). */
141
+ export interface BackgroundAdmissionEntry {
142
+ priority: BackgroundAdmissionPriority;
143
+ seq: number;
144
+ }
145
+
146
+ /** Pick the index of the next entry to admit from a waiting queue: subagent
147
+ * entries before general ones, oldest (`seq`) first inside a class.
148
+ * Returns -1 for an empty queue. Pure — the queue order itself never has to
149
+ * be pre-sorted. */
150
+ export function selectNextAdmissionIndex(
151
+ entries: readonly BackgroundAdmissionEntry[],
152
+ ): number {
153
+ let oldestSubagent = -1;
154
+ let oldestAny = -1;
155
+ for (let i = 0; i < entries.length; i++) {
156
+ const entry = entries[i]!;
157
+ if (oldestAny === -1 || entry.seq < entries[oldestAny]!.seq) oldestAny = i;
158
+ if (
159
+ entry.priority === 'subagent'
160
+ && (oldestSubagent === -1 || entry.seq < entries[oldestSubagent]!.seq)
161
+ ) {
162
+ oldestSubagent = i;
163
+ }
164
+ }
165
+ return oldestSubagent >= 0 ? oldestSubagent : oldestAny;
166
+ }
167
+
168
+ /** Classify a dispatch for admission priority (see BackgroundAdmissionPriority). */
169
+ export function classifyBackgroundAdmissionPriority(
170
+ requestedType: string,
171
+ ): BackgroundAdmissionPriority {
172
+ return requestedType === 'general-purpose' ? 'general' : 'subagent';
173
+ }
174
+
175
+ interface QueuedBackgroundAdmission extends BackgroundAdmissionEntry {
176
+ admit: () => void;
177
+ abandon: () => void;
178
+ }
179
+
180
+ /** The SHARED waiting queue, per session (same scope as the slot ledger, so
181
+ * a busy session's waiters cannot head-of-line block another session).
182
+ * Entries live only while the fan-out ceiling is full and their launch
183
+ * opted in with `wait_for_slot`; every other launch keeps the immediate
184
+ * `background-fanout-limit` refusal. */
185
+ const backgroundAdmissionQueues = new WeakMap<object, QueuedBackgroundAdmission[]>();
186
+ let backgroundAdmissionSeq = 0;
187
+
188
+ /** Park this launch on the session's shared queue and resolve `true` when it
189
+ * is admitted — the admitting release has ALREADY reserved the slot for it,
190
+ * so no dispatch can slip in between the handoff and the spawn. Resolves
191
+ * `false` when the caller's abort signal fires while it waits. */
192
+ function waitForBackgroundFanoutSlot(
193
+ session: object,
194
+ priority: BackgroundAdmissionPriority,
195
+ signal?: AbortSignal,
196
+ ): Promise<boolean> {
197
+ if (signal?.aborted) return Promise.resolve(false);
198
+ return new Promise<boolean>((resolve) => {
199
+ let settled = false;
200
+ const entry: QueuedBackgroundAdmission = {
201
+ priority,
202
+ seq: backgroundAdmissionSeq++,
203
+ admit: () => finish(true),
204
+ abandon: () => finish(false),
205
+ };
206
+ // Always mutate the CURRENT queue (never a snapshot): entries settle out of
207
+ // order under priority admission, and writing back a stale array would
208
+ // resurrect an entry that was already admitted or abandoned.
209
+ function finish(admitted: boolean): void {
210
+ if (settled) return;
211
+ settled = true;
212
+ signal?.removeEventListener('abort', onAbort);
213
+ const rest = (backgroundAdmissionQueues.get(session) ?? []).filter(e => e !== entry);
214
+ if (rest.length > 0) backgroundAdmissionQueues.set(session, rest);
215
+ else backgroundAdmissionQueues.delete(session);
216
+ resolve(admitted);
217
+ }
218
+ const onAbort = (): void => { entry.abandon(); };
219
+ const queue = backgroundAdmissionQueues.get(session) ?? [];
220
+ queue.push(entry);
221
+ backgroundAdmissionQueues.set(session, queue);
222
+ signal?.addEventListener('abort', onAbort, { once: true });
223
+ });
224
+ }
225
+
226
+ /** Admit exactly one waiter for a slot that just opened, reserving the slot
227
+ * in this same synchronous block as the release. Selection is delegated to
228
+ * the pure `selectNextAdmissionIndex` (subagent first, FIFO inside a class). */
229
+ function admitNextBackgroundAdmission(session: object): void {
230
+ const queue = backgroundAdmissionQueues.get(session);
231
+ if (!queue || queue.length === 0) return;
232
+ const index = selectNextAdmissionIndex(queue);
233
+ if (index < 0) return;
234
+ const entry = queue[index]!;
235
+ backgroundFanoutSlots.set(session, countSessionBackgroundFanout(session) + 1);
236
+ entry.admit();
127
237
  }
128
238
 
129
239
  /** Fallback agent when subagent_type is missing or unresolvable. The
@@ -161,6 +271,12 @@ export interface AgentToolArgs {
161
271
  * child keeps running; completion emits a task-notification
162
272
  * (P2) which the parent sees in the next turn's user message. */
163
273
  run_in_background?: boolean;
274
+ /** When true, a background launch that hits the fan-out ceiling WAITS on
275
+ * the session's shared admission queue instead of being refused: it spawns
276
+ * as soon as a live background agent terminals (subagent waits are
277
+ * admitted before general-purpose ones, FIFO inside each class). Omitted
278
+ * or false keeps the immediate `background-fanout-limit` refusal. */
279
+ wait_for_slot?: boolean;
164
280
  /** UI label for this spawn — shown on agent-roster so siblings
165
281
  * sharing a definition are distinguishable. Takes precedence
166
282
  * over `description` as task.label. */
@@ -230,6 +346,10 @@ export function buildAgentTool(): LLMToolSpec {
230
346
  ' • You want to fan out N independent workers in parallel — call Agent N times in the same turn; each runs independently.\n' +
231
347
  ' • A SKILL.md instructs you to "spawn N expert agents" / "use the Agent tool" — that is exactly this tool.\n' +
232
348
  '\n' +
349
+ 'Delegate heavy multistep work that would overflow your context, fan out independent units in parallel, ' +
350
+ 'and hand off long investigations; use run_in_background for long-running work so you can keep coordinating ' +
351
+ 'and finish after the results arrive.\n' +
352
+ '\n' +
233
353
  'The sub-agent gets its own tools (Bash/Read/Edit/Grep/WebFetch by default) and its own ' +
234
354
  'turn budget (default 20). It returns ONE final message which becomes your tool_result. ' +
235
355
  'Pass everything the worker needs (data, persona, framing) inside `prompt` — the worker ' +
@@ -257,6 +377,10 @@ export function buildAgentTool(): LLMToolSpec {
257
377
  type: 'boolean',
258
378
  description: 'When true, returns the spawn handle immediately instead of waiting for completion. The child keeps running; its final message arrives in your next turn as a <task-notification> user message. Use for long-running explorations (multi-minute research, 10+ tool calls) so you can keep working in parallel.',
259
379
  },
380
+ wait_for_slot: {
381
+ type: 'boolean',
382
+ description: 'Only meaningful with run_in_background. When the per-session background fan-out ceiling is already full, this launch waits on the shared admission queue instead of being refused, and spawns as soon as one live background agent finishes. Waiting subagent spawns (ones that name a subagent_type) are admitted before general-purpose ones; launches with the same class keep arrival order. Omit it to get the immediate "NOT SPAWNED" refusal and re-issue later.',
383
+ },
260
384
  name: {
261
385
  type: 'string',
262
386
  description: 'Optional UI label for this spawn (shown in agent-roster / logs). Useful when fanning out N workers with the same subagent_type — give each a distinct name so the roster can tell them apart.',
@@ -277,12 +401,12 @@ export function buildAgentTool(): LLMToolSpec {
277
401
  },
278
402
  tool_filter: {
279
403
  type: 'object',
280
- description: 'Optional per-spawn tool registry isolation (Gemini pattern). Omit this field to inherit the parent\'s full available tool registry. Use it only to narrow a child to a focused subset (for example, read-only deep research or a single-purpose worker): it composes with the agent definition\'s allowlist and cannot widen access. Over-narrowing can leave the child unable to complete its task; retain every tool the delegated work needs.',
404
+ description: 'Optional per-spawn tool filter. The sub-agent inherits the parent\'s full tool registry by default; usually omit this field. Only `deny` is applied (hide specific tools). `allow` is ignored unless the user explicitly enabled narrowing, so do not try to restrict the child with it.',
281
405
  properties: {
282
406
  allow: {
283
407
  type: 'array',
284
408
  items: { type: 'string' },
285
- description: 'Whitelist of tool names the sub-agent may call. Empty array = pure text (no tools). Omitted = no allow constraint.',
409
+ description: 'Ignored by default (the child keeps every tool). Applied only when the user explicitly enabled narrowing; then unknown names are ignored with a warning and a filter that would leave 0 tools is refused (NOT SPAWNED).',
286
410
  },
287
411
  deny: {
288
412
  type: 'array',
@@ -383,6 +507,7 @@ export async function dispatchAgent(
383
507
 
384
508
  // PFC-S1 P1: new optional fields.
385
509
  const runInBackground = args.run_in_background === true;
510
+ const waitsForSlot = args.wait_for_slot === true;
386
511
  const spawnName = typeof args.name === 'string' && args.name.trim() ? args.name.trim() : undefined;
387
512
  const teamName = typeof args.team_name === 'string' && args.team_name.trim() ? args.team_name.trim() : undefined;
388
513
  const isolation = args.isolation === 'worktree' || args.isolation === 'cwd'
@@ -498,41 +623,82 @@ export async function dispatchAgent(
498
623
  // slot re-opens the moment any background agent finishes, which is what
499
624
  // lets the next launch through again.
500
625
  let fanoutSession: object | undefined;
626
+ // Set when the shared admission queue handed this dispatch its slot while it
627
+ // waited (see `admitNextBackgroundAdmission`) — the reservation block below
628
+ // must then not take a second one.
629
+ let fanoutSlotReserved = false;
501
630
  if (runInBackground) {
502
631
  // Per-session scope: slots count against THIS session's cache
503
632
  // identity (shared fallback bucket for cache-less callers), so a
504
633
  // busy OTHER session cannot starve this one's first launch.
505
634
  fanoutSession = opts.sessionCache ?? UNSCOPED_BACKGROUND_FANOUT_SESSION;
506
- const liveBackground = countSessionBackgroundFanout(fanoutSession);
507
- if (liveBackground >= AGENT_TOOL_BACKGROUND_FANOUT_CEILING) {
508
- debug.log('agent.spawn', 'background-fanout-limit', {
635
+ if (countSessionBackgroundFanout(fanoutSession) >= AGENT_TOOL_BACKGROUND_FANOUT_CEILING) {
636
+ // Not spawned: no registry task, no provider call, no cache entry.
637
+ // taskId is a sentinel (like 'dedup' above) so a caller can tell a
638
+ // refusal from a real spawn without parsing the prose. The live count
639
+ // is re-read here so an abandoned wait reports the current number.
640
+ const refuseForCeiling = (): AgentToolResult => {
641
+ const liveBackground = countSessionBackgroundFanout(fanoutSession!);
642
+ debug.log('agent.spawn', 'background-fanout-limit', {
643
+ cid: debugCorrelationId,
644
+ requestedType,
645
+ description: description.slice(0, 80),
646
+ liveBackground,
647
+ ceiling: AGENT_TOOL_BACKGROUND_FANOUT_CEILING,
648
+ }, { level: 'warn' });
649
+ return {
650
+ output:
651
+ `NOT SPAWNED — ${liveBackground} background agents are already live and the ` +
652
+ `fan-out ceiling is ${AGENT_TOOL_BACKGROUND_FANOUT_CEILING}. A slot reopens as ` +
653
+ `soon as one of them reaches a terminal state (done/error/aborted); its result ` +
654
+ `then arrives as a task-notification. Either wait for one to finish, fold this ` +
655
+ `work into an existing background spawn, or re-issue it without ` +
656
+ `run_in_background so it runs in the foreground.`,
657
+ agent: requestedType,
658
+ cid: debugCorrelationId,
659
+ durationMs: 0,
660
+ maxTurns: requestedMaxTurns,
661
+ taskId: 'background-fanout-limit',
662
+ };
663
+ };
664
+
665
+ // Shared waiting queue — opt-in only. Launches that did not pass
666
+ // `wait_for_slot` keep the immediate refusal above, byte for byte.
667
+ if (!waitsForSlot) return refuseForCeiling();
668
+
669
+ const admissionPriority = classifyBackgroundAdmissionPriority(requestedType);
670
+ debug.log('agent.spawn', 'background-queue-wait', {
509
671
  cid: debugCorrelationId,
510
672
  requestedType,
511
673
  description: description.slice(0, 80),
512
- liveBackground,
674
+ priority: admissionPriority,
675
+ liveBackground: countSessionBackgroundFanout(fanoutSession),
513
676
  ceiling: AGENT_TOOL_BACKGROUND_FANOUT_CEILING,
514
677
  }, { level: 'warn' });
515
- // Not spawned: no registry task, no provider call, no cache entry.
516
- // taskId is a sentinel (like 'dedup' above) so a caller can tell a
517
- // refusal from a real spawn without parsing the prose.
518
- return {
519
- output:
520
- `NOT SPAWNED — ${liveBackground} background agents are already live and the ` +
521
- `fan-out ceiling is ${AGENT_TOOL_BACKGROUND_FANOUT_CEILING}. A slot reopens as ` +
522
- `soon as one of them reaches a terminal state (done/error/aborted); its result ` +
523
- `then arrives as a task-notification. Either wait for one to finish, fold this ` +
524
- `work into an existing background spawn, or re-issue it without ` +
525
- `run_in_background so it runs in the foreground.`,
526
- agent: requestedType,
678
+ const admitted = await waitForBackgroundFanoutSlot(fanoutSession, admissionPriority, opts.signal);
679
+ if (!admitted) {
680
+ debug.log('agent.spawn', 'background-queue-abandoned', {
681
+ cid: debugCorrelationId,
682
+ requestedType,
683
+ description: description.slice(0, 80),
684
+ priority: admissionPriority,
685
+ reason: 'aborted-while-waiting',
686
+ }, { level: 'warn' });
687
+ return refuseForCeiling();
688
+ }
689
+ // The admitting release already reserved this dispatch's slot.
690
+ fanoutSlotReserved = true;
691
+ debug.log('agent.spawn', 'background-queue-admit', {
527
692
  cid: debugCorrelationId,
528
- durationMs: 0,
529
- maxTurns: requestedMaxTurns,
530
- taskId: 'background-fanout-limit',
531
- };
693
+ requestedType,
694
+ description: description.slice(0, 80),
695
+ priority: admissionPriority,
696
+ liveBackground: countSessionBackgroundFanout(fanoutSession),
697
+ });
532
698
  }
533
699
  }
534
700
 
535
- if (fanoutSession !== undefined) {
701
+ if (fanoutSession !== undefined && !fanoutSlotReserved) {
536
702
  // Atomic reservation: taken in the SAME synchronous block as the
537
703
  // ceiling check above, before any await — concurrent dispatches
538
704
  // cannot all pass the check and push this session past the ceiling
@@ -716,32 +882,44 @@ export async function dispatchAgent(
716
882
  // Strip the Agent tool itself from the sub-agent's available tools.
717
883
  // One level of nesting only — see file header rationale.
718
884
  childTools = stripAgentToolForOneLevelNesting(childTools);
719
- // Wave 5 E1 — apply per-spawn tool_filter. Narrows the intersection
720
- // further (cannot widen the host's allowlist). When `allow` is
721
- // explicit-empty `[]`, the worker runs text-only.
722
- const toolFilter = (args.tool_filter && typeof args.tool_filter === 'object' && !Array.isArray(args.tool_filter))
723
- ? args.tool_filter as { allow?: unknown; deny?: unknown }
724
- : undefined;
725
- if (toolFilter) {
726
- const availableToolCount = childTools.length;
727
- const allowList = Array.isArray(toolFilter.allow)
728
- ? new Set((toolFilter.allow as unknown[]).filter((n): n is string => typeof n === 'string'))
729
- : null;
730
- const denyList = Array.isArray(toolFilter.deny)
731
- ? new Set((toolFilter.deny as unknown[]).filter((n): n is string => typeof n === 'string'))
732
- : null;
733
- childTools = childTools.filter((t) => {
734
- if (denyList && denyList.has(t.name)) return false;
735
- if (allowList && !allowList.has(t.name)) return false;
736
- return true;
737
- });
885
+ // Wave 5 E1 — apply per-spawn tool_filter (SUBAGENT-TOOLS-EMPTY · 0.2.36 · 대표 «서브에이전트에 제약이 생기지 않게»).
886
+ // 기본 = 메인과 같은 도구 전부(필터 없음). allow 는 «좁히기»일 때만 — 모르는 이름은 무시하고 경고,
887
+ // 아는 이름이 하나도 없으면 allow 전체를 무시(이름 불일치로 49→0 이 되던 10-22 실물). 결과가 0개면
888
+ // 발사하지 않는다(조용히 빈손 금지 — «0 tools · Blocked» 로 끝나 «✓ done» 처럼 보이던 것).
889
+ // SUBAGENT-NO-NARROWING(0.2.36 · 대표 22:5x «서브에이전트에 제약 없게») — 모델이 넘긴 allow 는 기본 «무시», deny 만 반영.
890
+ // (10-22 n8n 실물: 49 → 9 로 좁혀진 자식 둘이 1분 만에 «완료 못함».) 좁히기는 사람이 명시할 때만 — ELANOUS_SUBAGENT_HONOR_ALLOW=1
891
+ // 또는 agent 정의(.md)의 tools 목록(위에서 이미 반영).
892
+ const filtered = applySpawnToolFilter(childTools, args.tool_filter, { honorAllow: subagentHonorsModelAllow() });
893
+ childTools = filtered.tools;
894
+ if (filtered.applied || filtered.unknownAllow.length > 0 || filtered.unknownDeny.length > 0) {
738
895
  debug.log('agent.spawn', 'tool-filter', {
739
- allowSize: allowList?.size,
740
- denySize: denyList?.size,
741
- available: availableToolCount,
896
+ cid: debugCorrelationId,
897
+ allowSize: filtered.allowSize,
898
+ denySize: filtered.denySize,
899
+ available: filtered.available,
742
900
  remaining: childTools.length,
743
- removed: availableToolCount - childTools.length,
744
- });
901
+ removed: filtered.available - childTools.length,
902
+ ...(filtered.unknownAllow.length ? { unknownAllow: filtered.unknownAllow.slice(0, 20) } : {}),
903
+ ...(filtered.unknownDeny.length ? { unknownDeny: filtered.unknownDeny.slice(0, 20) } : {}),
904
+ ...(filtered.allowIgnored ? { allowIgnored: filtered.allowIgnored } : {}),
905
+ }, filtered.unknownAllow.length || filtered.unknownDeny.length || filtered.allowIgnored ? { level: 'warn' } : undefined);
906
+ }
907
+ if (childTools.length === 0 && filtered.available > 0) {
908
+ debug.log('agent.spawn', 'no-tools-refused', {
909
+ cid: debugCorrelationId, requestedType, description: description.slice(0, 80),
910
+ available: filtered.available, denySize: filtered.denySize,
911
+ }, { level: 'warn' });
912
+ return {
913
+ output:
914
+ `NOT SPAWNED — the tool_filter would leave this sub-agent with 0 of ${filtered.available} tools, ` +
915
+ `so it could not read files or run commands. Omit tool_filter to inherit the parent's full tool set, ` +
916
+ `or narrow with real tool names (for example: ${childToolNamesSample(filtered.availableNames)}).`,
917
+ agent: requestedType,
918
+ cid: debugCorrelationId,
919
+ durationMs: 0,
920
+ maxTurns: requestedMaxTurns,
921
+ taskId: 'no-tools-refused',
922
+ };
745
923
  }
746
924
 
747
925
  const hasNoTools = childTools.length === 0;
@@ -1034,3 +1212,67 @@ export async function dispatchAgent(
1034
1212
  releaseReservedFanoutSlot();
1035
1213
  }
1036
1214
  }
1215
+
1216
+ // ── SUBAGENT-TOOLS-EMPTY: per-spawn tool filter (pure) ──────────────────────────────────────
1217
+
1218
+ export interface SpawnToolFilterResult<T extends { name: string }> {
1219
+ tools: T[];
1220
+ available: number;
1221
+ availableNames: string[];
1222
+ applied: boolean;
1223
+ allowSize?: number;
1224
+ denySize?: number;
1225
+ unknownAllow: string[];
1226
+ unknownDeny: string[];
1227
+ /** allow 를 통째로 무시했다 — 이유(빈 배열 · 아는 이름 없음 · 모델이 넘긴 allow 는 기본 무시). */
1228
+ allowIgnored?: 'empty' | 'no-known-names' | 'model-allow-ignored';
1229
+ }
1230
+
1231
+ /** 모델이 넘긴 tool_filter.allow 로 좁히는가 — 사람이 명시할 때만(기본 false). */
1232
+ export function subagentHonorsModelAllow(env: NodeJS.ProcessEnv = process.env): boolean {
1233
+ return /^(1|true|on)$/i.test((env.ELANOUS_SUBAGENT_HONOR_ALLOW ?? '').trim());
1234
+ }
1235
+
1236
+ /** 기본 = 전부 상속 · deny = 아는 이름 빼기 · allow 는 `honorAllow` 일 때만 아는 이름으로 좁히기(없으면 무시). 넓히지는 못한다. */
1237
+ export function applySpawnToolFilter<T extends { name: string }>(
1238
+ tools: readonly T[],
1239
+ rawFilter: unknown,
1240
+ opts: { honorAllow?: boolean } = {},
1241
+ ): SpawnToolFilterResult<T> {
1242
+ const available = tools.length;
1243
+ const availableNames = tools.map((t) => t.name);
1244
+ const known = new Set(availableNames);
1245
+ const filter = rawFilter && typeof rawFilter === 'object' && !Array.isArray(rawFilter)
1246
+ ? rawFilter as { allow?: unknown; deny?: unknown }
1247
+ : undefined;
1248
+ if (!filter) return { tools: [...tools], available, availableNames, applied: false, unknownAllow: [], unknownDeny: [] };
1249
+ const names = (v: unknown): string[] | null => (Array.isArray(v) ? v.filter((n): n is string => typeof n === 'string' && n.trim() !== '') : null);
1250
+ const allowRaw = names(filter.allow);
1251
+ const denyRaw = names(filter.deny);
1252
+ const unknownAllow = (allowRaw ?? []).filter((n) => !known.has(n));
1253
+ const unknownDeny = (denyRaw ?? []).filter((n) => !known.has(n));
1254
+ const allowKnown = (allowRaw ?? []).filter((n) => known.has(n));
1255
+ let allowIgnored: SpawnToolFilterResult<T>['allowIgnored'];
1256
+ let allow: Set<string> | null = null;
1257
+ if (allowRaw) {
1258
+ if (allowRaw.length === 0) allowIgnored = 'empty';
1259
+ else if (!opts.honorAllow) allowIgnored = 'model-allow-ignored';
1260
+ else if (allowKnown.length === 0) allowIgnored = 'no-known-names';
1261
+ else allow = new Set(allowKnown);
1262
+ }
1263
+ const deny = new Set((denyRaw ?? []).filter((n) => known.has(n)));
1264
+ const kept = tools.filter((t) => !deny.has(t.name) && (!allow || allow.has(t.name)));
1265
+ return {
1266
+ tools: kept, available, availableNames, applied: true,
1267
+ ...(allowRaw ? { allowSize: allowRaw.length } : {}),
1268
+ ...(denyRaw ? { denySize: denyRaw.length } : {}),
1269
+ unknownAllow, unknownDeny,
1270
+ ...(allowIgnored ? { allowIgnored } : {}),
1271
+ };
1272
+ }
1273
+
1274
+ function childToolNamesSample(names: readonly string[]): string {
1275
+ const preferred = ['Read', 'Grep', 'Glob', 'RunShell', 'Write', 'Edit'].filter((n) => names.includes(n));
1276
+ return (preferred.length ? preferred : names.slice(0, 6)).join(', ');
1277
+ }
1278
+
@@ -33,6 +33,11 @@ export const WAKEUP_MIN_DELAY_MS = 60_000;
33
33
  export const WAKEUP_MAX_ENTRIES = 5;
34
34
  export const WAKEUP_REPEAT_TTL_MS = 7 * 24 * 60 * 60 * 1000;
35
35
  export const WAKEUP_RETRY_DELAY_MS = 60_000;
36
+ /** 바쁨(NotIdle)·사람 입력 중(HumanTyping)으로 못 연 깨움을 «버리지 않고» 미루는 상한 — 첫 예정 시각부터.
37
+ * TUI-WAKEUP-DEFER-NOT-DROP(10-22 OPT w7: 02:38·02:39 NotIdle → dropped · codex 는 idle 때 골을 이어가고 바쁘면 미룬다). */
38
+ export const WAKEUP_DEFER_MAX_MS = 30 * 60_000;
39
+ /** 미룸 대상인 거부 이유 — 곧 풀리는 «지금 바쁨» 뿐이다(Disabled·Cap·Superseded 는 미뤄도 안 풀린다). */
40
+ const WAKEUP_DEFERRABLE_REASONS: ReadonlySet<string> = new Set(['NotIdle', 'HumanTyping']);
36
41
  /** 일회성 지연의 상한 — 반복 TTL 과 같은 7일(그보다 먼 일은 cron `schedule_manage` 몫). */
37
42
  export const WAKEUP_MAX_DELAY_MS = WAKEUP_REPEAT_TTL_MS;
38
43
  /** 한 턴 안 schedule·cancel 호출 합계 상한 — 넘으면 «다음 턴에» 로 거부(예약·취소 고리 차단). */
@@ -260,18 +265,32 @@ export function createWakeupScheduler(deps: WakeupSchedulerDeps): WakeupSchedule
260
265
  log('tui.wakeup', 'rejected', {
261
266
  id, reason: result.reason, ...(result.detail ? { detail: result.detail } : {}), retried: entry.retried,
262
267
  });
263
- if (!entry.retried) {
264
- // 바쁨·사람 입력 중 — 1분 뒤 한 번만 다시 청한다(같은 회차).
268
+ const deferrable = WAKEUP_DEFERRABLE_REASONS.has(result.reason);
269
+ if (deferrable) {
270
+ // 바쁨·사람 입력 중 — 버리지 않고 1분마다 다시 청한다(같은 회차). 상한 = 첫 예정 시각 + WAKEUP_DEFER_MAX_MS,
271
+ // 반복이면 다음 회차 시각도 상한(그 회차가 이 깨움을 대신한다).
272
+ const nextTry = t + WAKEUP_RETRY_DELAY_MS;
273
+ // 상한 시각의 시도까지는 한다(<=) · 반복은 다음 회차 시각과 겹치면 그 회차에 넘긴다(<).
274
+ const withinDeferCap = nextTry <= entry.dueAt + WAKEUP_DEFER_MAX_MS;
275
+ const beforeNextTick = !entry.repeatMs || nextTry < entry.dueAt + entry.repeatMs;
276
+ if (withinDeferCap && beforeNextTick) {
277
+ entry.retried = true;
278
+ timers.set(id, setTimer(() => fire(id), WAKEUP_RETRY_DELAY_MS));
279
+ return;
280
+ }
281
+ } else if (!entry.retried) {
282
+ // 바쁨이 아닌 거부 — 1분 뒤 한 번만 다시 청한다(기존 계약).
265
283
  entry.retried = true;
266
284
  timers.set(id, setTimer(() => fire(id), WAKEUP_RETRY_DELAY_MS));
267
285
  return;
268
286
  }
287
+ const exhausted = deferrable ? 'defer-exhausted' : 'retry-exhausted';
269
288
  if (entry.repeatMs) {
270
- log('tui.wakeup', 'skipped', { id, reason: 'retry-exhausted', next: 'repeat' });
289
+ log('tui.wakeup', 'skipped', { id, reason: exhausted, next: 'repeat' });
271
290
  advance(entry, t);
272
291
  return;
273
292
  }
274
- log('tui.wakeup', 'skipped', { id, reason: 'retry-exhausted', next: 'dropped' });
293
+ log('tui.wakeup', 'skipped', { id, reason: exhausted, next: 'dropped' });
275
294
  deps.notify?.(`⏰ 예약 깨움 놓침(${id}): ${entry.reason} — ${result.reason}`);
276
295
  drop(id);
277
296
  };
@@ -32,7 +32,7 @@ import {
32
32
  getShellRunnerDeps,
33
33
  } from '../../shell-runner/dispatch.js';
34
34
  import type { ShellHandle, ShellResult as RunnerResult } from '../../shell-runner/types.js';
35
- import { debug } from '../../debug/log.js';
35
+ import { debug, redactSecretText, redactSecrets } from '../../debug/log.js';
36
36
  import { getSessionCwd } from '../../session/working-dir.js';
37
37
  import { getUserConfig } from '../../user-config.js';
38
38
  import { SCHEDULE_WAKEUP_TOOL_NAME } from './schedule-wakeup.js';
@@ -515,8 +515,62 @@ function withLongSleepWarning(
515
515
  return { ...result, output: `${formatLongSleepWarning(finding, bgAvailable, resumeHint)}\n${result.output}` };
516
516
  }
517
517
 
518
- function logShellDispatch(event: string, data: Record<string, unknown>): void {
519
- debug.log('shell.dispatch', event, data);
518
+ /** The per-event cap holds for the whole recorded args text, including the
519
+ * truncation marker. Source: TUI-OBS-TRACE-PERSIST GOAL STEPS (2048 chars). */
520
+ export const SHELL_DISPATCH_ARGS_TEXT_LIMIT = 2048;
521
+
522
+ interface BoundedShellArgsText {
523
+ /** Redacted JSON text of the arguments received by dispatchRunShell. */
524
+ argsText: string;
525
+ /** True when argsText was cut to the cap. */
526
+ argsTextTruncated: boolean;
527
+ /** Length of the full redacted JSON text before bounding. */
528
+ argsTextChars: number;
529
+ /** Short scalar remains readable even if argsText itself is compacted. */
530
+ argsTextMarker?: string;
531
+ }
532
+
533
+ function stringifyShellArgs(rawArgs: unknown): string {
534
+ try {
535
+ const json = JSON.stringify(redactSecrets(rawArgs));
536
+ if (json !== undefined) return json;
537
+ } catch { /* circular / BigInt args — redact fallback text too */ }
538
+ try {
539
+ return redactSecretText(String(rawArgs));
540
+ } catch {
541
+ return '[unserializable shell args]';
542
+ }
543
+ }
544
+
545
+ /** Bounded, secret-redacted serialization for one RunShell dispatch record. */
546
+ export function boundedShellArgsText(
547
+ rawArgs: unknown,
548
+ ): BoundedShellArgsText {
549
+ const full = stringifyShellArgs(rawArgs);
550
+ if (full.length <= SHELL_DISPATCH_ARGS_TEXT_LIMIT) {
551
+ return { argsText: full, argsTextTruncated: false, argsTextChars: full.length };
552
+ }
553
+ const argsTextMarker = '[truncated]';
554
+ const prefixLen = SHELL_DISPATCH_ARGS_TEXT_LIMIT - argsTextMarker.length - 1;
555
+ return {
556
+ argsText: `${full.slice(0, prefixLen)} ${argsTextMarker}`,
557
+ argsTextTruncated: true,
558
+ argsTextChars: full.length,
559
+ argsTextMarker,
560
+ };
561
+ }
562
+
563
+ function logShellDispatch(
564
+ event: string,
565
+ data: Record<string, unknown>,
566
+ argsTrace?: BoundedShellArgsText,
567
+ ): void {
568
+ debug.log(
569
+ 'shell.dispatch',
570
+ event,
571
+ argsTrace ? { ...data, ...argsTrace } : data,
572
+ { compact: { stringMax: SHELL_DISPATCH_ARGS_TEXT_LIMIT } },
573
+ );
520
574
  }
521
575
 
522
576
  // ── bg completion → turn notification queue (TUI-BG-SHELL) ───────────
@@ -588,8 +642,9 @@ export async function dispatchRunShell(
588
642
  const network = asNetwork(rawArgs.network);
589
643
  const mode = asMode(rawArgs.mode);
590
644
  const description = typeof rawArgs.description === 'string' ? rawArgs.description : undefined;
645
+ const argsTrace = boundedShellArgsText(rawArgs);
591
646
  if (command[0] === 'cd') {
592
- logShellDispatch('cd.rejected', { reason: 'argv-state-does-not-persist' });
647
+ logShellDispatch('cd.rejected', { reason: 'argv-state-does-not-persist' }, argsTrace);
593
648
  return rejectedCdResult();
594
649
  }
595
650
  const ledgerCliMatch = matchLedgerCli(command, opts.availableToolNames);
@@ -627,7 +682,7 @@ export async function dispatchRunShell(
627
682
  signal: opts.signal,
628
683
  deps,
629
684
  });
630
- logShellDispatch(`runner.${result.outcome}`, { cwd: effectiveCwd, cwdSource });
685
+ logShellDispatch(`runner.${result.outcome}`, { cwd: effectiveCwd, cwdSource }, argsTrace);
631
686
  return withLongSleepWarning(result, longSleep, bgAvailable, resumeHint);
632
687
  }
633
688
 
@@ -641,7 +696,7 @@ export async function dispatchRunShell(
641
696
  signal: opts.signal,
642
697
  });
643
698
 
644
- logShellDispatch(`legacy.${result.outcome}`, { cwd: effectiveCwd, cwdSource });
699
+ logShellDispatch(`legacy.${result.outcome}`, { cwd: effectiveCwd, cwdSource }, argsTrace);
645
700
  const summary = formatSummary(result);
646
701
  return withLongSleepWarning({
647
702
  output: summary,
@@ -18,7 +18,6 @@
18
18
  // overflowed.
19
19
 
20
20
  import type { LLMToolSpec } from '../../llm.js';
21
- import { getDashboardTerminalSessions } from '../../dashboard/terminal/session.js';
22
21
  import type { TerminalSessionRegistry } from '../../terminal/session-registry.js';
23
22
 
24
23
  const CHUNK_BYTES = 256;
@@ -92,7 +91,7 @@ export async function dispatchTerminalModalInject(
92
91
  rawArgs: Record<string, unknown>,
93
92
  deps: DispatchInjectDeps = {},
94
93
  ): Promise<{ output: string }> {
95
- const registry = deps.registry ?? getDashboardTerminalSessions();
94
+ const registry = deps.registry ?? (await import('../../dashboard/terminal/session.js')).getDashboardTerminalSessions();
96
95
  const id = String(rawArgs.id ?? '').trim();
97
96
  if (!id) throw new Error(`'id' is required`);
98
97
  const session = registry.get(id);