elanous 0.2.42 → 0.2.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (685) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → Om5xS9jpjSXJCeTNGYEi4}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{7a98bc80.fa935989e829f9c2.js → 0966f8a1.745fcd44f64a87ea.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{73d2eb0e.4966ad55293c801a.js → 0ad6802e.ae7afb63fdcb4491.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/114.2b90424d1a3ce84c.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1151-5c2bb8f002ca2dd6.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1200.6a37c202f9f17e9a.js +226 -0
  9. package/apps/pwa/out/_next/static/chunks/1261-a616d5728e02e624.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1313-19f737e0222c4444.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1357.3bbef3976c37f94a.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1362-20adddfaf662b0fa.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/{3507.97e1977bc4d5fb0a.js → 1406.a1dc2ab6f8449374.js} +2 -2
  14. package/apps/pwa/out/_next/static/chunks/1737-9491fc6ab29b9ec6.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1803-4f91a8e7dcaf042c.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/1961.a81b12872c3e93a9.js +23 -0
  17. package/apps/pwa/out/_next/static/chunks/{53c73f84.373b6160adfa89a4.js → 1970cf59.2d4d8ce5d6c81853.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/{9211-330b6736a63d4cb3.js → 2073-ba274e00e4f9efb4.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/{7411.9b4b8b747dc7b802.js → 2144.25b292396712196d.js} +2 -2
  21. package/apps/pwa/out/_next/static/chunks/2268-53861f339e0b65a2.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2312.0c8b61e22d3136d7.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/{6632.0eac1c554f8f2ef3.js → 2573.387a707f6f9d720c.js} +2 -2
  24. package/apps/pwa/out/_next/static/chunks/273.f156eee28f11af77.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2873.d2140e5a82546401.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/{1262.e804feb8fd1acb8c.js → 3072.01338851ca21a6f7.js} +2 -2
  27. package/apps/pwa/out/_next/static/chunks/3091.a5a4143dea33d197.js +90 -0
  28. package/apps/pwa/out/_next/static/chunks/{2456.b6de0e1c05f28843.js → 3095.dc44586a5f83b86d.js} +1 -1
  29. package/apps/pwa/out/_next/static/chunks/{3207.a756c95e9ec8c3c8.js → 3113.d7472bbc27d580c7.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/3228-9650b6447b6fa288.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/3402.44b565b314f2263c.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/3557ac4a.c8931684475018ad.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/{8505.fd803c6c33b54cc3.js → 360.ae9f9f4c33c395e8.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +286 -0
  35. package/apps/pwa/out/_next/static/chunks/{b450776b.3db34d8d965f82d3.js → 363bfab3.9623b9f89363541f.js} +1 -1
  36. package/apps/pwa/out/_next/static/chunks/3694.e0099884345f0198.js +64 -0
  37. package/apps/pwa/out/_next/static/chunks/3744.54f87db52acfd1ab.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3903.3ef4656c67572764.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3935.16701e33f8982dc9.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3955.6922286237f2ac2b.js +24 -0
  41. package/apps/pwa/out/_next/static/chunks/3969.272ee7f9fd6c62e5.js +34 -0
  42. package/apps/pwa/out/_next/static/chunks/{8138.6c10b2a356d52fca.js → 4199.ce86b281fd0a60b7.js} +1 -1
  43. package/apps/pwa/out/_next/static/chunks/4311-6dd3144002cc0c2d.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4426-2b230fad00c88930.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{2690.0521c738b7749931.js → 4445.7990c76b3751a918.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4447-14c5161fa59166c7.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4856-b0b8075bba8c53f4.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4870-de370d65e73c0bb5.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4885-2c989165c4b29fad.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/{1945.7b54990d578c119b.js → 4894.fec2ca9e99caefa2.js} +1 -1
  51. package/apps/pwa/out/_next/static/chunks/5093.8f04b7f8cb899a95.js +94 -0
  52. package/apps/pwa/out/_next/static/chunks/5122-2bb177cebf89e19a.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/5154.5f56dc3902e3d275.js +36 -0
  54. package/apps/pwa/out/_next/static/chunks/529.64ff7257180b2ac9.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5394.5dabeb0c62293a28.js +93 -0
  56. package/apps/pwa/out/_next/static/chunks/5461.08bf2404ff38ec85.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/5474-22e08a85583209b2.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/{9427.96aa912ddb5801e0.js → 5564.9e72532188f57586.js} +16 -16
  59. package/apps/pwa/out/_next/static/chunks/5567-265df39ed8fe9dcb.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5570-a94ae19811cb2046.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5574-b47c9ef2dceff1fd.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/{4043.6b91203436c9c86b.js → 5628.6ddb2d5ffba4ff4c.js} +4 -4
  63. package/apps/pwa/out/_next/static/chunks/{1319.b9b815ae0f181e06.js → 5730.43d7ccc09988e646.js} +1 -1
  64. package/apps/pwa/out/_next/static/chunks/{3482.a9ae9d2ad6a5bd97.js → 5789.2da35c258292e1e5.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/5824.da9527b15a3221e5.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5866.366966af47fdde5d.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/{1487.2f67b79444062da6.js → 5930.8b4df3b46c32b05a.js} +1 -1
  68. package/apps/pwa/out/_next/static/chunks/5963-c4d8469c52a0828b.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/6001.ec4049ceb3c43418.js +27 -0
  70. package/apps/pwa/out/_next/static/chunks/6120-471f03db1e299c0c.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6175-41479e643aca1878.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6291.a2de4f9787637075.js +104 -0
  73. package/apps/pwa/out/_next/static/chunks/6400-6699907c3537436a.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/6428.1f4327d6ae5fdf9a.js +287 -0
  75. package/apps/pwa/out/_next/static/chunks/644.02cb026fa44bcd0a.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6466-6c87d60d3dd174fb.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{3347.f846266b5e5f3ede.js → 6540.c7bef57ad8f90a87.js} +3 -3
  78. package/apps/pwa/out/_next/static/chunks/6773.d4264665ab31bec0.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6822.3c789f1a8443e774.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/{8262.ddc03e06b733f184.js → 6944.309f4e3ea54d1537.js} +1 -1
  81. package/apps/pwa/out/_next/static/chunks/7261-8ff69d3b2ee671fd.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7266.084c6bbc70035140.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/7271.5c0100e7320aa856.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7429-bf5731358c8f2f68.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7464.01f7a0ae1215fbe7.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7479.0fcad5f37eb64f0c.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/{4770.769c9cd9c7034eba.js → 7483.427a2fe2049e388d.js} +2 -2
  88. package/apps/pwa/out/_next/static/chunks/{1147-5196d19c222051b3.js → 7502-be74718178e13e56.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/7530.0889722b19572065.js +24 -0
  90. package/apps/pwa/out/_next/static/chunks/7645.5b2ee3ad45c55ea3.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7788.7d1c79f1a8e18946.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7900.096f455c7c1efc53.js +77 -0
  93. package/apps/pwa/out/_next/static/chunks/7910-6f139bcafd238b9f.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7966.f71c8958d1637548.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{8673-bab689a55f7e13b9.js → 8062-7cd0bcc7f01455ba.js} +3 -3
  96. package/apps/pwa/out/_next/static/chunks/8073.f6cf2f2c71aafbd0.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8201.190b94088980f430.js +74 -0
  98. package/apps/pwa/out/_next/static/chunks/8205.282ca4bb62d54a0a.js +62 -0
  99. package/apps/pwa/out/_next/static/chunks/8313-dfa1021bb58a46d6.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/837-81336ebaca8198a8.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8447.7963352ef5f71b76.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8574-868e8129525ef6d9.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8588.d1c6a2903727ce87.js +149 -0
  104. package/apps/pwa/out/_next/static/chunks/8637.90f92d5c8db4732c.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/868.6e953be05bcf6dca.js +41 -0
  106. package/apps/pwa/out/_next/static/chunks/8706-e1fe0309343a2273.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8749-06384cdfc4520add.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{9656-374232558fd528d0.js → 8861-cc1fa1c7b920fa8e.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/{5440-4236de26c5ea5856.js → 8967-7dfebf710c9dec9d.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/{1063.2fb8a9dc55c731f2.js → 8986.8e2e4efbfa655c59.js} +1 -1
  111. package/apps/pwa/out/_next/static/chunks/8997-3c564dbb3b58b055.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/{4320.583cbab64db6be02.js → 923.2034d10ae91e9c20.js} +1 -1
  113. package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/{1574.878c18ecc97b1bd4.js → 943.39ae5e82f4f1893f.js} +1 -1
  115. package/apps/pwa/out/_next/static/chunks/9469.0500480de55fb205.js +32 -0
  116. package/apps/pwa/out/_next/static/chunks/9770.5f75bc6088b16109.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9810-2543267050e58b82.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9870.8419702475254745.js +8 -0
  119. package/apps/pwa/out/_next/static/chunks/9941-376d1b74d51b01a4.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9958.385434ab04241758.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/aa57532f.510551854ff239b1.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-deea1450b17cb8dc.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-70985b904f8650ef.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a2e15e33e56a4353.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-fc72ce2db12d6ca9.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-be03e41f9436ebd9.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-35a35999382da3f2.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-3ff5b1e6ca88b848.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-a65101300a0ee5c1.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-3aca5b6d67dba511.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-45b8ab0a71e61314.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-53046e282d4cda8e.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-17809e60e8354c17.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-fd2442d347bf5898.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-e9d720d6fc082e21.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-6b8b4267bab0a677.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-deea1450b17cb8dc.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-8bcf6233ac7c17af.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-7cc25591cfc2126f.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-053e871f35c9beba.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-eff819f0c2d5e084.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-4d7e9d8db5274a87.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-2b2d8f5aa5f69ad4.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-0b8f92c5062e68b1.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1bd9d0fdac2ced3d.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/{page-0f291d3c8fd55a3a.js → page-9ee28f7df07428ea.js} +1 -1
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-44b7a1ff468c6648.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-cbc6523711dc1b65.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-fdad47899c2695be.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-79a8b5fee4c20871.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-03e8ac9606aeaffb.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-4cd55c55ec287e2f.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-db17b4305404161e.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-30041d848350fd02.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c540da022dbf86b0.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9399efc538da057f.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ca2d09128c585ca4.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-0e2635aecd343038.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ef7f4399b6b7726e.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-deea1450b17cb8dc.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-caf530535b875468.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-eaa20c1543a5fd8e.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c541eb1b75120f61.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-ab5e213eda9479f4.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-0a815f34367b6db6.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-e858ba0ed9393b68.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-1638ee9dd6e0582f.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-4cf5a399109391f2.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b4396321238798ec.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-cb72bfd21006781a.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6135d0242afbc434.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a1dccf907eddb856.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/c7945435-b44d4dbe90ba0dcb.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/{3d0154af.5331fec737ffe8c3.js → cb0f8df8.09a4a6be97e3fc5f.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/{e8543907.5b040a5f22a0b0e5.js → d96660fb.cbc21a2a88539dbb.js} +7 -7
  176. package/apps/pwa/out/_next/static/chunks/{50061469.0326382241ef3b2d.js → ea514caa.05a24f78d9dffe5f.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/fb7d20d5-6892502b6ee39ca6.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/framework-e8a911e19b1be41f.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-7022f418fabba021.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-e5f15df755756a1e.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-4525f91e36940c9b.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-140f0e519c085b0f.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-8f22ef63dcb865b1.js +1 -0
  184. package/apps/pwa/out/_next/static/css/d1f8bb401740a549.css +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/catalog/external-commands.yaml +5 -3
  279. package/catalog/meta/catalogVersion.yaml +2 -1
  280. package/catalog/signing/catalog-signing-public.pem +3 -0
  281. package/graphs/intake/intake-daily.yaml +16 -0
  282. package/graphs/intake/news-sources.yaml +1 -0
  283. package/graphs/intake/recipes.yaml +7 -0
  284. package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
  285. package/graphs/profiles/local.yaml +5 -0
  286. package/graphs/profiles/pod.yaml +4 -0
  287. package/package.json +6 -2
  288. package/plugins/demo-absorption-briefing/plugin.json +18 -0
  289. package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
  290. package/plugins/demo-browser-hand/plugin.json +13 -0
  291. package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
  292. package/plugins/demo-linear-secretary/plugin.json +15 -0
  293. package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
  294. package/plugins/demo-plugin-wizard/plugin.json +11 -0
  295. package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
  296. package/plugins/demo-research/plugin.json +16 -0
  297. package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
  298. package/plugins/demo-video-briefing/plugin.json +15 -0
  299. package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
  300. package/scripts/build-signed-catalog.ts +48 -0
  301. package/scripts/ci-typecheck-main-delta.sh +88 -0
  302. package/scripts/codex-fallback-live-probe.ts +1 -1
  303. package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
  304. package/scripts/demo/demo1104-stage.config.ts +21 -0
  305. package/scripts/demo/demo1104-stage.ts +316 -0
  306. package/scripts/goal-method-audit.ts +17 -1
  307. package/scripts/graph-units/land-enqueue.ts +90 -0
  308. package/scripts/hooks/codex-notify.sh +32 -0
  309. package/scripts/install.sh +10 -38
  310. package/scripts/landing-heal/land-plan.ts +57 -0
  311. package/scripts/release-loop/auto-approve-node.ts +1 -1
  312. package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
  313. package/scripts/release-loop/gate-method.ts +139 -0
  314. package/scripts/release-loop/gate-node.ts +180 -20
  315. package/scripts/release-loop/gate-traffic-mode.ts +151 -3
  316. package/scripts/release-loop/node-verdict.ts +38 -25
  317. package/scripts/release-loop/preflight.ts +362 -8
  318. package/scripts/release-loop/unattended-release.ts +20 -9
  319. package/scripts/rhythm/daily.ts +36 -4
  320. package/scripts/rhythm/linear-progress-sync.ts +298 -0
  321. package/scripts/video-pipeline.ts +9 -1
  322. package/scripts/warm-pool-provider-config.ts +29 -6
  323. package/src/acp/agent-manager.ts +1 -0
  324. package/src/acp/codex-app-server-agent.ts +33 -0
  325. package/src/acp/codex-app-server-client.ts +153 -16
  326. package/src/acp/core-turn-bridge.ts +17 -12
  327. package/src/acp/event-router.ts +20 -1
  328. package/src/acp/server.ts +6 -0
  329. package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
  330. package/src/agent-mission/claude-headless.ts +4 -1
  331. package/src/agent-mission/codex-exec.ts +105 -0
  332. package/src/agent-mission/driver.ts +192 -11
  333. package/src/agent-mission/grok-auth-status.ts +47 -0
  334. package/src/agent-mission/hand-hooks.ts +101 -0
  335. package/src/agent-mission/mission-cli.ts +56 -21
  336. package/src/agent-mission/mission-hand-reply.ts +118 -0
  337. package/src/agent-mission/mission-line.ts +180 -0
  338. package/src/agent-mission/mission-out.ts +256 -18
  339. package/src/agent-mission/tool-install.ts +122 -11
  340. package/src/agents/general-purpose.md +1 -1
  341. package/src/auto-research/research-turn.ts +95 -10
  342. package/src/autopilot/pr-manager.ts +31 -3
  343. package/src/boot/daemon-tools/self-implement.ts +3 -1
  344. package/src/boot/daemon-tools/web-search.ts +1 -2
  345. package/src/briefing/brief-items.ts +55 -11
  346. package/src/cli/agent-cli.ts +2 -1
  347. package/src/cli/catalog-cli.ts +31 -0
  348. package/src/cli/connector-cli.ts +16 -0
  349. package/src/cli/doctor-fix.ts +2 -2
  350. package/src/cli/intake-source-cli.ts +44 -8
  351. package/src/cli/msg-cli.ts +32 -3
  352. package/src/cli/pr-cli.ts +21 -1
  353. package/src/cli/pr-land-heavy-remote.ts +44 -6
  354. package/src/cli/pr-land-overlap-evidence.ts +13 -1
  355. package/src/cli/pr-land-pod-shadow-job.ts +143 -5
  356. package/src/cli/pr-land-pod-shadow.ts +9 -2
  357. package/src/cli/release-checklist-read-cli.ts +44 -16
  358. package/src/cli/release-cli.ts +23 -3
  359. package/src/cli/research-cli.ts +9 -0
  360. package/src/cli/setup-cli.ts +166 -6
  361. package/src/cli/setup-keys.ts +187 -0
  362. package/src/cli/task-plugin-wizard-host.ts +114 -0
  363. package/src/cli/tasks-cli.ts +54 -9
  364. package/src/cli/tui-test-cli.ts +186 -0
  365. package/src/config.ts +4 -2
  366. package/src/connectors/linear-daily-progress.ts +228 -0
  367. package/src/connectors/linear-projector.ts +34 -12
  368. package/src/connectors/linear.ts +151 -7
  369. package/src/core-turn/deep-turn-bloom.ts +67 -0
  370. package/src/core-turn/research-policy.ts +37 -0
  371. package/src/core-turn/run-core-turn.ts +320 -30
  372. package/src/core-turn/types.ts +2 -0
  373. package/src/dashboard/chat/acp-chat.ts +10 -0
  374. package/src/dashboard/classic-sidetab-mission-job.ts +103 -0
  375. package/src/dashboard/classic-sidetab-mission-pair.ts +81 -0
  376. package/src/dashboard/classic-sidetab-mission-trio.ts +219 -0
  377. package/src/dashboard/classic-sidetab-mission.ts +167 -5
  378. package/src/dashboard/index.ts +378 -13
  379. package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
  380. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +8 -0
  381. package/src/dashboard/mission-cli-consumer.ts +20 -8
  382. package/src/dashboard/plugin-wizard-runtime.ts +50 -0
  383. package/src/dashboard/plugin-wizard-tool.ts +55 -0
  384. package/src/dashboard/sidetab-runtime.ts +1 -1
  385. package/src/dashboard/terminal-popup-runtime.ts +6 -3
  386. package/src/decisions/linear-progress-summary.ts +78 -0
  387. package/src/decisions/linear-progress-sync.ts +152 -0
  388. package/src/domains/outbound-alert.ts +49 -11
  389. package/src/domains/telegram-kind-route.ts +16 -9
  390. package/src/graph-runner/arg-allowance.ts +13 -0
  391. package/src/graph-runner/graph-run-api.ts +3 -1
  392. package/src/graph-runner/runner.ts +85 -17
  393. package/src/graph-wizard/mission-compose.ts +407 -12
  394. package/src/harness/dispatch-backpressure.ts +54 -1
  395. package/src/harness/dispatch-shadow-compare.ts +74 -0
  396. package/src/harness/harness-cli-command.ts +11 -1
  397. package/src/harness/skill-exec.ts +21 -9
  398. package/src/harness/skill-select.ts +1 -1
  399. package/src/hooks/error-report-cloud.ts +101 -0
  400. package/src/hooks/receiver.ts +29 -2
  401. package/src/index.ts +127 -10
  402. package/src/intake-plane/actions.ts +354 -0
  403. package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
  404. package/src/intake-plane/intake-sources.ts +78 -8
  405. package/src/intake-plane/items.ts +14 -4
  406. package/src/intake-plane/linear-mission-sync.ts +80 -0
  407. package/src/intake-plane/linear-secretary-runtime.ts +178 -0
  408. package/src/intake-plane/linear-wish.ts +227 -1
  409. package/src/life/life-cli.ts +168 -0
  410. package/src/life/life-kinds.ts +160 -0
  411. package/src/live-supply/budget-consumer.ts +78 -0
  412. package/src/live-supply/read.ts +3 -0
  413. package/src/live-supply/snapshot.ts +45 -0
  414. package/src/llm/provider-credentials.ts +8 -2
  415. package/src/llm.ts +2 -1
  416. package/src/maturity/feature-maturity.ts +3 -3
  417. package/src/msg/msg-sse-server.ts +3 -3
  418. package/src/msg/msg-store.ts +177 -19
  419. package/src/native-tool-catalog.ts +36 -2
  420. package/src/nexus/api/http-server.ts +37 -1
  421. package/src/nexus/api/mcp-public-allowlist.ts +2 -0
  422. package/src/nexus/index.ts +7 -2
  423. package/src/nexus/outbound/format.ts +9 -0
  424. package/src/nexus/outbound/router.ts +98 -13
  425. package/src/nexus/setup-status.ts +9 -0
  426. package/src/nexus/state/state.ts +3 -0
  427. package/src/oauth/codex-account-store.ts +20 -7
  428. package/src/oauth/codex-owner-mirror.ts +44 -0
  429. package/src/oauth/codex.ts +17 -2
  430. package/src/oauth/fallback-chain.ts +47 -17
  431. package/src/onboarding/first-run-doctor.ts +8 -1
  432. package/src/onboarding/first-run.ts +85 -26
  433. package/src/onboarding/key-setup.ts +103 -0
  434. package/src/onboarding/menu-answer.ts +13 -0
  435. package/src/onboarding/secret-prompt.ts +37 -0
  436. package/src/plugins/install/plugin-install.ts +59 -0
  437. package/src/pr-tool/census.ts +130 -0
  438. package/src/pty-shell/pty-control-ipc.ts +4 -1
  439. package/src/registry/catalog-server.ts +232 -0
  440. package/src/registry/loader.ts +45 -1
  441. package/src/registry/types.ts +1 -2
  442. package/src/research/axis-fanout.ts +43 -28
  443. package/src/self-dev/ask-launch-flow.ts +72 -1
  444. package/src/self-dev/dev-cli.ts +4 -1
  445. package/src/self-dev/dev-pipeline.ts +5 -0
  446. package/src/self-dev/draft-residue.ts +64 -5
  447. package/src/self-dev/graph-front-nodes.ts +2 -1
  448. package/src/self-dev/graph-journey-route.ts +76 -21
  449. package/src/self-dev/launch-preflight.ts +58 -0
  450. package/src/self-dev/orchestrate.ts +1 -1
  451. package/src/self-dev/shard-aggregate.ts +4 -0
  452. package/src/self-dev/shard-run.ts +36 -15
  453. package/src/self-implement/abandoned-classification.ts +12 -3
  454. package/src/self-implement/budget-gate.ts +7 -0
  455. package/src/self-implement/child-llm-preference.ts +10 -1
  456. package/src/self-implement/doctor-visit.ts +30 -8
  457. package/src/self-implement/elanous-tui-spawn.ts +3 -0
  458. package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
  459. package/src/self-implement/gate-artifacts.ts +2 -1
  460. package/src/self-implement/goal-author-cli.ts +4 -2
  461. package/src/self-implement/goal-author.ts +358 -4
  462. package/src/self-implement/graph-overlay-yaml.ts +30 -4
  463. package/src/self-implement/graph-overlay.ts +3 -1
  464. package/src/self-implement/graph-profile-yaml.ts +107 -0
  465. package/src/self-implement/graph-yaml.ts +26 -3
  466. package/src/self-implement/off-diff-evidence.ts +249 -5
  467. package/src/self-implement/orchestrator.ts +240 -15
  468. package/src/self-implement/run-chart.ts +6 -3
  469. package/src/self-implement/run-ledger.ts +51 -1
  470. package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
  471. package/src/self-implement/tdd-evidence-tags.ts +9 -0
  472. package/src/self-implement/train-gate-receipt.ts +166 -0
  473. package/src/self-implement/train-gate-remote.ts +62 -18
  474. package/src/session/chat.ts +4 -2
  475. package/src/session/session-fanout.ts +2 -0
  476. package/src/session/streaming/acp-stream-sink.ts +2 -1
  477. package/src/session/streaming/chunk-producer.ts +6 -0
  478. package/src/session/streaming/stream-compositor.ts +3 -2
  479. package/src/session-runtime/index.ts +37 -1
  480. package/src/session-runtime/retry-policy.ts +1 -1
  481. package/src/setup/llm-env-detect.ts +3 -0
  482. package/src/setup/service-key-catalog.ts +46 -0
  483. package/src/setup/service-keys.ts +241 -0
  484. package/src/sidetab-core/visible-agent-mission.ts +98 -22
  485. package/src/skills/tools/agent.ts +23 -4
  486. package/src/skills/tools/omni-search.ts +123 -25
  487. package/src/task-agent/parent-host.ts +10 -0
  488. package/src/task-agent/repair-outcomes.ts +65 -0
  489. package/src/task-agent/task-hand.ts +20 -7
  490. package/src/task-orchestrator/dispatcher.ts +14 -1
  491. package/src/task-orchestrator/linear-capture-events.ts +55 -0
  492. package/src/task-orchestrator/store.ts +16 -5
  493. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +4 -0
  494. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +92 -1
  495. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
  496. package/src/task-orchestrator/surfaces/pod-source-receive.ts +23 -11
  497. package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
  498. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +35 -9
  499. package/src/task-orchestrator/surfaces/self-implement-pod.ts +172 -6
  500. package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
  501. package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
  502. package/src/task-orchestrator/types.ts +14 -0
  503. package/src/telegram.ts +14 -16
  504. package/src/terminal/coding-agent.ts +14 -5
  505. package/src/terminal/session-registry.ts +1 -1
  506. package/src/tool-hints/gate.ts +1 -0
  507. package/src/tool-runtime/agent-runtime.ts +1 -0
  508. package/src/tool-runtime/browser-hand-runtime.ts +381 -0
  509. package/src/tool-runtime/browser-runtime.ts +2 -1
  510. package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
  511. package/src/tool-runtime/elanous-linear-secretary-runtime.ts +57 -0
  512. package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
  513. package/src/tool-runtime/index.ts +6 -0
  514. package/src/tool-runtime/types.ts +3 -0
  515. package/src/tui/entry.ts +24 -1
  516. package/src/tui/sidetab/attach.ts +140 -11
  517. package/src/tui/sidetab/herdr-portal.ts +225 -0
  518. package/src/user-config.ts +34 -9
  519. package/src/user-intent/types.ts +4 -3
  520. package/src/ux-sim/browser-hand.ts +165 -0
  521. package/src/ux-sim/draft-inventory-builder.ts +198 -0
  522. package/src/ux-sim/fake-browser-page.ts +81 -0
  523. package/src/ux-sim/fake-linear-device.ts +31 -0
  524. package/src/ux-sim/graph-engine-sim.ts +47 -0
  525. package/src/ux-sim/linear-secretary.ts +216 -0
  526. package/src/ux-sim/mock-scenario-catalog.json +75 -23
  527. package/src/ux-sim/mock-scenario-catalog.ts +120 -2
  528. package/src/ux-sim/onboarding-first-run-device.ts +31 -21
  529. package/src/ux-sim/scenario.ts +70 -26
  530. package/src/ux-sim/service-key-setup.ts +50 -0
  531. package/src/ux-sim/term-slash-device.ts +74 -0
  532. package/src/ux-sim/turn-throw-sim.ts +31 -0
  533. package/src/version/packed-revision.json +1 -1
  534. package/src/web-search/exa.ts +77 -0
  535. package/src/web-search/index.ts +30 -9
  536. package/src/web-search/provider.ts +4 -1
  537. package/src/web-search/x-intent.ts +5 -0
  538. package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +0 -36
  540. package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +0 -32
  543. package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +0 -286
  548. package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +0 -23
  549. package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +0 -34
  552. package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/2974.595d1e29d040cb6a.js +0 -64
  557. package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +0 -93
  558. package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +0 -41
  559. package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +0 -24
  561. package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +0 -77
  567. package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +0 -74
  572. package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +0 -149
  573. package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +0 -27
  575. package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +0 -287
  583. package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +0 -226
  586. package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +0 -90
  587. package/apps/pwa/out/_next/static/chunks/6377.bc7df239edbff244.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +0 -104
  594. package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +0 -94
  595. package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +0 -24
  602. package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +0 -8
  610. package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/8546-6f03f8ea34dd61d9.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/9249.976f1e69a9d80754.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/9415.69e4a21c60c7d2db.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +0 -62
  626. package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +0 -1
  684. package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
  685. /package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → Om5xS9jpjSXJCeTNGYEi4}/_ssgManifest.js +0 -0
@@ -0,0 +1,240 @@
1
+ // External graph control uses the same wizard, editor run API, and runner as the local UI.
2
+ // The MCP HTTP boundary filters mutating tools by token scope before dispatch.
3
+ import { readFileSync } from 'node:fs';
4
+ import { join } from 'node:path';
5
+ import type { LLMToolSpec } from '../llm.js';
6
+ import { debug } from '../debug/log.js';
7
+ import { effectiveInstanceRoot } from '../instance/resolve.js';
8
+ import { generateGraphFromPrompt } from '../graph-wizard/generate.js';
9
+ import { handleGraphsCreate } from '../nexus/api/graphs-api.js';
10
+ import { handleGraphRunGet, handleGraphRunStart } from '../graph-runner/graph-run-api.js';
11
+ import { proposeGrowth } from '../graph-runner/graph-grow.js';
12
+ import { runGraph, type GraphRunState } from '../graph-runner/runner.js';
13
+ import { parseGraphTemplateYaml } from '../self-implement/graph-yaml.js';
14
+ import type { ToolRuntime, ToolRuntimeContext } from './types.js';
15
+
16
+ const GRAPH_ID = /^[a-z0-9-]+$/;
17
+ const RUN_ID = /^ed-[a-z0-9]+-[a-f0-9]{6}$/;
18
+ type Args = Record<string, unknown>;
19
+ type Result = { output: string; [key: string]: unknown };
20
+ export interface GraphMcpDeps {
21
+ root?: string;
22
+ mineDir?: string;
23
+ recipesFile?: string;
24
+ generate?: typeof generateGraphFromPrompt;
25
+ growth?: typeof proposeGrowth;
26
+ run?: typeof runGraph;
27
+ }
28
+ let testDeps: GraphMcpDeps = {};
29
+ export function setGraphMcpDepsForTest(deps: GraphMcpDeps | undefined): void { testDeps = deps ?? {}; }
30
+ const rootOf = () => testDeps.root ?? effectiveInstanceRoot();
31
+
32
+ function value(args: Args, key: string): string | null {
33
+ const item = args[key];
34
+ return typeof item === 'string' && item.trim() ? item.trim() : null;
35
+ }
36
+
37
+ function error(tool: string, reason: string): Result {
38
+ return { output: `${tool}: ${reason}`, error: reason };
39
+ }
40
+
41
+ function observe(tool: string, action: string, ctx: ToolRuntimeContext, fields: Record<string, unknown>): void {
42
+ debug.log('mcp.graph', action, { tool, caller: ctx.mcpClient ?? 'unknown', ...fields });
43
+ }
44
+
45
+ function spec(name: string, description: string, properties: Record<string, unknown>, required: string[]): LLMToolSpec {
46
+ return { name, description, parameters: { type: 'object', properties, required } };
47
+ }
48
+
49
+ const composeSpec = spec('graph_compose', 'Preview a validated graph from one research goal. Does not save or run it.',
50
+ { goal: { type: 'string' } }, ['goal']);
51
+ const startSpec = spec('graph_run_start', 'Start an existing saved graph, or save and start a graph_compose result. Requires a write-scoped MCP token.',
52
+ { graphId: { type: 'string' }, compose: { type: 'object', description: 'graph_compose result: id, yaml, optional validated steps.' },
53
+ reason: { type: 'string' } }, ['reason']);
54
+ const statusSpec = spec('graph_run_status', 'Read bounded node states, outputs, and source IDs for a graph run.',
55
+ { graphId: { type: 'string' }, runId: { type: 'string' } }, ['graphId', 'runId']);
56
+ const nodeSpec = spec('graph_node_op', 'Operate on a saved run: retry from a failed node, or add a validated growth node as a new linked run. Requires a write-scoped MCP token.',
57
+ { graphId: { type: 'string' }, runId: { type: 'string' }, op: { type: 'string', enum: ['retry', 'add-node'] },
58
+ nodeId: { type: 'string' }, outcome: { type: 'string' }, reason: { type: 'string' } },
59
+ ['graphId', 'runId', 'op', 'nodeId', 'reason']);
60
+
61
+ function storedRun(graphId: string, runId: string, root: string): GraphRunState | null {
62
+ if (!GRAPH_ID.test(graphId) || !RUN_ID.test(runId)) return null;
63
+ try {
64
+ const state = JSON.parse(readFileSync(join(root, 'graph-runs', graphId, `${runId}.json`), 'utf8')) as GraphRunState;
65
+ return state.graphId === graphId && state.runId === runId ? state : null;
66
+ } catch { return null; }
67
+ }
68
+
69
+ async function compose(args: Args, ctx: ToolRuntimeContext): Promise<Result> {
70
+ const goal = value(args, 'goal');
71
+ if (!goal) return error('graph_compose', 'goal is required');
72
+ try {
73
+ const result = await (testDeps.generate ?? generateGraphFromPrompt)({ prompt: goal, kind: 'harness' });
74
+ observe('graph_compose', result.ok ? 'composed' : 'rejected', ctx, { graphId: result.id, reason: result.summary });
75
+ return { output: result.summary, ...result, compose: result.ok
76
+ ? { id: result.id, yaml: result.yaml, ...(result.steps ? { steps: result.steps } : {}) } : null };
77
+ } catch (cause) {
78
+ const reason = cause instanceof Error ? cause.message : String(cause);
79
+ observe('graph_compose', 'failed', ctx, { reason });
80
+ return error('graph_compose', reason);
81
+ }
82
+ }
83
+
84
+ async function start(args: Args, ctx: ToolRuntimeContext): Promise<Result> {
85
+ const reason = value(args, 'reason');
86
+ const supplied = args.compose;
87
+ const candidate = supplied && typeof supplied === 'object' && !Array.isArray(supplied)
88
+ ? supplied as Record<string, unknown> : null;
89
+ const graphId = candidate ? value(candidate, 'id') : value(args, 'graphId');
90
+ if (!reason || !graphId || !GRAPH_ID.test(graphId)) return error('graph_run_start', 'valid graphId and reason are required');
91
+ if (candidate) {
92
+ if (typeof candidate.yaml !== 'string') return error('graph_run_start', 'compose.yaml is required');
93
+ const created = await handleGraphsCreate(new Request('http://localhost/v1/graphs', {
94
+ method: 'POST', headers: { 'content-type': 'application/json' },
95
+ body: JSON.stringify({ id: graphId, yaml: candidate.yaml, ...(candidate.steps ? { steps: candidate.steps } : {}) }),
96
+ }), { ...(testDeps.mineDir ? { mineDir: testDeps.mineDir } : {}) });
97
+ if (!created.ok) {
98
+ const detail = await created.text();
99
+ observe('graph_run_start', 'refused', ctx, { graphId, reason, status: created.status });
100
+ return error('graph_run_start', `save refused (${created.status}): ${detail.slice(0, 300)}`);
101
+ }
102
+ }
103
+ const response = handleGraphRunStart(graphId, {
104
+ ...(testDeps.mineDir ? { mineDir: testDeps.mineDir } : {}),
105
+ root: rootOf(),
106
+ ...(testDeps.recipesFile ? { recipesFile: testDeps.recipesFile } : {}),
107
+ });
108
+ const body = await response.json() as Record<string, unknown>;
109
+ observe('graph_run_start', response.ok ? 'started' : 'refused', ctx,
110
+ { graphId, runId: body.runId ?? null, reason, status: response.status });
111
+ return { output: response.ok ? `Started ${graphId} run ${body.runId}` : `Start refused: ${JSON.stringify(body)}`,
112
+ ...body, status: response.status };
113
+ }
114
+
115
+ async function status(args: Args, ctx: ToolRuntimeContext): Promise<Result> {
116
+ const graphId = value(args, 'graphId');
117
+ const runId = value(args, 'runId');
118
+ if (!graphId || !runId || !GRAPH_ID.test(graphId) || !RUN_ID.test(runId)) return error('graph_run_status', 'invalid graphId or runId');
119
+ const response = handleGraphRunGet(graphId, runId, { root: rootOf() });
120
+ const body = await response.json() as Record<string, unknown>;
121
+ if (!response.ok) {
122
+ const reason = typeof body.reason === 'string' ? body.reason
123
+ : typeof body.error === 'string' ? body.error : `request failed (${response.status})`;
124
+ observe('graph_run_status', 'refused', ctx, { graphId, runId, status: response.status, error: reason });
125
+ return error('graph_run_status', reason);
126
+ }
127
+ const state = storedRun(graphId, runId, rootOf());
128
+ let truncated = false;
129
+ const clip = (text: string, max: number) => {
130
+ if (text.length > max) truncated = true;
131
+ return text.slice(0, max);
132
+ };
133
+ const allNodes = state?.nodes.map(node => {
134
+ const record = node.output && typeof node.output === 'object' && !Array.isArray(node.output)
135
+ ? node.output as Record<string, unknown> : null;
136
+ const sourceIds = [record?.sourceIds, record?.refs, record?.citations]
137
+ .flatMap(item => Array.isArray(item) ? item.filter((id): id is string => typeof id === 'string') : [])
138
+ .slice(0, 30);
139
+ const encodedOutput = node.output === undefined ? undefined : JSON.stringify(node.output);
140
+ if (sourceIds.length > 10) truncated = true;
141
+ return { nodeId: clip(node.nodeId, 160), ok: node.ok, exit: node.exit, executed: node.executed,
142
+ ...(node.error ? { error: clip(node.error, 300) } : {}),
143
+ sourceIds: sourceIds.slice(0, 10).map(id => clip(id, 120)),
144
+ ...(encodedOutput === undefined ? {} : { output: clip(encodedOutput, 800) }) };
145
+ }) ?? [];
146
+ const rawPath = Array.isArray(body.path) ? body.path : [];
147
+ const errorText = typeof body.error === 'string' ? body.error : undefined;
148
+ let nodes = [...allNodes].sort((a, b) => Number(b.ok === false) - Number(a.ok === false)).slice(0, 30);
149
+ let path = rawPath.slice(0, 100).map(nodeId => clip(String(nodeId), 160));
150
+ if (allNodes.length > nodes.length || rawPath.length > path.length) truncated = true;
151
+ const statusValue = clip(String(body.status ?? 'unknown'), 40);
152
+ const graphIdValue = clip(graphId, 120);
153
+ const runIdValue = clip(runId, 120);
154
+ const startedAt = typeof body.startedAt === 'string' ? clip(body.startedAt, 100) : undefined;
155
+ const finishedAt = typeof body.finishedAt === 'string' ? clip(body.finishedAt, 100) : undefined;
156
+ const boundedError = errorText ? clip(errorText, 1000) : undefined;
157
+ const serialize = () => JSON.stringify({
158
+ graphId: graphIdValue, runId: runIdValue, status: statusValue,
159
+ ...(startedAt ? { startedAt } : {}), ...(finishedAt ? { finishedAt } : {}),
160
+ ...(boundedError ? { error: boundedError } : {}), path, nodes, truncated,
161
+ });
162
+ let encoded = serialize();
163
+ while (Buffer.byteLength(encoded, 'utf8') > 24000 && nodes.length > 0) {
164
+ nodes = nodes.slice(0, -1);
165
+ truncated = true;
166
+ encoded = serialize();
167
+ }
168
+ while (Buffer.byteLength(encoded, 'utf8') > 24000 && path.length > 0) {
169
+ path = path.slice(0, -1);
170
+ truncated = true;
171
+ encoded = serialize();
172
+ }
173
+ if (Buffer.byteLength(encoded, 'utf8') > 24000) {
174
+ truncated = true;
175
+ path = [];
176
+ nodes = [];
177
+ encoded = serialize();
178
+ }
179
+ observe('graph_run_status', 'read', ctx, { graphId, runId, status: body.status ?? response.status });
180
+ return { output: encoded, ...JSON.parse(encoded) as Record<string, unknown> };
181
+ }
182
+
183
+ async function nodeOp(args: Args, ctx: ToolRuntimeContext): Promise<Result> {
184
+ const graphId = value(args, 'graphId');
185
+ const runId = value(args, 'runId');
186
+ const op = value(args, 'op');
187
+ const nodeId = value(args, 'nodeId');
188
+ const reason = value(args, 'reason');
189
+ if (!graphId || !runId || !GRAPH_ID.test(graphId) || !RUN_ID.test(runId) || !nodeId || !reason
190
+ || !['retry', 'add-node'].includes(op ?? '')) return error('graph_node_op', 'invalid graphId, runId, op, nodeId, or reason');
191
+ if (op === 'add-node' && !value(args, 'outcome'))
192
+ return error('graph_node_op', 'add-node requires the observed node outcome');
193
+ const root = rootOf();
194
+ const state = storedRun(graphId, runId, root);
195
+ if (!state || state.status !== 'failed' || !state.path.includes(nodeId))
196
+ return error('graph_node_op', 'a failed run and node on its saved path are required');
197
+ const graphFile = join(root, 'graph-run-work', graphId, runId, 'graph.yaml');
198
+ if (op === 'retry') {
199
+ try {
200
+ // Runner enforces the saved source hash, approval boundary, and failed-path limit.
201
+ const next = await (testDeps.run ?? runGraph)(graphFile, { resumeRunId: runId, fromNodeId: nodeId, deps: { root } });
202
+ observe('graph_node_op', op, ctx, { graphId, runId, nodeId, reason, status: next.status });
203
+ return { output: `${op}: ${next.status}`, graphId, runId, status: next.status, path: next.path };
204
+ } catch (cause) {
205
+ const message = cause instanceof Error ? cause.message : String(cause);
206
+ observe('graph_node_op', 'refused', ctx, { graphId, runId, nodeId, op, reason, error: message });
207
+ return error('graph_node_op', message);
208
+ }
209
+ }
210
+ try {
211
+ const parsed = parseGraphTemplateYaml(readFileSync(graphFile, 'utf8'), graphFile);
212
+ if (!parsed.template || parsed.errors.length) return error('graph_node_op', 'saved graph is invalid');
213
+ const nodeOutput = [...state.nodes].reverse().find(node => node.nodeId === nodeId)?.output;
214
+ const outcome = value(args, 'outcome')!;
215
+ const growth = await (testDeps.growth ?? proposeGrowth)({ graph: parsed.template, nodeId, outcome, runId, output: nodeOutput },
216
+ undefined, () => 'unknown', { root });
217
+ if (!growth.ok) {
218
+ observe('graph_node_op', 'refused', ctx, { graphId, runId, nodeId, op, reason, detail: growth.reason });
219
+ return error('graph_node_op', growth.reason);
220
+ }
221
+ const returnTo = growth.growth.edges.find(edge => edge.from === growth.growth.node.nodeId)?.to;
222
+ if (!returnTo) return error('graph_node_op', 'growth has no return node');
223
+ const next = await (testDeps.run ?? runGraph)(graphFile, { variant: { goal: `mcp_${runId}`,
224
+ plan: { growth: { node: growth.growth.node, from: nodeId, outcome,
225
+ returnTo } } }, input: { source: 'mcp', parentRunId: runId, reason }, deps: { root } });
226
+ observe('graph_node_op', 'add-node', ctx, { graphId, runId: next.runId, parentRunId: runId, nodeId, reason, status: next.status });
227
+ return { output: `add-node: ${next.status}`, graphId, runId: next.runId, parentRunId: runId, status: next.status };
228
+ } catch (cause) {
229
+ const message = cause instanceof Error ? cause.message : String(cause);
230
+ observe('graph_node_op', 'refused', ctx, { graphId, runId, nodeId, op, reason, error: message });
231
+ return error('graph_node_op', message);
232
+ }
233
+ }
234
+
235
+ export const GRAPH_MCP_RUNTIMES: ToolRuntime<Args, Result>[] = [
236
+ { id: 'graph_compose', spec: composeSpec, surfaces: ['mcp'], run: compose },
237
+ { id: 'graph_run_start', spec: startSpec, surfaces: ['mcp'], run: start },
238
+ { id: 'graph_run_status', spec: statusSpec, surfaces: ['mcp'], run: status },
239
+ { id: 'graph_node_op', spec: nodeSpec, surfaces: ['mcp'], run: nodeOp },
240
+ ];
@@ -62,11 +62,14 @@ import { skillExecRuntime } from './skill-exec-runtime.js';
62
62
  import { elanousObsidianSearchRuntime } from './elanous-obsidian-search-runtime.js';
63
63
  import { elanousObsidianInfoRuntime } from './elanous-obsidian-info-runtime.js';
64
64
  import { ELANOUS_ASANA_RUNTIMES } from './elanous-asana-runtimes.js';
65
+ import { elanousLinearSecretaryRuntime } from './elanous-linear-secretary-runtime.js';
66
+ import { elanousLinearIssueRuntime } from './elanous-linear-issue-runtime.js';
65
67
  import { elanousFsListRuntime } from './elanous-fs-list-runtime.js';
66
68
  import { elanousFsReadRuntime } from './elanous-fs-read-runtime.js';
67
69
  import { elanousShowroomBroadcastRuntime } from './elanous-showroom-broadcast-runtime.js';
68
70
  import { elanousAutopilotLaunchRuntime } from './elanous-autopilot-launch-runtime.js';
69
71
  import { elanousTaskSubmitRuntime } from './elanous-task-submit-runtime.js';
72
+ import { GRAPH_MCP_RUNTIMES } from './graph-mcp-runtimes.js';
70
73
  import { persistentGroundingRuntime } from './persistent-grounding-runtime.js';
71
74
  import { goalAuthorRuntime } from './goal-author-runtime.js';
72
75
  import { bootstrapMcpProxyRuntimes } from './mcp-proxy-bootstrap.js';
@@ -167,11 +170,14 @@ export function registerAllDefaultToolRuntimes(opts: RegisterAllDefaultToolRunti
167
170
  registerToolRuntime(elanousObsidianSearchRuntime);
168
171
  registerToolRuntime(elanousObsidianInfoRuntime);
169
172
  for (const rt of ELANOUS_ASANA_RUNTIMES) registerToolRuntime(rt);
173
+ registerToolRuntime(elanousLinearSecretaryRuntime);
174
+ registerToolRuntime(elanousLinearIssueRuntime);
170
175
  registerToolRuntime(elanousFsListRuntime);
171
176
  registerToolRuntime(elanousFsReadRuntime);
172
177
  registerToolRuntime(elanousShowroomBroadcastRuntime);
173
178
  registerToolRuntime(elanousAutopilotLaunchRuntime);
174
179
  registerToolRuntime(elanousTaskSubmitRuntime);
180
+ for (const rt of GRAPH_MCP_RUNTIMES) registerToolRuntime(rt);
175
181
  for (const rt of SELF_COGNITION_RUNTIMES) registerToolRuntime(rt);
176
182
  for (const rt of ELANOUS_CONTROL_RUNTIMES) registerToolRuntime(rt);
177
183
  // External MCP proxies already declare surfaces `['mcp','tui']`, but the
@@ -66,6 +66,9 @@ export interface ToolRuntimeContext {
66
66
  dispatch: (name: string, args: Record<string, unknown>) => Promise<unknown>;
67
67
  workingDirectory: string;
68
68
  };
69
+ /** TUI-only opt-in for inheriting the parent's policy-filtered catalog when
70
+ * the general-purpose agent definition omits its own tool allowlist. */
71
+ inheritGeneralPurposeToolCatalog?: boolean;
69
72
  /** M5 (PLAN-rich-dev-feedback-multi-surface · 2026-05-13) —
70
73
  * optional progress emitter. Runtimes that produce streaming
71
74
  * side effects (bash stdout tail, search hit streaming, edit
package/src/tui/entry.ts CHANGED
@@ -99,6 +99,9 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
99
99
  let sidetabChordTimer: ReturnType<typeof setTimeout> | null = null;
100
100
  let sidetabRemoteFrame: string | null = null;
101
101
  let sidetabRows: import('./sidetab/list.js').SidetabRow[] = [];
102
+ let herdrSidetabRows: import('./sidetab/list.js').SidetabRow[] = [];
103
+ let herdrSidetabRefreshPending = false;
104
+ let herdrSidetabPortal: import('./sidetab/herdr-portal.js').HerdrSidetabPortal | null = null;
102
105
  let sidetabApi: typeof import('./sidetab/list.js') | null = null;
103
106
  // ⚠️ `as` 단언은 «null 로 좁혀지는» 흐름 분석을 푸는 것 — 값은 클로저(ensureSidetabAttachments) 안에서만 바뀐다.
104
107
  let sidetabAttachments: import('./sidetab/attach.js').SidetabAttachmentController | null = null as import('./sidetab/attach.js').SidetabAttachmentController | null;
@@ -357,6 +360,8 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
357
360
 
358
361
  const ensureSidetabAttachments = async (): Promise<void> => {
359
362
  if (sidetabAttachments) return;
363
+ const herdrPortalModule = await import('./sidetab/herdr-portal.js');
364
+ herdrSidetabPortal ??= herdrPortalModule.createHerdrSidetabPortal();
360
365
  const installer = await import('../agent-mission/tool-install.js') as unknown as {
361
366
  detectAgentCli?: (agent: 'codex' | 'claude') => Promise<{
362
367
  agent: 'codex' | 'claude'; installed: boolean; version: string | null;
@@ -364,6 +369,8 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
364
369
  }>;
365
370
  };
366
371
  sidetabAttachments = (await import('./sidetab/attach.js')).createSidetabAttachmentController({
372
+ herdrPortal: herdrSidetabPortal,
373
+ logEvent: (category, event, data) => debug.log(category, event, data),
367
374
  drawBase: () => {
368
375
  paintingCoordinatorFrame = true;
369
376
  try { render(); } finally { paintingCoordinatorFrame = false; }
@@ -403,9 +410,11 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
403
410
  sidetabSelected = next.selected;
404
411
  sidetabMode = 'list';
405
412
  if (sidetabOpen && sidetabRefreshTimer === null) {
413
+ void refreshHerdrSidetabRows();
406
414
  sidetabRefreshTimer = setInterval(() => {
407
415
  if (!sidetabOpen || !sidetabApi) return;
408
416
  refreshSidetabRows();
417
+ void refreshHerdrSidetabRows();
409
418
  render();
410
419
  }, 1000);
411
420
  } else if (!sidetabOpen && sidetabRefreshTimer !== null) {
@@ -417,12 +426,24 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
417
426
  const refreshSidetabRows = (): void => {
418
427
  if (!sidetabApi) return;
419
428
  const selectedId = sidetabRows[sidetabSelected]?.id;
420
- sidetabRows = sidetabApi.loadSidetabRows(sidetabAll);
429
+ sidetabRows = [...sidetabApi.loadSidetabRows(sidetabAll), ...herdrSidetabRows];
421
430
  const preservedIndex = selectedId ? sidetabRows.findIndex((row) => row.id === selectedId) : -1;
422
431
  sidetabSelected = preservedIndex >= 0
423
432
  ? preservedIndex
424
433
  : Math.min(sidetabSelected, Math.max(0, sidetabRows.length - 1));
425
434
  };
435
+ const refreshHerdrSidetabRows = async (): Promise<void> => {
436
+ if (herdrSidetabRefreshPending) return;
437
+ herdrSidetabRefreshPending = true;
438
+ try {
439
+ const portal = await import('./sidetab/herdr-portal.js');
440
+ herdrSidetabPortal ??= portal.createHerdrSidetabPortal();
441
+ await herdrSidetabPortal.refreshRows();
442
+ herdrSidetabRows = [...herdrSidetabPortal.rows()];
443
+ refreshSidetabRows();
444
+ } catch { /* Herdr is optional; TUI rows remain available. */ }
445
+ finally { herdrSidetabRefreshPending = false; }
446
+ };
426
447
  const switchSidetabSession = async (requestedSessionId?: string): Promise<void> => {
427
448
  const selected = sidetabRows[sidetabSelected];
428
449
  const targetId = requestedSessionId ?? (selected?.kind === 'tui' ? selected.sessionId : undefined);
@@ -667,9 +688,11 @@ export async function showNextTui(options: NextTuiOptions = {}): Promise<void> {
667
688
  if (sidetabOpen) {
668
689
  sidetabApi = await import('./sidetab/list.js');
669
690
  sidetabRows = sidetabApi.loadSidetabRows(sidetabAll);
691
+ void refreshHerdrSidetabRows();
670
692
  sidetabRefreshTimer = setInterval(() => {
671
693
  if (!sidetabApi || !sidetabOpen) return;
672
694
  refreshSidetabRows();
695
+ void refreshHerdrSidetabRows();
673
696
  render();
674
697
  }, 1_000);
675
698
  }
@@ -7,9 +7,10 @@ import { createTerminalModalRouter } from '../../terminal/terminal-modal-router.
7
7
  import { getSessionCwd } from '../../session/working-dir.js';
8
8
  import { TerminalSessionRegistry, type TerminalSession } from '../../terminal/session-registry.js';
9
9
  import { requestRemotePtyControl } from '../../pty-shell/pty-control-ipc.js';
10
- import { runVisibleAgentMission } from '../../sidetab-core/visible-agent-mission.js';
10
+ import { runVisibleAgentMission, type VisibleMissionPty, type VisibleMissionResult } from '../../sidetab-core/visible-agent-mission.js';
11
11
  import type { Key } from '../../tui.js';
12
12
  import type { SidetabRow } from './list.js';
13
+ import { createHerdrSidetabPortal, herdrPaneIdFromSidetabRow, type HerdrSidetabPortal } from './herdr-portal.js';
13
14
 
14
15
  export type SidetabCharacter = 'shell' | 'elanous' | 'codex' | 'claude';
15
16
 
@@ -35,13 +36,35 @@ export interface AgentCliDetection {
35
36
  message: string;
36
37
  }
37
38
 
39
+ export function sidetabMissionFailureLog(agent: 'codex' | 'claude', result: VisibleMissionResult): {
40
+ event: 'startup-screen-failed' | 'mission-failed';
41
+ data: Record<string, unknown>;
42
+ } | undefined {
43
+ if (result.ok) return undefined;
44
+ const startupBlocked = !result.promptReady;
45
+ return {
46
+ event: startupBlocked ? 'startup-screen-failed' : 'mission-failed',
47
+ data: {
48
+ agent,
49
+ screen: startupBlocked ? result.startupScreen ?? 'unclassified' : 'none',
50
+ error: result.startupScreen && startupBlocked ? 'known-startup-screen-blocked' : startupBlocked ? 'startup-unclassified' : 'mission-or-result-failed',
51
+ },
52
+ };
53
+ }
54
+
38
55
  export function createSidetabAttachmentController(deps: {
39
56
  drawBase(): void;
40
57
  termSize(): { cols: number; rows: number };
41
58
  setStatus(message: string): void;
42
59
  drawRemoteFrame(frame: string): void;
60
+ logEvent?(category: string, event: string, data: Record<string, unknown>): void;
61
+ herdrPortal?: HerdrSidetabPortal;
43
62
  /** Owned by OPT; a missing detector keeps the hook inert until its API lands. */
44
63
  detectAgentCli?(agent: 'codex' | 'claude'): Promise<AgentCliDetection>;
64
+ /** Test seam for exercising the visible mission path without launching an external CLI. */
65
+ createVisibleMissionPty?(agent: 'codex' | 'claude'): { pty: VisibleMissionPty; cwd: string };
66
+ /** Runner seam keeps the controller path testable with short deterministic mission timeouts. */
67
+ visibleMissionRunner?: typeof runVisibleAgentMission;
45
68
  }): SidetabAttachmentController {
46
69
  const eventBus = createDisplayEventBus();
47
70
  const coordinator = new DisplayCoordinator({
@@ -58,6 +81,23 @@ export function createSidetabAttachmentController(deps: {
58
81
  let remoteFrameTimer: ReturnType<typeof setInterval> | null = null;
59
82
  let remoteFramePending = false;
60
83
  let remoteHasFrame = false;
84
+ const herdrPortal = deps.herdrPortal ?? createHerdrSidetabPortal();
85
+ let herdrPaneId: string | null = null;
86
+ let herdrTakenOver = false;
87
+ let herdrFrameTimer: ReturnType<typeof setInterval> | null = null;
88
+ let herdrFramePending = false;
89
+ const herdrInputQueues = new Map<string, Promise<void>>();
90
+
91
+ const enqueueHerdrInput = (paneId: string, send: () => Promise<void>): void => {
92
+ const previous = herdrInputQueues.get(paneId) ?? Promise.resolve();
93
+ let current: Promise<void>;
94
+ current = previous.catch(() => {}).then(send).catch((error: unknown) => {
95
+ if (herdrPaneId === paneId) deps.setStatus(`Herdr 입력 실패 · ${error instanceof Error ? error.message : String(error)}`);
96
+ }).finally(() => {
97
+ if (herdrInputQueues.get(paneId) === current) herdrInputQueues.delete(paneId);
98
+ });
99
+ herdrInputQueues.set(paneId, current);
100
+ };
61
101
  let lastSpawnedSession: TerminalSession | null = null;
62
102
 
63
103
  const stopRemote = (): void => {
@@ -71,8 +111,42 @@ export function createSidetabAttachmentController(deps: {
71
111
  deps.drawRemoteFrame('');
72
112
  };
73
113
 
114
+ const stopHerdr = (): void => {
115
+ if (herdrFrameTimer !== null) clearInterval(herdrFrameTimer);
116
+ herdrFrameTimer = null;
117
+ herdrPaneId = null;
118
+ herdrTakenOver = false;
119
+ deps.drawRemoteFrame('');
120
+ };
121
+
122
+ const startHerdr = (row: SidetabRow): boolean => {
123
+ const paneId = herdrPaneIdFromSidetabRow(row);
124
+ if (!paneId || !herdrPortal.enabled()) {
125
+ deps.setStatus('Herdr 연결은 HERDR_ENV=1인 관리 세션에서만 사용할 수 있습니다');
126
+ return false;
127
+ }
128
+ stopRemote();
129
+ stopHerdr();
130
+ herdrPaneId = paneId;
131
+ const refresh = async (): Promise<void> => {
132
+ if (herdrFramePending || herdrPaneId !== paneId) return;
133
+ herdrFramePending = true;
134
+ try {
135
+ const frame = await herdrPortal.readPane(paneId);
136
+ if (herdrPaneId === paneId) deps.drawRemoteFrame(frame);
137
+ } catch (error) {
138
+ if (herdrPaneId === paneId) deps.setStatus(`Herdr pane 읽기 실패 · ${error instanceof Error ? error.message : String(error)}`);
139
+ } finally { herdrFramePending = false; }
140
+ };
141
+ void refresh();
142
+ herdrFrameTimer = setInterval(() => { void refresh(); }, 250);
143
+ deps.setStatus('Herdr pane 관측 · t takeover · Esc / Ctrl+\\ 복귀 · Ctrl+Q 전체 종료 (Ctrl+[는 Esc로 읽힐 수 있음)');
144
+ return true;
145
+ };
146
+
74
147
  const startRemote = (row: SidetabRow): boolean => {
75
148
  if (!row.ptyId) return false;
149
+ stopHerdr();
76
150
  stopRemote();
77
151
  remotePtyId = row.ptyId;
78
152
  const id = row.ptyId;
@@ -192,6 +266,7 @@ export function createSidetabAttachmentController(deps: {
192
266
  return {
193
267
  attach(row) {
194
268
  stopRemote();
269
+ if (row.kind === 'herdr') return startHerdr(row);
195
270
  if (row.currentProcess) {
196
271
  showMain();
197
272
  return true;
@@ -210,6 +285,7 @@ export function createSidetabAttachmentController(deps: {
210
285
  return attached ? setModal(attached) : false;
211
286
  },
212
287
  select(row) {
288
+ if (row.kind === 'herdr') return startHerdr(row);
213
289
  if (row.ptyId && !row.currentProcess && !sessionForRow(row)) return startRemote(row);
214
290
  if (row.currentProcess) {
215
291
  showMain();
@@ -226,29 +302,44 @@ export function createSidetabAttachmentController(deps: {
226
302
  catch (error) {
227
303
  const message = `${agent} CLI 확인에 실패했습니다: ${error instanceof Error ? error.message : String(error)}`;
228
304
  deps.setStatus(message);
229
- return { ok: false, path: '', promptReady: false, missionVisible: false, completionMarker: false, error: message };
305
+ return { ok: false, path: '', promptReady: false, missionVisible: false, promptReturned: false, completionMarker: false, error: message };
230
306
  }
231
307
  if (!detection.installed) {
232
308
  const message = `${detection.message} · 설치 확인 후 미션을 다시 요청하세요`;
233
309
  deps.setStatus(message);
234
- return { ok: false, path: '', promptReady: false, missionVisible: false, completionMarker: false, error: message };
310
+ return { ok: false, path: '', promptReady: false, missionVisible: false, promptReturned: false, completionMarker: false, error: message };
235
311
  }
236
312
  }
237
313
  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` };
314
+ const injectedMissionPty = deps.createVisibleMissionPty?.(agent);
315
+ let modal: VisibleMissionPty;
316
+ let cwd: string;
317
+ if (injectedMissionPty) {
318
+ modal = injectedMissionPty.pty;
319
+ cwd = injectedMissionPty.cwd;
320
+ } else {
321
+ const spawned = spawn(agent);
322
+ const session = lastSpawnedSession as TerminalSession | null;
323
+ if (!spawned || !session?.modal) {
324
+ return { ok: false, path: '', promptReady: false, missionVisible: false, promptReturned: false, completionMarker: false, error: `${agent} side-tab PTY could not start` };
325
+ }
326
+ modal = session.modal;
327
+ cwd = session.cwd;
240
328
  }
241
- const session = lastSpawnedSession;
242
- const outputPath = join(session.cwd, '.elanous', 'mission-results', `sidetab-${Date.now()}.md`);
329
+ const outputPath = join(cwd, '.elanous', 'mission-results', `sidetab-${Date.now()}.md`);
243
330
  const backend = agent === 'codex' ? codexBackend : claudeBackend;
244
- const result = await runVisibleAgentMission({
245
- pty: session.modal,
331
+ const result = await (deps.visibleMissionRunner ?? runVisibleAgentMission)({
332
+ pty: modal,
333
+ agent,
246
334
  mission,
247
335
  outputPath,
336
+ onStartupScreen: (screen) => deps.logEvent?.('agent-mission.sidetab', 'startup-screen', { agent, screen }),
248
337
  handleTrust: (screen, write) => backend.handleTrust?.(screen, write) ?? false,
249
338
  });
339
+ const failureLog = sidetabMissionFailureLog(agent, result);
340
+ if (failureLog) deps.logEvent?.('agent-mission.sidetab', failureLog.event, failureLog.data);
250
341
  showMain();
251
- deps.setStatus(result.ok ? `미션 결과 확인 · ${result.path}` : `미션 확인 실패 · ${result.error}`);
342
+ deps.setStatus(result.ok ? `미션 결과 확인 · ${result.path}` : `미션 확인 실패 · ${result.promptReady ? agent : result.startupScreen ?? agent} · ${result.error}`);
252
343
  return result;
253
344
  },
254
345
  kill(row) {
@@ -276,6 +367,42 @@ export function createSidetabAttachmentController(deps: {
276
367
  return true;
277
368
  },
278
369
  handleKey(key) {
370
+ if (herdrPaneId) {
371
+ if (key.name.toLowerCase() === 'escape') {
372
+ stopHerdr();
373
+ deps.setStatus('Herdr pane에서 복귀');
374
+ return true;
375
+ }
376
+ if (key.ctrl && key.name.toLowerCase() === 'q') {
377
+ stopHerdr();
378
+ deps.setStatus('Herdr pane에서 복귀');
379
+ return false;
380
+ }
381
+ if (key.ctrl && (key.name === '\\' || key.raw === '\x1c')) {
382
+ stopHerdr();
383
+ deps.setStatus('Herdr pane에서 복귀');
384
+ return false;
385
+ }
386
+ if (key.name.toLowerCase() === 't' && !herdrTakenOver) {
387
+ herdrTakenOver = true;
388
+ deps.setStatus('Herdr pane takeover · Esc로 복귀');
389
+ return true;
390
+ }
391
+ const raw = key.raw;
392
+ if (herdrTakenOver && raw) {
393
+ const paneId = herdrPaneId;
394
+ if (raw.includes('\x00')) {
395
+ deps.setStatus('NUL 입력은 Herdr pane에 보낼 수 없습니다');
396
+ return true;
397
+ }
398
+ const send = (raw.length === 1 && (raw.charCodeAt(0) < 32 || raw.charCodeAt(0) === 0x7f)) || raw.startsWith('\x1b')
399
+ ? () => herdrPortal.sendKey(paneId, raw)
400
+ : () => herdrPortal.sendText(paneId, raw);
401
+ enqueueHerdrInput(paneId, send);
402
+ return true;
403
+ }
404
+ return true;
405
+ }
279
406
  if (remotePtyId) {
280
407
  // Keep global TUI controls reachable while a remote snapshot is displayed.
281
408
  if (key.ctrl && key.name.toLowerCase() === 'q') return false;
@@ -329,10 +456,11 @@ export function createSidetabAttachmentController(deps: {
329
456
  return routed !== 'passthrough';
330
457
  },
331
458
  hasModal: () => modalRouter.current() !== null,
332
- hasRemoteView: () => remotePtyId !== null,
459
+ hasRemoteView: () => remotePtyId !== null || herdrPaneId !== null,
333
460
  refresh: () => coordinator.requestRenderNow({ force: true }),
334
461
  close() {
335
462
  stopRemote();
463
+ stopHerdr();
336
464
  modalRouter.close();
337
465
  for (const session of registry.list()) registry.kill(session.id);
338
466
  },
@@ -340,6 +468,7 @@ export function createSidetabAttachmentController(deps: {
340
468
 
341
469
  function showMain(): void {
342
470
  stopRemote();
471
+ stopHerdr();
343
472
  if (attachedSessionId === null) return;
344
473
  modalRouter.close();
345
474
  coordinator.requestRenderNow({ force: true });