elanous 0.2.42 → 0.2.44

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 (764) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → HMXsxdy5MIIcHPMHv1wD4}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/08334415.f0e80896acbef722.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/1032-78ba4f6391258cab.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1082-53f86a26e03d309d.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1109-7d0e264f6f2edbc7.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1124-7c26330402481143.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/{2160.a097e7b138ae1c55.js → 118.2a89982fe4276880.js} +1 -1
  10. package/apps/pwa/out/_next/static/chunks/1244.6c435dbf1bf21d8a.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1252.9e665904d3aa3b1a.js +32 -0
  12. package/apps/pwa/out/_next/static/chunks/1266.a46cc33cb6a72d75.js +104 -0
  13. package/apps/pwa/out/_next/static/chunks/1306.967240ede9a0f757.js +24 -0
  14. package/apps/pwa/out/_next/static/chunks/1344.3b95f3bd1b77a3fe.js +94 -0
  15. package/apps/pwa/out/_next/static/chunks/{4043.6b91203436c9c86b.js → 1401.22dfe92640a2b1ac.js} +4 -4
  16. package/apps/pwa/out/_next/static/chunks/1431-f7c78bd5be21e011.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/1451-cdd35a8a0b31834b.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/{6632.0eac1c554f8f2ef3.js → 1694.18debfd77562e56d.js} +2 -2
  19. package/apps/pwa/out/_next/static/chunks/1708-f03d587b7a7545c8.js +1 -0
  20. package/apps/pwa/out/_next/static/chunks/1775-fa7152bdeff6c95f.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/178-4da509cd7266672a.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/1850-522de4ee34957210.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/1876-c6f6e0ddcc76c6a1.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/1976.097066b072432242.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/{3507.97e1977bc4d5fb0a.js → 1978.eeb60a606dc5deac.js} +2 -2
  26. package/apps/pwa/out/_next/static/chunks/2043.e233e3b5a3e790f5.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/2150.71b94e3348107c83.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/2158.ebc6fc5a10280ab7.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/2216.802962c04f40a26e.js +64 -0
  30. package/apps/pwa/out/_next/static/chunks/2294.7890edcfa046c97d.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/235.c89aaae4bcd6233a.js +74 -0
  32. package/apps/pwa/out/_next/static/chunks/{5885.0a3e52c8faccec98.js → 239.de075467b5523469.js} +2 -2
  33. package/apps/pwa/out/_next/static/chunks/249.ba7051590d603c8f.js +226 -0
  34. package/apps/pwa/out/_next/static/chunks/2571.a6ac4e26c8618403.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/2610.e149cd564a08913e.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/2705.9816f3c244f8b85f.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/2801.afeb8a4dae22f85f.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/2954.bbefc95d6b20e0d8.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/2e0f720a.a0697c08e3806a60.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3042.96ec235fe41c8d4e.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/3097-8e358f158acef46b.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/3205-93b1abe28b4fb16a.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/3273.b4434f0dcae7eb29.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/3311.9cbc43ea0c90d60c.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{1487.2f67b79444062da6.js → 3349.b5f09ee474d9533e.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/3503.a47a9755fb4d97b0.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/3506-5f429b3b7e1392b0.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/3843.bad404d008893291.js +77 -0
  49. package/apps/pwa/out/_next/static/chunks/3877-4b40e530b47e3bf9.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/435-ce2958253cf7de61.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/4393.28fa5228d0eec217.js +149 -0
  52. package/apps/pwa/out/_next/static/chunks/4404.7281c847c6e10dfc.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/{8673-bab689a55f7e13b9.js → 4415-b9d6a90960920a4a.js} +3 -3
  54. package/apps/pwa/out/_next/static/chunks/447-5b304de1fe098f43.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/4484-8ebea83d431e6fae.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/{8262.ddc03e06b733f184.js → 4502.bdcc877abd437a05.js} +1 -1
  57. package/apps/pwa/out/_next/static/chunks/4599-f95790fc5c65b8df.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/{1262.e804feb8fd1acb8c.js → 46.57c783fa4884714f.js} +2 -2
  59. package/apps/pwa/out/_next/static/chunks/463-b9114e411f33728e.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/4659.a57d1f0c5d754cd2.js +36 -0
  61. package/apps/pwa/out/_next/static/chunks/4722-a847e7a28115035f.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/{1063.2fb8a9dc55c731f2.js → 4757.67c6d7473a038e78.js} +1 -1
  63. package/apps/pwa/out/_next/static/chunks/4874-c86f878ec4502ad3.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/{6377.bc7df239edbff244.js → 4891.3f80ba517a3b2373.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/4998.810ca8833084caa9.js +62 -0
  66. package/apps/pwa/out/_next/static/chunks/4f98febc.ea5841d4d616bfb2.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/{3482.a9ae9d2ad6a5bd97.js → 5052.7dbb12a55d4f18f5.js} +1 -1
  68. package/apps/pwa/out/_next/static/chunks/5166-ca73b3e361085a6d.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/5180-039f4a18b07ad387.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/5232.5a2ce4daf7a9e11d.js +115 -0
  71. package/apps/pwa/out/_next/static/chunks/5439.3fec6dbce29ecb36.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/5612-074d9a5e00dfac6a.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/5675-01989d524a84c505.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/5751.af641a1adf5ec697.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/5758-c6cb98714d18ab0c.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/578eded8.b582637306e16964.js +122 -0
  77. package/apps/pwa/out/_next/static/chunks/5790.5eb06a653ebd8571.js +34 -0
  78. package/apps/pwa/out/_next/static/chunks/5853-4033e5bd5afbe06b.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/5904.97d70bb7f46b2db7.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/{3347.f846266b5e5f3ede.js → 5989.7ecd362c5c44b747.js} +3 -3
  81. package/apps/pwa/out/_next/static/chunks/{73d2eb0e.4966ad55293c801a.js → 5a34fb2f.52f1b4e1baebb48a.js} +3 -3
  82. package/apps/pwa/out/_next/static/chunks/{7a98bc80.fa935989e829f9c2.js → 5a5078f8.2099200e5ea95e16.js} +1 -1
  83. package/apps/pwa/out/_next/static/chunks/6036-c302c34ff0b3d410.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/606.ef81c313381f4264.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/616.1af54a928b1ba704.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/6201.bc936f71f613a8e9.js +41 -0
  87. package/apps/pwa/out/_next/static/chunks/6204-fdc86e0e64c4f92d.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/{7411.9b4b8b747dc7b802.js → 6245.1182e007e9d230d9.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/{b450776b.3db34d8d965f82d3.js → 63699a35.17262e162bc514b2.js} +1 -1
  90. package/apps/pwa/out/_next/static/chunks/6420.494801a80030160c.js +27 -0
  91. package/apps/pwa/out/_next/static/chunks/{e8543907.5b040a5f22a0b0e5.js → 6549dad0.2740b25e51bf8f05.js} +1 -1
  92. package/apps/pwa/out/_next/static/chunks/{9427.96aa912ddb5801e0.js → 6881.9e7955847640c7fe.js} +17 -17
  93. package/apps/pwa/out/_next/static/chunks/6931.fcdfb94141e67b3d.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/6991-8e081c6ce38c0ba1.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/7010.1bbd17a7f2b3e376.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/7029.d1466acf55fae2ed.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/7152-a123aa8e129c131f.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/7455.196168fffac3b9c4.js +24 -0
  99. package/apps/pwa/out/_next/static/chunks/7638.6ca4770dd1129138.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/7649-f37d76260e5e2a5a.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/7679.32c40cdd14f20b4a.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/7751.04bfbd16b4c6cd0a.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/7864.b1ff31d4030b8994.js +148 -0
  104. package/apps/pwa/out/_next/static/chunks/7869-c47bd2c075c1fefa.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/{8138.6c10b2a356d52fca.js → 8442.2f09ca969d631615.js} +1 -1
  106. package/apps/pwa/out/_next/static/chunks/8445.2738dbd59a78c78c.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8447.5510c439f9938c6d.js +286 -0
  108. package/apps/pwa/out/_next/static/chunks/{9415.69e4a21c60c7d2db.js → 8551.f762945c2cda2e95.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/8635-57a9d8d9db70f4f1.js +1 -0
  110. package/apps/pwa/out/_next/static/chunks/86961958-4b0689a5048f756b.js +1 -0
  111. package/apps/pwa/out/_next/static/chunks/8709.3c6019bb18f8554f.js +8 -0
  112. package/apps/pwa/out/_next/static/chunks/8759.c999528a0a907bf6.js +1 -0
  113. package/apps/pwa/out/_next/static/chunks/{9a852a62-6192a6ea9346ced3.js → 87f498e5-0881de09f2e44707.js} +1 -1
  114. package/apps/pwa/out/_next/static/chunks/8843.c3197f904c952b81.js +1 -0
  115. package/apps/pwa/out/_next/static/chunks/{3d0154af.5331fec737ffe8c3.js → 892fd990.456232f326cc39c2.js} +1 -1
  116. package/apps/pwa/out/_next/static/chunks/8965-135a2c9eaa2464cb.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/8971-8d3b9c96f8a6c958.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9059.c8598d96f8e5e9cd.js +1 -0
  119. package/apps/pwa/out/_next/static/chunks/9115.90447ae198b84eae.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9147.d9b0a02e0babc9b4.js +93 -0
  121. package/apps/pwa/out/_next/static/chunks/9204-83075f4b70c61cdc.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/9244-c32ef14b5dc72bdf.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/930.2a9a30f964350c66.js +90 -0
  124. package/apps/pwa/out/_next/static/chunks/9398.1f56e3f17795f43f.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/9527.3e5ad31c891c5fcb.js +79 -0
  126. package/apps/pwa/out/_next/static/chunks/9571-4ac933e774d1225c.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-9fc644de2d8edae3.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/approvals/page-0c9dace2db62bee8.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f5e65c3dc9d89f2a.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/board/page-2a9c19b9a140b7b1.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/botlab/page-61533ad92141adfb.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/bots/page-112004ced6fd0329.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/ceo/page-f733318c237a49d8.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/chat/page-51ea677d2d33bbc0.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/consult/page-428b41f2f9566e3c.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/control/page-1b29396ea90a61e5.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/decisions/page-cf83ec613ac904bf.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/design-check/page-3f4c0ecbc284bb5f.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/editor/page-b63c322f54f70cc6.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/exec/page-fe328c4ee9aac6b4.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/field/page-bfb855c584f0fb98.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/healthz/route-9fc644de2d8edae3.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/inside/page-47b1710c110eabd7.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/intake/page-42895214458bc6d2.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/layout-d03de0ebd8366e23.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/live/page-3ed6c47e4b1c61c2.js +1 -0
  147. package/apps/pwa/out/_next/static/chunks/app/live-run/page-ae653e9bf261c738.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/loops/page-23f3f0a0209c0ac4.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/market/page-88c691273aae66f9.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e187ac52a95538b3.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/morning/page-6e45828daed1295e.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/not-found-edb5d7287bb46186.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/observatory/page-4a7eaacd93c3f6a5.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-3ca073d43d74cc84.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-1e9fee67b1199436.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-df1283ea963c6816.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/outputs/page-19fcf8d8301ccd18.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/page-5ab699e0303bbb40.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/reflection/page-7cde0d29756984c5.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-9d4c598e8ee22f7a.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/sessions/page-cc1609a71f44ec62.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-7659a9a1345bfaa9.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/settings/page-0afef60ecc0c4af5.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-a3553949f8f34f5f.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/setup/layout-9fc644de2d8edae3.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/setup/page-057a69702f3c67c7.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/share/page-c0f0e570f3f74c73.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/showroom/page-1825071ae34e3b89.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/tasks/page-6244e3e135d8ccfc.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/term/page-da787e8a10b8a82e.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/today/page-1316d32498e2be42.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/trace/page-4df94572e343de2e.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/app/vault/page-708969f7475e88c1.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-c58add08c919a1dc.js +1 -0
  175. package/apps/pwa/out/_next/static/chunks/app/workflows/page-a24847f45e5d5bf9.js +1 -0
  176. package/apps/pwa/out/_next/static/chunks/app/workspace/page-acfec65a3a60e22e.js +1 -0
  177. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-3dfc598e6fbde245.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/framework-c658a626118411b7.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-4c73685fd891445b.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-6310f7e5de7dd01d.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-51c326bf48610be1.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-d0beadf754da59b0.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-acd243bfbf3f6732.js +1 -0
  184. package/apps/pwa/out/_next/static/css/d1f8bb401740a549.css +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/catalog/external-commands.yaml +5 -3
  279. package/catalog/meta/catalogVersion.yaml +2 -1
  280. package/catalog/signing/catalog-signing-public.pem +3 -0
  281. package/graphs/intake/intake-daily.yaml +16 -0
  282. package/graphs/intake/news-sources.yaml +1 -0
  283. package/graphs/intake/recipes.yaml +7 -0
  284. package/graphs/overlays/README.md +6 -0
  285. package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
  286. package/graphs/profiles/local.yaml +5 -0
  287. package/graphs/profiles/pod.yaml +4 -0
  288. package/graphs/release/release-loop.yaml +33 -17
  289. package/graphs/units/verbs/make-doc.yaml +1 -0
  290. package/package.json +6 -2
  291. package/plugins/demo-absorption-briefing/plugin.json +18 -0
  292. package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
  293. package/plugins/demo-browser-hand/plugin.json +13 -0
  294. package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
  295. package/plugins/demo-linear-secretary/plugin.json +15 -0
  296. package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
  297. package/plugins/demo-plugin-wizard/plugin.json +11 -0
  298. package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
  299. package/plugins/demo-research/plugin.json +16 -0
  300. package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
  301. package/plugins/demo-video-briefing/plugin.json +15 -0
  302. package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
  303. package/scripts/bench-metering-plan.ts +229 -0
  304. package/scripts/build-signed-catalog.ts +48 -0
  305. package/scripts/ci-typecheck-main-delta.sh +88 -0
  306. package/scripts/codex-fallback-live-probe.ts +1 -1
  307. package/scripts/demo/demo1104-parallel-host.ts +56 -0
  308. package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
  309. package/scripts/demo/demo1104-parallel.ts +72 -0
  310. package/scripts/demo/demo1104-stage.config.ts +21 -0
  311. package/scripts/demo/demo1104-stage.ts +316 -0
  312. package/scripts/goal-method-audit.ts +17 -1
  313. package/scripts/graph-units/land-enqueue.ts +90 -0
  314. package/scripts/hooks/codex-notify.sh +32 -0
  315. package/scripts/install.sh +10 -38
  316. package/scripts/landing-heal/land-plan.ts +57 -0
  317. package/scripts/public-leak-baseline.txt +0 -1
  318. package/scripts/release-loop/auto-approve-node.ts +1 -1
  319. package/scripts/release-loop/docs-node.ts +4 -2
  320. package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
  321. package/scripts/release-loop/gate-image-pin.ts +116 -2
  322. package/scripts/release-loop/gate-method.ts +139 -0
  323. package/scripts/release-loop/gate-node.ts +395 -43
  324. package/scripts/release-loop/gate-progress-sim.ts +73 -0
  325. package/scripts/release-loop/gate-traffic-mode.ts +151 -3
  326. package/scripts/release-loop/node-verdict.ts +38 -25
  327. package/scripts/release-loop/notes-repair.ts +18 -1
  328. package/scripts/release-loop/preflight.ts +544 -10
  329. package/scripts/release-loop/render-warm-control-manifest.ts +22 -0
  330. package/scripts/release-loop/resume-release.ts +9 -7
  331. package/scripts/release-loop/resume.ts +13 -4
  332. package/scripts/release-loop/unattended-release.ts +20 -9
  333. package/scripts/release-loop/warm-control-forward.ts +178 -0
  334. package/scripts/retro-cycle.ts +30 -8
  335. package/scripts/rhythm/daily.ts +39 -4
  336. package/scripts/rhythm/linear-progress-sync.ts +311 -0
  337. package/scripts/ux-sim.ts +7 -1
  338. package/scripts/video-pipeline.ts +9 -1
  339. package/scripts/warm-pool-provider-config.ts +35 -7
  340. package/src/acp/agent-manager.ts +1 -0
  341. package/src/acp/codex-app-server-agent.ts +33 -0
  342. package/src/acp/codex-app-server-client.ts +153 -16
  343. package/src/acp/core-turn-bridge.ts +17 -12
  344. package/src/acp/event-router.ts +20 -1
  345. package/src/acp/server.ts +6 -0
  346. package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
  347. package/src/agent-mission/claude-headless.ts +4 -1
  348. package/src/agent-mission/codex-exec.ts +105 -0
  349. package/src/agent-mission/driver.ts +192 -11
  350. package/src/agent-mission/grok-auth-status.ts +107 -0
  351. package/src/agent-mission/hand-hooks.ts +101 -0
  352. package/src/agent-mission/mission-cli.ts +56 -21
  353. package/src/agent-mission/mission-hand-reply.ts +118 -0
  354. package/src/agent-mission/mission-line.ts +180 -0
  355. package/src/agent-mission/mission-out.ts +256 -18
  356. package/src/agent-mission/tool-install.ts +122 -11
  357. package/src/agent-substrate/pr-reviewer.ts +147 -11
  358. package/src/agent-substrate/self-review-cli.ts +10 -2
  359. package/src/agents/general-purpose.md +1 -1
  360. package/src/auto-research/research-fanout.ts +221 -0
  361. package/src/auto-research/research-turn.ts +362 -31
  362. package/src/autopilot/mission-codebase-gate.ts +7 -3
  363. package/src/autopilot/pr-manager.ts +31 -3
  364. package/src/boot/daemon-tools/self-implement.ts +3 -1
  365. package/src/boot/daemon-tools/web-search.ts +1 -2
  366. package/src/briefing/brief-items.ts +55 -11
  367. package/src/cli/agent-cli.ts +2 -1
  368. package/src/cli/catalog-cli.ts +31 -0
  369. package/src/cli/connector-cli.ts +16 -0
  370. package/src/cli/control-cli.ts +15 -6
  371. package/src/cli/doctor-fix.ts +2 -2
  372. package/src/cli/intake-source-cli.ts +44 -8
  373. package/src/cli/log-event-names.ts +8 -0
  374. package/src/cli/msg-cli.ts +32 -3
  375. package/src/cli/pr-cli.ts +21 -1
  376. package/src/cli/pr-land-heavy-remote.ts +44 -6
  377. package/src/cli/pr-land-overlap-evidence.ts +13 -1
  378. package/src/cli/pr-land-pod-shadow-job.ts +143 -5
  379. package/src/cli/pr-land-pod-shadow.ts +9 -2
  380. package/src/cli/release-checklist-read-cli.ts +44 -16
  381. package/src/cli/release-cli.ts +23 -3
  382. package/src/cli/research-cli.ts +9 -0
  383. package/src/cli/setup-cli.ts +166 -6
  384. package/src/cli/setup-keys.ts +199 -0
  385. package/src/cli/task-plugin-wizard-host.ts +114 -0
  386. package/src/cli/tasks-cli.ts +54 -9
  387. package/src/cli/tui-test-cli.ts +190 -0
  388. package/src/config.ts +4 -2
  389. package/src/connectors/linear-daily-progress.ts +228 -0
  390. package/src/connectors/linear-projector.ts +34 -12
  391. package/src/connectors/linear.ts +151 -7
  392. package/src/control-plane/ledger.ts +42 -4
  393. package/src/control-plane/member-tokens.ts +25 -2
  394. package/src/control-plane/ports.ts +8 -3
  395. package/src/control-plane/server.ts +26 -5
  396. package/src/core-turn/deep-turn-bloom.ts +67 -0
  397. package/src/core-turn/research-policy.ts +43 -0
  398. package/src/core-turn/run-core-turn.ts +488 -51
  399. package/src/core-turn/types.ts +4 -0
  400. package/src/dashboard/chat/acp-chat.ts +10 -0
  401. package/src/dashboard/classic-sidetab-mission-job.ts +192 -0
  402. package/src/dashboard/classic-sidetab-mission-pair.ts +82 -0
  403. package/src/dashboard/classic-sidetab-mission-trio.ts +242 -0
  404. package/src/dashboard/classic-sidetab-mission.ts +169 -5
  405. package/src/dashboard/index.ts +387 -14
  406. package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
  407. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +8 -0
  408. package/src/dashboard/mission-cli-consumer.ts +20 -8
  409. package/src/dashboard/plugin-wizard-runtime.ts +50 -0
  410. package/src/dashboard/plugin-wizard-tool.ts +55 -0
  411. package/src/dashboard/sidetab-runtime.ts +3 -1
  412. package/src/dashboard/terminal-popup-runtime.ts +6 -3
  413. package/src/dashboard/visible-mission-diagnostics.ts +16 -0
  414. package/src/decisions/linear-progress-summary.ts +78 -0
  415. package/src/decisions/linear-progress-sync.ts +152 -0
  416. package/src/domains/outbound-alert.ts +49 -11
  417. package/src/domains/retro-cycle-observation.ts +43 -0
  418. package/src/domains/retro-cycle.ts +13 -2
  419. package/src/domains/retro-proposals.ts +92 -0
  420. package/src/domains/retro-report.ts +6 -1
  421. package/src/domains/telegram-kind-route.ts +16 -9
  422. package/src/graph-runner/arg-allowance.ts +13 -0
  423. package/src/graph-runner/graph-cli.ts +24 -1
  424. package/src/graph-runner/graph-grow-llm.ts +3 -1
  425. package/src/graph-runner/graph-run-api.ts +3 -1
  426. package/src/graph-runner/runner.ts +310 -46
  427. package/src/graph-wizard/mission-compose.ts +407 -12
  428. package/src/harness/dispatch-backpressure.ts +54 -1
  429. package/src/harness/dispatch-shadow-compare.ts +74 -0
  430. package/src/harness/harness-cli-command.ts +15 -3
  431. package/src/harness/harness-pod-dispatch.ts +3 -0
  432. package/src/harness/skill-exec.ts +21 -9
  433. package/src/harness/skill-select.ts +1 -1
  434. package/src/hooks/error-report-cloud.ts +101 -0
  435. package/src/hooks/receiver.ts +29 -2
  436. package/src/index.ts +129 -12
  437. package/src/intake-plane/actions.ts +354 -0
  438. package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
  439. package/src/intake-plane/intake-sources.ts +78 -8
  440. package/src/intake-plane/items.ts +14 -4
  441. package/src/intake-plane/linear-mission-sync.ts +80 -0
  442. package/src/intake-plane/linear-secretary-runtime.ts +178 -0
  443. package/src/intake-plane/linear-wish.ts +227 -1
  444. package/src/life/life-cli.ts +168 -0
  445. package/src/life/life-kinds.ts +160 -0
  446. package/src/live-supply/budget-consumer.ts +78 -0
  447. package/src/live-supply/read.ts +3 -0
  448. package/src/live-supply/snapshot.ts +45 -0
  449. package/src/llm/child-first-llm-observation.ts +112 -0
  450. package/src/llm/provider-credentials.ts +68 -6
  451. package/src/llm/provider-failure-evidence.ts +44 -0
  452. package/src/llm.ts +172 -12
  453. package/src/maturity/feature-maturity.ts +3 -3
  454. package/src/mcp/client.ts +7 -0
  455. package/src/mcp/proxy-runtime.ts +6 -1
  456. package/src/mcp/server.ts +54 -0
  457. package/src/msg/msg-sse-server.ts +3 -3
  458. package/src/msg/msg-store.ts +177 -19
  459. package/src/native-tool-catalog.ts +36 -2
  460. package/src/nexus/api/consult-requests.ts +18 -6
  461. package/src/nexus/api/discord-trigger-bot.ts +6 -6
  462. package/src/nexus/api/graphs-api.ts +4 -2
  463. package/src/nexus/api/grokbot-trigger-bot.ts +206 -0
  464. package/src/nexus/api/http-server.ts +37 -1
  465. package/src/nexus/api/mcp-public-allowlist.ts +2 -0
  466. package/src/nexus/api/telegram-trigger-bot.ts +6 -6
  467. package/src/nexus/boot/register-mcp-clients.ts +114 -8
  468. package/src/nexus/index.ts +22 -2
  469. package/src/nexus/outbound/format.ts +9 -0
  470. package/src/nexus/outbound/grokbot-adapter.ts +71 -0
  471. package/src/nexus/outbound/router.ts +121 -16
  472. package/src/nexus/setup-status.ts +9 -0
  473. package/src/nexus/state/state.ts +3 -0
  474. package/src/oauth/codex-account-store.ts +20 -7
  475. package/src/oauth/codex-owner-mirror.ts +81 -0
  476. package/src/oauth/codex.ts +17 -2
  477. package/src/oauth/fallback-chain.ts +47 -17
  478. package/src/onboarding/first-run-doctor.ts +8 -1
  479. package/src/onboarding/first-run.ts +126 -29
  480. package/src/onboarding/key-setup.ts +103 -0
  481. package/src/onboarding/menu-answer.ts +13 -0
  482. package/src/onboarding/secret-prompt.ts +37 -0
  483. package/src/plugins/install/plugin-install.ts +59 -0
  484. package/src/pr-tool/census.ts +130 -0
  485. package/src/preview/terminal.ts +22 -7
  486. package/src/prompt-enhance/enhance.ts +10 -0
  487. package/src/pty-shell/pty-control-ipc.ts +4 -1
  488. package/src/pty-shell/pty-write-provenance.ts +21 -3
  489. package/src/pty-shell/registry.ts +9 -2
  490. package/src/registry/catalog-server.ts +232 -0
  491. package/src/registry/loader.ts +45 -1
  492. package/src/registry/types.ts +1 -2
  493. package/src/release-loop/proposal-auto-place.ts +83 -0
  494. package/src/research/axis-fanout.ts +79 -29
  495. package/src/research/lenses/second-order.ts +312 -0
  496. package/src/self-dev/ask-launch-flow.ts +72 -1
  497. package/src/self-dev/dev-cli.ts +7 -2
  498. package/src/self-dev/dev-pipeline.ts +5 -0
  499. package/src/self-dev/draft-residue.ts +64 -5
  500. package/src/self-dev/draft-sweep.ts +31 -10
  501. package/src/self-dev/draft-triage-rules.ts +60 -3
  502. package/src/self-dev/graph-front-nodes.ts +2 -1
  503. package/src/self-dev/graph-journey-route.ts +76 -21
  504. package/src/self-dev/launch-preflight.ts +58 -0
  505. package/src/self-dev/orchestrate.ts +1 -1
  506. package/src/self-dev/run-supervisor.ts +152 -2
  507. package/src/self-dev/shard-aggregate.ts +4 -0
  508. package/src/self-dev/shard-run.ts +36 -15
  509. package/src/self-implement/abandoned-classification.ts +12 -3
  510. package/src/self-implement/budget-gate.ts +7 -0
  511. package/src/self-implement/child-llm-preference.ts +10 -1
  512. package/src/self-implement/doctor-visit.ts +30 -8
  513. package/src/self-implement/elanous-tui-spawn.ts +3 -0
  514. package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
  515. package/src/self-implement/gate-artifacts.ts +2 -1
  516. package/src/self-implement/goal-author-cli.ts +4 -2
  517. package/src/self-implement/goal-author.ts +549 -10
  518. package/src/self-implement/graph-overlay-yaml.ts +181 -4
  519. package/src/self-implement/graph-overlay.ts +3 -1
  520. package/src/self-implement/graph-profile-yaml.ts +107 -0
  521. package/src/self-implement/graph-yaml.ts +94 -5
  522. package/src/self-implement/off-diff-evidence.ts +249 -5
  523. package/src/self-implement/orchestrator.ts +298 -26
  524. package/src/self-implement/run-chart.ts +6 -3
  525. package/src/self-implement/run-ledger.ts +51 -1
  526. package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
  527. package/src/self-implement/tdd-evidence-tags.ts +9 -0
  528. package/src/self-implement/test-scenario-request.ts +37 -6
  529. package/src/self-implement/train-gate-receipt.ts +166 -0
  530. package/src/self-implement/train-gate-remote.ts +62 -18
  531. package/src/session/chat.ts +6 -4
  532. package/src/session/session-fanout.ts +2 -0
  533. package/src/session/streaming/acp-stream-sink.ts +2 -1
  534. package/src/session/streaming/chunk-producer.ts +6 -0
  535. package/src/session/streaming/stream-compositor.ts +3 -2
  536. package/src/session-runtime/index.ts +74 -6
  537. package/src/session-runtime/retry-policy.ts +1 -1
  538. package/src/setup/llm-env-detect.ts +3 -0
  539. package/src/setup/service-key-catalog.ts +46 -0
  540. package/src/setup/service-keys.ts +241 -0
  541. package/src/sidetab-core/model.ts +205 -10
  542. package/src/sidetab-core/visible-agent-mission-pair.ts +51 -0
  543. package/src/sidetab-core/visible-agent-mission.ts +182 -48
  544. package/src/skills/tools/agent.ts +23 -4
  545. package/src/skills/tools/omni-search.ts +127 -27
  546. package/src/task-agent/parent-host.ts +29 -1
  547. package/src/task-agent/recall-inject.ts +98 -0
  548. package/src/task-agent/repair-outcomes.ts +65 -0
  549. package/src/task-agent/task-hand.ts +46 -14
  550. package/src/task-orchestrator/dispatcher.ts +14 -1
  551. package/src/task-orchestrator/linear-capture-events.ts +55 -0
  552. package/src/task-orchestrator/store.ts +16 -5
  553. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +23 -1
  554. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +107 -1
  555. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
  556. package/src/task-orchestrator/surfaces/pod-si-warm-host.ts +21 -9
  557. package/src/task-orchestrator/surfaces/pod-source-receive.ts +23 -11
  558. package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
  559. package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +1 -1
  560. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +467 -77
  561. package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +45 -3
  562. package/src/task-orchestrator/surfaces/self-implement-pod.ts +210 -14
  563. package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
  564. package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
  565. package/src/task-orchestrator/types.ts +14 -0
  566. package/src/telegram.ts +14 -16
  567. package/src/terminal/coding-agent.ts +14 -5
  568. package/src/terminal/session-registry.ts +1 -1
  569. package/src/tool-hints/gate.ts +46 -14
  570. package/src/tool-hints/signals.ts +1 -1
  571. package/src/tool-hints/types.ts +2 -0
  572. package/src/tool-runtime/agent-runtime.ts +1 -0
  573. package/src/tool-runtime/browser-hand-runtime.ts +391 -0
  574. package/src/tool-runtime/browser-runtime.ts +33 -19
  575. package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
  576. package/src/tool-runtime/elanous-linear-secretary-runtime.ts +173 -0
  577. package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
  578. package/src/tool-runtime/index.ts +6 -0
  579. package/src/tool-runtime/types.ts +5 -0
  580. package/src/tui/entry.ts +51 -8
  581. package/src/tui/sidetab/attach.ts +252 -11
  582. package/src/tui/sidetab/herdr-portal.ts +225 -0
  583. package/src/tui/sidetab/list.ts +3 -2
  584. package/src/tui-client/next-dashboard-runtime.ts +52 -0
  585. package/src/user-config.ts +34 -9
  586. package/src/user-intent/types.ts +4 -3
  587. package/src/ux-sim/browser-hand.ts +165 -0
  588. package/src/ux-sim/draft-inventory-builder.ts +199 -0
  589. package/src/ux-sim/fake-browser-page.ts +81 -0
  590. package/src/ux-sim/fake-linear-device.ts +31 -0
  591. package/src/ux-sim/graph-engine-sim.ts +47 -0
  592. package/src/ux-sim/linear-secretary.ts +208 -0
  593. package/src/ux-sim/mock-scenario-catalog.json +81 -26
  594. package/src/ux-sim/mock-scenario-catalog.ts +175 -5
  595. package/src/ux-sim/onboarding-first-run-device.ts +31 -21
  596. package/src/ux-sim/release-sim-rig.ts +62 -18
  597. package/src/ux-sim/scenario.ts +70 -26
  598. package/src/ux-sim/service-key-setup.ts +113 -0
  599. package/src/ux-sim/term-slash-device.ts +74 -0
  600. package/src/ux-sim/turn-throw-sim.ts +31 -0
  601. package/src/version/packed-revision.json +1 -1
  602. package/src/web-search/exa.ts +77 -0
  603. package/src/web-search/index.ts +30 -9
  604. package/src/web-search/provider.ts +4 -1
  605. package/src/web-search/x-intent.ts +5 -0
  606. package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +0 -36
  608. package/apps/pwa/out/_next/static/chunks/1147-5196d19c222051b3.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/1319.b9b815ae0f181e06.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/1574.878c18ecc97b1bd4.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +0 -32
  614. package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/1945.7b54990d578c119b.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +0 -286
  620. package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +0 -34
  623. package/apps/pwa/out/_next/static/chunks/2456.b6de0e1c05f28843.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/2690.0521c738b7749931.js +0 -115
  629. package/apps/pwa/out/_next/static/chunks/2974.595d1e29d040cb6a.js +0 -64
  630. package/apps/pwa/out/_next/static/chunks/3207.a756c95e9ec8c3c8.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +0 -93
  632. package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +0 -41
  633. package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +0 -24
  635. package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +0 -77
  641. package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/4320.583cbab64db6be02.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/4770.769c9cd9c7034eba.js +0 -148
  647. package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +0 -74
  648. package/apps/pwa/out/_next/static/chunks/50061469.0326382241ef3b2d.js +0 -122
  649. package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +0 -149
  650. package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +0 -27
  652. package/apps/pwa/out/_next/static/chunks/53c73f84.373b6160adfa89a4.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/5440-4236de26c5ea5856.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +0 -226
  664. package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +0 -90
  665. package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +0 -104
  671. package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +0 -94
  672. package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +0 -24
  679. package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +0 -8
  687. package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/8505.fd803c6c33b54cc3.js +0 -79
  689. package/apps/pwa/out/_next/static/chunks/8546-6f03f8ea34dd61d9.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +0 -1
  692. package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +0 -1
  693. package/apps/pwa/out/_next/static/chunks/9211-330b6736a63d4cb3.js +0 -1
  694. package/apps/pwa/out/_next/static/chunks/9249.976f1e69a9d80754.js +0 -1
  695. package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +0 -1
  696. package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +0 -1
  697. package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +0 -1
  698. package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +0 -1
  699. package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +0 -1
  700. package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +0 -1
  701. package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +0 -1
  702. package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +0 -1
  703. package/apps/pwa/out/_next/static/chunks/9656-374232558fd528d0.js +0 -1
  704. package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +0 -62
  705. package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +0 -1
  706. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +0 -1
  707. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +0 -1
  708. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +0 -1
  709. package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +0 -1
  710. package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +0 -1
  711. package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +0 -1
  712. package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +0 -1
  713. package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +0 -1
  714. package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +0 -1
  715. package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +0 -1
  716. package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +0 -1
  717. package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +0 -1
  718. package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +0 -1
  719. package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +0 -1
  720. package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +0 -1
  721. package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +0 -1
  722. package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +0 -1
  723. package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +0 -1
  724. package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +0 -1
  725. package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +0 -1
  726. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +0 -1
  727. package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +0 -1
  728. package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +0 -1
  729. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +0 -1
  730. package/apps/pwa/out/_next/static/chunks/app/morning/page-0f291d3c8fd55a3a.js +0 -1
  731. package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +0 -1
  732. package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +0 -1
  733. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +0 -1
  734. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +0 -1
  735. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +0 -1
  736. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +0 -1
  737. package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +0 -1
  738. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +0 -1
  739. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +0 -1
  740. package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +0 -1
  741. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +0 -1
  742. package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +0 -1
  743. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +0 -1
  744. package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +0 -1
  745. package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +0 -1
  746. package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +0 -1
  747. package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +0 -1
  748. package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +0 -1
  749. package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +0 -1
  750. package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +0 -1
  751. package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +0 -1
  752. package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +0 -1
  753. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +0 -1
  754. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +0 -1
  755. package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +0 -1
  756. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +0 -1
  757. package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +0 -1
  758. package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +0 -1
  759. package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +0 -1
  760. package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +0 -1
  761. package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +0 -1
  762. package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +0 -1
  763. package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
  764. /package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → HMXsxdy5MIIcHPMHv1wD4}/_ssgManifest.js +0 -0
@@ -548,10 +548,37 @@ function reuseSameCellPr(run: CmdRunner, input: UpsertPrInput, target: NonNullab
548
548
  return fail('PR changed before superseding draft');
549
549
  const newRef = `refs/heads/${input.branch}`;
550
550
  if (!run('git', ['-C', cwd, 'check-ref-format', '--branch', input.branch]).ok) return fail('new run branch name invalid');
551
- const newRemote = run('git', ['-C', cwd, 'ls-remote', '--heads', 'origin', newRef]);
552
- if (!newRemote.ok || newRemote.out.trim()) return fail('new run branch already exists or remote unreadable');
553
551
  const localHead = run('git', ['-C', cwd, 'rev-parse', 'HEAD']);
554
- if (!localHead.ok || !/^[0-9a-f]{40}$/i.test(localHead.out.trim())) return fail('new run head unreadable');
552
+ const localHeadSha = localHead.out.trim();
553
+ if (!localHead.ok || !/^[0-9a-f]{40}$/i.test(localHeadSha)) return fail('new run head unreadable');
554
+ const newRemote = run('git', ['-C', cwd, 'ls-remote', '--heads', 'origin', newRef]);
555
+ if (!newRemote.ok) return fail('new run branch already exists or remote unreadable');
556
+ let retryBranchAlreadyExists = false;
557
+ if (newRemote.out.trim()) {
558
+ if (newRemote.out.trim() !== `${localHeadSha}\t${newRef}`) return fail('new run branch already exists or remote unreadable');
559
+ const existingDrafts = run('gh', ['pr', 'list', '--head', input.branch, '--state', 'open', '--json', 'url'], { cwd });
560
+ let existingRows: Array<{ url?: unknown }>;
561
+ try { existingRows = JSON.parse(existingDrafts.out) as Array<{ url?: unknown }>; }
562
+ catch { return fail('existing retry draft listing malformed'); }
563
+ if (!existingDrafts.ok) return fail('existing retry draft lookup failed');
564
+ if (!existingRows.length) retryBranchAlreadyExists = true;
565
+ else {
566
+ if (existingRows.length !== 1 || typeof existingRows[0]?.url !== 'string') return fail('existing retry draft lookup ambiguous');
567
+ const existingUrl = existingRows[0].url;
568
+ const existingView = run('gh', ['pr', 'view', existingUrl, '--json', 'state,isDraft,headRefOid,headRefName,body,url'], { cwd });
569
+ let existingFields: Record<string, unknown>;
570
+ try { existingFields = JSON.parse(existingView.out) as Record<string, unknown>; }
571
+ catch { return fail('existing retry draft identity malformed'); }
572
+ if (!existingView.ok || existingFields.state !== 'OPEN' || existingFields.isDraft !== true
573
+ || existingFields.headRefOid !== localHeadSha || existingFields.headRefName !== input.branch
574
+ || existingFields.url !== existingUrl || typeof existingFields.body !== 'string'
575
+ || cellIdFromBody(existingFields.body) !== cellIdFromBody(input.body)
576
+ || cardIdFromBody(existingFields.body) !== cardIdFromBody(input.body))
577
+ return fail('existing retry draft identity mismatch');
578
+ return { ok: true, url: existingUrl, reused: true };
579
+ }
580
+ }
581
+ if (!retryBranchAlreadyExists) {
555
582
  // Upload the commit through a unique scratch ref. GitHub's create-ref API then
556
583
  // atomically refuses a concurrent writer of the intended branch name.
557
584
  const runKey = input.runId ? runSuffixKey(input.runId) : null;
@@ -590,6 +617,7 @@ function reuseSameCellPr(run: CmdRunner, input: UpsertPrInput, target: NonNullab
590
617
  : { ok: false, out: '', err: 'repository identity unavailable' };
591
618
  reapScratchRef(createdRef.ok ? 'branch-created' : 'create-refused');
592
619
  if (!createdRef.ok) return fail(`new run branch create refused: ${(createdRef.err || createdRef.out).slice(0, 220)}`);
620
+ }
593
621
  const stateLabels = new Set(labelsForAxis('state').map(label => label.name));
594
622
  const labels = [...new Set([...(input.labels ?? []).filter(label => !stateLabels.has(label as typeof PR_LABEL_NAMES.running)),
595
623
  PR_LABEL_NAMES.running, ...(input.seat ? [`seat:${input.seat}`] : [])])];
@@ -30,7 +30,7 @@ import { debug } from '../../debug/log.js';
30
30
  import { globalAgentRegistry, type AgentRegistry } from '../../agent/registry.js';
31
31
  import type { TaskNotificationQueue } from '../../agent/task-notification.js';
32
32
  import { effectiveInstanceRoot } from '../../instance/resolve.js';
33
- import { writeAuthoredGoal } from '../../self-implement/goal-author.js';
33
+ import { resolveGoalAuthorReviewerPrecheckEnabled, writeAuthoredGoal } from '../../self-implement/goal-author.js';
34
34
  import { selfAnswerOrAssumeGoalDocumentClarifications, type GoalClarificationSelfResolver } from '../../self-implement/goal-author-clarification.js';
35
35
  import { writeGoalDocumentAtomic } from '../../self-implement/goal-document-write.js';
36
36
  import { DecisionLedger } from '../../decisions/decision-ledger.js';
@@ -220,6 +220,7 @@ type SelfImplementGoalAuthor = (ask: string, cwd: string, deps?: {
220
220
  goalTitle?: string;
221
221
  decomposeSteps?: (objective: string, opts?: { context?: string }) => Promise<readonly string[]>;
222
222
  onProgress?: (phase: import('../../self-implement/goal-author.js').GoalAuthorPhase, event: 'start' | 'end') => void;
223
+ reviewerPrecheckEnabled?: boolean;
223
224
  }) => Promise<{ path: string }>;
224
225
 
225
226
  const GOAL_ORIGINAL_TEXT_LIMIT = null;
@@ -328,6 +329,7 @@ export async function dispatchSelfImplement(
328
329
  const recentStepCounts = readRecentStepCountsFailOpen(recentStepCountReader);
329
330
  goalFile = (await authorGoal(goalSourceText, ctx.cwd, {
330
331
  goalTitle: feature,
332
+ reviewerPrecheckEnabled: resolveGoalAuthorReviewerPrecheckEnabled(),
331
333
  decomposeSteps: createDecomposeSteps(ctx.signal, {
332
334
  repositoryRoot: ctx.cwd,
333
335
  ...(adversarialReview !== undefined ? { adversarialReview } : {}),
@@ -40,8 +40,7 @@ export function buildWebSearchTool(): LLMToolSpec {
40
40
  return {
41
41
  name: 'WebSearch',
42
42
  description:
43
- 'Search the public web via the daemon\'s configured provider (Grok / ' +
44
- 'Firecrawl / etc.). When no key is available, falls back to keyless DuckDuckGo. ' +
43
+ 'Search the public web via Exa then Firecrawl; X/Twitter intent may use Grok. ' +
45
44
  'Returns a ranked list of URLs + titles + snippets. ' +
46
45
  'For fact questions, answer directly from the snippets and URLs; read the full body only when insufficient. ' +
47
46
  'Pair with a follow-up Read or external WebFetch when the model needs ' +
@@ -32,6 +32,10 @@ export interface BriefItem {
32
32
  deadline: string | null;
33
33
  evidence: string | null;
34
34
  source: string;
35
+ /** Existing Linear issue identifier; this is the secretary contract key. */
36
+ issue_ref?: string | null;
37
+ /** Parent Linear issue UUID used by the Linear comment projector. */
38
+ linearIssueId?: string | null;
35
39
  created_at: string;
36
40
  sent_at: string | null;
37
41
  }
@@ -43,6 +47,9 @@ export interface AddBriefItem {
43
47
  deadline?: string | null;
44
48
  evidence?: string | null;
45
49
  source: string;
50
+ /** Reuses the Linear secretary issue identifier; no intake-specific key is created. */
51
+ issueRef?: string | null;
52
+ linearIssueId?: string;
46
53
  createdAt?: string;
47
54
  /** Optional normalized claim identity and time window for repeat observations. */
48
55
  dedupeKey?: string;
@@ -185,6 +192,7 @@ function itemLine(item: BriefItem): string {
185
192
  const extra = [
186
193
  item.deadline ? `마감: ${item.deadline}` : '',
187
194
  item.evidence ? `근거: ${item.evidence}` : '',
195
+ item.issue_ref ? `관련 이슈: ${item.issue_ref}` : '',
188
196
  `출처: ${item.source}`,
189
197
  ].filter(Boolean).join(' · ');
190
198
  return `- [${item.priority}] ${item.text} (${extra})`;
@@ -207,6 +215,7 @@ function migrateLegacyItems(db: Database, log: (category: string, event: string,
207
215
  deadline TEXT,
208
216
  evidence TEXT,
209
217
  source TEXT NOT NULL,
218
+ linear_issue_id TEXT,
210
219
  created_at TEXT NOT NULL,
211
220
  sent_at TEXT
212
221
  )`);
@@ -222,6 +231,12 @@ function migrateLegacyItems(db: Database, log: (category: string, event: string,
222
231
  log('briefing.items', 'migrated-legacy', { rows: (db.query('SELECT COUNT(*) AS n FROM items_v1').get() as { n: number }).n });
223
232
  }
224
233
 
234
+ function briefItem(row: BriefItem): BriefItem {
235
+ if (row.issue_ref != null) return row;
236
+ const { issue_ref: _issueRef, ...legacy } = row;
237
+ return legacy;
238
+ }
239
+
225
240
  /** Append-only briefing item ledger at `<state>/briefing/items.sqlite`. */
226
241
  export class BriefItemsLedger {
227
242
  readonly path: string;
@@ -251,6 +266,8 @@ export class BriefItemsLedger {
251
266
  deadline TEXT,
252
267
  evidence TEXT,
253
268
  source TEXT NOT NULL,
269
+ issue_ref TEXT,
270
+ linear_issue_id TEXT,
254
271
  created_at TEXT NOT NULL,
255
272
  sent_at TEXT
256
273
  );
@@ -284,8 +301,11 @@ export class BriefItemsLedger {
284
301
  update_id TEXT NOT NULL,
285
302
  PRIMARY KEY (bot_id, chat_id, update_id)
286
303
  );`);
287
- if (!(db.query("SELECT name FROM pragma_table_info('items')").all() as { name: string }[]).some(column => column.name === 'dedupe_key')) {
288
- db.exec('ALTER TABLE items ADD COLUMN dedupe_key TEXT');
304
+ const columns = db.query("SELECT name FROM pragma_table_info('items')").all() as { name: string }[];
305
+ if (!columns.some(column => column.name === 'dedupe_key')) db.exec('ALTER TABLE items ADD COLUMN dedupe_key TEXT');
306
+ if (!columns.some(column => column.name === 'issue_ref')) db.exec('ALTER TABLE items ADD COLUMN issue_ref TEXT');
307
+ if (!columns.some(column => column.name === 'linear_issue_id')) {
308
+ db.exec('ALTER TABLE items ADD COLUMN linear_issue_id TEXT');
289
309
  }
290
310
  db.exec('CREATE INDEX IF NOT EXISTS items_dedupe ON items(source, dedupe_key, created_at)');
291
311
  return work(db);
@@ -301,6 +321,9 @@ export class BriefItemsLedger {
301
321
  if (!(BRIEF_DOMAINS as readonly string[]).includes(input.domain)) throw new BriefItemsInputError('invalid domain');
302
322
  if (!(BRIEF_PRIORITIES as readonly string[]).includes(input.priority)) throw new BriefItemsInputError('invalid priority');
303
323
  const source = required(input.source, 'source');
324
+ if (input.linearIssueId !== undefined && !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-8][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i.test(input.linearIssueId)) {
325
+ throw new BriefItemsInputError('invalid Linear issue UUID');
326
+ }
304
327
  const deadline = optional(input.deadline, 'deadline');
305
328
  // Every field that reaches the composed Markdown is one line, so no stored item can forge a heading or entry (ACP must-fix).
306
329
  for (const [field, value] of [['source', source], ['evidence', input.evidence ?? null], ['deadline', deadline]] as const) {
@@ -311,6 +334,8 @@ export class BriefItemsLedger {
311
334
  if (!format.test(deadline) || !Number.isFinite(Date.parse(deadline))) throw new BriefItemsInputError('invalid deadline');
312
335
  }
313
336
  const evidence = optional(input.evidence, 'evidence');
337
+ const issueRef = optional(input.issueRef, 'issueRef');
338
+ if (issueRef !== null && /[\r\n]/.test(issueRef)) throw new BriefItemsInputError('issueRef must be a single line');
314
339
  const createdAt = input.createdAt ?? this.now().toISOString();
315
340
  if (!Number.isFinite(Date.parse(createdAt))) throw new BriefItemsInputError('invalid createdAt');
316
341
  const dedupeKey = input.dedupeKey === undefined ? null : normalizeClaim(required(input.dedupeKey, 'dedupeKey'));
@@ -319,7 +344,7 @@ export class BriefItemsLedger {
319
344
  throw new BriefItemsInputError('invalid dedupe window');
320
345
  }
321
346
  const selected = this.using(db => {
322
- const select = 'SELECT id, text, domain, priority, deadline, evidence, source, created_at, (SELECT MIN(sent_at) FROM sends WHERE sends.item_id = items.id) AS sent_at FROM items WHERE id = ?';
347
+ const select = 'SELECT id, text, domain, priority, deadline, evidence, source, issue_ref, linear_issue_id AS linearIssueId, created_at, (SELECT MIN(sent_at) FROM sends WHERE sends.item_id = items.id) AS sent_at FROM items WHERE id = ?';
323
348
  db.exec('BEGIN IMMEDIATE');
324
349
  try {
325
350
  if (dedupeKey !== null && windowMs !== undefined) {
@@ -329,15 +354,15 @@ export class BriefItemsLedger {
329
354
  AND julianday(created_at) <= julianday(?) ORDER BY id DESC LIMIT 1`)
330
355
  .get(source, dedupeKey, createdAt, windowMs, createdAt) as { id: number } | null;
331
356
  if (existing) {
332
- const item = db.query(select).get(existing.id) as BriefItem;
357
+ const item = briefItem(db.query(select).get(existing.id) as BriefItem);
333
358
  db.exec('COMMIT');
334
359
  return { item, added: false };
335
360
  }
336
361
  }
337
362
  const result = db.query(
338
- 'INSERT INTO items (text, domain, priority, deadline, evidence, source, created_at, sent_at, dedupe_key) VALUES (?, ?, ?, ?, ?, ?, ?, NULL, ?)',
339
- ).run(text, input.domain, input.priority, deadline, evidence, source, createdAt, dedupeKey);
340
- const item = db.query(select).get(result.lastInsertRowid) as BriefItem;
363
+ 'INSERT INTO items (text, domain, priority, deadline, evidence, source, issue_ref, linear_issue_id, created_at, sent_at, dedupe_key) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, NULL, ?)',
364
+ ).run(text, input.domain, input.priority, deadline, evidence, source, issueRef, input.linearIssueId ?? null, createdAt, dedupeKey);
365
+ const item = briefItem(db.query(select).get(result.lastInsertRowid) as BriefItem);
341
366
  db.exec('COMMIT');
342
367
  return { item, added: true };
343
368
  } catch (cause) {
@@ -434,9 +459,13 @@ export class BriefItemsLedger {
434
459
 
435
460
  /** Insertion order. Optional domain filter. Item text is the stored original. */
436
461
  list(filters: { domain?: BriefDomain } = {}): BriefItem[] {
437
- return this.using(db => (filters.domain === undefined
438
- ? db.query('SELECT id, text, domain, priority, deadline, evidence, source, created_at, (SELECT MIN(sent_at) FROM sends WHERE sends.item_id = items.id) AS sent_at FROM items ORDER BY id').all()
439
- : db.query('SELECT id, text, domain, priority, deadline, evidence, source, created_at, (SELECT MIN(sent_at) FROM sends WHERE sends.item_id = items.id) AS sent_at FROM items WHERE domain = ? ORDER BY id').all(filters.domain)) as BriefItem[]);
462
+ const rows = this.using(db => {
463
+ const select = 'SELECT id, text, domain, priority, deadline, evidence, source, issue_ref, linear_issue_id AS linearIssueId, created_at, (SELECT MIN(sent_at) FROM sends WHERE sends.item_id = items.id) AS sent_at FROM items';
464
+ return filters.domain === undefined
465
+ ? db.query(`${select} ORDER BY id`).all()
466
+ : db.query(`${select} WHERE domain = ? ORDER BY id`).all(filters.domain);
467
+ }) as BriefItem[];
468
+ return rows.map(briefItem);
440
469
  }
441
470
 
442
471
  /**
@@ -450,7 +479,7 @@ export class BriefItemsLedger {
450
479
  }
451
480
 
452
481
  private itemsFromDb(db: Database): BriefItem[] {
453
- return db.query('SELECT id, text, domain, priority, deadline, evidence, source, created_at, (SELECT MIN(sent_at) FROM sends WHERE sends.item_id = items.id) AS sent_at FROM items ORDER BY id').all() as BriefItem[];
482
+ return (db.query('SELECT id, text, domain, priority, deadline, evidence, source, issue_ref, linear_issue_id AS linearIssueId, created_at, (SELECT MIN(sent_at) FROM sends WHERE sends.item_id = items.id) AS sent_at FROM items ORDER BY id').all() as BriefItem[]).map(briefItem);
454
483
  }
455
484
 
456
485
  private pageFromDb(db: Database, slot: BriefSendSlot): { markdown: string; ids: number[] } {
@@ -562,3 +591,18 @@ export class BriefItemsLedger {
562
591
  return this.using(db => db.transaction(() => this.markSentInDb(db, ids, slot))());
563
592
  }
564
593
  }
594
+
595
+ export interface IntakeDailyBrief {
596
+ orchestrationId: string;
597
+ markdown: string;
598
+ }
599
+
600
+ function orchestrationId(): string {
601
+ return globalThis.crypto?.randomUUID?.() ?? `intake-brief-${Date.now()}-${Math.random().toString(36).slice(2, 10)}`;
602
+ }
603
+
604
+ /** Graph entrypoint for the daily 08:30 briefing; requirement-funnel items stay ephemeral. */
605
+ export function composeIntakeDailyBrief(options: BriefItemsOptions = {}): IntakeDailyBrief {
606
+ const ledger = new BriefItemsLedger(options);
607
+ return { orchestrationId: orchestrationId(), markdown: ledger.compose('08:30') };
608
+ }
@@ -540,7 +540,7 @@ export async function runChatTurnCli(opts: {
540
540
  tools = built;
541
541
  dispatchTool = (name, args) => built.dispatch(name, args, { signal: toolAbort.signal });
542
542
  enabledToolNames = built.specs.map(s => s.name);
543
- process.once('SIGINT', abortToolsOnSigint);
543
+ process.on('SIGINT', abortToolsOnSigint);
544
544
  }
545
545
  // Wire the universal preamble (project anchor + project tree +
546
546
  // family addendum + session-specific guidance) into every CLI system
@@ -600,6 +600,7 @@ export async function runChatTurnCli(opts: {
600
600
  userConfig: opts.cfg,
601
601
  sessionId: session.id,
602
602
  userText: opts.userText,
603
+ ...(opts.surface === 'ask' ? { utteranceSurface: 'ask' as const } : {}),
603
604
  systemPrompt: agentSystemPrompt,
604
605
  onDelta: (d) => {
605
606
  replyChunks.push(d);
@@ -0,0 +1,31 @@
1
+ import type { Command } from 'commander';
2
+ import { refreshServerCatalog } from '../registry/catalog-server.js';
3
+ import { reloadCatalog } from '../registry/loader.js';
4
+
5
+ export interface CatalogCliDeps {
6
+ refresh?: typeof refreshServerCatalog;
7
+ reload?: typeof reloadCatalog;
8
+ write?: (line: string) => void;
9
+ setExitCode?: (code: number) => void;
10
+ }
11
+
12
+ export function registerCatalogCommands(program: Command, deps: CatalogCliDeps = {}): void {
13
+ const catalog = program.command('catalog').description('서명된 LLM 모델 카탈로그 관리');
14
+ catalog.command('refresh')
15
+ .description('서버 카탈로그를 서명·판 검증 후 로컬 캐시에 갱신')
16
+ .option('--json', '구조화 결과')
17
+ .option('--url <url>', '카탈로그 서버 주소 재정의(검증된 서명만 수용)')
18
+ .action(async (opts: { json?: boolean; url?: string }) => {
19
+ const result = await (deps.refresh ?? refreshServerCatalog)(opts.url ? { url: opts.url } : {});
20
+ const write = deps.write ?? ((line: string) => console.log(line));
21
+ if (result.ok) {
22
+ (deps.reload ?? reloadCatalog)();
23
+ const output = { outcome: 'updated', catalogVersion: result.payload.catalogVersion };
24
+ write(opts.json ? JSON.stringify(output) : `카탈로그 갱신 완료 · v${output.catalogVersion}`);
25
+ return;
26
+ }
27
+ const output = { outcome: 'failed', reason: result.reason };
28
+ write(opts.json ? JSON.stringify(output) : `카탈로그 갱신 실패 · ${output.reason}`);
29
+ (deps.setExitCode ?? ((code: number) => { process.exitCode = code; }))(1);
30
+ });
31
+ }
@@ -28,6 +28,7 @@ export interface ConnectorCliDeps {
28
28
  log?: typeof debug.log;
29
29
  bearerToken?: string;
30
30
  readKey?: () => Promise<string>;
31
+ stateDir?: string;
31
32
  }
32
33
 
33
34
  async function setLinearSecret(id: string, deps: ConnectorCliDeps): Promise<number> {
@@ -202,3 +203,18 @@ export async function runLinearSync(opts: ConnectorSyncOptions, deps: ConnectorC
202
203
  const events = await fetchLinearIssues({ apiKey: key, teamKey: opts.team, labelOrPrefix: opts.prefix, fetch: deps.fetch ?? fetch, ledger: deps.ledger });
203
204
  return applyLinearEvents(events, opts, deps);
204
205
  }
206
+
207
+ export async function runLinearDailyProgress(opts: { send?: boolean; json?: boolean; version?: string }, deps: ConnectorCliDeps = {}): Promise<number> {
208
+ const { syncLinearDailyProgress } = await import('../connectors/linear-daily-progress.js');
209
+ const result = await syncLinearDailyProgress({
210
+ dryRun: !opts.send,
211
+ ...(opts.version ? { version: opts.version } : {}),
212
+ ...(deps.stateDir ? { stateDir: deps.stateDir } : {}),
213
+ ...(deps.getSecret ? { getSecret: deps.getSecret } : {}),
214
+ ...(deps.fetch ? { fetch: deps.fetch } : {}),
215
+ ...(deps.log ? { log: deps.log } : {}),
216
+ });
217
+ (deps.output ?? console.log)(opts.json ? JSON.stringify(result) :
218
+ `connector linear daily-summary: ${result.dryRun ? 'dry-run' : 'send'} · planned ${result.plan.length} · posted ${result.posted} · duplicate ${result.skipped} · failed ${result.failed}`);
219
+ return result.failed ? 1 : 0;
220
+ }
@@ -12,8 +12,9 @@ import { runLightMember, type LightResource } from '../control-plane/light-membe
12
12
  import { RESOURCE_KINDS, type ResourceKind } from '../control-plane/ledger.js';
13
13
  import { runControlJoin, type ControlJoinOptions } from './control-join-cli.js';
14
14
  import type { ResourceView } from '../control-plane/ledger.js';
15
- import { issueMemberToken, revokeMemberToken, listMemberTokens } from '../control-plane/member-tokens.js';
15
+ import { issueMemberToken, issueMemberTokenToFile, revokeMemberToken, listMemberTokens } from '../control-plane/member-tokens.js';
16
16
  import { collectControlStatus, readControlHqLease } from '../control/control-status.js';
17
+ import { debug } from '../debug/log.js';
17
18
  import { getUserConfig } from '../user-config.js';
18
19
 
19
20
  function controlPort(flag?: string): number {
@@ -98,7 +99,7 @@ export async function runResourcesQuery(options: { where?: string; kind?: string
98
99
  }
99
100
  }
100
101
 
101
- export async function runControlServe(options: { port?: string; host?: string; followLease?: boolean; followHqLease?: boolean; bucket?: string;
102
+ export async function runControlServe(options: { port?: string; host?: string; allowClusterBind?: boolean; followLease?: boolean; followHqLease?: boolean; bucket?: string;
102
103
  read?: (bucket: string) => RoleLeaseRead | Promise<RoleLeaseRead>; machine?: string;
103
104
  readHq?: typeof readControlHqLease; hqHostName?: string;
104
105
  /** 시험 seam — 이 신호로 멈춘다. ⛔ 시험이 `process.emit('SIGTERM')` 로 멈추면 같은 프로세스의 다른 SIGTERM 처리기
@@ -131,7 +132,10 @@ export async function runControlServe(options: { port?: string; host?: string; f
131
132
  },
132
133
  }) : undefined;
133
134
  let server: ReturnType<typeof startControlServer>;
134
- try { server = startControlServer({ port, hostname: options.host, ...(leaseView ? { leaseView, requireKnownLeaseForWrites: true } : {}) }); }
135
+ if (options.allowClusterBind && options.host === '0.0.0.0') {
136
+ debug.log('control-plane', 'cluster-bind-enabled', { hostname: options.host, port, exposure: 'operator-restricted-cluster-service' });
137
+ }
138
+ try { server = startControlServer({ port, hostname: options.host, allowClusterBind: options.allowClusterBind, ...(leaseView ? { leaseView, requireKnownLeaseForWrites: true } : {}) }); }
135
139
  catch (error) { console.error(`관제부 시작 실패: ${reasonFor(error)}`); process.exitCode = 2; return; }
136
140
  await new Promise<void>(resolve => {
137
141
  const stop = () => {
@@ -214,10 +218,11 @@ export function registerControlCommands(program: Command): void {
214
218
  control.command('serve').description('관제부를 포그라운드에서 실행')
215
219
  .option('--port <n>', '리스닝 포트(0=임시 포트)')
216
220
  .option('--host <addr>', '루프백 또는 tailnet 바인드 주소')
221
+ .option('--allow-cluster-bind', '클러스터 내부 Service용 0.0.0.0 바인드를 명시 허용')
217
222
  .option('--follow-lease', '임대 보유자일 때만 쓰기')
218
223
  .option('--follow-hq-lease', 'HQ 임대 보유자일 때만 쓰기')
219
224
  .option('--bucket <bucket>', 'GCS 임대 버킷')
220
- .action((options: { port?: string; host?: string; followLease?: boolean; followHqLease?: boolean; bucket?: string }) => runControlServe(options));
225
+ .action((options: { port?: string; host?: string; allowClusterBind?: boolean; followLease?: boolean; followHqLease?: boolean; bucket?: string }) => runControlServe(options));
221
226
  control.command('member').description('합류 기계의 자원을 포그라운드에서 등록·심박')
222
227
  .option('--resource <kind:name=url>', '등록할 자원', (value: string, previous: string[]) => [...previous, value], [] as string[])
223
228
  .option('--interval <seconds>', '심박 간격(초)')
@@ -244,8 +249,12 @@ export function registerControlCommands(program: Command): void {
244
249
  });
245
250
  const token = control.command('token').description('기계별 범위 토큰 관리');
246
251
  token.command('issue <machine>').description('기계 토큰 발급 또는 교체')
247
- .action((machine: string) => {
248
- try { console.log(issueMemberToken(machine)); }
252
+ .option('--token-file <path>', '토큰을 새 0600 파일로만 쓰고 stdout에 출력하지 않음')
253
+ .action((machine: string, options: { tokenFile?: string }) => {
254
+ try {
255
+ if (options.tokenFile) issueMemberTokenToFile(machine, options.tokenFile);
256
+ else console.log(issueMemberToken(machine));
257
+ }
249
258
  catch (error) { console.error(reasonFor(error)); process.exitCode = 2; }
250
259
  });
251
260
  token.command('revoke <machine>').description('기계 토큰 폐기')
@@ -442,8 +442,8 @@ export function nodePtyRebuildPlan(deps: DoctorFixDeps): { versionDir: string; p
442
442
  try {
443
443
  const versionDir = (deps.realpath ?? realpathSync)(join(readiness.installPrefix, 'current'));
444
444
  const packageDir = join(versionDir, 'node_modules', 'elanous');
445
- const pkg = JSON.parse((deps.readFile ?? ((path: string) => readFileSync(path, 'utf8')))(join(packageDir, 'package.json'))) as { dependencies?: Record<string, string>; optionalDependencies?: Record<string, string> };
446
- const version = pkg.optionalDependencies?.['node-pty'] ?? pkg.dependencies?.['node-pty'];
445
+ const pkg = JSON.parse((deps.readFile ?? ((path: string) => readFileSync(path, 'utf8')))(join(packageDir, 'package.json'))) as { dependencies?: Record<string, string>; optionalDependencies?: Record<string, string>; peerDependencies?: Record<string, string>; elanousOptionalIntegrations?: Record<string, string> };
446
+ const version = pkg.elanousOptionalIntegrations?.['node-pty'] ?? pkg.optionalDependencies?.['node-pty'] ?? pkg.dependencies?.['node-pty'] ?? pkg.peerDependencies?.['node-pty'];
447
447
  if (!version) return undefined;
448
448
  // RFC #20265 A2 amzn2: node-pty 는 C++20(gcc10) · node-gyp 는 Python 3.8+ 를 요구한다.
449
449
  const env: Record<string, string> = readiness.distro === 'amzn2' ? { CC: 'gcc10-gcc', CXX: 'gcc10-g++', PYTHON: 'python3.8' } : {};
@@ -1,23 +1,44 @@
1
1
  import type { Command } from 'commander';
2
2
  import { randomUUID } from 'node:crypto';
3
+ import { resolve } from 'node:path';
3
4
  import { effectiveInstanceRoot } from '../instance/resolve.js';
4
- import { addSource, canonicalSeat, dueSources, expiredSource, listSources, removeSource, runDue, type SourceKind } from '../intake-plane/intake-sources.js';
5
+ import { addSource, canonicalSeat, dueSources, expiredSource, listSources, removeSource, runDue, type RunDueDeps, type SourceKind } from '../intake-plane/intake-sources.js';
6
+ import { projectTopicBriefing, subscribeTopicSearch, type SubscribeTopicSearchInput } from '../intake-plane/actions.js';
7
+ import { runIntakeIssueBriefing } from '../intake-plane/actions.js';
5
8
 
6
- export function registerIntakeSourceCommands(intake: Command, root: () => string = effectiveInstanceRoot): void {
9
+ export function registerIntakeSourceCommands(intake: Command, root: () => string = effectiveInstanceRoot,
10
+ deps: { subscribeTopicSearch?: (input: SubscribeTopicSearchInput, options?: { stateDir?: string; runDeps?: RunDueDeps }) => ReturnType<typeof subscribeTopicSearch> } = {}): void {
7
11
  const source = intake.command('source').description('자리별 흡수 원천과 주기 등록·조회·실행');
8
12
  const fail = (error: unknown) => { console.error(error instanceof Error ? error.message : String(error)); process.exitCode = 2; };
9
13
  source.command('add')
10
14
  .requiredOption('--seat <id>', '자리 id 또는 별칭')
11
- .requiredOption('--kind <kind>', 'github-query | rss | command')
15
+ .requiredOption('--kind <kind>', 'github-query | rss | command | topic-search')
12
16
  .requiredOption('--spec <spec>', 'GitHub 질의 · 피드 URL · 명령')
13
17
  .requiredOption('--every <cadence>', 'Nh | Nd | Nw')
14
18
  .option('--until <date>', '만료 시작 날짜 YYYY-MM-DD (UTC)')
15
19
  .option('--why <reason>', '등록 이유')
16
20
  .option('--id <id>', '원천 id')
17
- .action((opts: { seat: string; kind: string; spec: string; every: string; until?: string; why?: string; id?: string }) => {
21
+ .option('--linear-issue-id <uuid>', 'topic-search parent Linear issue UUID')
22
+ .option('--schedule-cron <expression>', 'topic-search schedule registry cron (e.g. 0 8 * * 1)')
23
+ .option('--telegram-dry-run-file <path>', 'Telegram 브리핑 본문을 이 파일에 기록하고 실제 발송은 하지 않음 (topic-search)')
24
+ .action(async (opts: { seat: string; kind: string; spec: string; every: string; until?: string; why?: string; id?: string; linearIssueId?: string; scheduleCron?: string; telegramDryRunFile?: string }) => {
18
25
  try {
26
+ if (opts.kind === 'topic-search') {
27
+ if (!opts.linearIssueId || !opts.scheduleCron) throw new Error('topic-search 는 --linear-issue-id 와 --schedule-cron 이 필요하다');
28
+ const telegramDryRunFile = opts.telegramDryRunFile ? resolve(opts.telegramDryRunFile) : undefined;
29
+ const result = await (deps.subscribeTopicSearch ?? subscribeTopicSearch)({ seat: opts.seat, topic: opts.spec,
30
+ linearIssueId: opts.linearIssueId, every: opts.every, scheduleCron: opts.scheduleCron,
31
+ ...(telegramDryRunFile ? { telegramDryRunFile } : {}) },
32
+ { stateDir: root(), runDeps: { projectTopicBriefing: telegramDryRunFile
33
+ ? (registered, items, stateDir) => projectTopicBriefing(registered, items, stateDir, { telegramDryRunFile })
34
+ : projectTopicBriefing } });
35
+ console.log(`${result.source.id} ${result.source.seat} topic-search ${result.source.every} schedule=${result.scheduleId} immediate=${result.immediate.ran.map(row => row.items).join(',')}`);
36
+ return;
37
+ }
19
38
  const added = addSource({ id: opts.id ?? `src-${randomUUID().slice(0, 8)}`, seat: opts.seat, kind: opts.kind as SourceKind,
20
- spec: opts.spec, every: opts.every, ...(opts.until ? { until: opts.until } : {}), ...(opts.why ? { why: opts.why } : {}) }, root());
39
+ spec: opts.spec, every: opts.every, ...(opts.until ? { until: opts.until } : {}), ...(opts.why ? { why: opts.why } : {}),
40
+ ...(opts.linearIssueId ? { linearIssueId: opts.linearIssueId } : {}),
41
+ ...(opts.scheduleCron ? { scheduleCron: opts.scheduleCron } : {}) }, root());
21
42
  console.log(`${added.id} ${added.seat} ${added.kind} ${added.every}`);
22
43
  } catch (error) { fail(error); }
23
44
  });
@@ -38,18 +59,33 @@ export function registerIntakeSourceCommands(intake: Command, root: () => string
38
59
  });
39
60
  source.command('run-due')
40
61
  .option('--seat <id>', '자리 id 또는 별칭')
62
+ .option('--source-id <id>', '단일 입력원만 실행 (스케줄 레지스트리 호출용)')
63
+ .option('--project-issue-briefing', 'topic-search 결과를 관련 Linear 이슈의 Telegram·코멘트에 투영')
64
+ .option('--telegram-dry-run-file <path>', 'Telegram 브리핑 본문을 이 파일에 기록하고 실제 발송은 하지 않음')
41
65
  .option('--dry-run', '기한 원천 목록만 · 수집·원장·마지막 실행 시각 무변')
42
66
  .option('--json', 'JSON 출력')
43
- .action(async (opts: { seat?: string; dryRun?: boolean; json?: boolean }) => {
67
+ .action(async (opts: { seat?: string; sourceId?: string; projectIssueBriefing?: boolean; telegramDryRunFile?: string; dryRun?: boolean; json?: boolean }) => {
44
68
  try {
45
69
  const seat = opts.seat === undefined ? undefined : canonicalSeat(opts.seat);
46
70
  if (opts.dryRun) {
47
- const sources = dueSources(new Date(), root()).filter((entry) => seat === undefined || entry.seat === seat);
71
+ const sources = dueSources(new Date(), root(), opts.sourceId).filter((entry) => seat === undefined || entry.seat === seat);
48
72
  if (opts.json) console.log(JSON.stringify(sources));
49
73
  else for (const entry of sources) console.log(`${entry.id} ${entry.seat} ${entry.kind} ${entry.every}`);
50
74
  return;
51
75
  }
52
- const result = await runDue({ seat, deps: { stateDir: root() } });
76
+ const telegramDryRunFile = opts.telegramDryRunFile ? resolve(opts.telegramDryRunFile) : undefined;
77
+ const result = await runDue({ seat, sourceId: opts.sourceId, deps: { stateDir: root(),
78
+ ...(opts.projectIssueBriefing || telegramDryRunFile ? { projectTopicBriefing: telegramDryRunFile
79
+ ? (registered, items, stateDir) => projectTopicBriefing(registered, items, stateDir, { telegramDryRunFile })
80
+ : projectTopicBriefing } : {}),
81
+ onCollected: async (source, raws) => {
82
+ if (!source.issueRef) return;
83
+ await runIntakeIssueBriefing({
84
+ issueRef: source.issueRef, topic: source.spec, state: 'open', collected: true,
85
+ evidence: raws.filter(raw => typeof raw.url === 'string' && raw.url.trim().length > 0)
86
+ .map(raw => ({ title: raw.title || source.spec, url: raw.url!, summary: raw.text || raw.title || source.spec })),
87
+ }, { stateDir: root() });
88
+ } } });
53
89
  if (opts.json) console.log(JSON.stringify(result));
54
90
  else for (const row of result.ran) console.log(`${row.id} ${row.items}${row.error ? ` 실패: ${row.error}` : ''}`);
55
91
  if (result.ran.some((row) => row.error)) process.exitCode = 1;
@@ -108,6 +108,12 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
108
108
  "auto-merge-head-guard",
109
109
  "auto-merged",
110
110
  "auto-review-labeled",
111
+ "author.dialog.closed",
112
+ "author.reviewer-precheck.skipped",
113
+ "author.reviewer-precheck.completed",
114
+ "author.reviewer-precheck.revision-rejected",
115
+ "author.reviewer-precheck.failed-soft",
116
+ "author.reviewer.round",
111
117
  "auto-worktree-prepared",
112
118
  "autoproceed",
113
119
  "autoroute.decision",
@@ -1417,6 +1423,8 @@ export const KNOWN_LOG_EVENT_NAMES: ReadonlySet<string> = new Set([
1417
1423
  "superseded-goal-file-bypassed",
1418
1424
  "superseded-goal-file-rejected",
1419
1425
  "supervisor-plan-revision-recorded",
1426
+ "supervisor.reauthor-request",
1427
+ "supervisor.reauthor-unjoined",
1420
1428
  "suppressed",
1421
1429
  "suppressed.frustration",
1422
1430
  "surface-capped",
@@ -3,7 +3,7 @@ import { mkdirSync } from 'node:fs';
3
3
  import { dirname } from 'node:path';
4
4
  import { ensureAuthToken } from '../auth/acp-token.js';
5
5
  import { elanousStateRoot } from '../autopilot/state-paths.js';
6
- import { canonicalSeatId, openMsgStore, openMsgStoreReadOnly, type Message, type MsgStore } from '../msg/msg-store.js';
6
+ import { canonicalMessageAddress, canonicalSeatId, openMsgStore, openMsgStoreReadOnly, type Message, type MsgStore } from '../msg/msg-store.js';
7
7
  import { clearPostOffice, ensurePostOffice, writePostOffice } from '../msg/msg-post-office.js';
8
8
  import { acquireLockSync } from '../storage/file-lock.js';
9
9
  import { GitHubMsgMirrorTransport } from '../msg/msg-mirror-github.js';
@@ -325,7 +325,8 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
325
325
  const from = seat(opts.from, '--from');
326
326
  const unsupported = opts.to === undefined ? null : unsupportedLoopAddressNotice(opts.to);
327
327
  if (unsupported) out.error(unsupported);
328
- const to = seat(opts.to, '--to');
328
+ if (opts.to === undefined) throw new Error('--to is required');
329
+ const to = canonicalMessageAddress(opts.to);
329
330
  // Validate the auto-reply target before saving — a mismatched flag must not leave a stored message behind.
330
331
  const agentAddress = agentReplyAddress(opts.agentReply);
331
332
  if (agentAddress !== null) requireAgentTarget(agentAddress, to);
@@ -364,7 +365,7 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
364
365
  msg.command('route <address>').description('Show how a post to this address is read (replyBody) and woken (wake)')
365
366
  .option('--json')
366
367
  .action((address: string, opts: CommonOptions) => run(() => {
367
- const to = canonicalSeatId(address);
368
+ const to = canonicalMessageAddress(address);
368
369
  const wake = resolveWake(to, deps.wakeDeps);
369
370
  const row = { msgAddress: to, replyBody: messageRouteFor(to)?.replyBody ?? null, ...wake };
370
371
  emit(row, opts.json, () => out.log(`${to}\treplyBody=${row.replyBody ?? '모름'}\twake=${wake.wake}`
@@ -372,6 +373,34 @@ export function registerMsgCommands(program: Command, deps: MsgCliDeps = {}): vo
372
373
  + `\t(${wake.source}${wake.reason ? `: ${wake.reason}` : ''})`));
373
374
  })());
374
375
 
376
+ const group = msg.command('group').description('Manage local message group subscriptions');
377
+ group.command('create <name>').description('Create a group and subscribe its owner')
378
+ .requiredOption('--from <seat>', 'seat creating and owning the group').option('--json')
379
+ .action((name: string, opts: { from: string; json?: boolean }) => run(() => {
380
+ const address = withStore(store => store.createGroup(name, opts.from));
381
+ emit({ address, owner: canonicalSeatId(opts.from) }, opts.json, () => out.log(`${address} created; ${canonicalSeatId(opts.from)} subscribed`));
382
+ })());
383
+ group.command('join <name>').description('Subscribe a seat to a group')
384
+ .requiredOption('--seat <seat>').option('--json')
385
+ .action((name: string, opts: { seat: string; json?: boolean }) => run(() => {
386
+ const joined = withStore(store => store.joinGroup(name, opts.seat));
387
+ const row = { group: canonicalMessageAddress(name.startsWith('group:') ? name : `group:${name}`), seat: canonicalSeatId(opts.seat), joined };
388
+ emit(row, opts.json, () => out.log(`${row.seat} ${row.joined ? 'joined' : 'already subscribed'} ${row.group}`));
389
+ })());
390
+ group.command('leave <name>').description('Unsubscribe a seat from a group')
391
+ .requiredOption('--seat <seat>').option('--json')
392
+ .action((name: string, opts: { seat: string; json?: boolean }) => run(() => {
393
+ const left = withStore(store => store.leaveGroup(name, opts.seat));
394
+ const row = { group: canonicalMessageAddress(name.startsWith('group:') ? name : `group:${name}`), seat: canonicalSeatId(opts.seat), left };
395
+ emit(row, opts.json, () => out.log(`${row.seat} ${row.left ? 'left' : 'was not subscribed to'} ${row.group}`));
396
+ })());
397
+ group.command('list').description('List a seat’s active group subscriptions')
398
+ .requiredOption('--seat <seat>').option('--json')
399
+ .action((opts: { seat: string; json?: boolean }) => run(() => {
400
+ const groups = withStore(store => store.listGroups(opts.seat));
401
+ emit(groups, opts.json, () => { if (!groups.length) out.log('No groups.'); else for (const address of groups) out.log(address); });
402
+ })());
403
+
375
404
  msg.command('list').description('List messages for one recipient or one thread without acknowledging them')
376
405
  .option('--to <seat>').option('--thread <id>', 'request ID; list it and its replies, regardless of recipient')
377
406
  .option('--after <id>', 'exclusive message ID (default: acknowledged cursor for a recipient, 0 for a thread)')
package/src/cli/pr-cli.ts CHANGED
@@ -37,6 +37,7 @@ import {
37
37
  type CmdRunner,
38
38
  type PrManager,
39
39
  } from '../autopilot/pr-manager.js';
40
+ import { observePrLineage } from '../pr-tool/census.js';
40
41
  import {
41
42
  collectBaseLandingCommits,
42
43
  computeGranularityStats,
@@ -68,6 +69,7 @@ import { ensurePrLandHeavyRemote, type HeavyRemoteInput, type HeavyRemoteResult
68
69
  import { readPrBaseNameWithRetry } from './pr-land-base-read.js';
69
70
  import { runHeavyOnPodShadow } from './pr-land-pod-shadow.js';
70
71
  import type { LandingPodShadowInput, LandingPodShadowVerdict } from './pr-land-pod-shadow-job.js';
72
+ import { recordWarmReuseEvidence, warmReuseEvidencePath } from '../task-orchestrator/surfaces/warm-reuse-evidence.js';
71
73
  import { readTaskAgentState, taskAgentStatePath, type TaskCard } from '../task-agent/task-hand.js';
72
74
  import { INFLIGHT_REGISTRY_FILE, removeInflightForPr } from '../pr-tool/inflight-registry.js';
73
75
  import { PR_LABEL_NAMES } from '../github/pr-labels.js';
@@ -1899,10 +1901,19 @@ export async function runPrLand(opts: PrLandOpts = {}, deps: PrLandDeps = {}): P
1899
1901
  local: { measured: verdict.rootPlan != null, ok: verdict.ok, rootPlan: verdict.rootPlan ?? null },
1900
1902
  runPod: async () => {
1901
1903
  const runPod = deps.runLandingPodShadow ?? (await import('./pr-land-pod-shadow-job.js')).runLandingPodShadowJob;
1902
- return runPod({ head: opts.expectedHead!, main });
1904
+ return runPod({ pr: Number(opts.pr), repo: cwd, host: verdict.host ?? '', head: opts.expectedHead!, main });
1903
1905
  },
1904
1906
  log: (category, event, data) => debug.log(category, event, { ...data, main, phase: 'initial' }),
1905
1907
  warn: (message) => out.error(`⚠ heavy-on-pod-shadow: ${message}`),
1908
+ onShadow: ({ pod, agree }) => {
1909
+ const shadow = pod && typeof pod === 'object' ? pod as LandingPodShadowVerdict : undefined;
1910
+ const warm = shadow?.warmEvidence;
1911
+ recordWarmReuseEvidence(warmReuseEvidencePath(), {
1912
+ schema: 1, consumer: 'land', pr: Number(opts.pr), head: opts.expectedHead!, main, recordedAt: new Date().toISOString(),
1913
+ ...(warm ? { ...warm, agree: warm.agree && agree } : {}),
1914
+ ...(!warm ? { reason: shadow?.warmReason ?? 'warm-shadow-unmeasured' } : {}),
1915
+ });
1916
+ },
1906
1917
  });
1907
1918
  }
1908
1919
  }
@@ -2536,6 +2547,15 @@ export function registerPrCommands(program: Command, deps: PrLandDeps = {}, queu
2536
2547
  try { await supersedeMerged(number, opts.cwd ?? process.cwd()); }
2537
2548
  catch (error) { prToolOut.error(`✗ supersede-drafts: ${String(error)}`); prToolExit(1); }
2538
2549
  });
2550
+ pr.command('lineage <pr>')
2551
+ .description('PR 계보의 관측 사실만 JSON으로 읽기 (첫 조각 · 닫기 판정 없음)')
2552
+ .requiredOption('--json', 'JSON 관측 결과 출력')
2553
+ .option('--cwd <path>', '저장소 경로')
2554
+ .action((rawPr: string, opts: { cwd?: string }) => {
2555
+ const result = observePrLineage({ pr: Number(rawPr), run: prToolRun, cwd: opts.cwd });
2556
+ prToolOut.log(JSON.stringify(result));
2557
+ if (result.status === 'unknown') prToolExit(1);
2558
+ });
2539
2559
  pr.command('census')
2540
2560
  .description('열린 PR 전체·골 문서만·2일 무커밋 draft·미닫힌 superseded 집계')
2541
2561
  .option('--cwd <path>', '저장소 경로')