elanous 0.2.0 → 0.2.4

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 (1174) hide show
  1. package/.env.example +6 -0
  2. package/README.md +16 -14
  3. package/apps/pwa/out/404/index.html +1 -1
  4. package/apps/pwa/out/404.html +1 -1
  5. package/apps/pwa/out/_next/static/chunks/1105-c473ed46272fba79.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1191-7b13a24117a689fa.js +1 -0
  7. package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +1 -0
  8. package/apps/pwa/out/_next/static/chunks/1377-1efeffbbac0963ff.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/1470.98a6ab61ccb4131c.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/216-5acd01cbde4acda7.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/2330-c2f07246c8788af1.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/2375-3fcae5186c64fe6b.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/2415.ed6428ff334c7ce2.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/2977-e38442e86289f1d3.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/2982-2a2df543be3d2e5a.js +25 -0
  17. package/apps/pwa/out/_next/static/chunks/{2a79f15a-2013e4d421d6df88.js → 2ea96958-e8c7e112de50b067.js} +1 -1
  18. package/apps/pwa/out/_next/static/chunks/319-d37df1b6e0cbeff4.js +1 -0
  19. package/apps/pwa/out/_next/static/chunks/3403.4bc97b4066945a94.js +5 -0
  20. package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/371-4ad6af55dad02ced.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/4114-3e63117452378807.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/{6804.8ed6ab492bc5fc0a.js → 4323.c5dfb6f503304775.js} +1 -1
  24. package/apps/pwa/out/_next/static/chunks/4836-3c93795ab834381e.js +1 -0
  25. package/apps/pwa/out/_next/static/chunks/{320-d7013ec072863e5e.js → 5080-1613752891fcadb4.js} +4 -4
  26. package/apps/pwa/out/_next/static/chunks/5609-012bb3557211f07e.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/5791-bb82743fa6299562.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/6062-73e68343a9814f6a.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/6090-1bd6077591603947.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/6320-baac91d68843a9a6.js +1 -0
  31. package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/6725-68ab7cc0b1faf00d.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/6998-a654fe5c58271600.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/7457-f5cb1cc8db9f7453.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/7647.2fcd30d894d5ee30.js +1 -0
  36. package/apps/pwa/out/_next/static/chunks/7673-2eda1507d38dadb8.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/7990-e12efba616f46e03.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/8046cadf-211ca3c0e00f2b72.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/8067-f74bf14d67ad98f1.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/8142-011e1f474efb8b33.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/8519-0059d82bdb4812bf.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/8619-4365e03a2862830f.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/920-f7dceb78f1c585ef.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/9651-3cd291a6fa1370d2.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/9740-52467f244755917f.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/9804-64c02c3c127d5014.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/ae787e4c-f2998de7f1ba72a4.js +1 -0
  48. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-859cea1570b6227a.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/app/approvals/page-21c3261af6ab377c.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-1991445b8ea86274.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/app/board/page-4ebfaee2369fe248.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/app/botlab/page-9fa879ebf5959096.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/app/bots/page-ca7c3cc305c3285a.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/app/chat/page-9951930add3d2051.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/app/control/page-4472ddf1e2458e69.js +1 -0
  56. package/apps/pwa/out/_next/static/chunks/app/design-check/page-4de08d4b766f134b.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/app/editor/page-7a975e2b9db1dfb7.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/app/healthz/route-859cea1570b6227a.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/app/intake/page-49270714ef35bb96.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/app/layout-33fbdf353e2a5982.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/app/live/page-259f122e2dd64317.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/app/market/page-65b82726753658e1.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-4b8df3748dc06285.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/app/morning/page-112f7e477bda77fd.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/app/not-found-542a5c0006da637c.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/app/observatory/page-63ffb347831262ea.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/app/page-98e4e359d97263b4.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/app/reflection/page-97e24ac675ce576e.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ac6391f26391d89d.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f45c9d45ffc43bd.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-36995b9cb5d98218.js +1 -0
  72. package/apps/pwa/out/_next/static/chunks/app/settings/page-0c795b577988d63f.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-b4311e2f71c6735a.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/app/setup/layout-859cea1570b6227a.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/app/setup/page-eb2381074df20dba.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/app/share/page-b01336e64eba01ae.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/app/showroom/page-7af7f21c1f2858ef.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/app/tasks/page-a98ecd364586c89b.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/app/term/page-57f0502dfbfa089b.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/app/trace/page-3467d2e1abd8a14a.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/app/vault/page-7842ca23d53ba682.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-ae9ac882912b0198.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/app/workflows/page-3a0d72e3f783bcef.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/app/workspace/page-f3b39fe8358c2a97.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-5a22af3181ac2afb.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/framework-ea806bb57f2b8923.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/main-8d2302399c2c8f87.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/main-app-1457627bb302a22c.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/pages/_app-b10928c60f0b8488.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/pages/_error-689039227d443fab.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/webpack-e5bea36f183b25e6.js +1 -0
  92. package/apps/pwa/out/_next/static/css/e66b7f5efc8df3f3.css +1 -0
  93. package/apps/pwa/out/_next/static/zoQX5iTvXOsIvCjxCe1Ji/_buildManifest.js +1 -0
  94. package/apps/pwa/out/approvals/index.html +1 -0
  95. package/apps/pwa/out/approvals/index.txt +30 -0
  96. package/apps/pwa/out/autopilot/index.html +1 -1
  97. package/apps/pwa/out/autopilot/index.txt +27 -26
  98. package/apps/pwa/out/board/index.html +1 -0
  99. package/apps/pwa/out/board/index.txt +30 -0
  100. package/apps/pwa/out/botlab/index.html +1 -1
  101. package/apps/pwa/out/botlab/index.txt +24 -23
  102. package/apps/pwa/out/bots/index.html +1 -1
  103. package/apps/pwa/out/bots/index.txt +24 -23
  104. package/apps/pwa/out/chat/index.html +1 -2
  105. package/apps/pwa/out/chat/index.txt +24 -23
  106. package/apps/pwa/out/control/index.html +1 -1
  107. package/apps/pwa/out/control/index.txt +27 -26
  108. package/apps/pwa/out/design-check/index.html +1 -1
  109. package/apps/pwa/out/design-check/index.txt +27 -26
  110. package/apps/pwa/out/editor/index.html +1 -0
  111. package/apps/pwa/out/editor/index.txt +31 -0
  112. package/apps/pwa/out/healthz +1 -1
  113. package/apps/pwa/out/index.html +1 -1
  114. package/apps/pwa/out/index.txt +24 -23
  115. package/apps/pwa/out/intake/index.html +1 -1
  116. package/apps/pwa/out/intake/index.txt +27 -26
  117. package/apps/pwa/out/live/index.html +1 -0
  118. package/apps/pwa/out/live/index.txt +30 -0
  119. package/apps/pwa/out/market/index.html +1 -0
  120. package/apps/pwa/out/market/index.txt +27 -0
  121. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  122. package/apps/pwa/out/missions/placeholder/index.txt +24 -23
  123. package/apps/pwa/out/morning/index.html +1 -1
  124. package/apps/pwa/out/morning/index.txt +27 -26
  125. package/apps/pwa/out/observatory/index.html +1 -1
  126. package/apps/pwa/out/observatory/index.txt +27 -26
  127. package/apps/pwa/out/reflection/index.html +1 -1
  128. package/apps/pwa/out/reflection/index.txt +25 -24
  129. package/apps/pwa/out/scheduler/index.html +1 -1
  130. package/apps/pwa/out/scheduler/index.txt +27 -26
  131. package/apps/pwa/out/sessions/index.html +1 -1
  132. package/apps/pwa/out/sessions/index.txt +24 -23
  133. package/apps/pwa/out/settings/devices/index.html +1 -1
  134. package/apps/pwa/out/settings/devices/index.txt +27 -26
  135. package/apps/pwa/out/settings/index.html +1 -1
  136. package/apps/pwa/out/settings/index.txt +27 -26
  137. package/apps/pwa/out/setup/done/index.html +1 -1
  138. package/apps/pwa/out/setup/done/index.txt +27 -26
  139. package/apps/pwa/out/setup/index.html +1 -1
  140. package/apps/pwa/out/setup/index.txt +27 -26
  141. package/apps/pwa/out/share/index.html +1 -1
  142. package/apps/pwa/out/share/index.txt +27 -26
  143. package/apps/pwa/out/showroom/index.html +1 -1
  144. package/apps/pwa/out/showroom/index.txt +24 -23
  145. package/apps/pwa/out/tasks/index.html +1 -1
  146. package/apps/pwa/out/tasks/index.txt +27 -26
  147. package/apps/pwa/out/term/index.html +1 -1
  148. package/apps/pwa/out/term/index.txt +27 -26
  149. package/apps/pwa/out/trace/index.html +1 -0
  150. package/apps/pwa/out/trace/index.txt +30 -0
  151. package/apps/pwa/out/vault/index.html +1 -1
  152. package/apps/pwa/out/vault/index.txt +27 -26
  153. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  154. package/apps/pwa/out/workflows/chat-ui/index.txt +27 -26
  155. package/apps/pwa/out/workflows/index.html +1 -1
  156. package/apps/pwa/out/workflows/index.txt +27 -27
  157. package/apps/pwa/out/workspace/index.html +1 -1
  158. package/apps/pwa/out/workspace/index.txt +27 -26
  159. package/apps/pwa/out/worktrees/index.html +1 -1
  160. package/apps/pwa/out/worktrees/index.txt +27 -26
  161. package/catalog/resources.yaml +8 -11
  162. package/docs/design/systems/LICENSE +201 -0
  163. package/docs/design/systems/NOTICE.md +29 -0
  164. package/docs/design/systems/SOURCE.json +291 -0
  165. package/docs/design/systems/application/DESIGN.md +71 -0
  166. package/docs/design/systems/application/manifest.json +54 -0
  167. package/docs/design/systems/application/tokens.css +63 -0
  168. package/docs/design/systems/artistic/DESIGN.md +71 -0
  169. package/docs/design/systems/artistic/manifest.json +54 -0
  170. package/docs/design/systems/artistic/tokens.css +63 -0
  171. package/docs/design/systems/bento/DESIGN.md +71 -0
  172. package/docs/design/systems/bento/manifest.json +54 -0
  173. package/docs/design/systems/bento/tokens.css +63 -0
  174. package/docs/design/systems/bold/DESIGN.md +71 -0
  175. package/docs/design/systems/bold/manifest.json +54 -0
  176. package/docs/design/systems/bold/tokens.css +63 -0
  177. package/docs/design/systems/brutalism/DESIGN.md +71 -0
  178. package/docs/design/systems/brutalism/manifest.json +54 -0
  179. package/docs/design/systems/brutalism/tokens.css +63 -0
  180. package/docs/design/systems/cafe/DESIGN.md +71 -0
  181. package/docs/design/systems/cafe/manifest.json +54 -0
  182. package/docs/design/systems/cafe/tokens.css +63 -0
  183. package/docs/design/systems/claymorphism/DESIGN.md +71 -0
  184. package/docs/design/systems/claymorphism/manifest.json +54 -0
  185. package/docs/design/systems/claymorphism/tokens.css +63 -0
  186. package/docs/design/systems/clean/DESIGN.md +71 -0
  187. package/docs/design/systems/clean/manifest.json +54 -0
  188. package/docs/design/systems/clean/tokens.css +63 -0
  189. package/docs/design/systems/colorful/DESIGN.md +71 -0
  190. package/docs/design/systems/colorful/manifest.json +54 -0
  191. package/docs/design/systems/colorful/tokens.css +63 -0
  192. package/docs/design/systems/contemporary/DESIGN.md +71 -0
  193. package/docs/design/systems/contemporary/manifest.json +54 -0
  194. package/docs/design/systems/contemporary/tokens.css +63 -0
  195. package/docs/design/systems/corporate/DESIGN.md +71 -0
  196. package/docs/design/systems/corporate/manifest.json +54 -0
  197. package/docs/design/systems/corporate/tokens.css +63 -0
  198. package/docs/design/systems/cosmic/DESIGN.md +71 -0
  199. package/docs/design/systems/cosmic/manifest.json +54 -0
  200. package/docs/design/systems/cosmic/tokens.css +63 -0
  201. package/docs/design/systems/creative/DESIGN.md +71 -0
  202. package/docs/design/systems/creative/manifest.json +54 -0
  203. package/docs/design/systems/creative/tokens.css +63 -0
  204. package/docs/design/systems/dashboard/DESIGN.md +71 -0
  205. package/docs/design/systems/dashboard/manifest.json +54 -0
  206. package/docs/design/systems/dashboard/tokens.css +63 -0
  207. package/docs/design/systems/default/DESIGN.md +62 -0
  208. package/docs/design/systems/default/manifest.json +69 -0
  209. package/docs/design/systems/default/tokens.css +200 -0
  210. package/docs/design/systems/dithered/DESIGN.md +71 -0
  211. package/docs/design/systems/dithered/manifest.json +54 -0
  212. package/docs/design/systems/dithered/tokens.css +63 -0
  213. package/docs/design/systems/doodle/DESIGN.md +71 -0
  214. package/docs/design/systems/doodle/manifest.json +54 -0
  215. package/docs/design/systems/doodle/tokens.css +63 -0
  216. package/docs/design/systems/dramatic/DESIGN.md +71 -0
  217. package/docs/design/systems/dramatic/manifest.json +54 -0
  218. package/docs/design/systems/dramatic/tokens.css +63 -0
  219. package/docs/design/systems/editorial/DESIGN.md +71 -0
  220. package/docs/design/systems/editorial/manifest.json +54 -0
  221. package/docs/design/systems/editorial/tokens.css +63 -0
  222. package/docs/design/systems/elegant/DESIGN.md +71 -0
  223. package/docs/design/systems/elegant/manifest.json +54 -0
  224. package/docs/design/systems/elegant/tokens.css +63 -0
  225. package/docs/design/systems/energetic/DESIGN.md +72 -0
  226. package/docs/design/systems/energetic/manifest.json +54 -0
  227. package/docs/design/systems/energetic/tokens.css +63 -0
  228. package/docs/design/systems/enterprise/DESIGN.md +71 -0
  229. package/docs/design/systems/enterprise/manifest.json +54 -0
  230. package/docs/design/systems/enterprise/tokens.css +63 -0
  231. package/docs/design/systems/expressive/DESIGN.md +71 -0
  232. package/docs/design/systems/expressive/manifest.json +54 -0
  233. package/docs/design/systems/expressive/tokens.css +63 -0
  234. package/docs/design/systems/fantasy/DESIGN.md +71 -0
  235. package/docs/design/systems/fantasy/manifest.json +54 -0
  236. package/docs/design/systems/fantasy/tokens.css +63 -0
  237. package/docs/design/systems/flat/DESIGN.md +71 -0
  238. package/docs/design/systems/flat/manifest.json +54 -0
  239. package/docs/design/systems/flat/tokens.css +63 -0
  240. package/docs/design/systems/friendly/DESIGN.md +71 -0
  241. package/docs/design/systems/friendly/manifest.json +54 -0
  242. package/docs/design/systems/friendly/tokens.css +63 -0
  243. package/docs/design/systems/glassmorphism/DESIGN.md +71 -0
  244. package/docs/design/systems/glassmorphism/manifest.json +54 -0
  245. package/docs/design/systems/glassmorphism/tokens.css +63 -0
  246. package/docs/design/systems/gradient/DESIGN.md +71 -0
  247. package/docs/design/systems/gradient/manifest.json +54 -0
  248. package/docs/design/systems/gradient/tokens.css +63 -0
  249. package/docs/design/systems/luxury/DESIGN.md +71 -0
  250. package/docs/design/systems/luxury/manifest.json +54 -0
  251. package/docs/design/systems/luxury/tokens.css +63 -0
  252. package/docs/design/systems/minimal/DESIGN.md +71 -0
  253. package/docs/design/systems/minimal/manifest.json +54 -0
  254. package/docs/design/systems/minimal/tokens.css +63 -0
  255. package/docs/design/systems/modern/DESIGN.md +71 -0
  256. package/docs/design/systems/modern/manifest.json +54 -0
  257. package/docs/design/systems/modern/tokens.css +63 -0
  258. package/docs/design/systems/mono/DESIGN.md +71 -0
  259. package/docs/design/systems/mono/manifest.json +54 -0
  260. package/docs/design/systems/mono/tokens.css +63 -0
  261. package/docs/design/systems/neobrutalism/DESIGN.md +71 -0
  262. package/docs/design/systems/neobrutalism/manifest.json +54 -0
  263. package/docs/design/systems/neobrutalism/tokens.css +63 -0
  264. package/docs/design/systems/neon/DESIGN.md +71 -0
  265. package/docs/design/systems/neon/manifest.json +54 -0
  266. package/docs/design/systems/neon/tokens.css +63 -0
  267. package/docs/design/systems/neumorphism/DESIGN.md +71 -0
  268. package/docs/design/systems/neumorphism/manifest.json +54 -0
  269. package/docs/design/systems/neumorphism/tokens.css +63 -0
  270. package/docs/design/systems/paper/DESIGN.md +71 -0
  271. package/docs/design/systems/paper/manifest.json +54 -0
  272. package/docs/design/systems/paper/tokens.css +63 -0
  273. package/docs/design/systems/perspective/DESIGN.md +71 -0
  274. package/docs/design/systems/perspective/manifest.json +54 -0
  275. package/docs/design/systems/perspective/tokens.css +63 -0
  276. package/docs/design/systems/premium/DESIGN.md +71 -0
  277. package/docs/design/systems/premium/manifest.json +54 -0
  278. package/docs/design/systems/premium/tokens.css +63 -0
  279. package/docs/design/systems/professional/DESIGN.md +71 -0
  280. package/docs/design/systems/professional/manifest.json +54 -0
  281. package/docs/design/systems/professional/tokens.css +63 -0
  282. package/docs/design/systems/publication/DESIGN.md +71 -0
  283. package/docs/design/systems/publication/manifest.json +54 -0
  284. package/docs/design/systems/publication/tokens.css +63 -0
  285. package/docs/design/systems/refined/DESIGN.md +71 -0
  286. package/docs/design/systems/refined/manifest.json +54 -0
  287. package/docs/design/systems/refined/tokens.css +63 -0
  288. package/docs/design/systems/retro/DESIGN.md +71 -0
  289. package/docs/design/systems/retro/manifest.json +54 -0
  290. package/docs/design/systems/retro/tokens.css +63 -0
  291. package/docs/design/systems/shadcn/DESIGN.md +71 -0
  292. package/docs/design/systems/shadcn/manifest.json +54 -0
  293. package/docs/design/systems/shadcn/tokens.css +255 -0
  294. package/docs/design/systems/simple/DESIGN.md +71 -0
  295. package/docs/design/systems/simple/manifest.json +54 -0
  296. package/docs/design/systems/simple/tokens.css +63 -0
  297. package/docs/design/systems/skeumorphism/DESIGN.md +71 -0
  298. package/docs/design/systems/skeumorphism/manifest.json +54 -0
  299. package/docs/design/systems/skeumorphism/tokens.css +63 -0
  300. package/docs/design/systems/sleek/DESIGN.md +71 -0
  301. package/docs/design/systems/sleek/manifest.json +54 -0
  302. package/docs/design/systems/sleek/tokens.css +63 -0
  303. package/docs/design/systems/spacious/DESIGN.md +71 -0
  304. package/docs/design/systems/spacious/manifest.json +54 -0
  305. package/docs/design/systems/spacious/tokens.css +63 -0
  306. package/docs/design/systems/storytelling/DESIGN.md +71 -0
  307. package/docs/design/systems/storytelling/manifest.json +54 -0
  308. package/docs/design/systems/storytelling/tokens.css +63 -0
  309. package/docs/design/systems/tom-modern/DESIGN.md +361 -0
  310. package/docs/design/systems/tom-modern/manifest.json +16 -0
  311. package/docs/design/systems/tom-modern/tokens.css +99 -0
  312. package/docs/design/systems/vibrant/DESIGN.md +71 -0
  313. package/docs/design/systems/vibrant/manifest.json +54 -0
  314. package/docs/design/systems/vibrant/tokens.css +63 -0
  315. package/docs/design/systems/vintage/DESIGN.md +71 -0
  316. package/docs/design/systems/vintage/manifest.json +54 -0
  317. package/docs/design/systems/vintage/tokens.css +63 -0
  318. package/docs/design/systems/warm-editorial/DESIGN.md +65 -0
  319. package/docs/design/systems/warm-editorial/manifest.json +54 -0
  320. package/docs/design/systems/warm-editorial/tokens.css +63 -0
  321. package/docs/goal-context/01-goal-authoring-checks.md +18 -0
  322. package/docs/goal-context/steward-directives-2026-09-28.md +44 -0
  323. package/graphs/catalog/catalog.yaml +615 -0
  324. package/graphs/default-loop.yaml +1 -1
  325. package/graphs/document-loop.yaml +1 -1
  326. package/graphs/examples/stale-draft-digest/digest.ts +26 -0
  327. package/graphs/examples/stale-draft-digest/recipes.yaml +8 -0
  328. package/graphs/examples/stale-draft-digest/stale-draft-digest.yaml +22 -0
  329. package/graphs/heal/heal-loop.yaml +155 -0
  330. package/graphs/heal/recipes.yaml +19 -0
  331. package/graphs/implement-loop.yaml +2 -2
  332. package/graphs/intake/intake-daily.yaml +55 -0
  333. package/graphs/intake/recipes.yaml +16 -0
  334. package/graphs/landing/landing-heal.yaml +22 -0
  335. package/graphs/landing/recipes.yaml +8 -0
  336. package/graphs/launch/launch-head.yaml +66 -0
  337. package/graphs/launch/recipes.yaml +8 -0
  338. package/graphs/operate-loop.yaml +1 -1
  339. package/graphs/ops/docs-publish.yaml +31 -0
  340. package/graphs/ops/recipes.yaml +8 -0
  341. package/graphs/release/recipes.yaml +38 -0
  342. package/graphs/release/release-loop.yaml +40 -0
  343. package/graphs/research-loop.yaml +1 -1
  344. package/graphs/steward/recipes.yaml +12 -0
  345. package/graphs/steward/steward.yaml +45 -0
  346. package/graphs/video/broll-line.yaml +54 -0
  347. package/package.json +7 -5
  348. package/plugins/job-coach/.agents/plugins/marketplace.json +12 -0
  349. package/plugins/job-coach/.codex-plugin/plugin.json +6 -0
  350. package/plugins/job-coach/.mcp.json +9 -0
  351. package/plugins/job-coach/README.md +20 -0
  352. package/plugins/job-coach/connectors/ncs/server.ts +89 -0
  353. package/plugins/job-coach/examples/interview-sample.md +11 -0
  354. package/plugins/job-coach/graphs/course-links.ts +46 -0
  355. package/plugins/job-coach/graphs/recipes.yaml +18 -0
  356. package/plugins/job-coach/graphs/report.yaml +20 -0
  357. package/plugins/job-coach/graphs/run-step.ts +108 -0
  358. package/plugins/job-coach/plugin.json +13 -0
  359. package/plugins/job-coach/plugin.ts +6 -0
  360. package/plugins/job-coach/skills/career-report/SKILL.md +6 -0
  361. package/plugins/job-coach/skills/interview-to-profile/SKILL.md +6 -0
  362. package/plugins/job-coach/skills/run-report/SKILL.md +15 -0
  363. package/scripts/backup/elanous-backup.sh +139 -13
  364. package/scripts/backup/elanous-restore.sh +122 -0
  365. package/scripts/ci-daemon-port-gate.ts +164 -0
  366. package/scripts/ci-typecheck-changed.ts +15 -1
  367. package/scripts/cli-json-exit-scan.ts +126 -0
  368. package/scripts/codex-quota-alert-format.ts +52 -0
  369. package/scripts/codex-quota-alert.ts +63 -13
  370. package/scripts/continuation-dogfood.ts +2 -1
  371. package/scripts/coord-channel-watch.sh +5 -5
  372. package/scripts/coord-tracks.json +5 -4
  373. package/scripts/cron-run.ts +37 -16
  374. package/scripts/daemon-port-baseline.txt +9 -0
  375. package/scripts/design/extract-corpus-bench.ts +469 -0
  376. package/scripts/design/extract-corpus-score.ts +510 -0
  377. package/scripts/design/vendor-open-design-systems.ts +100 -0
  378. package/scripts/docs-lint.ts +1 -1
  379. package/scripts/fleet/node-setup.sh +38 -4
  380. package/scripts/heal/run-role.ts +328 -0
  381. package/scripts/install-role-watch.sh +95 -0
  382. package/scripts/install.ps1 +11 -1
  383. package/scripts/install.sh +81 -9
  384. package/scripts/isolation-hardcode-baseline.txt +1 -1
  385. package/scripts/landing-heal/must-fix-match.ts +37 -0
  386. package/scripts/landing-heal/run-mission.ts +101 -0
  387. package/scripts/lib/pwa-scenarios/acp-replay.ts +79 -0
  388. package/scripts/lib/pwa-scenarios/cdp-driver.ts +67 -0
  389. package/scripts/lib/pwa-scenarios/runner.ts +200 -0
  390. package/scripts/lib/pwa-scenarios/scenarios.ts +202 -0
  391. package/scripts/market/db-check.ts +212 -0
  392. package/scripts/market-posture-cycle.ts +63 -4
  393. package/scripts/nightly-docops.ts +1 -1
  394. package/scripts/ops/channel-bot-token-migrate.ts +146 -0
  395. package/scripts/ops-health-check.ts +15 -3
  396. package/scripts/pty-scenarios/run.ts +272 -0
  397. package/scripts/public-leak-baseline.txt +0 -7
  398. package/scripts/publish-internal-dist.ts +119 -0
  399. package/scripts/pwa-scenarios.ts +106 -0
  400. package/scripts/rebrand-elanous.ts +1 -1
  401. package/scripts/release-loop/cutoff.ts +139 -0
  402. package/scripts/release-loop/docs-land-node.ts +65 -0
  403. package/scripts/release-loop/docs-node.ts +172 -0
  404. package/scripts/release-loop/gate-diff.ts +29 -0
  405. package/scripts/release-loop/gate-node.ts +353 -0
  406. package/scripts/release-loop/node-verdict.ts +85 -0
  407. package/scripts/release-loop/prepare-node.ts +31 -0
  408. package/scripts/release-loop/publish-node.ts +57 -0
  409. package/scripts/release-loop/pwa-node-verdict.ts +45 -0
  410. package/scripts/release-loop/pwa-scenarios-node.ts +140 -0
  411. package/scripts/release-loop/release-docs.ts +102 -0
  412. package/scripts/release-loop/tui-node-checks.ts +29 -0
  413. package/scripts/release-loop/tui-sim-node.ts +113 -0
  414. package/scripts/release-loop/upgrade-node.ts +25 -0
  415. package/scripts/release-loop/verify-node.ts +21 -0
  416. package/scripts/release-loop/version-node.ts +147 -0
  417. package/scripts/release-upgrade-check.sh +53 -0
  418. package/scripts/se-mission-prepare.ts +9 -15
  419. package/scripts/test-deterministic.ts +2 -1
  420. package/scripts/uninstall.sh +10 -3
  421. package/scripts/video-broll-line.ts +89 -0
  422. package/scripts/waitlist-daily-digest.ts +108 -0
  423. package/scripts/window-landings.sh +1 -1
  424. package/skills/motion-broll/LICENSE +25 -0
  425. package/skills/motion-broll/SKILL.md +150 -0
  426. package/skills/motion-broll/SOURCE.md +6 -0
  427. package/skills/motion-broll/engine/base.css +19 -0
  428. package/skills/motion-broll/engine/beats.js +11 -0
  429. package/skills/motion-broll/engine/build.py +21 -0
  430. package/skills/motion-broll/engine/fonts/Geist-Variable.woff2 +0 -0
  431. package/skills/motion-broll/engine/fonts/GeistMono-Medium.woff2 +0 -0
  432. package/skills/motion-broll/engine/fonts/OFL-Geist.txt +92 -0
  433. package/skills/motion-broll/engine/motion.js +146 -0
  434. package/skills/motion-broll/engine/render.js +22 -0
  435. package/skills/motion-broll/examples/opus-aoe2/01-opus-drop.html +41 -0
  436. package/skills/motion-broll/examples/opus-aoe2/02-pip-builds.html +110 -0
  437. package/skills/motion-broll/examples/opus-aoe2/03-effort-slider.html +38 -0
  438. package/skills/motion-broll/examples/opus-aoe2/04-master-prompt.html +56 -0
  439. package/skills/motion-broll/examples/opus-aoe2/05-low-vs-max.html +49 -0
  440. package/skills/motion-broll/examples/opus-aoe2/06-chapter.html +18 -0
  441. package/skills/motion-broll/examples/opus-aoe2/plan.json +14 -0
  442. package/skills/motion-broll/reference/engine-api.md +106 -0
  443. package/skills/motion-broll/scripts/composite.py +14 -0
  444. package/skills/motion-broll/scripts/inspect_video.py +34 -0
  445. package/skills/motion-broll/scripts/make_pages.py +34 -0
  446. package/skills/motion-broll/scripts/setup.sh +16 -0
  447. package/skills/motion-broll/scripts/words.py +13 -0
  448. package/skills/motion-broll/templates/compare.html +135 -0
  449. package/skills/motion-broll/templates/viewer.html +97 -0
  450. package/skills/omni-digest/SKILL.md +260 -0
  451. package/skills/omni-digest/digest.md +197 -0
  452. package/skills/omni-digest/docs/diagrams/noncode-terminal-promotion-path-2026-08-13.mmd +32 -0
  453. package/skills/omni-digest/package-lock.json +558 -0
  454. package/skills/omni-digest/package.json +13 -0
  455. package/skills/omni-digest/scripts/main.ts +404 -0
  456. package/skills/omni-digest/src/delegate.ts +34 -0
  457. package/skills/omni-digest/src/detect.ts +46 -0
  458. package/skills/omni-digest/src/diagram.ts +72 -0
  459. package/skills/omni-digest/src/domain-staging.ts +50 -0
  460. package/skills/omni-digest/src/env.ts +38 -0
  461. package/skills/omni-digest/src/fetch.ts +237 -0
  462. package/skills/omni-digest/src/media.ts +180 -0
  463. package/skills/omni-digest/src/obsidian.ts +69 -0
  464. package/skills/omni-digest/src/ocr.ts +149 -0
  465. package/skills/omni-digest/src/router.ts +60 -0
  466. package/skills/omni-digest/src/summarize.ts +87 -0
  467. package/skills/omni-digest/src/types.ts +124 -0
  468. package/skills/omni-digest/src/util.ts +34 -0
  469. package/skills/omni-digest/src/visual.ts +129 -0
  470. package/skills/omni-digest/src/x-api.ts +151 -0
  471. package/skills/omni-digest/tsconfig.json +13 -0
  472. package/src/a2a/agent-card.ts +29 -0
  473. package/src/a2a/server.ts +173 -0
  474. package/src/acp/auto-persist.ts +3 -6
  475. package/src/acp/backend-registry.ts +6 -10
  476. package/src/acp/channel-browser-shell.ts +1 -535
  477. package/src/acp/client.ts +106 -36
  478. package/src/acp/fs-roots.ts +20 -4
  479. package/src/acp/obsidian-tags.ts +6 -3
  480. package/src/acp/server.ts +189 -32
  481. package/src/agent/pty-binding.ts +1 -1
  482. package/src/agent/spawn-embodied-agent-in-vw.ts +5 -336
  483. package/src/agent/subagent-callable.ts +39 -1
  484. package/src/agent-mission/browser-login.ts +241 -0
  485. package/src/agent-mission/capabilities-cli.ts +33 -0
  486. package/src/agent-mission/capability-matrix.ts +31 -0
  487. package/src/agent-mission/capability-readers.ts +79 -0
  488. package/src/agent-mission/capability-types.ts +15 -0
  489. package/src/agent-mission/claude-headless.ts +131 -0
  490. package/src/agent-mission/claude-subscription.ts +57 -0
  491. package/src/agent-mission/doc-guided-install.ts +185 -0
  492. package/src/agent-mission/driver.ts +821 -69
  493. package/src/agent-mission/env-profile.ts +68 -0
  494. package/src/agent-mission/handoff.ts +128 -0
  495. package/src/agent-mission/in-agent-plugin.ts +311 -0
  496. package/src/agent-mission/mission-cli.ts +19 -1
  497. package/src/agent-mission/parse.ts +9 -4
  498. package/src/agent-mission/pr-review-watch.ts +62 -13
  499. package/src/agent-mission/resource-ladder.ts +187 -0
  500. package/src/agent-mission/tool-install.ts +249 -0
  501. package/src/agent-mission/tool-ladder.ts +37 -0
  502. package/src/agent-room/room-builder.ts +6 -600
  503. package/src/agent-substrate/review-intent.ts +43 -1
  504. package/src/auth/scope.ts +8 -4
  505. package/src/auth/temp-tokens.ts +131 -0
  506. package/src/auto-research/obsidian-bridge.ts +2 -0
  507. package/src/autopilot/build/integrity-gate.ts +27 -4
  508. package/src/autopilot/build/isolated-instance.ts +2 -1
  509. package/src/autopilot/build/llm-conflict-merge.ts +27 -0
  510. package/src/autopilot/llm-control-brain.ts +54 -12
  511. package/src/autopilot/mission-engine.ts +15 -1
  512. package/src/autopilot/mission-notify.ts +4 -2
  513. package/src/autopilot/mission-origin.ts +5 -5
  514. package/src/autopilot/mission-phase-track.ts +52 -0
  515. package/src/autopilot/mission-tool.ts +1 -1
  516. package/src/autopilot/pty-control-loop.ts +94 -2
  517. package/src/autopilot/track-agent.ts +138 -0
  518. package/src/autopilot/track-courier.ts +153 -0
  519. package/src/boot/acp-server.ts +16 -2
  520. package/src/boot/check-same-origin.ts +19 -5
  521. package/src/boot/daemon-multi-llm-runtime.ts +14 -8
  522. package/src/boot/daemon-prompt-turn.ts +2 -0
  523. package/src/boot/daemon-runtime.ts +36 -14
  524. package/src/boot/daemon-tools/index.ts +16 -0
  525. package/src/boot/daemon-tools/self-implement.ts +4 -0
  526. package/src/boot/daemon-tools/types.ts +3 -0
  527. package/src/browser-cdp/chrome-flags.ts +7 -0
  528. package/src/browser-cdp/client.ts +2 -0
  529. package/src/browser-pane/mount.ts +1 -246
  530. package/src/budget/codex-reset-credit-state.ts +15 -0
  531. package/src/budget/fetchers/codex.ts +2 -1
  532. package/src/budget/run-usage-rollup.ts +11 -4
  533. package/src/budget/unified-usage.ts +2 -1
  534. package/src/capture/tui-self-report.ts +10 -0
  535. package/src/channel-bot-token.ts +126 -0
  536. package/src/chat/index.ts +21 -45
  537. package/src/chat/input-text-key.ts +2 -2
  538. package/src/chat/mode/manual.ts +2 -4
  539. package/src/chat/pickers/state.ts +10 -27
  540. package/src/chat/search/modal.ts +14 -2
  541. package/src/chat/tool-render/types.ts +1 -1
  542. package/src/chat/turn-typeahead.ts +2 -1
  543. package/src/chat/wrap.ts +6 -8
  544. package/src/cli/__fixtures__/agent-help-before/agent.txt +18 -0
  545. package/src/cli/__fixtures__/agent-help-before/registry.txt +13 -0
  546. package/src/cli/__fixtures__/agent-help-before/root.txt +100 -0
  547. package/src/cli/__fixtures__/agent-help-before/tier.txt +15 -0
  548. package/src/cli/a2a-cli.ts +52 -0
  549. package/src/cli/agent-cli.ts +721 -0
  550. package/src/cli/autopilot-cli.ts +739 -0
  551. package/src/cli/bg-launch.ts +20 -4
  552. package/src/cli/claude-plugin-setup.ts +199 -0
  553. package/src/cli/config-test-sync.ts +94 -10
  554. package/src/cli/connector-cli.ts +204 -0
  555. package/src/cli/control-cli.ts +220 -0
  556. package/src/cli/control-join-cli.ts +142 -0
  557. package/src/cli/docs-cli.ts +38 -0
  558. package/src/cli/doctor-cli.ts +225 -26
  559. package/src/cli/doctor-distro.ts +17 -1
  560. package/src/cli/doctor-fix.ts +145 -17
  561. package/src/cli/doctor-llm-assist.ts +71 -0
  562. package/src/cli/doctor-private-files.ts +66 -0
  563. package/src/cli/doctor-readiness.ts +8 -5
  564. package/src/cli/fleet-cli.ts +63 -0
  565. package/src/cli/g6a-registration-probe.ts +16 -0
  566. package/src/cli/git-install-plan.ts +51 -0
  567. package/src/cli/hooks-cli.ts +44 -0
  568. package/src/cli/ingest-token-cli.ts +21 -0
  569. package/src/cli/intake-cli.ts +416 -0
  570. package/src/cli/labels-cli.ts +74 -0
  571. package/src/cli/leader-cli.ts +10 -159
  572. package/src/cli/live-cli.ts +48 -0
  573. package/src/cli/llm-detect-cli.ts +130 -0
  574. package/src/cli/logs-cli.ts +231 -7
  575. package/src/cli/machine-cli.ts +38 -0
  576. package/src/cli/mcp-call.ts +43 -13
  577. package/src/cli/mcp-gateway-cli.ts +90 -0
  578. package/src/cli/mcp-login.ts +116 -8
  579. package/src/cli/mcp-reload.ts +20 -3
  580. package/src/cli/nexus-dist.ts +18 -13
  581. package/src/cli/nexus-ios-bind.ts +20 -7
  582. package/src/cli/ops-cli.ts +225 -0
  583. package/src/cli/plugin-cli.ts +103 -0
  584. package/src/cli/pod-cli.ts +83 -0
  585. package/src/cli/port-lease-local.ts +124 -0
  586. package/src/cli/pr-cli.ts +12 -1
  587. package/src/cli/provider-cli.ts +720 -0
  588. package/src/cli/pty-record-cli.ts +63 -0
  589. package/src/cli/pty-takeover-cli.ts +57 -40
  590. package/src/cli/pty-web-address.ts +52 -0
  591. package/src/cli/publish-cli.ts +44 -0
  592. package/src/cli/pwa-build.ts +18 -12
  593. package/src/cli/pwa-dev.ts +13 -8
  594. package/src/cli/pwa-registry.ts +6 -0
  595. package/src/cli/pwa-share.ts +65 -22
  596. package/src/cli/pwa-show.ts +20 -4
  597. package/src/cli/pwa-start.ts +99 -27
  598. package/src/cli/pwa-test.ts +201 -96
  599. package/src/cli/release-cli.ts +90 -7
  600. package/src/cli/remotes-cli.ts +20 -1
  601. package/src/cli/remotes.ts +2 -1
  602. package/src/cli/repo-cli.ts +315 -36
  603. package/src/cli/research-cli.ts +66 -0
  604. package/src/cli/role-cli.ts +320 -0
  605. package/src/cli/schedule-cli.ts +246 -0
  606. package/src/cli/self-update.ts +98 -10
  607. package/src/cli/setup-cli.ts +64 -2
  608. package/src/cli/shadow-cli.ts +188 -0
  609. package/src/cli/share-auto-mount.ts +12 -8
  610. package/src/cli/start-cli.ts +221 -0
  611. package/src/cli/stdout-flush.ts +8 -0
  612. package/src/cli/storage-cli.ts +334 -0
  613. package/src/cli/tailscale-serve.ts +34 -19
  614. package/src/cli/tasks-cli.ts +176 -0
  615. package/src/cli/test-state-dir-flag.ts +1 -1
  616. package/src/cli/usage-cli.ts +15 -4
  617. package/src/cli/where-cli.ts +22 -55
  618. package/src/code-edit/diff-render.ts +6 -32
  619. package/src/code-edit/source-delta-browser.ts +0 -1
  620. package/src/codex/models.ts +1 -1
  621. package/src/config.ts +8 -13
  622. package/src/connectors/event-ledger.ts +41 -0
  623. package/src/connectors/linear-projector.ts +88 -0
  624. package/src/connectors/linear.ts +143 -0
  625. package/src/connectors/types.ts +19 -0
  626. package/src/control-plane/lease-holder.ts +41 -0
  627. package/src/control-plane/ledger.ts +146 -0
  628. package/src/control-plane/light-member.ts +164 -0
  629. package/src/control-plane/member-tokens.ts +88 -0
  630. package/src/control-plane/member.ts +159 -0
  631. package/src/control-plane/port-lease-heartbeat.ts +101 -0
  632. package/src/control-plane/ports.ts +40 -0
  633. package/src/control-plane/primary.ts +169 -0
  634. package/src/control-plane/server.ts +216 -0
  635. package/src/dashboard/acp-boot.ts +11 -38
  636. package/src/dashboard/assistant-render-state-runtime.ts +2 -2
  637. package/src/dashboard/assistant-sample-runtime.ts +2 -2
  638. package/src/dashboard/auto-compact-runtime.ts +11 -16
  639. package/src/dashboard/browser-help-runtime.ts +2 -3
  640. package/src/dashboard/chat/acp-chat.ts +2 -5
  641. package/src/dashboard/code-edit-post-turn-runtime.ts +1 -2
  642. package/src/dashboard/compact-surface-assembly.ts +0 -14
  643. package/src/dashboard/compact-surface-dispatch.ts +1 -38
  644. package/src/dashboard/compact-surface-inventory.ts +0 -8
  645. package/src/dashboard/compact-surface-runtime.ts +0 -14
  646. package/src/dashboard/context-menu-provider-boot.ts +0 -9
  647. package/src/dashboard/context-window-runtime-boot.ts +0 -37
  648. package/src/dashboard/index.ts +278 -2558
  649. package/src/dashboard/input/chat-main-plain-turn-runtime.ts +0 -6
  650. package/src/dashboard/input/chat-main-slash-command.ts +2 -2
  651. package/src/dashboard/input/dashboard-priority-key-route.ts +1 -43
  652. package/src/dashboard/input/mouse-modal-surface-runtime.ts +1 -5
  653. package/src/dashboard/input/mouse-wiring.ts +2 -3
  654. package/src/dashboard/layout-display-runtime-registration.ts +0 -10
  655. package/src/dashboard/modals/pane-multi.ts +1 -1
  656. package/src/dashboard/replay-preview.ts +1 -1
  657. package/src/dashboard/runtime/approvers.ts +0 -1
  658. package/src/dashboard/runtime/state-snapshot.ts +0 -90
  659. package/src/dashboard/scenario-runtime-boot.ts +16 -16
  660. package/src/dashboard/slash-runtime/dashboard-handlers.ts +134 -1456
  661. package/src/dashboard/slash-runtime/design-pick.ts +96 -0
  662. package/src/dashboard/slash-runtime/help-from-registry.ts +77 -0
  663. package/src/dashboard/surface-registry-wiring.ts +2 -15
  664. package/src/dashboard/turn-message-runtime.ts +0 -4
  665. package/src/dashboard/turn-preamble.ts +1 -1
  666. package/src/dashboard/turn-stream-formatter.ts +2 -2
  667. package/src/dashboard/turn-stream-runtime.ts +2 -2
  668. package/src/dashboard-pane-context-menu.ts +0 -14
  669. package/src/debug/log.ts +7 -0
  670. package/src/decide/boundary-shadow.ts +131 -0
  671. package/src/design/apply-direction.ts +209 -0
  672. package/src/design/css-root-tokens.ts +89 -0
  673. package/src/design/custom-system-create.ts +230 -0
  674. package/src/design/design-directions.ts +61 -41
  675. package/src/design/design-gate.ts +241 -0
  676. package/src/design/design-library.ts +57 -0
  677. package/src/design/design-previews.ts +138 -0
  678. package/src/design/design-systems.ts +61 -0
  679. package/src/design/lint-artifact-run.ts +46 -6
  680. package/src/design/lint-artifact.ts +5 -1
  681. package/src/design/open-design-client.ts +247 -0
  682. package/src/design/system-from-extract.ts +767 -0
  683. package/src/design/system-schema.ts +123 -0
  684. package/src/discord-slash-wire.ts +2 -1
  685. package/src/discord-test-runner.ts +2 -1
  686. package/src/discord-voice-wire.ts +2 -1
  687. package/src/discord.ts +1 -1
  688. package/src/dispatch/opportunistic-launcher.ts +24 -1
  689. package/src/domains/ops-status.ts +35 -2
  690. package/src/domains/outbound-alert.ts +16 -4
  691. package/src/domains/repeated-failure.ts +89 -0
  692. package/src/domains/schedule-manage-tool.ts +28 -8
  693. package/src/domains/schedule-migrate.ts +22 -4
  694. package/src/domains/schedule-registry.ts +88 -33
  695. package/src/domains/schedule-runs.ts +132 -0
  696. package/src/domains/schedule-state.ts +152 -0
  697. package/src/element-registry/address.ts +1 -3
  698. package/src/git-fs/gh-cli.ts +47 -17
  699. package/src/git-fs/retry.ts +1 -0
  700. package/src/git-fs/runner.ts +1 -0
  701. package/src/git-fs/worktree.ts +6 -5
  702. package/src/github/pr-labels.ts +68 -0
  703. package/src/graph-kinds/plugin-nodes.ts +60 -0
  704. package/src/graph-kinds/registry.ts +118 -0
  705. package/src/graph-runner/graph-cli.ts +103 -0
  706. package/src/graph-runner/graph-notify.ts +220 -0
  707. package/src/graph-runner/graph-tick.ts +119 -0
  708. package/src/graph-runner/release-manifest.ts +93 -0
  709. package/src/graph-runner/runner.ts +457 -0
  710. package/src/grok/credential.ts +158 -5
  711. package/src/grounding/ensure-grounding.ts +131 -0
  712. package/src/grounding/mirror-export.ts +89 -0
  713. package/src/grounding/mirror-manifest.ts +252 -0
  714. package/src/grounding/sources-cli.ts +209 -0
  715. package/src/grounding/sources.ts +333 -0
  716. package/src/grounding/token.ts +115 -0
  717. package/src/harness/harness-cli-command.ts +352 -19
  718. package/src/harness/harness-pod-dispatch.ts +110 -0
  719. package/src/harness/harness-stop.ts +131 -0
  720. package/src/harness/harness-substrate-default.ts +40 -0
  721. package/src/harness/harness-worktrees.ts +1 -1
  722. package/src/harness/harness-write-boundary.ts +2 -0
  723. package/src/harness/llm-decompose.ts +2 -1
  724. package/src/harness/self-send-decide.ts +224 -0
  725. package/src/harness/shell-relay.ts +5 -0
  726. package/src/hooks/providers.ts +77 -0
  727. package/src/hooks/queue.ts +73 -0
  728. package/src/hooks/receiver.ts +133 -0
  729. package/src/index.ts +666 -3406
  730. package/src/input-core/dispatcher.ts +1 -1
  731. package/src/input-core/drag-esc-interceptor.ts +1 -1
  732. package/src/instance/current.ts +5 -5
  733. package/src/instance/leader.ts +10 -326
  734. package/src/instance/nexus-run-refusal.ts +27 -92
  735. package/src/instance/project-local-exclude.ts +27 -0
  736. package/src/instance/resolve.ts +40 -175
  737. package/src/intake-plane/capture.ts +14 -1
  738. package/src/intake-plane/check.ts +34 -14
  739. package/src/intake-plane/collect-github.ts +258 -0
  740. package/src/intake-plane/collect-pod.ts +100 -0
  741. package/src/intake-plane/collect-telegram-saved.ts +86 -0
  742. package/src/intake-plane/digest.ts +102 -0
  743. package/src/intake-plane/enrich-plugins.ts +1 -1
  744. package/src/intake-plane/front-classifier.ts +56 -0
  745. package/src/intake-plane/front-route-classifier.ts +80 -0
  746. package/src/intake-plane/front-route-rules.ts +152 -0
  747. package/src/intake-plane/grounding-docs.ts +185 -0
  748. package/src/intake-plane/harness-target.ts +20 -0
  749. package/src/intake-plane/intake-to-tasks.ts +303 -0
  750. package/src/intake-plane/items.ts +247 -0
  751. package/src/intake-plane/link-ledger.ts +27 -0
  752. package/src/intake-plane/route.ts +104 -0
  753. package/src/intake-plane/runtime-callables.ts +3 -1
  754. package/src/intake-plane/sketch-ledger.ts +34 -0
  755. package/src/intake-plane/slash.ts +30 -2
  756. package/src/intake-plane/submit-intake-work.ts +160 -0
  757. package/src/intake-plane/telegram-work.ts +56 -0
  758. package/src/iul/sidebar-shell.ts +0 -165
  759. package/src/launch-head/capability-check.ts +162 -0
  760. package/src/launch-head/launch-head-cli.ts +242 -0
  761. package/src/launch-head/load-balance.ts +81 -0
  762. package/src/live/detail-switch.ts +175 -0
  763. package/src/llm/provider-detect.ts +247 -0
  764. package/src/llm/provider-probe.ts +57 -0
  765. package/src/llm.ts +55 -23
  766. package/src/log-entry.ts +1 -1
  767. package/src/log-pane/attachment-popup.ts +1 -2
  768. package/src/loops/loop-cli.ts +37 -0
  769. package/src/loops/registry.ts +174 -0
  770. package/src/market/official-keys.ts +5 -0
  771. package/src/market/publish.ts +273 -0
  772. package/src/market/signed-index.ts +156 -0
  773. package/src/market/tgz.ts +121 -0
  774. package/src/mcp/client.ts +1 -1
  775. package/src/mcp/mcp-oauth.ts +40 -5
  776. package/src/mcp/server.ts +75 -7
  777. package/src/mcp-gateway/gateway.ts +128 -0
  778. package/src/mcp-gateway/pat-store.ts +124 -0
  779. package/src/mss/logging/log-store.ts +91 -2
  780. package/src/mss/logging/scoped-level.ts +5 -9
  781. package/src/native-tool-catalog.ts +64 -343
  782. package/src/nexus/api/connect-info.ts +23 -25
  783. package/src/nexus/api/context-url.ts +1 -1
  784. package/src/nexus/api/design-check.ts +90 -59
  785. package/src/nexus/api/design-previews-route.ts +182 -0
  786. package/src/nexus/api/design-system-create-route.ts +123 -0
  787. package/src/nexus/api/graph-kinds.ts +69 -0
  788. package/src/nexus/api/graphs-api.ts +221 -0
  789. package/src/nexus/api/harness-api.ts +31 -2
  790. package/src/nexus/api/health.ts +15 -0
  791. package/src/nexus/api/http-server.ts +274 -43
  792. package/src/nexus/api/image-generate.ts +3 -0
  793. package/src/nexus/api/ingest-token.ts +175 -0
  794. package/src/nexus/api/intake-ledger-api.ts +54 -0
  795. package/src/nexus/api/intake-route.ts +111 -0
  796. package/src/nexus/api/json-response.ts +33 -0
  797. package/src/nexus/api/live-detail.ts +47 -0
  798. package/src/nexus/api/live-shipped.ts +78 -0
  799. package/src/nexus/api/log-fabric.ts +33 -2
  800. package/src/nexus/api/markdown-publish.ts +3 -2
  801. package/src/nexus/api/mcp-http.ts +14 -9
  802. package/src/nexus/api/mcp-oauth-hint.ts +30 -0
  803. package/src/nexus/api/mcp-public-allowlist.ts +33 -0
  804. package/src/nexus/api/merge-approvals-gate.ts +79 -0
  805. package/src/nexus/api/merge-approvals.ts +306 -0
  806. package/src/nexus/api/meta-api.ts +4 -0
  807. package/src/nexus/api/next-fluent-wiring.ts +7 -9
  808. package/src/nexus/api/plugins-market.ts +125 -0
  809. package/src/nexus/api/pod-credential-api.ts +133 -0
  810. package/src/nexus/api/public-routes.ts +80 -0
  811. package/src/nexus/api/rest-route-paths.ts +15 -0
  812. package/src/nexus/api/schedules-action.ts +12 -3
  813. package/src/nexus/api/schedules-read.ts +228 -0
  814. package/src/nexus/api/sessions-store.ts +8 -2
  815. package/src/nexus/api/setup-answer-priority.ts +130 -0
  816. package/src/nexus/api/setup-channel-bot.ts +56 -0
  817. package/src/nexus/api/setup-child-llm.ts +228 -0
  818. package/src/nexus/api/setup-obsidian-skills.ts +93 -0
  819. package/src/nexus/api/task-cards-api.ts +34 -0
  820. package/src/nexus/api/tasks-create.ts +136 -0
  821. package/src/nexus/api/telegram-trigger-bot.ts +3 -3
  822. package/src/nexus/api/terminals.ts +204 -18
  823. package/src/nexus/api/trace.ts +354 -0
  824. package/src/nexus/api/vault-api.ts +140 -7
  825. package/src/nexus/api/worktrees.ts +18 -2
  826. package/src/nexus/boot/register-mcp-clients.ts +38 -4
  827. package/src/nexus/daemon-endpoint.ts +85 -0
  828. package/src/nexus/default-port.ts +1 -0
  829. package/src/nexus/index.ts +329 -111
  830. package/src/nexus/onboarding/pwa-share-prompt.ts +31 -8
  831. package/src/nexus/onboarding/tailscale-probe.ts +9 -1
  832. package/src/nexus/setup-status.ts +58 -0
  833. package/src/nexus/supervisor/lock.ts +8 -0
  834. package/src/nexus/webterm/pty.ts +15 -0
  835. package/src/oauth/codex-account-rotation.ts +122 -16
  836. package/src/oauth/codex-account-store.ts +88 -19
  837. package/src/oauth/codex-quota-policy.ts +55 -0
  838. package/src/oauth/store.ts +28 -25
  839. package/src/obsidian/default-vault.ts +17 -0
  840. package/src/obsidian/vault-write-guard.ts +46 -0
  841. package/src/onboarding/help/llm.md +2 -2
  842. package/src/onboarding.ts +2 -2
  843. package/src/panes/alt-skip-predicate.ts +4 -3
  844. package/src/panes/external-terminal-pane.ts +3 -4
  845. package/src/panes/factory.ts +1 -18
  846. package/src/panes/index.ts +1 -5
  847. package/src/panes/pane-cycle.ts +1 -1
  848. package/src/panes/types.ts +1 -1
  849. package/src/platform/env-literal.ts +4 -0
  850. package/src/plugin-hooks/dispatcher.ts +10 -4
  851. package/src/plugins/core/host.ts +94 -4
  852. package/src/plugins/core/manifest.ts +104 -7
  853. package/src/plugins/install/market-fetch.ts +249 -0
  854. package/src/plugins/install/plugin-install.ts +387 -0
  855. package/src/policy/claude-subscription-guard.ts +25 -0
  856. package/src/preview/terminal.ts +24 -1
  857. package/src/preview-pane/mount.ts +1 -142
  858. package/src/prompt/references.ts +4 -51
  859. package/src/pty-shell/pty-control-ipc.ts +57 -3
  860. package/src/pty-shell/pty-mouse.ts +75 -0
  861. package/src/pty-shell/pty-recording.ts +108 -0
  862. package/src/pty-shell/registry.ts +53 -3
  863. package/src/python/resolve-python.ts +1 -1
  864. package/src/release-loop/manifest.ts +65 -0
  865. package/src/release-loop/release-note.ts +174 -0
  866. package/src/roles/lease-cas.ts +52 -0
  867. package/src/roles/machine-name.ts +48 -0
  868. package/src/roles/machine-profile.ts +65 -0
  869. package/src/roles/role-lease-read.ts +81 -0
  870. package/src/roles/role-lease.ts +63 -0
  871. package/src/roles/role-watch.ts +69 -0
  872. package/src/self-dev/ask-launch-flow.ts +39 -22
  873. package/src/self-dev/ask-launch-io.ts +1 -1
  874. package/src/self-dev/dev-cli.ts +250 -139
  875. package/src/self-dev/dev-pipeline.ts +80 -8
  876. package/src/self-dev/draft-sweep.ts +231 -0
  877. package/src/self-dev/draft-triage-rules.ts +42 -0
  878. package/src/self-dev/entrance-baseline.ts +156 -4
  879. package/src/self-dev/fabric-decompose-adapter.ts +10 -0
  880. package/src/self-dev/launch-preflight.ts +1 -1
  881. package/src/self-dev/orchestrate.ts +297 -20
  882. package/src/self-dev/repair-signals.ts +6 -0
  883. package/src/self-dev/run-store.ts +20 -5
  884. package/src/self-dev/run-supervisor.ts +43 -3
  885. package/src/self-implement/abandoned-classification.ts +15 -1
  886. package/src/self-implement/blocked-draft-policy.ts +6 -0
  887. package/src/self-implement/budget-gate.ts +236 -0
  888. package/src/self-implement/child-llm-preference.ts +84 -0
  889. package/src/self-implement/decision-events.ts +57 -0
  890. package/src/self-implement/decision-signal-press.ts +5 -2
  891. package/src/self-implement/dependency-change-gate.ts +90 -0
  892. package/src/self-implement/gate-baseline.ts +32 -1
  893. package/src/self-implement/gate-cli.ts +29 -7
  894. package/src/self-implement/gate-scope.ts +7 -1
  895. package/src/self-implement/goal-author-decompose.ts +22 -4
  896. package/src/self-implement/goal-author.ts +23 -2
  897. package/src/self-implement/goal-boundary.ts +65 -0
  898. package/src/self-implement/goal-clarification-escalation.ts +1 -0
  899. package/src/self-implement/goal-documents-dir.ts +6 -1
  900. package/src/self-implement/goal-execution-records.ts +58 -0
  901. package/src/self-implement/goal-run-store.ts +42 -24
  902. package/src/self-implement/graph-authority.ts +13 -28
  903. package/src/self-implement/graph-catalog.ts +48 -0
  904. package/src/self-implement/graph-run-contract.ts +127 -0
  905. package/src/self-implement/graph-templates.ts +14 -7
  906. package/src/self-implement/graph-yaml.ts +35 -6
  907. package/src/self-implement/harness-policy-gates.ts +42 -0
  908. package/src/self-implement/headless-elanous-driver.ts +30 -6
  909. package/src/self-implement/heal-triage.ts +229 -0
  910. package/src/self-implement/host-regate.ts +240 -0
  911. package/src/self-implement/non-git-consent.ts +23 -0
  912. package/src/self-implement/orchestrator.ts +481 -132
  913. package/src/self-implement/pipeline-shape.ts +1 -1
  914. package/src/self-implement/pr-evidence-artifact.ts +6 -19
  915. package/src/self-implement/prior-draft-findings.ts +128 -0
  916. package/src/self-implement/pwa-import-graph.ts +65 -0
  917. package/src/self-implement/repo-provision.ts +18 -21
  918. package/src/self-implement/report-origin.ts +39 -0
  919. package/src/self-implement/rework-policy.ts +21 -0
  920. package/src/self-implement/run-ledger-compact.ts +438 -0
  921. package/src/self-implement/run-ledger.ts +212 -29
  922. package/src/self-implement/run-report.ts +24 -0
  923. package/src/self-implement/run-status-mapping.ts +2 -0
  924. package/src/self-implement/running-runs.ts +112 -14
  925. package/src/self-implement/scoped-typecheck-config.ts +49 -0
  926. package/src/self-implement/seams.ts +203 -38
  927. package/src/self-implement/self-implement-cli.ts +17 -2
  928. package/src/self-implement/shadow-repo.ts +350 -0
  929. package/src/self-implement/supervision-vocabulary.ts +7 -0
  930. package/src/shell-runner/dispatch.ts +3 -0
  931. package/src/shell-runner/index.ts +0 -7
  932. package/src/skills/runner.ts +0 -69
  933. package/src/skills/tools/agent-room-slash.ts +2 -1
  934. package/src/skills/tools/agent-room.ts +8 -140
  935. package/src/skills/tools/agent.ts +5 -3
  936. package/src/skills/tools/context.ts +5 -140
  937. package/src/skills/tools/control.ts +4 -188
  938. package/src/skills/tools/dashboard-slash.ts +3 -11
  939. package/src/skills/tools/dashboard-state.ts +3 -5
  940. package/src/skills/tools/dev-harness.ts +3 -2
  941. package/src/skills/tools/omni-search.ts +29 -1
  942. package/src/skills/tools/shell.ts +11 -29
  943. package/src/skills/tools/spawn-coding-agent-headless.ts +6 -9
  944. package/src/ssh/ssh-picker-modal.ts +1 -1
  945. package/src/steward/directive.ts +99 -0
  946. package/src/steward/triage.ts +203 -0
  947. package/src/storage/cli-bin.ts +67 -0
  948. package/src/storage/object-store-visibility.ts +169 -0
  949. package/src/storage/object-store.ts +452 -0
  950. package/src/storage/s3.ts +53 -10
  951. package/src/storage/storage-detect.ts +337 -0
  952. package/src/surface/address.ts +3 -5
  953. package/src/surface/index.ts +0 -6
  954. package/src/surface/llm-tools.ts +1 -2
  955. package/src/surface/shell-runner-boot.ts +4 -89
  956. package/src/task-cards/card-cli.ts +64 -0
  957. package/src/task-cards/card-store.ts +241 -0
  958. package/src/task-orchestrator/boot.ts +27 -1
  959. package/src/task-orchestrator/dispatcher.ts +49 -7
  960. package/src/task-orchestrator/external-fingerprint.ts +10 -0
  961. package/src/task-orchestrator/external-policy.ts +86 -0
  962. package/src/task-orchestrator/feedback-loop.ts +4 -2
  963. package/src/task-orchestrator/graph.ts +18 -1
  964. package/src/task-orchestrator/runtimes/create.ts +128 -0
  965. package/src/task-orchestrator/store.ts +78 -18
  966. package/src/task-orchestrator/surface-registry.ts +5 -2
  967. package/src/task-orchestrator/surfaces/external-exec.ts +180 -0
  968. package/src/task-orchestrator/surfaces/idea-approval-pr.ts +118 -0
  969. package/src/task-orchestrator/surfaces/index.ts +4 -3
  970. package/src/task-orchestrator/surfaces/pod-account-broker.ts +60 -5
  971. package/src/task-orchestrator/surfaces/pod-artifact-return.ts +136 -0
  972. package/src/task-orchestrator/surfaces/pod-command-job.ts +348 -0
  973. package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +177 -0
  974. package/src/task-orchestrator/surfaces/pod-pool.ts +128 -12
  975. package/src/task-orchestrator/surfaces/pod-skills.ts +11 -3
  976. package/src/task-orchestrator/surfaces/pod-source-bundle.ts +132 -0
  977. package/src/task-orchestrator/surfaces/pod-source-receive.ts +91 -0
  978. package/src/task-orchestrator/surfaces/pod-source-spec.ts +77 -0
  979. package/src/task-orchestrator/surfaces/self-implement-pod.ts +782 -41
  980. package/src/task-orchestrator/surfaces/self-implement.ts +8 -1
  981. package/src/task-orchestrator/tox-loop.ts +204 -0
  982. package/src/task-orchestrator/types.ts +21 -1
  983. package/src/telegram-commands.ts +8 -0
  984. package/src/telegram-report.ts +2 -1
  985. package/src/telegram-run.ts +18 -5
  986. package/src/telegram.ts +92 -22
  987. package/src/tool-runtime/acp-session-runtime.ts +28 -7
  988. package/src/tool-runtime/agent-runtime.ts +1 -0
  989. package/src/tool-runtime/context-runtime.ts +18 -35
  990. package/src/tool-runtime/control-runtime.ts +8 -21
  991. package/src/tool-runtime/dashboard-state-runtime.ts +1 -5
  992. package/src/tool-runtime/elanous-asana-runtimes.ts +205 -0
  993. package/src/tool-runtime/elanous-control-runtimes.ts +16 -2
  994. package/src/tool-runtime/elanous-task-submit-runtime.ts +124 -0
  995. package/src/tool-runtime/index.ts +4 -1
  996. package/src/tool-runtime/scenario-runtimes.ts +22 -21
  997. package/src/tool-runtime/scenario-target-mount.ts +6 -32
  998. package/src/tool-runtime/types.ts +8 -0
  999. package/src/tui/chat/attachment-summary.ts +4 -4
  1000. package/src/tui-client/headless-core-guard.ts +0 -1
  1001. package/src/tui.ts +8 -5
  1002. package/src/typecheck-ratchet.ts +15 -0
  1003. package/src/ui/hover-presenter.ts +3 -7
  1004. package/src/user-config.ts +427 -190
  1005. package/src/version/code-revision.ts +33 -8
  1006. package/src/version/packed-revision.json +1 -1
  1007. package/src/video-pipeline/broll-agent.ts +102 -0
  1008. package/src/video-pipeline/recipes/broll.ts +263 -0
  1009. package/src/video-pipeline/walk-line.ts +2 -1
  1010. package/src/views/scratch-image-size.ts +10 -0
  1011. package/src/voice/channel-adapters/pwa-voice-adapter.ts +2 -18
  1012. package/src/voice/channel-adapters/telegram-voice-adapter.ts +1 -6
  1013. package/src/voice/voice-tts-singleton.ts +46 -8
  1014. package/src/web-push/vapid-keys.ts +1 -1
  1015. package/src/web-search/index.ts +5 -5
  1016. package/src/web-terminal/preview-tap-registry.ts +152 -43
  1017. package/src/workflow-runtime/executor.ts +18 -22
  1018. package/src/workflow-runtime/node-catalog.ts +20 -1
  1019. package/src/workflow-runtime/nodes/bash.ts +1 -0
  1020. package/src/workflow-runtime/nodes/task.ts +74 -0
  1021. package/src/workflow-runtime/nodes/triggers.ts +24 -1
  1022. package/src/workflow-runtime/plugin-kind-node.ts +138 -0
  1023. package/src/workflow-runtime/schema.ts +98 -2
  1024. package/src/workflow-runtime/triggers/webhook-router.ts +43 -3
  1025. package/src/workflow-runtime/triggers/webhook-source.ts +19 -1
  1026. package/src/workflow-runtime/types.ts +74 -4
  1027. package/apps/pwa/out/_next/static/Ksn99fVf2HUWhSyV1-FC8/_buildManifest.js +0 -1
  1028. package/apps/pwa/out/_next/static/chunks/1176-4943bd83b00e53a2.js +0 -25
  1029. package/apps/pwa/out/_next/static/chunks/1380-9c652e1002032c86.js +0 -1
  1030. package/apps/pwa/out/_next/static/chunks/1863-2ea170dfec26b88b.js +0 -1
  1031. package/apps/pwa/out/_next/static/chunks/2091-2d6b7f4f16300f83.js +0 -1
  1032. package/apps/pwa/out/_next/static/chunks/2347-366617ec73babe3b.js +0 -1
  1033. package/apps/pwa/out/_next/static/chunks/2598.814f64e3268634e7.js +0 -1
  1034. package/apps/pwa/out/_next/static/chunks/3089-e60cc8f5d35ee239.js +0 -1
  1035. package/apps/pwa/out/_next/static/chunks/3158-c77ed9ea34f9cc9f.js +0 -1
  1036. package/apps/pwa/out/_next/static/chunks/3607-f0b5c5ee18fcf56a.js +0 -1
  1037. package/apps/pwa/out/_next/static/chunks/3659-05b2d5d971b42dbc.js +0 -1
  1038. package/apps/pwa/out/_next/static/chunks/3736-b6a7bfdcb8f56ec6.js +0 -1
  1039. package/apps/pwa/out/_next/static/chunks/3839-eebf298e89a7bb77.js +0 -1
  1040. package/apps/pwa/out/_next/static/chunks/4012.832a2824b978e7ee.js +0 -5
  1041. package/apps/pwa/out/_next/static/chunks/4706-d85d7f3345f3ff91.js +0 -1
  1042. package/apps/pwa/out/_next/static/chunks/526-17a6a2e0e6dc4498.js +0 -1
  1043. package/apps/pwa/out/_next/static/chunks/5508-676ac75f2757ad40.js +0 -1
  1044. package/apps/pwa/out/_next/static/chunks/5583-8a0317f4b8e68db9.js +0 -1
  1045. package/apps/pwa/out/_next/static/chunks/5927.8378481a12cc8044.js +0 -1
  1046. package/apps/pwa/out/_next/static/chunks/6258-b58f722b10e8d31d.js +0 -1
  1047. package/apps/pwa/out/_next/static/chunks/6820-32fd097e6186fdc9.js +0 -1
  1048. package/apps/pwa/out/_next/static/chunks/6852-983db7ca958634b7.js +0 -1
  1049. package/apps/pwa/out/_next/static/chunks/7235-e583e4a015e159b9.js +0 -1
  1050. package/apps/pwa/out/_next/static/chunks/7482-7b417330b24a996a.js +0 -1
  1051. package/apps/pwa/out/_next/static/chunks/7701-99b7d4dedb955bf8.js +0 -1
  1052. package/apps/pwa/out/_next/static/chunks/77f1928d-bd3777589042d3ea.js +0 -1
  1053. package/apps/pwa/out/_next/static/chunks/8366-36956cafc5e33614.js +0 -1
  1054. package/apps/pwa/out/_next/static/chunks/8370-23d0de995be666f8.js +0 -1
  1055. package/apps/pwa/out/_next/static/chunks/8617-307421f3b0e8b2a2.js +0 -1
  1056. package/apps/pwa/out/_next/static/chunks/8837-e45de46a9fedf1f5.js +0 -1
  1057. package/apps/pwa/out/_next/static/chunks/9058-0e8055a5ea3ebdd6.js +0 -1
  1058. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-84b84eca12acada4.js +0 -1
  1059. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-1f23568c29e88f7a.js +0 -1
  1060. package/apps/pwa/out/_next/static/chunks/app/botlab/page-bf6fc9aafd6135a7.js +0 -1
  1061. package/apps/pwa/out/_next/static/chunks/app/bots/page-3f8539ae4b719d2e.js +0 -1
  1062. package/apps/pwa/out/_next/static/chunks/app/chat/page-d2900febb74ecf32.js +0 -1
  1063. package/apps/pwa/out/_next/static/chunks/app/control/page-e82dec647dd79c36.js +0 -1
  1064. package/apps/pwa/out/_next/static/chunks/app/dashboard/page-096ec743a8ee955a.js +0 -1
  1065. package/apps/pwa/out/_next/static/chunks/app/design-check/page-255c2ceded4b3493.js +0 -1
  1066. package/apps/pwa/out/_next/static/chunks/app/healthz/route-84b84eca12acada4.js +0 -1
  1067. package/apps/pwa/out/_next/static/chunks/app/intake/page-2db61b2f9efba61f.js +0 -1
  1068. package/apps/pwa/out/_next/static/chunks/app/layout-e11ee17f221aaa9b.js +0 -1
  1069. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e075974e029ce4c4.js +0 -1
  1070. package/apps/pwa/out/_next/static/chunks/app/morning/page-ec5b68a9af3366a0.js +0 -1
  1071. package/apps/pwa/out/_next/static/chunks/app/not-found-986c177afb4adae6.js +0 -1
  1072. package/apps/pwa/out/_next/static/chunks/app/observatory/page-a72781461af2f2a3.js +0 -1
  1073. package/apps/pwa/out/_next/static/chunks/app/page-92781cbaafc487ad.js +0 -1
  1074. package/apps/pwa/out/_next/static/chunks/app/reflection/page-2c14d2a1f2930f33.js +0 -1
  1075. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-22ee4bf8070b2b4d.js +0 -1
  1076. package/apps/pwa/out/_next/static/chunks/app/sessions/page-9c06e4a8297942a8.js +0 -1
  1077. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d0cd32f6d373798f.js +0 -1
  1078. package/apps/pwa/out/_next/static/chunks/app/settings/page-0c1642018d87ebb8.js +0 -1
  1079. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-93e5e97d614df487.js +0 -1
  1080. package/apps/pwa/out/_next/static/chunks/app/setup/layout-84b84eca12acada4.js +0 -1
  1081. package/apps/pwa/out/_next/static/chunks/app/setup/page-b1ce871940d7393e.js +0 -1
  1082. package/apps/pwa/out/_next/static/chunks/app/share/page-ae154addf345febe.js +0 -1
  1083. package/apps/pwa/out/_next/static/chunks/app/showroom/page-90af3aa813d2053c.js +0 -1
  1084. package/apps/pwa/out/_next/static/chunks/app/tasks/page-f3f962fda428a738.js +0 -1
  1085. package/apps/pwa/out/_next/static/chunks/app/term/page-1c1f7cc1d5def06d.js +0 -1
  1086. package/apps/pwa/out/_next/static/chunks/app/vault/page-09d4cbdaaacf06c1.js +0 -1
  1087. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e877b8e8ca90b27f.js +0 -1
  1088. package/apps/pwa/out/_next/static/chunks/app/workflows/page-71d902f463dea526.js +0 -1
  1089. package/apps/pwa/out/_next/static/chunks/app/workspace/page-40ea576cefa25fe6.js +0 -1
  1090. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a56a3f178c3831f6.js +0 -1
  1091. package/apps/pwa/out/_next/static/chunks/bcc499d1-804a270d878e0842.js +0 -1
  1092. package/apps/pwa/out/_next/static/chunks/framework-b25b7c5501c59b6d.js +0 -1
  1093. package/apps/pwa/out/_next/static/chunks/main-a9ec9da43387afff.js +0 -1
  1094. package/apps/pwa/out/_next/static/chunks/main-app-aa2c05954aaa6754.js +0 -1
  1095. package/apps/pwa/out/_next/static/chunks/pages/_app-bb3768fb4b84aebb.js +0 -1
  1096. package/apps/pwa/out/_next/static/chunks/pages/_error-2820ba75b87b2f5e.js +0 -1
  1097. package/apps/pwa/out/_next/static/chunks/webpack-58c73b145f189b1c.js +0 -1
  1098. package/apps/pwa/out/_next/static/css/effec8adf767aa75.css +0 -1
  1099. package/apps/pwa/out/dashboard/index.html +0 -1
  1100. package/apps/pwa/out/dashboard/index.txt +0 -26
  1101. package/src/acp/resident-shell.ts +0 -244
  1102. package/src/agent/spawn-local-llm-in-vw.ts +0 -240
  1103. package/src/dashboard/agent-spawn-tools-boot.ts +0 -14
  1104. package/src/dashboard/dock-picker-inventory.ts +0 -41
  1105. package/src/dashboard/goal-plan-hud-bridge.ts +0 -112
  1106. package/src/dashboard/hud-mirror.ts +0 -207
  1107. package/src/dashboard/input/mouse-dock-runtime.ts +0 -156
  1108. package/src/dashboard/input/mouse-hover-runtime.ts +0 -46
  1109. package/src/dashboard/input/mouse-pill-context-runtime.ts +0 -74
  1110. package/src/dashboard/input/mouse-workspace-restore-runtime.ts +0 -64
  1111. package/src/dashboard/input/scratch-actions.ts +0 -36
  1112. package/src/dashboard/input/virtual-window-key-router.ts +0 -24
  1113. package/src/dashboard/rich-scratch-viewers.ts +0 -77
  1114. package/src/dashboard/scratch-slash-runtime.ts +0 -36
  1115. package/src/dashboard/scratch-state-runtime.ts +0 -42
  1116. package/src/dashboard/scratch-widget-runtime.ts +0 -37
  1117. package/src/dashboard/sim-shell.ts +0 -313
  1118. package/src/dashboard/virtual-window-control-runtime.ts +0 -57
  1119. package/src/dashboard/virtual-window-help-runtime.ts +0 -113
  1120. package/src/dashboard/virtual-window-input-runtime.ts +0 -99
  1121. package/src/dashboard/virtual-window-mutation-runtime.ts +0 -102
  1122. package/src/dashboard/virtual-window-split-runtime.ts +0 -70
  1123. package/src/dashboard/vw-popup-openers.ts +0 -126
  1124. package/src/dashboard/window-picker-popup.ts +0 -74
  1125. package/src/dashboard/window-slash-runtime.ts +0 -108
  1126. package/src/dashboard/windowing/companion-slash.ts +0 -78
  1127. package/src/dashboard/windowing/fast-switch.ts +0 -138
  1128. package/src/dashboard/windowing/lifecycle.ts +0 -185
  1129. package/src/dashboard/windowing/virtual-windows.ts +0 -259
  1130. package/src/dashboard/windowing/visibility-chord.ts +0 -77
  1131. package/src/iul/resident-vw.ts +0 -55
  1132. package/src/panes/content-adapter.ts +0 -162
  1133. package/src/prompt/vw-reference.ts +0 -153
  1134. package/src/shell-runner/external-terminal-pane.ts +0 -157
  1135. package/src/sim/resident-vw.ts +0 -48
  1136. package/src/skills/tools/spawn-coding-agent-vw.ts +0 -181
  1137. package/src/skills/tools/virtual-windows.ts +0 -632
  1138. package/src/surface/adapters/window-surface-adapter.ts +0 -141
  1139. package/src/tool-runtime/layout-runtimes.ts +0 -81
  1140. package/src/tool-runtime/scenario-window-mount.ts +0 -207
  1141. package/src/views/ui-mode.ts +0 -100
  1142. package/src/virtual-window-context-menu.ts +0 -97
  1143. package/src/virtual-windows/addressing.ts +0 -195
  1144. package/src/virtual-windows/benchmark-preset.ts +0 -119
  1145. package/src/virtual-windows/event-bus.ts +0 -202
  1146. package/src/virtual-windows/layout/apply-planner.ts +0 -189
  1147. package/src/virtual-windows/layout/index.ts +0 -68
  1148. package/src/virtual-windows/layout/layout-commands.ts +0 -186
  1149. package/src/virtual-windows/layout/layout-tools.ts +0 -262
  1150. package/src/virtual-windows/layout/persistence.ts +0 -219
  1151. package/src/virtual-windows/layout/presets.ts +0 -114
  1152. package/src/virtual-windows/layout/restore-planner.ts +0 -223
  1153. package/src/virtual-windows/layout/serializer.ts +0 -197
  1154. package/src/virtual-windows/layout/tree.ts +0 -147
  1155. package/src/virtual-windows/layout/types.ts +0 -63
  1156. package/src/virtual-windows/layout-tree.ts +0 -389
  1157. package/src/virtual-windows/navigation.ts +0 -251
  1158. package/src/virtual-windows/pane-capture.ts +0 -142
  1159. package/src/virtual-windows/pane-content.ts +0 -611
  1160. package/src/virtual-windows/pane-spawner.ts +0 -278
  1161. package/src/virtual-windows/pty-tail-content.ts +0 -291
  1162. package/src/virtual-windows/resident-window.ts +0 -59
  1163. package/src/virtual-windows/secondary-action.ts +0 -25
  1164. package/src/virtual-windows/terminal-slot-content.ts +0 -165
  1165. package/src/virtual-windows/virtual-window.ts +0 -1301
  1166. package/src/virtual-windows/vw-local-input-target-popup.ts +0 -110
  1167. package/src/virtual-windows/vw-rename-modal.ts +0 -77
  1168. package/src/virtual-windows/vw-selector-popup.ts +0 -177
  1169. package/src/virtual-windows/window-registry.ts +0 -519
  1170. package/src/voice/channel-adapters/discord-voice-adapter.ts +0 -202
  1171. package/src/voice/voice-pwa-dispatch.ts +0 -245
  1172. package/src/window-picker-modal.ts +0 -135
  1173. /package/apps/pwa/out/_next/static/{Ksn99fVf2HUWhSyV1-FC8 → zoQX5iTvXOsIvCjxCe1Ji}/_ssgManifest.js +0 -0
  1174. /package/src/dashboard/{companion-slash-runtime.ts → companion-messages-runtime.ts} +0 -0
@@ -50,6 +50,9 @@ export interface SelfImplementDisposition {
50
50
  branch?: string;
51
51
  prUrl?: string;
52
52
  prNumber?: number;
53
+ /** Head SHA checked by the Pod before host regate. */
54
+ checkedHeadCommit?: string;
55
+ hostRegate?: { passed: boolean; failures: Array<{ step: string; detail: string }>; os: string };
53
56
  merged?: boolean;
54
57
  detail?: string;
55
58
  /** Terminal error emitted by a failed child `--json` result. */
@@ -72,6 +75,8 @@ export interface SelfImplementDisposition {
72
75
  providerErrors?: { count: number; provider: string; category: 'quota' | 'credential' | 'request' | 'other' };
73
76
  /** Stable self-implement run identity for ledger-backed consumers. */
74
77
  runId?: string;
78
+ /** Pod child run identity, distinct from the host parent run attached to logs. */
79
+ childRunId?: string;
75
80
  /** E4(2026-09-25 · 벤치 비교 칸) — 자식 `--json` 의 `gate.passed`. 없으면 «못 쟀다»(false 가 아니다). */
76
81
  gatePassed?: boolean;
77
82
  /** 자식 `--json` 의 `review.verdict`(마지막 리뷰). `review.reviewed=false` 면 싣지 않는다 — 리뷰 안 한 판을 pass 로 읽지 않게. */
@@ -445,6 +450,8 @@ export function parseSelfImplementJson(stdout: string): SelfImplementDisposition
445
450
  ...(typeof o.branch === 'string' ? { branch: o.branch } : {}),
446
451
  ...(typeof o.prUrl === 'string' ? { prUrl: o.prUrl } : {}),
447
452
  ...(typeof o.prNumber === 'number' ? { prNumber: o.prNumber } : {}),
453
+ ...(typeof o.checkedHeadCommit === 'string' ? { checkedHeadCommit: o.checkedHeadCommit } : {}),
454
+ ...(typeof o.hostRegate === 'object' && o.hostRegate !== null ? { hostRegate: o.hostRegate as SelfImplementDisposition['hostRegate'] } : {}),
448
455
  ...(typeof o.merged === 'boolean' ? { merged: o.merged } : {}),
449
456
  ...(typeof o.detail === 'string' ? { detail: o.detail } : {}),
450
457
  ...(typeof o.error === 'string' && o.error.trim() ? { error: o.error } : {}),
@@ -461,7 +468,7 @@ export function parseSelfImplementJson(stdout: string): SelfImplementDisposition
461
468
  && typeof (o.providerErrors as Record<string, unknown>).provider === 'string'
462
469
  && ['quota', 'credential', 'request', 'other'].includes(String((o.providerErrors as Record<string, unknown>).category))
463
470
  ? { providerErrors: o.providerErrors as SelfImplementDisposition['providerErrors'] } : {}),
464
- ...(typeof o.runId === 'string' && o.runId.trim() ? { runId: o.runId } : {}),
471
+ ...(typeof o.runId === 'string' && o.runId.trim() ? { runId: o.runId, childRunId: o.runId } : {}),
465
472
  ...reviewGateFields(o),
466
473
  };
467
474
  reportUnmappedDispositionFields(o, mapped);
@@ -0,0 +1,204 @@
1
+ import { OpportunisticLauncher, type LaunchCandidate } from '../dispatch/opportunistic-launcher.js';
2
+ import { ResourceScheduler } from '../dispatch/resource-scheduler.js';
3
+ import { TimeSlotManager } from '../dispatch/time-slot.js';
4
+ import { debug } from '../debug/log.js';
5
+ import type { TaskGraph } from './graph.js';
6
+ import type { DispatchTickResult, TaskDispatcher } from './dispatcher.js';
7
+ import type { TaskEventBus } from './events.js';
8
+ import type { BudgetGate } from './feedback-loop.js';
9
+ import { PRIORITY_RANK } from './priority.js';
10
+ import type { Task } from './types.js';
11
+ import { decideBudget, readBudgetInputsLive, type ReadBudgetInputsDeps } from '../self-implement/budget-gate.js';
12
+ import { getUserConfig } from '../user-config.js';
13
+ import { getSecretAsync } from '../nexus/config/secrets/index.js';
14
+ import { projectLinearTask } from '../connectors/linear-projector.js';
15
+ import type { TaskStore } from './store.js';
16
+
17
+ async function defaultBudgetCheck(readBudget?: ReadBudgetInputsDeps & { readLiveGrok?: () => Promise<number | undefined> }): Promise<{ canAfford: boolean; tripped: readonly string[] }> {
18
+ const inputs = await readBudgetInputsLive({ config: getUserConfig(), ...readBudget });
19
+ const maxUsedPercent = {
20
+ ...inputs.maxUsedPercent,
21
+ 'openai-codex': Math.min(inputs.maxUsedPercent['openai-codex'] ?? 60, 60),
22
+ grok: Math.min(inputs.maxUsedPercent.grok ?? 50, 50),
23
+ };
24
+ const decision = decideBudget({ ...inputs, maxUsedPercent });
25
+ // TOX adapters do not receive the selected fallback provider. Do not admit
26
+ // a next-provider decision until that provider can actually be routed.
27
+ const canAfford = decision.action === 'proceed';
28
+ return {
29
+ canAfford,
30
+ tripped: canAfford ? [] : decision.reasons,
31
+ };
32
+ }
33
+
34
+ export interface ToxLoopOptions {
35
+ graph: TaskGraph;
36
+ dispatcher: Pick<TaskDispatcher, 'tickTask'>;
37
+ bus?: TaskEventBus;
38
+ store?: TaskStore;
39
+ /** Optional projection IO seams for isolated TOX tests. */
40
+ linearProjection?: {
41
+ getApiKey: () => Promise<string | undefined>;
42
+ project: typeof projectLinearTask;
43
+ };
44
+ maxConcurrent?: number;
45
+ intervalMs?: number;
46
+ budgetCheck?: BudgetGate;
47
+ /** Usage-reader seam; still exercises the default P15 evaluator. */
48
+ readBudget?: ReadBudgetInputsDeps & { readLiveGrok?: () => Promise<number | undefined> };
49
+ /** Test seam; production hands each admitted task to the TOX dispatcher. */
50
+ launch?: (task: Task) => Promise<void> | void;
51
+ log?: (event: 'tick' | 'launched' | 'waiting-capacity' | 'budget-hold' | 'skipped', data: {
52
+ taskId?: string; priority?: Task['priority']; running: number; ready: number;
53
+ traceId?: string; reason?: string;
54
+ }) => void;
55
+ }
56
+
57
+ export function startToxLoop({ graph, dispatcher, bus, store, linearProjection, maxConcurrent = 2, intervalMs = 1000,
58
+ budgetCheck, readBudget, launch, log }: ToxLoopOptions): { tick: () => Promise<DispatchTickResult>; stop: () => void } {
59
+ if (!Number.isInteger(maxConcurrent) || maxConcurrent < 1) throw new RangeError('maxConcurrent must be a positive integer');
60
+ if (!Number.isFinite(intervalMs) || intervalMs < 1) throw new RangeError('intervalMs must be positive');
61
+ const slot = new TimeSlotManager();
62
+ const scheduler = new ResourceScheduler({ slot: () => slot.currentSlot() });
63
+ const inflight = new Set<string>();
64
+ const gate = budgetCheck ?? (() => defaultBudgetCheck(readBudget));
65
+ let stopped = false;
66
+ const projections = new Map<string, Promise<void>>();
67
+ let pending = false;
68
+ let tickPromise: Promise<DispatchTickResult> | undefined;
69
+ let currentResult: DispatchTickResult | undefined;
70
+ const emit: NonNullable<ToxLoopOptions['log']> = (event, data) => {
71
+ try { (log ?? ((kind, fields) => debug.log('tox.loop', kind, fields)))(event, data); }
72
+ catch { /* observation cannot interrupt dispatch */ }
73
+ };
74
+ const runningCount = () => graph.listRunning().length + [...inflight].filter((id) => graph.getTask(id)?.status !== 'running').length;
75
+ const snapshot = () => ({ running: runningCount(), ready: graph.countByStatus().ready });
76
+ let wakeTimer: ReturnType<typeof setTimeout> | undefined;
77
+ const wake = () => {
78
+ if (stopped || wakeTimer) return;
79
+ wakeTimer = setTimeout(() => {
80
+ wakeTimer = undefined;
81
+ void tick();
82
+ }, 0);
83
+ };
84
+ const launcher = new OpportunisticLauncher({
85
+ slot: () => slot.currentSlot(), scheduler, intervalMs, onTick: () => tick(),
86
+ readyTasks: () => graph.listAll()
87
+ .filter((task) => task.status === 'ready' && !inflight.has(task.id))
88
+ .sort((a, b) => a.createdAt - b.createdAt || a.id.localeCompare(b.id))
89
+ .map((task): LaunchCandidate => ({
90
+ id: task.id, ready: true, priorityRank: -PRIORITY_RANK[task.priority],
91
+ surface: task.surface.kind,
92
+ })),
93
+ perTickCap: maxConcurrent,
94
+ concurrencyOK: () => runningCount() < maxConcurrent,
95
+ admit: async (candidate) => {
96
+ const task = graph.getTask(candidate.id);
97
+ if (stopped || !task || task.status !== 'ready' || inflight.has(task.id)) return 'not-ready';
98
+ const decision = await gate(task.goalSlug ?? '', task.estimateUsd);
99
+ if (!decision.canAfford || decision.tripped.length > 0) return 'budget-hold';
100
+ return undefined;
101
+ },
102
+ launch: (candidate) => {
103
+ const task = graph.getTask(candidate.id);
104
+ if (!task || task.status !== 'ready' || stopped) throw new Error('not-ready');
105
+ let completion: Promise<void> | void;
106
+ if (launch) {
107
+ completion = launch(task);
108
+ } else {
109
+ const result = dispatcher.tickTask(task.id);
110
+ const started = result.dispatched[0];
111
+ if (!started) {
112
+ currentResult?.deferred.push(...result.deferred);
113
+ throw new Error(result.deferred[0]?.reason ?? 'not-dispatched');
114
+ }
115
+ currentResult?.dispatched.push(started);
116
+ completion = started.promise;
117
+ }
118
+ inflight.add(task.id);
119
+ emit('launched', { taskId: task.id, priority: task.priority, ...snapshot() });
120
+ void Promise.resolve(completion).catch((err) => {
121
+ emit('skipped', { taskId: task.id, priority: task.priority, ...snapshot(), reason: String(err) });
122
+ }).finally(() => {
123
+ inflight.delete(task.id);
124
+ if (!stopped) wake();
125
+ });
126
+ },
127
+ });
128
+
129
+ function tick(): Promise<DispatchTickResult> {
130
+ if (stopped) return Promise.resolve({ dispatched: [], deferred: [] });
131
+ if (tickPromise) { pending = true; return tickPromise; }
132
+ const result: DispatchTickResult = { dispatched: [], deferred: [] };
133
+ tickPromise = (async () => {
134
+ currentResult = result;
135
+ try {
136
+ do {
137
+ pending = false;
138
+ emit('tick', snapshot());
139
+ const outcomes = await launcher.tick();
140
+ for (const outcome of outcomes) {
141
+ if (outcome.ok) continue;
142
+ const task = graph.getTask(outcome.taskId);
143
+ const reason = outcome.reason ?? 'unknown';
144
+ emit(reason === 'concurrency-cap' ? 'waiting-capacity' : reason === 'budget-hold' || reason.startsWith('admission-error:') ? 'budget-hold' : 'skipped', {
145
+ taskId: outcome.taskId, priority: task?.priority, ...snapshot(), reason,
146
+ });
147
+ }
148
+ } while (pending && !stopped);
149
+ } catch (err) {
150
+ emit('skipped', { ...snapshot(), reason: `tick-error:${err instanceof Error ? err.message : String(err)}` });
151
+ } finally {
152
+ currentResult = undefined;
153
+ }
154
+ return result;
155
+ })();
156
+ void tickPromise.finally(() => { tickPromise = undefined; });
157
+ return tickPromise;
158
+ }
159
+
160
+ const subscription = bus?.subscribe((event) => {
161
+ if (event.kind === 'task-created' || (event.kind === 'task-status-changed' && event.to === 'ready')) wake();
162
+ if (event.kind === 'task-completed' || event.kind === 'task-failed' || event.kind === 'task-cancelled') wake();
163
+
164
+ const status = event.kind === 'task-status-changed' ? event.to
165
+ : event.kind === 'task-started' ? 'running'
166
+ : event.kind === 'task-completed' ? 'done'
167
+ : event.kind === 'task-failed' ? 'failed' : undefined;
168
+ if (status !== 'running' && status !== 'review' && status !== 'done' && status !== 'failed') return;
169
+ if (event.kind === 'task-status-changed' && (event.from === event.to || event.to !== 'review')) return;
170
+ if (!event.taskId) return;
171
+ const task = graph.getTask(event.taskId);
172
+ if (task?.generatedBy?.kind !== 'external' || task.generatedBy.provider !== 'linear') return;
173
+ const projectionTask = { ...task, status };
174
+ const executionId = event.kind === 'task-started' || event.kind === 'task-completed' || event.kind === 'task-failed'
175
+ ? event.executionId : task.lastExecutionId;
176
+ if (executionId) projectionTask.lastExecutionId = executionId;
177
+ const previous = projections.get(task.id);
178
+ const current = (async () => {
179
+ if (previous) await previous;
180
+ if (stopped) return;
181
+ try {
182
+ const apiKey = await (linearProjection?.getApiKey ?? (() => getSecretAsync('connector.linear.apiKey')))();
183
+ if (!apiKey || stopped) return;
184
+ const execution = executionId ? store?.getExecution(executionId) ?? undefined : undefined;
185
+ await (linearProjection?.project ?? projectLinearTask)({ task: projectionTask, apiKey, execution });
186
+ } catch (error) {
187
+ emit('skipped', { taskId: task.id, ...snapshot(), reason: `linear-projection:${String(error)}` });
188
+ }
189
+ })();
190
+ projections.set(task.id, current);
191
+ void current.finally(() => { if (projections.get(task.id) === current) projections.delete(task.id); });
192
+ }, { kinds: ['task-created', 'task-status-changed', 'task-started', 'task-completed', 'task-failed', 'task-cancelled'] });
193
+ launcher.start();
194
+ wake();
195
+ return {
196
+ tick,
197
+ stop() {
198
+ stopped = true;
199
+ launcher.stop();
200
+ if (wakeTimer) clearTimeout(wakeTimer);
201
+ subscription?.dispose();
202
+ },
203
+ };
204
+ }
@@ -406,7 +406,21 @@ export type TaskGeneratedBy =
406
406
  | { kind: 'llm'; modelId?: string; turn?: number }
407
407
  | { kind: 'cron'; jobRef: string }
408
408
  | { kind: 'followUp'; parentTaskId: string }
409
- | { kind: 'regenerate'; parentTaskId?: string; depth: number };
409
+ | { kind: 'regenerate'; parentTaskId?: string; depth: number }
410
+ | { kind: 'external'; provider: 'asana' | 'linear' | 'telegram' | 'github' | 'agent-plugin' | 'intake' | 'other'; ref: string; url?: string };
411
+
412
+ export type ExternalTaskSource = Extract<TaskGeneratedBy, { kind: 'external' }>;
413
+ export interface TaskApproval {
414
+ /** pending = waits for a person · auto = matched a `tox.external.autoRun` rule ·
415
+ * approved = a person approved it (`POST /v1/tasks/:id/approve`). */
416
+ state: 'pending' | 'auto' | 'approved';
417
+ /** The autoRun rule that matched (state `auto` only). */
418
+ rule?: string;
419
+ /** Who approved it (state `approved` only). */
420
+ approvedBy?: 'manual';
421
+ approvedAt?: number;
422
+ fingerprint?: string;
423
+ }
410
424
 
411
425
  // ──────────────────── Task ───────────────────────────────────────────
412
426
 
@@ -464,6 +478,7 @@ export interface Task {
464
478
 
465
479
  // provenance
466
480
  generatedBy?: TaskGeneratedBy;
481
+ approval?: TaskApproval;
467
482
  triggerChain: readonly string[]; // parent taskIds (hop ≤ 5)
468
483
 
469
484
  /** Cascade-zyu Z0 (2026-05-12) — optional anchor to an existing
@@ -495,6 +510,7 @@ export interface TaskInit {
495
510
  timeoutMs?: number;
496
511
  acceptance?: TaskAcceptance;
497
512
  generatedBy?: TaskGeneratedBy;
513
+ approval?: TaskApproval;
498
514
  triggerChain?: readonly string[];
499
515
  /** Optional override — default is `'backlog'`. */
500
516
  status?: TaskStatus;
@@ -527,6 +543,8 @@ export interface TaskExecution {
527
543
  */
528
544
  surfaceAddress?: string;
529
545
  output?: string; // ≤ 4 KB tail; larger goes to outputPath
546
+ /** The agent ran, but its reported outcome needs human review rather than automatic completion. */
547
+ reviewRequired?: boolean;
530
548
  outputPath?: string;
531
549
  error?: { code: string; message: string; stack?: string };
532
550
  tokenUsage?: { input: number; output: number };
@@ -647,6 +665,7 @@ export function createTask(
647
665
  acceptance: init.acceptance,
648
666
  notes: initialNotes,
649
667
  generatedBy: init.generatedBy,
668
+ approval: init.approval,
650
669
  triggerChain: Object.freeze([...triggerChain]),
651
670
  showroomSessionId: init.showroomSessionId,
652
671
  };
@@ -737,6 +756,7 @@ export function serializeTask(t: Task): Record<string, unknown> {
737
756
  reviewVerdicts: t.reviewVerdicts,
738
757
  notes: [...t.notes],
739
758
  generatedBy: t.generatedBy,
759
+ approval: t.approval,
740
760
  triggerChain: [...t.triggerChain],
741
761
  showroomSessionId: t.showroomSessionId,
742
762
  };
@@ -762,6 +762,14 @@ export function defaultTelegramCommands(): TgSlashCommand[] {
762
762
  });
763
763
  },
764
764
  },
765
+ {
766
+ name: 'work',
767
+ description: '글을 알맞은 곳(흡수·태스크·하니스)에 넣고 결과를 여기로 답합니다 — /work [absorb|tasks|graph] <글>',
768
+ handler: async (args, ctx) => {
769
+ const { handleTelegramWork } = await import('./intake-plane/telegram-work.js');
770
+ return handleTelegramWork(args, { chatId: ctx.chatId, messageId: ctx.messageId, ...(ctx.botId ? { botId: ctx.botId } : {}), ...(ctx.threadId != null ? { threadId: ctx.threadId } : {}) });
771
+ },
772
+ },
765
773
  {
766
774
  name: 'harness',
767
775
  description: 'Capture a task and launch its harness implementation',
@@ -11,6 +11,7 @@
11
11
  // the report channel while interactive Q&A stays on the main bot.
12
12
 
13
13
  import { TelegramBot } from './telegram.js';
14
+ import { resolveChannelBotToken } from './channel-bot-token.js';
14
15
  import type { UserConfig } from './user-config.js';
15
16
  import { findSessionByTelegramChat, createSession, appendMessage } from './session/index.js';
16
17
 
@@ -55,7 +56,7 @@ export interface ReportTarget {
55
56
  export function resolveReportTarget(cfg: UserConfig): ReportTarget | null {
56
57
  const rc = cfg.telegram.reportChannel;
57
58
  if (!rc || !Number.isFinite(rc.chatId)) return null;
58
- const botToken = rc.botToken ?? cfg.telegram.botToken;
59
+ const botToken = rc.botToken ?? resolveChannelBotToken('telegram', cfg)?.token;
59
60
  if (!botToken) return null;
60
61
  return { botToken, chatId: rc.chatId };
61
62
  }
@@ -12,6 +12,7 @@
12
12
 
13
13
  import { debug } from './debug/log.js';
14
14
  import { getUserConfig } from './user-config.js';
15
+ import { resolveChannelBotToken } from './channel-bot-token.js';
15
16
  import { forwardTelegramDispatch } from './telegram-dispatch-forward.js';
16
17
  import type { NexusTelegramQaPollerWireHandle } from './nexus/index.js';
17
18
 
@@ -40,11 +41,23 @@ export async function retryingAcquire<T extends { ok: boolean }>(
40
41
  }
41
42
  }
42
43
 
44
+ let pollLockForTesting: {
45
+ acquire: typeof import('./telegram-poll-lock.js').acquireTelegramPollLock;
46
+ retry: typeof retryingAcquire;
47
+ } | undefined;
48
+
49
+ export function setTelegramPollLockForTesting(deps: typeof pollLockForTesting): () => void {
50
+ const previous = pollLockForTesting;
51
+ pollLockForTesting = deps;
52
+ return () => { pollLockForTesting = previous; };
53
+ }
54
+
43
55
  /** 폴러를 띄우고 핸들을 돌려준다(시험용으로 분리 — 대기는 `runTelegramPoller` 가 한다). */
44
56
  export async function startTelegramPollers(): Promise<TelegramRunResult> {
45
57
  const cfg = getUserConfig();
46
- if (!cfg.telegram.enabled || !cfg.telegram.botToken) {
47
- throw new Error('telegram run: telegram.enabled 가 꺼져 있거나 telegram.botToken 이 없다');
58
+ const mainToken = resolveChannelBotToken('telegram', cfg)?.token;
59
+ if (!cfg.telegram.enabled || !mainToken) {
60
+ throw new Error('telegram run: telegram.enabled 가 꺼져 있거나 bot token 이 없다');
48
61
  }
49
62
  if (cfg.telegram.poller !== 'standalone') {
50
63
  console.warn('[telegram run] ⚠️ telegram.poller 가 standalone 이 아니다 — 넥서스도 같은 토큰을 폴링하려 한다. 토큰 잠금이 먼저 잡은 쪽만 띄운다.');
@@ -57,12 +70,12 @@ export async function startTelegramPollers(): Promise<TelegramRunResult> {
57
70
  import('./telegram-poll-lock.js'),
58
71
  ]);
59
72
  // 토큰마다 잠금을 «먼저» 기다려 잡는다(넥서스 재시작 겹침이면 30초 안에 풀린다).
60
- const tokens = channels.interactivePollerTokens(channels.resolveTelegramChannels(cfg.telegram)).map((c) => c.botToken);
73
+ const tokens = channels.interactivePollerTokens(channels.resolveTelegramChannels({ ...cfg.telegram, botToken: mainToken })).map((c) => c.botToken);
61
74
  const held = new Map<string, () => void>();
62
75
  const refusedBotIds: string[] = [];
63
76
  const late: NexusTelegramQaPollerWireHandle[] = [];
64
77
  for (const token of tokens) {
65
- const r = await lock.acquireTelegramPollLock(token, 'telegram-run');
78
+ const r = await (pollLockForTesting?.acquire ?? lock.acquireTelegramPollLock)(token, 'telegram-run');
66
79
  if (r.ok) held.set(token, r.release);
67
80
  else refusedBotIds.push(lock.telegramBotId(token));
68
81
  }
@@ -79,7 +92,7 @@ export async function startTelegramPollers(): Promise<TelegramRunResult> {
79
92
  return release ? { ok: true, release } : { ok: false };
80
93
  },
81
94
  // 처음에 못 잡은 토큰 — 잡힐 때까지 되풀이한다(넥서스가 놓는 순간 이어받는다).
82
- acquire: (token) => retryingAcquire(() => lock.acquireTelegramPollLock(token, 'telegram-run'), {
95
+ acquire: (token) => (pollLockForTesting?.retry ?? retryingAcquire)(() => lock.acquireTelegramPollLock(token, 'telegram-run'), {
83
96
  onRetry: (attempt) => { if (attempt === 1 || attempt % 20 === 0) debug.log('telegram.run', 'late-acquire-retry', { botId: lock.telegramBotId(token), attempt }); },
84
97
  }),
85
98
  },
package/src/telegram.ts CHANGED
@@ -25,6 +25,7 @@ import { randomUUID } from 'node:crypto';
25
25
  import { buildTurnOutputTextBlocks } from './input/turn-output-block.js';
26
26
  import { selectTurnOutputTextForSink } from './input/turn-output-sink-registry.js';
27
27
  import { debug } from './debug/log.js';
28
+ import { resolveChannelBotToken } from './channel-bot-token.js';
28
29
  import type { TelegramVoiceAdapter } from './voice/channel-adapters/telegram-voice-adapter.js';
29
30
  import { createTelegramSurfaceHitl, type TelegramSurfaceHitl } from './hitl/telegram-surface-hitl.js';
30
31
  import { beginCancelableTurn, endCancelableTurn, cancelAcpTurn } from './acp/turn-runner.js';
@@ -63,6 +64,9 @@ import { selfToolArgHint } from './telegram-exec-footer.js';
63
64
  import { detectUrlRoute, type UrlRouteDecision } from './skills/url-router.js';
64
65
  import { observeDevRequestRouteFailSoft } from './skills/dev-request-router.js';
65
66
  import { runUrlRoute } from './skills/url-route-exec.js';
67
+ import { recordRoutedLinkAbsorbed } from './intake-plane/link-ledger.js';
68
+ import { classifyFrontInput } from './intake-plane/front-classifier.js';
69
+ import { effectiveInstanceRoot } from './instance/resolve.js';
66
70
 
67
71
  export type TgAttachmentKind = 'photo' | 'voice' | 'audio' | 'document';
68
72
 
@@ -220,6 +224,7 @@ const DEFAULT_ERROR_BACKOFF = 5000;
220
224
  const DEFAULT_PER_CHAT_GAP_MS = 900;
221
225
  const DEFAULT_GLOBAL_MAX_PER_SEC = 28;
222
226
  const DEFAULT_STREAM_EDIT_GAP_MS = 1100;
227
+ const EMPTY_ALLOWLIST_NOTICE_GAP_MS = 10 * 60 * 1000;
223
228
  // A turn slower than this delivers its result as FRESH messages (which
224
229
  // push-notify) instead of a silent placeholder edit — so a long /cc job
225
230
  // or HITL-approved task the user walked away from actually pings them.
@@ -280,6 +285,7 @@ export class TelegramBot {
280
285
  * means no recent send. Telegram's documented limit is 1 msg/sec
281
286
  * per chat — we enforce 900ms to leave jitter slack. */
282
287
  private readonly chatLastSentAt = new Map<number, number>();
288
+ private readonly emptyAllowlistNoticeAt = new Map<number, number>();
283
289
  /** T2-P6 — callback_query subscribers. When any is registered the
284
290
  * getUpdates poller also asks for callback_query updates so
285
291
  * inline-keyboard taps reach a handler. */
@@ -341,6 +347,33 @@ export class TelegramBot {
341
347
  }
342
348
  }
343
349
 
350
+ private isOwnerAllowed(userId: number): boolean {
351
+ return this.allowedUsers.size > 0 && this.allowedUsers.has(userId);
352
+ }
353
+
354
+ private async refuseMessage(ctx: TgIncoming): Promise<void> {
355
+ const empty = this.allowedUsers.size === 0;
356
+ debug.log('telegram.owner-gate', 'refused', {
357
+ kind: 'message', reason: empty ? 'empty-allowlist' : 'not-allowed', userId: ctx.userId,
358
+ });
359
+ if (!empty) this.log(`telegram: refusing unknown user ${ctx.userId}`);
360
+ if (empty) {
361
+ const now = this.nowImpl();
362
+ const previous = this.emptyAllowlistNoticeAt.get(ctx.chatId);
363
+ if (previous !== undefined && now - previous < EMPTY_ALLOWLIST_NOTICE_GAP_MS) return;
364
+ this.emptyAllowlistNoticeAt.set(ctx.chatId, now);
365
+ }
366
+ try {
367
+ await this.sendMessage(
368
+ ctx.chatId,
369
+ empty
370
+ ? `이 봇은 아직 소유자가 정해지지 않았습니다. 당신의 사용자 ID 는 ${ctx.userId} 입니다 — 기계에서 \`elanous config set telegram.allowedUsers '[${ctx.userId}]'\` 로 등록하면 쓸 수 있습니다.`
371
+ : 'This bot is private. Your user ID is not on the allowlist.',
372
+ { replyTo: ctx.messageId, threadId: ctx.threadId },
373
+ );
374
+ } catch { /* swallow — refusal must not enter the turn */ }
375
+ }
376
+
344
377
  private apiUrl(method: string): string {
345
378
  return `https://api.telegram.org/bot${this.token}/${method}`;
346
379
  }
@@ -564,7 +597,7 @@ export class TelegramBot {
564
597
  });
565
598
  }
566
599
 
567
- /** §C5-enh reactions-as-status — 사용자 메시지에 이모지 리액션(👀 큐 → ✅/❌). 편집보다 저비용
600
+ /** §C5-enh reactions-as-status — 사용자 메시지에 이모지 리액션(👀 큐 → 👍/👎). 편집보다 저비용
568
601
  * 상태채널(hermes/openclaw 선례). emoji=null 이면 리액션 제거. Bot API 7.0+ setMessageReaction.
569
602
  * fail-soft(리액션 실패가 배달을 막지 않음). */
570
603
  async setMessageReaction(chatId: number, messageId: number, emoji: string | null): Promise<void> {
@@ -919,7 +952,7 @@ export class TelegramBot {
919
952
  * slash command resolves the capture with `null` (cancel). */
920
953
  private tryConsumeTextCapture(ctx: TgIncoming): boolean {
921
954
  if (!ctx.text || ctx.attachments.length > 0) return false;
922
- if (this.allowedUsers.size > 0 && !this.allowedUsers.has(ctx.userId)) return false;
955
+ if (!this.isOwnerAllowed(ctx.userId)) return false;
923
956
  const key = `${ctx.chatId}:${ctx.threadId ?? ''}`;
924
957
  const capture = this.pendingTextCaptures.get(key);
925
958
  if (!capture) return false;
@@ -1034,6 +1067,7 @@ export class TelegramBot {
1034
1067
  async start(): Promise<void> {
1035
1068
  this.running = true;
1036
1069
  this.log(`telegram bot starting (allowlist size ${this.allowedUsers.size})`);
1070
+ if (this.allowedUsers.size === 0) this.log('telegram.owner-gate empty-allowlist');
1037
1071
 
1038
1072
  // Publish the slash-command menu to Telegram. Clients pick up the
1039
1073
  // update automatically next time they open the chat — no user-side
@@ -1091,6 +1125,13 @@ export class TelegramBot {
1091
1125
  // parser.
1092
1126
  if (u.callback_query) {
1093
1127
  const cq = u.callback_query;
1128
+ if (!this.isOwnerAllowed(cq.from.id)) {
1129
+ debug.log('telegram.owner-gate', 'refused', {
1130
+ kind: 'callback', reason: this.allowedUsers.size === 0 ? 'empty-allowlist' : 'not-allowed', userId: cq.from.id,
1131
+ });
1132
+ await this.answerCallbackQuery(cq.id, { text: '권한이 없습니다' });
1133
+ continue;
1134
+ }
1094
1135
  const payload: TgCallbackQuery = {
1095
1136
  id: cq.id,
1096
1137
  userId: cq.from.id,
@@ -1110,6 +1151,13 @@ export class TelegramBot {
1110
1151
  // (UX 에이전트 NORMALIZE). No `message`/`text`, so handle before the parser.
1111
1152
  if (u.message_reaction) {
1112
1153
  const mr = u.message_reaction;
1154
+ // 리액션도 미션 카드 흐름을 앞으로 민다(ux-reaction-router) — 소유자 것만 받는다. 익명(user 없음)은 거절.
1155
+ if (!mr.user || !this.isOwnerAllowed(mr.user.id)) {
1156
+ debug.log('telegram.owner-gate', 'refused', {
1157
+ kind: 'reaction', reason: this.allowedUsers.size === 0 ? 'empty-allowlist' : mr.user ? 'not-allowed' : 'anonymous', userId: mr.user?.id,
1158
+ });
1159
+ continue;
1160
+ }
1113
1161
  const payload: TgMessageReaction = {
1114
1162
  chatId: mr.chat.id,
1115
1163
  messageId: mr.message_id,
@@ -1129,6 +1177,10 @@ export class TelegramBot {
1129
1177
  // scoped per channel — a private chat's chatId is the same user
1130
1178
  // id across every bot, so without this two bots' DMs merge.
1131
1179
  incoming.botId = this.botId;
1180
+ if (!this.isOwnerAllowed(incoming.userId)) {
1181
+ await this.refuseMessage(incoming);
1182
+ continue;
1183
+ }
1132
1184
  // HITL "Other" free-text: consume inline (before the turn
1133
1185
  // chain) so it isn't queued behind the turn awaiting it.
1134
1186
  if (this.tryConsumeTextCapture(incoming)) continue;
@@ -1250,10 +1302,19 @@ export class TelegramBot {
1250
1302
  const typingTimer = setInterval(typing, 4000);
1251
1303
 
1252
1304
  let posted = 0;
1305
+ let recorded = false;
1253
1306
  let result: Awaited<ReturnType<typeof runUrlRoute>>;
1254
1307
  try {
1255
1308
  result = await runUrlRoute(dec, {
1256
- onStageDone: async (_kind, text) => {
1309
+ onStageDone: async (kind, text, meta) => {
1310
+ if (!recorded && (kind === 'detailed' || kind === 'absorb') && meta.obsidianPath) {
1311
+ recorded = true;
1312
+ try {
1313
+ recordRoutedLinkAbsorbed(effectiveInstanceRoot(), {
1314
+ source: 'telegram-bot', url: dec.url, notePath: meta.obsidianPath,
1315
+ });
1316
+ } catch { /* instance root lookup is best-effort too */ }
1317
+ }
1257
1318
  const t = (text ?? '').trim();
1258
1319
  if (!t) return;
1259
1320
  // ★ 공개 URL → 클릭 가능한 링크. legacy markdown 은 URL 내 `_` 를 이탤릭으로 파싱해 raw URL 이
@@ -1287,6 +1348,10 @@ export class TelegramBot {
1287
1348
  }
1288
1349
 
1289
1350
  private async handleIncoming(ctx: TgIncoming): Promise<void> {
1351
+ if (!this.isOwnerAllowed(ctx.userId)) {
1352
+ await this.refuseMessage(ctx);
1353
+ return;
1354
+ }
1290
1355
  // Cascade-zyu U2 — capture utterance intent at update ingress.
1291
1356
  try {
1292
1357
  const { userIntentLogger } = await import('./user-intent/index.js');
@@ -1301,18 +1366,6 @@ export class TelegramBot {
1301
1366
  });
1302
1367
  } catch { /* logging must never break the chat path */ }
1303
1368
 
1304
- if (this.allowedUsers.size > 0 && !this.allowedUsers.has(ctx.userId)) {
1305
- this.log(`telegram: refusing unknown user ${ctx.userId}`);
1306
- try {
1307
- await this.sendMessage(
1308
- ctx.chatId,
1309
- 'This bot is private. Your user ID is not on the allowlist.',
1310
- { replyTo: ctx.messageId, threadId: ctx.threadId },
1311
- );
1312
- } catch { /* swallow — we already logged */ }
1313
- return;
1314
- }
1315
-
1316
1369
  // ★ 미션 언급 추적(맥락-인지 revise·대표 2026-07-14) — 이 메시지가 apm_id 를 언급하면 이 방의
1317
1370
  // "최근 논의 미션"으로 기록. 이후 id 없는 "개정해줘"가 이 미션을 recency 보다 우선 채택하도록.
1318
1371
  if (ctx.text && ctx.text.includes('apm_')) {
@@ -1322,6 +1375,19 @@ export class TelegramBot {
1322
1375
  } catch { /* fail-soft */ }
1323
1376
  }
1324
1377
 
1378
+ // Explicit directive ingress precedes mission/HITL text interceptors.
1379
+ if (ctx.text.startsWith('지시:') || ctx.text.startsWith('/directive ')) {
1380
+ try {
1381
+ const { addDirective } = await import('./steward/directive.js');
1382
+ const text = ctx.text.startsWith('지시:') ? ctx.text.slice('지시:'.length) : ctx.text.slice('/directive '.length);
1383
+ const result = await addDirective(text, { source: 'telegram' });
1384
+ await this.sendMessage(ctx.chatId, `${result.issue}: ${result.status}`, { replyTo: ctx.messageId, threadId: ctx.threadId });
1385
+ } catch {
1386
+ await this.sendMessage(ctx.chatId, '지시 등록 실패 — Linear 연결과 자격을 확인하세요.', { replyTo: ctx.messageId, threadId: ctx.threadId });
1387
+ }
1388
+ return;
1389
+ }
1390
+
1325
1391
  // ★ 미션 정정 답장 가로채기(force_reply·대표 2026-07-12) — reply_to 가 정정요청이면
1326
1392
  // runTurn(Q&A) 대신 재분해로. dynamic import 로 autopilot 결합 최소·fail-soft.
1327
1393
  if (ctx.replyToText && ctx.text.trim()) {
@@ -1632,6 +1698,9 @@ export class TelegramBot {
1632
1698
  ? getActiveDelegation(delegationChatKey(this.botId, ctx.chatId, ctx.threadId))
1633
1699
  : null;
1634
1700
  if (!activeDeleg) {
1701
+ try {
1702
+ classifyFrontInput({ text: ctx.text, surface: 'telegram' }, { urlRouting: getUserConfig().skills.urlRouting });
1703
+ } catch { /* observation must not interrupt URL routing */ }
1635
1704
  const urlDec = detectUrlRoute(ctx.text, getUserConfig().skills.urlRouting);
1636
1705
  if (urlDec) {
1637
1706
  const handled = await this.runUrlRouteReply(ctx, urlDec);
@@ -1656,8 +1725,9 @@ export class TelegramBot {
1656
1725
  debug.log('telegram.deliver', 'route', {
1657
1726
  chatId: ctx.chatId, path: streamingFlip ? 'flip-fanout' : 'legacy', streamingCfgOn, daemonBound: daemonBoundForFlip,
1658
1727
  });
1659
- // §C5-enh reactions-as-status — 턴 시작 👀(저비용 상태채널). 완료 ✅ / 실패 ❌ 는 아래. fail-soft.
1660
- const reactionsOn = getUserConfig().sessionFabric?.telegram?.reactions === true;
1728
+ // §C5-enh reactions-as-status — 턴 시작 👀(저비용 상태채널). 종료 👍/👎는 Bot API 허용 집합에 따른다.
1729
+ // https://core.telegram.org/bots/api#reactiontypeemoji — ✅/❌는 ReactionTypeEmoji에 없다.
1730
+ const reactionsOn = true;
1661
1731
  debug.log('telegram.deliver', 'reaction', { chatId: ctx.chatId, phase: 'start', emoji: '👀', on: reactionsOn });
1662
1732
  if (reactionsOn && ctx.messageId != null) void this.setMessageReaction(ctx.chatId, ctx.messageId, '👀');
1663
1733
 
@@ -1835,15 +1905,14 @@ export class TelegramBot {
1835
1905
  } else {
1836
1906
  debug.log('telegram.deliver', 'flip-suppress-legacy', { chatId: ctx.chatId, chars: reply.length });
1837
1907
  }
1838
- // §C5-enh reactions — 완료 👍. ⚠️ 텔레그램은 리액션 이모지가 제한 세트(✅/❌ 불가·REACTION_INVALID)
1839
- // → 유효 이모지(👀/👍/👎/🎉/😢…) 사용. fail-soft.
1908
+ // §C5-enh reactions — 완료 👍 (Bot API ReactionTypeEmoji). fail-soft.
1840
1909
  debug.log('telegram.deliver', 'reaction', { chatId: ctx.chatId, phase: 'done', emoji: '👍', on: reactionsOn });
1841
1910
  if (reactionsOn && ctx.messageId != null) void this.setMessageReaction(ctx.chatId, ctx.messageId, '👍');
1842
1911
  recordStreamingSlashHandled('completed');
1843
1912
  } catch (err: any) {
1844
1913
  streamer?.flushCancel();
1845
1914
  recordStreamingSlashHandled(streamingSlashResult ?? 'post-processing-failed');
1846
- // §C5-enh reactions — 실패 👎(텔레그램 유효 세트).
1915
+ // §C5-enh reactions — 실패 👎 (Bot API ReactionTypeEmoji).
1847
1916
  debug.log('telegram.deliver', 'reaction', { chatId: ctx.chatId, phase: 'fail', emoji: '👎', on: reactionsOn });
1848
1917
  if (reactionsOn && ctx.messageId != null) void this.setMessageReaction(ctx.chatId, ctx.messageId, '👎');
1849
1918
  this.log(`telegram handler error: ${err?.message ?? String(err)}`);
@@ -2302,7 +2371,8 @@ export interface BotDaemonBridge {
2302
2371
  export function botFromConfig(opts: BotFromConfigOpts): TelegramBot {
2303
2372
  const tg = opts.userConfig.telegram;
2304
2373
  if (!tg.enabled) throw new Error('telegram disabled in user-config');
2305
- if (!tg.botToken) throw new Error('telegram.botToken missing in user-config');
2374
+ const botToken = opts.telegramBotOpts?.token ?? resolveChannelBotToken('telegram', opts.userConfig)?.token;
2375
+ if (!botToken) throw new Error('telegram.botToken missing in user-config');
2306
2376
  const log = opts.log ?? (() => {});
2307
2377
  const cap = opts.maxAttachments ?? 8;
2308
2378
  const runTurnImpl = opts.runTurnImpl ?? runTurn;
@@ -2603,7 +2673,7 @@ export function botFromConfig(opts: BotFromConfigOpts): TelegramBot {
2603
2673
  const voiceAdapter = buildTelegramVoiceAdapterFromConfig(opts.userConfig, opts.log);
2604
2674
 
2605
2675
  botRef = new TelegramBot({
2606
- token: tg.botToken,
2676
+ token: botToken,
2607
2677
  allowedUsers: tg.allowedUsers,
2608
2678
  homeChannel: tg.homeChannel,
2609
2679
  onMessage: handler,