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
@@ -28,6 +28,10 @@ import {
28
28
  import { nexusLockPath, nexusRuntimePath, nexusRootDir } from './paths.js';
29
29
  import { createPwaRegistration, type PwaRegistrationDeps } from './pwa-registration.js';
30
30
  import { resolveCurrentInstance } from '../instance/current.js';
31
+ import { effectiveInstanceRoot } from '../instance/resolve.js';
32
+ import { startPortLeaseHeartbeat } from '../control-plane/port-lease-heartbeat.js';
33
+ import { PORT_BANDS } from '../control-plane/ports.js';
34
+ import { DEFAULT_NEXUS_HTTP_PORT } from './default-port.js';
31
35
  import { createNexusState } from './state/state.js';
32
36
  import { TabRegistry } from './state/tab-registry.js';
33
37
  import { createChatTabSpec } from './kinds/chat.js';
@@ -71,7 +75,7 @@ import { registerAllCloudBackends } from './config/secrets/register-cloud.js';
71
75
  // → nexus/webterm/pty.ts 통합. `MiniTerminal` class + `createMiniTermSpawn`
72
76
  // 은 TUI-only 였고 T4 이후 dead → 정리. `PtyBackend` + `createWebtermSpawn`
73
77
  // 만 살아남아 iOS/PWA webterm 의 PTY substrate 로 사용.
74
- import { type PtyBackend, createWebtermSpawn } from './webterm/pty.js';
78
+ import { type PtyBackend, createWebtermSpawn, resolveWebtermCwd } from './webterm/pty.js';
75
79
  import { SettingsTabController } from './config/settings-controller.js';
76
80
  import { tryRegisterSettings } from './boot/register-settings.js';
77
81
  import { registerMcpClients, type McpClientsHandle } from './boot/register-mcp-clients.js';
@@ -104,6 +108,9 @@ import {
104
108
  import { discoverWorkflows as discoverWorkflowsForDaemon } from '../workflow-runtime/discovery.js';
105
109
  import { buildDefaultWorkflowDeps as buildWorkflowDaemonDeps } from './api/workflows.js';
106
110
  import { startNexusHttpServer, type NexusHttpServer, type NexusWsBridgeInit } from './api/http-server.js';
111
+ import { startControlServer } from '../control-plane/server.js';
112
+ import { nexusMemberMachine, startMemberHeartbeat } from '../control-plane/member.js';
113
+ import { resolvePrimary } from '../control-plane/primary.js';
107
114
  import { cleanGhostTailscaleServe } from '../cli/tailscale-serve.js';
108
115
  import { buildNextFluentRouteOpts } from './api/next-fluent-wiring.js';
109
116
  import { bootDefaultOcrProviders, type OcrRegistry } from '../ocr/index.js';
@@ -208,6 +215,7 @@ import { fetchCodexPlugins } from '../acp/codex-plugins.js';
208
215
  import { globalAgentCliConversationStore } from './api/agent-cli-conversation-store.js';
209
216
  import { globalMissionRouter } from '../llm/mission-router.js';
210
217
  import { getUserConfig, type UserConfig } from '../user-config.js';
218
+ import { resolveChannelBotToken } from '../channel-bot-token.js';
211
219
  import { debug } from '../debug/log.js';
212
220
  import { createNotificationActionLoopback } from '../web-push/notification-action-loopback.js';
213
221
  import {
@@ -218,7 +226,8 @@ import type {
218
226
  AcpConnectionHandler,
219
227
  AcpTransportServer,
220
228
  } from '../acp/transport/types.js';
221
- import { createAuthVerifier, type AcpAuthTokenRecord } from '../acp/transport/auth.js';
229
+ import { createAuthVerifier, type AcpAuthTokenRecord, type AcpAuthVerifier } from '../acp/transport/auth.js';
230
+ import { matchTempToken } from '../auth/temp-tokens.js';
222
231
  import { loadEnvelope, type TokenStoreEnvelope, type TokenStorePaths } from '../auth/token-store.js';
223
232
  import {
224
233
  createVoiceRestHandler,
@@ -237,7 +246,7 @@ import type { HealthProbeBackend } from './supervisor/health.js';
237
246
  import { gracefulExit, cleanExit } from './supervisor/graceful-exit.js';
238
247
  import { restoreFromPending } from './supervisor/restore-state.js';
239
248
  import { resolveHeadlessMode } from './headless-mode.js';
240
- import { checkSetupStatus, renderSetupStatus } from './setup-status.js';
249
+ import { checkSetupStatus, readNexusSetupMode, renderSetupStatus, setupBootMode, setupModeBootPlan } from './setup-status.js';
241
250
  import { probeTailscale } from './onboarding/tailscale-probe.js';
242
251
  import {
243
252
  runPwaSharePrompt,
@@ -248,6 +257,9 @@ import { runFirstBootWizard } from './onboarding/first-boot-wizard.js';
248
257
  // Phase 2 of RESEARCH-tox-surface-agnostic-boot-2026-05-13 — surface-
249
258
  // agnostic TOX bootstrap + subagent surface bridge to globalAgentRegistry.
250
259
  import { wireTox, type ToxBootHandle } from '../task-orchestrator/boot.js';
260
+ import { createExternalExecAdapter } from '../task-orchestrator/surfaces/external-exec.js';
261
+ import { dispatchSelfImplement } from '../boot/daemon-tools/self-implement.js';
262
+ import { TaskStore, hydrateGraph } from '../task-orchestrator/store.js';
251
263
  import { createGlobalSubagentCallable } from '../agent/subagent-callable.js';
252
264
  import { setAgentHopCap } from '../agent/registry.js';
253
265
  import type { SidebarTabSurface } from '../ui/widgets/sidebar-tab-surface.js';
@@ -285,11 +297,10 @@ export function wireNexusTelegramQaPollers(
285
297
  deps: NexusTelegramQaPollerWireDeps,
286
298
  ): NexusTelegramQaPollerWireHandle[] {
287
299
  const handles: NexusTelegramQaPollerWireHandle[] = [];
288
- const pollers = deps.interactivePollerTokens(deps.resolveTelegramChannels(cfg.telegram));
300
+ const mainToken = resolveChannelBotToken('telegram', cfg)?.token;
301
+ const pollers = deps.interactivePollerTokens(deps.resolveTelegramChannels({ ...cfg.telegram, botToken: mainToken }));
289
302
  for (const channelConfig of pollers) {
290
- const channelScopedConfig = channelConfig.botToken === cfg.telegram.botToken
291
- ? cfg
292
- : { ...cfg, telegram: { ...cfg.telegram, botToken: channelConfig.botToken } };
303
+ const channelScopedConfig = { ...cfg, telegram: { ...cfg.telegram, botToken: channelConfig.botToken } };
293
304
  const start = (release?: () => void): NexusTelegramQaPollerWireHandle | null => {
294
305
  const handle = deps.createTriggerBot({
295
306
  token: channelConfig.botToken,
@@ -392,6 +403,8 @@ export interface RunNexusOptions {
392
403
  skipHttpServer?: boolean;
393
404
  /** Override starting port for the HTTP server. Defaults to 31415. */
394
405
  httpStartPort?: number;
406
+ /** Control-plane port; passing 0 also enables an isolated listener in detached tests. */
407
+ controlPort?: number;
395
408
  /** Override host for the HTTP server. Defaults to '127.0.0.1'. */
396
409
  httpHost?: string;
397
410
  /** Test seam for the best-effort stale Tailscale Serve cleanup before bind. */
@@ -551,6 +564,8 @@ export interface RunNexusOptions {
551
564
  mountShareIfEnabledFn?: (opts: { httpPort: number }) => Promise<import('../cli/share-auto-mount.js').ShareMountResult>;
552
565
  /** Test-only replacement for the headless Tailscale Serve unmount on shutdown. */
553
566
  pwaShareDisableFn?: typeof import('../cli/pwa-share.js').pwaShareDisable;
567
+ /** Test-only share reconciliation cadence; production checks every 60 seconds. */
568
+ shareCoordinatorIntervalMsForTesting?: number;
554
569
  /** Test-only completion signal that lets the real headless branch exit without a process signal. */
555
570
  headlessDoneForTesting?: Promise<void>;
556
571
  /** Skip the interactive setup prerequisite only while exercising the real headless branch in tests. */
@@ -699,10 +714,45 @@ export function buildNexusWsBridgeAuth(
699
714
  if (!bearerToken) return {};
700
715
  return {
701
716
  // ⭐ 배열이 아니라 «공급자» — 매 핸드셰이크마다 봉투를 다시 읽는다.
702
- wsAuthVerifier: createAuthVerifier(() => acceptedAcpTokens(bearerToken, paths)),
717
+ wsAuthVerifier: withTempTokens(createAuthVerifier(() => acceptedAcpTokens(bearerToken, paths)), paths?.configDir),
703
718
  };
704
719
  }
705
720
 
721
+ /** 단기 소유자 토큰(`elanous token issue`)도 ACP 웹소켓에서 받는다 — 기존 검증이 거부할 때만 해시·만료로 한 번 더 본다. */
722
+ function withTempTokens(base: AcpAuthVerifier, dir?: string): AcpAuthVerifier {
723
+ return {
724
+ verify(raw) {
725
+ const first = base.verify(raw);
726
+ if (first.ok) return first;
727
+ const token = (raw as { token?: unknown } | null)?.token;
728
+ return typeof token === 'string' && matchTempToken(token, dir ? { dir } : {}) ? { ok: true } : first;
729
+ },
730
+ };
731
+ }
732
+
733
+ /**
734
+ * 관제부가 준 포트 임대(`ELANOUS_TEST_COORDINATOR_LEASE_PORT`)로 뜨는 자식이 «그 포트로만» 뜨는지 Nexus 락을 잡기 «전»에 확인한다.
735
+ * 임대가 없으면 undefined, 있으면 그 포트를 돌려준다 — 조건이 하나라도 어긋나면 throw.
736
+ */
737
+ export function checkLauncherLeaseBoot(
738
+ opts: Pick<RunNexusOptions, 'httpStartPort' | 'skipHttpServer' | 'detachForTesting'>,
739
+ env: NodeJS.ProcessEnv,
740
+ instanceKind: () => string,
741
+ ): number | undefined {
742
+ const launcherLease = env.ELANOUS_TEST_COORDINATOR_LEASE_PORT;
743
+ if (launcherLease === undefined) return undefined;
744
+ const leasePort = Number(launcherLease);
745
+ if (!env.ELANOUS_TEST_COORDINATOR_LEASE_ID?.trim()) throw new Error('missing coordinator lease id');
746
+ if (instanceKind() !== 'test' ||
747
+ !Number.isInteger(leasePort) ||
748
+ leasePort < PORT_BANDS.test.start || leasePort > PORT_BANDS.test.end ||
749
+ opts.httpStartPort !== leasePort ||
750
+ (opts.skipHttpServer ?? !!opts.detachForTesting)) {
751
+ throw new Error('coordinator port lease boot mismatch');
752
+ }
753
+ return leasePort;
754
+ }
755
+
706
756
  export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHandle | undefined> {
707
757
  if (opts.status) {
708
758
  await printStatus();
@@ -713,6 +763,8 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
713
763
  return undefined;
714
764
  }
715
765
 
766
+ const leasePortFromLauncher = checkLauncherLeaseBoot(opts, process.env, () => resolveCurrentInstance().kind);
767
+
716
768
  // 설치본 전환 RFC 0b — 키는 launchd plist 가 아니라 키 캐시에서(캐시 우선 · 자식도 물려받는다). 값은 안 찍고 «이름만».
717
769
  if (!opts.detachForTesting) {
718
770
  const { hydrateEnvFromKeyCache } = await import('../config.js');
@@ -723,13 +775,34 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
723
775
  const headless = resolveHeadlessMode({ ...(opts.headless !== undefined ? { headless: opts.headless } : {}) });
724
776
  if (headless && !opts.detachForTesting && !opts.skipHeadlessSetupCheckForTesting) {
725
777
  const setup = checkSetupStatus({ argvBin: process.argv[1] ?? '' });
726
- if (!setup.ok) {
778
+ const boot = setupBootMode(setup);
779
+ if (boot.mode === 'refuse') {
727
780
  console.error('✗ elanous nexus --headless: setup incomplete');
728
781
  renderSetupStatus(setup, console);
729
782
  console.log('');
730
783
  console.log(' Run `elanous nexus` (interactive) once to walk through the wizard.');
731
784
  process.exit(1);
732
785
  }
786
+ if (boot.mode === 'setup') {
787
+ process.env.ELANOUS_NEXUS_SETUP_MODE = '1';
788
+ const host = opts.httpHost ?? '127.0.0.1';
789
+ const port = opts.httpStartPort ?? DEFAULT_NEXUS_HTTP_PORT;
790
+ console.log(`셋업 모드로 떴습니다 — 브라우저로 셋업: http://${host}:${port}/app/setup/ (빠진 것: ${boot.missing.join(', ')})`);
791
+ }
792
+ }
793
+
794
+ // 기동 때 한 번. 요청마다 다시 읽지 않고 이 값을 탭·크론·health 에 넘긴다.
795
+ // 셋업이 채워진 뒤 정상 모드로 넘어가는 것은 재시작 한 번이다 — 자동 전환은 짓지 않는다.
796
+ const nexusSetup = readNexusSetupMode(process.env);
797
+ const setupPlan = setupModeBootPlan(nexusSetup.setupMode);
798
+ debug.log('nexus.boot', 'setup-mode-plan', {
799
+ setupMode: nexusSetup.setupMode,
800
+ setupMissing: nexusSetup.setupMissing,
801
+ skipTabKinds: setupPlan.skipTabKinds,
802
+ skipCrons: setupPlan.skipCrons,
803
+ });
804
+ if (nexusSetup.setupMode) {
805
+ console.log('셋업 모드 — 채널 봇·크론은 셋업 뒤 재시작 때 켜진다');
733
806
  }
734
807
 
735
808
  // #24 — 이벤트루프 stall watchdog(2026-07-21). 데몬 메인스레드가 무한루프로 굶으면(telegram 폴링
@@ -816,6 +889,9 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
816
889
  return run;
817
890
  };
818
891
 
892
+ let stopCoordinatorLease: (() => Promise<void>) | undefined;
893
+ let leaseReleasePending: Promise<void> | undefined;
894
+
819
895
  let release: () => void;
820
896
  try {
821
897
  release = acquireNexusLock({ label: 'nexus', ...(opts.force ? { force: true } : {}) });
@@ -839,6 +915,22 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
839
915
  throw err;
840
916
  }
841
917
 
918
+ if (leasePortFromLauncher !== undefined) {
919
+ try {
920
+ stopCoordinatorLease = await startPortLeaseHeartbeat(leasePortFromLauncher, process.env.ELANOUS_TEST_COORDINATOR_LEASE_ID!, {
921
+ ...(process.env.ELANOUS_TEST_COORDINATOR_LEASE_TOKEN ? { token: process.env.ELANOUS_TEST_COORDINATOR_LEASE_TOKEN } : {}),
922
+ onError: error => debug.log('control.port-lease', 'renew-failed', { port: leasePortFromLauncher, reason: error.message }, { level: 'warn' }),
923
+ onLeaseLost: error => {
924
+ try { debug.log('control.port-lease', 'lease-lost', { port: leasePortFromLauncher, reason: error.message }, { level: 'error' }); }
925
+ finally { process.exit(1); }
926
+ },
927
+ });
928
+ } catch (error) {
929
+ release();
930
+ throw error;
931
+ }
932
+ }
933
+
842
934
  const startedAt = new Date().toISOString();
843
935
  const runtime: NexusRuntimeMeta = {
844
936
  pid: process.pid,
@@ -886,13 +978,11 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
886
978
  gateOpen: scopedMod.hotPathGateOpen(startLevel), surface: 'nexus',
887
979
  });
888
980
  dbgMod.debug.setFileEnabled(dbgCfg.file);
889
- // OH9 — 렌더 무음 시드(레벨 직교). 데몬은 uiMode 가 없으므로
890
- // essential=false(기본 비억제) — level.json.render 명시 또는
981
+ // OH9 — 렌더 무음 시드(레벨 직교). 데몬은 기본 비억제 — level.json.render 명시 또는
891
982
  // config.debug.renderLogs 만 억제/override 를 결정한다.
892
983
  dbgMod.debug.setRenderSuppressed(scopedMod.resolveRenderSuppressed({
893
984
  scopedRender: scopedMod.readScopedRenderLogs(),
894
985
  configRenderLogs: dbgCfg.renderLogs,
895
- uiModeEssential: false,
896
986
  }));
897
987
  if (dbgCfg.file) {
898
988
  console.log(`debug: level=${dbgMod.debug.level()} file: ${dbgMod.debug.path()}`);
@@ -1116,6 +1206,18 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
1116
1206
 
1117
1207
  const skipHttp = opts.skipHttpServer ?? !!opts.detachForTesting;
1118
1208
  let httpServer: NexusHttpServer | undefined;
1209
+ let stopMemberHeartbeat: (() => void) | undefined;
1210
+ // ⛔ 관제부는 운영 넥서스와 «별도 프로세스»다(RFC 관제 평면 A2 · P0 골 경계) — 넥서스는 기본으로 띄우지 않는다.
1211
+ // 🩸 2026-09-27: 넥서스 부팅이 31413 을 늘 잡고 실패하면 throw 해서, 운영이 31413 을 쥔 뒤엔 모든 격리 데몬(`nexus run --test`)이
1212
+ // 부팅에서 죽을 뻔했다. 명시(`controlPort`)일 때만 띄우고, 실패해도 넥서스 부팅은 막지 않는다(관측만).
1213
+ let controlServer: ReturnType<typeof startControlServer> | undefined;
1214
+ if (opts.controlPort !== undefined) {
1215
+ try {
1216
+ controlServer = startControlServer({ port: opts.controlPort });
1217
+ } catch (err) {
1218
+ debug.log('control.server', 'start-failed-in-nexus', { port: opts.controlPort, reason: (err as Error).message }, { level: 'warn' });
1219
+ }
1220
+ }
1119
1221
  // Surface-unification v2.1 FU-3 (2026-05-11) — workflow-runtime
1120
1222
  // daemon. Owns trigger source lifecycle (schedule/webhook/discord/
1121
1223
  // telegram/chat). Schedule + webhook + chat fire from in-process
@@ -1128,6 +1230,7 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
1128
1230
  // (PWA Intake, iPhone, ACP, MCP, future). Disposed in the shutdown
1129
1231
  // hook below.
1130
1232
  let toxHandle: ToxBootHandle | undefined;
1233
+ let toxStore: TaskStore | undefined;
1131
1234
  // §5-③ — autonomous idle-continuation scheduler. Only constructed when
1132
1235
  // `dispatch.enabled` is set (default off); stopped in the shutdown hook.
1133
1236
  let continuationScheduler: import('../dispatch/continuation-scheduler.js').ContinuationScheduler | undefined;
@@ -1822,7 +1925,16 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
1822
1925
  if (!tab || tab.spec.kind !== 'webterm') return;
1823
1926
  const cwdMeta = (tab.spec.meta as { cwd?: string } | undefined)?.cwd;
1824
1927
  const backendFactory = effectiveWebtermSpawn
1825
- ? () => effectiveWebtermSpawn({ id: tab.spec.id, ...(cwdMeta ? { cwd: cwdMeta } : {}) })
1928
+ ? () => {
1929
+ const decided = resolveWebtermCwd({
1930
+ ...(cwdMeta ? { tabCwd: cwdMeta } : {}),
1931
+ ...(runtimeToolCwd ? { toolCwd: runtimeToolCwd } : {}),
1932
+ instance: resolveCurrentInstance(),
1933
+ processCwd: process.cwd(),
1934
+ });
1935
+ debug.log('nexus.webterm', 'spawn-cwd', { tabId: tab.spec.id, cwd: decided.cwd, source: decided.source });
1936
+ return effectiveWebtermSpawn({ id: tab.spec.id, cwd: decided.cwd });
1937
+ }
1826
1938
  : undefined;
1827
1939
  const session = new NexusWebtermSession({
1828
1940
  ...(backendFactory ? { spawn: backendFactory } : {}),
@@ -1873,7 +1985,7 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
1873
1985
 
1874
1986
  if (!skipHttp) {
1875
1987
  const httpHost = opts.httpHost ?? '127.0.0.1';
1876
- const httpStartPort = opts.httpStartPort ?? 31415;
1988
+ const httpStartPort = opts.httpStartPort ?? DEFAULT_NEXUS_HTTP_PORT;
1877
1989
  const editInPwaCtx = {
1878
1990
  signingKey: editInPwaSigningKey,
1879
1991
  nonceStore: editInPwaNonceStore,
@@ -1928,34 +2040,32 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
1928
2040
  const streamingStt = getDaemonStreamingSttProvider();
1929
2041
  const ttsProvider = getDaemonTtsProvider();
1930
2042
  if (streamingStt) {
1931
- const { createPwaVoiceAdapter, isPwaVoiceEnabled } =
2043
+ const { createPwaVoiceAdapter } =
1932
2044
  await import('../voice/channel-adapters/pwa-voice-adapter.js');
1933
- if (isPwaVoiceEnabled()) {
1934
- if (ttsProvider) {
1935
- const { createPwaTtsBridge } =
1936
- await import('../voice/voice-pwa-tts-bridge.js');
1937
- pwaTtsBridge = createPwaTtsBridge({ ttsProvider });
1938
- // FU-2 webterm wire — same instance the ACP server
1939
- // dereferences via the holder wrapper (line ~547).
1940
- // chat REST path uses local var below; both reach
1941
- // the same per-session bridge.
1942
- pwaTtsBridgeHolder.current = pwaTtsBridge;
1943
- }
1944
- const bridge = pwaTtsBridge;
1945
- realPwaAdapter = createPwaVoiceAdapter({
1946
- sttProvider: streamingStt,
1947
- onSessionOpen: (session) => {
1948
- if (bridge && session.sessionId && session.emitDownstream) {
1949
- const emit = session.emitDownstream.bind(session);
1950
- bridge.attach(session.sessionId, (frame) => emit(frame));
1951
- }
1952
- },
1953
- onSessionClose: (session) => {
1954
- if (bridge && session.sessionId) bridge.detach(session.sessionId);
1955
- },
1956
- });
1957
- console.log(`voice: NEXUS PWA WS adapter functional (streaming STT wired · TTS bridge ${bridge ? 'wired' : 'absent (no TTS provider)'})`);
2045
+ if (ttsProvider) {
2046
+ const { createPwaTtsBridge } =
2047
+ await import('../voice/voice-pwa-tts-bridge.js');
2048
+ pwaTtsBridge = createPwaTtsBridge({ ttsProvider });
2049
+ // FU-2 webterm wire — same instance the ACP server
2050
+ // dereferences via the holder wrapper (line ~547).
2051
+ // chat REST path uses local var below; both reach
2052
+ // the same per-session bridge.
2053
+ pwaTtsBridgeHolder.current = pwaTtsBridge;
1958
2054
  }
2055
+ const bridge = pwaTtsBridge;
2056
+ realPwaAdapter = createPwaVoiceAdapter({
2057
+ sttProvider: streamingStt,
2058
+ onSessionOpen: (session) => {
2059
+ if (bridge && session.sessionId && session.emitDownstream) {
2060
+ const emit = session.emitDownstream.bind(session);
2061
+ bridge.attach(session.sessionId, (frame) => emit(frame));
2062
+ }
2063
+ },
2064
+ onSessionClose: (session) => {
2065
+ if (bridge && session.sessionId) bridge.detach(session.sessionId);
2066
+ },
2067
+ });
2068
+ console.log(`voice: NEXUS PWA WS adapter functional (streaming STT wired · TTS bridge ${bridge ? 'wired' : 'absent (no TTS provider)'})`);
1959
2069
  } else {
1960
2070
  console.log('voice: NEXUS streaming STT inactive (set OPENAI_API_KEY for openai-realtime-stt) — voice WS will use stub adapter');
1961
2071
  }
@@ -2068,10 +2178,9 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
2068
2178
  // schedule-trigger nodes that register a TOX task on fire have a
2069
2179
  // live graph + dispatcher to land in. The `subagent` surface bridges
2070
2180
  // to `globalAgentRegistry` so `Agent`-tool spawns and TOX-driven
2071
- // subagent tasks share a single live registry. Other surface
2072
- // callables (skill / chatPrompt / vwSlot / acxSession / cron /
2073
- // terminalPane / llmDirect) stay unwired here — they land in
2074
- // follow-up PRs as each becomes load-bearing for production work.
2181
+ // subagent tasks share a single live registry. External llm-direct
2182
+ // tasks are triaged to current self-implement or the same subagent callable.
2183
+ // Other surface callables stay unwired here.
2075
2184
  try {
2076
2185
  // Wave 5 E3 — pick up `tools.agentSpawn.hopCap` from user-config
2077
2186
  // before any spawn can fire (the global registry reads the cap
@@ -2084,11 +2193,44 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
2084
2193
  setAgentHopCap(cap);
2085
2194
  }
2086
2195
  } catch { /* keep default cap */ }
2196
+ const agentToolSurface = toolSurface(resolveToolsKind(opts));
2197
+ const agentToolCwd = runtimeToolCwd ?? resolveToolCwd({ tools: 'chat', toolCwd: opts.toolCwd });
2198
+ const subagent = createGlobalSubagentCallable({
2199
+ hostTools: agentToolSurface.specs,
2200
+ ...(agentToolCwd ? {
2201
+ dispatchTool: (name: string, args: Record<string, unknown>, signal?: AbortSignal) => agentToolSurface.dispatch(name, args, {
2202
+ cwd: agentToolCwd, signal: signal ?? new AbortController().signal, entry: 'elanous-apparatus',
2203
+ }),
2204
+ cwd: agentToolCwd,
2205
+ } : {}),
2206
+ });
2207
+ toxStore = new TaskStore();
2087
2208
  toxHandle = wireTox({
2088
- surfaces: { subagent: createGlobalSubagentCallable() },
2209
+ graph: hydrateGraph(toxStore), store: toxStore,
2210
+ getWorkflowDaemon: () => workflowDaemon ?? null,
2211
+ surfaces: {
2212
+ subagent,
2213
+ externalExec: createExternalExecAdapter({
2214
+ dispatch: dispatchSelfImplement,
2215
+ cwd: runtimeToolCwd ?? resolveToolCwd({ tools: 'chat', toolCwd: opts.toolCwd })!, subagent,
2216
+ gh: async (args) => {
2217
+ const proc = Bun.spawn(['bun', joinPath(import.meta.dir, '../../bin/elanous.mjs'), 'gh', ...args], {
2218
+ cwd: runtimeToolCwd ?? resolveToolCwd({ tools: 'chat', toolCwd: opts.toolCwd })!,
2219
+ stdout: 'pipe', stderr: 'pipe',
2220
+ });
2221
+ const [stdout, stderr, exitCode] = await Promise.all([
2222
+ new Response(proc.stdout).text(), new Response(proc.stderr).text(), proc.exited,
2223
+ ]);
2224
+ if (exitCode !== 0) throw new Error(stderr.trim() || `gh exited ${exitCode}`);
2225
+ return stdout;
2226
+ },
2227
+ }),
2228
+ },
2089
2229
  log: (line) => console.debug('[nexus]', line),
2090
2230
  });
2091
2231
  } catch (err) {
2232
+ toxStore?.close();
2233
+ toxStore = undefined;
2092
2234
  const msg = err instanceof Error ? err.message : String(err);
2093
2235
  console.warn(`[nexus] wireTox failed: ${msg}`);
2094
2236
  }
@@ -2298,8 +2440,11 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
2298
2440
  // TaskStore 의 scheduleText 달린 비-terminal task 를 start() 전에 데몬 entries
2299
2441
  // 로 등록해, 이관잡이 데몬 재시작 후에도 발화하게 한다. best-effort.
2300
2442
  try {
2301
- const { registerScheduledToxTasks } = await import('../domains/schedule-migrate.js');
2302
- const rr = registerScheduledToxTasks(bridgeTaskStore, (e) => workflowDaemon!.registerWorkflow(e));
2443
+ const { registerScheduledToxTasks, scheduledRunViaById } = await import('../domains/schedule-migrate.js');
2444
+ const { listSchedules } = await import('../domains/schedule-registry.js');
2445
+ // 레지스트리의 enabled trigger 만 등록한다(release 뒤 고아·수동 비활성 task 의 발화 방지).
2446
+ const runViaById = scheduledRunViaById(listSchedules(bridgeScheduleDb));
2447
+ const rr = registerScheduledToxTasks(bridgeTaskStore, (e) => workflowDaemon!.registerWorkflow(e), (jobId) => runViaById.get(jobId) ?? null);
2303
2448
  if (rr.registered > 0) {
2304
2449
  console.log(`[nexus] re-registered ${rr.registered} scheduled TOX task(s) as Schedule Triggers`);
2305
2450
  }
@@ -2414,13 +2559,13 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
2414
2559
  // so `discordTrigger` nodes fire from real traffic. Skipped
2415
2560
  // when `cfg.discord.enabled` is false or the bot token isn't
2416
2561
  // set. The HITL Discord bot (token = ELANOUS_DISCORD_HITL_*) is
2417
- // a separate Discord application; this trigger bot uses the
2418
- // main `cfg.discord.botToken` populated from
2419
- // ELANOUS_DISCORD_BOT_TOKEN via env-bridge.
2562
+ // a separate Discord application; the trigger bot resolves the
2563
+ // main credential via tokenRef, env, then legacy plaintext.
2420
2564
  try {
2421
2565
  const userConfigMod = await import('../user-config.js');
2422
2566
  const cfg = userConfigMod.getUserConfig();
2423
- if (cfg.discord.enabled && cfg.discord.botToken && !isAutonomousRunContext()) {
2567
+ const discordToken = resolveChannelBotToken('discord', cfg)?.token;
2568
+ if (cfg.discord.enabled && discordToken && !isAutonomousRunContext()) {
2424
2569
  // M4b (2026-07-12) — the production discord bot answers DMs
2425
2570
  // with the elanous self turn + /cc·/cdx·/gem interweaving
2426
2571
  // (텔레그램 동형·대표 확정: 기본 self·명시 위임). The
@@ -2467,7 +2612,7 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
2467
2612
  allowedUsers: [...cfg.discord.allowedUsers],
2468
2613
  });
2469
2614
  const handle = createNexusDiscordTriggerBot({
2470
- token: cfg.discord.botToken,
2615
+ token: discordToken,
2471
2616
  allowedUsers: [...cfg.discord.allowedUsers],
2472
2617
  dispatch: (event) => workflowDaemon!.dispatchDiscord(event),
2473
2618
  onMessage: composedOnMessage,
@@ -2486,32 +2631,30 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
2486
2631
  });
2487
2632
  }
2488
2633
  }
2489
- // V2.2-4 (2026-05-12) — parallel Telegram wire. Reuses the
2490
- // same `cfg.telegram.botToken` / `allowedUsers` shape via
2491
- // env-bridge so ELANOUS_TELEGRAM_BOT_TOKEN populates the
2492
- // config under the standard flow.
2634
+ // V2.2-4 (2026-05-12) — parallel Telegram wire. Uses the
2635
+ // resolved main token alongside the existing allowedUsers.
2493
2636
  // 2026-07-05 — unified inbound: pass `userConfig` so the ONE
2494
2637
  // nexus telegram bot answers Q&A (onMessage → runTurn) on top
2495
2638
  // of firing workflow triggers. A separate Q&A poller would 409
2496
2639
  // against this one (single getUpdates consumer per token).
2497
- if (cfg.telegram.enabled && cfg.telegram.botToken && !isAutonomousRunContext()) {
2640
+ const telegramToken = resolveChannelBotToken('telegram', cfg)?.token;
2641
+ if (cfg.telegram.enabled && telegramToken && !isAutonomousRunContext()) {
2498
2642
  // T1 (2026-07-05) — give the Q&A bot the full agent tool surface;
2499
2643
  // A0 folds in the finance analyst orientation only when
2500
2644
  // cfg.finance.enabled (optional domain pack).
2501
2645
  //
2502
2646
  // ★ 멀티 채널(2026-07-09 대표 지시): resolveTelegramChannels 로 채널 목록을
2503
2647
  // 얻고, interactivePollerTokens 로 **봇 토큰당 폴러 1개**만 띄운다(토큰별
2504
- // dedup → 409 자기충돌 원천차단). botFromConfig 가 userConfig.telegram.
2505
- // botToken 을 읽으므로(telegram.ts), 각 폴러엔 그 채널 토큰으로 덮어쓴
2506
- // userConfig 를 넘겨 **올바른 토큰을 폴링**하게 한다(오늘 토큰 버그 정타).
2648
+ // dedup → 409 자기충돌 원천차단). 각 폴러엔 채널 토큰을 명시로
2649
+ // 넘겨 **올바른 토큰을 폴링**하게 한다(오늘 토큰 버그 정타).
2507
2650
  // interactive:false(noti-only) 채널은 폴러 없이 발송 전용.
2508
2651
  const { makeTelegramAgentRunTurn } = await import('../telegram-agent.js');
2509
2652
  const { resolveTelegramChannels, interactivePollerTokens } = await import('../domains/telegram-channels.js');
2510
2653
  const { tryAcquireTelegramPollLock, acquireTelegramPollLock } = await import('../telegram-poll-lock.js');
2511
2654
  const adopt = ({ channel, handle }: NexusTelegramQaPollerWireHandle): void => {
2512
2655
  telegramPollerHandles.push(handle);
2513
- if (channel.botToken === cfg.telegram.botToken) workflowTelegramBot = handle;
2514
- console.log(`[nexus] telegram 채널 '${channel.name}' Q&A 폴러 활성 (${channel.botToken.slice(0, 8)}…·roles ${channel.roles.join('/')})`);
2656
+ if (channel.botToken === telegramToken) workflowTelegramBot = handle;
2657
+ console.log(`[nexus] telegram 채널 '${channel.name}' Q&A 폴러 활성 (roles ${channel.roles.join('/')})`);
2515
2658
  };
2516
2659
  if (cfg.telegram.poller === 'standalone') {
2517
2660
  // 폴링은 `elanous telegram run` 이 맡는다 — 넥서스는 보내기만 한다. 배달 싱크는 «프로세스 안» 등록이라
@@ -2525,7 +2668,7 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
2525
2668
  });
2526
2669
  for (const { channel, handle } of sendOnly) {
2527
2670
  telegramPollerHandles.push(handle);
2528
- if (channel.botToken === cfg.telegram.botToken) workflowTelegramBot = handle;
2671
+ if (channel.botToken === telegramToken) workflowTelegramBot = handle;
2529
2672
  }
2530
2673
  console.log(`[nexus] telegram Q&A 폴러를 띄우지 않는다 (telegram.poller=standalone — elanous telegram run 이 폴링) · 보내기 전용 싱크 ${sendOnly.length}개`);
2531
2674
  } else {
@@ -2673,13 +2816,17 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
2673
2816
  // off; today the only flag is the source's missing-file path
2674
2817
  // (returns empty fleet → no-change tick → no router call).
2675
2818
  try {
2676
- devicesSubstrateHandle = buildDevicesSubstrate({
2677
- ...(outboundSubstrate?.router ? { router: outboundSubstrate.router } : {}),
2678
- });
2679
- if (devicesSubstrateHandle.skipReason) {
2680
- console.warn(`[nexus] devices cron skipped (${devicesSubstrateHandle.skipReason}): ${devicesSubstrateHandle.detail ?? ''}`);
2819
+ if (setupPlan.skipCrons.includes('devices')) {
2820
+ debug.log('nexus.boot', 'setup-mode-skip-cron', { cron: 'devices' });
2681
2821
  } else {
2682
- console.info('[nexus] devices fleet cron started');
2822
+ devicesSubstrateHandle = buildDevicesSubstrate({
2823
+ ...(outboundSubstrate?.router ? { router: outboundSubstrate.router } : {}),
2824
+ });
2825
+ if (devicesSubstrateHandle.skipReason) {
2826
+ console.warn(`[nexus] devices cron skipped (${devicesSubstrateHandle.skipReason}): ${devicesSubstrateHandle.detail ?? ''}`);
2827
+ } else {
2828
+ console.info('[nexus] devices fleet cron started');
2829
+ }
2683
2830
  }
2684
2831
  } catch (err: unknown) {
2685
2832
  const msg = err instanceof Error ? err.message : String(err);
@@ -2758,9 +2905,11 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
2758
2905
  state,
2759
2906
  registry,
2760
2907
  eventBus,
2908
+ setup: { mode: nexusSetup.setupMode, missing: nexusSetup.setupMissing },
2761
2909
  ...(supervisor ? { supervisor } : {}),
2762
2910
  ...(outboundSubstrate ? { outboundTokens: { tokenStore: outboundSubstrate.tokenStore } } : {}),
2763
2911
  ...(opts.httpStartPort !== undefined ? { startPort: opts.httpStartPort } : {}),
2912
+ ...(leasePortFromLauncher !== undefined ? { portRange: 1 } : {}),
2764
2913
  ...(opts.httpHost !== undefined ? { hostname: opts.httpHost } : {}),
2765
2914
  editInPwa: editInPwaCtx,
2766
2915
  ...(wsBridgeOpts ? { wsBridge: wsBridgeOpts } : {}),
@@ -2771,7 +2920,7 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
2771
2920
  ...(pwaStaticDir ? { staticDir: pwaStaticDir } : {}),
2772
2921
  ...(runtimeIntentPrediction ? { intentPrediction: runtimeIntentPrediction } : {}),
2773
2922
  // next-fluent(태스크 완료 → 다음 액션 1-클릭 칩·2026-07-15) — mission-fabric-aware source +
2774
- // config-gated enabled thunk(기본 OFF). 항상 배선 → route 는 더는 503(not-wired) 안 냄.
2923
+ // 항상 켜진 라우트(기본 ON). personas 만 선택 사항이며, route 는 503(not-wired) 안 냄.
2775
2924
  nextFluent: buildNextFluentRouteOpts(),
2776
2925
  // iPhone Showroom Phase 1 P1-4 (2026-05-14) + FU1 (2026-05-14) —
2777
2926
  // mission router DI seam. Pass a configProvider thunk so user
@@ -2891,9 +3040,40 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
2891
3040
  // have moved us off startPort).
2892
3041
  editInPwaCtx.audience = `${httpServer.hostname}:${httpServer.port}`;
2893
3042
  editInPwaCtx.nexusOrigin = httpServer.url;
3043
+ if (leasePortFromLauncher !== undefined && httpServer.port !== leasePortFromLauncher) {
3044
+ httpServer.stop();
3045
+ await stopCoordinatorLease?.();
3046
+ release();
3047
+ throw new Error('coordinator port lease boot mismatch');
3048
+ }
2894
3049
  runtime.httpPort = httpServer.port;
2895
3050
  runtime.httpHost = httpServer.hostname;
2896
3051
  runtime.httpAuth = 'off';
3052
+ // The actual bound port (not the requested port or registry entry) is the member endpoint.
3053
+ try {
3054
+ const configured = (getUserConfig().raw?.nexus as { primary?: unknown } | undefined)?.primary;
3055
+ const { url: coordinatorUrl, token } = resolvePrimary({
3056
+ role: 'member',
3057
+ ...(configured === undefined || configured === '' ? {} : { config: { url: configured as string } }),
3058
+ });
3059
+ if (!token) {
3060
+ try { debug.log('control.member', 'start-skipped', { reason: 'member-token-missing' }); } catch { /* fail-soft */ }
3061
+ } else {
3062
+ const machine = nexusMemberMachine();
3063
+ stopMemberHeartbeat = startMemberHeartbeat({
3064
+ coordinatorUrl, token,
3065
+ machine,
3066
+ instance: {
3067
+ id: `instance:${machine.name}:${effectiveInstanceRoot()}`, name: 'nexus',
3068
+ endpoint: httpServer.url,
3069
+ attrs: { port: httpServer.port, pid: process.pid },
3070
+ },
3071
+ });
3072
+ try { debug.log('control.member', 'started', { machine: machine.id, coordinatorUrl }); } catch { /* fail-soft */ }
3073
+ }
3074
+ } catch {
3075
+ try { debug.log('control.member', 'start-skipped', { reason: 'member-configuration-invalid' }); } catch { /* fail-soft */ }
3076
+ }
2897
3077
  pwaRegistration.register({
2898
3078
  pid: process.pid,
2899
3079
  port: httpServer.port,
@@ -2932,7 +3112,11 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
2932
3112
  // FU A8 — boot the discovery cron alongside the reflection
2933
3113
  // scheduler. Dormant when env unset (zero CPU/network cost on
2934
3114
  // a fresh install).
2935
- discoveryCron = startDiscoveryCron();
3115
+ if (setupPlan.skipCrons.includes('discovery')) {
3116
+ debug.log('nexus.boot', 'setup-mode-skip-cron', { cron: 'discovery' });
3117
+ } else {
3118
+ discoveryCron = startDiscoveryCron();
3119
+ }
2936
3120
  // Mission Fabric 통합 U4d (2026-07-09) — schedule-runner 은퇴(B안 완성).
2937
3121
  // 모든 예약잡이 fabric Schedule Trigger(run_via='trigger')로 이관됨 →
2938
3122
  // 정시 발화=workflow 데몬, 놓친발화 복구=catchUpTriggerJobs(위 U4b). run_via=
@@ -2987,6 +3171,7 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
2987
3171
  opts: {
2988
3172
  ...(opts.autoStartDaemonTab !== undefined ? { autoStartDaemonTab: opts.autoStartDaemonTab } : {}),
2989
3173
  ...(opts.detachForTesting !== undefined ? { detachForTesting: opts.detachForTesting } : {}),
3174
+ ...(setupPlan.skipTabKinds.includes('daemon') ? { autoStartDaemonTab: false } : {}),
2990
3175
  },
2991
3176
  });
2992
3177
 
@@ -3011,6 +3196,7 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
3011
3196
  opts: {
3012
3197
  ...(opts.autoStartChannelBots !== undefined ? { autoStartChannelBots: opts.autoStartChannelBots } : {}),
3013
3198
  ...(opts.detachForTesting !== undefined ? { detachForTesting: opts.detachForTesting } : {}),
3199
+ ...(setupPlan.skipTabKinds.includes('channel-bot') ? { autoStartChannelBots: false } : {}),
3014
3200
  },
3015
3201
  });
3016
3202
 
@@ -3024,6 +3210,7 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
3024
3210
  for (const entry of templateTabs) {
3025
3211
  if (entry.start === false) continue;
3026
3212
  if (entry.kind !== 'daemon' && entry.kind !== 'pwa-host' && entry.kind !== 'channel-bot') continue;
3213
+ if (setupPlan.skipTabKinds.includes(entry.kind)) continue;
3027
3214
  if (!autoStart) continue;
3028
3215
  const id = entry.id ?? '';
3029
3216
  if (!id || !registry.has(id)) continue;
@@ -3033,7 +3220,12 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
3033
3220
  }
3034
3221
  }
3035
3222
 
3223
+ let shareCoordinatorTimer: ReturnType<typeof setInterval> | undefined;
3224
+ let shareCoordinatorStopped = false;
3225
+ let shareCoordinatorPending: Promise<void> | undefined;
3036
3226
  const wrappedRelease = (): void => {
3227
+ shareCoordinatorStopped = true;
3228
+ if (shareCoordinatorTimer) { clearInterval(shareCoordinatorTimer); shareCoordinatorTimer = undefined; }
3037
3229
  pushEvent(state, { kind: 'nexus.shutdown' });
3038
3230
  pwaRegistration.unregister();
3039
3231
  try { unsubscribeWebtermTabLifecycle(); } catch { /* swallow */ }
@@ -3121,6 +3313,7 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
3121
3313
  console.warn(`[nexus] tox dispose failed: ${msg}`);
3122
3314
  }
3123
3315
  }
3316
+ if (toxStore) { try { toxStore.close(); } catch { /* shutdown best effort */ } toxStore = undefined; }
3124
3317
  // V2.2-3 (2026-05-12) — stop the workflow Discord trigger bot.
3125
3318
  if (workflowDiscordBot) {
3126
3319
  void workflowDiscordBot.stop().catch(() => { /* swallow */ });
@@ -3192,6 +3385,13 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
3192
3385
  }
3193
3386
  };
3194
3387
  void disposeMcp().catch(() => { /* swallow */ });
3388
+ try { stopMemberHeartbeat?.(); } catch { /* best-effort shutdown */ }
3389
+ if (stopCoordinatorLease) {
3390
+ const stopLease = stopCoordinatorLease;
3391
+ stopCoordinatorLease = undefined;
3392
+ leaseReleasePending = stopLease().catch(error => debug.log('control.port-lease', 'release-failed', { port: leasePortFromLauncher, reason: String(error) }, { level: 'warn' }));
3393
+ }
3394
+ controlServer?.stop();
3195
3395
  httpServer?.stop();
3196
3396
  try { deleteNexusRuntime(); } catch { /* best-effort */ }
3197
3397
  release();
@@ -3230,8 +3430,14 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
3230
3430
  };
3231
3431
 
3232
3432
  const releaseWithShareUnmount = async (): Promise<void> => {
3233
- await unmountAutoMountedShare();
3234
- wrappedRelease();
3433
+ shareCoordinatorStopped = true;
3434
+ if (shareCoordinatorTimer) { clearInterval(shareCoordinatorTimer); shareCoordinatorTimer = undefined; }
3435
+ await shareCoordinatorPending;
3436
+ try { await unmountAutoMountedShare(); }
3437
+ finally {
3438
+ wrappedRelease();
3439
+ await leaseReleasePending;
3440
+ }
3235
3441
  };
3236
3442
 
3237
3443
  const recordShareMount = (result: Awaited<ReturnType<NonNullable<RunNexusOptions['mountShareIfEnabledFn']>>>): void => {
@@ -3280,21 +3486,22 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
3280
3486
  const io = defaultIO();
3281
3487
  // Phase 4 (2026-05-19) — tailscale probe 결과 + PWA build 상태 + port
3282
3488
  // 를 first-boot wizard 에 전달해서 banner 가 PWA URL 을 표시하도록.
3283
- const httpPort = runtime.httpPort ?? 31415;
3489
+ const httpPort = httpServer?.port;
3284
3490
  const pwaBuilt = Boolean(pwaStaticDir);
3285
- const tailscale = await probeTailscale().catch(() => undefined);
3491
+ const tailscale = httpPort !== undefined ? await probeTailscale().catch(() => undefined) : undefined;
3286
3492
  try {
3287
3493
  await runFirstBootWizard({
3288
3494
  io,
3289
3495
  setupStatus,
3290
- shouldRunTailscale: shouldAskPwaShareSwitch(),
3291
- httpPort,
3496
+ shouldRunTailscale: httpPort !== undefined && shouldAskPwaShareSwitch(),
3497
+ ...(httpPort !== undefined ? { httpPort } : {}),
3292
3498
  pwaBuilt,
3293
3499
  ...(tailscale ? { tailscale } : {}),
3294
3500
  runLlmStep: async (wizardIo) => {
3295
3501
  await runOnboardingStep('llm', { io: wizardIo });
3296
3502
  },
3297
3503
  runTailscaleWizard: async (wizardIo) => {
3504
+ if (httpPort === undefined) return;
3298
3505
  await runPwaShareWizardIfAsk({
3299
3506
  port: httpPort,
3300
3507
  pwaBuilt,
@@ -3322,29 +3529,37 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
3322
3529
  try {
3323
3530
  const mountShareIfEnabled = opts.mountShareIfEnabledFn
3324
3531
  ?? (await import('../cli/share-auto-mount.js')).mountShareIfEnabled;
3325
- const r = await mountShareIfEnabled({ httpPort });
3326
- if (r.outcome === 'serving') {
3327
- shareMounted = true;
3328
- autoMountedSharePort = httpPort;
3329
- recordShareMount(r);
3330
- console.log(` share ON ${r.url ?? '(tailnet host unknown)'} (Tailscale Serve · auto-managed)`);
3331
- } else if (r.outcome === 'failed') {
3332
- // FU2 — most common fail in fork+detach is `sudo -n` cache
3333
- // empty (bg-launch child inherits parent sudo cache; cache
3334
- // expires after ~5-15min). Surface both recovery paths so
3335
- // the user doesn't have to guess between "fix Tailscale" and
3336
- // "run sudo -v".
3337
- console.log(` share ERR serve exit ${r.serveExitCode ?? '?'} (likely sudo cache empty in bg-launch child)`);
3338
- console.log(' recover with EITHER:');
3339
- console.log(' a) `sudo -v` once in a TTY, then `elanous nexus stop && elanous nexus run`');
3340
- console.log(' b) `elanous nexus pwa share enable` (parent-side mount · independent of daemon)');
3341
- } else if (r.reason === 'tailscale-missing') {
3342
- console.log(' share OFF Tailscale not installed — https://tailscale.com/download');
3343
- } else if (r.reason === 'tailscale-down') {
3344
- console.log(' share OFF Tailscale not active — start Tailscale, then `pwa share enable`');
3345
- }
3346
- // switch-disabled / switch-ask: stay quiet (user choice or fresh
3347
- // install where the wizard hasn't run yet).
3532
+ const reconcileShare = (): Promise<void> => {
3533
+ if (shareCoordinatorStopped || shareCoordinatorPending) return shareCoordinatorPending ?? Promise.resolve();
3534
+ const pending = (async (): Promise<void> => {
3535
+ try {
3536
+ const r = await mountShareIfEnabled({ httpPort });
3537
+ if (r.outcome === 'serving') {
3538
+ shareMounted = true;
3539
+ autoMountedSharePort = httpPort;
3540
+ recordShareMount(r);
3541
+ console.log(` share ON ${r.url ?? '(tailnet host unknown)'} (Tailscale Serve · auto-managed)`);
3542
+ } else if (r.outcome === 'failed') {
3543
+ console.log(` share ERR serve exit ${r.serveExitCode ?? '?'} (likely sudo cache empty in bg-launch child)`);
3544
+ console.log(' recover with EITHER:');
3545
+ console.log(' a) `sudo -v` once in a TTY, then `elanous nexus stop && elanous nexus run`');
3546
+ console.log(' b) `elanous nexus pwa share enable` (parent-side mount · independent of daemon)');
3547
+ } else if (r.reason === 'tailscale-missing') {
3548
+ console.log(' share OFF Tailscale not installed — https://tailscale.com/download');
3549
+ } else if (r.reason === 'tailscale-down') {
3550
+ console.log(' share OFF Tailscale not active — start Tailscale, then `pwa share enable`');
3551
+ }
3552
+ } catch (err) {
3553
+ console.error(` share ERR ${(err as Error).message}`);
3554
+ }
3555
+ })();
3556
+ shareCoordinatorPending = pending;
3557
+ void pending.then(() => { if (shareCoordinatorPending === pending) shareCoordinatorPending = undefined; });
3558
+ return pending;
3559
+ };
3560
+ await reconcileShare();
3561
+ shareCoordinatorTimer = setInterval(() => { void reconcileShare(); }, opts.shareCoordinatorIntervalMsForTesting ?? 60_000);
3562
+ shareCoordinatorTimer.unref?.();
3348
3563
  } catch (err) {
3349
3564
  console.error(` share ERR ${(err as Error).message}`);
3350
3565
  }
@@ -3392,17 +3607,19 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
3392
3607
  console.log(' elanous nexus: headless mode (TUI suppressed) — Ctrl-C / SIGTERM to exit.\n');
3393
3608
  let resolveDone: () => void = () => {};
3394
3609
  const done = new Promise<void>((r) => { resolveDone = r; });
3610
+ let sigtermExit: Promise<void> | undefined;
3395
3611
  const onSigterm = (): void => {
3396
3612
  console.error('\nelanous nexus: received SIGTERM, graceful restart pending (exit 75)...');
3397
3613
  if (pwaWatchHandle) { try { pwaWatchHandle.stop(); } catch { /* */ } }
3398
3614
  // R1(재시작 최소화 RFC) — 이미 텔레그램에 «확인»된 턴이 재시작으로 말없이 사라지지 않게,
3399
3615
  // SIGTERM 을 받은 «지금부터» 상한 안에서 봇의 대기 턴을 비운 뒤 나간다(부팅 시각 기준이 아니다).
3400
- void drainTelegramThen(() => gracefulExit({
3616
+ sigtermExit = drainTelegramThen(() => gracefulExit({
3401
3617
  state,
3402
3618
  registry,
3403
3619
  ...(supervisor ? { supervisor } : {}),
3404
3620
  release: releaseWithShareUnmount,
3405
3621
  }));
3622
+ resolveDone();
3406
3623
  };
3407
3624
  const onSigint = (): void => {
3408
3625
  console.error('\nelanous nexus: received SIGINT, shutting down...');
@@ -3415,7 +3632,8 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
3415
3632
  process.removeListener('SIGINT', onSigint);
3416
3633
  process.removeListener('SIGTERM', onSigterm);
3417
3634
 
3418
- await cleanExit({
3635
+ if (sigtermExit) await sigtermExit;
3636
+ else await cleanExit({
3419
3637
  state,
3420
3638
  registry,
3421
3639
  ...(supervisor ? { supervisor } : {}),
@@ -3452,9 +3670,10 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
3452
3670
  console.log(' elanous nexus: TUI mount path deprecated (T4) — Ctrl-C / SIGTERM to exit.\n');
3453
3671
  let resolveDone: () => void = () => {};
3454
3672
  const done = new Promise<void>((r) => { resolveDone = r; });
3673
+ let sigtermExit: Promise<void> | undefined;
3455
3674
  const onSigterm = (): void => {
3456
3675
  console.error('\nelanous nexus: received SIGTERM, graceful restart pending (exit 75)...');
3457
- void drainTelegramThen(() => gracefulExit({
3676
+ sigtermExit = drainTelegramThen(() => gracefulExit({
3458
3677
  state,
3459
3678
  registry,
3460
3679
  ...(supervisor ? { supervisor } : {}),
@@ -3469,10 +3688,12 @@ export async function runNexus(opts: RunNexusOptions = {}): Promise<RunNexusHand
3469
3688
  process.once('SIGINT', onSigint);
3470
3689
  process.once('SIGTERM', onSigterm);
3471
3690
  await done;
3691
+ process.removeListener('SIGINT', onSigint);
3692
+ process.removeListener('SIGTERM', onSigterm);
3472
3693
 
3473
- // SIGINT path — clean exit 0, clears any leftover restart-state so the
3474
- // OS supervisor doesn't respawn after an explicit user stop.
3475
- await cleanExit({
3694
+ // SIGTERM completes its graceful exit; SIGINT clears restart-state.
3695
+ if (sigtermExit) await sigtermExit;
3696
+ else await cleanExit({
3476
3697
  state,
3477
3698
  registry,
3478
3699
  ...(supervisor ? { supervisor } : {}),
@@ -3583,7 +3804,7 @@ export function readAcpToken(): string | undefined {
3583
3804
  function printBootBanner(runtime: NexusRuntimeMeta, pwaStaticDir?: string): void {
3584
3805
  const lines = [
3585
3806
  '',
3586
- ` elanous NEXUS · ${runtime.nexusVersion} · ${runtime.phase}`,
3807
+ ` elanous NEXUS · ${runtime.nexusVersion}`,
3587
3808
  ' ──────────────────────────────────────────────────────',
3588
3809
  ` pid ${runtime.pid}`,
3589
3810
  ` host ${hostname()}`,
@@ -3606,12 +3827,9 @@ function printBootBanner(runtime: NexusRuntimeMeta, pwaStaticDir?: string): void
3606
3827
  }
3607
3828
  lines.push(
3608
3829
  '',
3609
- ' Phase N-5 PR χ — graceful exit 75 (OS supervisor restart).',
3610
3830
  ' Read-only routes: GET /v1/{health,nexus,nexus/tabs,events}',
3611
3831
  ' Toggle keys: Ctrl-` (primary) · Ctrl-\\ (Korean IME / SSH friendly).',
3612
- ' SIGINT (Ctrl-C) → exit 0 (OS supervisor leaves nexus stopped).',
3613
- ' SIGTERM → exit 75 + restart-state.json (OS supervisor respawns).',
3614
- ' PR ψ/ω add `elanous nexus install --launchd|--systemd-user`.',
3832
+ ' Install service: elanous nexus install --launchd (macOS) or --systemd-user (Linux).',
3615
3833
  '',
3616
3834
  ' Ctrl-C to release lock and exit.',
3617
3835
  '',