elanous 0.2.38 → 0.2.41

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 (712) hide show
  1. package/README.md +7 -7
  2. package/apps/pwa/out/404/index.html +1 -1
  3. package/apps/pwa/out/404.html +1 -1
  4. package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → GiOLWmt4MqDZePubBjA4Q}/_buildManifest.js +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1115.434ae2ecb0ad986d.js +149 -0
  6. package/apps/pwa/out/_next/static/chunks/1121.667cec0bcdbb3fdb.js +36 -0
  7. package/apps/pwa/out/_next/static/chunks/1178.1aa9cad0e7695427.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1197-54da59d250a6e476.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/{5203.51e5d8b5f1dcfe53.js → 1219.7e17964e0e7cd8e5.js} +3 -3
  10. package/apps/pwa/out/_next/static/chunks/1245.1cfd13b26dbd71d6.js +287 -0
  11. package/apps/pwa/out/_next/static/chunks/1494-f93046ff5c5a124d.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1609.2b312797599b8e45.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/1661.0dd330f3d89f73f3.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/167-0c121e4b47e0f9da.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1700.cdc2bf8cc685e221.js +90 -0
  16. package/apps/pwa/out/_next/static/chunks/1703-78e46acad29f3cfc.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/{7573.2376e13c9c21f1f8.js → 1765.679b29625c8e88d4.js} +2 -2
  18. package/apps/pwa/out/_next/static/chunks/{3528.e4b8ab70d339f965.js → 1800.f7ff51dc4978a958.js} +1 -1
  19. package/apps/pwa/out/_next/static/chunks/1971-7efb628c471dc5a0.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/1999-8de7b7bb36801913.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2073.689dcb2680113d76.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2198-557d49184104d165.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/221-440ce67fa9f5c839.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/{8879.ac06755bcf3e44a1.js → 2263.e09b6edea33bad2d.js} +1 -1
  25. package/apps/pwa/out/_next/static/chunks/2427-8ed8e98624cbd664.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/2457-725c5827bc003795.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2491-2718b15a5ccb75a5.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2527-5c636a43c7cc5dde.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2692-1027cb16fe4ccf49.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/2743.5d3f76948be32b34.js +41 -0
  31. package/apps/pwa/out/_next/static/chunks/2773.0e80b9d325fb5635.js +32 -0
  32. package/apps/pwa/out/_next/static/chunks/2873-0f3cb56c8e3528ea.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/{9fe1b809.738da85c8b17e3fb.js → 2fdf2931.b431eee4fb468bc3.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/{eaad0cba.771200940c529df7.js → 2fe2c302.41b517f88d6fe502.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/3097.864e92bdaa2f4d15.js +79 -0
  36. package/apps/pwa/out/_next/static/chunks/3136-d6870ba63300a93e.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3173-0289113d434e83b7.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3230-49298c3b73ef2268.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/325-dd9208a1a0ab7ce4.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3283.528f430dd043fb4e.js +74 -0
  41. package/apps/pwa/out/_next/static/chunks/3295.cc8cb13b8f0dae1a.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3688-86e3b88abf18cb3b.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3804-7220467a5473a8df.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3808.3e1e247ce7bdf889.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{b7478fef.5917716286213fcc.js → 385e4574.e9886ab32759eda3.js} +3 -3
  46. package/apps/pwa/out/_next/static/chunks/3927.b5473ad109da44c5.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/3934-98ea94832e194796.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4133.2056bb4d78f621af.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4156.ba4de4a3664f04b4.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4297-239ca82f293faab0.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4320-dcc5a7734126f4c9.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4434.94b4c552a2d91e69.js +148 -0
  53. package/apps/pwa/out/_next/static/chunks/{8911.bf5e712acb25fb6c.js → 4527.a69f2894d1bc9f4a.js} +1 -1
  54. package/apps/pwa/out/_next/static/chunks/4579.03e4092f73950965.js +226 -0
  55. package/apps/pwa/out/_next/static/chunks/{5307.d7328020227880c2.js → 4667.97e31aa38c95c475.js} +4 -4
  56. package/apps/pwa/out/_next/static/chunks/{6142.913b44e260a3f925.js → 4702.4a4adc1f16d7c93b.js} +1 -1
  57. package/apps/pwa/out/_next/static/chunks/4815.481501c57b3568d9.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/487-d16e698ef14662d9.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/4888-7a38bf522c9cc6fe.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5034-30e429d6bb086881.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5040-35c494e60dadd97d.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/50c6ab1e.81a96e419350909d.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/5154.4b6a836179356f30.js +94 -0
  64. package/apps/pwa/out/_next/static/chunks/{8487.291666583bebe640.js → 5159.115f1c2ca471386c.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/5228-a8200df486278f2d.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/530.d26346e18089640a.js +115 -0
  67. package/apps/pwa/out/_next/static/chunks/5379.97af106d09566f69.js +8 -0
  68. package/apps/pwa/out/_next/static/chunks/{89d6c04f-6b8ab341748e468a.js → 53aeb4ee-51c92f8d683f5220.js} +1 -1
  69. package/apps/pwa/out/_next/static/chunks/{3291.f6c1005387d514bd.js → 5471.1e611302ed3a7c53.js} +2 -2
  70. package/apps/pwa/out/_next/static/chunks/5479-b6372e762719f92f.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/5534-699c5cbcbc96c5d7.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/{3086.fb14b60ce98b53d3.js → 5574.f35accf4f132b29d.js} +1 -1
  73. package/apps/pwa/out/_next/static/chunks/5701.9c4e8f250312eeee.js +24 -0
  74. package/apps/pwa/out/_next/static/chunks/{1632.7d87f998e714bede.js → 5744.b9415e18ad623100.js} +1 -1
  75. package/apps/pwa/out/_next/static/chunks/{5300.677c97e0393742e6.js → 5892.2526d962339662d8.js} +1 -1
  76. package/apps/pwa/out/_next/static/chunks/5937.c2df9e3447e1f667.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/5941.8210cc93c9202c0a.js +286 -0
  78. package/apps/pwa/out/_next/static/chunks/{7161-8f22db3ec5ed005e.js → 5947-135e26537d80a6b9.js} +3 -3
  79. package/apps/pwa/out/_next/static/chunks/{3124-561f7f037943cde2.js → 5964-7e21164a8f2cf0ce.js} +1 -1
  80. package/apps/pwa/out/_next/static/chunks/5975.4004f820ae3cecd5.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6142-7ccd48795d7abd55.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6160.bf9177b8c1bfb243.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6398.71ba0690c8027555.js +27 -0
  84. package/apps/pwa/out/_next/static/chunks/6492.2bd5c10edc1a064e.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/6552.a3840aa7da35ad68.js +62 -0
  86. package/apps/pwa/out/_next/static/chunks/6736.1e36d3ac5fa5e41d.js +24 -0
  87. package/apps/pwa/out/_next/static/chunks/6874.d5cf7eb8edb2cabe.js +2 -0
  88. package/apps/pwa/out/_next/static/chunks/6900.3ccbe069bdd4556a.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/71327eb4.add50b365f94bf3a.js +122 -0
  90. package/apps/pwa/out/_next/static/chunks/7136.deca3e3a2ddaa374.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7139-ee9f8ed2677a40b3.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{2415.738b777642a02233.js → 7191.fdc955f7d96064a4.js} +1 -1
  93. package/apps/pwa/out/_next/static/chunks/7423-e0aa5d9e2962120e.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7453.afc1ea7e05d56a8c.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7503-5e6a3d7fe67e4a0c.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/7761-476fd7bf768abd34.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/7975.eafb12097a0a9e62.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/{1026-44010f405704050c.js → 8050-9b364bdef8f71927.js} +1 -1
  99. package/apps/pwa/out/_next/static/chunks/8152.64e253c35cccfaae.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/8190.620f0231b3924bcb.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/83184dcd-0ee6247ff41eb3f2.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8448.45b6b1f1a99eeb35.js +104 -0
  103. package/apps/pwa/out/_next/static/chunks/8464-e24f10451b658aac.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8477.e4c944bb3aa5d2f3.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8710.ca385257d5ca422e.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/8830.627ccf294ec2465c.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8880.64c445592f04acaf.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8981.c706964c8ba27aff.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/{5638.107314dc479e2f37.js → 9048.212083de42d25be3.js} +2 -2
  110. package/apps/pwa/out/_next/static/chunks/9053.bd0fffaff8d3f836.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/9161-c66e723d7ec9d682.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/9185.1ecdf9b65c0bb684.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/9356.fccd5f58086b4ff5.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/9446.dc0406109371d329.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/9506.dcf25d467a42627e.js +1 -0
  116. package/apps/pwa/out/_next/static/chunks/{8019.21ca554a821dad01.js → 9507.7026657a2f47eb64.js} +16 -16
  117. package/apps/pwa/out/_next/static/chunks/9541.eb8e2f8480c7feca.js +93 -0
  118. package/apps/pwa/out/_next/static/chunks/9577.ed7582186efa5482.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9579.4a8169600fff2058.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9642-ff2e039eb62e3b92.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/9659-8f2323348113ad80.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9724.4c5623af2db43153.js +34 -0
  123. package/apps/pwa/out/_next/static/chunks/{6493.27ad77de7aac7966.js → 9834.63ab2bbc3153172e.js} +1 -1
  124. package/apps/pwa/out/_next/static/chunks/{3389.012c70767a872f9b.js → 9869.81a1e24ca682d5a0.js} +1 -1
  125. package/apps/pwa/out/_next/static/chunks/{8994d93e.33ba491f95345fc2.js → a0a01613.6d1cca322238d7fe.js} +1 -1
  126. package/apps/pwa/out/_next/static/chunks/{de8b930d.d94c0f42acf807fc.js → addc2b32.8c4ff8f0aefe987d.js} +1 -1
  127. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-8d9d76ea322d855c.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed2c4e59f9f1fe21.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-2dc99e03c5d76ca0.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/board/page-b5a3a788330e920f.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-866aac5ff226a7f3.js → page-14949db884bfa672.js} +1 -1
  132. package/apps/pwa/out/_next/static/chunks/app/bots/page-ea76c85b36388a97.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/ceo/page-01716d20af62d325.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/chat/page-62baf6881a64b1e9.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/consult/page-f89ba590c2af8afa.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/control/page-22f8b0f78d9637e5.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/decisions/page-817f9d7e6820be80.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/design-check/page-ffb9bc0d2650249a.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/editor/page-f6d0e64873c0f629.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/exec/page-8bfa0d4ba23a209d.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/field/page-f5060462249e32c7.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/healthz/route-8d9d76ea322d855c.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/inside/page-b2049f8b1ef79117.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/intake/page-1446c5fa93907f11.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/layout-b48a7a07c5204156.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/live/page-e974b8c4ca47614c.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/live-run/page-8a919b869bd28594.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/loops/page-d31b8de6bfcd72ed.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/market/page-64765f817909db29.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-d128c8569a36ee9b.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/morning/page-b2679d357e9b9270.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/not-found-6fabec98a9e7b269.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/observatory/page-048f30149dcf1349.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-9113181d6b5a2725.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-40f9e19149024298.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-1e7a755a13227611.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3c8f8b67a203cf07.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/page-18032f5437215062.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/reflection/page-da3b739192fd0ee3.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d332545571bd6fd1.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/sessions/page-5237aa5b3f3b8ec5.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a142dfb0331a05f5.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/settings/page-d16e56c3989c147e.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-6b6593600869e2cd.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/setup/layout-8d9d76ea322d855c.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/setup/page-29e8b8a8396b55cb.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/share/page-b3414d856a1a7e2f.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c3affa52b7ce961b.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f21dddf9f95b6fab.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/term/page-f5a30a24745bf088.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/today/page-8c8569a09b4d4e34.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/trace/page-2ce32722c0243483.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/vault/page-4767b0d9c0a98c6c.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-116ee1339c387a75.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/app/workflows/page-35e8c50ca4ef7ffc.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/app/workspace/page-52e17113356bb891.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7458ae05ed2ac1a0.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/b2271e54.c1de3347976e90b0.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/{b7459770.6539b11860eb8a9c.js → c0c1a699.0ba79f97005965d4.js} +7 -7
  180. package/apps/pwa/out/_next/static/chunks/framework-ad6c9dd524ad6ef8.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/main-app-2ddd1f2b44d6aa59.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/main-e3d82bdc358d20c5.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/pages/_app-71d5aa3896e1655f.js +1 -0
  184. package/apps/pwa/out/_next/static/chunks/pages/_error-03ffc54e00438546.js +1 -0
  185. package/apps/pwa/out/_next/static/chunks/webpack-56bb89af5a611d0b.js +1 -0
  186. package/apps/pwa/out/approvals/index.html +1 -1
  187. package/apps/pwa/out/approvals/index.txt +22 -22
  188. package/apps/pwa/out/autopilot/index.html +1 -1
  189. package/apps/pwa/out/autopilot/index.txt +22 -22
  190. package/apps/pwa/out/board/index.html +1 -1
  191. package/apps/pwa/out/board/index.txt +22 -22
  192. package/apps/pwa/out/botlab/index.html +1 -1
  193. package/apps/pwa/out/botlab/index.txt +21 -21
  194. package/apps/pwa/out/bots/index.html +1 -1
  195. package/apps/pwa/out/bots/index.txt +21 -21
  196. package/apps/pwa/out/ceo/index.html +1 -1
  197. package/apps/pwa/out/ceo/index.txt +22 -22
  198. package/apps/pwa/out/chat/index.html +1 -1
  199. package/apps/pwa/out/chat/index.txt +21 -21
  200. package/apps/pwa/out/consult/index.html +1 -1
  201. package/apps/pwa/out/consult/index.txt +22 -22
  202. package/apps/pwa/out/control/index.html +1 -1
  203. package/apps/pwa/out/control/index.txt +22 -22
  204. package/apps/pwa/out/decisions/index.html +1 -1
  205. package/apps/pwa/out/decisions/index.txt +21 -21
  206. package/apps/pwa/out/design-check/index.html +1 -1
  207. package/apps/pwa/out/design-check/index.txt +22 -22
  208. package/apps/pwa/out/editor/index.html +1 -1
  209. package/apps/pwa/out/editor/index.txt +22 -22
  210. package/apps/pwa/out/exec/index.html +1 -1
  211. package/apps/pwa/out/exec/index.txt +22 -22
  212. package/apps/pwa/out/field/index.html +1 -1
  213. package/apps/pwa/out/field/index.txt +22 -22
  214. package/apps/pwa/out/healthz +1 -1
  215. package/apps/pwa/out/index.html +1 -1
  216. package/apps/pwa/out/index.txt +21 -21
  217. package/apps/pwa/out/inside/index.html +1 -1
  218. package/apps/pwa/out/inside/index.txt +21 -21
  219. package/apps/pwa/out/intake/index.html +1 -1
  220. package/apps/pwa/out/intake/index.txt +22 -22
  221. package/apps/pwa/out/live/index.html +1 -1
  222. package/apps/pwa/out/live/index.txt +22 -22
  223. package/apps/pwa/out/live-run/index.html +1 -1
  224. package/apps/pwa/out/live-run/index.txt +22 -22
  225. package/apps/pwa/out/loops/index.html +1 -1
  226. package/apps/pwa/out/loops/index.txt +21 -21
  227. package/apps/pwa/out/market/index.html +1 -1
  228. package/apps/pwa/out/market/index.txt +21 -21
  229. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  230. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  231. package/apps/pwa/out/morning/index.html +1 -1
  232. package/apps/pwa/out/morning/index.txt +22 -22
  233. package/apps/pwa/out/observatory/index.html +1 -1
  234. package/apps/pwa/out/observatory/index.txt +22 -22
  235. package/apps/pwa/out/ops/checklist/index.html +1 -1
  236. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  237. package/apps/pwa/out/ops/release/index.html +1 -1
  238. package/apps/pwa/out/ops/release/index.txt +21 -21
  239. package/apps/pwa/out/ops/seats/index.html +1 -1
  240. package/apps/pwa/out/ops/seats/index.txt +21 -21
  241. package/apps/pwa/out/outputs/index.html +1 -1
  242. package/apps/pwa/out/outputs/index.txt +21 -21
  243. package/apps/pwa/out/reflection/index.html +1 -1
  244. package/apps/pwa/out/reflection/index.txt +22 -22
  245. package/apps/pwa/out/scheduler/index.html +1 -1
  246. package/apps/pwa/out/scheduler/index.txt +22 -22
  247. package/apps/pwa/out/sessions/index.html +1 -1
  248. package/apps/pwa/out/sessions/index.txt +21 -21
  249. package/apps/pwa/out/settings/devices/index.html +1 -1
  250. package/apps/pwa/out/settings/devices/index.txt +22 -22
  251. package/apps/pwa/out/settings/index.html +1 -1
  252. package/apps/pwa/out/settings/index.txt +22 -22
  253. package/apps/pwa/out/setup/done/index.html +1 -1
  254. package/apps/pwa/out/setup/done/index.txt +22 -22
  255. package/apps/pwa/out/setup/index.html +1 -1
  256. package/apps/pwa/out/setup/index.txt +22 -22
  257. package/apps/pwa/out/share/index.html +1 -1
  258. package/apps/pwa/out/share/index.txt +22 -22
  259. package/apps/pwa/out/showroom/index.html +1 -1
  260. package/apps/pwa/out/showroom/index.txt +21 -21
  261. package/apps/pwa/out/tasks/index.html +1 -1
  262. package/apps/pwa/out/tasks/index.txt +22 -22
  263. package/apps/pwa/out/term/index.html +1 -1
  264. package/apps/pwa/out/term/index.txt +22 -22
  265. package/apps/pwa/out/today/index.html +1 -1
  266. package/apps/pwa/out/today/index.txt +22 -22
  267. package/apps/pwa/out/trace/index.html +1 -1
  268. package/apps/pwa/out/trace/index.txt +22 -22
  269. package/apps/pwa/out/vault/index.html +1 -1
  270. package/apps/pwa/out/vault/index.txt +22 -22
  271. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  272. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  273. package/apps/pwa/out/workflows/index.html +1 -1
  274. package/apps/pwa/out/workflows/index.txt +22 -22
  275. package/apps/pwa/out/workspace/index.html +1 -1
  276. package/apps/pwa/out/workspace/index.txt +22 -22
  277. package/apps/pwa/out/worktrees/index.html +1 -1
  278. package/apps/pwa/out/worktrees/index.txt +22 -22
  279. package/bin/elanous.mjs +6 -1
  280. package/catalog/models/openai/gpt-6.1-sol.yaml +16 -0
  281. package/catalog/models/openai/gpt-6.1-terra.yaml +16 -0
  282. package/graphs/demo/persona-marketer/fixtures/marketer-scenario.yaml +10 -0
  283. package/graphs/demo/persona-marketer/persona-marketer.yaml +25 -0
  284. package/graphs/demo/persona-marketer/recipes.yaml +19 -0
  285. package/graphs/demo/persona-teacher/lesson-pack.yaml +16 -0
  286. package/graphs/demo/persona-teacher/recipes.yaml +17 -0
  287. package/graphs/demo/persona-teacher/weekly-lesson.yaml +36 -0
  288. package/graphs/overlays/stop-heal-ladder.yaml +23 -2
  289. package/graphs/release/release-loop.yaml +3 -1
  290. package/graphs/units/gate/gate.yaml +20 -0
  291. package/graphs/units/git/git.yaml +26 -0
  292. package/graphs/units/implement/implement.yaml +19 -0
  293. package/graphs/units/landing/landing.yaml +18 -0
  294. package/graphs/units/review/review.yaml +20 -0
  295. package/graphs/units/verbs/recipes.yaml +3 -0
  296. package/graphs/units/verbs/research.yaml +20 -0
  297. package/graphs/video/explainer-line.yaml +4 -1
  298. package/graphs/work/research-report.yaml +11 -1
  299. package/package.json +1 -1
  300. package/scripts/dead-code/report.ts +169 -0
  301. package/scripts/disk-steward.ts +46 -0
  302. package/scripts/fleet/node-setup.sh +50 -0
  303. package/scripts/graph-units/verbs/research.ts +55 -0
  304. package/scripts/lib/morning-report-options.ts +3 -4
  305. package/scripts/lib/tui-regress-evidence.ts +56 -0
  306. package/scripts/llm-cost-ledger.ts +179 -8
  307. package/scripts/measure-nl-routing-corpus.ts +10 -2
  308. package/scripts/morning-report.ts +5 -1
  309. package/scripts/persona-teacher/weekly-lesson-node.ts +172 -0
  310. package/scripts/public-copy-lint.ts +163 -19
  311. package/scripts/public-export.ts +15 -7
  312. package/scripts/ratchets/train-side-invariants.sh +0 -1
  313. package/scripts/release-loop/export-check-node.ts +21 -3
  314. package/scripts/release-loop/gate-autoheal.ts +117 -0
  315. package/scripts/release-loop/gate-baseline-receipt.ts +8 -1
  316. package/scripts/release-loop/gate-diff.ts +22 -3
  317. package/scripts/release-loop/gate-node.ts +583 -64
  318. package/scripts/release-loop/gate-shard-dispatch.ts +128 -0
  319. package/scripts/release-loop/gate-shard-load-flaky.ts +256 -0
  320. package/scripts/release-loop/gate-shard-receipts.ts +89 -0
  321. package/scripts/release-loop/gate-triage-node.ts +70 -10
  322. package/scripts/release-loop/gate-wall.ts +5 -5
  323. package/scripts/release-loop/preflight.ts +6 -2
  324. package/scripts/release-loop/resume-release.ts +267 -20
  325. package/scripts/release-loop/resume.ts +48 -0
  326. package/scripts/release-loop/traffic-node.ts +6 -3
  327. package/scripts/release-loop/unattended-release.ts +4 -2
  328. package/scripts/release-loop/version-node.ts +7 -2
  329. package/scripts/release-story/draft.ts +1 -1
  330. package/scripts/research-bench/README.md +53 -0
  331. package/scripts/research-bench/questions.json +66 -0
  332. package/scripts/research-bench/rubric.md +33 -0
  333. package/scripts/research-bench/run.ts +523 -0
  334. package/scripts/shadow-authoring-probe.ts +20 -0
  335. package/scripts/tui-regress.ts +85 -10
  336. package/scripts/ux-sim.ts +19 -2
  337. package/src/acp/core-turn-bridge.ts +94 -4
  338. package/src/agent/autonomous-tools.ts +10 -3
  339. package/src/agent/monad-agent-turn.ts +4 -1
  340. package/src/agent/registry.ts +26 -2
  341. package/src/agent/shared-app-tools.ts +1 -1
  342. package/src/agent/surface-ux/build.ts +12 -3
  343. package/src/agent/surface-ux/types.ts +1 -1
  344. package/src/agent/task-notification.ts +75 -6
  345. package/src/agent/types.ts +3 -0
  346. package/src/agent-mission/driver.ts +29 -3
  347. package/src/agent-mission/mission-cli.ts +2 -1
  348. package/src/agent-substrate/review-context-pack.ts +365 -0
  349. package/src/agent-substrate/self-review-cli.ts +291 -20
  350. package/src/ask-user-question/index.ts +6 -0
  351. package/src/ask-user-question/inline-resolver.ts +49 -0
  352. package/src/auto-research/question-ladder-contract.ts +22 -3
  353. package/src/auto-research/research-turn.ts +359 -17
  354. package/src/autopilot/agent-loop.ts +1 -1
  355. package/src/autopilot/discovery/wiki-claim-proposer.ts +22 -1
  356. package/src/autopilot/pty-control-loop.ts +8 -1
  357. package/src/boot/daemon-tools/index.ts +4 -3
  358. package/src/boot/daemon-tools/self-implement.ts +312 -7
  359. package/src/boot/daemon-tools/types.ts +2 -0
  360. package/src/budget/llm-cost.ts +44 -5
  361. package/src/budget/shadow-arms.ts +52 -0
  362. package/src/budget/unified-usage.ts +17 -1
  363. package/src/capture/tui-self-report.ts +14 -0
  364. package/src/chat/index.ts +33 -7
  365. package/src/chat/pickers/state.ts +7 -1
  366. package/src/cli/agent-cli.ts +43 -8
  367. package/src/cli/intake-cli.ts +22 -1
  368. package/src/cli/lesson-cli.ts +19 -3
  369. package/src/cli/log-event-names.ts +6 -0
  370. package/src/cli/mcp-login.ts +8 -18
  371. package/src/cli/msg-cli.ts +57 -1
  372. package/src/cli/pod-cli.ts +17 -2
  373. package/src/cli/pr-land-heavy-remote.ts +15 -9
  374. package/src/cli/pty-takeover-cli.ts +67 -7
  375. package/src/cli/release-cli.ts +79 -7
  376. package/src/cli/repo-cli.ts +2 -1
  377. package/src/cli/sim-cli.ts +7 -1
  378. package/src/cli/tasks-cli.ts +41 -13
  379. package/src/codex/models.ts +30 -15
  380. package/src/control-plane/ledger.ts +21 -4
  381. package/src/core-turn/run-core-turn.ts +47 -3
  382. package/src/core-turn/run-goal-loop.ts +240 -10
  383. package/src/core-turn/types.ts +9 -0
  384. package/src/dashboard/acp-boot.ts +72 -3
  385. package/src/dashboard/chat/acp-chat.ts +2 -2
  386. package/src/dashboard/classic-sigquit.ts +16 -0
  387. package/src/dashboard/index.ts +327 -27
  388. package/src/dashboard/input/chat-main-interaction-opts.ts +3 -0
  389. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +7 -2
  390. package/src/dashboard/input/chat-main-slash-command.ts +7 -0
  391. package/src/dashboard/input/dashboard-plain-turn-stream.ts +4 -0
  392. package/src/dashboard/input/dashboard-priority-key-route.ts +21 -5
  393. package/src/dashboard/input/external-input-host.ts +2 -0
  394. package/src/dashboard/sidetab-runtime.ts +228 -0
  395. package/src/dashboard/slash-runtime/ask-clarification.ts +7 -1
  396. package/src/dashboard/slash-runtime/dashboard-handlers.ts +20 -8
  397. package/src/dashboard/slash-runtime/help-from-registry.ts +2 -2
  398. package/src/dashboard/term-slash-runtime.ts +16 -18
  399. package/src/dashboard/turn-preamble.ts +14 -1
  400. package/src/disk-steward/judge.ts +73 -0
  401. package/src/disk-steward/ledger.ts +122 -0
  402. package/src/disk-steward/steward.ts +373 -0
  403. package/src/domains/guardian-tick.ts +191 -2
  404. package/src/domains/knowledge.ts +1 -1
  405. package/src/esc-abort-gate.ts +33 -1
  406. package/src/execution-loop/launch-gate.ts +206 -1
  407. package/src/graph-runner/graph-cli.ts +27 -4
  408. package/src/graph-runner/in-process-registry.ts +37 -0
  409. package/src/graph-runner/runner.ts +63 -11
  410. package/src/graph-wizard/generate.ts +16 -7
  411. package/src/graph-wizard/mission-compose.ts +201 -0
  412. package/src/grok/agent-search.ts +8 -2
  413. package/src/grok/credential.ts +5 -0
  414. package/src/grounding/ref-index.ts +30 -0
  415. package/src/grounding/ref-vector.ts +61 -0
  416. package/src/grounding/sources-cli.ts +11 -3
  417. package/src/grounding/sources.ts +15 -1
  418. package/src/harness/harness-cli-command.ts +305 -23
  419. package/src/harness/harness-incidents.ts +312 -7
  420. package/src/harness/harness-pod-dispatch.ts +7 -1
  421. package/src/harness/harness-space.ts +15 -1
  422. package/src/harness/progress-worker-entry.ts +59 -0
  423. package/src/harness/progress-worker-runtime.ts +11 -0
  424. package/src/index.ts +35 -5
  425. package/src/input/external-input-queue.ts +10 -0
  426. package/src/instance/dev-project.ts +25 -0
  427. package/src/intake-plane/collect-telegram-saved.ts +36 -1
  428. package/src/intake-plane/intake-to-tasks.ts +246 -3
  429. package/src/intelligence-map/model-alias.ts +6 -5
  430. package/src/intelligence-map/model-catalog.ts +59 -2
  431. package/src/lessons/friction-ledger.ts +154 -0
  432. package/src/live-supply/collector.ts +149 -0
  433. package/src/live-supply/probes.ts +52 -0
  434. package/src/live-supply/snapshot.ts +40 -0
  435. package/src/llm/model-defaults.ts +4 -4
  436. package/src/llm.ts +473 -87
  437. package/src/loops/orchestrator/tick.ts +56 -0
  438. package/src/mcp/mcp-oauth.ts +3 -1
  439. package/src/model-tier/llm-tier-map.ts +9 -9
  440. package/src/model-tier/turn-tier.ts +1 -1
  441. package/src/msg/msg-mirror-github.ts +80 -0
  442. package/src/msg/msg-mirror-policy.ts +61 -0
  443. package/src/msg/msg-mirror-runner.ts +219 -0
  444. package/src/msg/msg-mirror-state.ts +33 -0
  445. package/src/msg/msg-store.ts +11 -0
  446. package/src/nexus/api/harness-api.ts +2 -1
  447. package/src/output-truncation.ts +41 -12
  448. package/src/project/project-store.ts +48 -1
  449. package/src/pty/snapshot.py +132 -0
  450. package/src/pty-shell/pty-control-ipc.ts +29 -2
  451. package/src/pty-shell/pty-manifest.ts +59 -3
  452. package/src/pty-shell/registry.ts +2 -0
  453. package/src/pty-shell/tui-run-state.ts +80 -3
  454. package/src/release-loop/gate-host-reservation.ts +157 -4
  455. package/src/release-loop/gate-shard-ledger.ts +68 -0
  456. package/src/release-loop/merged-pr-checklist.ts +25 -2
  457. package/src/release-loop/rehearsal-shard-plan.ts +6 -1
  458. package/src/release-loop/rehearsal.ts +27 -0
  459. package/src/release-loop/release-schedule.ts +90 -1
  460. package/src/research/bloom-exemplars.ts +135 -0
  461. package/src/research/edge-decision.ts +124 -15
  462. package/src/research/gap-followup.ts +249 -0
  463. package/src/research/lenses/counter-evidence.ts +100 -0
  464. package/src/research/lenses/working-backwards.ts +89 -0
  465. package/src/research/plugin-discovery.ts +242 -0
  466. package/src/research-bridge/invoke.ts +4 -2
  467. package/src/research-bridge/types.ts +2 -0
  468. package/src/self-dev/ask-launch-flow.ts +73 -131
  469. package/src/self-dev/dev-cli.ts +19 -17
  470. package/src/self-dev/dev-pipeline.ts +8 -4
  471. package/src/self-dev/graph-front-nodes.ts +23 -0
  472. package/src/self-dev/graph-journey-route.ts +10 -2
  473. package/src/self-dev/launch-preflight-text.ts +2 -2
  474. package/src/self-dev/launch-preflight.ts +47 -11
  475. package/src/self-dev/orchestrate-cli.ts +1 -0
  476. package/src/self-dev/orchestrate.ts +15 -0
  477. package/src/self-dev/run-supervisor.ts +204 -3
  478. package/src/self-dev/run-types.ts +3 -0
  479. package/src/self-implement/device-first.ts +8 -2
  480. package/src/self-implement/doctor-visit.ts +76 -58
  481. package/src/self-implement/gate-artifacts.ts +16 -0
  482. package/src/self-implement/gate-baseline.ts +75 -4
  483. package/src/self-implement/gate-cli.ts +368 -30
  484. package/src/self-implement/gate-receipt-registry.ts +180 -0
  485. package/src/self-implement/gate-remote.ts +165 -24
  486. package/src/self-implement/goal-author-clarification.ts +205 -32
  487. package/src/self-implement/goal-author-decompose.ts +24 -15
  488. package/src/self-implement/goal-author.ts +86 -10
  489. package/src/self-implement/graph-stage-units.ts +172 -0
  490. package/src/self-implement/graph-templates.ts +162 -1
  491. package/src/self-implement/graph-variant.ts +37 -4
  492. package/src/self-implement/host-regate.ts +124 -49
  493. package/src/self-implement/impl-findings-feedback.ts +188 -0
  494. package/src/self-implement/knowhow-pack.ts +227 -10
  495. package/src/self-implement/off-diff-evidence.ts +124 -0
  496. package/src/self-implement/orchestrator.ts +320 -28
  497. package/src/self-implement/run-ledger.ts +110 -14
  498. package/src/self-implement/run-stop.ts +33 -2
  499. package/src/self-implement/running-runs.ts +35 -12
  500. package/src/self-implement/seams.ts +6 -3
  501. package/src/self-implement/self-implement-cli.ts +40 -6
  502. package/src/self-implement/stop-autoheal-operational.ts +43 -0
  503. package/src/self-implement/stop-autoheal.ts +15 -6
  504. package/src/session/chat.ts +66 -15
  505. package/src/session/request-size-guard.ts +123 -0
  506. package/src/session-runtime/provider-circuit.ts +140 -0
  507. package/src/shell-runner/file-engine.ts +1 -0
  508. package/src/shell-runner/types.ts +4 -0
  509. package/src/sidetab-core/model.ts +312 -0
  510. package/src/skills/tools/schedule-wakeup.ts +23 -1
  511. package/src/skills/tools/shell.ts +51 -5
  512. package/src/steward/directive-audit.ts +354 -0
  513. package/src/surface/child-process.ts +31 -0
  514. package/src/surface/tui-stderr-owner.ts +48 -0
  515. package/src/task-agent/cover.ts +30 -12
  516. package/src/task-agent/judge.ts +56 -0
  517. package/src/task-agent/parent-host.ts +14 -1
  518. package/src/task-agent/postland-card.ts +35 -2
  519. package/src/task-agent/rejudge-on-head.ts +46 -2
  520. package/src/task-agent/repair-cycle.ts +1 -1
  521. package/src/task-agent/task-hand.ts +133 -25
  522. package/src/task-agent/tier-split.ts +105 -21
  523. package/src/task-orchestrator/surfaces/pod-command-job.ts +330 -2
  524. package/src/task-orchestrator/surfaces/pod-config-snapshot.ts +123 -0
  525. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +70 -2
  526. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +29 -4
  527. package/src/task-orchestrator/surfaces/pod-mirror-seed.ts +11 -8
  528. package/src/task-orchestrator/surfaces/pod-si-warm-protocol.ts +1 -1
  529. package/src/task-orchestrator/surfaces/pod-source-receive.ts +74 -6
  530. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +2 -1
  531. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +56 -15
  532. package/src/task-orchestrator/surfaces/self-implement-pod.ts +298 -45
  533. package/src/task-orchestrator/surfaces/self-implement.ts +18 -0
  534. package/src/tool-runtime/skill-exec-runtime.ts +95 -5
  535. package/src/tui/entry.ts +25 -5
  536. package/src/tui/inline-choice.ts +188 -0
  537. package/src/tui/sidetab/list.ts +36 -165
  538. package/src/tui/sidetab/nl-tool.ts +2 -136
  539. package/src/tui/sidetab/peek.ts +52 -0
  540. package/src/tui/slash/term.ts +12 -1
  541. package/src/tui-client/dashboard-session.ts +10 -1
  542. package/src/user-config.ts +45 -9
  543. package/src/ux-sim/classic-tui-seat-scenarios.ts +1 -7
  544. package/src/ux-sim/fake-land-queue.ts +88 -0
  545. package/src/ux-sim/fault-needs-human-reason-repair.ts +107 -0
  546. package/src/ux-sim/fault-pod-child-result.ts +42 -0
  547. package/src/ux-sim/gate-shard-host-reroute.ts +82 -0
  548. package/src/ux-sim/goal-interim-trace.ts +24 -0
  549. package/src/ux-sim/next-tui-seat-scenarios.ts +8 -13
  550. package/src/ux-sim/release-sim-rig.ts +262 -0
  551. package/src/ux-sim/seminar-rehearsal.ts +109 -0
  552. package/src/ux-sim/subagent-tools-device.ts +2 -2
  553. package/src/ux-sim/task-orchestrator-surfaces-self-implement-pod-device.ts +4 -1
  554. package/src/version/packed-revision.json +1 -1
  555. package/src/video-pipeline/recipes/explainer.ts +54 -2
  556. package/src/web-search/grok.ts +32 -6
  557. package/src/web-search/index.ts +8 -7
  558. package/src/workflow-runtime/node-catalog.ts +53 -4
  559. package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +0 -27
  560. package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/1923-5c1695332240246a.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +0 -148
  567. package/apps/pwa/out/_next/static/chunks/2104.70e086d5174a4736.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +0 -93
  571. package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +0 -104
  572. package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +0 -24
  581. package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +0 -36
  583. package/apps/pwa/out/_next/static/chunks/3341-f09b9efbd7a82f70.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +0 -287
  586. package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +0 -1
  587. package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +0 -94
  592. package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +0 -1
  594. package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +0 -1
  595. package/apps/pwa/out/_next/static/chunks/4199-f7c6eb40cd0322f8.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +0 -1
  602. package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +0 -32
  604. package/apps/pwa/out/_next/static/chunks/4804.6012b5cd33c22792.js +0 -90
  605. package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +0 -79
  607. package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +0 -74
  610. package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/5255-1b60d50eabe9f057.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +0 -286
  614. package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +0 -8
  617. package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/7000.28157393caaf5343.js +0 -62
  629. package/apps/pwa/out/_next/static/chunks/7311-60a7ea80d23c7521.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/7488.966b116789f3d41a.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/7524.ce973525d30b3d52.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/7628.6b16863ac3972333.js +0 -34
  636. package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/7954.4f7a8832663ee979.js +0 -115
  639. package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +0 -149
  647. package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +0 -41
  648. package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +0 -226
  649. package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +0 -24
  650. package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +0 -2
  654. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/intake/page-c348a3959c5b5fc6.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-d1d1210f99f620ae.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/page-7f569e533ddeecba.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/app/share/page-a9d9a3e66459c1e0.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/bb6987f9.3647e1a23b0e3217.js +0 -122
  705. package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +0 -1
  711. package/scripts/ratchets/next-tui-entry-budget.ts +0 -124
  712. /package/apps/pwa/out/_next/static/{RrjXTwz-urRAbChP1bX02 → GiOLWmt4MqDZePubBjA4Q}/_ssgManifest.js +0 -0
@@ -0,0 +1,242 @@
1
+ import { debug } from '../debug/log.js';
2
+ import { readdirSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { discoverCapability, type CapabilityCandidate } from '../agent-mission/discover-capability.js';
5
+ import { ensureMarketIndex, type MarketIndex } from '../plugins/install/market-fetch.js';
6
+ import { installPlugin, type InstalledPlugin } from '../plugins/install/plugin-install.js';
7
+ import { getUserConfig } from '../user-config.js';
8
+
9
+ const MAX_CANDIDATES = 5;
10
+ const MAX_GAP_LENGTH = 240;
11
+ const DEFAULT_GITHUB_STARS = 1_000;
12
+
13
+ export type PluginDiscoverySource = 'signed-market' | 'official-external' | 'github' | 'other';
14
+ export interface PluginDiscoveryCandidate {
15
+ name: string;
16
+ url: string;
17
+ source: PluginDiscoverySource;
18
+ description: string;
19
+ license?: string;
20
+ permissions: string[];
21
+ stars?: number;
22
+ trusted: boolean;
23
+ /** Only a verified signed-index entry is accepted by the built-in installer. */
24
+ installSpec?: string;
25
+ }
26
+
27
+ export interface PluginDiscoveryResult {
28
+ candidates: PluginDiscoveryCandidate[];
29
+ installed?: { name: string; path: string; notice: string; undo: string };
30
+ card: string;
31
+ outcome: 'installed' | 'proposed' | 'create-suggestion' | 'invalid-gap';
32
+ }
33
+
34
+ export interface PluginDiscoveryDeps {
35
+ signal?: AbortSignal;
36
+ market?: () => Promise<MarketIndex>;
37
+ search?: (gap: string, signal?: AbortSignal) => Promise<CapabilityCandidate[]>;
38
+ githubPackage?: (url: string, signal?: AbortSignal) => Promise<{ stars: number; sha?: string; license?: string; permissions?: string[] } | undefined>;
39
+ install?: (spec: string) => Promise<InstalledPlugin>;
40
+ /** Config seam; an invalid value fails closed to the default threshold. */
41
+ githubStarThreshold?: number;
42
+ log?: (event: string, data: Record<string, unknown>) => void;
43
+ }
44
+
45
+ function safeGap(text: string): string | null {
46
+ const gap = text.normalize('NFKC').trim();
47
+ if (!gap || gap.length > MAX_GAP_LENGTH || /(?:api[_-]?key|password|secret|token|authorization|bearer|sk-[\w-]+|gh[pousr]_[\w-]+)/i.test(gap)) return null;
48
+ return gap.replace(/https?:\/\/\S+/g, '[url]');
49
+ }
50
+
51
+ function configuredStarThreshold(): number {
52
+ const raw = getUserConfig().raw as Record<string, unknown>;
53
+ const discovery = raw.pluginDiscovery;
54
+ const value = discovery && typeof discovery === 'object' && !Array.isArray(discovery)
55
+ ? (discovery as Record<string, unknown>).githubStarThreshold : undefined;
56
+ return Number.isSafeInteger(value) && (value as number) > 0 ? value as number : DEFAULT_GITHUB_STARS;
57
+ }
58
+
59
+ function words(text: string): string[] {
60
+ return (text.toLowerCase().match(/[\p{L}\p{N}]{3,}/gu) ?? [])
61
+ .filter(word => !['missing', 'evidence', 'data', 'plugin', 'skill', 'tool', 'research', 'unavailable'].includes(word));
62
+ }
63
+
64
+ function relevance(gap: string, text: string): number {
65
+ const terms = new Set(words(gap));
66
+ if (terms.size === 0) return 0;
67
+ const haystack = new Set(words(text));
68
+ return [...terms].filter(term => haystack.has(term)).length / terms.size;
69
+ }
70
+
71
+ function officialExternal(url: URL): boolean {
72
+ return url.hostname === 'docs.anthropic.com' || url.hostname === 'code.claude.com'
73
+ || url.hostname === 'developers.openai.com' || url.hostname === 'openai.com'
74
+ || url.hostname === 'docs.x.ai' || url.hostname === 'x.ai';
75
+ }
76
+
77
+ function githubRepo(url: URL): { owner: string; repo: string } | null {
78
+ if (url.hostname !== 'github.com') return null;
79
+ const [owner, repo, ...rest] = url.pathname.split('/').filter(Boolean);
80
+ return owner && repo && rest.length === 0 && /^[\w.-]+$/.test(owner) && /^[\w.-]+$/.test(repo)
81
+ ? { owner, repo } : null;
82
+ }
83
+
84
+ async function defaultGithubPackage(raw: string, signal?: AbortSignal): Promise<{ stars: number; sha?: string; license?: string; permissions?: string[] } | undefined> {
85
+ const repo = githubRepo(new URL(raw));
86
+ if (!repo) return undefined;
87
+ const api = `https://api.github.com/repos/${encodeURIComponent(repo.owner)}/${encodeURIComponent(repo.repo)}`;
88
+ const options = {
89
+ headers: { accept: 'application/vnd.github+json' }, signal: AbortSignal.any([AbortSignal.timeout(5_000), ...(signal ? [signal] : [])]),
90
+ };
91
+ const response = await fetch(api, options);
92
+ if (!response.ok) return undefined;
93
+ const body = await response.json() as { stargazers_count?: unknown; default_branch?: unknown; size?: unknown;
94
+ archived?: unknown; license?: { spdx_id?: unknown } };
95
+ if (!Number.isSafeInteger(body.stargazers_count)) return undefined;
96
+ const metadata = { stars: body.stargazers_count as number,
97
+ ...(typeof body.license?.spdx_id === 'string' ? { license: body.license.spdx_id } : {}) };
98
+ if (body.archived === true || !Number.isSafeInteger(body.size) || (body.size as number) > 10_000
99
+ || typeof body.default_branch !== 'string') return metadata;
100
+ const commit = await fetch(`${api}/commits/${encodeURIComponent(body.default_branch)}`, options);
101
+ if (!commit.ok) return metadata;
102
+ const sha = (await commit.json() as { sha?: unknown }).sha;
103
+ if (typeof sha !== 'string' || !/^[a-fA-F0-9]{40}$/.test(sha)) return metadata;
104
+ const manifest = await fetch(`${api}/contents/plugin.json?ref=${sha}`, options);
105
+ if (!manifest.ok) return metadata;
106
+ const file = await manifest.json() as { type?: unknown; size?: unknown; content?: unknown; encoding?: unknown };
107
+ if (file.type !== 'file' || file.encoding !== 'base64' || !Number.isSafeInteger(file.size)
108
+ || (file.size as number) > 64_000 || typeof file.content !== 'string') return metadata;
109
+ try {
110
+ const parsed = JSON.parse(Buffer.from(file.content, 'base64').toString('utf8')) as { capabilities?: unknown };
111
+ const permissions = Array.isArray(parsed.capabilities)
112
+ ? parsed.capabilities.flatMap(value => value && typeof value === 'object'
113
+ && typeof value.kind === 'string' ? [value.kind as string] : []) : [];
114
+ return { ...metadata, sha, permissions };
115
+ } catch { return metadata; }
116
+ }
117
+
118
+ function defaultInstall(spec: string): Promise<InstalledPlugin> {
119
+ // The installer stages, verifies signature/hash and scans before moving into the plugin root.
120
+ // Capabilities and credentials require a separate user decision; no blanket --yes.
121
+ return installPlugin(spec, { consent: () => false, allowUnsigned: false });
122
+ }
123
+
124
+ function card(gap: string, candidates: readonly PluginDiscoveryCandidate[], installed?: PluginDiscoveryResult['installed']): string {
125
+ const lines = [`Plugin discovery · ${gap}`];
126
+ if (installed) lines.push(`Installed ${installed.name}. ${installed.notice} Undo: ${installed.undo}`);
127
+ for (const candidate of candidates) {
128
+ lines.push(`- ${candidate.name} · ${candidate.source} · ${candidate.trusted ? 'trusted source' : 'proposal only'} · ${candidate.url}`);
129
+ lines.push(` ${candidate.description || 'No description'} · license: ${candidate.license ?? 'unknown'} · permissions: ${candidate.permissions.join(', ') || 'none declared'}${candidate.stars === undefined ? '' : ` · stars: ${candidate.stars}`}`);
130
+ }
131
+ if (candidates.filter(candidate => candidate.trusted && candidate.installSpec).length > 1)
132
+ lines.push('Several verified packages match. Choose one before installation.');
133
+ if (!candidates.length) lines.push('No matching plugin found. Suggest creating a skill or plugin draft for approval.');
134
+ return lines.join('\n');
135
+ }
136
+
137
+ /** One bounded, fail-soft discovery attempt for a research capability gap. */
138
+ export async function discoverResearchPlugin(gapText: string, deps: PluginDiscoveryDeps = {}): Promise<PluginDiscoveryResult> {
139
+ const gap = safeGap(gapText);
140
+ if (!gap) return { candidates: [], card: 'Plugin discovery skipped: unsafe or empty gap.', outcome: 'invalid-gap' };
141
+ const aborted = (): PluginDiscoveryResult => ({ candidates: [], card: 'Plugin discovery skipped: time budget exhausted.', outcome: 'create-suggestion' });
142
+ if (deps.signal?.aborted) return aborted();
143
+ const log = deps.log ?? ((event: string, data: Record<string, unknown>) => debug.log('research.plugin-discovery', event, data));
144
+ const threshold = Number.isSafeInteger(deps.githubStarThreshold) && (deps.githubStarThreshold as number) > 0
145
+ ? deps.githubStarThreshold as number : configuredStarThreshold();
146
+ const candidates: PluginDiscoveryCandidate[] = [];
147
+
148
+ try {
149
+ const market = await (deps.market ?? (() => ensureMarketIndex('elanous')))();
150
+ // A signed index is the only built-in source with a verifiable install spec.
151
+ if (market.signature === 'ok' && market.index.name === 'elanous') {
152
+ for (const entry of market.index.plugins) {
153
+ const labels = [entry.name, entry.description ?? '', ...entry['ai.elanous'].capabilities,
154
+ ...(entry['ai.elanous'].vocab ?? [])].join(' ');
155
+ if (relevance(gap, labels) < 0.5) continue;
156
+ candidates.push({ name: entry.name, url: market.market.url, source: 'signed-market',
157
+ description: (entry.description ?? '').slice(0, 180), license: undefined,
158
+ permissions: [...entry['ai.elanous'].capabilities], trusted: true,
159
+ installSpec: `${entry.name}@elanous` });
160
+ }
161
+ }
162
+ } catch { log('market-unavailable', { gap: gap.slice(0, 80) }); }
163
+ if (deps.signal?.aborted) return aborted();
164
+
165
+ try {
166
+ const found = await (deps.search ?? ((query: string, signal?: AbortSignal) => discoverCapability(query,
167
+ { layer: 'skill', limit: MAX_CANDIDATES, community: false, signal })))(gap, deps.signal);
168
+ if (deps.signal?.aborted) return aborted();
169
+ for (const hit of found.slice(0, MAX_CANDIDATES)) {
170
+ if (deps.signal?.aborted) return aborted();
171
+ let url: URL;
172
+ try { url = new URL(hit.url); } catch { continue; }
173
+ if (url.protocol !== 'https:' || url.username || url.password) continue;
174
+ const repo = githubRepo(url);
175
+ const source: PluginDiscoverySource = repo ? 'github' : officialExternal(url) ? 'official-external' : 'other';
176
+ let github: Awaited<ReturnType<NonNullable<PluginDiscoveryDeps['githubPackage']>>>;
177
+ if (repo) {
178
+ try { github = await (deps.githubPackage ?? defaultGithubPackage)(url.href, deps.signal); } catch { /* metadata unavailable */ }
179
+ }
180
+ if (relevance(gap, `${hit.title} ${hit.snippet}`) === 0) continue;
181
+ candidates.push({ name: hit.title.slice(0, 100), url: url.href, source,
182
+ description: hit.snippet.slice(0, 180), permissions: github?.permissions ?? [],
183
+ stars: github?.stars, license: github?.license,
184
+ trusted: source === 'official-external' || (source === 'github' && github !== undefined && github.stars >= threshold),
185
+ ...(source === 'github' && github?.sha && github.stars >= threshold
186
+ ? { installSpec: `https://github.com/${repo!.owner}/${repo!.repo}.git#${github.sha}` } : {}),
187
+ });
188
+ }
189
+ } catch { log('search-unavailable', { gap: gap.slice(0, 80) }); }
190
+ if (deps.signal?.aborted) return aborted();
191
+
192
+ const deduped = candidates.filter((item, index) => candidates.findIndex(other => other.url === item.url && other.name === item.name) === index)
193
+ .slice(0, MAX_CANDIDATES);
194
+ const installable = deduped.filter(item => item.trusted && item.installSpec);
195
+ let installed: PluginDiscoveryResult['installed'];
196
+ // Ambiguous matches require a choice. Search-result URLs and stars alone never become install specs.
197
+ if (installable.length === 1) {
198
+ const candidate = installable[0]!;
199
+ try {
200
+ if (deps.signal?.aborted) return aborted();
201
+ const item = await (deps.install ?? defaultInstall)(candidate.installSpec!);
202
+ const undo = `eln plugin remove ${item.name}`;
203
+ installed = { name: item.name, path: item.path,
204
+ notice: `Reason: missing research capability ${gap}; source: ${candidate.source}; permissions: ${candidate.permissions.join(', ') || 'none declared'}.`, undo };
205
+ log('installed', { name: item.name, source: candidate.source, undo });
206
+ } catch (error) {
207
+ log('install-refused', { name: candidate.name, reason: error instanceof Error ? error.message.slice(0, 120) : 'unknown' });
208
+ }
209
+ }
210
+ const outcome: PluginDiscoveryResult['outcome'] = installed ? 'installed' : deduped.length ? 'proposed' : 'create-suggestion';
211
+ const result = { candidates: deduped, installed, card: card(gap, deduped, installed), outcome };
212
+ log(outcome, { gap: gap.slice(0, 80), count: deduped.length, installed: installed?.name });
213
+ return result;
214
+ }
215
+
216
+ /** Re-query through exactly one installed, declared read-only skill with no local-file or shell tools. */
217
+ export async function rerunInstalledPluginResearch(
218
+ gap: string, installation: NonNullable<PluginDiscoveryResult['installed']>, signal: AbortSignal,
219
+ ): Promise<{ ok: boolean; output: string; error?: string }> {
220
+ if (!safeGap(gap) || signal.aborted) return { ok: false, output: '', error: 'unsafe gap or expired budget' };
221
+ const root = join(installation.path, 'skills');
222
+ let names: string[];
223
+ try { names = readdirSync(root, { withFileTypes: true }).filter(item => item.isDirectory()).map(item => item.name); }
224
+ catch { return { ok: false, output: '', error: 'installed package has no skill directory' }; }
225
+ const { parseSkillMd, executeSkill } = await import('../skills/runner.js');
226
+ const safe = names.flatMap(name => {
227
+ const manifest = parseSkillMd(name, root);
228
+ return manifest?.sideEffects === 'none' ? [manifest] : [];
229
+ });
230
+ if (safe.length !== 1) return { ok: false, output: '', error: 'installed package has no unique declared read-only skill' };
231
+ const manifest = safe[0]!;
232
+ try {
233
+ const run = await executeSkill({ ...manifest,
234
+ allowedTools: ['WebSearch', 'WebFetch'],
235
+ deniedTools: [...new Set([...(manifest.deniedTools ?? []), 'Bash', 'Read', 'Write', 'Edit', 'NotebookEdit'])],
236
+ }, gap, () => {}, { signal });
237
+ const output = run.finalResponse.trim();
238
+ return { ok: output.length > 0, output, ...(output ? {} : { error: 'installed skill returned no research output' }) };
239
+ } catch (error) {
240
+ return { ok: false, output: '', error: error instanceof Error ? error.message : String(error) };
241
+ }
242
+ }
@@ -75,6 +75,7 @@ export type ResearchInvoker = (
75
75
  skillName: string,
76
76
  args: string,
77
77
  onProgress?: (delta: string) => void,
78
+ signal?: AbortSignal,
78
79
  ) => Promise<ResearchInvocationOutcome>;
79
80
 
80
81
  let invoker: ResearchInvoker | null = null;
@@ -101,6 +102,7 @@ async function defaultInvoker(
101
102
  skillName: string,
102
103
  args: string,
103
104
  onProgress?: (delta: string) => void,
105
+ signal?: AbortSignal,
104
106
  ): Promise<ResearchInvocationOutcome> {
105
107
  const { parseSkillMd, executeSkill } = await import('../skills/runner.js');
106
108
  const manifest = parseSkillMd(skillName);
@@ -115,7 +117,7 @@ async function defaultInvoker(
115
117
  // ★ research 격리 — 파일-쓰기 도구 deny 주입(main 트리 오염 차단). Bash·검색도구는 유지.
116
118
  const result = await executeSkill(withResearchIsolation(manifest), args, (delta) => {
117
119
  if (onProgress) onProgress(delta);
118
- });
120
+ }, { signal });
119
121
  return researchOutcomeFromSkillRun(result);
120
122
  } catch (err) {
121
123
  return {
@@ -136,7 +138,7 @@ export async function invokeResearch(
136
138
  ): Promise<ExternalResearchResult> {
137
139
  const skillName = opts.skill || DEFAULT_SKILL;
138
140
  const startedAt = new Date();
139
- const outcome = await (invoker ?? defaultInvoker)(skillName, topic, opts.onProgress);
141
+ const outcome = await (invoker ?? defaultInvoker)(skillName, topic, opts.onProgress, opts.signal);
140
142
  const finishedAt = new Date();
141
143
  const result: ExternalResearchResult = {
142
144
  topic,
@@ -31,4 +31,6 @@ export interface InvokeResearchOpts {
31
31
  /** Stream progress chunks back to the caller (e.g. dashboard chat
32
32
  * pane) so the user sees activity for long-running invocations. */
33
33
  onProgress?: (delta: string) => void;
34
+ /** Cancel a bounded automatic follow-up when its caller's time budget expires. */
35
+ signal?: AbortSignal;
34
36
  }
@@ -38,17 +38,15 @@ import {
38
38
  import { execFileSync } from 'node:child_process';
39
39
  import { dirname, isAbsolute as isAbsolutePath, relative as relativePath, resolve as resolvePath, sep } from 'node:path';
40
40
  import {
41
- applyClarificationReply,
42
41
  planClarificationIntake,
43
42
  selfAnswerGoalDocumentClarifications,
44
43
  type GoalClarificationSelfResolver,
45
44
  } from '../self-implement/goal-author-clarification.js';
46
- import { classifyReauthoredAsk, countMissingAuthoredConstraintMarkers, askGoalTypeDeclaration, declaredGoalType, parseGoalId } from '../self-implement/goal-author.js';
47
- import { observeFrontNodeEntry, observeFrontNodeExit, observeFrontNodeUnit, type AuthorExitOutcome } from './graph-front-nodes.js';
45
+ import { countMissingAuthoredConstraintMarkers, askGoalTypeDeclaration, declaredGoalType, parseGoalId } from '../self-implement/goal-author.js';
46
+ import { observeFrontNodeEntry, observeFrontNodeExit, runFrontNodeUnit, type AuthorExitOutcome } from './graph-front-nodes.js';
48
47
  import { emitDecision } from '../live/detail-switch.js';
49
48
  import { decomposeSelfDevGoal, type SelfDevDecomposeOptions, type SelfDevDecomposition } from './decompose.js';
50
49
  import { observeDecomposerSelection, readFabricDecomposeConfig, selectFabricDecomposer } from './self-orchestrate-runtime.js';
51
- import type { GoalDocumentClarification } from '../self-implement/goal-author-clarification.js';
52
50
 
53
51
  export type SelfResolveClarificationsSource = 'flag' | 'default';
54
52
 
@@ -187,7 +185,6 @@ export interface AskLaunchFlowDeps {
187
185
  readLine(prompt: string): Promise<string>;
188
186
  /** Optional structured clarification adapter. Omitted callers retain the
189
187
  * existing CLI line-input contract exactly. */
190
- readClarification?(clarification: GoalDocumentClarification): Promise<string>;
191
188
  selfResolveClarification?: GoalClarificationSelfResolver;
192
189
  /** Replaces the goal document after a self-answer; production entrances pass an atomic writer. */
193
190
  writeGoalDocument?(path: string, document: string): void;
@@ -409,21 +406,28 @@ export async function recommendLaunchDecomposition(
409
406
  fabricDecomposeConfig.autoPathThreshold,
410
407
  );
411
408
  const decomposeGoalType = input.goalType ?? declaredGoalType(input.askText);
409
+ const frontRunId = input.runId ?? process.env.ELANOUS_RUN_ID;
412
410
  observeFrontNodeEntry('decompose', {
413
411
  provenance: 'authoring-decomposition-start',
414
- ...(input.runId === undefined ? {} : { runId: input.runId }),
412
+ ...(frontRunId === undefined ? {} : { runId: frontRunId }),
413
+ ...(decomposeGoalType === null ? {} : { goalType: decomposeGoalType }),
414
+ });
415
+ const result = await runFrontNodeUnit({
416
+ node: 'decompose',
417
+ execute: (goalDocument) => Promise.race([
418
+ deps.decomposeGoal
419
+ ? deps.decomposeGoal(goalDocument)
420
+ : decomposeSelfDevGoal(goalDocument, {
421
+ ...deps.decomposeOptions,
422
+ decomposer: selection.decomposer,
423
+ observation: prelaunchDecompositionObservation(goalDocument),
424
+ }),
425
+ timeout,
426
+ ]),
427
+ }, document!, {
428
+ ...(frontRunId === undefined ? {} : { runId: frontRunId }),
415
429
  ...(decomposeGoalType === null ? {} : { goalType: decomposeGoalType }),
416
430
  });
417
- const result = await observeFrontNodeUnit('decompose', input.runId ?? process.env.ELANOUS_RUN_ID, decomposeGoalType ?? undefined, () => Promise.race([
418
- deps.decomposeGoal
419
- ? deps.decomposeGoal(document!)
420
- : decomposeSelfDevGoal(document!, {
421
- ...deps.decomposeOptions,
422
- decomposer: selection.decomposer,
423
- observation: prelaunchDecompositionObservation(document!),
424
- }),
425
- timeout,
426
- ]));
427
431
  if (result === timedOut) {
428
432
  // ⛔ 「시간 초과」를 「못 쟀다」로 뭉개지 않는다 — 분해기는 «아직 답하는 중»이고
429
433
  // 그 답은 `prelaunch-decomposition` 이름으로 «따로» 내려앉는다(위 주석).
@@ -753,8 +757,7 @@ async function runPrePreflight(
753
757
  : false;
754
758
  }
755
759
 
756
- /** ⑴b 되묻기 «수신» — 답이 들어가면 «재저작»하고 그 새 골을 돌려준다.
757
- * ⛔ 무인 계약은 그대로다 — 대화형이 «아니면» 종전처럼 지나가고, 그 사실을 관측에 남긴다. */
760
+ /** ⑴b 되묻기 intake — shared self-resolution policy, then continue with answered/deferred goal. */
758
761
  async function intakeClarifications(
759
762
  authored: AskAuthoredGoal,
760
763
  input: AskLaunchFlowInput,
@@ -775,113 +778,45 @@ async function intakeClarifications(
775
778
  interactive: deps.isInteractive(),
776
779
  goalFile: effectiveGoalFile,
777
780
  }, 'info');
778
- if (mode === 'none') {
781
+ if (pending.length === 0) {
779
782
  deps.print('[ask] ⑴b 되묻기 없음 — 저작기가 물을 것이 없었다');
780
783
  return effectiveGoalFile;
781
784
  }
782
- if (mode === 'deferred-noninteractive') {
783
- // The resolver comes in through deps (I/O seam): production entrances pass the author
784
- // self-resolver; a caller that injects none keeps the previous deferred behaviour.
785
- if (selfResolveClarifications.value && deps.selfResolveClarification) try {
786
- const resolution = await selfAnswerGoalDocumentClarifications(document, {
787
- path: 'ask', ask: input.askText, resolver: deps.selfResolveClarification,
788
- });
789
- if (resolution.newlyAnswered > 0) {
790
- (deps.writeGoalDocument ?? deps.writeFile)(effectiveGoalFile, resolution.document);
791
- document = resolution.document;
792
- }
793
- } catch (error) {
794
- deps.log('ask-clarify', { goalFile: effectiveGoalFile, reason: 'self-answer-failed', error: error instanceof Error ? error.message : String(error) }, 'warn');
795
- }
796
- const remaining = planClarificationIntake(document, false).pending;
797
- // 미답으로 남은 문항만 기존 답변 창구를 안내한다.
798
- deps.print(`[ask] ⑴b ⚠️ 미답 되묻기 ${remaining.length}건 — 저작은 그대로 간다 · 구현 전에 LLM 릴레이가 먼저 답하고, 못 하면 미답으로 진행한다 (사람을 기다리지 않는다)`);
799
- for (const item of remaining) {
800
- deps.print(`[ask] ❓ [${item.questionId}] ${item.question}`);
801
- item.options.forEach((option, index) => deps.print(`[ask] ${index}) ${option.label}`));
785
+ // Deferred and interactive entrances share the same per-question resolution policy used by
786
+ // direct goal authoring. In particular, never read from the TUI here: unresolved stays DEFERRED.
787
+ if (selfResolveClarifications.value && deps.selfResolveClarification) try {
788
+ const resolution = await selfAnswerGoalDocumentClarifications(document, {
789
+ path: 'ask', ask: input.askText, resolver: deps.selfResolveClarification,
790
+ });
791
+ if (resolution.newlyAnswered > 0) {
792
+ (deps.writeGoalDocument ?? deps.writeFile)(effectiveGoalFile, resolution.document);
793
+ document = resolution.document;
802
794
  }
803
- if (remaining.length > 0) {
804
- const goalArg = deps.relativeToCwd(effectiveGoalFile);
805
- deps.print(`[ask] ▶ 답하려면: elanous self clarify answer ${goalArg} <questionId> <옵션번호> (자유 답은 --other "<문장>")`);
806
- deps.print(`[ask] ▶ 답한 뒤 재저작: elanous self author --supersedes ${goalArg}`);
795
+ } catch (error) {
796
+ deps.log('ask-clarify', { goalFile: effectiveGoalFile, reason: 'self-answer-failed', error: error instanceof Error ? error.message : String(error) }, 'warn');
807
797
  }
808
- return effectiveGoalFile;
809
- }
810
- deps.print(`[ask] ⑴b 저작기가 ${pending.length}건 묻는다 — 빈 줄은 건너뛴다(그 건은 DEFERRED 로 남는다)`);
811
- let answeredCount = 0;
812
- let seedQuestionId = '';
813
- for (const item of pending) {
814
- deps.print(`\n[ask] ❓ ${item.question}`);
815
- item.options.forEach((option, index) => deps.print(` ${index}) ${option.label} — ${option.description}`));
816
- if (item.includeOther) deps.print(' (숫자 = 위 옵션 · 그 밖의 입력 = 자유 답 · 빈 줄 = 건너뜀)');
817
- const reply = deps.readClarification
818
- ? await deps.readClarification(item)
819
- : await deps.readLine(' > ');
820
- // ⛔ 「옵션인가 자유 답인가 · 빈 줄인가」 판정도 순수 seam 이 한다.
821
- const applied = applyClarificationReply(document, item, reply);
822
- if (!applied.answered) continue;
823
- document = applied.document;
824
- if (answeredCount === 0) seedQuestionId = item.questionId;
825
- answeredCount += 1;
826
- }
798
+ const remaining = planClarificationIntake(document, false).pending;
827
799
  deps.log('ask-clarify', {
828
- inputSource: input.inputSource, goalFile: effectiveGoalFile,
829
- pendingCount: pending.length, answeredCount, interactive: deps.isInteractive(),
830
- }, 'info');
831
- if (answeredCount === 0) {
832
- deps.print('[ask] ⑴b 답이 없다 — 그대로 간다(미답은 골에 DEFERRED 로 남는다)');
833
- return effectiveGoalFile;
834
- }
835
- deps.writeFile(effectiveGoalFile, document);
836
- deps.print(`[ask] ⑴b ${answeredCount}건 답함 — 그 답을 시드로 «재저작»한다`);
837
- // ⭐ `--from-clarification` 은 답한 것 «전부»를 시드로 가져간다(하나만 지목해도 된다).
838
- const reauthored = await deps.authorGoal([], {
839
- cwd: deps.cwd(),
840
- ...(input.groundingCwd === undefined ? {} : { groundingCwd: input.groundingCwd }),
841
- ...(input.authorGrade === undefined ? {} : { authorGrade: input.authorGrade }),
842
- fromClarification: `${deps.relativeToCwd(effectiveGoalFile)}#${seedQuestionId}`,
843
- reauthorFromAnsweredClarification: true,
844
- selfResolveClarifications: selfResolveClarifications.value,
845
- });
846
- const parentDocument = document;
847
- effectiveGoalFile = isAbsolutePath(reauthored.path) ? reauthored.path : resolvePath(deps.cwd(), reauthored.path);
848
- deps.print(`[ask] ⑴b 재저작됨: ${reauthored.path}`);
849
- // 재저작도 «같은 저작 진입점»이다 — 접지가 예산 초과로 끊기면 같은 결과 줄을 쓴다(조용히 넘기지 않는다).
850
- const reauthoredTimebox = reauthored.authored?.document === undefined
851
- ? null
852
- : readGoalAuthorGroundingTimebox(reauthored.authored.document);
853
- if (reauthoredTimebox !== null) {
854
- deps.print(formatGoalAuthorTimeboxResultLine(reauthored.path, reauthoredTimebox));
855
- deps.log('ask-author-timebox', {
856
- goalFile: reauthored.path,
857
- provenance: 'reauthor',
858
- outcome: 'NOT-GROUNDED',
859
- budgetMs: reauthoredTimebox.budgetMs,
860
- elapsedMs: reauthoredTimebox.elapsedMs,
861
- grounded: reauthored.authored?.grounded ?? null,
862
- }, 'warn');
863
- // ⛔⭐⭐ 재저작 NOT-GROUNDED 도 «끝»이다 — 결과 줄을 쓰고 되묻기 이후 단계로 지나가지 않는다.
864
- observeFrontNodeExit({ node: 'author', outcome: 'not-grounded' }, {
865
- ...(input.runId === undefined ? {} : { runId: input.runId }),
866
- attempt: 1, goalFile: effectiveGoalFile,
867
- reason: `grounding-timebox-exhausted (budget ${reauthoredTimebox.budgetMs}ms, elapsed ${reauthoredTimebox.elapsedMs}ms)`,
868
- });
869
- return { kind: 'stopped-by-timebox', goalFile: effectiveGoalFile };
870
- }
871
- // ⛔ 「재저작이 «났다»」와 「재저작이 «옳았다»」는 다른 물음이다(JDG-T35 3단 ⑶).
872
- const childDocument = reauthored.authored?.document ?? deps.readFile(effectiveGoalFile);
873
- const askFidelity = classifyReauthoredAsk(parentDocument, childDocument);
874
- if (askFidelity !== 'preserved') {
875
- deps.print(`[ask] ⑴b ⚠️ 재저작 ask 판정: ${askFidelity} — ⛔ 「preserved」가 아니면 사람의 ask 가 살아남았는지 «확인하라»`);
800
+ goalFile: effectiveGoalFile, pendingCount: pending.length,
801
+ selfAnsweredCount: pending.length - remaining.length, unansweredCount: remaining.length,
802
+ interactive: deps.isInteractive(), continuedWithoutPrompt: true,
803
+ }, remaining.length ? 'warn' : 'info');
804
+ if (remaining.length > 0) {
805
+ deps.print(`[ask] ⑴b ⚠️ 미답 되묻기 ${remaining.length}건 — 골에 DEFERRED 로 기록하고 사람 입력을 기다리지 않고 진행한다`);
806
+ const goalFile = deps.relativeToCwd(effectiveGoalFile);
807
+ for (const item of remaining) {
808
+ deps.print(`[ask] ❓ [${item.questionId}] ${item.question} — DEFERRED`);
809
+ if (item.options.length > 0) {
810
+ deps.print(`[ask] 선택지 답변: elanous self clarify answer ${goalFile} ${item.questionId} <0-based-optionIndex>`);
811
+ }
812
+ if (item.includeOther) {
813
+ deps.print(`[ask] 자유 답변: elanous self clarify answer ${goalFile} ${item.questionId} --other "<답>"`);
814
+ }
815
+ deps.print(`[ask] 골을 다시 저작하려면: elanous self author --from-clarification ${goalFile}#${item.questionId}`);
816
+ }
817
+ } else {
818
+ deps.print(`[ask] ⑴b ${pending.length}건 자동 후보 선택 — 근거와 가정을 골에 기록했다`);
876
819
  }
877
- deps.log('ask-reauthored', {
878
- inputSource: input.inputSource, fromGoalFile: authored.path,
879
- goalFile: reauthored.path, answeredCount,
880
- grounded: reauthored.authored?.grounded ?? null,
881
- askFidelity,
882
- selfResolveClarifications: selfResolveClarifications.value,
883
- selfResolveClarificationsSource: selfResolveClarifications.source,
884
- }, 'info');
885
820
  return effectiveGoalFile;
886
821
  }
887
822
 
@@ -943,25 +878,32 @@ export async function runAskLaunchFlow(
943
878
  // ⛔ 선언이 «없을 때» 넘기면 안 된다 — 저작기의 정식 기본값을 덮어쓰게 된다.
944
879
  const declaredAskGoalType = declaredGoalType(input.askText);
945
880
  const goalType = input.goalType ?? declaredAskGoalType;
881
+ const frontRunId = input.runId ?? process.env.ELANOUS_RUN_ID;
946
882
  const frontObservation = {
947
- ...(input.runId === undefined ? {} : { runId: input.runId }),
883
+ ...(frontRunId === undefined ? {} : { runId: frontRunId }),
948
884
  ...(goalType === null ? {} : { goalType }),
949
885
  };
950
886
  // ⭐ RFC §5 5단계 — 확인된 implement 저작만 활성 구현 그래프에 이름을 잇는다.
951
887
  observeFrontNodeEntry('author', { ...frontObservation, provenance: 'authoring-start' });
952
- const authored = await deps.authorGoal([authorAskText], {
953
- cwd: deps.cwd(),
954
- ...(input.groundingCwd === undefined ? {} : { groundingCwd: input.groundingCwd }),
955
- ...(input.authorGrade === undefined ? {} : { authorGrade: input.authorGrade }),
888
+ const authored = await runFrontNodeUnit({
889
+ node: 'author',
890
+ execute: (text, context) => deps.authorGoal([text], {
891
+ cwd: deps.cwd(),
892
+ ...(input.groundingCwd === undefined ? {} : { groundingCwd: input.groundingCwd }),
893
+ ...(input.authorGrade === undefined ? {} : { authorGrade: input.authorGrade }),
894
+ ...(context.goalType === undefined ? {} : { goalType: context.goalType }),
895
+ // ⛔ 인라인 ask(`harness say`)는 askFile 이 없다 — 그 칸을 넘기면 저작기가 빈 줄을 쓴다.
896
+ ...(() => {
897
+ if (input.inputSource !== 'ask' || input.askFile === undefined) return {};
898
+ const askFile = lineageAskFile(input.askFile);
899
+ return askFile === undefined ? {} : { askFile };
900
+ })(),
901
+ ...(launchPreflight === undefined ? {} : { launchPreflight }),
902
+ selfResolveClarifications: selfResolveClarifications.value,
903
+ }),
904
+ }, authorAskText, {
905
+ ...(frontRunId === undefined ? {} : { runId: frontRunId }),
956
906
  ...(goalType === null ? {} : { goalType }),
957
- // ⛔ 인라인 ask(`harness say`)는 askFile 이 없다 — 그 칸을 넘기면 저작기가 빈 줄을 쓴다.
958
- ...(() => {
959
- if (input.inputSource !== 'ask' || input.askFile === undefined) return {};
960
- const askFile = lineageAskFile(input.askFile);
961
- return askFile === undefined ? {} : { askFile };
962
- })(),
963
- ...(launchPreflight === undefined ? {} : { launchPreflight }),
964
- selfResolveClarifications: selfResolveClarifications.value,
965
907
  }).catch((error: unknown) => {
966
908
  // GRAPH-AUTHOR-FAIL-EDGE: 저작기가 던진 자리 = author `fail` 출구. ⛔ 관측만 하고 같은 오류를 그대로 다시 던진다.
967
909
  observeFrontNodeExit({ node: 'author', outcome: 'fail' }, {
@@ -25,8 +25,7 @@ import { inspectDecisionObservations, inspectDecisionSignalKinds, inspectDecisio
25
25
  import type { EvidenceMode } from '../agent-mission/driver.js';
26
26
  import type { PreparedDevWorktree } from '../harness/harness-worktree-auto.js';
27
27
  import type { ChildLlmEffort, ChildLlmSelection } from '../agent/run-context.js';
28
- import { reasoningEffortCeiling } from '../intelligence-map/model-catalog.js';
29
- import type { ReasoningEffortCeiling } from '../intelligence-map/model-catalog.js';
28
+ import { reasoningEffortCeiling, childLlmEffortProblem, type ReasoningEffortCeiling } from '../intelligence-map/model-catalog.js';
30
29
  import { tierModel } from '../llm/model-defaults.js';
31
30
  import { LLM_TIER_MAP_BY_PROVIDER } from '../model-tier/llm-tier-map.js';
32
31
  import { MODEL_TIERS } from '../model-tier/types.js';
@@ -225,6 +224,10 @@ export interface DevSelfRunSuperviseOptions {
225
224
  queryTerminalRunStatuses?: (runIds: readonly string[], timeoutMs: number) => Readonly<Record<string, string>> | undefined;
226
225
  nowMs?: () => number;
227
226
  printDecision?: (line: string) => void;
227
+ /** Test-only supervisor side-effect seams. */
228
+ taskAgentShadow?: false;
229
+ taskAgentRejudge?: false;
230
+ sweepPendingMerges?: typeof import('../self-implement/frozen-merges.js').sweepFrozenMerges;
228
231
  }
229
232
 
230
233
  export interface DevSelfRunExecution {
@@ -1047,8 +1050,11 @@ export async function executeDevSelfRun(
1047
1050
  executedRounds = 1;
1048
1051
  if (!supervise) return { result };
1049
1052
 
1050
- const asSupervisorJobResult = (currentFeature: string, current: SelfImplementResult) => singleRunAsJobResult(currentFeature, current);
1051
- const initialJob = singleRunAsJobResult(feature, result);
1053
+ const reasonRepairEnabled = getUserConfig().tools.selfImplement.supervisor?.reasonRepair === true
1054
+ && supervise.executePiece !== undefined;
1055
+ const asSupervisorJobResult = (currentFeature: string, current: SelfImplementResult) =>
1056
+ singleRunAsJobResult(currentFeature, current, reasonRepairEnabled);
1057
+ const initialJob = singleRunAsJobResult(feature, result, reasonRepairEnabled);
1052
1058
  const wiring = supervise.deliverableDocument === undefined
1053
1059
  ? undefined
1054
1060
  : buildDeliverableTargets(supervise.deliverableDocument, ['single'], 'all', '127.0.0.1');
@@ -1113,9 +1119,15 @@ export async function executeDevSelfRun(
1113
1119
  }
1114
1120
  await superviseRun({
1115
1121
  initial: [initialJob],
1122
+ ...(supervise.taskAgentShadow === false ? { taskAgentShadow: false } : {}),
1123
+ ...(supervise.taskAgentRejudge === false ? { taskAgentRejudge: false } : {}),
1124
+ ...(supervise.sweepPendingMerges ? { sweepPendingMerges: supervise.sweepPendingMerges } : {}),
1125
+ // Pod worktree paths are not necessarily mounted in this parent process.
1126
+ knowhowRepo: process.cwd(),
1116
1127
  // A review-oscillation repair goal runs through the existing piece executor (fragment re-execution with the
1117
1128
  // authored goal as its feature). Without that executor the rerun could only replay the same goal — declare false.
1118
1129
  repairGoalExecution: supervise.executePiece !== undefined,
1130
+ needsHumanReasonRepairExecution: reasonRepairEnabled,
1119
1131
  enrich: (results) => hydrateDevGoalCauseObserved(
1120
1132
  hydrateDevDecomposeProposals(results, supervise.readProposals ?? readDecomposeProposals),
1121
1133
  ),
@@ -1576,7 +1588,7 @@ export function __resetStaleOpenRouterSnapshotWarningForTests(): void {
1576
1588
  staleOpenRouterSnapshotWarned = false;
1577
1589
  }
1578
1590
 
1579
- export const CHILD_LLM_EFFORT_LADDER = ['minimal', 'low', 'medium', 'high', 'xhigh', 'max'] as const;
1591
+ export { CHILD_LLM_EFFORT_LADDER } from '../intelligence-map/model-catalog.js';
1580
1592
 
1581
1593
  export function childLlmEffortCeiling(_provider: string, model: string): ReasoningEffortCeiling {
1582
1594
  return reasoningEffortCeiling(resolveModelAlias(model.trim()) ?? model.trim());
@@ -1586,20 +1598,10 @@ export function resolveChildLlmEffort(
1586
1598
  provider: string, model: string, entered: string,
1587
1599
  ): { effort: ChildLlmEffort; ceiling: ReasoningEffortCeiling } {
1588
1600
  const value = entered.trim().toLowerCase();
1589
- const ladder: readonly string[] = CHILD_LLM_EFFORT_LADDER;
1590
- if (!ladder.includes(value)) {
1591
- throw new DevPipelineError(`--child-llm-effort 알 수 없음: ${entered} · 후보: ${CHILD_LLM_EFFORT_LADDER.join(', ')}`);
1592
- }
1601
+ const problem = childLlmEffortProblem(model, entered);
1602
+ if (problem) throw new DevPipelineError(problem);
1593
1603
  const effort = value as ChildLlmEffort;
1594
1604
  const ceiling = childLlmEffortCeiling(provider, model);
1595
- if (ceiling === 'none') {
1596
- throw new DevPipelineError(`--child-llm-effort 거부: ${model} 은 추론 노력을 «안 받는다»(ceiling=none)`);
1597
- }
1598
- if (ladder.indexOf(effort) > ladder.indexOf(ceiling)) {
1599
- throw new DevPipelineError(
1600
- `--child-llm-effort 거부: ${effort} 가 ${model} 의 상한(${ceiling})을 넘는다`,
1601
- );
1602
- }
1603
1605
  return { effort, ceiling };
1604
1606
  }
1605
1607