elanous 0.2.37 → 0.2.38

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 (588) 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/{8kITumG9GAZ1LwT9POrAR → RrjXTwz-urRAbChP1bX02}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{2002-a43a3f380df873ec.js → 1026-44010f405704050c.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1118.a8a74ea29aac3e46.js +27 -0
  6. package/apps/pwa/out/_next/static/chunks/1204-2aa830479adf80f4.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1341-43b7d2dc77d45c9d.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1440-c3ea8882badfd9bf.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/{7424.c0fe2a595d4232b5.js → 1632.7d87f998e714bede.js} +1 -1
  10. package/apps/pwa/out/_next/static/chunks/1698-9c11cbf97f13717e.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1770-3b1fc92253ef9f2f.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/{4937-28d437999b77c9dd.js → 1923-5c1695332240246a.js} +1 -1
  13. package/apps/pwa/out/_next/static/chunks/1938.0e6c60ee91c4d7f5.js +148 -0
  14. package/apps/pwa/out/_next/static/chunks/2104.70e086d5174a4736.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/213-20675f20673ba22a.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/214.186a430da28338f1.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/2277.3bd4c0ac7f1b5996.js +93 -0
  18. package/apps/pwa/out/_next/static/chunks/240.e09f433f71c78ff4.js +104 -0
  19. package/apps/pwa/out/_next/static/chunks/{3199.6a1a9b0e6cd01dc6.js → 2415.738b777642a02233.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/2417.02151393605a7cd0.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/2463.cd2641a76daaa9ff.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2576.b9e9c629c4b84c52.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/265-c021de53f0865bd9.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/2998-b1cc13956cd6a6e7.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2e4782d3.ba2f0ab2b63a53e7.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/{1262.a89bb27a5b2f844e.js → 3086.fb14b60ce98b53d3.js} +1 -1
  27. package/apps/pwa/out/_next/static/chunks/3124-561f7f037943cde2.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/3130.626b54382b4dc379.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/3221-1bb3f99a55088613.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/3280.24edb1ffd03a7f3f.js +24 -0
  31. package/apps/pwa/out/_next/static/chunks/3288-eb3c22a1cbf2ae68.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/{2283.edd9627b7bdfb546.js → 3291.f6c1005387d514bd.js} +2 -2
  33. package/apps/pwa/out/_next/static/chunks/33.ef99e8374f96c6c4.js +36 -0
  34. package/apps/pwa/out/_next/static/chunks/{6877-84d47b7e85d0c41e.js → 3341-f09b9efbd7a82f70.js} +1 -1
  35. package/apps/pwa/out/_next/static/chunks/3389.012c70767a872f9b.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/3410-d7c0f14b329d6fda.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/3421.c87d6313a7d670f7.js +287 -0
  38. package/apps/pwa/out/_next/static/chunks/3422-83a3953f9bd67e26.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/{6680.6a693c28aae4cd19.js → 3528.e4b8ab70d339f965.js} +1 -1
  40. package/apps/pwa/out/_next/static/chunks/3587-002e24e368c515a9.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3644.f12a7d821ab940af.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3660.d7516588e2d875c3.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3695.b82e2610f4cd4ea9.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3858.ca1f5bc0f577eac9.js +94 -0
  45. package/apps/pwa/out/_next/static/chunks/3959-e6ac4a139d9d4bcc.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/3f0de3de-2340c532c00395db.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4032.53f62176514ec0ea.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4199-f7c6eb40cd0322f8.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4204-ef8484cbecd5d62f.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/4259-163129ca79913c4b.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/428-eaa77df3d0c85969.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/4432-97e400ffa1e161f5.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/449-aa427cf2cbb75f50.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/4491-39a0fd32bbaf3840.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/4588.b7cf06d382953979.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/4690.70ec8060825366ab.js +32 -0
  57. package/apps/pwa/out/_next/static/chunks/{4036.d54e55e1ebf5acdc.js → 4804.6012b5cd33c22792.js} +2 -2
  58. package/apps/pwa/out/_next/static/chunks/4881.e4d22d730e3b9df5.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/4937.ce2e340dc29cad3e.js +79 -0
  60. package/apps/pwa/out/_next/static/chunks/5-bb1c08d84bd71df3.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5005.de98df23b37cdf3c.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/5035.dc64a89cad5573cc.js +74 -0
  63. package/apps/pwa/out/_next/static/chunks/5041-5aada92ca215ffdd.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{6819.be5c9c4d67f22922.js → 5203.51e5d8b5f1dcfe53.js} +16 -16
  65. package/apps/pwa/out/_next/static/chunks/5207.1a224035455790fd.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/{757-4fbaf50942b8c424.js → 5255-1b60d50eabe9f057.js} +1 -1
  67. package/apps/pwa/out/_next/static/chunks/5269.d0436ee6d773382a.js +286 -0
  68. package/apps/pwa/out/_next/static/chunks/5300.677c97e0393742e6.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/{7867.e8725745ddd1d940.js → 5307.d7328020227880c2.js} +4 -4
  70. package/apps/pwa/out/_next/static/chunks/5309.3367c4d50f52b489.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/552-689827d49780fa00.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/5539.34cc9d60622cb69b.js +8 -0
  73. package/apps/pwa/out/_next/static/chunks/5568.218dea0c00ca2ec7.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/{5046.7fd5cbd859299448.js → 5638.107314dc479e2f37.js} +1 -1
  75. package/apps/pwa/out/_next/static/chunks/5645.b7e3b055455a04ea.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/5662.18cc0f30353cbd96.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/5671.da24fc9dc5e98325.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/5b141171.324c40fd49cb6821.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6142.913b44e260a3f925.js +64 -0
  80. package/apps/pwa/out/_next/static/chunks/6175-d4621f6a10b0cfab.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/6290.3eb53a20746b72ce.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/6415-9307f3eafa90837f.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/6493.27ad77de7aac7966.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/6579-3de35d00aacd71b5.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/680-2f324c4e039a5b67.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/6845-331b3c7481da3ba3.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/{1224.2ceca6c180d5130b.js → 7000.28157393caaf5343.js} +1 -1
  88. package/apps/pwa/out/_next/static/chunks/{6745-5a63492933959dd9.js → 7161-8f22db3ec5ed005e.js} +3 -3
  89. package/apps/pwa/out/_next/static/chunks/{2479-fe7e188bd9402d14.js → 7311-60a7ea80d23c7521.js} +1 -1
  90. package/apps/pwa/out/_next/static/chunks/7401.525d0a12f7d02c06.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7438.c2cf72b66dca6aa4.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/{5952.294fc574a8625184.js → 7488.966b116789f3d41a.js} +1 -1
  93. package/apps/pwa/out/_next/static/chunks/7524.ce973525d30b3d52.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7573.2376e13c9c21f1f8.js +77 -0
  95. package/apps/pwa/out/_next/static/chunks/7577.ea6e9ac72e035520.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/{6252.240578f10952e091.js → 7628.6b16863ac3972333.js} +1 -1
  97. package/apps/pwa/out/_next/static/chunks/7657.8d1fb3d2f7ebe273.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7903-1435d5d2f0dd7807.js +1 -0
  99. package/apps/pwa/out/_next/static/chunks/{1746.3563617ea64023a3.js → 7954.4f7a8832663ee979.js} +1 -1
  100. package/apps/pwa/out/_next/static/chunks/7978-30a91192c5dbe3c2.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/{4931.95cc6dbd230774ca.js → 8019.21ca554a821dad01.js} +16 -16
  102. package/apps/pwa/out/_next/static/chunks/8025-8795821525cf1a07.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8191.3674a00f0b565c23.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/8217-604955d8885c5ef2.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/8298-eed6f5f2585a63f4.js +1 -0
  106. package/apps/pwa/out/_next/static/chunks/{2375.bf364c85dbb6f085.js → 8487.291666583bebe640.js} +1 -1
  107. package/apps/pwa/out/_next/static/chunks/8509.3a54d4e61893d7cb.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/8758.ac421f726a189125.js +1 -0
  109. package/apps/pwa/out/_next/static/chunks/{4383.18e5c54db3a22c88.js → 8879.ac06755bcf3e44a1.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/891.d6c723a51a067b36.js +149 -0
  111. package/apps/pwa/out/_next/static/chunks/{9151.a2c51e93f9156dae.js → 8911.bf5e712acb25fb6c.js} +1 -1
  112. package/apps/pwa/out/_next/static/chunks/{58edce7d.f1b0c72acf13b123.js → 8994d93e.33ba491f95345fc2.js} +1 -1
  113. package/apps/pwa/out/_next/static/chunks/{5f6af561-f90b7a67f4f75d13.js → 89d6c04f-6b8ab341748e468a.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/9223.cbcc88e0e9950426.js +41 -0
  115. package/apps/pwa/out/_next/static/chunks/9299.24e2a7d9b6d1f91b.js +226 -0
  116. package/apps/pwa/out/_next/static/chunks/9317.6a9869039c231bb3.js +24 -0
  117. package/apps/pwa/out/_next/static/chunks/9383.e4755f275b3c11ff.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9581.da63ddf41acfad46.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9715.8c5529a0a5c41a36.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9817.3009d65f0889ef1f.js +2 -0
  121. package/apps/pwa/out/_next/static/chunks/{de8446d3.31b73eb239fecd7b.js → 9fe1b809.738da85c8b17e3fb.js} +1 -1
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-76873dd80da4f715.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ed32b6ec5dea8f23.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-fdd40e15babf3d25.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-384efc78e85e400b.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-866aac5ff226a7f3.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-d91809c5aeed319a.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-128f3522f89a81ab.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-595961abf3b43ad1.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-f41dccb76d8c0263.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-a3205c2e28b7d0d9.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-c39a80277814a3f4.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1ab3f98194513195.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-a5246f7e254d77d0.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-0f92287bdb81217d.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-5a37131ff63793ef.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-76873dd80da4f715.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-ac4bd14bb2348bfd.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/{page-5c112c6d7c33656e.js → page-c348a3959c5b5fc6.js} +1 -1
  140. package/apps/pwa/out/_next/static/chunks/app/layout-2addd81c0d3e2906.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-da6b765f58a3eefb.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0661e40f8780c32c.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-b89af1b1c8e4875b.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-da8aeb82ba751cdb.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-cc71317b239439db.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/page-bde7fc1d64ffe369.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-e2797214f713fa58.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-2a35bcda70defaf6.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3af03deedde45032.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-88a1edbff62eaf1d.js → page-d1d1210f99f620ae.js} +1 -1
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-46d1b5500885861d.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-291ab19fe2acb173.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/{page-b9af2ac1c4737ce8.js → page-7f569e533ddeecba.js} +1 -1
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-990129c9fee46d8f.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-7737f785ebb1cdaf.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f3c73a4f7ffd2f8.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-03be7fb347f01058.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-96b0280625e4df2b.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-56855545049eb56d.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-76873dd80da4f715.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-79a909c9981f0338.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/{page-fb9e639c107f5f72.js → page-a9d9a3e66459c1e0.js} +1 -1
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c383cbf2013f7069.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f57c6a2e54dbdca4.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-6b140f77593576eb.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-6b767ae2d9d0adfc.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-116d6198d5da0e3d.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-b9c9b778c7501370.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-a6c78392ab8f6335.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-455183deb4ed0cfe.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6a63e99526bd63d0.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-31c22caafe788c08.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/{709a918c.4fd3b4e2a32cb4e3.js → b7459770.6539b11860eb8a9c.js} +7 -7
  174. package/apps/pwa/out/_next/static/chunks/{d9815f84.4918f682a45a8502.js → b7478fef.5917716286213fcc.js} +3 -3
  175. package/apps/pwa/out/_next/static/chunks/{4337e36d.f42c3b391b3d8f20.js → bb6987f9.3647e1a23b0e3217.js} +1 -1
  176. package/apps/pwa/out/_next/static/chunks/de8b930d.d94c0f42acf807fc.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/{8c58d09b.e8724a299658d86f.js → eaad0cba.771200940c529df7.js} +1 -1
  178. package/apps/pwa/out/_next/static/chunks/framework-4b12a946f352cee2.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-941155250ed2644b.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-f8b6765abed6d149.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-78432194c85388f9.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-cdf7390829512b1b.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-d5f0964a9c2e92d2.js +1 -0
  184. package/apps/pwa/out/approvals/index.html +1 -1
  185. package/apps/pwa/out/approvals/index.txt +22 -22
  186. package/apps/pwa/out/autopilot/index.html +1 -1
  187. package/apps/pwa/out/autopilot/index.txt +22 -22
  188. package/apps/pwa/out/board/index.html +1 -1
  189. package/apps/pwa/out/board/index.txt +22 -22
  190. package/apps/pwa/out/botlab/index.html +1 -1
  191. package/apps/pwa/out/botlab/index.txt +21 -21
  192. package/apps/pwa/out/bots/index.html +1 -1
  193. package/apps/pwa/out/bots/index.txt +21 -21
  194. package/apps/pwa/out/ceo/index.html +1 -1
  195. package/apps/pwa/out/ceo/index.txt +22 -22
  196. package/apps/pwa/out/chat/index.html +1 -1
  197. package/apps/pwa/out/chat/index.txt +21 -21
  198. package/apps/pwa/out/consult/index.html +1 -1
  199. package/apps/pwa/out/consult/index.txt +22 -22
  200. package/apps/pwa/out/control/index.html +1 -1
  201. package/apps/pwa/out/control/index.txt +22 -22
  202. package/apps/pwa/out/decisions/index.html +1 -1
  203. package/apps/pwa/out/decisions/index.txt +21 -21
  204. package/apps/pwa/out/design-check/index.html +1 -1
  205. package/apps/pwa/out/design-check/index.txt +22 -22
  206. package/apps/pwa/out/editor/index.html +1 -1
  207. package/apps/pwa/out/editor/index.txt +22 -22
  208. package/apps/pwa/out/exec/index.html +1 -1
  209. package/apps/pwa/out/exec/index.txt +22 -22
  210. package/apps/pwa/out/field/index.html +1 -1
  211. package/apps/pwa/out/field/index.txt +22 -22
  212. package/apps/pwa/out/healthz +1 -1
  213. package/apps/pwa/out/index.html +1 -1
  214. package/apps/pwa/out/index.txt +21 -21
  215. package/apps/pwa/out/inside/index.html +1 -1
  216. package/apps/pwa/out/inside/index.txt +21 -21
  217. package/apps/pwa/out/intake/index.html +1 -1
  218. package/apps/pwa/out/intake/index.txt +22 -22
  219. package/apps/pwa/out/live/index.html +1 -1
  220. package/apps/pwa/out/live/index.txt +22 -22
  221. package/apps/pwa/out/live-run/index.html +1 -1
  222. package/apps/pwa/out/live-run/index.txt +22 -22
  223. package/apps/pwa/out/loops/index.html +1 -1
  224. package/apps/pwa/out/loops/index.txt +21 -21
  225. package/apps/pwa/out/market/index.html +1 -1
  226. package/apps/pwa/out/market/index.txt +21 -21
  227. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  228. package/apps/pwa/out/missions/placeholder/index.txt +21 -21
  229. package/apps/pwa/out/morning/index.html +1 -1
  230. package/apps/pwa/out/morning/index.txt +22 -22
  231. package/apps/pwa/out/observatory/index.html +1 -1
  232. package/apps/pwa/out/observatory/index.txt +22 -22
  233. package/apps/pwa/out/ops/checklist/index.html +1 -1
  234. package/apps/pwa/out/ops/checklist/index.txt +21 -21
  235. package/apps/pwa/out/ops/release/index.html +1 -1
  236. package/apps/pwa/out/ops/release/index.txt +21 -21
  237. package/apps/pwa/out/ops/seats/index.html +1 -1
  238. package/apps/pwa/out/ops/seats/index.txt +21 -21
  239. package/apps/pwa/out/outputs/index.html +1 -1
  240. package/apps/pwa/out/outputs/index.txt +21 -21
  241. package/apps/pwa/out/reflection/index.html +1 -1
  242. package/apps/pwa/out/reflection/index.txt +22 -22
  243. package/apps/pwa/out/scheduler/index.html +1 -1
  244. package/apps/pwa/out/scheduler/index.txt +22 -22
  245. package/apps/pwa/out/sessions/index.html +1 -1
  246. package/apps/pwa/out/sessions/index.txt +21 -21
  247. package/apps/pwa/out/settings/devices/index.html +1 -1
  248. package/apps/pwa/out/settings/devices/index.txt +22 -22
  249. package/apps/pwa/out/settings/index.html +1 -1
  250. package/apps/pwa/out/settings/index.txt +22 -22
  251. package/apps/pwa/out/setup/done/index.html +1 -1
  252. package/apps/pwa/out/setup/done/index.txt +22 -22
  253. package/apps/pwa/out/setup/index.html +1 -1
  254. package/apps/pwa/out/setup/index.txt +22 -22
  255. package/apps/pwa/out/share/index.html +1 -1
  256. package/apps/pwa/out/share/index.txt +22 -22
  257. package/apps/pwa/out/showroom/index.html +1 -1
  258. package/apps/pwa/out/showroom/index.txt +21 -21
  259. package/apps/pwa/out/tasks/index.html +1 -1
  260. package/apps/pwa/out/tasks/index.txt +22 -22
  261. package/apps/pwa/out/term/index.html +1 -1
  262. package/apps/pwa/out/term/index.txt +22 -22
  263. package/apps/pwa/out/today/index.html +1 -1
  264. package/apps/pwa/out/today/index.txt +22 -22
  265. package/apps/pwa/out/trace/index.html +1 -1
  266. package/apps/pwa/out/trace/index.txt +22 -22
  267. package/apps/pwa/out/vault/index.html +1 -1
  268. package/apps/pwa/out/vault/index.txt +22 -22
  269. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  270. package/apps/pwa/out/workflows/chat-ui/index.txt +22 -22
  271. package/apps/pwa/out/workflows/index.html +1 -1
  272. package/apps/pwa/out/workflows/index.txt +22 -22
  273. package/apps/pwa/out/workspace/index.html +1 -1
  274. package/apps/pwa/out/workspace/index.txt +22 -22
  275. package/apps/pwa/out/worktrees/index.html +1 -1
  276. package/apps/pwa/out/worktrees/index.txt +22 -22
  277. package/graphs/release/recipes.yaml +9 -0
  278. package/graphs/release/release-loop.yaml +26 -18
  279. package/package.json +1 -1
  280. package/scripts/ask-op-inbox-once.ts +17 -0
  281. package/scripts/brand/check.ts +13 -4
  282. package/scripts/gate-0226-accepted-remaining-90.txt +91 -0
  283. package/scripts/gate-0226-failure-census.ts +39 -0
  284. package/scripts/intake-collect-telegram-saved-stage.ts +48 -0
  285. package/scripts/provision-export-redactions.ts +15 -0
  286. package/scripts/public-copy-lint.ts +122 -0
  287. package/scripts/public-export.ts +69 -2
  288. package/scripts/ratchets/next-tui-entry-budget.ts +124 -0
  289. package/scripts/ratchets/train-side-invariants.sh +7 -1
  290. package/scripts/release-loop/cut-branch.ts +61 -12
  291. package/scripts/release-loop/gate-node.ts +161 -25
  292. package/scripts/release-loop/gate-partial.ts +82 -3
  293. package/scripts/release-loop/gate-prewarm-plan.ts +35 -0
  294. package/scripts/release-loop/gate-radius-live.ts +4 -2
  295. package/scripts/release-loop/resume-cap.ts +2 -1
  296. package/scripts/release-loop/resume-release.ts +297 -8
  297. package/scripts/release-loop/resume.ts +13 -5
  298. package/scripts/release-loop/traffic-node.ts +12 -4
  299. package/scripts/release-loop/traffic-transition.ts +53 -13
  300. package/scripts/release-loop/version-node.ts +29 -4
  301. package/scripts/ux-sim.ts +1 -1
  302. package/scripts/video-pipeline.ts +2 -2
  303. package/src/acp/core-turn-bridge.ts +6 -1
  304. package/src/agent/run-context.ts +1 -1
  305. package/src/agent/task-notification.ts +3 -1
  306. package/src/agent-substrate/review-observation.ts +10 -0
  307. package/src/agent-substrate/self-review-cli.ts +195 -27
  308. package/src/auto-research/question-ladder-contract.ts +137 -0
  309. package/src/auto-research/research-turn.ts +134 -0
  310. package/src/autopilot/discovery/doc-lint.ts +1 -1
  311. package/src/bots/screen-probe.ts +1 -1
  312. package/src/capture/tui-self-report.ts +10 -2
  313. package/src/chat/index.ts +1 -0
  314. package/src/chat/tool-render/dispatch.ts +8 -1
  315. package/src/cli/guardian-cli.ts +3 -1
  316. package/src/cli/intake-cli.ts +48 -12
  317. package/src/cli/lesson-cli.ts +69 -9
  318. package/src/cli/pr-land-overlap-evidence.ts +38 -5
  319. package/src/cli/pr-land-refusal.ts +1 -1
  320. package/src/cli/pty-takeover-cli.ts +58 -5
  321. package/src/cli/release-checklist-read-cli.ts +5 -2
  322. package/src/cli/release-cli.ts +47 -9
  323. package/src/cli/review-carry.ts +77 -0
  324. package/src/cli/self-update.ts +1 -1
  325. package/src/cli/tasks-card-show.ts +31 -1
  326. package/src/cli/tasks-cli.ts +62 -23
  327. package/src/cli/tasks-read-cli.ts +13 -5
  328. package/src/context-bus/context-now.ts +86 -2
  329. package/src/core-turn/run-core-turn.ts +9 -2
  330. package/src/core-turn/types.ts +3 -0
  331. package/src/dashboard/index.ts +18 -17
  332. package/src/dashboard/input/terminal-modal-router.ts +8 -159
  333. package/src/dashboard/side-basic-runtime.ts +61 -0
  334. package/src/dashboard/slash-runtime/dashboard-handlers.ts +2 -0
  335. package/src/dashboard/term-slash-runtime.ts +2 -0
  336. package/src/dashboard/turn-preamble.ts +28 -4
  337. package/src/domains/guardian-tick.ts +9 -0
  338. package/src/git-fs/watcher.ts +27 -22
  339. package/src/git-fs/worktree.ts +19 -3
  340. package/src/graph-runner/graph-grow.ts +37 -9
  341. package/src/graph-runner/runner.ts +17 -2
  342. package/src/grok/credential.ts +107 -36
  343. package/src/hq/fence-wrapper.ts +1 -1
  344. package/src/hq/transfer.ts +1 -1
  345. package/src/index.ts +44 -14
  346. package/src/intake-plane/collect-telegram-saved.ts +54 -5
  347. package/src/interactive-terminal-modal.ts +3 -0
  348. package/src/keybindings.ts +17 -22
  349. package/src/llm/provider-credentials.ts +1 -1
  350. package/src/llm-tool-schema.ts +20 -0
  351. package/src/llm.ts +81 -11
  352. package/src/loops/orchestrator/inbox-once.ts +28 -0
  353. package/src/loops/orchestrator/inbox.ts +130 -1
  354. package/src/loops/orchestrator/tick.ts +6 -3
  355. package/src/maturity/feature-maturity.ts +1 -0
  356. package/src/nexus/api/channel-ask-op.ts +96 -0
  357. package/src/nexus/api/discord-trigger-bot.ts +28 -1
  358. package/src/nexus/api/telegram-trigger-bot.ts +24 -0
  359. package/src/nexus/api/terminals.ts +28 -6
  360. package/src/patents/ledger.ts +18 -1
  361. package/src/preview/terminal.ts +4 -2
  362. package/src/prompt-cache/anthropic.ts +2 -0
  363. package/src/prompt-enhance/enhance.ts +5 -0
  364. package/src/pty-shell/pty-manifest.ts +16 -2
  365. package/src/release-loop/gate-shards.ts +61 -0
  366. package/src/release-loop/light-rc.ts +7 -4
  367. package/src/release-loop/rehearsal.ts +1 -1
  368. package/src/repl/index.ts +10 -0
  369. package/src/research/axis-fanout.ts +133 -0
  370. package/src/research/edge-decision.ts +88 -0
  371. package/src/research/output-router.ts +127 -0
  372. package/src/research-bridge/format.ts +16 -1
  373. package/src/research-bridge/index.ts +1 -0
  374. package/src/research-bridge/invoke.ts +41 -5
  375. package/src/self-dev/decompose.ts +45 -9
  376. package/src/self-dev/draft-residue.ts +221 -2
  377. package/src/self-dev/draft-sweep.ts +29 -16
  378. package/src/self-dev/orchestrate.ts +1 -0
  379. package/src/self-dev/run-supervisor.ts +22 -7
  380. package/src/self-dev/shard-run.ts +260 -3
  381. package/src/self-implement/comment-only-source.ts +54 -0
  382. package/src/self-implement/doctor-visit.ts +25 -0
  383. package/src/self-implement/gate-artifacts.ts +2 -2
  384. package/src/self-implement/gate-baseline.ts +44 -9
  385. package/src/self-implement/gate-cli.ts +151 -86
  386. package/src/self-implement/gate-failure-signature.ts +44 -0
  387. package/src/self-implement/gate-remote.ts +2 -0
  388. package/src/self-implement/goal-author.ts +74 -3
  389. package/src/self-implement/goal-doc/section.ts +22 -0
  390. package/src/self-implement/goal-supervisor-fill.ts +38 -4
  391. package/src/self-implement/knowhow-pack.ts +120 -7
  392. package/src/self-implement/l8-merge-queue.ts +198 -32
  393. package/src/self-implement/off-diff-evidence.ts +23 -0
  394. package/src/self-implement/orchestrator.ts +55 -12
  395. package/src/self-implement/pod-inplace-worktree.ts +82 -0
  396. package/src/self-implement/pod-warm-pool-profile.ts +2 -2
  397. package/src/self-implement/premise-review.ts +7 -5
  398. package/src/self-implement/run-ledger.ts +258 -0
  399. package/src/self-implement/seams.ts +33 -10
  400. package/src/self-implement/self-implement-cli.ts +26 -2
  401. package/src/session/channel-ask-op-envelope.ts +36 -0
  402. package/src/session/channel-op-reply-route.ts +200 -0
  403. package/src/session/chat.ts +3 -0
  404. package/src/session/index.ts +2 -0
  405. package/src/session-runtime/index.ts +9 -22
  406. package/src/skills/runner.ts +7 -3
  407. package/src/skills/tools/dev-harness.ts +2 -2
  408. package/src/skills/tools/schedule-wakeup.ts +1 -6
  409. package/src/status/bar.ts +3 -3
  410. package/src/storage/file-lock.ts +17 -4
  411. package/src/task-agent/adopt-pr.ts +63 -2
  412. package/src/task-agent/evidence-command-normalize.ts +42 -0
  413. package/src/task-agent/export-redactions-provision.ts +43 -0
  414. package/src/task-agent/parent-host.ts +59 -12
  415. package/src/task-agent/repair-cycle.ts +67 -8
  416. package/src/task-agent/repair-worker.ts +37 -1
  417. package/src/task-agent/task-hand.ts +98 -10
  418. package/src/task-agent/tier-split.ts +37 -3
  419. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +31 -4
  420. package/src/task-orchestrator/surfaces/pod-pool.ts +27 -4
  421. package/src/task-orchestrator/surfaces/self-implement-pod.ts +126 -48
  422. package/src/task-orchestrator/surfaces/self-implement.ts +33 -2
  423. package/src/terminal/session-registry.ts +1 -0
  424. package/src/terminal/terminal-modal-router.ts +156 -0
  425. package/src/tool-hints/gate.ts +6 -4
  426. package/src/tool-hints/signals.ts +33 -1
  427. package/src/tui/chat/background-job-status.ts +8 -2
  428. package/src/tui/entry.ts +469 -31
  429. package/src/tui/sidetab/attach.ts +304 -0
  430. package/src/tui/sidetab/list.ts +176 -0
  431. package/src/tui/sidetab/nl-tool.ts +136 -0
  432. package/src/tui/slash/resume-command.ts +23 -0
  433. package/src/tui/slash/resume.ts +3 -23
  434. package/src/tui/slash/term-next.ts +2 -1
  435. package/src/tui-client/local-chat-turn.ts +29 -8
  436. package/src/user-config.ts +11 -2
  437. package/src/ux-sim/fake-llm.ts +11 -5
  438. package/src/ux-sim/next-tui-seat-scenarios.ts +53 -1
  439. package/src/version/packed-revision.json +1 -1
  440. package/apps/pwa/out/_next/static/chunks/1041-5841aae848fb6403.js +0 -1
  441. package/apps/pwa/out/_next/static/chunks/1087.3177e54f672dc526.js +0 -1
  442. package/apps/pwa/out/_next/static/chunks/1105.efe1e13503ac7a33.js +0 -1
  443. package/apps/pwa/out/_next/static/chunks/1417-1768233ac92f8a5d.js +0 -1
  444. package/apps/pwa/out/_next/static/chunks/1612.81bbc19af06af16c.js +0 -1
  445. package/apps/pwa/out/_next/static/chunks/1766.728d42053070bb2d.js +0 -1
  446. package/apps/pwa/out/_next/static/chunks/1773.d38e945481e04125.js +0 -1
  447. package/apps/pwa/out/_next/static/chunks/1974-c12f9600da3d3c26.js +0 -1
  448. package/apps/pwa/out/_next/static/chunks/1ed5e8af.cf424815c7c0efad.js +0 -1
  449. package/apps/pwa/out/_next/static/chunks/2061.7232dc9dc058417f.js +0 -1
  450. package/apps/pwa/out/_next/static/chunks/210.90b2cbd64926cf34.js +0 -32
  451. package/apps/pwa/out/_next/static/chunks/2318-450e75d07605b8fe.js +0 -1
  452. package/apps/pwa/out/_next/static/chunks/244-a810d282a20f1783.js +0 -1
  453. package/apps/pwa/out/_next/static/chunks/2514.03b60f266531a015.js +0 -148
  454. package/apps/pwa/out/_next/static/chunks/2526-a657538869888604.js +0 -1
  455. package/apps/pwa/out/_next/static/chunks/2533-6f0341ff075809e9.js +0 -1
  456. package/apps/pwa/out/_next/static/chunks/2676.e7994c695ef0f30d.js +0 -1
  457. package/apps/pwa/out/_next/static/chunks/2734.3ffdf54254fb6f99.js +0 -27
  458. package/apps/pwa/out/_next/static/chunks/2770-23252bf3a37880b9.js +0 -1
  459. package/apps/pwa/out/_next/static/chunks/2969.66b8b545139d1544.js +0 -1
  460. package/apps/pwa/out/_next/static/chunks/3128.a9210d08800ea6a8.js +0 -1
  461. package/apps/pwa/out/_next/static/chunks/3212.12179fd3eee8cef1.js +0 -1
  462. package/apps/pwa/out/_next/static/chunks/3578.4e9f9948a9a6f2f4.js +0 -2
  463. package/apps/pwa/out/_next/static/chunks/3760-2909ddb9279281cd.js +0 -1
  464. package/apps/pwa/out/_next/static/chunks/3825.1921b5901bf33dce.js +0 -36
  465. package/apps/pwa/out/_next/static/chunks/3994-63eb884ed0547011.js +0 -1
  466. package/apps/pwa/out/_next/static/chunks/4115.5b438b99f0ae729f.js +0 -226
  467. package/apps/pwa/out/_next/static/chunks/4269.d8f9f34bb0fc6c43.js +0 -287
  468. package/apps/pwa/out/_next/static/chunks/431-4eed5bd2c5fe1719.js +0 -1
  469. package/apps/pwa/out/_next/static/chunks/4313.76f232c304a15bde.js +0 -1
  470. package/apps/pwa/out/_next/static/chunks/4324.c99ba3e83eb1b691.js +0 -1
  471. package/apps/pwa/out/_next/static/chunks/4599-96eff3f2a9c242c1.js +0 -1
  472. package/apps/pwa/out/_next/static/chunks/4725-34bed25720cc326b.js +0 -1
  473. package/apps/pwa/out/_next/static/chunks/4825-a9d9d4e9f5892309.js +0 -1
  474. package/apps/pwa/out/_next/static/chunks/4833-7934c592c5569f00.js +0 -1
  475. package/apps/pwa/out/_next/static/chunks/4879-68518f547a207aff.js +0 -1
  476. package/apps/pwa/out/_next/static/chunks/4896.f9b70285363b27b2.js +0 -24
  477. package/apps/pwa/out/_next/static/chunks/49aa54ab.80f39398e0ed0f30.js +0 -1
  478. package/apps/pwa/out/_next/static/chunks/5056.482687319b82638e.js +0 -104
  479. package/apps/pwa/out/_next/static/chunks/506.16b83d56a437a9ee.js +0 -1
  480. package/apps/pwa/out/_next/static/chunks/5260-20593b0a25d0afbc.js +0 -1
  481. package/apps/pwa/out/_next/static/chunks/5404.cc4e9fec26fd5925.js +0 -1
  482. package/apps/pwa/out/_next/static/chunks/576.485e83e3f3dec19a.js +0 -1
  483. package/apps/pwa/out/_next/static/chunks/5832-a6be14e663f65726.js +0 -1
  484. package/apps/pwa/out/_next/static/chunks/5854-56648a9fe646b9a0.js +0 -1
  485. package/apps/pwa/out/_next/static/chunks/5925.3b1f8b135710249b.js +0 -93
  486. package/apps/pwa/out/_next/static/chunks/6168.17749aa3905fa073.js +0 -74
  487. package/apps/pwa/out/_next/static/chunks/6416.5d50b8ec9986ca98.js +0 -1
  488. package/apps/pwa/out/_next/static/chunks/6758.e7fbf532953c0783.js +0 -1
  489. package/apps/pwa/out/_next/static/chunks/6795.0cb8a59730d99703.js +0 -149
  490. package/apps/pwa/out/_next/static/chunks/6971-fb5f9dc0a2cb5d2d.js +0 -1
  491. package/apps/pwa/out/_next/static/chunks/717.522b08685979b814.js +0 -1
  492. package/apps/pwa/out/_next/static/chunks/7191.e41eb8f455c7f089.js +0 -41
  493. package/apps/pwa/out/_next/static/chunks/7233.8e744b7513119409.js +0 -1
  494. package/apps/pwa/out/_next/static/chunks/7238-97c2226f80504bd8.js +0 -1
  495. package/apps/pwa/out/_next/static/chunks/7285.307963afcf7e7660.js +0 -24
  496. package/apps/pwa/out/_next/static/chunks/7299-fbe4b8c47a87614a.js +0 -1
  497. package/apps/pwa/out/_next/static/chunks/7314.df0d95930b0c3f50.js +0 -1
  498. package/apps/pwa/out/_next/static/chunks/7406.c0589fdf2ee66629.js +0 -1
  499. package/apps/pwa/out/_next/static/chunks/752-90e3e7daad3d8e39.js +0 -1
  500. package/apps/pwa/out/_next/static/chunks/7524-bcd3d9928c6842d9.js +0 -1
  501. package/apps/pwa/out/_next/static/chunks/7549.9a4de3bf231cfc52.js +0 -1
  502. package/apps/pwa/out/_next/static/chunks/765.76ae970ceb597b5b.js +0 -1
  503. package/apps/pwa/out/_next/static/chunks/7893-e444a1b0809cd1e4.js +0 -1
  504. package/apps/pwa/out/_next/static/chunks/7956-33748cabb3a05562.js +0 -1
  505. package/apps/pwa/out/_next/static/chunks/7c5ed21f-f286708e57cf88f7.js +0 -1
  506. package/apps/pwa/out/_next/static/chunks/8030-aa66b478b53dbfca.js +0 -1
  507. package/apps/pwa/out/_next/static/chunks/8051.c88c07dacbbc5f21.js +0 -8
  508. package/apps/pwa/out/_next/static/chunks/8080-40d781e7704d3671.js +0 -1
  509. package/apps/pwa/out/_next/static/chunks/8149.80e402d4345e8dae.js +0 -77
  510. package/apps/pwa/out/_next/static/chunks/8205.50a5268f4e12ba0b.js +0 -1
  511. package/apps/pwa/out/_next/static/chunks/8231.a128feaa6f8b6079.js +0 -1
  512. package/apps/pwa/out/_next/static/chunks/85.4ddb1dda2ea3ffa2.js +0 -286
  513. package/apps/pwa/out/_next/static/chunks/8537.26517a09e8247beb.js +0 -1
  514. package/apps/pwa/out/_next/static/chunks/8595-e9b7081ab773a61f.js +0 -1
  515. package/apps/pwa/out/_next/static/chunks/8821-30cc65a61a60951f.js +0 -1
  516. package/apps/pwa/out/_next/static/chunks/8905.b3385aadb7b133e6.js +0 -79
  517. package/apps/pwa/out/_next/static/chunks/8983.246bb3a1ac38f50f.js +0 -1
  518. package/apps/pwa/out/_next/static/chunks/9072.18342f5941a1f3ec.js +0 -1
  519. package/apps/pwa/out/_next/static/chunks/9123.9df04866b2d6e00f.js +0 -1
  520. package/apps/pwa/out/_next/static/chunks/9175-7d383df15a82e2be.js +0 -1
  521. package/apps/pwa/out/_next/static/chunks/9181-bf89c07ce5b8f599.js +0 -1
  522. package/apps/pwa/out/_next/static/chunks/920-429bbc4504b45f71.js +0 -1
  523. package/apps/pwa/out/_next/static/chunks/9207.625edf45d656151c.js +0 -1
  524. package/apps/pwa/out/_next/static/chunks/9378.d2575c6ffd6dd756.js +0 -94
  525. package/apps/pwa/out/_next/static/chunks/957.db5b5c4d32a35240.js +0 -1
  526. package/apps/pwa/out/_next/static/chunks/958.53a8dcf4729e6997.js +0 -64
  527. package/apps/pwa/out/_next/static/chunks/9647.8f0cd0898c592a29.js +0 -1
  528. package/apps/pwa/out/_next/static/chunks/9665-26abb02665704c2c.js +0 -1
  529. package/apps/pwa/out/_next/static/chunks/9703.e7d81b6faef1050a.js +0 -1
  530. package/apps/pwa/out/_next/static/chunks/9882-7a9164b3c2dacbe5.js +0 -1
  531. package/apps/pwa/out/_next/static/chunks/9998.b74e033efadecd10.js +0 -1
  532. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-c604fb980a634d88.js +0 -1
  533. package/apps/pwa/out/_next/static/chunks/app/approvals/page-ec2d8a4979ca9075.js +0 -1
  534. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-cb6add08ad3c7660.js +0 -1
  535. package/apps/pwa/out/_next/static/chunks/app/board/page-e2eaa321ec223fe6.js +0 -1
  536. package/apps/pwa/out/_next/static/chunks/app/botlab/page-5b8a09c475b5f844.js +0 -1
  537. package/apps/pwa/out/_next/static/chunks/app/bots/page-91a77daedfbac191.js +0 -1
  538. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f37fc5e974bda39b.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/app/chat/page-91429a0b78415a94.js +0 -1
  540. package/apps/pwa/out/_next/static/chunks/app/consult/page-b95798b58263b910.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/app/control/page-763d53e175e17aa1.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/app/decisions/page-d55023204055b12f.js +0 -1
  543. package/apps/pwa/out/_next/static/chunks/app/design-check/page-89d2140d78abc810.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/app/editor/page-82dc069abfe27f55.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/app/exec/page-25d9eee7beb552c0.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/app/field/page-770b4594c713ee97.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/app/healthz/route-c604fb980a634d88.js +0 -1
  548. package/apps/pwa/out/_next/static/chunks/app/inside/page-ba8e0dcae4f83985.js +0 -1
  549. package/apps/pwa/out/_next/static/chunks/app/layout-09788e1aa9a87db6.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/app/live/page-3337c6a1328c2674.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/app/live-run/page-89acd5d68c0bc560.js +0 -1
  552. package/apps/pwa/out/_next/static/chunks/app/loops/page-5c13e2c76371d797.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/app/market/page-653a9f18642825c6.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-fe986fe79b107546.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/app/morning/page-1e5da297557d2354.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/app/not-found-91ea9f5869a40943.js +0 -1
  557. package/apps/pwa/out/_next/static/chunks/app/observatory/page-7824e21b999962e2.js +0 -1
  558. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-53d00a60cc75a922.js +0 -1
  559. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4e931248b3f9574b.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/app/outputs/page-443364c9e4a23b31.js +0 -1
  561. package/apps/pwa/out/_next/static/chunks/app/reflection/page-25ab9c614c14129b.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-dbcdcfac0a395a8a.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/app/sessions/page-bf1de6645089ec58.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-c4201761a5e839c9.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/app/settings/page-c304f469ea5d70e4.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-8e5a238cf5e50c9c.js +0 -1
  567. package/apps/pwa/out/_next/static/chunks/app/setup/layout-c604fb980a634d88.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/app/setup/page-32b526069ee50b3c.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/app/showroom/page-84220c776608cedc.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/app/tasks/page-e475618cbfd5ca2b.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/app/term/page-ac2c1e6169cfce57.js +0 -1
  572. package/apps/pwa/out/_next/static/chunks/app/today/page-fccd3020af2f8806.js +0 -1
  573. package/apps/pwa/out/_next/static/chunks/app/trace/page-9c0d7198ff7b5a91.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/app/vault/page-d54b1ec9b9c6430d.js +0 -1
  575. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8c4bef1791d732ca.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/app/workflows/page-46fcc0b0bbc6fbfe.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/app/workspace/page-c1c80e345fa9d6f5.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-7dfda00afd172f5b.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/f21fd540.63ac75328926ed30.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/framework-77fdcc873519a6cd.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/main-app-d0d620d2ce235713.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/main-e0ef79c79337ba90.js +0 -1
  583. package/apps/pwa/out/_next/static/chunks/pages/_app-84b1bc71e3f9ce6a.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/pages/_error-2acb61f1363128cb.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/webpack-462ff5727ceb7824.js +0 -1
  586. package/scripts/migrate-monad-to-elanous.ts +0 -195
  587. package/scripts/rebrand-elanous.ts +0 -242
  588. /package/apps/pwa/out/_next/static/{8kITumG9GAZ1LwT9POrAR → RrjXTwz-urRAbChP1bX02}/_ssgManifest.js +0 -0
@@ -1,159 +1,8 @@
1
- // Dashboard key routing for interactive terminal modals.
2
- //
3
- // Holds singleton state for "which interactive terminal modal is
4
- // currently foregrounded" + the key-intercept policy:
5
- //
6
- // • while a modal is present, ESC / Ctrl-G dispose it
7
- // • all other keys forward to modal.surface.onKey(ev) so the PTY
8
- // receives them without the chat readKey loop trying to
9
- // interpret them
10
- //
11
- // Kept as a standalone module so the policy is unit-testable
12
- // without standing up the full dashboard. dashboard.ts imports and
13
- // wires it into the top of its stdin handler in a follow-up commit.
14
- //
15
- // P10 will extend this with Ctrl-B prefix handling (d=detach,
16
- // s=switch, etc.) once a session registry exists to act on.
17
-
18
- import type { InteractiveTerminalModalHandle } from '../../interactive-terminal-modal.js';
19
- import type { KeyEvent } from '../../display/types.js';
20
- import { debug } from '../../debug/log.js';
21
-
22
- export type KeyRouteResult = 'consumed' | 'passthrough' | 'closed';
23
-
24
- export interface TerminalModalRouter {
25
- current(): InteractiveTerminalModalHandle | null;
26
- /** Install a modal handle. Optional closePolicy controls what
27
- * ESC/Ctrl-G does: 'kill' disposes the modal + PTY (default);
28
- * 'detach' calls handle.dispose({keepPreview:true}) so the PTY
29
- * survives for re-attach (session registry flow). An explicit
30
- * onClose hook wins over closePolicy — that's how dashboard
31
- * wires sessionRegistry.detach(session.id) on Esc. */
32
- set(
33
- handle: InteractiveTerminalModalHandle | null,
34
- opts?: { closePolicy?: 'kill' | 'detach'; onClose?: () => void },
35
- ): void;
36
- close(): void;
37
- handleKey(ev: KeyEvent): KeyRouteResult;
38
- }
39
-
40
- // `exit` typed cleanly + Enter closes the popup. claude / codex don't
41
- // recognize plain `exit` (their command is /exit or /quit), so a user
42
- // typing `exit\n` would otherwise be stuck — the popup stays open
43
- // because the child never exits, and the typed text just becomes chat
44
- // input. elanous intercepts the exact sequence at the router so:
45
- // • plain shell: same end result (we close before shell evaluates)
46
- // • claude / codex: popup closes as the user expected
47
- // Sequence is reset on any non-letter key (other than backspace, which
48
- // rewinds), Ctrl/Alt modifiers, or any character outside `e/x/i/t` —
49
- // so genuine words containing "exit" (e.g. typing "exit this loop"
50
- // into a claude prompt without Enter) DON'T trigger the close. The
51
- // trigger is specifically `e`, `x`, `i`, `t`, Enter with nothing else.
52
- const EXIT_CHARS = ['e', 'x', 'i', 't'] as const;
53
-
54
- export function createTerminalModalRouter(): TerminalModalRouter {
55
- let handle: InteractiveTerminalModalHandle | null = null;
56
- let closePolicy: 'kill' | 'detach' = 'kill';
57
- let onClose: (() => void) | null = null;
58
- let exitProgress = 0; // how many of EXIT_CHARS have been typed in order
59
-
60
- const close = (): void => {
61
- if (!handle) return;
62
- const h = handle;
63
- const cb = onClose;
64
- if (debug.enabled) debug.log('window.terminalModalRouter.close', h.id, { id: h.id, closePolicy, hasOnClose: !!cb });
65
- handle = null;
66
- onClose = null;
67
- exitProgress = 0;
68
- try {
69
- if (cb) cb();
70
- else if (closePolicy === 'detach') h.dispose({ keepPreview: true });
71
- else h.dispose();
72
- } catch { /* already disposed */ }
73
- closePolicy = 'kill';
74
- };
75
-
76
- return {
77
- current: () => handle,
78
- set: (h, opts) => {
79
- if (handle && h && handle.id !== h.id) close();
80
- handle = h;
81
- closePolicy = opts?.closePolicy ?? 'kill';
82
- onClose = opts?.onClose ?? null;
83
- exitProgress = 0;
84
- if (debug.enabled) {
85
- debug.log('window.terminalModalRouter.set', h?.id ?? '(null)', {
86
- id: h?.id ?? null,
87
- closePolicy,
88
- hasOnClose: !!onClose,
89
- });
90
- }
91
- },
92
- close,
93
- handleKey: (ev) => {
94
- if (!handle) return 'passthrough';
95
- const name = (ev.name ?? '').toLowerCase();
96
- // ESC must NOT close the modal — claude / codex inside the popup
97
- // use ESC to cancel an in-progress chat / tool turn. Closing the
98
- // wrapper window on ESC made the only-way-to-cancel kill the
99
- // whole popup. iTerm / ghostty don't close their own windows on
100
- // ESC either; the wrapper should match. Modal close is reserved
101
- // for: Ctrl+G (close + focus log), Ctrl+Shift+T (toggle off),
102
- // typed `exit\n`, and the child's own `exit`. ESC just forwards.
103
- if (ev.ctrl && (name === 'g' || name === 'ㅎ')) {
104
- if (debug.enabled) debug.log('window.terminalModalRouter.handleKey.close', 'ctrl-g', { id: handle.id });
105
- close();
106
- return 'closed';
107
- }
108
-
109
- // Track typed `exit` followed by Enter so the user's natural
110
- // mental model ("type exit to quit") works inside agent popups
111
- // (claude / codex) where the child app doesn't recognize a bare
112
- // `exit` command. See EXIT_CHARS comment above for false-positive
113
- // avoidance.
114
- const noMods = !ev.ctrl && !ev.alt;
115
- if (noMods && name === 'enter' && exitProgress === EXIT_CHARS.length) {
116
- if (debug.enabled) {
117
- debug.log('window.terminalModalRouter.handleKey.close', 'typed-exit', {
118
- id: handle.id,
119
- });
120
- }
121
- close();
122
- return 'closed';
123
- }
124
- if (noMods && name === 'backspace') {
125
- if (exitProgress > 0) exitProgress--;
126
- } else if (noMods && name.length === 1 && exitProgress < EXIT_CHARS.length && name === EXIT_CHARS[exitProgress]) {
127
- exitProgress++;
128
- } else if (noMods && name === 'enter') {
129
- // Enter without a complete `exit` prefix — reset and forward.
130
- exitProgress = 0;
131
- } else if (name.length === 1 || name === 'space' || ev.ctrl || ev.alt) {
132
- // Any other printable key OR a modifier keystroke breaks the
133
- // streak. Multi-char named keys (arrow / fn / etc.) leave the
134
- // streak alone — the child may consume them without affecting
135
- // the user's typed prompt buffer.
136
- exitProgress = 0;
137
- }
138
-
139
- if (debug.enabled) {
140
- debug.log('window.terminalModalRouter.handleKey.forward', name || '(empty)', {
141
- id: handle.id,
142
- name,
143
- ctrl: ev.ctrl ?? false,
144
- shift: ev.shift ?? false,
145
- alt: ev.alt ?? false,
146
- exitProgress,
147
- });
148
- }
149
- try {
150
- handle.surface.onKey?.(ev);
151
- } catch { /* surface disposed mid-event; treat as no-op */ }
152
- return 'consumed';
153
- },
154
- };
155
- }
156
-
157
- /** Singleton instance used by dashboard.ts. Exported as a separate
158
- * factory + singleton so tests can inject a fresh router per case. */
159
- export const terminalModalRouter = createTerminalModalRouter();
1
+ // Compatibility entry for dashboard-owned consumers. The routing policy is
2
+ // shared with the standalone Next TUI from src/terminal.
3
+ export {
4
+ createTerminalModalRouter,
5
+ terminalModalRouter,
6
+ type KeyRouteResult,
7
+ type TerminalModalRouter,
8
+ } from '../../terminal/terminal-modal-router.js';
@@ -0,0 +1,61 @@
1
+ import { loadSidetabRows, type SidetabRow } from '../tui/sidetab/list.js';
2
+ import { stripAnsi, termSize } from '../tui.js';
3
+ import { requestRemotePtyControl } from '../pty-shell/pty-control-ipc.js';
4
+ import type { SlashCommandRegistry } from './slash-runtime/registry.js';
5
+ import type { DashboardSlashContext, DashboardSlashReturn } from './slash-runtime/dashboard-handlers.js';
6
+
7
+ /** Classic /side: the Next TUI manifest is the sole source of list ordering. */
8
+ export function registerClassicSideSlash(
9
+ registry: SlashCommandRegistry<DashboardSlashContext, DashboardSlashReturn>,
10
+ loadRows: (sessionId?: string) => SidetabRow[] = (sessionId) => loadSidetabRows(false, sessionId),
11
+ snapshot: typeof requestRemotePtyControl = requestRemotePtyControl,
12
+ ): void {
13
+ registry.register(['side'], async (args, ctx) => {
14
+ const sub = (args[0] ?? 'list').toLowerCase();
15
+ if (sub === 'new') {
16
+ if (args.length > 1) ctx.chatLines.push(ctx.warning(' 사용법: /side new'));
17
+ else ctx.termSlash.openNewTerminal();
18
+ ctx.setChatScrollOffset(-1);
19
+ return;
20
+ }
21
+ if (sub !== 'list' && sub !== 'attach') {
22
+ ctx.chatLines.push(ctx.muted(' 사용법: /side [list] | new | attach <번호>'));
23
+ ctx.setChatScrollOffset(-1);
24
+ return;
25
+ }
26
+ // Use the same filtered manifest rows for display and numeric resolution;
27
+ // never let an exited row shift the number shown to the user.
28
+ const rows = loadRows(ctx.chatPersona?.sessionId()).filter(row => row.badge !== 'exited');
29
+ if (sub === 'list') {
30
+ if (rows.length === 0) ctx.chatLines.push(ctx.muted(' 사이드탭 없음'));
31
+ rows.forEach((row, i) => ctx.chatLines.push(ctx.muted(` ${i + 1}. ${row.badge} ${row.label}`)));
32
+ ctx.setChatScrollOffset(-1);
33
+ return;
34
+ }
35
+ const raw = args[1] ?? '';
36
+ const index = /^\d+$/.test(raw) ? Number(raw) - 1 : -1;
37
+ const row = rows[index];
38
+ if (args.length !== 2 || !row) {
39
+ ctx.chatLines.push(ctx.warning(' 사용법: /side attach <목록 번호>'));
40
+ } else if (row.currentProcess) {
41
+ ctx.chatLines.push(ctx.muted(' 현재 세션입니다'));
42
+ } else if (row.sessionId && ctx.termSlash.sessionRegistry.get(row.sessionId)) {
43
+ const { cols, rows: height } = termSize();
44
+ const session = ctx.termSlash.sessionRegistry.attach(row.sessionId, { termCols: cols, termRows: height });
45
+ if (session?.modal) ctx.termSlash.openSession(session);
46
+ else ctx.chatLines.push(ctx.warning(' PTY attach 실패'));
47
+ } else if (row.ptyId) {
48
+ try {
49
+ // A foreign child belongs to another PTY owner: snapshot only, no takeover.
50
+ const result = await snapshot(row.ptyId, 'snapshot', { ansi: false }, { timeoutMs: 450 });
51
+ if (result.status === 'success' && result.screen?.trim()) {
52
+ ctx.chatLines.push(ctx.muted(` ${row.label} · 읽기 전용 snapshot (입력은 전달되지 않습니다)`));
53
+ ctx.chatLines.push(...stripAnsi(result.screen).split('\n'));
54
+ } else ctx.chatLines.push(ctx.warning(` PTY 화면 읽기 실패 · ${result.status}`));
55
+ } catch (error) {
56
+ ctx.chatLines.push(ctx.warning(` PTY 화면 읽기 오류 · ${error instanceof Error ? error.message : String(error)}`));
57
+ }
58
+ } else ctx.chatLines.push(ctx.warning(' attach할 PTY가 없습니다'));
59
+ ctx.setChatScrollOffset(-1);
60
+ });
61
+ }
@@ -387,6 +387,7 @@ import { readDashboardAskClarification } from './ask-clarification.js';
387
387
  export { readDashboardAskClarification };
388
388
  import { createLoopScheduler, type LoopScheduler } from '../loop-scheduler.js';
389
389
  import { registerShellSlash } from './shell-slash.js';
390
+ import { registerClassicSideSlash } from '../side-basic-runtime.js';
390
391
  export { registerShellSlash } from './shell-slash.js';
391
392
  import { registerMissionSlash } from '../../tui/slash/mission.js';
392
393
  // TUI-SLASH-SPLIT-MISSION(D4b) — /mission 은 src/tui/slash/mission.ts 로 이사. 옛 입구 re-export shim 은 slash-runtime/index.ts 한 곳뿐(RFC A5).
@@ -2577,6 +2578,7 @@ export function buildDashboardSlashRegistry(nowDeps?: ContextNowDeps, decideLedg
2577
2578
 
2578
2579
 
2579
2580
  registerShellSlash(registry);
2581
+ registerClassicSideSlash(registry);
2580
2582
 
2581
2583
  // ── B-3.b ─────────────────────────────────────────────────────────
2582
2584
 
@@ -127,6 +127,8 @@ export function createDashboardTermSlashRuntime(
127
127
  deps.muted(' /term list List all alive sessions (fg / bg / exited).'),
128
128
  deps.muted(' /term attach <id> Bring a backgrounded session to foreground.'),
129
129
  deps.muted(' /term detach Send foreground session to background (PTY survives).'),
130
+ deps.muted(' Ctrl+B (while streaming) Background running child tasks; turn continues.'),
131
+ deps.muted(' Ctrl+X c (chat input) Enter control mode.'),
130
132
  deps.muted(' /term switch Open the session picker modal.'),
131
133
  deps.muted(' /term kill <id> Stop the PTY and remove the session.'),
132
134
  deps.muted(' /term snapshot <id> [tail [bytes]] Capture current grid (snapshot) or last N bytes (tail).'),
@@ -25,6 +25,7 @@ import { buildConcisenessSystemMessages } from '../prompt-library/chat-concisene
25
25
  import {
26
26
  buildSessionRuntimeSystemMessages,
27
27
  buildSessionRuntimeTurnSystemMessages,
28
+ buildResearchDateSystemMessage,
28
29
  type SessionTurnProfile,
29
30
  } from '../session-runtime/index.js';
30
31
  import { buildExecutionAskSystemMessages } from '../ask-user-question/index.js';
@@ -208,9 +209,13 @@ function buildDashboardTurnPreambleUnmeasured(
208
209
  gitSnapshotStaleMs: DASHBOARD_GIT_SNAPSHOT_STALE_MS,
209
210
  }));
210
211
  const turnProfile = ctx.turnProfile;
212
+ const researchTurn = turnProfile?.surface.id === 'research/agent';
211
213
  const surfaceSystemMsgs = turnProfile
212
214
  ? timed(builderMs, 'surface', () => buildSessionRuntimeTurnSystemMessages(turnProfile, ctx.userText))
213
215
  : ([] as LLMMessage[]);
216
+ if (researchTurn) {
217
+ surfaceSystemMsgs.push(buildResearchDateSystemMessage());
218
+ }
214
219
  // ⭐⭐ `tools.nativeStructure` 는 «어느 provider 에 켤지»를 목록으로 고를 수 있다(2026-08-18).
215
220
  // ⛔ 목록이 없으면 종전대로 «전 provider» — 기존 설정을 쓰는 사람의 값이 안 바뀐다.
216
221
  // ⛔ `config.llm.provider` 를 그대로 읽지 않는다. 그것은 `'auto'` 일 수 있고,
@@ -240,9 +245,9 @@ function buildDashboardTurnPreambleUnmeasured(
240
245
  nativeStructureEnabled,
241
246
  ...(nativeTools !== undefined ? { enabledTools: nativeTools } : {}),
242
247
  }) as LLMMessage[]);
243
- const concisenessSystemMsgs = timed(builderMs, 'conciseness', () => buildConcisenessSystemMessages(
244
- ctx.userConfig.chat.conciseness,
245
- ) as LLMMessage[]);
248
+ const concisenessSystemMsgs = timed(builderMs, 'conciseness', () => researchTurn
249
+ ? [] as LLMMessage[]
250
+ : buildConcisenessSystemMessages(ctx.userConfig.chat.conciseness) as LLMMessage[]);
246
251
  // ★ elanous 자기접근 규율 + 자기인지 ambient(P3 · 2026-07-13) — 텔레그램/디스코드
247
252
  // (makeElanousAgentRunTurn)와 단일 출처(agent/self-ambient.ts). TUI 채팅에서도 미션
248
253
  // 진단("P2 왜 실패?")·자율 시스템 관측·회상이 규율+ambient+툴(self-ops family) 3박자로
@@ -313,10 +318,29 @@ function buildDashboardTurnPreambleUnmeasured(
313
318
  let taskNotificationCount = 0;
314
319
  try {
315
320
  timed(builderMs, 'taskNotifications', () => {
321
+ // ACP may ask for a preamble while the session is idle. Keep queued
322
+ // completion receipts for the next actual user/auto-wake turn.
323
+ if (!ctx.userText.trim()) return;
324
+ const notificationOnlyWake = /(?:^|\n)(?:Question: )?\[자동 재개\] 위임 끝: .+ \((?:done|error|aborted)\) — <task-notification> 의 결과를 읽고 이어서 처리$/u
325
+ .test(ctx.userText);
326
+ if (notificationOnlyWake) {
327
+ preamble.push({ role: 'system', content: '[알림 전용 턴] 이것은 완료 알림을 전달한 비요청 status receipt다. 작업 요청으로 취급하지 말고 Agent 또는 SelfImplement 위임을 시작하지 않는다. 포함된 결과를 바탕으로 한 번의 간결한 상태 요약만 답하고 멈춘다. 결과가 전달되지 않았다면 결과가 아직 제공되지 않았다고 알리고 내용을 추측하지 않는다.' });
328
+ }
316
329
  const pendingNotifications = globalTaskNotificationQueue.drain();
317
330
  taskNotificationCount = pendingNotifications.length;
318
- const taskNotificationsXml = renderTaskNotificationsXml(pendingNotifications);
331
+ if (pendingNotifications.length === 0) {
332
+ if (notificationOnlyWake) {
333
+ debug.log('tui.notify', 'notification-only-turn', { notificationCount: 0, resultAvailable: false });
334
+ }
335
+ return;
336
+ }
337
+ const taskNotificationsXml = renderTaskNotificationsXml(pendingNotifications, {
338
+ statusReceipt: notificationOnlyWake,
339
+ });
319
340
  if (taskNotificationsXml) {
341
+ debug.log('tui.notify', notificationOnlyWake ? 'notification-only-turn' : 'notification-with-user-request', {
342
+ notificationCount: pendingNotifications.length,
343
+ });
320
344
  preamble.push({ role: 'user', content: taskNotificationsXml });
321
345
  }
322
346
  });
@@ -19,6 +19,8 @@ export interface GuardianDeps {
19
19
  execute?: (command: string) => Promise<SpawnOutcome>;
20
20
  /** Injected only for deterministic expiry-alert tests. Production reads the local Grok auth file. */
21
21
  grokExpiry?: () => string | null;
22
+ /** Injected in tests; production reevaluates recorded doctor visits without dispatching a prescription. */
23
+ doctorShadow?: () => void | Promise<void>;
22
24
  hostName?: string;
23
25
  }
24
26
 
@@ -100,6 +102,13 @@ export async function guardianTick(now: Date, plan: GuardianPlan, deps: Guardian
100
102
  errorName: error instanceof Error ? error.name : 'unknown',
101
103
  });
102
104
  }
105
+ try {
106
+ await deps.doctorShadow?.();
107
+ } catch (error) {
108
+ debug.log('guardian.doctor-shadow', 'reevaluation-failed', {
109
+ errorName: error instanceof Error ? error.name : 'unknown',
110
+ });
111
+ }
103
112
  const timeZone = plan.timeZone ?? resolveTimeZone().timeZone;
104
113
  const wouldRun: string[] = [];
105
114
  let executed = 0;
@@ -1,6 +1,6 @@
1
1
  // ── git-fs watcher ──
2
2
  //
3
- // fs.watchFile() on the small set of files whose change indicates
3
+ // fs.watchFile() polls the small set of entries whose replacement indicates
4
4
  // the branch or the current commit moved:
5
5
  //
6
6
  // <gitDir>/HEAD branch switch / detach
@@ -15,7 +15,7 @@
15
15
  // watching the whole working tree. The dirty probe is throttled
16
16
  // separately.
17
17
 
18
- import { watch, type FSWatcher } from 'node:fs';
18
+ import { unwatchFile, watchFile, type Stats } from 'node:fs';
19
19
  import { join } from 'node:path';
20
20
  import type { GitHeadInfo } from './types.js';
21
21
  import type { LocatedGit } from './locate.js';
@@ -24,9 +24,9 @@ type Listener = () => void;
24
24
 
25
25
  export class GitFileWatcher {
26
26
  private readonly listeners = new Set<Listener>();
27
- private headWatcher: FSWatcher | null = null;
28
- private refWatcher: FSWatcher | null = null;
29
- private packedRefsWatcher: FSWatcher | null = null;
27
+ private headWatcher: { stop: () => void } | null = null;
28
+ private refWatcher: { stop: () => void } | null = null;
29
+ private packedRefsWatcher: { stop: () => void } | null = null;
30
30
  private currentBranch: string | null = null;
31
31
  private disposed = false;
32
32
 
@@ -54,7 +54,7 @@ export class GitFileWatcher {
54
54
  const next = head?.branch ?? null;
55
55
  if (next === this.currentBranch) return;
56
56
  this.currentBranch = next;
57
- if (this.refWatcher) { this.refWatcher.close(); this.refWatcher = null; }
57
+ if (this.refWatcher) { this.refWatcher.stop(); this.refWatcher = null; }
58
58
  this.installRefWatcher();
59
59
  }
60
60
 
@@ -62,9 +62,9 @@ export class GitFileWatcher {
62
62
  if (this.disposed) return;
63
63
  this.disposed = true;
64
64
  this.listeners.clear();
65
- if (this.headWatcher) { try { this.headWatcher.close(); } catch {} }
66
- if (this.refWatcher) { try { this.refWatcher.close(); } catch {} }
67
- if (this.packedRefsWatcher) { try { this.packedRefsWatcher.close(); } catch {} }
65
+ if (this.headWatcher) { try { this.headWatcher.stop(); } catch {} }
66
+ if (this.refWatcher) { try { this.refWatcher.stop(); } catch {} }
67
+ if (this.packedRefsWatcher) { try { this.packedRefsWatcher.stop(); } catch {} }
68
68
  this.headWatcher = null;
69
69
  this.refWatcher = null;
70
70
  this.packedRefsWatcher = null;
@@ -77,10 +77,22 @@ export class GitFileWatcher {
77
77
  }
78
78
  }
79
79
 
80
+ private watchPath(path: string): { stop: () => void } {
81
+ const onChange = (current: Stats, previous: Stats) => {
82
+ if (current.mtimeMs !== previous.mtimeMs || current.ino !== previous.ino || current.size !== previous.size) {
83
+ this.fire();
84
+ }
85
+ };
86
+ watchFile(path, { interval: 250, persistent: false }, onChange);
87
+ return { stop: () => unwatchFile(path, onChange) };
88
+ }
89
+
80
90
  private installHeadWatcher(): void {
81
- const path = join(this.located.gitDir, 'HEAD');
82
91
  try {
83
- this.headWatcher = watch(path, { persistent: false }, () => this.fire());
92
+ // Git replaces HEAD atomically via HEAD.lock + rename. fs.watch can stay
93
+ // attached to the old inode or miss the event on loaded hosts; stat
94
+ // polling follows the path and observes the replacement.
95
+ this.headWatcher = this.watchPath(join(this.located.gitDir, 'HEAD'));
84
96
  } catch {
85
97
  // HEAD may not exist during `git init` transient state; swallow.
86
98
  }
@@ -89,19 +101,12 @@ export class GitFileWatcher {
89
101
  private installRefWatcher(): void {
90
102
  if (!this.currentBranch) return;
91
103
  const path = join(this.located.commonGitDir, 'refs', 'heads', ...this.currentBranch.split('/'));
92
- try {
93
- this.refWatcher = watch(path, { persistent: false }, () => this.fire());
94
- } catch {
95
- // Loose ref may be packed — rely on packed-refs watcher.
96
- }
104
+ // Loose refs are atomically replaced on commit. Polling the path survives
105
+ // replacement and also detects a ref that is created after subscription.
106
+ this.refWatcher = this.watchPath(path);
97
107
  }
98
108
 
99
109
  private installPackedRefsWatcher(): void {
100
- const path = join(this.located.commonGitDir, 'packed-refs');
101
- try {
102
- this.packedRefsWatcher = watch(path, { persistent: false }, () => this.fire());
103
- } catch {
104
- // No packed-refs yet — not an error.
105
- }
110
+ this.packedRefsWatcher = this.watchPath(join(this.located.commonGitDir, 'packed-refs'));
106
111
  }
107
112
  }
@@ -61,13 +61,18 @@ function worktreeAddTimeoutForTrackedFileCount(trackedFileCount: number | null):
61
61
  return { ms: Math.min(WORKTREE_ADD_TIMEOUT_MAX_MS, Math.max(WORKTREE_ADD_TIMEOUT_MS, scaledMs)), trackedFileCount, source: 'tracked-files' };
62
62
  }
63
63
 
64
+ export function worktreeAddTimeoutSec(seconds: number | undefined): number | undefined {
65
+ return typeof seconds === 'number' && Number.isSafeInteger(seconds) && seconds > 0 && seconds <= 2_147_483
66
+ ? seconds : undefined;
67
+ }
68
+
64
69
  export function worktreeAddTimeoutForRepo(
65
70
  repoRoot: string,
66
71
  countTrackedFilesForRepo: (repoRoot: string, ref?: string) => number | null = countTrackedFiles,
67
72
  trackedFileRef?: string,
68
73
  ): WorktreeAddTimeout {
69
- const seconds = getUserConfig().harness?.worktreeAddTimeoutSec;
70
- if (typeof seconds === 'number' && Number.isSafeInteger(seconds) && seconds > 0 && seconds <= 2_147_483) {
74
+ const seconds = worktreeAddTimeoutSec(getUserConfig().harness?.worktreeAddTimeoutSec);
75
+ if (seconds !== undefined) {
71
76
  return { ms: seconds * 1000, trackedFileCount: null, source: 'config' };
72
77
  }
73
78
  return worktreeAddTimeoutForTrackedFileCount(countTrackedFilesForRepo(repoRoot, trackedFileRef));
@@ -347,7 +352,18 @@ function bakedDependenciesMatch(repoTree: string, bakedTree: string): boolean {
347
352
  } catch { return false; }
348
353
  }
349
354
 
350
- function prepareWorktreeDependencies(repoRoot: string, worktreePath: string, opts: CreateWorktreeOpts, deps: WorktreeAddDeps): void {
355
+ /** Pod source may omit node_modules while the image carries matching baked dependencies. */
356
+ export function worktreeDependenciesAvailable(repoRoot: string, fallbackRoot = GATE_DEPS_DIR): boolean {
357
+ for (const tree of GATE_DEPS_TREES) {
358
+ const repoTree = join(repoRoot, tree);
359
+ if (!existsSync(join(repoTree, 'package.json')) || !existsSync(join(repoTree, 'bun.lock'))) continue;
360
+ if (existsSync(join(repoTree, 'node_modules'))) continue;
361
+ if (!bakedDependenciesMatch(repoTree, join(fallbackRoot, tree))) return false;
362
+ }
363
+ return true;
364
+ }
365
+
366
+ export function prepareWorktreeDependencies(repoRoot: string, worktreePath: string, opts: Pick<CreateWorktreeOpts, 'dependencyFallbackRoot' | 'dependencyInstallTimeoutMs'>, deps: WorktreeAddDeps): void {
351
367
  const fallbackRoot = opts.dependencyFallbackRoot?.trim() || GATE_DEPS_DIR;
352
368
  const timeoutMs = opts.dependencyInstallTimeoutMs ?? WORKTREE_DEPENDENCY_INSTALL_TIMEOUT_MS;
353
369
  if (!Number.isSafeInteger(timeoutMs) || timeoutMs <= 0) throw new Error('dependencyInstallTimeoutMs must be a positive integer');
@@ -3,13 +3,10 @@ import { DecisionLedger, type DecisionEntry } from '../decisions/decision-ledger
3
3
  import { effectiveInstanceRoot } from '../instance/resolve.js';
4
4
  import { createGraphVariant } from '../self-implement/graph-variant.js';
5
5
  import type { GraphEdgeSpec, GraphNodeSpec, GraphTemplateSpec } from '../self-implement/graph-yaml.js';
6
+ import type { ResearchEdgeDecisionRegistry, ResearchEdgeProposal, ResolvedResearchEdgeDecision } from '../research/edge-decision.js';
6
7
  import { createLLMGrowthProposer } from './graph-grow-llm.js';
7
8
 
8
- export interface GrowthProposal {
9
- node: GraphNodeSpec;
10
- returnTo?: string;
11
- reason: string;
12
- }
9
+ export type GrowthProposal = ResearchEdgeProposal;
13
10
 
14
11
  export type GrowthProposer = (input: { graph: GraphTemplateSpec; nodeId: string; outcome: string; runId: string; output?: unknown }) => GrowthProposal | undefined | Promise<GrowthProposal | undefined>;
15
12
  export type GrowthRecipeEffect = 'read-only' | 'external-effect' | 'unknown';
@@ -68,10 +65,41 @@ export function growthDecision(input: Parameters<GrowthProposer>[0], proposal: G
68
65
 
69
66
  export async function proposeGrowth(input: Parameters<GrowthProposer>[0],
70
67
  proposer: GrowthProposer = createLLMGrowthProposer(), classifyRecipe?: (node: GraphNodeSpec) => GrowthRecipeEffect | GrowthRecipeClassification,
71
- decisionDeps: GrowthDecisionDeps = {}): Promise<{ ok: true; graph: GraphTemplateSpec; growth: GraphGrowth } | { ok: false; reason: string; park?: boolean; growth?: GraphGrowth; decisionId?: string; decisionRef?: string; command?: GrowthCommand; approval?: string }> {
68
+ decisionDeps: GrowthDecisionDeps = {}, edgeDecisionRegistry?: ResearchEdgeDecisionRegistry): Promise<
69
+ | { ok: true; graph: GraphTemplateSpec; growth: GraphGrowth; edgeDecision?: ResolvedResearchEdgeDecision }
70
+ | { ok: false; reason: string; park?: boolean; growth?: GraphGrowth; decisionId?: string; decisionRef?: string; command?: GrowthCommand; approval?: string; edgeDecision?: ResolvedResearchEdgeDecision }
71
+ > {
72
72
  let proposal: GrowthProposal | undefined;
73
- try { proposal = await proposer(input); }
74
- catch (error) { return { ok: false, reason: `proposer failed: ${String(error)}` }; }
73
+ const value = input.output;
74
+ const assessment = value !== null && typeof value === 'object' && !Array.isArray(value)
75
+ && Array.isArray((value as Record<string, unknown>).gaps)
76
+ && Array.isArray((value as Record<string, unknown>).contradictions)
77
+ && Array.isArray((value as Record<string, unknown>).verdicts)
78
+ ? { gaps: (value as Record<string, unknown>).gaps as unknown[],
79
+ contradictions: (value as Record<string, unknown>).contradictions as unknown[],
80
+ verdicts: (value as Record<string, unknown>).verdicts as unknown[] }
81
+ : undefined;
82
+ let edgeDecision: ResolvedResearchEdgeDecision | undefined;
83
+ if (assessment) {
84
+ const [{ createResearchEdgeDecisionRegistry }, { debug }] = await Promise.all([
85
+ import('../research/edge-decision.js'), import('../debug/log.js'),
86
+ ]);
87
+ edgeDecision = await (edgeDecisionRegistry ?? createResearchEdgeDecisionRegistry()).decide(assessment);
88
+ try {
89
+ debug.log('research.edge', 'decision', {
90
+ provider: edgeDecision.provider,
91
+ decision: edgeDecision.action,
92
+ reason: edgeDecision.reason,
93
+ });
94
+ } catch { /* observation must not change graph growth */ }
95
+ if (edgeDecision.action !== 'add') {
96
+ return { ok: false, reason: `edge decision ${edgeDecision.action}: ${edgeDecision.reason}`, edgeDecision };
97
+ }
98
+ proposal = edgeDecision.proposal;
99
+ } else {
100
+ try { proposal = await proposer(input); }
101
+ catch (error) { return { ok: false, reason: `proposer failed: ${String(error)}` }; }
102
+ }
75
103
  if (!proposal) return { ok: false, reason: 'no proposal' };
76
104
  if (!proposal.node || typeof proposal.reason !== 'string' || !proposal.reason.trim()) return { ok: false, reason: 'proposal requires a node and reason' };
77
105
  let result: ReturnType<typeof createGraphVariant>;
@@ -99,5 +127,5 @@ export async function proposeGrowth(input: Parameters<GrowthProposer>[0],
99
127
  growth: proposalGrowth(input, proposal) };
100
128
  }
101
129
  }
102
- return { ok: true, graph: result.template, growth: proposalGrowth(input, proposal) };
130
+ return { ok: true, graph: result.template, growth: proposalGrowth(input, proposal), ...(edgeDecision ? { edgeDecision } : {}) };
103
131
  }
@@ -17,6 +17,7 @@ import { recordFailureEvent } from '../self-implement/heal-intake.js';
17
17
  import { growthApprovalRef, proposeGrowth, type GraphGrowth, type GrowthProposer, type GrowthRecipeEffect, type GrowthDecisionDeps, type GrowthCommand } from './graph-grow.js';
18
18
  import { DecisionLedger, type DecisionEntry } from '../decisions/decision-ledger.js';
19
19
  import { createLLMGrowthProposer } from './graph-grow-llm.js';
20
+ import type { ResearchEdgeDecisionRegistry } from '../research/edge-decision.js';
20
21
  import { graphVersionHash, parseGraphTemplateYaml, type GraphEdgeSpec, type GraphNodeSpec, type GraphTemplateSpec } from '../self-implement/graph-yaml.js';
21
22
  import { createGraphUnitResolver, resolveGraphUnit, UnitNotFoundError, type ResolvedGraphUnit } from '../self-implement/graph-unit-resolver.js';
22
23
  import { flattenGraphUnits } from '../self-implement/graph-unit-flatten.js';
@@ -34,6 +35,7 @@ const DEFAULT_BASH_TIMEOUT_MS = 5 * 60 * 1_000;
34
35
  // Independent of graph YAML and recipe snapshots: an already-wrong saved binding must fail closed.
35
36
  const RELEASE_NODE_COMMANDS: Readonly<Record<string, { recipe: string; command?: string }>> = {
36
37
  'version-release': { recipe: 'cmd:version-release', command: 'bun scripts/release-loop/version-node.ts release --json' },
38
+ 'traffic-cut-start': { recipe: 'cmd:traffic-cut-start', command: 'bun scripts/release-loop/traffic-node.ts traffic-cut-start' },
37
39
  cutoff: { recipe: 'cmd:cutoff', command: 'bun scripts/release-loop/node-verdict.ts cutoff' },
38
40
  'checklist-gate': { recipe: 'cmd:checklist-gate', command: 'bun scripts/release-loop/checklist-gate-node.ts' },
39
41
  prefetch: { recipe: 'cmd:docs', command: 'bun scripts/release-loop/docs-node.ts --json' },
@@ -55,9 +57,11 @@ const RELEASE_NODE_COMMANDS: Readonly<Record<string, { recipe: string; command?:
55
57
  'approve-publish': { recipe: 'approval:publish' },
56
58
  publish: { recipe: 'cmd:publish-command', command: 'bun scripts/release-loop/publish-node.ts' },
57
59
  'npm-publish': { recipe: 'cmd:npm-publish', command: 'bun scripts/release-loop/npm-publish-node.ts' },
60
+ 'traffic-npm-published': { recipe: 'cmd:traffic-npm-published', command: 'bun scripts/release-loop/traffic-node.ts traffic-npm-published' },
58
61
  'docs-land': { recipe: 'cmd:docs-land', command: 'bun scripts/release-loop/docs-land-node.ts' },
59
62
  verify: { recipe: 'cmd:verify', command: 'bun scripts/release-loop/verify-node.ts' },
60
63
  'traffic-verify-complete': { recipe: 'cmd:traffic-verify-complete', command: 'bun scripts/release-loop/traffic-node.ts traffic-verify-complete' },
64
+ 'traffic-failed-restore': { recipe: 'cmd:traffic-failed-restore', command: 'bun scripts/release-loop/traffic-node.ts traffic-failed-restore' },
61
65
  'vault-note': { recipe: 'cmd:vault-note', command: 'bun scripts/release-loop/vault-note-node.ts' },
62
66
  'release-story': { recipe: 'cmd:release-story', command: 'bun scripts/release-story/draft.ts --graph' },
63
67
  'ops-upgrade': { recipe: 'cmd:ops-upgrade', command: 'bun scripts/release-loop/ops-upgrade-node.ts' },
@@ -248,6 +252,8 @@ export interface GraphRunOptions {
248
252
  pinChildUniverse?: boolean;
249
253
  /** Release resume: command checkout and cut tip, checked before every Bash dispatch. */
250
254
  releaseCommandSource?: { root: string; cutTip: string; git?: (args: string[]) => string };
255
+ /** Optional per-run Bloom edge policy hook. */
256
+ researchEdgeDecisionRegistry?: ResearchEdgeDecisionRegistry;
251
257
  deps?: { root?: string; runBash?: BashRun; callLLM?: (prompt: string) => Promise<string>; log?: (event: string, data: Record<string, unknown>) => void; beforeNode?: () => void; processStartMs?: (pid: number) => number | null; growthProposer?: GrowthProposer; growthLLM?: (prompt: string) => Promise<string>; classifyGrowthRecipe?: (node: GraphNodeSpec, resolved: { command?: string; approval?: string }) => GrowthRecipeEffect; growthDecision?: GrowthDecisionDeps & { list?: (filters: { status: 'all' }) => DecisionEntry[] } };
252
258
  }
253
259
 
@@ -839,7 +845,16 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
839
845
  const next = nextNode(graph.edges, prior.nodeId, prior.ok ? 'ok' : 'fail', typeof reported === 'string' ? reported : undefined);
840
846
  if (next !== recorded.nodeId) throw new Error('saved run path does not follow graph edges');
841
847
  } else if (recorded.nodeId !== unitEntryNode) throw new Error('saved run path does not start at entry node');
842
- if (i < from && !recorded.ok) throw new Error('cannot preserve a failed predecessor when resuming');
848
+ if (i < from && !recorded.ok) {
849
+ // A warning-only node explicitly sends every outcome to the same next
850
+ // node. Its truthful failed record is safe to preserve when retrying a
851
+ // later release step; a branching failure is still a hard stop.
852
+ const edge = graph.edges.find((candidate) => candidate.from === recorded.nodeId);
853
+ const next = state.path[i + 1];
854
+ if (edge?.on !== 'outcome' || !next || !(['ok', 'fail', 'error'] as const).every((outcome) => edge.map?.[outcome] === next)) {
855
+ throw new Error('cannot preserve a failed predecessor when resuming');
856
+ }
857
+ }
843
858
  const approved = resolveNodeRecipe(spec, recipes, catalogRoles).approval;
844
859
  if (approved && i >= from) throw new Error('cannot restart across an approval decision');
845
860
  if (approved && i < from) {
@@ -1363,7 +1378,7 @@ export async function runGraph(path: string, options: GraphRunOptions = {}): Pro
1363
1378
  if (!resolved.command && !resolved.approval && candidate.recipe !== 'none') return 'unknown';
1364
1379
  return { effect: resolved.approval ? 'unknown' : options.deps?.classifyGrowthRecipe?.(candidate, { command: resolved.command?.command }) ?? 'unknown',
1365
1380
  command: resolved.command, approval: resolved.approval?.approval };
1366
- }, { ...options.deps?.growthDecision, root });
1381
+ }, { ...options.deps?.growthDecision, root }, options.researchEdgeDecisionRegistry);
1367
1382
  if (result.ok) {
1368
1383
  graph = result.graph;
1369
1384
  state.growth ??= [];