elanous 0.2.42 → 0.2.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (685) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → Om5xS9jpjSXJCeTNGYEi4}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{7a98bc80.fa935989e829f9c2.js → 0966f8a1.745fcd44f64a87ea.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{73d2eb0e.4966ad55293c801a.js → 0ad6802e.ae7afb63fdcb4491.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/114.2b90424d1a3ce84c.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1151-5c2bb8f002ca2dd6.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1200.6a37c202f9f17e9a.js +226 -0
  9. package/apps/pwa/out/_next/static/chunks/1261-a616d5728e02e624.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1313-19f737e0222c4444.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1357.3bbef3976c37f94a.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1362-20adddfaf662b0fa.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/{3507.97e1977bc4d5fb0a.js → 1406.a1dc2ab6f8449374.js} +2 -2
  14. package/apps/pwa/out/_next/static/chunks/1737-9491fc6ab29b9ec6.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1803-4f91a8e7dcaf042c.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/1961.a81b12872c3e93a9.js +23 -0
  17. package/apps/pwa/out/_next/static/chunks/{53c73f84.373b6160adfa89a4.js → 1970cf59.2d4d8ce5d6c81853.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/{9211-330b6736a63d4cb3.js → 2073-ba274e00e4f9efb4.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/{7411.9b4b8b747dc7b802.js → 2144.25b292396712196d.js} +2 -2
  21. package/apps/pwa/out/_next/static/chunks/2268-53861f339e0b65a2.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2312.0c8b61e22d3136d7.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/{6632.0eac1c554f8f2ef3.js → 2573.387a707f6f9d720c.js} +2 -2
  24. package/apps/pwa/out/_next/static/chunks/273.f156eee28f11af77.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2873.d2140e5a82546401.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/{1262.e804feb8fd1acb8c.js → 3072.01338851ca21a6f7.js} +2 -2
  27. package/apps/pwa/out/_next/static/chunks/3091.a5a4143dea33d197.js +90 -0
  28. package/apps/pwa/out/_next/static/chunks/{2456.b6de0e1c05f28843.js → 3095.dc44586a5f83b86d.js} +1 -1
  29. package/apps/pwa/out/_next/static/chunks/{3207.a756c95e9ec8c3c8.js → 3113.d7472bbc27d580c7.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/3228-9650b6447b6fa288.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/3402.44b565b314f2263c.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/3557ac4a.c8931684475018ad.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/{8505.fd803c6c33b54cc3.js → 360.ae9f9f4c33c395e8.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +286 -0
  35. package/apps/pwa/out/_next/static/chunks/{b450776b.3db34d8d965f82d3.js → 363bfab3.9623b9f89363541f.js} +1 -1
  36. package/apps/pwa/out/_next/static/chunks/3694.e0099884345f0198.js +64 -0
  37. package/apps/pwa/out/_next/static/chunks/3744.54f87db52acfd1ab.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3903.3ef4656c67572764.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3935.16701e33f8982dc9.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3955.6922286237f2ac2b.js +24 -0
  41. package/apps/pwa/out/_next/static/chunks/3969.272ee7f9fd6c62e5.js +34 -0
  42. package/apps/pwa/out/_next/static/chunks/{8138.6c10b2a356d52fca.js → 4199.ce86b281fd0a60b7.js} +1 -1
  43. package/apps/pwa/out/_next/static/chunks/4311-6dd3144002cc0c2d.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4426-2b230fad00c88930.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{2690.0521c738b7749931.js → 4445.7990c76b3751a918.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4447-14c5161fa59166c7.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4856-b0b8075bba8c53f4.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4870-de370d65e73c0bb5.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4885-2c989165c4b29fad.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/{1945.7b54990d578c119b.js → 4894.fec2ca9e99caefa2.js} +1 -1
  51. package/apps/pwa/out/_next/static/chunks/5093.8f04b7f8cb899a95.js +94 -0
  52. package/apps/pwa/out/_next/static/chunks/5122-2bb177cebf89e19a.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/5154.5f56dc3902e3d275.js +36 -0
  54. package/apps/pwa/out/_next/static/chunks/529.64ff7257180b2ac9.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5394.5dabeb0c62293a28.js +93 -0
  56. package/apps/pwa/out/_next/static/chunks/5461.08bf2404ff38ec85.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/5474-22e08a85583209b2.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/{9427.96aa912ddb5801e0.js → 5564.9e72532188f57586.js} +16 -16
  59. package/apps/pwa/out/_next/static/chunks/5567-265df39ed8fe9dcb.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5570-a94ae19811cb2046.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5574-b47c9ef2dceff1fd.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/{4043.6b91203436c9c86b.js → 5628.6ddb2d5ffba4ff4c.js} +4 -4
  63. package/apps/pwa/out/_next/static/chunks/{1319.b9b815ae0f181e06.js → 5730.43d7ccc09988e646.js} +1 -1
  64. package/apps/pwa/out/_next/static/chunks/{3482.a9ae9d2ad6a5bd97.js → 5789.2da35c258292e1e5.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/5824.da9527b15a3221e5.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5866.366966af47fdde5d.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/{1487.2f67b79444062da6.js → 5930.8b4df3b46c32b05a.js} +1 -1
  68. package/apps/pwa/out/_next/static/chunks/5963-c4d8469c52a0828b.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/6001.ec4049ceb3c43418.js +27 -0
  70. package/apps/pwa/out/_next/static/chunks/6120-471f03db1e299c0c.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6175-41479e643aca1878.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6291.a2de4f9787637075.js +104 -0
  73. package/apps/pwa/out/_next/static/chunks/6400-6699907c3537436a.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/6428.1f4327d6ae5fdf9a.js +287 -0
  75. package/apps/pwa/out/_next/static/chunks/644.02cb026fa44bcd0a.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6466-6c87d60d3dd174fb.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{3347.f846266b5e5f3ede.js → 6540.c7bef57ad8f90a87.js} +3 -3
  78. package/apps/pwa/out/_next/static/chunks/6773.d4264665ab31bec0.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6822.3c789f1a8443e774.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/{8262.ddc03e06b733f184.js → 6944.309f4e3ea54d1537.js} +1 -1
  81. package/apps/pwa/out/_next/static/chunks/7261-8ff69d3b2ee671fd.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7266.084c6bbc70035140.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/7271.5c0100e7320aa856.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7429-bf5731358c8f2f68.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7464.01f7a0ae1215fbe7.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7479.0fcad5f37eb64f0c.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/{4770.769c9cd9c7034eba.js → 7483.427a2fe2049e388d.js} +2 -2
  88. package/apps/pwa/out/_next/static/chunks/{1147-5196d19c222051b3.js → 7502-be74718178e13e56.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/7530.0889722b19572065.js +24 -0
  90. package/apps/pwa/out/_next/static/chunks/7645.5b2ee3ad45c55ea3.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7788.7d1c79f1a8e18946.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7900.096f455c7c1efc53.js +77 -0
  93. package/apps/pwa/out/_next/static/chunks/7910-6f139bcafd238b9f.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7966.f71c8958d1637548.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{8673-bab689a55f7e13b9.js → 8062-7cd0bcc7f01455ba.js} +3 -3
  96. package/apps/pwa/out/_next/static/chunks/8073.f6cf2f2c71aafbd0.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8201.190b94088980f430.js +74 -0
  98. package/apps/pwa/out/_next/static/chunks/8205.282ca4bb62d54a0a.js +62 -0
  99. package/apps/pwa/out/_next/static/chunks/8313-dfa1021bb58a46d6.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/837-81336ebaca8198a8.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8447.7963352ef5f71b76.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8574-868e8129525ef6d9.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8588.d1c6a2903727ce87.js +149 -0
  104. package/apps/pwa/out/_next/static/chunks/8637.90f92d5c8db4732c.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/868.6e953be05bcf6dca.js +41 -0
  106. package/apps/pwa/out/_next/static/chunks/8706-e1fe0309343a2273.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8749-06384cdfc4520add.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{9656-374232558fd528d0.js → 8861-cc1fa1c7b920fa8e.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/{5440-4236de26c5ea5856.js → 8967-7dfebf710c9dec9d.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/{1063.2fb8a9dc55c731f2.js → 8986.8e2e4efbfa655c59.js} +1 -1
  111. package/apps/pwa/out/_next/static/chunks/8997-3c564dbb3b58b055.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/{4320.583cbab64db6be02.js → 923.2034d10ae91e9c20.js} +1 -1
  113. package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/{1574.878c18ecc97b1bd4.js → 943.39ae5e82f4f1893f.js} +1 -1
  115. package/apps/pwa/out/_next/static/chunks/9469.0500480de55fb205.js +32 -0
  116. package/apps/pwa/out/_next/static/chunks/9770.5f75bc6088b16109.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9810-2543267050e58b82.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9870.8419702475254745.js +8 -0
  119. package/apps/pwa/out/_next/static/chunks/9941-376d1b74d51b01a4.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9958.385434ab04241758.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/aa57532f.510551854ff239b1.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-deea1450b17cb8dc.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-70985b904f8650ef.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a2e15e33e56a4353.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-fc72ce2db12d6ca9.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-be03e41f9436ebd9.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-35a35999382da3f2.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-3ff5b1e6ca88b848.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-a65101300a0ee5c1.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-3aca5b6d67dba511.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-45b8ab0a71e61314.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-53046e282d4cda8e.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-17809e60e8354c17.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-fd2442d347bf5898.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-e9d720d6fc082e21.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-6b8b4267bab0a677.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-deea1450b17cb8dc.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-8bcf6233ac7c17af.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-7cc25591cfc2126f.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-053e871f35c9beba.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-eff819f0c2d5e084.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-4d7e9d8db5274a87.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-2b2d8f5aa5f69ad4.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-0b8f92c5062e68b1.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1bd9d0fdac2ced3d.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/{page-0f291d3c8fd55a3a.js → page-9ee28f7df07428ea.js} +1 -1
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-44b7a1ff468c6648.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-cbc6523711dc1b65.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-fdad47899c2695be.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-79a8b5fee4c20871.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-03e8ac9606aeaffb.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-4cd55c55ec287e2f.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-db17b4305404161e.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-30041d848350fd02.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c540da022dbf86b0.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9399efc538da057f.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ca2d09128c585ca4.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-0e2635aecd343038.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ef7f4399b6b7726e.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-deea1450b17cb8dc.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-caf530535b875468.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-eaa20c1543a5fd8e.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c541eb1b75120f61.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-ab5e213eda9479f4.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-0a815f34367b6db6.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-e858ba0ed9393b68.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-1638ee9dd6e0582f.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-4cf5a399109391f2.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b4396321238798ec.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-cb72bfd21006781a.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6135d0242afbc434.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a1dccf907eddb856.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/c7945435-b44d4dbe90ba0dcb.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/{3d0154af.5331fec737ffe8c3.js → cb0f8df8.09a4a6be97e3fc5f.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/{e8543907.5b040a5f22a0b0e5.js → d96660fb.cbc21a2a88539dbb.js} +7 -7
  176. package/apps/pwa/out/_next/static/chunks/{50061469.0326382241ef3b2d.js → ea514caa.05a24f78d9dffe5f.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/fb7d20d5-6892502b6ee39ca6.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/framework-e8a911e19b1be41f.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-7022f418fabba021.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-e5f15df755756a1e.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-4525f91e36940c9b.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-140f0e519c085b0f.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-8f22ef63dcb865b1.js +1 -0
  184. package/apps/pwa/out/_next/static/css/d1f8bb401740a549.css +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/catalog/external-commands.yaml +5 -3
  279. package/catalog/meta/catalogVersion.yaml +2 -1
  280. package/catalog/signing/catalog-signing-public.pem +3 -0
  281. package/graphs/intake/intake-daily.yaml +16 -0
  282. package/graphs/intake/news-sources.yaml +1 -0
  283. package/graphs/intake/recipes.yaml +7 -0
  284. package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
  285. package/graphs/profiles/local.yaml +5 -0
  286. package/graphs/profiles/pod.yaml +4 -0
  287. package/package.json +6 -2
  288. package/plugins/demo-absorption-briefing/plugin.json +18 -0
  289. package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
  290. package/plugins/demo-browser-hand/plugin.json +13 -0
  291. package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
  292. package/plugins/demo-linear-secretary/plugin.json +15 -0
  293. package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
  294. package/plugins/demo-plugin-wizard/plugin.json +11 -0
  295. package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
  296. package/plugins/demo-research/plugin.json +16 -0
  297. package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
  298. package/plugins/demo-video-briefing/plugin.json +15 -0
  299. package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
  300. package/scripts/build-signed-catalog.ts +48 -0
  301. package/scripts/ci-typecheck-main-delta.sh +88 -0
  302. package/scripts/codex-fallback-live-probe.ts +1 -1
  303. package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
  304. package/scripts/demo/demo1104-stage.config.ts +21 -0
  305. package/scripts/demo/demo1104-stage.ts +316 -0
  306. package/scripts/goal-method-audit.ts +17 -1
  307. package/scripts/graph-units/land-enqueue.ts +90 -0
  308. package/scripts/hooks/codex-notify.sh +32 -0
  309. package/scripts/install.sh +10 -38
  310. package/scripts/landing-heal/land-plan.ts +57 -0
  311. package/scripts/release-loop/auto-approve-node.ts +1 -1
  312. package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
  313. package/scripts/release-loop/gate-method.ts +139 -0
  314. package/scripts/release-loop/gate-node.ts +180 -20
  315. package/scripts/release-loop/gate-traffic-mode.ts +151 -3
  316. package/scripts/release-loop/node-verdict.ts +38 -25
  317. package/scripts/release-loop/preflight.ts +362 -8
  318. package/scripts/release-loop/unattended-release.ts +20 -9
  319. package/scripts/rhythm/daily.ts +36 -4
  320. package/scripts/rhythm/linear-progress-sync.ts +298 -0
  321. package/scripts/video-pipeline.ts +9 -1
  322. package/scripts/warm-pool-provider-config.ts +29 -6
  323. package/src/acp/agent-manager.ts +1 -0
  324. package/src/acp/codex-app-server-agent.ts +33 -0
  325. package/src/acp/codex-app-server-client.ts +153 -16
  326. package/src/acp/core-turn-bridge.ts +17 -12
  327. package/src/acp/event-router.ts +20 -1
  328. package/src/acp/server.ts +6 -0
  329. package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
  330. package/src/agent-mission/claude-headless.ts +4 -1
  331. package/src/agent-mission/codex-exec.ts +105 -0
  332. package/src/agent-mission/driver.ts +192 -11
  333. package/src/agent-mission/grok-auth-status.ts +47 -0
  334. package/src/agent-mission/hand-hooks.ts +101 -0
  335. package/src/agent-mission/mission-cli.ts +56 -21
  336. package/src/agent-mission/mission-hand-reply.ts +118 -0
  337. package/src/agent-mission/mission-line.ts +180 -0
  338. package/src/agent-mission/mission-out.ts +256 -18
  339. package/src/agent-mission/tool-install.ts +122 -11
  340. package/src/agents/general-purpose.md +1 -1
  341. package/src/auto-research/research-turn.ts +95 -10
  342. package/src/autopilot/pr-manager.ts +31 -3
  343. package/src/boot/daemon-tools/self-implement.ts +3 -1
  344. package/src/boot/daemon-tools/web-search.ts +1 -2
  345. package/src/briefing/brief-items.ts +55 -11
  346. package/src/cli/agent-cli.ts +2 -1
  347. package/src/cli/catalog-cli.ts +31 -0
  348. package/src/cli/connector-cli.ts +16 -0
  349. package/src/cli/doctor-fix.ts +2 -2
  350. package/src/cli/intake-source-cli.ts +44 -8
  351. package/src/cli/msg-cli.ts +32 -3
  352. package/src/cli/pr-cli.ts +21 -1
  353. package/src/cli/pr-land-heavy-remote.ts +44 -6
  354. package/src/cli/pr-land-overlap-evidence.ts +13 -1
  355. package/src/cli/pr-land-pod-shadow-job.ts +143 -5
  356. package/src/cli/pr-land-pod-shadow.ts +9 -2
  357. package/src/cli/release-checklist-read-cli.ts +44 -16
  358. package/src/cli/release-cli.ts +23 -3
  359. package/src/cli/research-cli.ts +9 -0
  360. package/src/cli/setup-cli.ts +166 -6
  361. package/src/cli/setup-keys.ts +187 -0
  362. package/src/cli/task-plugin-wizard-host.ts +114 -0
  363. package/src/cli/tasks-cli.ts +54 -9
  364. package/src/cli/tui-test-cli.ts +186 -0
  365. package/src/config.ts +4 -2
  366. package/src/connectors/linear-daily-progress.ts +228 -0
  367. package/src/connectors/linear-projector.ts +34 -12
  368. package/src/connectors/linear.ts +151 -7
  369. package/src/core-turn/deep-turn-bloom.ts +67 -0
  370. package/src/core-turn/research-policy.ts +37 -0
  371. package/src/core-turn/run-core-turn.ts +320 -30
  372. package/src/core-turn/types.ts +2 -0
  373. package/src/dashboard/chat/acp-chat.ts +10 -0
  374. package/src/dashboard/classic-sidetab-mission-job.ts +103 -0
  375. package/src/dashboard/classic-sidetab-mission-pair.ts +81 -0
  376. package/src/dashboard/classic-sidetab-mission-trio.ts +219 -0
  377. package/src/dashboard/classic-sidetab-mission.ts +167 -5
  378. package/src/dashboard/index.ts +378 -13
  379. package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
  380. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +8 -0
  381. package/src/dashboard/mission-cli-consumer.ts +20 -8
  382. package/src/dashboard/plugin-wizard-runtime.ts +50 -0
  383. package/src/dashboard/plugin-wizard-tool.ts +55 -0
  384. package/src/dashboard/sidetab-runtime.ts +1 -1
  385. package/src/dashboard/terminal-popup-runtime.ts +6 -3
  386. package/src/decisions/linear-progress-summary.ts +78 -0
  387. package/src/decisions/linear-progress-sync.ts +152 -0
  388. package/src/domains/outbound-alert.ts +49 -11
  389. package/src/domains/telegram-kind-route.ts +16 -9
  390. package/src/graph-runner/arg-allowance.ts +13 -0
  391. package/src/graph-runner/graph-run-api.ts +3 -1
  392. package/src/graph-runner/runner.ts +85 -17
  393. package/src/graph-wizard/mission-compose.ts +407 -12
  394. package/src/harness/dispatch-backpressure.ts +54 -1
  395. package/src/harness/dispatch-shadow-compare.ts +74 -0
  396. package/src/harness/harness-cli-command.ts +11 -1
  397. package/src/harness/skill-exec.ts +21 -9
  398. package/src/harness/skill-select.ts +1 -1
  399. package/src/hooks/error-report-cloud.ts +101 -0
  400. package/src/hooks/receiver.ts +29 -2
  401. package/src/index.ts +127 -10
  402. package/src/intake-plane/actions.ts +354 -0
  403. package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
  404. package/src/intake-plane/intake-sources.ts +78 -8
  405. package/src/intake-plane/items.ts +14 -4
  406. package/src/intake-plane/linear-mission-sync.ts +80 -0
  407. package/src/intake-plane/linear-secretary-runtime.ts +178 -0
  408. package/src/intake-plane/linear-wish.ts +227 -1
  409. package/src/life/life-cli.ts +168 -0
  410. package/src/life/life-kinds.ts +160 -0
  411. package/src/live-supply/budget-consumer.ts +78 -0
  412. package/src/live-supply/read.ts +3 -0
  413. package/src/live-supply/snapshot.ts +45 -0
  414. package/src/llm/provider-credentials.ts +8 -2
  415. package/src/llm.ts +2 -1
  416. package/src/maturity/feature-maturity.ts +3 -3
  417. package/src/msg/msg-sse-server.ts +3 -3
  418. package/src/msg/msg-store.ts +177 -19
  419. package/src/native-tool-catalog.ts +36 -2
  420. package/src/nexus/api/http-server.ts +37 -1
  421. package/src/nexus/api/mcp-public-allowlist.ts +2 -0
  422. package/src/nexus/index.ts +7 -2
  423. package/src/nexus/outbound/format.ts +9 -0
  424. package/src/nexus/outbound/router.ts +98 -13
  425. package/src/nexus/setup-status.ts +9 -0
  426. package/src/nexus/state/state.ts +3 -0
  427. package/src/oauth/codex-account-store.ts +20 -7
  428. package/src/oauth/codex-owner-mirror.ts +44 -0
  429. package/src/oauth/codex.ts +17 -2
  430. package/src/oauth/fallback-chain.ts +47 -17
  431. package/src/onboarding/first-run-doctor.ts +8 -1
  432. package/src/onboarding/first-run.ts +85 -26
  433. package/src/onboarding/key-setup.ts +103 -0
  434. package/src/onboarding/menu-answer.ts +13 -0
  435. package/src/onboarding/secret-prompt.ts +37 -0
  436. package/src/plugins/install/plugin-install.ts +59 -0
  437. package/src/pr-tool/census.ts +130 -0
  438. package/src/pty-shell/pty-control-ipc.ts +4 -1
  439. package/src/registry/catalog-server.ts +232 -0
  440. package/src/registry/loader.ts +45 -1
  441. package/src/registry/types.ts +1 -2
  442. package/src/research/axis-fanout.ts +43 -28
  443. package/src/self-dev/ask-launch-flow.ts +72 -1
  444. package/src/self-dev/dev-cli.ts +4 -1
  445. package/src/self-dev/dev-pipeline.ts +5 -0
  446. package/src/self-dev/draft-residue.ts +64 -5
  447. package/src/self-dev/graph-front-nodes.ts +2 -1
  448. package/src/self-dev/graph-journey-route.ts +76 -21
  449. package/src/self-dev/launch-preflight.ts +58 -0
  450. package/src/self-dev/orchestrate.ts +1 -1
  451. package/src/self-dev/shard-aggregate.ts +4 -0
  452. package/src/self-dev/shard-run.ts +36 -15
  453. package/src/self-implement/abandoned-classification.ts +12 -3
  454. package/src/self-implement/budget-gate.ts +7 -0
  455. package/src/self-implement/child-llm-preference.ts +10 -1
  456. package/src/self-implement/doctor-visit.ts +30 -8
  457. package/src/self-implement/elanous-tui-spawn.ts +3 -0
  458. package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
  459. package/src/self-implement/gate-artifacts.ts +2 -1
  460. package/src/self-implement/goal-author-cli.ts +4 -2
  461. package/src/self-implement/goal-author.ts +358 -4
  462. package/src/self-implement/graph-overlay-yaml.ts +30 -4
  463. package/src/self-implement/graph-overlay.ts +3 -1
  464. package/src/self-implement/graph-profile-yaml.ts +107 -0
  465. package/src/self-implement/graph-yaml.ts +26 -3
  466. package/src/self-implement/off-diff-evidence.ts +249 -5
  467. package/src/self-implement/orchestrator.ts +240 -15
  468. package/src/self-implement/run-chart.ts +6 -3
  469. package/src/self-implement/run-ledger.ts +51 -1
  470. package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
  471. package/src/self-implement/tdd-evidence-tags.ts +9 -0
  472. package/src/self-implement/train-gate-receipt.ts +166 -0
  473. package/src/self-implement/train-gate-remote.ts +62 -18
  474. package/src/session/chat.ts +4 -2
  475. package/src/session/session-fanout.ts +2 -0
  476. package/src/session/streaming/acp-stream-sink.ts +2 -1
  477. package/src/session/streaming/chunk-producer.ts +6 -0
  478. package/src/session/streaming/stream-compositor.ts +3 -2
  479. package/src/session-runtime/index.ts +37 -1
  480. package/src/session-runtime/retry-policy.ts +1 -1
  481. package/src/setup/llm-env-detect.ts +3 -0
  482. package/src/setup/service-key-catalog.ts +46 -0
  483. package/src/setup/service-keys.ts +241 -0
  484. package/src/sidetab-core/visible-agent-mission.ts +98 -22
  485. package/src/skills/tools/agent.ts +23 -4
  486. package/src/skills/tools/omni-search.ts +123 -25
  487. package/src/task-agent/parent-host.ts +10 -0
  488. package/src/task-agent/repair-outcomes.ts +65 -0
  489. package/src/task-agent/task-hand.ts +20 -7
  490. package/src/task-orchestrator/dispatcher.ts +14 -1
  491. package/src/task-orchestrator/linear-capture-events.ts +55 -0
  492. package/src/task-orchestrator/store.ts +16 -5
  493. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +4 -0
  494. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +92 -1
  495. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
  496. package/src/task-orchestrator/surfaces/pod-source-receive.ts +23 -11
  497. package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
  498. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +35 -9
  499. package/src/task-orchestrator/surfaces/self-implement-pod.ts +172 -6
  500. package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
  501. package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
  502. package/src/task-orchestrator/types.ts +14 -0
  503. package/src/telegram.ts +14 -16
  504. package/src/terminal/coding-agent.ts +14 -5
  505. package/src/terminal/session-registry.ts +1 -1
  506. package/src/tool-hints/gate.ts +1 -0
  507. package/src/tool-runtime/agent-runtime.ts +1 -0
  508. package/src/tool-runtime/browser-hand-runtime.ts +381 -0
  509. package/src/tool-runtime/browser-runtime.ts +2 -1
  510. package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
  511. package/src/tool-runtime/elanous-linear-secretary-runtime.ts +57 -0
  512. package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
  513. package/src/tool-runtime/index.ts +6 -0
  514. package/src/tool-runtime/types.ts +3 -0
  515. package/src/tui/entry.ts +24 -1
  516. package/src/tui/sidetab/attach.ts +140 -11
  517. package/src/tui/sidetab/herdr-portal.ts +225 -0
  518. package/src/user-config.ts +34 -9
  519. package/src/user-intent/types.ts +4 -3
  520. package/src/ux-sim/browser-hand.ts +165 -0
  521. package/src/ux-sim/draft-inventory-builder.ts +198 -0
  522. package/src/ux-sim/fake-browser-page.ts +81 -0
  523. package/src/ux-sim/fake-linear-device.ts +31 -0
  524. package/src/ux-sim/graph-engine-sim.ts +47 -0
  525. package/src/ux-sim/linear-secretary.ts +216 -0
  526. package/src/ux-sim/mock-scenario-catalog.json +75 -23
  527. package/src/ux-sim/mock-scenario-catalog.ts +120 -2
  528. package/src/ux-sim/onboarding-first-run-device.ts +31 -21
  529. package/src/ux-sim/scenario.ts +70 -26
  530. package/src/ux-sim/service-key-setup.ts +50 -0
  531. package/src/ux-sim/term-slash-device.ts +74 -0
  532. package/src/ux-sim/turn-throw-sim.ts +31 -0
  533. package/src/version/packed-revision.json +1 -1
  534. package/src/web-search/exa.ts +77 -0
  535. package/src/web-search/index.ts +30 -9
  536. package/src/web-search/provider.ts +4 -1
  537. package/src/web-search/x-intent.ts +5 -0
  538. package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +0 -36
  540. package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +0 -32
  543. package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +0 -286
  548. package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +0 -23
  549. package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +0 -34
  552. package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/2974.595d1e29d040cb6a.js +0 -64
  557. package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +0 -93
  558. package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +0 -41
  559. package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +0 -24
  561. package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +0 -77
  567. package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +0 -74
  572. package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +0 -149
  573. package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +0 -27
  575. package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +0 -287
  583. package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +0 -226
  586. package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +0 -90
  587. package/apps/pwa/out/_next/static/chunks/6377.bc7df239edbff244.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +0 -104
  594. package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +0 -94
  595. package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +0 -24
  602. package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +0 -8
  610. package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/8546-6f03f8ea34dd61d9.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/9249.976f1e69a9d80754.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/9415.69e4a21c60c7d2db.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +0 -62
  626. package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +0 -1
  684. package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
  685. /package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → Om5xS9jpjSXJCeTNGYEi4}/_ssgManifest.js +0 -0
@@ -1,5 +1,6 @@
1
1
  import { streamLLM } from '../llm.js';
2
2
  import { invokeResearchAxes } from '../research-bridge/index.js';
3
+ import { RESEARCH_TURN_DEADLINE_STOP_ERROR } from '../core-turn/research-policy.js';
3
4
  import { invokeResearch } from '../research-bridge/invoke.js';
4
5
  import type { AxisFanoutResult } from '../research/axis-fanout.js';
5
6
  import { routeResearchOutput } from '../research/output-router.js';
@@ -18,9 +19,12 @@ import { attachResearchEvidence, buildResearchQuestionLadderPrompt,
18
19
 
19
20
  export interface ResearchQuestionLadderRunOptions {
20
21
  signal?: AbortSignal;
22
+ admitToolCall?: (toolName: string) => boolean;
23
+ allowPartialOnAbort?: boolean;
24
+ allowOutputSkill?: boolean;
21
25
  generateContract?: (prompt: string, signal?: AbortSignal) => Promise<string>;
22
26
  generate?: (prompt: string, signal?: AbortSignal) => Promise<string>;
23
- invokeAxes?: (questions: SixLevelResearchQuestionLadder['questions'], signal?: AbortSignal) => Promise<AxisFanoutResult>;
27
+ invokeAxes?: (questions: SixLevelResearchQuestionLadder['questions'], signal?: AbortSignal, admitToolCall?: (toolName: string) => boolean) => Promise<AxisFanoutResult>;
24
28
  routeOutput?: typeof routeResearchOutput;
25
29
  invokeOutputSkill?: (skill: string, args: string, signal?: AbortSignal) => Promise<{ ok: boolean; output: string; error?: string }>;
26
30
  /** Test seam for the bounded Bloom 4/5 evidence-gap follow-up. */
@@ -37,6 +41,14 @@ export interface ResearchGroundingResult {
37
41
  error?: string;
38
42
  }
39
43
 
44
+ function invokeProductionResearchAxes(
45
+ questions: SixLevelResearchQuestionLadder['questions'],
46
+ signal?: AbortSignal,
47
+ admitToolCall?: (toolName: string) => boolean,
48
+ ): Promise<AxisFanoutResult> {
49
+ return invokeResearchAxes(questions, { signal, admitToolCall });
50
+ }
51
+
40
52
  export interface ResearchQuestionLadderRunResult {
41
53
  ok: boolean;
42
54
  ladder: SixLevelResearchQuestionLadder;
@@ -73,6 +85,15 @@ export interface WorkingBackwardsCompletionBoundary {
73
85
  complete: boolean;
74
86
  }
75
87
 
88
+ function partialResearchOutput(request: string, ladder: SixLevelResearchQuestionLadder, note: string): string {
89
+ const evidence = ladder.evidence.map(item => `- [${item.outcome}] ${item.sourceKind} · ${item.source}: ${item.content}`);
90
+ return [
91
+ `# Partial research: ${request}`,
92
+ `Research stopped at its wall-clock limit (${note}). Synthesize only the evidence listed here and state remaining uncertainty.`,
93
+ ...(evidence.length ? ['', '## Evidence collected before stopping', ...evidence] : ['', 'No source evidence was collected before the deadline.']),
94
+ ].join('\n');
95
+ }
96
+
76
97
  /**
77
98
  * Working Backwards 완료 경계 — 출력 계약(buildWorkingBackwardsContractPrompt → parse…Contract)의
78
99
  * 슬롯 중 채워지지 않은 칸을 찾고 각 칸을 채울 노드 계획을 낸다. questions 없이 부르면 모든 슬롯이
@@ -212,9 +233,20 @@ export async function runResearchQuestionLadder(
212
233
  contractRaw = await (options.generateContract ?? ((prompt, signal) => defaultGenerate(prompt, 'research-working-backwards-contract', signal)))(
213
234
  buildWorkingBackwardsContractPrompt(request), options.signal,
214
235
  );
215
- if (options.signal?.aborted) return { ok: false, ladder: initial, output: '', error: 'research aborted' };
236
+ if (options.signal?.aborted) {
237
+ return options.allowPartialOnAbort
238
+ ? { ok: false, ladder: initial, output: partialResearchOutput(request, initial, 'before question generation'), error: RESEARCH_TURN_DEADLINE_STOP_ERROR }
239
+ : { ok: false, ladder: initial, output: '', error: 'research aborted' };
240
+ }
216
241
  } catch (error) {
217
242
  const reason = errorText(error);
243
+ if (options.signal?.aborted) {
244
+ return {
245
+ ok: false, ladder: initial,
246
+ output: options.allowPartialOnAbort ? partialResearchOutput(request, initial, 'output-contract generation') : '',
247
+ error: RESEARCH_TURN_DEADLINE_STOP_ERROR,
248
+ };
249
+ }
218
250
  debug.log('research.lens', 'working-backwards-contract-failed', { reason }, { level: 'warn' });
219
251
  return { ok: false, ladder: initial, output: '', error: `output contract generation failed: ${reason}` };
220
252
  }
@@ -247,18 +279,31 @@ export async function runResearchQuestionLadder(
247
279
  const sectionIds = outputContract.sections.map((section) => section.id);
248
280
  // Keep the premium exemplar bank outside the TUI's static import closure.
249
281
  const { getBloomExemplarContext } = await import('../research/bloom-exemplars.js');
282
+ const { buildResearchBloom45Directive } = await import('../core-turn/deep-turn-bloom.js');
283
+ const bloom45Directive = await buildResearchBloom45Directive();
250
284
  const exemplar = getBloomExemplarContext(request, options.bloomExemplarPackPath);
251
285
  debug.log('research.turn', 'bloom-exemplars-selected', {
252
286
  domain: exemplar.domain, domainSignal: exemplar.domainSignal,
253
287
  source: exemplar.source, count: exemplar.count, levels: exemplar.levels,
254
288
  });
255
289
  raw = await (options.generate ?? ((prompt, signal) => defaultGenerate(prompt, 'research-question-ladder', signal)))(
256
- `${buildResearchQuestionLadderPrompt(request, sectionIds)}\n\n${exemplar.context ? `${exemplar.context}\n\n` : ''}${ladderContext}${retroGroundingContext(request)}`,
290
+ `${buildResearchQuestionLadderPrompt(request, sectionIds)}\n\n${bloom45Directive}\n\n${exemplar.context ? `${exemplar.context}\n\n` : ''}${ladderContext}${retroGroundingContext(request)}`,
257
291
  options.signal,
258
292
  );
259
- if (options.signal?.aborted) return { ok: false, ladder: initial, outputContract, output: '', error: 'research aborted' };
293
+ if (options.signal?.aborted) {
294
+ return options.allowPartialOnAbort
295
+ ? { ok: false, ladder: initial, outputContract, output: partialResearchOutput(request, initial, 'before axis searches'), error: RESEARCH_TURN_DEADLINE_STOP_ERROR }
296
+ : { ok: false, ladder: initial, outputContract, output: '', error: 'research aborted' };
297
+ }
260
298
  debug.log('research.turn', 'bloom-generated', { questionCount: 6 });
261
299
  } catch (error) {
300
+ if (options.signal?.aborted) {
301
+ return {
302
+ ok: false, ladder: initial, outputContract,
303
+ output: options.allowPartialOnAbort ? partialResearchOutput(request, initial, 'question generation') : '',
304
+ error: RESEARCH_TURN_DEADLINE_STOP_ERROR,
305
+ };
306
+ }
262
307
  debug.log('research.turn', 'bloom-failed', { reason: errorText(error) }, { level: 'warn' });
263
308
  return { ok: false, ladder: initial, outputContract, output: '', error: `question generation failed: ${errorText(error)}` };
264
309
  }
@@ -280,11 +325,16 @@ export async function runResearchQuestionLadder(
280
325
 
281
326
  const ladder = parsed.value;
282
327
  debug.log('research.turn', 'bloom-ladder-validated', { questionCount: ladder.questions.length });
328
+ debug.log('research.turn', 'deep-bloom-applied', {
329
+ levels: [4, 5], trigger: 'research-intent',
330
+ stage: 'research-ladder',
331
+ questionCount: ladder.questions.filter((question) => question.level === 4 || question.level === 5).length,
332
+ });
283
333
  const observedAt = new Date().toISOString();
284
334
  let fanout: AxisFanoutResult;
285
335
  try {
286
- fanout = await (options.invokeAxes ?? ((questions, signal) => invokeResearchAxes(questions, { signal })))(ladder.questions, options.signal);
287
- if (options.signal?.aborted) return { ok: false, ladder, outputContract, output: '', error: 'research aborted' };
336
+ fanout = await (options.invokeAxes ?? invokeProductionResearchAxes)(ladder.questions, options.signal, options.admitToolCall);
337
+ if (options.signal?.aborted && !options.allowPartialOnAbort) return { ok: false, ladder, outputContract, output: '', error: 'research aborted' };
288
338
  debug.log('research.turn', 'axis-evidence-collected', {
289
339
  axisCount: fanout.axes.length,
290
340
  evidenceCount: fanout.axes.reduce((count, axis) => count + axis.evidence.length, 0),
@@ -334,6 +384,10 @@ export async function runResearchQuestionLadder(
334
384
  debug.log('research.turn', 'completion-boundary-stop', {
335
385
  stage: 'axis-fanout', reason: 'every output-contract section slot is filled',
336
386
  });
387
+ debug.log('research.stop', 'stage', {
388
+ stage: 'axis-fanout', reason: 'completion-boundary-satisfied',
389
+ evidenceCount: ladder.evidence.length,
390
+ });
337
391
  }
338
392
  if (!finalBoundary.complete && !options.signal?.aborted) {
339
393
  const followupStartedAt = performance.now();
@@ -373,6 +427,10 @@ export async function runResearchQuestionLadder(
373
427
  classifications: followupPlan.classifications.length,
374
428
  timeBudgetMs: followupPlan.timeBudgetMs,
375
429
  });
430
+ debug.log('research.stop', 'stage', {
431
+ stage: 'gap-followup', reason: 'no-runnable-followup-calls',
432
+ classifications: followupPlan.classifications.length,
433
+ });
376
434
  } else {
377
435
  const executionStartedAt = performance.now();
378
436
  debug.log('research.turn', 'gap-followup-started', {
@@ -411,6 +469,10 @@ export async function runResearchQuestionLadder(
411
469
  debug.log('research.turn', 'completion-boundary-stop', {
412
470
  stage: 'gap-followup', reason: 'every output-contract section slot is filled',
413
471
  });
472
+ debug.log('research.stop', 'stage', {
473
+ stage: 'gap-followup', reason: 'completion-boundary-satisfied',
474
+ evidenceCount: ladder.evidence.length,
475
+ });
414
476
  }
415
477
  } catch (error) {
416
478
  debug.log('research.turn', 'gap-followup-failed', {
@@ -420,13 +482,30 @@ export async function runResearchQuestionLadder(
420
482
  }
421
483
  }
422
484
  }
423
- if (options.signal?.aborted) return { ok: false, ladder, outputContract, output: '', error: 'research aborted' };
485
+ if (options.signal?.aborted && !options.allowPartialOnAbort) return { ok: false, ladder, outputContract, output: '', error: 'research aborted' };
424
486
 
425
487
  const outputContractSectionIndex = sections.findIndex((section) => section.startsWith('## Output contract\n'));
426
488
  if (outputContractSectionIndex < 0) throw new Error('output contract section is missing from research output');
427
489
  sections.splice(outputContractSectionIndex + 1, 0,
428
490
  formatWorkingBackwardsSkeleton(outputContract, finalBoundary, evidenceRejected));
429
491
 
492
+ // The axis fanout is the last stage allowed to spend the research budget.
493
+ // Once it returns after an abort, keep whatever evidence it collected and
494
+ // return it directly; no post-deadline router/skill stage may discard it or
495
+ // attempt more model work with the already-aborted signal.
496
+ if (options.signal?.aborted && options.allowPartialOnAbort) {
497
+ const partialOutput = sections.join('\n\n');
498
+ saveRetroRecord(request, ladder, ladder.evidence);
499
+ debug.log('research.stop', 'stopped', {
500
+ reason: 'wall-clock-budget', stage: 'after-axis-evidence',
501
+ evidenceCount: ladder.evidence.length,
502
+ });
503
+ return {
504
+ ok: false, ladder, outputContract, output: partialOutput,
505
+ error: RESEARCH_TURN_DEADLINE_STOP_ERROR,
506
+ };
507
+ }
508
+
430
509
  const incompleteQuestions = ladder.questions.filter((question) =>
431
510
  !ladder.evidence.some((item) => item.questionId === question.id && item.outcome === 'complete')).length;
432
511
  const allOk = !evidenceRejected && incompleteQuestions === 0;
@@ -459,7 +538,13 @@ export async function runResearchQuestionLadder(
459
538
  });
460
539
  let routedOutput = '';
461
540
  const hasCompleteEvidence = ladder.evidence.some((item) => item.outcome === 'complete');
462
- if (route?.skillCallPlan && !hasCompleteEvidence) {
541
+ if (route?.skillCallPlan && options.allowOutputSkill === false) {
542
+ debug.log('research.turn', 'output-skill-skipped', {
543
+ skill: route.skillCallPlan.skill,
544
+ reason: 'research turn tool allowlist excludes skill execution',
545
+ evidenceCount: ladder.evidence.length,
546
+ });
547
+ } else if (route?.skillCallPlan && !hasCompleteEvidence) {
463
548
  debug.log('research.turn', 'output-skill-skipped', {
464
549
  skill: route.skillCallPlan.skill,
465
550
  reason: 'no-complete-evidence',
@@ -500,11 +585,11 @@ export async function runResearchQuestionLadder(
500
585
  }
501
586
  saveRetroRecord(request, ladder, ladder.evidence);
502
587
  return {
503
- ok: allOk,
588
+ ok: allOk && !options.signal?.aborted,
504
589
  ladder,
505
590
  outputContract,
506
591
  output: output + routedOutput,
507
- ...(allOk ? {} : { error: `${incompleteQuestions} of ${ladder.questions.length} question searches were incomplete` }),
592
+ ...(!allOk || options.signal?.aborted ? { error: options.signal?.aborted ? RESEARCH_TURN_DEADLINE_STOP_ERROR : `${incompleteQuestions} of ${ladder.questions.length} question searches were incomplete` } : {}),
508
593
  };
509
594
  }
510
595
 
@@ -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
+ }
@@ -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' } : {};