elanous 0.2.42 → 0.2.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (685) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → Om5xS9jpjSXJCeTNGYEi4}/_buildManifest.js +1 -1
  4. package/apps/pwa/out/_next/static/chunks/{7a98bc80.fa935989e829f9c2.js → 0966f8a1.745fcd44f64a87ea.js} +1 -1
  5. package/apps/pwa/out/_next/static/chunks/{73d2eb0e.4966ad55293c801a.js → 0ad6802e.ae7afb63fdcb4491.js} +1 -1
  6. package/apps/pwa/out/_next/static/chunks/114.2b90424d1a3ce84c.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1151-5c2bb8f002ca2dd6.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1200.6a37c202f9f17e9a.js +226 -0
  9. package/apps/pwa/out/_next/static/chunks/1261-a616d5728e02e624.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/1313-19f737e0222c4444.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/1357.3bbef3976c37f94a.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/1362-20adddfaf662b0fa.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/{3507.97e1977bc4d5fb0a.js → 1406.a1dc2ab6f8449374.js} +2 -2
  14. package/apps/pwa/out/_next/static/chunks/1737-9491fc6ab29b9ec6.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/1803-4f91a8e7dcaf042c.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/1961.a81b12872c3e93a9.js +23 -0
  17. package/apps/pwa/out/_next/static/chunks/{53c73f84.373b6160adfa89a4.js → 1970cf59.2d4d8ce5d6c81853.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/1971-8890f3962ba7ee0a.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/{9211-330b6736a63d4cb3.js → 2073-ba274e00e4f9efb4.js} +1 -1
  20. package/apps/pwa/out/_next/static/chunks/{7411.9b4b8b747dc7b802.js → 2144.25b292396712196d.js} +2 -2
  21. package/apps/pwa/out/_next/static/chunks/2268-53861f339e0b65a2.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/2312.0c8b61e22d3136d7.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/{6632.0eac1c554f8f2ef3.js → 2573.387a707f6f9d720c.js} +2 -2
  24. package/apps/pwa/out/_next/static/chunks/273.f156eee28f11af77.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/2873.d2140e5a82546401.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/{1262.e804feb8fd1acb8c.js → 3072.01338851ca21a6f7.js} +2 -2
  27. package/apps/pwa/out/_next/static/chunks/3091.a5a4143dea33d197.js +90 -0
  28. package/apps/pwa/out/_next/static/chunks/{2456.b6de0e1c05f28843.js → 3095.dc44586a5f83b86d.js} +1 -1
  29. package/apps/pwa/out/_next/static/chunks/{3207.a756c95e9ec8c3c8.js → 3113.d7472bbc27d580c7.js} +1 -1
  30. package/apps/pwa/out/_next/static/chunks/3228-9650b6447b6fa288.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/3402.44b565b314f2263c.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/3557ac4a.c8931684475018ad.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/{8505.fd803c6c33b54cc3.js → 360.ae9f9f4c33c395e8.js} +1 -1
  34. package/apps/pwa/out/_next/static/chunks/3638.80412ea63aae8f3f.js +286 -0
  35. package/apps/pwa/out/_next/static/chunks/{b450776b.3db34d8d965f82d3.js → 363bfab3.9623b9f89363541f.js} +1 -1
  36. package/apps/pwa/out/_next/static/chunks/3694.e0099884345f0198.js +64 -0
  37. package/apps/pwa/out/_next/static/chunks/3744.54f87db52acfd1ab.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/3903.3ef4656c67572764.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/3935.16701e33f8982dc9.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/3955.6922286237f2ac2b.js +24 -0
  41. package/apps/pwa/out/_next/static/chunks/3969.272ee7f9fd6c62e5.js +34 -0
  42. package/apps/pwa/out/_next/static/chunks/{8138.6c10b2a356d52fca.js → 4199.ce86b281fd0a60b7.js} +1 -1
  43. package/apps/pwa/out/_next/static/chunks/4311-6dd3144002cc0c2d.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/4426-2b230fad00c88930.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/{2690.0521c738b7749931.js → 4445.7990c76b3751a918.js} +1 -1
  46. package/apps/pwa/out/_next/static/chunks/4447-14c5161fa59166c7.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/4856-b0b8075bba8c53f4.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/4870-de370d65e73c0bb5.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/4885-2c989165c4b29fad.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/{1945.7b54990d578c119b.js → 4894.fec2ca9e99caefa2.js} +1 -1
  51. package/apps/pwa/out/_next/static/chunks/5093.8f04b7f8cb899a95.js +94 -0
  52. package/apps/pwa/out/_next/static/chunks/5122-2bb177cebf89e19a.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/5154.5f56dc3902e3d275.js +36 -0
  54. package/apps/pwa/out/_next/static/chunks/529.64ff7257180b2ac9.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/5394.5dabeb0c62293a28.js +93 -0
  56. package/apps/pwa/out/_next/static/chunks/5461.08bf2404ff38ec85.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/5474-22e08a85583209b2.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/{9427.96aa912ddb5801e0.js → 5564.9e72532188f57586.js} +16 -16
  59. package/apps/pwa/out/_next/static/chunks/5567-265df39ed8fe9dcb.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/5570-a94ae19811cb2046.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/5574-b47c9ef2dceff1fd.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/{4043.6b91203436c9c86b.js → 5628.6ddb2d5ffba4ff4c.js} +4 -4
  63. package/apps/pwa/out/_next/static/chunks/{1319.b9b815ae0f181e06.js → 5730.43d7ccc09988e646.js} +1 -1
  64. package/apps/pwa/out/_next/static/chunks/{3482.a9ae9d2ad6a5bd97.js → 5789.2da35c258292e1e5.js} +1 -1
  65. package/apps/pwa/out/_next/static/chunks/5824.da9527b15a3221e5.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/5866.366966af47fdde5d.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/{1487.2f67b79444062da6.js → 5930.8b4df3b46c32b05a.js} +1 -1
  68. package/apps/pwa/out/_next/static/chunks/5963-c4d8469c52a0828b.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/6001.ec4049ceb3c43418.js +27 -0
  70. package/apps/pwa/out/_next/static/chunks/6120-471f03db1e299c0c.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/6175-41479e643aca1878.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/6291.a2de4f9787637075.js +104 -0
  73. package/apps/pwa/out/_next/static/chunks/6400-6699907c3537436a.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/6428.1f4327d6ae5fdf9a.js +287 -0
  75. package/apps/pwa/out/_next/static/chunks/644.02cb026fa44bcd0a.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/6466-6c87d60d3dd174fb.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/{3347.f846266b5e5f3ede.js → 6540.c7bef57ad8f90a87.js} +3 -3
  78. package/apps/pwa/out/_next/static/chunks/6773.d4264665ab31bec0.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/6822.3c789f1a8443e774.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/{8262.ddc03e06b733f184.js → 6944.309f4e3ea54d1537.js} +1 -1
  81. package/apps/pwa/out/_next/static/chunks/7261-8ff69d3b2ee671fd.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/7266.084c6bbc70035140.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/7271.5c0100e7320aa856.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/7429-bf5731358c8f2f68.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/7464.01f7a0ae1215fbe7.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/7479.0fcad5f37eb64f0c.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/{4770.769c9cd9c7034eba.js → 7483.427a2fe2049e388d.js} +2 -2
  88. package/apps/pwa/out/_next/static/chunks/{1147-5196d19c222051b3.js → 7502-be74718178e13e56.js} +1 -1
  89. package/apps/pwa/out/_next/static/chunks/7530.0889722b19572065.js +24 -0
  90. package/apps/pwa/out/_next/static/chunks/7645.5b2ee3ad45c55ea3.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/7788.7d1c79f1a8e18946.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/7900.096f455c7c1efc53.js +77 -0
  93. package/apps/pwa/out/_next/static/chunks/7910-6f139bcafd238b9f.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/7966.f71c8958d1637548.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/{8673-bab689a55f7e13b9.js → 8062-7cd0bcc7f01455ba.js} +3 -3
  96. package/apps/pwa/out/_next/static/chunks/8073.f6cf2f2c71aafbd0.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/8201.190b94088980f430.js +74 -0
  98. package/apps/pwa/out/_next/static/chunks/8205.282ca4bb62d54a0a.js +62 -0
  99. package/apps/pwa/out/_next/static/chunks/8313-dfa1021bb58a46d6.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/837-81336ebaca8198a8.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/8447.7963352ef5f71b76.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/8574-868e8129525ef6d9.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/8588.d1c6a2903727ce87.js +149 -0
  104. package/apps/pwa/out/_next/static/chunks/8637.90f92d5c8db4732c.js +1 -0
  105. package/apps/pwa/out/_next/static/chunks/868.6e953be05bcf6dca.js +41 -0
  106. package/apps/pwa/out/_next/static/chunks/8706-e1fe0309343a2273.js +1 -0
  107. package/apps/pwa/out/_next/static/chunks/8749-06384cdfc4520add.js +1 -0
  108. package/apps/pwa/out/_next/static/chunks/{9656-374232558fd528d0.js → 8861-cc1fa1c7b920fa8e.js} +1 -1
  109. package/apps/pwa/out/_next/static/chunks/{5440-4236de26c5ea5856.js → 8967-7dfebf710c9dec9d.js} +1 -1
  110. package/apps/pwa/out/_next/static/chunks/{1063.2fb8a9dc55c731f2.js → 8986.8e2e4efbfa655c59.js} +1 -1
  111. package/apps/pwa/out/_next/static/chunks/8997-3c564dbb3b58b055.js +1 -0
  112. package/apps/pwa/out/_next/static/chunks/{4320.583cbab64db6be02.js → 923.2034d10ae91e9c20.js} +1 -1
  113. package/apps/pwa/out/_next/static/chunks/9312.bc1b89c5d4368033.js +1 -0
  114. package/apps/pwa/out/_next/static/chunks/{1574.878c18ecc97b1bd4.js → 943.39ae5e82f4f1893f.js} +1 -1
  115. package/apps/pwa/out/_next/static/chunks/9469.0500480de55fb205.js +32 -0
  116. package/apps/pwa/out/_next/static/chunks/9770.5f75bc6088b16109.js +1 -0
  117. package/apps/pwa/out/_next/static/chunks/9810-2543267050e58b82.js +1 -0
  118. package/apps/pwa/out/_next/static/chunks/9870.8419702475254745.js +8 -0
  119. package/apps/pwa/out/_next/static/chunks/9941-376d1b74d51b01a4.js +1 -0
  120. package/apps/pwa/out/_next/static/chunks/9958.385434ab04241758.js +1 -0
  121. package/apps/pwa/out/_next/static/chunks/aa57532f.510551854ff239b1.js +1 -0
  122. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-deea1450b17cb8dc.js +1 -0
  123. package/apps/pwa/out/_next/static/chunks/app/approvals/page-70985b904f8650ef.js +1 -0
  124. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-a2e15e33e56a4353.js +1 -0
  125. package/apps/pwa/out/_next/static/chunks/app/board/page-fc72ce2db12d6ca9.js +1 -0
  126. package/apps/pwa/out/_next/static/chunks/app/botlab/page-be03e41f9436ebd9.js +1 -0
  127. package/apps/pwa/out/_next/static/chunks/app/bots/page-35a35999382da3f2.js +1 -0
  128. package/apps/pwa/out/_next/static/chunks/app/ceo/page-3ff5b1e6ca88b848.js +1 -0
  129. package/apps/pwa/out/_next/static/chunks/app/chat/page-a65101300a0ee5c1.js +1 -0
  130. package/apps/pwa/out/_next/static/chunks/app/consult/page-3aca5b6d67dba511.js +1 -0
  131. package/apps/pwa/out/_next/static/chunks/app/control/page-45b8ab0a71e61314.js +1 -0
  132. package/apps/pwa/out/_next/static/chunks/app/decisions/page-53046e282d4cda8e.js +1 -0
  133. package/apps/pwa/out/_next/static/chunks/app/design-check/page-17809e60e8354c17.js +1 -0
  134. package/apps/pwa/out/_next/static/chunks/app/editor/page-fd2442d347bf5898.js +1 -0
  135. package/apps/pwa/out/_next/static/chunks/app/exec/page-e9d720d6fc082e21.js +1 -0
  136. package/apps/pwa/out/_next/static/chunks/app/field/page-6b8b4267bab0a677.js +1 -0
  137. package/apps/pwa/out/_next/static/chunks/app/healthz/route-deea1450b17cb8dc.js +1 -0
  138. package/apps/pwa/out/_next/static/chunks/app/inside/page-8bcf6233ac7c17af.js +1 -0
  139. package/apps/pwa/out/_next/static/chunks/app/intake/page-7cc25591cfc2126f.js +1 -0
  140. package/apps/pwa/out/_next/static/chunks/app/layout-053e871f35c9beba.js +1 -0
  141. package/apps/pwa/out/_next/static/chunks/app/live/page-eff819f0c2d5e084.js +1 -0
  142. package/apps/pwa/out/_next/static/chunks/app/live-run/page-4d7e9d8db5274a87.js +1 -0
  143. package/apps/pwa/out/_next/static/chunks/app/loops/page-2b2d8f5aa5f69ad4.js +1 -0
  144. package/apps/pwa/out/_next/static/chunks/app/market/page-0b8f92c5062e68b1.js +1 -0
  145. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-1bd9d0fdac2ced3d.js +1 -0
  146. package/apps/pwa/out/_next/static/chunks/app/morning/{page-0f291d3c8fd55a3a.js → page-9ee28f7df07428ea.js} +1 -1
  147. package/apps/pwa/out/_next/static/chunks/app/not-found-44b7a1ff468c6648.js +1 -0
  148. package/apps/pwa/out/_next/static/chunks/app/observatory/page-cbc6523711dc1b65.js +1 -0
  149. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-fdad47899c2695be.js +1 -0
  150. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-79a8b5fee4c20871.js +1 -0
  151. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-03e8ac9606aeaffb.js +1 -0
  152. package/apps/pwa/out/_next/static/chunks/app/outputs/page-4cd55c55ec287e2f.js +1 -0
  153. package/apps/pwa/out/_next/static/chunks/app/page-db17b4305404161e.js +1 -0
  154. package/apps/pwa/out/_next/static/chunks/app/reflection/page-30041d848350fd02.js +1 -0
  155. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-c540da022dbf86b0.js +1 -0
  156. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9399efc538da057f.js +1 -0
  157. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-ca2d09128c585ca4.js +1 -0
  158. package/apps/pwa/out/_next/static/chunks/app/settings/page-0e2635aecd343038.js +1 -0
  159. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-ef7f4399b6b7726e.js +1 -0
  160. package/apps/pwa/out/_next/static/chunks/app/setup/layout-deea1450b17cb8dc.js +1 -0
  161. package/apps/pwa/out/_next/static/chunks/app/setup/page-caf530535b875468.js +1 -0
  162. package/apps/pwa/out/_next/static/chunks/app/share/page-eaa20c1543a5fd8e.js +1 -0
  163. package/apps/pwa/out/_next/static/chunks/app/showroom/page-c541eb1b75120f61.js +1 -0
  164. package/apps/pwa/out/_next/static/chunks/app/tasks/page-ab5e213eda9479f4.js +1 -0
  165. package/apps/pwa/out/_next/static/chunks/app/term/page-0a815f34367b6db6.js +1 -0
  166. package/apps/pwa/out/_next/static/chunks/app/today/page-e858ba0ed9393b68.js +1 -0
  167. package/apps/pwa/out/_next/static/chunks/app/trace/page-1638ee9dd6e0582f.js +1 -0
  168. package/apps/pwa/out/_next/static/chunks/app/vault/page-4cf5a399109391f2.js +1 -0
  169. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-b4396321238798ec.js +1 -0
  170. package/apps/pwa/out/_next/static/chunks/app/workflows/page-cb72bfd21006781a.js +1 -0
  171. package/apps/pwa/out/_next/static/chunks/app/workspace/page-6135d0242afbc434.js +1 -0
  172. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a1dccf907eddb856.js +1 -0
  173. package/apps/pwa/out/_next/static/chunks/c7945435-b44d4dbe90ba0dcb.js +1 -0
  174. package/apps/pwa/out/_next/static/chunks/{3d0154af.5331fec737ffe8c3.js → cb0f8df8.09a4a6be97e3fc5f.js} +1 -1
  175. package/apps/pwa/out/_next/static/chunks/{e8543907.5b040a5f22a0b0e5.js → d96660fb.cbc21a2a88539dbb.js} +7 -7
  176. package/apps/pwa/out/_next/static/chunks/{50061469.0326382241ef3b2d.js → ea514caa.05a24f78d9dffe5f.js} +1 -1
  177. package/apps/pwa/out/_next/static/chunks/fb7d20d5-6892502b6ee39ca6.js +1 -0
  178. package/apps/pwa/out/_next/static/chunks/framework-e8a911e19b1be41f.js +1 -0
  179. package/apps/pwa/out/_next/static/chunks/main-7022f418fabba021.js +1 -0
  180. package/apps/pwa/out/_next/static/chunks/main-app-e5f15df755756a1e.js +1 -0
  181. package/apps/pwa/out/_next/static/chunks/pages/_app-4525f91e36940c9b.js +1 -0
  182. package/apps/pwa/out/_next/static/chunks/pages/_error-140f0e519c085b0f.js +1 -0
  183. package/apps/pwa/out/_next/static/chunks/webpack-8f22ef63dcb865b1.js +1 -0
  184. package/apps/pwa/out/_next/static/css/d1f8bb401740a549.css +1 -0
  185. package/apps/pwa/out/approvals/index.html +1 -1
  186. package/apps/pwa/out/approvals/index.txt +23 -23
  187. package/apps/pwa/out/autopilot/index.html +1 -1
  188. package/apps/pwa/out/autopilot/index.txt +23 -23
  189. package/apps/pwa/out/board/index.html +1 -1
  190. package/apps/pwa/out/board/index.txt +23 -23
  191. package/apps/pwa/out/botlab/index.html +1 -1
  192. package/apps/pwa/out/botlab/index.txt +22 -22
  193. package/apps/pwa/out/bots/index.html +1 -1
  194. package/apps/pwa/out/bots/index.txt +22 -22
  195. package/apps/pwa/out/ceo/index.html +1 -1
  196. package/apps/pwa/out/ceo/index.txt +23 -23
  197. package/apps/pwa/out/chat/index.html +1 -1
  198. package/apps/pwa/out/chat/index.txt +22 -22
  199. package/apps/pwa/out/consult/index.html +1 -1
  200. package/apps/pwa/out/consult/index.txt +23 -23
  201. package/apps/pwa/out/control/index.html +1 -1
  202. package/apps/pwa/out/control/index.txt +23 -23
  203. package/apps/pwa/out/decisions/index.html +1 -1
  204. package/apps/pwa/out/decisions/index.txt +22 -22
  205. package/apps/pwa/out/design-check/index.html +1 -1
  206. package/apps/pwa/out/design-check/index.txt +23 -23
  207. package/apps/pwa/out/editor/index.html +1 -1
  208. package/apps/pwa/out/editor/index.txt +23 -23
  209. package/apps/pwa/out/exec/index.html +1 -1
  210. package/apps/pwa/out/exec/index.txt +23 -23
  211. package/apps/pwa/out/field/index.html +1 -1
  212. package/apps/pwa/out/field/index.txt +23 -23
  213. package/apps/pwa/out/healthz +1 -1
  214. package/apps/pwa/out/index.html +1 -1
  215. package/apps/pwa/out/index.txt +22 -22
  216. package/apps/pwa/out/inside/index.html +1 -1
  217. package/apps/pwa/out/inside/index.txt +22 -22
  218. package/apps/pwa/out/intake/index.html +1 -1
  219. package/apps/pwa/out/intake/index.txt +23 -23
  220. package/apps/pwa/out/live/index.html +1 -1
  221. package/apps/pwa/out/live/index.txt +23 -23
  222. package/apps/pwa/out/live-run/index.html +1 -1
  223. package/apps/pwa/out/live-run/index.txt +23 -23
  224. package/apps/pwa/out/loops/index.html +1 -1
  225. package/apps/pwa/out/loops/index.txt +22 -22
  226. package/apps/pwa/out/market/index.html +1 -1
  227. package/apps/pwa/out/market/index.txt +22 -22
  228. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  229. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  230. package/apps/pwa/out/morning/index.html +1 -1
  231. package/apps/pwa/out/morning/index.txt +23 -23
  232. package/apps/pwa/out/observatory/index.html +1 -1
  233. package/apps/pwa/out/observatory/index.txt +23 -23
  234. package/apps/pwa/out/ops/checklist/index.html +1 -1
  235. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  236. package/apps/pwa/out/ops/release/index.html +1 -1
  237. package/apps/pwa/out/ops/release/index.txt +22 -22
  238. package/apps/pwa/out/ops/seats/index.html +1 -1
  239. package/apps/pwa/out/ops/seats/index.txt +22 -22
  240. package/apps/pwa/out/outputs/index.html +1 -1
  241. package/apps/pwa/out/outputs/index.txt +22 -22
  242. package/apps/pwa/out/reflection/index.html +1 -1
  243. package/apps/pwa/out/reflection/index.txt +23 -23
  244. package/apps/pwa/out/scheduler/index.html +1 -1
  245. package/apps/pwa/out/scheduler/index.txt +23 -23
  246. package/apps/pwa/out/sessions/index.html +1 -1
  247. package/apps/pwa/out/sessions/index.txt +22 -22
  248. package/apps/pwa/out/settings/devices/index.html +1 -1
  249. package/apps/pwa/out/settings/devices/index.txt +23 -23
  250. package/apps/pwa/out/settings/index.html +1 -1
  251. package/apps/pwa/out/settings/index.txt +23 -23
  252. package/apps/pwa/out/setup/done/index.html +1 -1
  253. package/apps/pwa/out/setup/done/index.txt +23 -23
  254. package/apps/pwa/out/setup/index.html +1 -1
  255. package/apps/pwa/out/setup/index.txt +23 -23
  256. package/apps/pwa/out/share/index.html +1 -1
  257. package/apps/pwa/out/share/index.txt +23 -23
  258. package/apps/pwa/out/showroom/index.html +1 -1
  259. package/apps/pwa/out/showroom/index.txt +22 -22
  260. package/apps/pwa/out/tasks/index.html +1 -1
  261. package/apps/pwa/out/tasks/index.txt +23 -23
  262. package/apps/pwa/out/term/index.html +1 -1
  263. package/apps/pwa/out/term/index.txt +23 -23
  264. package/apps/pwa/out/today/index.html +1 -1
  265. package/apps/pwa/out/today/index.txt +23 -23
  266. package/apps/pwa/out/trace/index.html +1 -1
  267. package/apps/pwa/out/trace/index.txt +23 -23
  268. package/apps/pwa/out/vault/index.html +1 -1
  269. package/apps/pwa/out/vault/index.txt +23 -23
  270. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  271. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  272. package/apps/pwa/out/workflows/index.html +1 -1
  273. package/apps/pwa/out/workflows/index.txt +23 -23
  274. package/apps/pwa/out/workspace/index.html +1 -1
  275. package/apps/pwa/out/workspace/index.txt +23 -23
  276. package/apps/pwa/out/worktrees/index.html +1 -1
  277. package/apps/pwa/out/worktrees/index.txt +23 -23
  278. package/catalog/external-commands.yaml +5 -3
  279. package/catalog/meta/catalogVersion.yaml +2 -1
  280. package/catalog/signing/catalog-signing-public.pem +3 -0
  281. package/graphs/intake/intake-daily.yaml +16 -0
  282. package/graphs/intake/news-sources.yaml +1 -0
  283. package/graphs/intake/recipes.yaml +7 -0
  284. package/graphs/overlays/examples/research-runtime-empty-terminal.yaml +28 -0
  285. package/graphs/profiles/local.yaml +5 -0
  286. package/graphs/profiles/pod.yaml +4 -0
  287. package/package.json +6 -2
  288. package/plugins/demo-absorption-briefing/plugin.json +18 -0
  289. package/plugins/demo-absorption-briefing/skills/demo-absorption-briefing/SKILL.md +8 -0
  290. package/plugins/demo-browser-hand/plugin.json +13 -0
  291. package/plugins/demo-browser-hand/skills/demo-browser-hand/SKILL.md +8 -0
  292. package/plugins/demo-linear-secretary/plugin.json +15 -0
  293. package/plugins/demo-linear-secretary/skills/demo-linear-secretary/SKILL.md +8 -0
  294. package/plugins/demo-plugin-wizard/plugin.json +11 -0
  295. package/plugins/demo-plugin-wizard/skills/demo-plugin-wizard/SKILL.md +8 -0
  296. package/plugins/demo-research/plugin.json +16 -0
  297. package/plugins/demo-research/skills/demo-research/SKILL.md +8 -0
  298. package/plugins/demo-video-briefing/plugin.json +15 -0
  299. package/plugins/demo-video-briefing/skills/demo-video-briefing/SKILL.md +8 -0
  300. package/scripts/build-signed-catalog.ts +48 -0
  301. package/scripts/ci-typecheck-main-delta.sh +88 -0
  302. package/scripts/codex-fallback-live-probe.ts +1 -1
  303. package/scripts/demo/demo1104-parallel-scenes.ts +301 -0
  304. package/scripts/demo/demo1104-stage.config.ts +21 -0
  305. package/scripts/demo/demo1104-stage.ts +316 -0
  306. package/scripts/goal-method-audit.ts +17 -1
  307. package/scripts/graph-units/land-enqueue.ts +90 -0
  308. package/scripts/hooks/codex-notify.sh +32 -0
  309. package/scripts/install.sh +10 -38
  310. package/scripts/landing-heal/land-plan.ts +57 -0
  311. package/scripts/release-loop/auto-approve-node.ts +1 -1
  312. package/scripts/release-loop/gate-autoheal-sim-evidence.ts +60 -0
  313. package/scripts/release-loop/gate-method.ts +139 -0
  314. package/scripts/release-loop/gate-node.ts +180 -20
  315. package/scripts/release-loop/gate-traffic-mode.ts +151 -3
  316. package/scripts/release-loop/node-verdict.ts +38 -25
  317. package/scripts/release-loop/preflight.ts +362 -8
  318. package/scripts/release-loop/unattended-release.ts +20 -9
  319. package/scripts/rhythm/daily.ts +36 -4
  320. package/scripts/rhythm/linear-progress-sync.ts +298 -0
  321. package/scripts/video-pipeline.ts +9 -1
  322. package/scripts/warm-pool-provider-config.ts +29 -6
  323. package/src/acp/agent-manager.ts +1 -0
  324. package/src/acp/codex-app-server-agent.ts +33 -0
  325. package/src/acp/codex-app-server-client.ts +153 -16
  326. package/src/acp/core-turn-bridge.ts +17 -12
  327. package/src/acp/event-router.ts +20 -1
  328. package/src/acp/server.ts +6 -0
  329. package/src/agent-mission/browser-roundtrip-coordinator.ts +85 -0
  330. package/src/agent-mission/claude-headless.ts +4 -1
  331. package/src/agent-mission/codex-exec.ts +105 -0
  332. package/src/agent-mission/driver.ts +192 -11
  333. package/src/agent-mission/grok-auth-status.ts +47 -0
  334. package/src/agent-mission/hand-hooks.ts +101 -0
  335. package/src/agent-mission/mission-cli.ts +56 -21
  336. package/src/agent-mission/mission-hand-reply.ts +118 -0
  337. package/src/agent-mission/mission-line.ts +180 -0
  338. package/src/agent-mission/mission-out.ts +256 -18
  339. package/src/agent-mission/tool-install.ts +122 -11
  340. package/src/agents/general-purpose.md +1 -1
  341. package/src/auto-research/research-turn.ts +95 -10
  342. package/src/autopilot/pr-manager.ts +31 -3
  343. package/src/boot/daemon-tools/self-implement.ts +3 -1
  344. package/src/boot/daemon-tools/web-search.ts +1 -2
  345. package/src/briefing/brief-items.ts +55 -11
  346. package/src/cli/agent-cli.ts +2 -1
  347. package/src/cli/catalog-cli.ts +31 -0
  348. package/src/cli/connector-cli.ts +16 -0
  349. package/src/cli/doctor-fix.ts +2 -2
  350. package/src/cli/intake-source-cli.ts +44 -8
  351. package/src/cli/msg-cli.ts +32 -3
  352. package/src/cli/pr-cli.ts +21 -1
  353. package/src/cli/pr-land-heavy-remote.ts +44 -6
  354. package/src/cli/pr-land-overlap-evidence.ts +13 -1
  355. package/src/cli/pr-land-pod-shadow-job.ts +143 -5
  356. package/src/cli/pr-land-pod-shadow.ts +9 -2
  357. package/src/cli/release-checklist-read-cli.ts +44 -16
  358. package/src/cli/release-cli.ts +23 -3
  359. package/src/cli/research-cli.ts +9 -0
  360. package/src/cli/setup-cli.ts +166 -6
  361. package/src/cli/setup-keys.ts +187 -0
  362. package/src/cli/task-plugin-wizard-host.ts +114 -0
  363. package/src/cli/tasks-cli.ts +54 -9
  364. package/src/cli/tui-test-cli.ts +186 -0
  365. package/src/config.ts +4 -2
  366. package/src/connectors/linear-daily-progress.ts +228 -0
  367. package/src/connectors/linear-projector.ts +34 -12
  368. package/src/connectors/linear.ts +151 -7
  369. package/src/core-turn/deep-turn-bloom.ts +67 -0
  370. package/src/core-turn/research-policy.ts +37 -0
  371. package/src/core-turn/run-core-turn.ts +320 -30
  372. package/src/core-turn/types.ts +2 -0
  373. package/src/dashboard/chat/acp-chat.ts +10 -0
  374. package/src/dashboard/classic-sidetab-mission-job.ts +103 -0
  375. package/src/dashboard/classic-sidetab-mission-pair.ts +81 -0
  376. package/src/dashboard/classic-sidetab-mission-trio.ts +219 -0
  377. package/src/dashboard/classic-sidetab-mission.ts +167 -5
  378. package/src/dashboard/index.ts +378 -13
  379. package/src/dashboard/input/chat-main-acp-dispatch.ts +23 -0
  380. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +8 -0
  381. package/src/dashboard/mission-cli-consumer.ts +20 -8
  382. package/src/dashboard/plugin-wizard-runtime.ts +50 -0
  383. package/src/dashboard/plugin-wizard-tool.ts +55 -0
  384. package/src/dashboard/sidetab-runtime.ts +1 -1
  385. package/src/dashboard/terminal-popup-runtime.ts +6 -3
  386. package/src/decisions/linear-progress-summary.ts +78 -0
  387. package/src/decisions/linear-progress-sync.ts +152 -0
  388. package/src/domains/outbound-alert.ts +49 -11
  389. package/src/domains/telegram-kind-route.ts +16 -9
  390. package/src/graph-runner/arg-allowance.ts +13 -0
  391. package/src/graph-runner/graph-run-api.ts +3 -1
  392. package/src/graph-runner/runner.ts +85 -17
  393. package/src/graph-wizard/mission-compose.ts +407 -12
  394. package/src/harness/dispatch-backpressure.ts +54 -1
  395. package/src/harness/dispatch-shadow-compare.ts +74 -0
  396. package/src/harness/harness-cli-command.ts +11 -1
  397. package/src/harness/skill-exec.ts +21 -9
  398. package/src/harness/skill-select.ts +1 -1
  399. package/src/hooks/error-report-cloud.ts +101 -0
  400. package/src/hooks/receiver.ts +29 -2
  401. package/src/index.ts +127 -10
  402. package/src/intake-plane/actions.ts +354 -0
  403. package/src/intake-plane/adapters/telegram-ambient.ts +34 -18
  404. package/src/intake-plane/intake-sources.ts +78 -8
  405. package/src/intake-plane/items.ts +14 -4
  406. package/src/intake-plane/linear-mission-sync.ts +80 -0
  407. package/src/intake-plane/linear-secretary-runtime.ts +178 -0
  408. package/src/intake-plane/linear-wish.ts +227 -1
  409. package/src/life/life-cli.ts +168 -0
  410. package/src/life/life-kinds.ts +160 -0
  411. package/src/live-supply/budget-consumer.ts +78 -0
  412. package/src/live-supply/read.ts +3 -0
  413. package/src/live-supply/snapshot.ts +45 -0
  414. package/src/llm/provider-credentials.ts +8 -2
  415. package/src/llm.ts +2 -1
  416. package/src/maturity/feature-maturity.ts +3 -3
  417. package/src/msg/msg-sse-server.ts +3 -3
  418. package/src/msg/msg-store.ts +177 -19
  419. package/src/native-tool-catalog.ts +36 -2
  420. package/src/nexus/api/http-server.ts +37 -1
  421. package/src/nexus/api/mcp-public-allowlist.ts +2 -0
  422. package/src/nexus/index.ts +7 -2
  423. package/src/nexus/outbound/format.ts +9 -0
  424. package/src/nexus/outbound/router.ts +98 -13
  425. package/src/nexus/setup-status.ts +9 -0
  426. package/src/nexus/state/state.ts +3 -0
  427. package/src/oauth/codex-account-store.ts +20 -7
  428. package/src/oauth/codex-owner-mirror.ts +44 -0
  429. package/src/oauth/codex.ts +17 -2
  430. package/src/oauth/fallback-chain.ts +47 -17
  431. package/src/onboarding/first-run-doctor.ts +8 -1
  432. package/src/onboarding/first-run.ts +85 -26
  433. package/src/onboarding/key-setup.ts +103 -0
  434. package/src/onboarding/menu-answer.ts +13 -0
  435. package/src/onboarding/secret-prompt.ts +37 -0
  436. package/src/plugins/install/plugin-install.ts +59 -0
  437. package/src/pr-tool/census.ts +130 -0
  438. package/src/pty-shell/pty-control-ipc.ts +4 -1
  439. package/src/registry/catalog-server.ts +232 -0
  440. package/src/registry/loader.ts +45 -1
  441. package/src/registry/types.ts +1 -2
  442. package/src/research/axis-fanout.ts +43 -28
  443. package/src/self-dev/ask-launch-flow.ts +72 -1
  444. package/src/self-dev/dev-cli.ts +4 -1
  445. package/src/self-dev/dev-pipeline.ts +5 -0
  446. package/src/self-dev/draft-residue.ts +64 -5
  447. package/src/self-dev/graph-front-nodes.ts +2 -1
  448. package/src/self-dev/graph-journey-route.ts +76 -21
  449. package/src/self-dev/launch-preflight.ts +58 -0
  450. package/src/self-dev/orchestrate.ts +1 -1
  451. package/src/self-dev/shard-aggregate.ts +4 -0
  452. package/src/self-dev/shard-run.ts +36 -15
  453. package/src/self-implement/abandoned-classification.ts +12 -3
  454. package/src/self-implement/budget-gate.ts +7 -0
  455. package/src/self-implement/child-llm-preference.ts +10 -1
  456. package/src/self-implement/doctor-visit.ts +30 -8
  457. package/src/self-implement/elanous-tui-spawn.ts +3 -0
  458. package/src/self-implement/fixtures/tdd-green-missing-passing-child-transcript.txt +2 -0
  459. package/src/self-implement/gate-artifacts.ts +2 -1
  460. package/src/self-implement/goal-author-cli.ts +4 -2
  461. package/src/self-implement/goal-author.ts +358 -4
  462. package/src/self-implement/graph-overlay-yaml.ts +30 -4
  463. package/src/self-implement/graph-overlay.ts +3 -1
  464. package/src/self-implement/graph-profile-yaml.ts +107 -0
  465. package/src/self-implement/graph-yaml.ts +26 -3
  466. package/src/self-implement/off-diff-evidence.ts +249 -5
  467. package/src/self-implement/orchestrator.ts +240 -15
  468. package/src/self-implement/run-chart.ts +6 -3
  469. package/src/self-implement/run-ledger.ts +51 -1
  470. package/src/self-implement/runtime-overlay-run-steps.ts +95 -0
  471. package/src/self-implement/tdd-evidence-tags.ts +9 -0
  472. package/src/self-implement/train-gate-receipt.ts +166 -0
  473. package/src/self-implement/train-gate-remote.ts +62 -18
  474. package/src/session/chat.ts +4 -2
  475. package/src/session/session-fanout.ts +2 -0
  476. package/src/session/streaming/acp-stream-sink.ts +2 -1
  477. package/src/session/streaming/chunk-producer.ts +6 -0
  478. package/src/session/streaming/stream-compositor.ts +3 -2
  479. package/src/session-runtime/index.ts +37 -1
  480. package/src/session-runtime/retry-policy.ts +1 -1
  481. package/src/setup/llm-env-detect.ts +3 -0
  482. package/src/setup/service-key-catalog.ts +46 -0
  483. package/src/setup/service-keys.ts +241 -0
  484. package/src/sidetab-core/visible-agent-mission.ts +98 -22
  485. package/src/skills/tools/agent.ts +23 -4
  486. package/src/skills/tools/omni-search.ts +123 -25
  487. package/src/task-agent/parent-host.ts +10 -0
  488. package/src/task-agent/repair-outcomes.ts +65 -0
  489. package/src/task-agent/task-hand.ts +20 -7
  490. package/src/task-orchestrator/dispatcher.ts +14 -1
  491. package/src/task-orchestrator/linear-capture-events.ts +55 -0
  492. package/src/task-orchestrator/store.ts +16 -5
  493. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +4 -0
  494. package/src/task-orchestrator/surfaces/pod-failure-reason.ts +92 -1
  495. package/src/task-orchestrator/surfaces/pod-ledger-events.ts +113 -14
  496. package/src/task-orchestrator/surfaces/pod-source-receive.ts +23 -11
  497. package/src/task-orchestrator/surfaces/pod-warm-switch.ts +2 -0
  498. package/src/task-orchestrator/surfaces/pod-warm-worker-provider.ts +35 -9
  499. package/src/task-orchestrator/surfaces/self-implement-pod.ts +172 -6
  500. package/src/task-orchestrator/surfaces/self-implement.ts +27 -3
  501. package/src/task-orchestrator/surfaces/warm-reuse-evidence.ts +169 -0
  502. package/src/task-orchestrator/types.ts +14 -0
  503. package/src/telegram.ts +14 -16
  504. package/src/terminal/coding-agent.ts +14 -5
  505. package/src/terminal/session-registry.ts +1 -1
  506. package/src/tool-hints/gate.ts +1 -0
  507. package/src/tool-runtime/agent-runtime.ts +1 -0
  508. package/src/tool-runtime/browser-hand-runtime.ts +381 -0
  509. package/src/tool-runtime/browser-runtime.ts +2 -1
  510. package/src/tool-runtime/elanous-linear-issue-runtime.ts +76 -0
  511. package/src/tool-runtime/elanous-linear-secretary-runtime.ts +57 -0
  512. package/src/tool-runtime/graph-mcp-runtimes.ts +240 -0
  513. package/src/tool-runtime/index.ts +6 -0
  514. package/src/tool-runtime/types.ts +3 -0
  515. package/src/tui/entry.ts +24 -1
  516. package/src/tui/sidetab/attach.ts +140 -11
  517. package/src/tui/sidetab/herdr-portal.ts +225 -0
  518. package/src/user-config.ts +34 -9
  519. package/src/user-intent/types.ts +4 -3
  520. package/src/ux-sim/browser-hand.ts +165 -0
  521. package/src/ux-sim/draft-inventory-builder.ts +198 -0
  522. package/src/ux-sim/fake-browser-page.ts +81 -0
  523. package/src/ux-sim/fake-linear-device.ts +31 -0
  524. package/src/ux-sim/graph-engine-sim.ts +47 -0
  525. package/src/ux-sim/linear-secretary.ts +216 -0
  526. package/src/ux-sim/mock-scenario-catalog.json +75 -23
  527. package/src/ux-sim/mock-scenario-catalog.ts +120 -2
  528. package/src/ux-sim/onboarding-first-run-device.ts +31 -21
  529. package/src/ux-sim/scenario.ts +70 -26
  530. package/src/ux-sim/service-key-setup.ts +50 -0
  531. package/src/ux-sim/term-slash-device.ts +74 -0
  532. package/src/ux-sim/turn-throw-sim.ts +31 -0
  533. package/src/version/packed-revision.json +1 -1
  534. package/src/web-search/exa.ts +77 -0
  535. package/src/web-search/index.ts +30 -9
  536. package/src/web-search/provider.ts +4 -1
  537. package/src/web-search/x-intent.ts +5 -0
  538. package/apps/pwa/out/_next/static/chunks/0244e5b5.6fc7670f8223d82d.js +0 -1
  539. package/apps/pwa/out/_next/static/chunks/1121.13ba7a8aff19df81.js +0 -36
  540. package/apps/pwa/out/_next/static/chunks/1345-31427b833438f521.js +0 -1
  541. package/apps/pwa/out/_next/static/chunks/1455-530ca16c7e71baff.js +0 -1
  542. package/apps/pwa/out/_next/static/chunks/1586.fafc33a9a5835cb7.js +0 -32
  543. package/apps/pwa/out/_next/static/chunks/1744.855fd60ae4c4a8c8.js +0 -1
  544. package/apps/pwa/out/_next/static/chunks/193.21a47a3e07ef6860.js +0 -1
  545. package/apps/pwa/out/_next/static/chunks/2004.e839fda7ea5a738a.js +0 -1
  546. package/apps/pwa/out/_next/static/chunks/2044-dd681a5c08779ff8.js +0 -1
  547. package/apps/pwa/out/_next/static/chunks/2101.2248decb38829b03.js +0 -286
  548. package/apps/pwa/out/_next/static/chunks/2160.a097e7b138ae1c55.js +0 -23
  549. package/apps/pwa/out/_next/static/chunks/2300.41ea70ac1bef1446.js +0 -1
  550. package/apps/pwa/out/_next/static/chunks/2357-07b5eeb5fb12628d.js +0 -1
  551. package/apps/pwa/out/_next/static/chunks/2364.28652020695a6db3.js +0 -34
  552. package/apps/pwa/out/_next/static/chunks/2526.c3e50ac1fec064bd.js +0 -1
  553. package/apps/pwa/out/_next/static/chunks/2549-cda50b716ff4250c.js +0 -1
  554. package/apps/pwa/out/_next/static/chunks/2550-5f1e88f615568045.js +0 -1
  555. package/apps/pwa/out/_next/static/chunks/261-319078c954e40d66.js +0 -1
  556. package/apps/pwa/out/_next/static/chunks/2974.595d1e29d040cb6a.js +0 -64
  557. package/apps/pwa/out/_next/static/chunks/3285.89ee2f298682f5e5.js +0 -93
  558. package/apps/pwa/out/_next/static/chunks/3447.06edc7b092021417.js +0 -41
  559. package/apps/pwa/out/_next/static/chunks/3510-9ca392698bfe4391.js +0 -1
  560. package/apps/pwa/out/_next/static/chunks/3541.772e5ce425aaa611.js +0 -24
  561. package/apps/pwa/out/_next/static/chunks/3741.9cf76acaa2ee5298.js +0 -1
  562. package/apps/pwa/out/_next/static/chunks/3837.a210d7d0db8d8abd.js +0 -1
  563. package/apps/pwa/out/_next/static/chunks/3898-955c896f394217a6.js +0 -1
  564. package/apps/pwa/out/_next/static/chunks/3947-ef57acea76eaa8d2.js +0 -1
  565. package/apps/pwa/out/_next/static/chunks/4037-3b82ebc7d78afdc7.js +0 -1
  566. package/apps/pwa/out/_next/static/chunks/405.9022d4a478202b67.js +0 -77
  567. package/apps/pwa/out/_next/static/chunks/417-fb2cc9a9910e5968.js +0 -1
  568. package/apps/pwa/out/_next/static/chunks/4276.336d76d858fcdf1b.js +0 -1
  569. package/apps/pwa/out/_next/static/chunks/4302.6ced9aa4535de947.js +0 -1
  570. package/apps/pwa/out/_next/static/chunks/4768-8eac183fd291ca53.js +0 -1
  571. package/apps/pwa/out/_next/static/chunks/4895.65605ec3e6504e89.js +0 -74
  572. package/apps/pwa/out/_next/static/chunks/5112.4b9f300124fab7b3.js +0 -149
  573. package/apps/pwa/out/_next/static/chunks/5335.375ee922bcd5bc83.js +0 -1
  574. package/apps/pwa/out/_next/static/chunks/5342.023a2e729689b320.js +0 -27
  575. package/apps/pwa/out/_next/static/chunks/5431-72a1dbde59400691.js +0 -1
  576. package/apps/pwa/out/_next/static/chunks/5486-b318c165f645d8ba.js +0 -1
  577. package/apps/pwa/out/_next/static/chunks/5506-c7d2ec25c62a7c94.js +0 -1
  578. package/apps/pwa/out/_next/static/chunks/5570-c66ecbea26b4e3b1.js +0 -1
  579. package/apps/pwa/out/_next/static/chunks/5696.ffca5aa259d8451e.js +0 -1
  580. package/apps/pwa/out/_next/static/chunks/5793-8c584aea2aa87560.js +0 -1
  581. package/apps/pwa/out/_next/static/chunks/5848-6de6b8c173351a90.js +0 -1
  582. package/apps/pwa/out/_next/static/chunks/5885.0a3e52c8faccec98.js +0 -287
  583. package/apps/pwa/out/_next/static/chunks/5999.94e3c83040200f31.js +0 -1
  584. package/apps/pwa/out/_next/static/chunks/5a7901d6-2d8d9b5587cf9042.js +0 -1
  585. package/apps/pwa/out/_next/static/chunks/6131.348b7d6bdcd267ce.js +0 -226
  586. package/apps/pwa/out/_next/static/chunks/6164.86133a0172611184.js +0 -90
  587. package/apps/pwa/out/_next/static/chunks/6377.bc7df239edbff244.js +0 -1
  588. package/apps/pwa/out/_next/static/chunks/6515.e07e8b2b8a707a87.js +0 -1
  589. package/apps/pwa/out/_next/static/chunks/6522-c005514f87d18982.js +0 -1
  590. package/apps/pwa/out/_next/static/chunks/6642.648adb1767f39ecf.js +0 -1
  591. package/apps/pwa/out/_next/static/chunks/6848.138805a09d001d09.js +0 -1
  592. package/apps/pwa/out/_next/static/chunks/7049-c09e2b7a253a24f3.js +0 -1
  593. package/apps/pwa/out/_next/static/chunks/7072.1e00447d9fa39972.js +0 -104
  594. package/apps/pwa/out/_next/static/chunks/7106.64201c539c5e220c.js +0 -94
  595. package/apps/pwa/out/_next/static/chunks/7151-1f742b455986530e.js +0 -1
  596. package/apps/pwa/out/_next/static/chunks/7199.18d6b25e001154ce.js +0 -1
  597. package/apps/pwa/out/_next/static/chunks/7279-c199ea83f34338fa.js +0 -1
  598. package/apps/pwa/out/_next/static/chunks/728b938d.ffaa7ad583d60e58.js +0 -1
  599. package/apps/pwa/out/_next/static/chunks/7309.171c3de54e0322f1.js +0 -1
  600. package/apps/pwa/out/_next/static/chunks/733.7a1ab3342e03306f.js +0 -1
  601. package/apps/pwa/out/_next/static/chunks/7504.d5cf1e7cd89b1b08.js +0 -24
  602. package/apps/pwa/out/_next/static/chunks/7573-0fd4af62d65d4598.js +0 -1
  603. package/apps/pwa/out/_next/static/chunks/759.6f8267df4689c401.js +0 -1
  604. package/apps/pwa/out/_next/static/chunks/7825-668b046f72f14483.js +0 -1
  605. package/apps/pwa/out/_next/static/chunks/7852-1538768b6eb19388.js +0 -1
  606. package/apps/pwa/out/_next/static/chunks/7868.cff810430bb63c91.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/8084-dfcc796874ab4e07.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/8266.6bf9b131b2584678.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/8403.7b81d5e64074a725.js +0 -8
  610. package/apps/pwa/out/_next/static/chunks/8470.1998cbd0866a7eac.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/8546-6f03f8ea34dd61d9.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/8687-246fda8433d3477c.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/898-280022fb082936bc.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/9098-50eefc1844212e3d.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/9249.976f1e69a9d80754.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/9255-cf88fceda5666645.js +0 -1
  617. package/apps/pwa/out/_next/static/chunks/9306-e523ba58bb8adc42.js +0 -1
  618. package/apps/pwa/out/_next/static/chunks/9324.a9866d717ba62cb6.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/9325.a8510e8aa87c8143.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/9353-12bfff0c130104cf.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/9415.69e4a21c60c7d2db.js +0 -1
  622. package/apps/pwa/out/_next/static/chunks/9479-154a697d4b6e4e98.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/9540-65aa6ccc31b3fd78.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/9633.ce5bddc56784da72.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/9832.f4a98c878ecf2c0a.js +0 -62
  626. package/apps/pwa/out/_next/static/chunks/9865.f094440645f02d98.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/9a852a62-6192a6ea9346ced3.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-e772b4710df5d936.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/app/approvals/page-4361368e6a76b967.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-802f349fdd65248d.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/app/board/page-7f35513988a2a495.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/app/botlab/page-798121656540e33e.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/app/bots/page-20a089490affe98c.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/app/ceo/page-e5e4ec786d70e604.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/app/chat/page-d12fe5d0801430e4.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/app/consult/page-d8cf21022fecc026.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/app/control/page-21ce565c9c57ee97.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/app/decisions/page-b56563025f619c9b.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/app/design-check/page-52f14dd133da8348.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/app/editor/page-c0ed7fdcdba76633.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/app/exec/page-af8c3020cb520f15.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/app/field/page-72eda67af9f5e35c.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/app/healthz/route-e772b4710df5d936.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/app/inside/page-67a6620d31f0a46f.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/intake/page-f059363aa0880ec2.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/layout-f9f917d6a57f69fb.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/live/page-d3ae55eee2f0826c.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/live-run/page-0e3d7b9421b79dac.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/loops/page-ba738f7e233eb211.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/market/page-33438b98c74fd599.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-0b34d5fd990d793a.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/not-found-3fced192be5279c1.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/observatory/page-04cb3cf182a7c1ea.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-6ccbd2ab23a21542.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-aa0518c48a5f4e56.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-4b32226d341ad7d7.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3224fd8f6383b61f.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/page-efbc97459f2914e2.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2fe487d88cd5d97c.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-48861dd1a858bab7.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/sessions/page-197d5d4d21d228ea.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-a763ba89fbdd9c27.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/settings/page-7edb253510b1c136.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-0c875702c61965ea.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/setup/layout-e772b4710df5d936.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/setup/page-e425c951151095f7.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/share/page-9c90e0aec4e27f77.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/showroom/page-733e09a02e727d42.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/tasks/page-4f899e14c34d77a1.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/term/page-bf067887b3307423.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/today/page-7af10868ff87d04e.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/trace/page-efe5304057aa11c7.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/vault/page-76bcd29aaa8a26c3.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-4cfd88e2273ce50f.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/workflows/page-0a1ddb47efba0a32.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/workspace/page-2a176c707152c892.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-efe03031b8797fbf.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/framework-d0d2d673bfd8a8a9.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/main-4c9fceb2baa09cb7.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/main-app-b0ab8d8fc9a97556.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/pages/_app-7e2cc62a2e5cec96.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/pages/_error-22324935f753ec5e.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/webpack-9dc1bfa25334998a.js +0 -1
  684. package/apps/pwa/out/_next/static/css/be9019f696217521.css +0 -1
  685. /package/apps/pwa/out/_next/static/{X1ucLw10Cds_h614NoEnh → Om5xS9jpjSXJCeTNGYEi4}/_ssgManifest.js +0 -0
@@ -0,0 +1,95 @@
1
+ import type { GraphTemplate } from './graph-templates.js';
2
+ import type { GraphTemplateSpec } from './graph-yaml.js';
3
+ import type { RunLedgerEntry } from './run-ledger.js';
4
+
5
+ type RuntimeOverlayGraph = Pick<GraphTemplate, 'nodes' | 'edges'> | Pick<GraphTemplateSpec, 'nodes' | 'edges'>;
6
+
7
+ const DEFAULT_OUTCOME = '$default';
8
+ const ABSENT_ROUTE = '$absent';
9
+
10
+ export interface RuntimeOverlayRunStepsInput {
11
+ readonly runId: string;
12
+ readonly timestamp: string;
13
+ readonly before: RuntimeOverlayGraph;
14
+ readonly after: RuntimeOverlayGraph;
15
+ readonly overlayIds: readonly string[];
16
+ readonly round: number;
17
+ }
18
+
19
+ interface GraphRoute {
20
+ readonly from: string;
21
+ readonly outcome: string;
22
+ readonly to: string;
23
+ }
24
+
25
+ function routesOf(graph: RuntimeOverlayGraph): Map<string, GraphRoute> {
26
+ const routes = new Map<string, GraphRoute>();
27
+ if (!Array.isArray(graph.edges)) {
28
+ const compiledEdges = graph.edges as Readonly<Record<string, readonly string[]>>;
29
+ for (const [from, destinations] of Object.entries(compiledEdges)) {
30
+ for (const [index, to] of destinations.entries()) {
31
+ routes.set(`${from}\u0000${index}`, { from, outcome: String(index), to: String(to) });
32
+ }
33
+ }
34
+ return routes;
35
+ }
36
+ for (const edge of graph.edges) {
37
+ if (edge.to !== undefined) {
38
+ routes.set(`${edge.from}\u0000${DEFAULT_OUTCOME}`, { from: edge.from, outcome: DEFAULT_OUTCOME, to: edge.to });
39
+ continue;
40
+ }
41
+ for (const [outcome, to] of Object.entries(edge.map ?? {})) {
42
+ routes.set(`${edge.from}\u0000${outcome}`, { from: edge.from, outcome, to: String(to) });
43
+ }
44
+ }
45
+ return routes;
46
+ }
47
+
48
+ function reason(input: RuntimeOverlayRunStepsInput): string {
49
+ return `runtime overlay ${input.overlayIds.join(', ')} applied at round ${input.round}`;
50
+ }
51
+
52
+ /** Convert an already accepted runtime overlay into the existing structural ledger vocabulary. */
53
+ export function runtimeOverlayRunSteps(input: RuntimeOverlayRunStepsInput): RunLedgerEntry[] {
54
+ if (input.overlayIds.length === 0) return [];
55
+ const detail = reason(input);
56
+ const beforeNodes = new Set(input.before.nodes.map((node) => node.nodeId));
57
+ const entries: RunLedgerEntry[] = input.after.nodes
58
+ .filter((node) => !beforeNodes.has(node.nodeId))
59
+ .map((node) => ({
60
+ timestamp: input.timestamp,
61
+ runId: input.runId,
62
+ event: 'node-added',
63
+ data: {
64
+ node: node.nodeId,
65
+ kind: node.kind,
66
+ decider: 'runtime-overlay',
67
+ reason: detail,
68
+ trigger: { overlayIds: input.overlayIds, round: input.round },
69
+ },
70
+ }));
71
+
72
+ const beforeRoutes = routesOf(input.before);
73
+ const afterRoutes = routesOf(input.after);
74
+ const changedRoutes = [...afterRoutes.entries()]
75
+ .filter(([key, route]) => beforeRoutes.get(key)?.to !== route.to)
76
+ .sort(([left], [right]) => left.localeCompare(right));
77
+ for (const [key, route] of changedRoutes) {
78
+ entries.push({
79
+ timestamp: input.timestamp,
80
+ runId: input.runId,
81
+ event: 'edge-rerouted',
82
+ data: {
83
+ from: route.from,
84
+ outcome: route.outcome,
85
+ to: route.to,
86
+ was: beforeRoutes.get(key)?.to ?? ABSENT_ROUTE,
87
+ decider: 'runtime-overlay',
88
+ reason: detail,
89
+ },
90
+ });
91
+ }
92
+ return entries;
93
+ }
94
+
95
+ export { ABSENT_ROUTE, DEFAULT_OUTCOME };
@@ -0,0 +1,9 @@
1
+ /** Stable TDD terminal-evidence tags shared by the producer and Pod result mapper. */
2
+ export const TDD_RED_TAG = 'tdd-red' as const;
3
+ export const TDD_GREEN_TAG = 'tdd-green' as const;
4
+ export const TDD_RECORD_TAGS = [TDD_RED_TAG, TDD_GREEN_TAG] as const;
5
+ export type TddRecordTag = typeof TDD_RECORD_TAGS[number];
6
+
7
+ export function isTddRecordTag(value: unknown): value is TddRecordTag {
8
+ return value === TDD_RED_TAG || value === TDD_GREEN_TAG;
9
+ }
@@ -0,0 +1,166 @@
1
+ import { spawnSync } from 'node:child_process';
2
+ import { readFileSync } from 'node:fs';
3
+ import { join } from 'node:path';
4
+ import { SPAWN_SYNC_MAX_BUFFER } from '../util/spawn-sync-output.js';
5
+ import {
6
+ computeReceiptKey,
7
+ gateEnvFingerprint,
8
+ gateLockfileHash,
9
+ GATE_RECEIPT_SCHEMA,
10
+ loadGateReceipts,
11
+ saveGateReceipt,
12
+ type GateReceipt,
13
+ type GateReceiptIdentity,
14
+ } from './gate-receipt-registry.js';
15
+
16
+ export interface TrainGateReceiptInput {
17
+ repo: string;
18
+ commit: string;
19
+ baseSha: string;
20
+ changedFiles: readonly string[];
21
+ deletedFiles?: readonly string[];
22
+ scenarioTests?: readonly string[];
23
+ }
24
+
25
+ export interface PassedSelfGateReceiptInput extends TrainGateReceiptInput {
26
+ /** Exact artifact emitted by `self gate --artifact-dir`; its pass and typecheck binding are revalidated here. */
27
+ summaryPath: string;
28
+ }
29
+
30
+ type Execute = (script: string, cwd: string) => { status: number | null; stdout: string; stderr: string };
31
+
32
+ const SHA40 = /^[0-9a-f]{40}$/i;
33
+ const TEST_FILE = /\.test\.[cm]?[jt]sx?$/;
34
+ const quote = (value: string) => `'${value.replaceAll("'", `'\\''`)}'`;
35
+
36
+ function registryPath(repo: string): string | undefined {
37
+ const result = spawnSync('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], { cwd: repo, encoding: 'utf8', timeout: 10_000, maxBuffer: SPAWN_SYNC_MAX_BUFFER });
38
+ const commonDir = (result.stdout ?? '').trim();
39
+ return result.status === 0 && commonDir ? join(commonDir, 'elanous-host-regate', 'gate-receipts.json') : undefined;
40
+ }
41
+
42
+ function identityFor(input: TrainGateReceiptInput, checks?: readonly string[]): GateReceiptIdentity | undefined {
43
+ if (!SHA40.test(input.commit) || !SHA40.test(input.baseSha)) return undefined;
44
+ const bun = spawnSync('bun', ['--version'], { cwd: input.repo, encoding: 'utf8', timeout: 10_000, maxBuffer: SPAWN_SYNC_MAX_BUFFER });
45
+ const bunVersion = (bun.stdout ?? '').trim();
46
+ if (bun.status !== 0 || !bunVersion) return undefined;
47
+ return {
48
+ headCommit: input.commit,
49
+ baseCommit: input.baseSha,
50
+ bunVersion,
51
+ lockfileHash: gateLockfileHash(input.repo),
52
+ radiusFiles: [...new Set(input.changedFiles)].sort(),
53
+ checks: checks ? [...checks] : [
54
+ 'train:changed-file-typecheck',
55
+ ...(input.scenarioTests?.length || input.changedFiles.some((file) => TEST_FILE.test(file) && !input.deletedFiles?.includes(file)) ? ['train:deterministic-tests'] : []),
56
+ ...(input.scenarioTests ?? []).map((file) => `train:scenario-test:${file}`),
57
+ 'train:pwa-build',
58
+ ],
59
+ envFingerprint: gateEnvFingerprint(process.env),
60
+ };
61
+ }
62
+
63
+ /** Record only after revalidating the exact self-gate summary, then independently measure changed-only interference. */
64
+ export async function recordPassedSelfGateReceipt(
65
+ input: PassedSelfGateReceiptInput,
66
+ detect: (files: readonly string[]) => Promise<{ status: 'no-interference' | 'interference' | 'unmeasurable' }> = async (files) => {
67
+ const { detectTestInterference } = await import('../../scripts/detect-test-interference.js');
68
+ return detectTestInterference(files);
69
+ },
70
+ ): Promise<GateReceipt | undefined> {
71
+ let summary: Record<string, unknown>;
72
+ try { summary = JSON.parse(readFileSync(input.summaryPath, 'utf8')) as Record<string, unknown>; }
73
+ catch { return undefined; }
74
+ const typecheck = summary.typecheck as Record<string, unknown> | undefined;
75
+ const cohort = Array.isArray(summary.cohort) ? summary.cohort.filter((file): file is string => typeof file === 'string') : [];
76
+ const changedTestFiles = [...new Set(input.changedFiles.filter((file) => TEST_FILE.test(file)
77
+ && !input.deletedFiles?.includes(file)))].sort();
78
+ if (summary.head40 !== input.commit || summary.base40 !== input.baseSha || summary.exitCode !== 0
79
+ || !['passed', 'pass'].includes(String(summary.verdict)) || summary.introduced !== 0
80
+ || summary.unknown !== 0 || summary.unrunImporters !== 0
81
+ || typecheck?.status !== 'passed' || typecheck.base40 !== input.baseSha
82
+ || typecheck.head40 !== input.commit || typecheck.exitCode !== 0 || typecheck.newErrors !== 0
83
+ || changedTestFiles.some((file) => !cohort.includes(file))) return undefined;
84
+ const testFiles = [...new Set(input.changedFiles.filter((file) => TEST_FILE.test(file)
85
+ && !input.deletedFiles?.includes(file)))].sort();
86
+ if (!testFiles.length) return undefined;
87
+ const interference = await detect(testFiles);
88
+ if (interference.status !== 'no-interference') return undefined;
89
+ const identity = identityFor(input, ['test-interference:changed-only']);
90
+ const path = process.env.ELANOUS_GATE_RECEIPT_REGISTRY_PATH || registryPath(input.repo);
91
+ if (!identity || !path) return undefined;
92
+ const receipt = passedEvidenceReceipt(identity, input.changedFiles);
93
+ try { saveGateReceipt(path, receipt); }
94
+ catch { return undefined; }
95
+ return receipt;
96
+ }
97
+
98
+ function scriptFor(input: TrainGateReceiptInput, files: readonly string[]): string {
99
+ const tests = [...new Set([
100
+ ...files.filter((file) => TEST_FILE.test(file) && !input.deletedFiles?.includes(file)),
101
+ ...(input.scenarioTests ?? []),
102
+ ])];
103
+ return [
104
+ `TSC_BASE_REF=${quote(input.baseSha)} bun scripts/ci-typecheck-changed.ts --local`,
105
+ ...(tests.length ? [`bun run test:deterministic ${tests.map(quote).join(' ')}`] : []),
106
+ `bun scripts/ci-pwa-build-gate.ts --changed-files ${files.map(quote).join(' ')}`,
107
+ ].join(' && ');
108
+ }
109
+
110
+ function passedEvidenceReceipt(identity: GateReceiptIdentity, files: readonly string[]): GateReceipt {
111
+ const receiptIdentity: GateReceiptIdentity = { ...identity, radiusFiles: [...new Set(files)].sort() };
112
+ return {
113
+ ...receiptIdentity,
114
+ schema: GATE_RECEIPT_SCHEMA,
115
+ key: computeReceiptKey(receiptIdentity, 'passed'),
116
+ verdict: 'passed',
117
+ savedAt: new Date().toISOString(),
118
+ };
119
+ }
120
+
121
+ export function runTrainGateWithReceipts(input: TrainGateReceiptInput, execute: Execute = (script, cwd) => {
122
+ const result = spawnSync('sh', ['-c', script], { cwd, encoding: 'utf8', timeout: 120 * 60_000, maxBuffer: 32 * 1024 * 1024 });
123
+ return { status: result.status, stdout: result.stdout ?? '', stderr: result.stderr ?? '' };
124
+ }): { status: number | null; stdout: string; stderr: string } {
125
+ const context = identityFor(input);
126
+ const path = process.env.ELANOUS_GATE_RECEIPT_REGISTRY_PATH || registryPath(input.repo);
127
+ if (!context || !path) return execute(scriptFor(input, input.changedFiles), input.repo);
128
+
129
+ const changedFiles = [...new Set(input.changedFiles)].sort();
130
+ const result = execute(scriptFor(input, changedFiles), input.repo);
131
+ if (result.status === 0 && changedFiles.length) {
132
+ try { saveGateReceipt(path, passedEvidenceReceipt(context, changedFiles)); }
133
+ catch { /* A receipt is an optimization; a passed gate remains passed if persistence fails. */ }
134
+ }
135
+ return result;
136
+ }
137
+
138
+ if (import.meta.main) {
139
+ const raw = process.argv[2];
140
+ try {
141
+ if (!raw) throw new Error('train gate receipt input is required');
142
+ const input = JSON.parse(raw) as TrainGateReceiptInput & Partial<PassedSelfGateReceiptInput>;
143
+ if (input.summaryPath) {
144
+ const receipt = await recordPassedSelfGateReceipt(input as PassedSelfGateReceiptInput);
145
+ const registryFile = process.env.ELANOUS_GATE_RECEIPT_REGISTRY_PATH;
146
+ if (registryFile) {
147
+ const registry = loadGateReceipts(registryFile);
148
+ process.stdout.write(`${String.fromCharCode(10)}__GATE_RECEIPTS__${Buffer.from(JSON.stringify(registry)).toString('base64')}${String.fromCharCode(10)}`);
149
+ }
150
+ if (!receipt) process.exitCode = 1;
151
+ } else {
152
+ const result = runTrainGateWithReceipts({ ...input, repo: process.cwd() });
153
+ process.stdout.write(result.stdout);
154
+ process.stderr.write(result.stderr);
155
+ const registryFile = process.env.ELANOUS_GATE_RECEIPT_REGISTRY_PATH;
156
+ if (registryFile) {
157
+ const registry = loadGateReceipts(registryFile);
158
+ process.stdout.write(`${String.fromCharCode(10)}__GATE_RECEIPTS__${Buffer.from(JSON.stringify(registry)).toString('base64')}${String.fromCharCode(10)}`);
159
+ }
160
+ process.exitCode = result.status ?? 1;
161
+ }
162
+ } catch (error) {
163
+ process.stderr.write(`${error instanceof Error ? error.message : String(error)}\n`);
164
+ process.exitCode = 1;
165
+ }
166
+ }
@@ -3,8 +3,12 @@
3
3
  * Unlike `dispatchHeavyCheck` it never falls back to a local run: a busy host or an infra failure is «unmeasured».
4
4
  * The only local commands are git (cat-file · rev-parse · push · diff). */
5
5
  import { debug } from '../debug/log.js';
6
+ import { spawnSync } from 'node:child_process';
6
7
  import { parseGateScenario, readGateScenarioFile } from './gate-scenario.js';
7
8
  import { getDefaultLogStore } from '../mss/logging/log-store.js';
9
+ import { join } from 'node:path';
10
+ import { SPAWN_SYNC_MAX_BUFFER } from '../util/spawn-sync-output.js';
11
+ import { saveGateReceipt, type GateReceipt } from './gate-receipt-registry.js';
8
12
  import {
9
13
  gateRemoteHostCap, realGateRemoteRunner, resolveGateRemoteSettings, runOnRemote,
10
14
  type GateRemoteRunner, type GateRemoteSettings, type RemoteRunOutcome,
@@ -30,6 +34,51 @@ export interface TrainGateInput {
30
34
 
31
35
  export interface TrainGateResult { outcome: TrainGateOutcome; host: string; ms?: number; rc?: number; reason?: string }
32
36
 
37
+ const GATE_RECEIPTS_MARKER = String.fromCharCode(10) + '__GATE_RECEIPTS__';
38
+
39
+ function sharedGateReceiptPath(repo: string, runner: GateRemoteRunner): string | undefined {
40
+ try {
41
+ const result = runner.local('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], repo);
42
+ const commonDir = result.stdout.trim();
43
+ return result.rc === 0 && commonDir ? join(commonDir, 'elanous-host-regate', 'gate-receipts.json') : undefined;
44
+ } catch { return undefined; }
45
+ }
46
+
47
+ /** The exact persistent registry used by local train receipt merging. */
48
+ export function gateReceiptRegistryPathForRepo(repo: string): string | undefined {
49
+ const result = spawnSync('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], {
50
+ cwd: repo, encoding: 'utf8', timeout: 10_000, maxBuffer: SPAWN_SYNC_MAX_BUFFER,
51
+ });
52
+ const commonDir = (result.stdout ?? '').trim();
53
+ return result.status === 0 && commonDir ? join(commonDir, 'elanous-host-regate', 'gate-receipts.json') : undefined;
54
+ }
55
+
56
+ /** Merge the existing remote-writer marker into the local common-dir registry. Invalid rows fail closed. */
57
+ export function mergeGateReceiptRegistryPayload(payload: string, path: string): number {
58
+ let saved = 0;
59
+ try {
60
+ const rows = JSON.parse(Buffer.from(payload, 'base64').toString('utf8')) as Record<string, unknown>;
61
+ for (const [key, value] of Object.entries(rows)) {
62
+ if (!value || typeof value !== 'object' || Array.isArray(value)) continue;
63
+ const receipt = value as GateReceipt;
64
+ if (receipt.key !== key) continue;
65
+ try { saveGateReceipt(path, receipt); saved++; }
66
+ catch { /* Invalid remote records are discarded; local gates remain fail-open. */ }
67
+ }
68
+ } catch { /* A malformed response never changes the measured gate verdict. */ }
69
+ return saved;
70
+ }
71
+
72
+ function mergeReturnedReceipts(outcome: RemoteRunOutcome, path: string | undefined): RemoteRunOutcome {
73
+ if (outcome.kind !== 'ran' || outcome.rc !== 0 || !path) return outcome;
74
+ const stdout = outcome.stdout.toString('utf8');
75
+ const marker = stdout.lastIndexOf(GATE_RECEIPTS_MARKER);
76
+ if (marker < 0) return outcome;
77
+ const payload = stdout.slice(marker + GATE_RECEIPTS_MARKER.length).trim();
78
+ mergeGateReceiptRegistryPayload(payload, path);
79
+ return { ...outcome, stdout: Buffer.from(stdout.slice(0, marker)) };
80
+ }
81
+
33
82
  export interface TrainGateObservation {
34
83
  host: string; commit: string; baseSha: string; outcome: TrainGateOutcome;
35
84
  rc?: number; ms?: number; reason?: string; changedFiles: number;
@@ -42,22 +91,6 @@ export interface TrainGateDeps {
42
91
  observe?: (entry: TrainGateObservation) => void;
43
92
  }
44
93
 
45
- const quote = (value: string) => `'${value.replaceAll("'", `'\\''`)}'`;
46
- const TEST_FILE = /\.test\.[cm]?[jt]sx?$/;
47
-
48
- /** The host-side shell body: each step runs only if the one before it passed. Exported for tests. */
49
- export function trainGateScript(baseSha: string, changedFiles: readonly string[], deleted: ReadonlySet<string> = new Set(), scenarioTests: readonly string[] = []): string {
50
- // A deleted test file is a changed path (tsc/PWA reach) but not something to run.
51
- const changedTests = changedFiles.filter((file) => TEST_FILE.test(file) && !deleted.has(file));
52
- const tests = scenarioTests.length ? [...new Set([...changedTests, ...scenarioTests])] : changedTests;
53
- const steps = [
54
- `TSC_BASE_REF=${quote(baseSha)} bun scripts/ci-typecheck-changed.ts --local`,
55
- ...(tests.length ? [`bun run test:deterministic ${tests.map(quote).join(' ')}`] : []),
56
- `bun scripts/ci-pwa-build-gate.ts --changed-files ${changedFiles.map(quote).join(' ')}`,
57
- ];
58
- return steps.join(' && ');
59
- }
60
-
61
94
  async function loadSettings(): Promise<GateRemoteSettings> {
62
95
  try {
63
96
  const { getUserConfig } = await import('../user-config.js');
@@ -76,6 +109,10 @@ export const TRAIN_GATE_HOST = 'node-b';
76
109
 
77
110
  export async function runTrainGateOnHost(input: TrainGateInput, runner: GateRemoteRunner = realGateRemoteRunner, deps: TrainGateDeps = {}): Promise<TrainGateResult> {
78
111
  const settings = input.settings ?? await loadSettings();
112
+ const receiptPath = sharedGateReceiptPath(input.repo, runner);
113
+ // Each remote full gate writes into a fresh scratch registry; returned rows merge into the local shared registry.
114
+ // No existing registry contents are needed for receipt registration.
115
+ const payloadFiles = receiptPath ? [{ env: 'ELANOUS_GATE_RECEIPT_REGISTRY_PATH', content: '{}' }] : undefined;
79
116
  const host = settings.host;
80
117
  const hostCap = gateRemoteHostCap(settings, host);
81
118
  let scenarioTests: string[] = [];
@@ -110,14 +147,21 @@ export async function runTrainGateOnHost(input: TrainGateInput, runner: GateRemo
110
147
  const sleep = deps.sleep ?? ((ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms)));
111
148
  const now = deps.now ?? Date.now;
112
149
  const deadline = now() + settings.slotWaitSeconds * 1000;
113
- const script = trainGateScript(input.baseSha, input.changedFiles, new Set(input.deletedFiles ?? []), scenarioTests);
114
150
  let outcome: RemoteRunOutcome;
115
151
  for (;;) {
116
152
  try {
117
153
  outcome = runOnRemote({
118
154
  repo: input.repo, host, mirror: settings.mirror, commit: input.commit, refs: [input.baseSha],
119
- argv: ['sh', '-c', script], installPwa: true, hostCap,
155
+ argv: ['bun', 'src/self-implement/train-gate-receipt.ts', JSON.stringify({
156
+ repo: input.repo,
157
+ commit: input.commit,
158
+ baseSha: input.baseSha,
159
+ changedFiles: input.changedFiles,
160
+ deletedFiles: input.deletedFiles ?? [],
161
+ scenarioTests,
162
+ })], installPwa: true, hostCap, ...(payloadFiles ? { payloadFiles } : {}),
120
163
  }, runner);
164
+ outcome = mergeReturnedReceipts(outcome, receiptPath);
121
165
  } catch (error) {
122
166
  outcome = { kind: 'infra', reason: `exception: ${error instanceof Error ? error.message : String(error)}` };
123
167
  }
@@ -511,8 +511,9 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
511
511
  // streamLLMWithTools)으로 라우팅. 미아밍이면 아래 기존 single-turn 경로 그대로(회귀 0).
512
512
  const goalLoopCfg = opts.userConfig.llm.goalLoop;
513
513
  const armGoalLoop = opts.goalLoop === true || goalLoopCfg?.enabled === true;
514
- const armTuiResearchTurn = opts.utteranceSurface === 'tui' && turnTools.length > 0 && isResearchAgentIntent(opts.userText);
515
- if (armGoalLoop || armTuiResearchTurn) {
514
+ const armResearchTurn = (opts.utteranceSurface === 'tui' || opts.utteranceSurface === 'ask')
515
+ && turnTools.length > 0 && isResearchAgentIntent(opts.userText);
516
+ if (armGoalLoop || armResearchTurn) {
516
517
  // ⭐ CHILD-CONTEXT-BUDGET(0.2.35 칸) — 구현 자식(self-implement 공간)의 첫 goal-loop
517
518
  // 턴에서 실제 effectiveSystemPrompt·turnTools 스키마·userText(골)의 구성 바이트를
518
519
  // composeChildContext 로 계측해 child.context-composition 사건 1회로 남긴다.
@@ -563,6 +564,7 @@ export async function runTurn(opts: RunTurnOpts): Promise<RunTurnResult> {
563
564
  },
564
565
  },
565
566
  ...(turnLlmOpts?.model ? { modelOverride: turnLlmOpts.model } : {}),
567
+ ...(turnLlmOpts?.reasoningEffort ? { reasoningEffort: turnLlmOpts.reasoningEffort } : {}),
566
568
  ...(turnLlmOpts?.budgetGrant ? { budgetGrant: turnLlmOpts.budgetGrant } : {}),
567
569
  ...(guardedTurnLlmOpts?.requestSizeGuard
568
570
  ? { requestSizeGuard: guardedTurnLlmOpts.requestSizeGuard } : {}),
@@ -224,6 +224,8 @@ export interface SessionChunkEvent {
224
224
  seq: number;
225
225
  /** 텍스트 델타(누적은 sink 의 라이브핸들이). */
226
226
  delta?: string;
227
+ /** Replace the current assistant text accumulated for this stream. */
228
+ textOperation?: 'replace';
227
229
  /** 툴 활동(⚙️…✓ inline 렌더용). */
228
230
  tool?: { id: string; name: string; phase: 'call' | 'result'; ok?: boolean };
229
231
  /** 🧠 추론(모드 gated·선택). */
@@ -36,7 +36,8 @@ export function createAcpStreamSink(broadcast: AcpBroadcast): StreamingSurfaceSi
36
36
  if (!sessionId) return;
37
37
  if (ev.delta) {
38
38
  // push(chunk) 등가 — agent_message_chunk(byte-identical).
39
- void broadcast(sessionId, { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: ev.delta } });
39
+ void broadcast(sessionId, { sessionUpdate: 'agent_message_chunk', content: { type: 'text', text: ev.delta },
40
+ ...(ev.textOperation === 'replace' ? { _meta: { elanous: { textOperation: 'replace' } } } : {}) });
40
41
  }
41
42
  if (ev.reasoning) {
42
43
  // 🧠 추론 — agent_thought_chunk(ACP 의 thought 채널).
@@ -20,6 +20,7 @@ import { debug } from '../../debug/log.js';
20
20
  * shadow 시엔 'acp' 구독자 부재 → tg/dc/pwa 미러만. reasoning 채널 추가 지원. */
21
21
  export interface AcpChunkProducer {
22
22
  delta: (text: string) => void;
23
+ replaceText: (text: string) => void;
23
24
  /** ⭐ `result` 는 «결과 단계»에서만 뜻이 있고, 주면 ACP `rawOutput` 으로 실려 나간다.
24
25
  *
25
26
  * ⛔⭐⭐ **「안 줬다」의 «사유»를 여기서 만들지 않는다.**
@@ -53,6 +54,11 @@ export function makeAcpChunkProducer(sessionId: string, opts: { streamId?: strin
53
54
  fo({ streamId, seq: seq++, delta: text });
54
55
  deltas++;
55
56
  },
57
+ replaceText(text: string): void {
58
+ accum = text;
59
+ fo({ streamId, seq: seq++, delta: text, textOperation: 'replace' });
60
+ deltas++;
61
+ },
56
62
  tool(id, name, phase, ok, result): void {
57
63
  fo({ streamId, seq: seq++, tool: {
58
64
  id, name, phase,
@@ -46,9 +46,10 @@ export function createCompositorState(): CompositorState {
46
46
  /** 청크 이벤트를 상태에 반영(순수·in-place). delta/reasoning/tool 을 흡수. */
47
47
  export function applyChunk(
48
48
  state: CompositorState,
49
- ev: { delta?: string; reasoning?: string; tool?: { id: string; name: string; phase: 'call' | 'result'; ok?: boolean } },
49
+ ev: { delta?: string; textOperation?: 'replace'; reasoning?: string; tool?: { id: string; name: string; phase: 'call' | 'result'; ok?: boolean } },
50
50
  ): void {
51
- if (ev.delta) state.text += ev.delta;
51
+ if (ev.textOperation === 'replace') state.text = ev.delta ?? '';
52
+ else if (ev.delta) state.text += ev.delta;
52
53
  if (ev.reasoning) state.reasoning = ev.reasoning; // keep-latest(추론은 누적 아닌 최신 요약)
53
54
  if (ev.tool) {
54
55
  if (ev.tool.phase === 'call') {
@@ -185,6 +185,7 @@ export interface SessionRuntimeDispatchDeps {
185
185
  dispatch: (name: string, args: Record<string, unknown>) => Promise<unknown>;
186
186
  workingDirectory: string;
187
187
  };
188
+ inheritGeneralPurposeToolCatalog?: boolean;
188
189
  searchPlannerState?: SearchPlannerState;
189
190
  /** CC (2026-04-25) — forwarded from the LLM router's dispatch ctx
190
191
  * (`turnIndex`). Lets the planner allow same-turn parallel fan-out
@@ -439,6 +440,7 @@ interface SessionNativeToolRule {
439
440
  dispatch: (name: string, args: Record<string, unknown>) => Promise<unknown>;
440
441
  workingDirectory: string;
441
442
  };
443
+ inheritGeneralPurposeToolCatalog?: boolean;
442
444
  },
443
445
  ): Promise<unknown>;
444
446
  /** ⛔ Opt-IN to the ToolRuntime registry path instead of `dispatch` above.
@@ -520,6 +522,7 @@ const SESSION_NATIVE_TOOL_RULES: SessionNativeToolRule[] = [
520
522
  hostTools: opts?.agentHostTools,
521
523
  dispatchTool: opts?.agentDispatchTool,
522
524
  buildChildToolCatalog: opts?.buildChildToolCatalog,
525
+ inheritGeneralPurposeToolCatalog: opts?.inheritGeneralPurposeToolCatalog,
523
526
  }),
524
527
  preferRuntime: true,
525
528
  },
@@ -843,7 +846,7 @@ const SESSION_SURFACE_PROFILES: Record<SessionSurfaceId, Omit<SessionSurfaceProf
843
846
  baselineContexts: ['external-world-guidance'],
844
847
  defaultHostFamilyIds: ['self-ops'],
845
848
  defaultRuntimeFamilyIds: [],
846
- defaultNativeFamilyIds: ['web-search'],
849
+ defaultNativeFamilyIds: ['web-search', 'deep-research', 'web-fetch'],
847
850
  },
848
851
  'control/agent': {
849
852
  id: 'control/agent',
@@ -1811,6 +1814,38 @@ function buildEssentialSessionRuntimeToolSpecs(opts: {
1811
1814
  return [...nativeSpecs, ...hostSpecs, ...runtimeSpecs, ...mcpProxySpecs, ...optionalSpecs];
1812
1815
  }
1813
1816
 
1817
+ /** Build the full TUI-visible catalog for Agent children. The parent model's
1818
+ * turn catalog is intentionally surface/tier narrowed; children inherit the
1819
+ * available TUI catalog instead, while `dispatchSessionRuntimeTool` remains
1820
+ * the policy boundary and `dispatchAgent` still strips recursive Agent. */
1821
+ export function buildSubagentSessionRuntimeToolSpecs(opts: {
1822
+ hostTools: readonly LLMToolDef[];
1823
+ runtimeTools: readonly ToolRuntime<Record<string, unknown>, ToolRunResult>[];
1824
+ optionalTools: readonly LLMToolSpec[];
1825
+ toolAvailability?: Readonly<Record<string, boolean>>;
1826
+ }): LLMToolSpec[] {
1827
+ const nativeSpecs = SESSION_NATIVE_TOOL_RULES.flatMap(rule => {
1828
+ const spec = rule.build();
1829
+ const catalogEntry = findNativeTool(spec.name);
1830
+ return (!catalogEntry || isNativeToolModelExposed(catalogEntry))
1831
+ && isNativeToolAvailable(spec.name, rule, opts.toolAvailability)
1832
+ ? [spec]
1833
+ : [];
1834
+ });
1835
+ const hostSpecs = opts.hostTools
1836
+ .filter(tool => isToolAvailable(tool.name, opts.toolAvailability))
1837
+ .map(toSpec);
1838
+ const runtimeSpecs = opts.runtimeTools
1839
+ .filter(tool => isToolAvailable(tool.spec.name, opts.toolAvailability))
1840
+ .map(tool => tool.spec);
1841
+ const optionalSpecs = opts.optionalTools
1842
+ .filter(tool => isToolAvailable(tool.name, opts.toolAvailability));
1843
+ return [...new Map(
1844
+ [...nativeSpecs, ...hostSpecs, ...runtimeSpecs, ...optionalSpecs]
1845
+ .map(spec => [spec.name, spec] as const),
1846
+ ).values()];
1847
+ }
1848
+
1814
1849
  export function buildSessionRuntimeToolSpecs(opts: {
1815
1850
  userText: string;
1816
1851
  hostTools: readonly LLMToolDef[];
@@ -2122,6 +2157,7 @@ export async function dispatchSessionRuntimeTool(
2122
2157
  agentHostTools: deps.agentHostTools,
2123
2158
  agentDispatchTool: deps.agentDispatchTool,
2124
2159
  buildChildToolCatalog: deps.buildChildToolCatalog,
2160
+ inheritGeneralPurposeToolCatalog: deps.inheritGeneralPurposeToolCatalog,
2125
2161
  });
2126
2162
  }
2127
2163
  rememberCandidateListingResult(name, normalizedArgs, result, scopedAnalysis, deps.searchPlannerState);
@@ -226,7 +226,7 @@ export function providerNamesFromFallbackChain(chain: readonly string[]): string
226
226
  const seen = new Set<string>();
227
227
  for (const step of chain) {
228
228
  // `codex-credits`(체인 마지막 칸 · 크레딧)도 provider 는 openai-codex 다 — 이미 앞에 있으면 중복이라 빠진다.
229
- const name = step === 'grok' ? 'grok' : step === 'zai' ? 'glm'
229
+ const name = step === 'grok' ? 'grok' : step === 'zai' ? 'glm' : step === 'openrouter' ? 'openrouter'
230
230
  : step === 'codex-rotate' || step === 'codex-credits' ? 'openai-codex' : undefined;
231
231
  if (!name || seen.has(name)) continue;
232
232
  seen.add(name);
@@ -168,6 +168,9 @@ export const AUXILIARY_AI_ENV_VARS: readonly AuxiliaryAiEnvVar[] = [
168
168
  { name: 'UPSTAGE_API_KEY', usedBy: 'document parse' },
169
169
  ] as const;
170
170
 
171
+ export { SERVICE_KEY_CATALOG, renderServiceKeyCatalogMarkdown } from './service-key-catalog.js';
172
+ export type { ServiceKeyCatalogEntry } from './service-key-catalog.js';
173
+
171
174
  export function summarizeAuxiliaryAiEnv(
172
175
  env: NodeJS.ProcessEnv = process.env,
173
176
  ): AuxiliaryAiEnvVar[] {
@@ -0,0 +1,46 @@
1
+ /** Service setup metadata shared by the CLI, runtime key loader, and manual. */
2
+ export interface ServiceKeyCatalogEntry {
3
+ id: string;
4
+ label: string;
5
+ kind: 'api-key' | 'subscription' | 'oauth' | 'cli' | 'local';
6
+ envNames: readonly string[];
7
+ setupUrl: string;
8
+ usedBy: string;
9
+ cost: 'account-plan' | 'usage-based' | 'plan-dependent' | 'local';
10
+ verification: string;
11
+ demoRequired: boolean;
12
+ }
13
+
14
+ export const SERVICE_KEY_CATALOG: readonly ServiceKeyCatalogEntry[] = [
15
+ { id: 'codex', label: 'OpenAI Codex', kind: 'subscription', envNames: [], setupUrl: 'https://platform.openai.com/docs/codex/auth', usedBy: '씬 1 리서치 · 사이드탭 미션', cost: 'account-plan', verification: 'elanous auth status', demoRequired: true },
16
+ { id: 'claude-code', label: 'Claude Code', kind: 'subscription', envNames: [], setupUrl: 'https://docs.anthropic.com/en/docs/claude-code/overview', usedBy: '씬 1 비교 · 사이드탭 미션', cost: 'account-plan', verification: 'claude auth status', demoRequired: true },
17
+ { id: 'exa', label: 'Exa', kind: 'api-key', envNames: ['EXA_API_KEY'], setupUrl: 'https://dashboard.exa.ai/api-keys', usedBy: '씬 1 리서치 · 씬 2 흡수', cost: 'usage-based', verification: 'POST /search · 상태 코드만', demoRequired: true },
18
+ { id: 'firecrawl', label: 'Firecrawl', kind: 'api-key', envNames: ['FIRECRAWL_API_KEY'], setupUrl: 'https://www.firecrawl.dev/app/api-keys', usedBy: '씬 2 흡수', cost: 'usage-based', verification: 'POST /v2/scrape · 상태 코드만', demoRequired: true },
19
+ { id: 'xai', label: 'xAI / Grok API', kind: 'api-key', envNames: ['XAI_API_KEY', 'GROK_API_KEY'], setupUrl: 'https://console.x.ai/', usedBy: '씬 2 흡수 · Grok API', cost: 'usage-based', verification: 'GET /v1/models · 상태 코드만', demoRequired: true },
20
+ { id: 'tavily', label: 'Tavily', kind: 'api-key', envNames: ['TAVILY_API_KEY', 'TAVILY_KEY'], setupUrl: 'https://app.tavily.com/home', usedBy: '웹 검색 대체 경로', cost: 'usage-based', verification: 'POST /search · 상태 코드만', demoRequired: false },
21
+ { id: 'openrouter', label: 'OpenRouter · GLM', kind: 'api-key', envNames: ['OPENROUTER_API_KEY'], setupUrl: 'https://openrouter.ai/keys', usedBy: 'GLM · OpenRouter 모델', cost: 'usage-based', verification: 'GET /api/v1/key · 상태 코드만', demoRequired: true },
22
+ { id: 'linear', label: 'Linear API', kind: 'api-key', envNames: ['LINEAR_API_KEY'], setupUrl: 'https://linear.app/settings/api', usedBy: '씬 2 능동 비서', cost: 'plan-dependent', verification: 'GraphQL viewer · 상태 코드만', demoRequired: true },
23
+ { id: 'telegram', label: 'Telegram bot', kind: 'api-key', envNames: ['ELANOUS_TELEGRAM_BOT_TOKEN'], setupUrl: 'https://t.me/BotFather', usedBy: '씬 2 · 씬 3 채널', cost: 'local', verification: 'getMe · 상태 코드만', demoRequired: true },
24
+ { id: 'telegram-chat', label: 'Telegram chat ID', kind: 'api-key', envNames: ['ELANOUS_TELEGRAM_CHAT_ID'], setupUrl: 'https://core.telegram.org/bots/features#botfather', usedBy: '데모 알림 대상', cost: 'local', verification: 'getChat · 상태 코드만 · 미발송', demoRequired: true },
25
+ { id: 'google-workspace', label: 'Google Workspace', kind: 'oauth', envNames: [], setupUrl: 'https://developers.google.com/workspace/guides/get-started', usedBy: 'Gmail · Drive 커넥터', cost: 'account-plan', verification: '로그인 상태 확인 · 토큰 미표시', demoRequired: false },
26
+ { id: 'aside', label: 'Aside browser', kind: 'cli', envNames: [], setupUrl: 'https://github.com/elanous-ai/aside', usedBy: '브라우저 자동화', cost: 'plan-dependent', verification: 'aside status', demoRequired: true },
27
+ { id: 'github', label: 'GitHub CLI', kind: 'cli', envNames: [], setupUrl: 'https://cli.github.com/', usedBy: '공개 저장소 · 개발 플러그인', cost: 'local', verification: 'gh auth status', demoRequired: true },
28
+ { id: 'video-render', label: 'Video render', kind: 'local', envNames: [], setupUrl: 'https://ffmpeg.org/download.html', usedBy: '데모 하이라이트 렌더', cost: 'local', verification: 'ffmpeg -version', demoRequired: false },
29
+ { id: 'openai-api', label: 'OpenAI API', kind: 'api-key', envNames: ['OPENAI_API_KEY'], setupUrl: 'https://platform.openai.com/api-keys', usedBy: 'OpenAI 모델 · Codex API-key 경로', cost: 'usage-based', verification: 'GET /v1/models · 상태 코드만', demoRequired: false },
30
+ { id: 'anthropic-api', label: 'Anthropic API', kind: 'api-key', envNames: ['ANTHROPIC_API_KEY'], setupUrl: 'https://console.anthropic.com/settings/keys', usedBy: 'Claude API', cost: 'usage-based', verification: 'GET /v1/models · 상태 코드만', demoRequired: false },
31
+ { id: 'gemini-api', label: 'Google Gemini API', kind: 'api-key', envNames: ['GEMINI_API_KEY', 'GOOGLE_API_KEY'], setupUrl: 'https://aistudio.google.com/app/apikey', usedBy: 'Gemini 모델', cost: 'usage-based', verification: '모델 목록 · 상태 코드만', demoRequired: false },
32
+ { id: 'opengateway', label: 'OpenGateway', kind: 'api-key', envNames: ['OPENGATEWAY_API_KEY'], setupUrl: 'https://apis.opengateway.ai/', usedBy: 'OpenAI 호환 모델 대체 경로', cost: 'usage-based', verification: 'GET /v1/models · 상태 코드만', demoRequired: false },
33
+ { id: 'supadata', label: 'Supadata', kind: 'api-key', envNames: ['SUPADATA_API_KEY'], setupUrl: 'https://supadata.ai/', usedBy: 'YouTube 자막', cost: 'usage-based', verification: '자막 API · 상태 코드만', demoRequired: false },
34
+ { id: 'elevenlabs', label: 'ElevenLabs', kind: 'api-key', envNames: ['ELEVENLABS_API_KEY'], setupUrl: 'https://elevenlabs.io/app/settings/api-keys', usedBy: '음성 합성', cost: 'usage-based', verification: 'GET /v1/user · 상태 코드만', demoRequired: false },
35
+ { id: 'brave-search', label: 'Brave Search', kind: 'api-key', envNames: ['BRAVE_API_KEY'], setupUrl: 'https://brave.com/search/api/', usedBy: '웹 검색 대체 경로', cost: 'usage-based', verification: '검색 API · 상태 코드만', demoRequired: false },
36
+ { id: 'youtube-data', label: 'YouTube Data API', kind: 'api-key', envNames: ['YOUTUBE_API_KEY'], setupUrl: 'https://console.cloud.google.com/apis/credentials', usedBy: 'YouTube 메타데이터', cost: 'usage-based', verification: 'videos.list · 상태 코드만', demoRequired: false },
37
+ { id: 'apify', label: 'Apify', kind: 'api-key', envNames: ['APIFY_TOKEN'], setupUrl: 'https://console.apify.com/account/integrations', usedBy: 'X 수집', cost: 'usage-based', verification: '사용자 API · 상태 코드만', demoRequired: false },
38
+ { id: 'eodhd', label: 'EODHD', kind: 'api-key', envNames: ['EODHD_API_KEY'], setupUrl: 'https://eodhd.com/financial-apis/', usedBy: '시장 시세', cost: 'usage-based', verification: '시장 API · 상태 코드만', demoRequired: false },
39
+ { id: 'fds', label: 'FDS market data', kind: 'api-key', envNames: ['FDS_API_KEY'], setupUrl: 'https://elanous.ai', usedBy: '시장 시세', cost: 'plan-dependent', verification: '연결 미니 호출 · 상태 코드만', demoRequired: false },
40
+ { id: 'upstage', label: 'Upstage', kind: 'api-key', envNames: ['UPSTAGE_API_KEY'], setupUrl: 'https://console.upstage.ai/api-keys', usedBy: '문서 파싱', cost: 'usage-based', verification: '문서 API · 상태 코드만', demoRequired: false },
41
+ ] as const;
42
+
43
+ export function renderServiceKeyCatalogMarkdown(): string {
44
+ const rows = SERVICE_KEY_CATALOG.map(item => `| ${item.id} | ${item.label} | ${item.kind} | ${item.envNames.join(', ') || '로그인/설치'} | ${item.setupUrl} | ${item.cost} | ${item.usedBy} | ${item.verification} | ${item.demoRequired ? '씬 사용' : '선택'} |`);
45
+ return ['| id | 서비스 | 인증 | 환경 이름 | 설정 위치 | 비용 유형 | 사용처 | 최소 확인 | 판정 |', '|---|---|---|---|---|---|---|---|---|', ...rows].join('\n');
46
+ }