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
@@ -27,6 +27,8 @@
27
27
  // crashed wizard cannot corrupt an existing file. Mode 0600 when the
28
28
  // telegram bot token is present.
29
29
 
30
+ import { isCodexQuotaPolicy } from './oauth/codex-quota-policy.js';
31
+ import { defaultObsidianVault } from './obsidian/default-vault.js';
30
32
  import {
31
33
  existsSync, readFileSync, writeFileSync, mkdirSync, renameSync, chmodSync,
32
34
  statSync, accessSync, constants as fsConstants,
@@ -71,6 +73,10 @@ import {
71
73
  } from './plugins/adapters/claude-package.js';
72
74
  // ⭐ provider↔credential SSOT — provider 를 바꾸는 자리가 키도 함께 해석해야 401 이 안 난다(escalate 근본수리).
73
75
  import { resolveProviderCredential, observeCredentialResolution } from './llm/provider-credentials.js';
76
+ import {
77
+ parseGroundingSources,
78
+ type GroundingConfig,
79
+ } from './grounding/sources.js';
74
80
 
75
81
  // ── SkillRouter (existing) ───────────────────────────────────────────
76
82
 
@@ -198,6 +204,14 @@ export interface LLMConfig {
198
204
  * 🩸 2026-09-24(대표): 「third 부터 소진하고 그다음 team」 — 이름순(default<new<third)으론 못 만든다.
199
205
  * ⛔ 여기 없는 계정은 버리지 않는다 — 뒤로 가서 이름순으로 붙는다. */
200
206
  codexAccountOrder?: string[];
207
+ /** 대표 2026-09-28 «크레딧 사용 허가» — 주간 한도가 찬 codex 계정도 «선불 크레딧으로 계속» 쓴다(서버가 한도 소진 시 크레딧으로 넘긴다).
208
+ * 켜면 회전이 «후보 없음»(→ grok 폴백) 대신 지금 계정에 머물고, Pod 배분도 찬 계정을 사용률 낮은 순으로 쓴다.
209
+ * 순서는 여전히 «구독 잔량이 남은 계정 먼저». 기본 꺼짐(크레딧은 돈이다). */
210
+ codexCreditsAllowed?: boolean;
211
+ /** 대표 2026-09-28 codex «한도 정책» — 한도가 차면 무엇을 하나(`src/oauth/codex-quota-policy.ts` 가 canonical):
212
+ * `within-quota`(한도 안에서만 · 전부 차면 멈춤) · `fallback`(한도 안 ⊕ 폴백 체인 · 기본) · `credits`(크레딧까지).
213
+ * 회전·Pod 배분·폴백·매시 한도 알림이 «이 한 값»을 같이 읽는다. 없으면 옛 `codexCreditsAllowed` 를 읽는다. */
214
+ codexQuotaPolicy?: 'within-quota' | 'fallback' | 'credits';
201
215
  /** ⭐⭐ codex 가 «소진된 뒤» 갈 곳을 «순서»로 정한다 (대표 2026-08-13).
202
216
  *
203
217
  * 값: `['codex-rotate', 'grok']` — 아는 칸은 그 둘뿐이고, 모르는 이름은 버린다(관측에 남는다).
@@ -680,10 +694,14 @@ function skillsDefaults(): SkillsConfig {
680
694
 
681
695
  // ── Obsidian ─────────────────────────────────────────────────────────
682
696
 
683
- export interface ObsidianConfig { vault: string; }
697
+ export interface ObsidianConfig {
698
+ vault: string;
699
+ /** 격리(test) 우주의 «쓰기 시험» 볼트(예 `elantest`) — 읽기는 늘 `vault`. 볼트 쓰기 가드의 허용 목록에 든다(대표·🅞 2026-09-26). */
700
+ testVault?: string;
701
+ }
684
702
 
685
703
  function obsidianDefaults(): ObsidianConfig {
686
- return { vault: process.env.OBSIDIAN_VAULT || join(REMOTE_HOME, 'Obsidian', 'ElanvitalAI') };
704
+ return { vault: defaultObsidianVault({ env: process.env, home: REMOTE_HOME }) };
687
705
  }
688
706
 
689
707
  // ── Telegram ─────────────────────────────────────────────────────────
@@ -941,6 +959,53 @@ export interface SelfImplementClarificationEscalationConfig {
941
959
 
942
960
  export type SelfImplementChildInstanceMode = 'isolated' | 'inherit';
943
961
 
962
+ /** 자식 LLM 선호. `pinned` = 기존 provider·model 한 칸. `auto` = 사용자 `chain` 순서. */
963
+ export type ChildLlmPreferenceMode = 'pinned' | 'auto';
964
+
965
+ export interface ChildLlmChainEntry {
966
+ provider: string;
967
+ model?: string;
968
+ }
969
+
970
+ export interface ChildLlmPreferenceConfig {
971
+ /** 있으면 pinned 의 값. 기존 고정 설정. */
972
+ provider?: string;
973
+ /** 기존 고정 설정. provider 없이 model 만 있으면 mode 는 auto 다. */
974
+ model?: string;
975
+ /** 없으면 provider 가 있을 때 pinned, 없을 때 auto. model 만 있어도 provider 가 없으면 auto. */
976
+ mode?: ChildLlmPreferenceMode;
977
+ /** auto 일 때의 사용자 순서. 원소는 { provider, model? }. */
978
+ chain?: ChildLlmChainEntry[];
979
+ }
980
+
981
+ /** 예산이 모자랄 때의 행동. 판정(P15)은 이 칸을 읽기만 한다. */
982
+ export type BudgetGateOnShortfall = 'decompose' | 'wait-reset' | 'next-provider' | 'proceed';
983
+
984
+ /** 프로바이더별 사용률 상한(0~100). 이 값 이상이면 그 칸을 안 쓴다. */
985
+ export type BudgetGateMaxUsedPercent = { readonly [provider: string]: number };
986
+
987
+ /**
988
+ * 대표 2026-09-26 상한. codex 계정은 95% 이상이면 그 계정을 안 쓰고,
989
+ * grok 은 주간 최대 50% 중 🅢 가드 48% 에서 멈춘다.
990
+ * 🅞 흡수 크론의 «codex ≥80%» 는 이 판정의 상한이 아니다.
991
+ */
992
+ export const DEFAULT_BUDGET_GATE_MAX_USED_PERCENT: BudgetGateMaxUsedPercent = {
993
+ 'openai-codex': 95,
994
+ grok: 48,
995
+ };
996
+
997
+ export interface HarnessBudgetGateConfig {
998
+ /** 0~100. 기본 15. 범위 밖이면 경고와 함께 기본. */
999
+ minHeadroomPercent: number;
1000
+ /** 기본 next-provider. 모르는 값이면 경고와 함께 기본. */
1001
+ onShortfall: BudgetGateOnShortfall;
1002
+ /**
1003
+ * 선택. 없으면 `DEFAULT_BUDGET_GATE_MAX_USED_PERCENT`.
1004
+ * 프로바이더 값이 0~100 밖이면 그 칸만 경고 후 기본.
1005
+ */
1006
+ maxUsedPercent?: BudgetGateMaxUsedPercent;
1007
+ }
1008
+
944
1009
  export interface SelfImplementToolConfig {
945
1010
  /** Absolute root that holds per-repository child worktree directories. */
946
1011
  worktreeRoot: string;
@@ -957,17 +1022,12 @@ export interface SelfImplementToolConfig {
957
1022
  prApprovalDelivery: 'terminal' | 'all';
958
1023
  /** Records SelfImplement dispatches without starting an implementation run. */
959
1024
  observeOnly: boolean;
1025
+ /** Also append terminal execution records to the authored goal document (default true). */
1026
+ goalRecordInDoc: boolean;
960
1027
  /** Controls the persistent grounding loop used while authoring goals; absent preserves it. */
961
1028
  goalAuthorPersistentGrounding?: boolean;
962
- /**
963
- * ⭐ PR 근거 아티팩트의 일곱 축이 비었을 때 **PR 준비를 막나**. 기본(absent)은 안 막는다 —
964
- * 거절 사실은 `pr-evidence-artifact` 관측으로 «항상» 남고, 차단만 명시로 켠다.
965
- */
966
- prEvidenceArtifactEnforce?: boolean;
967
1029
  /** Uses the Fabric decomposer for SelfOrchestrate requests that omit `fabric_decompose`. */
968
1030
  fabricDecompose: boolean;
969
- /** ⛔⭐ 그래프 선언을 «실행 권위»로 올린다(RFC §5 1단계 · 대표 2026-09-08). 기본 켬(`TOOLS_DEFAULTS` · 끄려면 `false` 또는 `--no-graph`). */
970
- graphAuthoritative: boolean;
971
1031
  /** Normalized SelfOrchestrate goal count that automatically selects Fabric; null disables auto-selection. */
972
1032
  fabricDecomposeAutoPathThreshold: number | null;
973
1033
  autoStop: SelfImplementAutoStopConfig;
@@ -977,8 +1037,8 @@ export interface SelfImplementToolConfig {
977
1037
  decompositionShadow: SelfImplementDecompositionShadowConfig;
978
1038
  /** Opt-in delivery of authored goal clarifications from unattended dev runs. */
979
1039
  clarificationEscalation: SelfImplementClarificationEscalationConfig;
980
- /** Optional ask-launch override; omission lets the launch flow default self-resolution ON. */
981
- selfResolveClarifications?: boolean;
1040
+ /** 사용자 자식 모델 선호. 없으면 해석기가 auto + fallbackChain 으로 만든다. */
1041
+ childLlm?: ChildLlmPreferenceConfig;
982
1042
  /** ⭐ PR-open 사전 승인 (2026-07-26 · 대표 결정 "오토 선호 · 기본 ON").
983
1043
  *
984
1044
  * self-build 가 gate 를 통과하면 **PR 을 자동 개설**한다(기본 `true`).
@@ -1063,7 +1123,7 @@ const TOOLS_DEFAULTS: ToolsConfig = {
1063
1123
  selfOrchestrate: {},
1064
1124
  nativeStructure: { enabled: false },
1065
1125
  // 대표 결정(2026-07-26): 오토 선호 — 기본 ON.
1066
- selfImplement: { worktreeRoot: join(homedir(), '.elanous', 'worktrees'), childInstanceMode: 'isolated', prApprovalDelivery: 'terminal' as const, observeOnly: false, fabricDecompose: false, graphAuthoritative: true, fabricDecomposeAutoPathThreshold: 5, autoOpenPr: true, autoStop: { enabled: true, minRung: 2 }, autoAssist: { enabled: true, minRung: 2 }, screenStallTermination: { enabled: true, minRung: 2 }, reworkBudget: { shadowStop: false, maxRounds: 3 }, decompositionShadow: { enabled: false }, clarificationEscalation: { enabled: false } },
1126
+ selfImplement: { worktreeRoot: join(homedir(), '.elanous', 'worktrees'), childInstanceMode: 'isolated', prApprovalDelivery: 'terminal' as const, observeOnly: false, goalRecordInDoc: true, fabricDecompose: false, fabricDecomposeAutoPathThreshold: 5, autoOpenPr: true, autoStop: { enabled: true, minRung: 2 }, autoAssist: { enabled: true, minRung: 2 }, screenStallTermination: { enabled: true, minRung: 2 }, reworkBudget: { shadowStop: false, maxRounds: 3 }, decompositionShadow: { enabled: false }, clarificationEscalation: { enabled: false } },
1067
1127
  };
1068
1128
 
1069
1129
  // ── Debug ────────────────────────────────────────────────────────────
@@ -1098,8 +1158,8 @@ export interface DebugConfig {
1098
1158
  /** OH9(2026-07-24) — 렌더 카테고리(dashboard·key·mouse·cursor 계열)
1099
1159
  * 발화 여부. 진단 강도 축(`level`)과 **직교**한 별도 스위치 —
1100
1160
  * 대표는 상시 diag+ 라 "진단은 켜두고 렌더만 끄는" 축이 필요하다.
1101
- * 기본 `false`(억제). `dashboard.uiMode === 'essential'` 이면 자동 OFF
1102
- * (억제 시드). `true` 로 명시하면 essential 에서도 렌더 로그를 살린다
1161
+ * 기본 `false`(억제). essential TUI 는 렌더 로그를 자동 억제한다.
1162
+ * `true` 로 명시하면 렌더 로그를 살린다
1103
1163
  * (override). 런타임 영속은 config 가 아니라 `<stateRoot>/logs/level.json`
1104
1164
  * 의 `render` 필드(overlay 오염 방지) — 이 config 값은 부팅 시드일 뿐.
1105
1165
  * 선례: `exposeFullLlmTools`(계열 통째 죽이는 불린). */
@@ -1245,13 +1305,11 @@ export interface ChatRenderingStreamingConfig {
1245
1305
  catchUpAgeMs: number;
1246
1306
  }
1247
1307
 
1248
- export interface ChatRenderingCompactBoundaryConfig {
1249
- enabled: boolean;
1250
- }
1308
+ /** Legacy exported type name; the compact boundary no longer has configurable fields. */
1309
+ export interface ChatRenderingCompactBoundaryConfig {}
1251
1310
 
1252
1311
  export interface ChatRenderingWrapConfig {
1253
1312
  urlAware: boolean;
1254
- preserveOsc8: boolean;
1255
1313
  }
1256
1314
 
1257
1315
  export type ChatRenderingToolDisplayMode = 'legacy' | 'inline-to-block';
@@ -1267,12 +1325,7 @@ export type ChatRenderingDiffTurnBrowserMode = 'all' | 'files' | 'turns';
1267
1325
 
1268
1326
  export interface ChatRenderingDiffConfig {
1269
1327
  colorTier: ChatRenderingDiffColorTier;
1270
- adaptiveBg: boolean;
1271
- syntaxPerHunk: boolean;
1272
- cache: boolean;
1273
1328
  headerStyle: ChatRenderingDiffHeaderStyle;
1274
- turnSummary: boolean;
1275
- turnBrowser: boolean;
1276
1329
  turnBrowserHistory: number;
1277
1330
  turnBrowserMode: ChatRenderingDiffTurnBrowserMode;
1278
1331
  }
@@ -1284,7 +1337,6 @@ export interface ChatRenderingHudConfig {
1284
1337
 
1285
1338
  export interface ChatRenderingConfig {
1286
1339
  streaming: ChatRenderingStreamingConfig;
1287
- compactBoundary: ChatRenderingCompactBoundaryConfig;
1288
1340
  wrap: ChatRenderingWrapConfig;
1289
1341
  tool: ChatRenderingToolConfig;
1290
1342
  diff: ChatRenderingDiffConfig;
@@ -1362,28 +1414,19 @@ export const CHAT_DEFAULTS: ChatConfig = {
1362
1414
  catchUpThresholdLines: 50,
1363
1415
  catchUpAgeMs: 200,
1364
1416
  },
1365
- compactBoundary: {
1366
- enabled: true,
1367
- },
1368
1417
  wrap: {
1369
1418
  urlAware: false,
1370
- preserveOsc8: true,
1371
1419
  },
1372
1420
  tool: {
1373
1421
  displayMode: 'inline-to-block',
1374
1422
  blockMaxLines: 8,
1375
1423
  },
1376
- diff: {
1377
- colorTier: 'auto',
1378
- adaptiveBg: true,
1379
- syntaxPerHunk: true,
1380
- cache: true,
1381
- headerStyle: 'legacy',
1382
- turnSummary: true,
1383
- turnBrowser: true,
1384
- turnBrowserHistory: 8,
1385
- turnBrowserMode: 'all',
1386
- },
1424
+ diff: {
1425
+ colorTier: 'auto',
1426
+ headerStyle: 'legacy',
1427
+ turnBrowserHistory: 8,
1428
+ turnBrowserMode: 'all',
1429
+ },
1387
1430
  hud: {
1388
1431
  gaugeWarnRatio: 0.7,
1389
1432
  gaugeDangerRatio: 0.85,
@@ -1405,19 +1448,6 @@ export interface DashboardConfig {
1405
1448
  * disabled so the bank can be populated and debugged before it
1406
1449
  * affects real LLM turns. */
1407
1450
  promptBank: DashboardPromptBankConfig;
1408
- /** First-entry layout. 'chat' seeds chatOnlyMode=true on boot so
1409
- * the app opens straight into the chat REPL; 'dashboard' (or
1410
- * undefined) keeps the legacy 3-pane grid. CLI flags
1411
- * (`--chat-only`, `--debug`) still force 'chat' regardless.
1412
- * @deprecated TUI 부활 T0 — `uiMode` 로 흡수됨. uiMode 미설정 시에만
1413
- * 참조된다 ('chat'→essential · 'dashboard'→rich). */
1414
- defaultMode?: 'chat' | 'dashboard';
1415
- /** TUI 부활 T0 (PLAN-tui-revival-essentials-2026-07-12 §3a) —
1416
- * 단일 UI 모드 축. 'essential'(기본) = codex/claude-code 패리티
1417
- * chat 전체화면 + 1줄 status line; 'rich' = 기존 전체 기능
1418
- * (3-pane grid·VW·widget·마우스). CLI `--rich` 는 이번 실행만
1419
- * rich 강제. 해석 우선순위는 views/ui-mode.ts 참조. */
1420
- uiMode?: 'essential' | 'rich';
1421
1451
  /** Chat-log fold strategy. Default `task-unit` collapses each tool
1422
1452
  * body to its header; `line` keeps the unfolder line-budget body;
1423
1453
  * `kind-unit` coalesces adjacent same-kind operations. Runtime
@@ -1694,13 +1724,12 @@ export interface SessionFabricConfig {
1694
1724
  * acp(C5d·최고위험) = ACP broadcast 를 통합 fan-out 으로 흡수 — ON 시 push 가 fanOutSessionChunk
1695
1725
  * 경로로(byte-identical parity 후) + ACP 턴이 tg/dc/pwa 로 미러. 기본 부재=OFF. */
1696
1726
  streaming?: { telegram?: boolean; discord?: boolean; acp?: boolean };
1697
- /** C5-enh 서피스 특유 노브(reactions-as-status·스트리밍 모드 등). reactions ON = 턴 시작 👀 →
1698
- * 완료 ✅/실패 ❌(편집보다 저비용 상태채널·hermes/openclaw 선례). streamingMode = off|progress|
1699
- * partial|block(§6-8·기본 partial=현 full stream). editGapMs = 편집 간격(기본 1100).
1727
+ /** C5-enh 서피스 특유 노브. streamingMode = off|progress|partial|block(§6-8·기본 partial=현 full stream).
1728
+ * editGapMs = 편집 간격(기본 1100). 반응(👀 → 완료/실패)은 늘 켬.
1700
1729
  * 텔레그램 강화(§5.2·§10-2·전부 기본 off·라이브 무접촉): typing = sendChatAction liveness ·
1701
1730
  * fairQueue = supergroup 다중토픽 라운드로빈 · rotate = scroll-jump post-new-then-delete. 기본 부재=OFF. */
1702
- telegram?: { reactions?: boolean; streamingMode?: StreamingMode; editGapMs?: number; typing?: boolean; fairQueue?: boolean; rotate?: boolean };
1703
- discord?: { reactions?: boolean; streamingMode?: StreamingMode; editGapMs?: number };
1731
+ telegram?: { streamingMode?: StreamingMode; editGapMs?: number; typing?: boolean; fairQueue?: boolean; rotate?: boolean };
1732
+ discord?: { streamingMode?: StreamingMode; editGapMs?: number };
1704
1733
  }
1705
1734
  // ── taste (Layer2 substrate · P4 중앙 진입점 수집 · 2026-07-18) ──────────
1706
1735
  // 기본 부재(=OFF·opt-in). captureEnabled=true 면 intent-gate submitIntent 최상단이
@@ -1741,6 +1770,32 @@ function parseTasteConfig(raw: unknown): TasteConfig | undefined {
1741
1770
  export interface WebSearchConfig {
1742
1771
  tavily?: { enabled?: boolean };
1743
1772
  }
1773
+
1774
+ /** OpenDesign 데몬 접속. url 이 없으면 시안 생성은 꺼진 것이다. tokenFile 은 토큰 «경로»만 담는다. */
1775
+ export interface OpenDesignConfig {
1776
+ url?: string;
1777
+ tokenFile?: string;
1778
+ }
1779
+
1780
+ export interface DesignConfig {
1781
+ openDesign?: OpenDesignConfig;
1782
+ }
1783
+
1784
+ function parseOpenDesignConfig(raw: unknown): OpenDesignConfig | undefined {
1785
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
1786
+ const r = raw as Record<string, unknown>;
1787
+ const out: OpenDesignConfig = {};
1788
+ if (typeof r.url === 'string' && r.url.trim()) out.url = r.url.trim();
1789
+ if (typeof r.tokenFile === 'string' && r.tokenFile.trim()) out.tokenFile = r.tokenFile.trim();
1790
+ return Object.keys(out).length > 0 ? out : undefined;
1791
+ }
1792
+
1793
+ function parseDesignConfig(raw: unknown): DesignConfig | undefined {
1794
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
1795
+ const r = raw as Record<string, unknown>;
1796
+ const openDesign = parseOpenDesignConfig(r.openDesign);
1797
+ return openDesign ? { openDesign } : undefined;
1798
+ }
1744
1799
  function parseWebSearchConfig(raw: unknown): WebSearchConfig | undefined {
1745
1800
  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
1746
1801
  const r = raw as Record<string, unknown>;
@@ -1783,8 +1838,7 @@ function parseSessionFabricConfig(raw: unknown): SessionFabricConfig | undefined
1783
1838
  const raw = r[surf];
1784
1839
  if (raw && typeof raw === 'object' && !Array.isArray(raw)) {
1785
1840
  const s = raw as Record<string, unknown>;
1786
- const surfCfg: { reactions?: boolean; streamingMode?: StreamingMode; editGapMs?: number; typing?: boolean; fairQueue?: boolean; rotate?: boolean } = {};
1787
- if (typeof s.reactions === 'boolean') surfCfg.reactions = s.reactions;
1841
+ const surfCfg: { streamingMode?: StreamingMode; editGapMs?: number; typing?: boolean; fairQueue?: boolean; rotate?: boolean } = {};
1788
1842
  if (isStreamingMode(s.streamingMode)) surfCfg.streamingMode = s.streamingMode;
1789
1843
  if (typeof s.editGapMs === 'number' && Number.isFinite(s.editGapMs) && s.editGapMs > 0) surfCfg.editGapMs = s.editGapMs;
1790
1844
  // 텔레그램 전용 강화 노브(§5.2·§10-2). discord 에 오면 무시(파서는 관대·sink 가 미사용).
@@ -1799,6 +1853,19 @@ function parseSessionFabricConfig(raw: unknown): SessionFabricConfig | undefined
1799
1853
  return Object.keys(out).length > 0 ? out : undefined;
1800
1854
  }
1801
1855
 
1856
+ function parseNextFluentConfig(raw: unknown): UserConfig['nextFluent'] {
1857
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
1858
+ const r = raw as Record<string, unknown>;
1859
+ const out: NonNullable<UserConfig['nextFluent']> = {};
1860
+ if (typeof r.personas === 'boolean') out.personas = r.personas;
1861
+ if (r.models && typeof r.models === 'object' && !Array.isArray(r.models)) {
1862
+ out.models = Object.fromEntries(
1863
+ Object.entries(r.models).filter((entry): entry is [string, string] => typeof entry[1] === 'string'),
1864
+ );
1865
+ }
1866
+ return Object.keys(out).length > 0 ? out : undefined;
1867
+ }
1868
+
1802
1869
  function parseModelTierFieldOrUndefined(v: unknown): ModelTier | undefined {
1803
1870
  return isModelTier(v) ? v : undefined;
1804
1871
  }
@@ -2336,16 +2403,13 @@ function parseToolsConfig(raw: unknown): ToolsConfig {
2336
2403
  const observeOnly = typeof selfImplRaw.observeOnly === 'boolean'
2337
2404
  ? selfImplRaw.observeOnly
2338
2405
  : TOOLS_DEFAULTS.selfImplement.observeOnly;
2406
+ const goalRecordInDoc = typeof selfImplRaw.goalRecordInDoc === 'boolean'
2407
+ ? selfImplRaw.goalRecordInDoc
2408
+ : TOOLS_DEFAULTS.selfImplement.goalRecordInDoc;
2339
2409
  const goalAuthorPersistentGrounding = typeof selfImplRaw.goalAuthorPersistentGrounding === 'boolean'
2340
2410
  ? selfImplRaw.goalAuthorPersistentGrounding
2341
2411
  : undefined;
2342
- const prEvidenceArtifactEnforce = typeof selfImplRaw.prEvidenceArtifactEnforce === 'boolean'
2343
- ? selfImplRaw.prEvidenceArtifactEnforce
2344
- : undefined;
2345
2412
  const fabricDecompose = selfImplRaw.fabricDecompose === true;
2346
- const graphAuthoritative = typeof selfImplRaw.graphAuthoritative === 'boolean'
2347
- ? selfImplRaw.graphAuthoritative
2348
- : TOOLS_DEFAULTS.selfImplement.graphAuthoritative;
2349
2413
  const fabricDecomposeAutoPathThresholdRaw = selfImplRaw.fabricDecomposeAutoPathThreshold;
2350
2414
  const fabricDecomposeAutoPathThreshold = fabricDecomposeAutoPathThresholdRaw === null
2351
2415
  ? null
@@ -2439,9 +2503,7 @@ function parseToolsConfig(raw: unknown): ToolsConfig {
2439
2503
  enabled: clarificationEscalationRaw.enabled === true,
2440
2504
  ...(clarificationTimeoutMs === undefined ? {} : { timeoutMs: clarificationTimeoutMs }),
2441
2505
  };
2442
- const selfResolveClarifications = typeof selfImplRaw.selfResolveClarifications === 'boolean'
2443
- ? selfImplRaw.selfResolveClarifications
2444
- : undefined;
2506
+ const childLlm = parseChildLlmPreference(selfImplRaw.childLlm);
2445
2507
  // ⭐ 관측(리뷰 should-fix) — 오타/비-boolean 은 기본값(ON)으로 수렴하는데, 그게 조용하면
2446
2508
  // "껐다고 믿었는데 자동 개설되는" 운영 사고가 된다. 값이 **있는데 boolean 이 아닐 때만**
2447
2509
  // 경고한다(부재는 정상). 로거 대신 stderr — 이 파일의 기존 경고와 동형(부트 시점·의존 0).
@@ -2464,8 +2526,135 @@ function parseToolsConfig(raw: unknown): ToolsConfig {
2464
2526
  runDevHarness,
2465
2527
  selfOrchestrate,
2466
2528
  nativeStructure,
2467
- selfImplement: { worktreeRoot, childInstanceMode, prApprovalDelivery, observeOnly, goalAuthorPersistentGrounding, prEvidenceArtifactEnforce, fabricDecompose, graphAuthoritative, fabricDecomposeAutoPathThreshold, autoOpenPr, autoStop, autoAssist, screenStallTermination, reworkBudget, decompositionShadow, clarificationEscalation, ...(selfResolveClarifications === undefined ? {} : { selfResolveClarifications }) },
2529
+ selfImplement: { worktreeRoot, childInstanceMode, prApprovalDelivery, observeOnly, goalRecordInDoc, goalAuthorPersistentGrounding, fabricDecompose, fabricDecomposeAutoPathThreshold, autoOpenPr, autoStop, autoAssist, screenStallTermination, reworkBudget, decompositionShadow, clarificationEscalation, ...(childLlm ? { childLlm } : {}) },
2530
+ };
2531
+ }
2532
+
2533
+ const CHILD_LLM_MODES = ['pinned', 'auto'] as const;
2534
+
2535
+ /** 잘못된 값은 경고와 함께 버린다 — 설정 한 줄이 발사를 막지 않는다. 없으면 undefined(해석기가 기본).
2536
+ * 비객체·비문자열 provider/model 도 경고 후 버리고 기본으로 진행한다. 발사를 막지 않는다. */
2537
+ export function parseChildLlmPreference(raw: unknown): ChildLlmPreferenceConfig | undefined {
2538
+ if (raw === undefined) return undefined;
2539
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
2540
+ warnUserConfigDrop('tools.selfImplement.childLlm', `객체가 아니다(${JSON.stringify(raw)}) — 버리고 기본으로 진행`);
2541
+ return undefined;
2542
+ }
2543
+ const v = raw as Record<string, unknown>;
2544
+ const out: ChildLlmPreferenceConfig = {};
2545
+ let droppedInvalidProvider = false;
2546
+ if (v.provider !== undefined) {
2547
+ if (typeof v.provider === 'string') out.provider = v.provider;
2548
+ else {
2549
+ droppedInvalidProvider = true;
2550
+ warnUserConfigDrop('tools.selfImplement.childLlm.provider', `문자열이 아니다(${JSON.stringify(v.provider)}) — 버림`);
2551
+ }
2552
+ }
2553
+ if (v.model !== undefined) {
2554
+ if (typeof v.model === 'string') out.model = v.model;
2555
+ else warnUserConfigDrop('tools.selfImplement.childLlm.model', `문자열이 아니다(${JSON.stringify(v.model)}) — 버림`);
2556
+ }
2557
+ if (v.mode !== undefined) {
2558
+ if ((CHILD_LLM_MODES as readonly string[]).includes(v.mode as string)) out.mode = v.mode as ChildLlmPreferenceMode;
2559
+ else warnUserConfigDrop('tools.selfImplement.childLlm.mode', `pinned|auto 가 아니다(${JSON.stringify(v.mode)}) — 기본으로 진행`);
2560
+ }
2561
+ if (v.chain !== undefined) {
2562
+ if (!Array.isArray(v.chain)) {
2563
+ warnUserConfigDrop('tools.selfImplement.childLlm.chain', `배열이 아니다(${JSON.stringify(v.chain)}) — 버림`);
2564
+ } else {
2565
+ const chain: ChildLlmChainEntry[] = [];
2566
+ for (const [index, item] of v.chain.entries()) {
2567
+ if (!item || typeof item !== 'object' || Array.isArray(item)) {
2568
+ warnUserConfigDrop('tools.selfImplement.childLlm.chain', `[${index}] 객체가 아니다(${JSON.stringify(item)}) — 건너뜀`);
2569
+ continue;
2570
+ }
2571
+ const entry = item as Record<string, unknown>;
2572
+ if (typeof entry.provider !== 'string' || !entry.provider.trim()) {
2573
+ warnUserConfigDrop('tools.selfImplement.childLlm.chain', `[${index}].provider 가 빈 문자열이 아니다(${JSON.stringify(entry.provider)}) — 건너뜀`);
2574
+ continue;
2575
+ }
2576
+ if (entry.model !== undefined && typeof entry.model !== 'string') {
2577
+ warnUserConfigDrop('tools.selfImplement.childLlm.chain', `[${index}].model 이 문자열이 아니다(${JSON.stringify(entry.model)}) — 건너뜀`);
2578
+ continue;
2579
+ }
2580
+ chain.push({
2581
+ provider: entry.provider,
2582
+ ...(typeof entry.model === 'string' ? { model: entry.model } : {}),
2583
+ });
2584
+ }
2585
+ out.chain = chain;
2586
+ }
2587
+ }
2588
+ // mode 추론은 여기 하지 않는다. provider 가 없으면 auto — model 만 남은 설정도 같다.
2589
+ // 기존 model-only 거절 문면은 발사 경계가 따로 보존한다.
2590
+ // 잘못된 provider 를 버린 뒤에 model 만 남으면 그 거절이 발사를 막는다.
2591
+ // 그 한 줄은 경고로 끝내고 기본으로 진행한다.
2592
+ if (droppedInvalidProvider && out.model !== undefined && out.provider === undefined && out.mode === undefined && out.chain === undefined) {
2593
+ delete out.model;
2594
+ }
2595
+ return Object.keys(out).length > 0 ? out : undefined;
2596
+ }
2597
+
2598
+ export const BUDGET_GATE_ON_SHORTFALL = ['decompose', 'wait-reset', 'next-provider', 'proceed'] as const;
2599
+ export const DEFAULT_BUDGET_GATE: HarnessBudgetGateConfig = {
2600
+ minHeadroomPercent: 15,
2601
+ onShortfall: 'next-provider',
2602
+ maxUsedPercent: { ...DEFAULT_BUDGET_GATE_MAX_USED_PERCENT },
2603
+ };
2604
+
2605
+ function percentInRange(value: unknown): value is number {
2606
+ return typeof value === 'number' && Number.isFinite(value) && value >= 0 && value <= 100;
2607
+ }
2608
+
2609
+ /** 칸마다 0~100. 범위 밖·비수치는 경고 후 그 칸의 기본. 객체가 아니면 기본 전체. */
2610
+ export function parseBudgetGateMaxUsedPercent(raw: unknown): BudgetGateMaxUsedPercent {
2611
+ const fallback = { ...DEFAULT_BUDGET_GATE_MAX_USED_PERCENT };
2612
+ if (raw === undefined) return fallback;
2613
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
2614
+ warnUserConfigDrop('harness.budgetGate.maxUsedPercent', `객체가 아니다(${JSON.stringify(raw)}) — 기본 ${JSON.stringify(fallback)} 로 진행`);
2615
+ return fallback;
2616
+ }
2617
+ const out: { [provider: string]: number } = { ...fallback };
2618
+ for (const [provider, value] of Object.entries(raw as Record<string, unknown>)) {
2619
+ if (!provider.trim()) continue;
2620
+ if (percentInRange(value)) out[provider] = value;
2621
+ else {
2622
+ const kept = fallback[provider];
2623
+ warnUserConfigDrop(
2624
+ `harness.budgetGate.maxUsedPercent.${provider}`,
2625
+ `0~100 이 아니다(${JSON.stringify(value)}) — ${kept === undefined ? '버림' : `기본 ${kept} 로 진행`}`,
2626
+ );
2627
+ }
2628
+ }
2629
+ return out;
2630
+ }
2631
+
2632
+ /** 범위 밖·모르는 값은 경고와 함께 기본. 섹션이 없어도 기본을 돌려준다. */
2633
+ export function parseHarnessBudgetGate(raw: unknown): HarnessBudgetGateConfig {
2634
+ const fallback = {
2635
+ minHeadroomPercent: DEFAULT_BUDGET_GATE.minHeadroomPercent,
2636
+ onShortfall: DEFAULT_BUDGET_GATE.onShortfall,
2637
+ maxUsedPercent: { ...DEFAULT_BUDGET_GATE_MAX_USED_PERCENT },
2468
2638
  };
2639
+ if (raw === undefined) return fallback;
2640
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
2641
+ warnUserConfigDrop('harness.budgetGate', `객체가 아니다(${JSON.stringify(raw)}) — 기본 ${fallback.minHeadroomPercent}/${fallback.onShortfall} 로 진행`);
2642
+ return fallback;
2643
+ }
2644
+ const v = raw as Record<string, unknown>;
2645
+ let minHeadroomPercent = fallback.minHeadroomPercent;
2646
+ if (v.minHeadroomPercent !== undefined) {
2647
+ const n = v.minHeadroomPercent;
2648
+ if (percentInRange(n)) minHeadroomPercent = n;
2649
+ else warnUserConfigDrop('harness.budgetGate.minHeadroomPercent', `0~100 이 아니다(${JSON.stringify(n)}) — 기본 ${fallback.minHeadroomPercent} 로 진행`);
2650
+ }
2651
+ let onShortfall = fallback.onShortfall;
2652
+ if (v.onShortfall !== undefined) {
2653
+ if ((BUDGET_GATE_ON_SHORTFALL as readonly string[]).includes(v.onShortfall as string)) onShortfall = v.onShortfall as BudgetGateOnShortfall;
2654
+ else warnUserConfigDrop('harness.budgetGate.onShortfall', `허용값이 아니다(${JSON.stringify(v.onShortfall)}) — 기본 ${fallback.onShortfall} 로 진행`);
2655
+ }
2656
+ const maxUsedPercent = parseBudgetGateMaxUsedPercent(v.maxUsedPercent);
2657
+ return { minHeadroomPercent, onShortfall, maxUsedPercent };
2469
2658
  }
2470
2659
 
2471
2660
  function parseRegistryConfig(raw: unknown): RegistryConfig {
@@ -2672,7 +2861,6 @@ export interface VoiceChatConfig {
2672
2861
 
2673
2862
  export type VoiceTelegramReplyMode = 'auto' | 'text' | 'voice';
2674
2863
  export type VoiceTelegramDispatchMode = 'auto-reply' | 'tui-bridge';
2675
- export type VoiceDiscordReplyMode = 'auto' | 'text' | 'voice';
2676
2864
  export type VoiceDiscordChannelListenFilter = 'caller' | 'all';
2677
2865
  export type IntakeAmbientCaptureMode = 'off' | 'suggest' | 'capture';
2678
2866
 
@@ -2694,27 +2882,8 @@ export interface VoiceTelegramConfig {
2694
2882
  voiceLanguage?: string;
2695
2883
  }
2696
2884
 
2697
- /** Where a final PWA voice transcript dispatches.
2698
- * - 'daemon-direct': daemon calls runTurn directly. Response text
2699
- * synthesizes via the daemon TTS provider and emits as DOWNSTREAM_PCM
2700
- * frames to the browser. Usable without TUI.
2701
- * - 'tui-bridge': transcript routes through dashboard voice-input-host
2702
- * so the TUI sees the dictation as if the user typed; auto-TTS
2703
- * mirrors the response back to the browser. Requires dashboard. */
2704
- export type VoicePwaDispatchMode = 'daemon-direct' | 'tui-bridge';
2705
- export type VoiceDiscordDispatchMode = 'auto-reply' | 'tui-bridge';
2706
2885
 
2707
2886
  export interface VoiceDiscordConfig {
2708
- /** Dispatch mode for Discord text DMs.
2709
- * - 'auto-reply' (default): existing LLM/daemon turn path.
2710
- * - 'tui-bridge': inject final text into the live dashboard input. */
2711
- dispatch?: VoiceDiscordDispatchMode;
2712
- /** Reply mode for incoming Discord voice attachments.
2713
- * - 'auto' (default): user voice → voice reply; user text → text reply.
2714
- * - 'text': always text reply.
2715
- * - 'voice': always voice reply.
2716
- * No env fallback — X9 is treated as a user-config-first surface. */
2717
- replyMode?: VoiceDiscordReplyMode;
2718
2887
  /** ISO 639-1 language hint passed to STT for incoming voice
2719
2888
  * attachments. Improves Korean accuracy when set to 'ko'. */
2720
2889
  voiceLanguage?: string;
@@ -2752,11 +2921,7 @@ export interface VoiceDiscordConfig {
2752
2921
  }
2753
2922
 
2754
2923
  export interface VoicePwaConfig {
2755
- /** Dispatch mode for final transcripts received over /v1/voice/ws.
2756
- * Default is 'daemon-direct' — TUI is not assumed. No env fallback —
2757
- * PWA voice is a §1.2 신규 옵션 (sprint 22 · 2026-04-30) and is
2758
- * user-config only. */
2759
- dispatch?: VoicePwaDispatchMode;
2924
+ // 2026-09-26 설정 졸업: `voice.pwa.dispatch` 를 지웠다 — 그 값을 쓰던 `voice-pwa-dispatch.ts` 는 호출처 0(죽은 모듈)이었다.
2760
2925
  }
2761
2926
 
2762
2927
  export interface VoiceConfig {
@@ -2776,6 +2941,7 @@ export interface IntakeSurfaceConfig {
2776
2941
  export interface IntakeConfig {
2777
2942
  telegram: IntakeSurfaceConfig;
2778
2943
  discord: IntakeSurfaceConfig;
2944
+ approvals?: { repo?: string };
2779
2945
  }
2780
2946
 
2781
2947
  /** Hardcoded fallbacks used when neither user config nor env supplies
@@ -2809,22 +2975,10 @@ function normalizeVoiceVadMode(v: unknown): VoiceVadMode {
2809
2975
  if (v === 'local' || v === 'manual') return v;
2810
2976
  return 'server';
2811
2977
  }
2812
- function normalizeVoicePwaDispatch(v: unknown): VoicePwaDispatchMode | undefined {
2813
- if (v === 'daemon-direct' || v === 'tui-bridge') return v;
2814
- return undefined;
2815
- }
2816
2978
  function normalizeVoiceTelegramDispatch(v: unknown): VoiceTelegramDispatchMode | undefined {
2817
2979
  if (v === 'auto-reply' || v === 'tui-bridge') return v;
2818
2980
  return undefined;
2819
2981
  }
2820
- function normalizeVoiceDiscordDispatch(v: unknown): VoiceDiscordDispatchMode | undefined {
2821
- if (v === 'auto-reply' || v === 'tui-bridge') return v;
2822
- return undefined;
2823
- }
2824
- function normalizeVoiceDiscordReplyMode(v: unknown): VoiceDiscordReplyMode | undefined {
2825
- if (v === 'auto' || v === 'text' || v === 'voice') return v;
2826
- return undefined;
2827
- }
2828
2982
  function normalizeVoiceDiscordChannelListenFilter(
2829
2983
  v: unknown,
2830
2984
  ): VoiceDiscordChannelListenFilter | undefined {
@@ -3158,17 +3312,15 @@ export function resolveRoleModel(role: ModelRole, config: UserConfig = getUserCo
3158
3312
  return { model: resolved.model, source };
3159
3313
  }
3160
3314
 
3161
- export function graphAuthoritativeConfigValue(config: Pick<UserConfig, 'raw' | 'tools'>): boolean | undefined {
3162
- const tools = config.raw.tools;
3163
- if (!tools || typeof tools !== 'object' || Array.isArray(tools)) return undefined;
3164
- const selfImplement = (tools as Record<string, unknown>).selfImplement;
3165
- if (!selfImplement || typeof selfImplement !== 'object' || Array.isArray(selfImplement)) return undefined;
3166
- return typeof (selfImplement as Record<string, unknown>).graphAuthoritative === 'boolean'
3167
- ? config.tools.selfImplement.graphAuthoritative
3168
- : undefined;
3169
- }
3170
3315
 
3171
3316
  export interface UserConfig {
3317
+ /** Steward loop: observe-only until an independently approved act implementation exists. */
3318
+ loops?: { steward?: { mode?: 'observe' | 'act'; linearTeam?: string; roles?: Record<string, { maxConcurrent?: number }>; budget?: number } };
3319
+ /** 🔐 Pod 의 Grok API 키 과금은 명시 opt-in 만. 생략·잘못된 값은 false.
3320
+ * budgetGate 와 같은 `harness` 객체다 — 중복 선언이면 뒤 타입이 앞을 지운다. */
3321
+ harness?: { pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; defaultRepo?: string; substrate?: 'local' | 'pod'; podPool?: string };
3322
+ /** ☸️ Pod 실행 칸 — `pool` = 기존 기본 풀(`컨텍스트[@ssh호스트][:상한]` 쉼표 · 앞이 우선). harness 실행은 인자·ELANOUS_POD_POOL·harness.podPool 다음으로 읽는다. */
3323
+ pod?: { pool?: string; /** 원격 그라운딩 엔드포인트(호스트 nexus · tailnet 주소) — Pod 가 토큰으로 «질의→인용»만 묻는다(P13). */ groundingUrl?: string };
3172
3324
  skillRouter: SkillRouterConfig;
3173
3325
  llm: LLMConfig;
3174
3326
  skills: SkillsConfig;
@@ -3216,6 +3368,8 @@ export interface UserConfig {
3216
3368
  taste?: TasteConfig;
3217
3369
  /** 웹 검색 프로바이더 게이트(기본 OFF — `isTavilySearchEnabled()` 로만 읽는다). */
3218
3370
  webSearch?: WebSearchConfig;
3371
+ /** OpenDesign 시안 생성. 기본 없음 = 꺼짐. url 이 없으면 클라이언트가 호출하지 않는다. */
3372
+ design?: DesignConfig;
3219
3373
  /** G8 무인 리뷰루프 auto-review 라벨 자동부착 모드(sparse·기본 opt-in). §2b ROADMAP-elanous-is-all. */
3220
3374
  autoReview?: AutoReviewConfig;
3221
3375
  /** 표시·집계 시간대 (IANA 이름 · 예 `Asia/Seoul`). 2026-07-24 신설.
@@ -3255,14 +3409,23 @@ export interface UserConfig {
3255
3409
  * an active auto-mode goal on idle. Off by default: this ignites
3256
3410
  * self-firing turns, so it stays opt-in. */
3257
3411
  dispatch?: { enabled?: boolean };
3258
- /** next-fluent(태스크 완료 시 다음 액션 1-클릭 칩·2026-07-15). 기본 OFF — 켜면 done/failed 페이즈
3259
- * 카드에 mission-fabric 액션(rebuild·split·revise…) 칩 표시. `personas` 켜면 로컬 LLM 이유 부여
3260
- * (기본 결정론·무비용). config-over-env(thunk 로 매 호출 read → 데몬 재시작 불요). */
3261
- nextFluent?: { enabled?: boolean; personas?: boolean; models?: Record<string, string> };
3412
+ /** next-fluent(태스크 완료 시 다음 액션 1-클릭 칩·2026-07-15). 라우트는 늘 켬.
3413
+ * `personas` 켜면 로컬 LLM 이유 부여(기본 결정론·무비용). */
3414
+ nextFluent?: { personas?: boolean; models?: Record<string, string> };
3262
3415
  /** Ops Observability P3 — 셀프교정 자율 경계. health check 크론이 이상 감지 시
3263
3416
  * 자동 개입(재큐/재시작)까지 할지. 기본 disarmed(관측+알림만·HITL). 매매/재부팅은
3264
3417
  * 이 게이트가 armed 여도 항상 제외. 대표 결정 전까지 undefined=false. */
3265
- ops?: { selfHeal?: { armed?: boolean } };
3418
+ ops?: { selfHeal?: { armed?: boolean }; cronRepoRoot?: string };
3419
+ /** 승인 뒤 조율 채널 페이즈 배달(기본 OFF) 및 트랙 에이전트(기본 OFF, 최대 동시 2개). */
3420
+ autopilot?: {
3421
+ trackCourier?: { enabled?: boolean; channelPr?: number; handoffMinutes?: number };
3422
+ trackAgent?: { enabled: boolean; maxConcurrent: number };
3423
+ };
3424
+ /** 하니스 예산 게이트 설정. 판정은 P15 — 여기선 칸만 싣는다. 파서는 항상 기본을 채운다.
3425
+ * 선택이다 — 기존 UserConfig 리터럴이 이 칸 없이 컴파일되게 한다. 해석기는 없으면 기본을 쓴다.
3426
+ * 타입 칸은 위 `harness.budgetGate` 한 곳이다(중복 선언 금지). */
3427
+ /** 그라운딩 출처 레지스트리. 잘못된 항목은 경고와 함께 건너뛴다. 없으면 빈 목록. */
3428
+ grounding?: GroundingConfig;
3266
3429
  raw: Record<string, unknown>;
3267
3430
  // Phase 2 (PLAN-config-unification-elanous-root-2026-05-10):
3268
3431
  // NEXUS schema co-resident at root of `~/.elanous/config.json`.
@@ -3397,8 +3560,7 @@ function parseAutoReviewConfig(raw: unknown): AutoReviewConfig | undefined {
3397
3560
  return Object.keys(out).length > 0 ? out : undefined;
3398
3561
  }
3399
3562
 
3400
- /** Copy `ops`. `ops.selfHeal.armed` is boolean only; anything else is dropped
3401
- * with one warning line and left absent. */
3563
+ /** Parse optional ops fields independently; invalid settings cannot silently select a cron cwd. */
3402
3564
  function parseOpsConfig(raw: unknown): UserConfig['ops'] | undefined {
3403
3565
  if (raw === undefined) return undefined;
3404
3566
  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) {
@@ -3406,18 +3568,48 @@ function parseOpsConfig(raw: unknown): UserConfig['ops'] | undefined {
3406
3568
  return undefined;
3407
3569
  }
3408
3570
  const v = raw as Record<string, unknown>;
3409
- if (v.selfHeal === undefined) return undefined;
3410
- if (!v.selfHeal || typeof v.selfHeal !== 'object' || Array.isArray(v.selfHeal)) {
3411
- warnUserConfigDrop('ops.selfHeal', `객체가 아니다(${JSON.stringify(v.selfHeal)}) — 버림`);
3412
- return undefined;
3571
+ const parsed: NonNullable<UserConfig['ops']> = {};
3572
+ if (v.selfHeal !== undefined) {
3573
+ if (!v.selfHeal || typeof v.selfHeal !== 'object' || Array.isArray(v.selfHeal)) {
3574
+ warnUserConfigDrop('ops.selfHeal', `객체가 아니다(${JSON.stringify(v.selfHeal)}) — 버림`);
3575
+ } else {
3576
+ const armed = (v.selfHeal as Record<string, unknown>).armed;
3577
+ if (armed !== undefined) {
3578
+ if (typeof armed === 'boolean') parsed.selfHeal = { armed };
3579
+ else warnUserConfigDrop('ops.selfHeal.armed', `불리언이 아니다(${JSON.stringify(armed)}) — 버림`);
3580
+ }
3581
+ }
3413
3582
  }
3414
- const armed = (v.selfHeal as Record<string, unknown>).armed;
3415
- if (armed === undefined) return undefined;
3416
- if (typeof armed !== 'boolean') {
3417
- warnUserConfigDrop('ops.selfHeal.armed', `불리언이 아니다(${JSON.stringify(armed)}) — 버림`);
3418
- return undefined;
3583
+ if (v.cronRepoRoot !== undefined) {
3584
+ if (typeof v.cronRepoRoot === 'string' && v.cronRepoRoot.trim()) parsed.cronRepoRoot = v.cronRepoRoot.trim();
3585
+ else warnUserConfigDrop('ops.cronRepoRoot', `비어 있거나 문자열이 아니다(${JSON.stringify(v.cronRepoRoot)}) — 버림`);
3419
3586
  }
3420
- return { selfHeal: { armed } };
3587
+ return Object.keys(parsed).length ? parsed : undefined;
3588
+ }
3589
+
3590
+ function parseAutopilotConfig(raw: unknown): UserConfig['autopilot'] | undefined {
3591
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
3592
+ const values = raw as Record<string, unknown>;
3593
+ const parsed: NonNullable<UserConfig['autopilot']> = {};
3594
+ const courier = values.trackCourier;
3595
+ if (courier && typeof courier === 'object' && !Array.isArray(courier)) {
3596
+ const v = courier as Record<string, unknown>;
3597
+ parsed.trackCourier = {
3598
+ enabled: v.enabled === true,
3599
+ ...(typeof v.channelPr === 'number' && Number.isSafeInteger(v.channelPr) && v.channelPr > 0 ? { channelPr: v.channelPr } : {}),
3600
+ handoffMinutes: typeof v.handoffMinutes === 'number' && Number.isFinite(v.handoffMinutes) && v.handoffMinutes > 0 ? v.handoffMinutes : 60,
3601
+ };
3602
+ }
3603
+ const agent = values.trackAgent;
3604
+ if (agent && typeof agent === 'object' && !Array.isArray(agent)) {
3605
+ const v = agent as Record<string, unknown>;
3606
+ parsed.trackAgent = {
3607
+ enabled: v.enabled === true,
3608
+ maxConcurrent: typeof v.maxConcurrent === 'number' && Number.isSafeInteger(v.maxConcurrent) && v.maxConcurrent > 0
3609
+ ? Math.min(v.maxConcurrent, 2) : 2,
3610
+ };
3611
+ }
3612
+ return Object.keys(parsed).length > 0 ? parsed : undefined;
3421
3613
  }
3422
3614
 
3423
3615
  function parseRoleLlmConfig(raw: unknown): RoleLlmConfig | undefined {
@@ -3467,7 +3659,6 @@ function defaultConfig(): UserConfig {
3467
3659
  toolDeny: [],
3468
3660
  rendering: {
3469
3661
  streaming: { ...CHAT_DEFAULTS.rendering.streaming },
3470
- compactBoundary: { ...CHAT_DEFAULTS.rendering.compactBoundary },
3471
3662
  wrap: { ...CHAT_DEFAULTS.rendering.wrap },
3472
3663
  tool: { ...CHAT_DEFAULTS.rendering.tool },
3473
3664
  diff: { ...CHAT_DEFAULTS.rendering.diff },
@@ -3513,6 +3704,8 @@ function defaultConfig(): UserConfig {
3513
3704
  nativeStructure: { ...TOOLS_DEFAULTS.nativeStructure },
3514
3705
  selfImplement: { ...TOOLS_DEFAULTS.selfImplement },
3515
3706
  },
3707
+ harness: { budgetGate: { ...DEFAULT_BUDGET_GATE } },
3708
+ grounding: { sources: [] },
3516
3709
  raw: {},
3517
3710
  };
3518
3711
  }
@@ -3855,6 +4048,26 @@ export const RETIRED_CONFIG_KEYS: readonly RetiredConfigKey[] = [
3855
4048
  { path: 'chat.rendering.tool.inlineOneLine', reason: '읽는 곳이 없다 — 지워도 된다 (2026-09-26 설정 졸업 2)' },
3856
4049
  { path: 'vw.acpResident', reason: '읽는 곳이 없다 — 지워도 된다 (2026-09-26 설정 졸업 2 · vw.acp.resident 도 소비자 없음)' },
3857
4050
  { path: 'discord.sprint21', reason: '읽는 곳이 없다 — 지워도 된다 (2026-09-26 설정 졸업 2 · 런타임 sprint21-runtime 은 호출처 0·휴면)' },
4051
+ { path: 'tools.selfImplement.prEvidenceArtifactEnforce', reason: '차단 스위치 졸업 — PR 근거 관문은 막지 않고 관측만 한다(2026-09-26 설정 졸업 · 한 번도 기본으로 안 켜졌다)' },
4052
+ { path: 'voice.discord.dispatch', reason: '읽는 곳이 없다 — 지워도 된다 (2026-09-26 설정 졸업 2 · 값을 쓰던 디스코드 음성 어댑터는 호출처 0)' },
4053
+ { path: 'voice.discord.replyMode', reason: '읽는 곳이 없다 — 지워도 된다 (2026-09-26 설정 졸업 2 · 값을 쓰던 디스코드 음성 어댑터는 호출처 0)' },
4054
+ { path: 'voice.pwa.dispatch', reason: '읽는 곳이 없다 — 지워도 된다 (2026-09-26 설정 졸업 2 · voice-pwa-dispatch 는 호출처 0)' },
4055
+ { path: 'voice.stt.mode', reason: '타입에 없는 키 — 읽는 곳이 없다 (2026-09-26 설정 졸업 2)' },
4056
+ { path: 'voice.stt.language', reason: '타입에 없는 키 — 읽는 곳이 없다 (2026-09-26 설정 졸업 2)' },
4057
+ // 설정 졸업 1-d(2026-09-26): 3층(트리 파생)은 늘 켠다 — 리더 미지정이면 운영으로 떨어지므로 새 설치의 동작은 같다.
4058
+ { path: 'instance.treeDerivedTest', reason: '늘 켬으로 졸업 — 지워도 된다 (2026-09-26 설정 졸업 1-d)' },
4059
+ { path: 'tools.selfImplement.selfResolveClarifications', reason: '늘 켬으로 졸업 — 지워도 된다 (2026-09-26 설정 졸업 1-c · self author 도 harness 와 같이 되묻기를 자동 답변)' },
4060
+ { path: 'chat.rendering.compactBoundary.enabled', reason: '늘 켜짐 — 옵션 졸업 (2026-09-26 설정 졸업 1-f)' },
4061
+ { path: 'chat.rendering.wrap.preserveOsc8', reason: '늘 켜짐 — 옵션 졸업 (2026-09-26 설정 졸업 1-f)' },
4062
+ { path: 'chat.rendering.diff.adaptiveBg', reason: '늘 켜짐 — 옵션 졸업 (2026-09-26 설정 졸업 1-f)' },
4063
+ { path: 'chat.rendering.diff.syntaxPerHunk', reason: '늘 켜짐 — 옵션 졸업 (2026-09-26 설정 졸업 1-f)' },
4064
+ { path: 'chat.rendering.diff.cache', reason: '늘 켜짐 — 옵션 졸업 (2026-09-26 설정 졸업 1-f)' },
4065
+ { path: 'chat.rendering.diff.turnSummary', reason: '늘 켜짐 — 옵션 졸업 (2026-09-26 설정 졸업 1-f)' },
4066
+ { path: 'chat.rendering.diff.turnBrowser', reason: '늘 켜짐 — 옵션 졸업 (2026-09-26 설정 졸업 1-f)' },
4067
+ { path: 'sessionFabric.telegram.reactions', reason: '늘 켬 — 옵션 졸업 (2026-09-26 설정 졸업 1-f)' },
4068
+ { path: 'sessionFabric.discord.reactions', reason: '늘 켬 — 옵션 졸업 (2026-09-26 설정 졸업 1-f)' },
4069
+ { path: 'nextFluent.enabled', reason: '늘 켬 — 옵션 졸업 (2026-09-26 설정 졸업 1-f)' },
4070
+ { path: 'tools.selfImplement.graphAuthoritative', reason: '2026-09-26 설정 졸업 — 그래프 권위는 항상 켬 · 지워도 된다' },
3858
4071
  ];
3859
4072
 
3860
4073
  /** 설정 원문(JSON 객체)에서 폐기 키가 «있는» 항목만 돌려준다. 순수. */
@@ -3893,6 +4106,27 @@ function observeRetiredConfigKeysOnce(raw: Record<string, unknown>): void {
3893
4106
  } catch { /* observation must never break config loading */ }
3894
4107
  }
3895
4108
 
4109
+ function parseStewardLoopsConfig(input: unknown): UserConfig['loops'] {
4110
+ if (!input || typeof input !== 'object' || Array.isArray(input)) return undefined;
4111
+ const value = (input as Record<string, unknown>).steward;
4112
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;
4113
+ const s = value as Record<string, unknown>;
4114
+ const roles: NonNullable<NonNullable<UserConfig['loops']>['steward']>['roles'] = {};
4115
+ if (s.roles && typeof s.roles === 'object' && !Array.isArray(s.roles)) {
4116
+ for (const [role, entry] of Object.entries(s.roles)) {
4117
+ if (!entry || typeof entry !== 'object' || Array.isArray(entry)) continue;
4118
+ const max = (entry as Record<string, unknown>).maxConcurrent;
4119
+ if (typeof max === 'number' && Number.isInteger(max) && max >= 0) roles[role] = { maxConcurrent: max };
4120
+ }
4121
+ }
4122
+ return { steward: {
4123
+ mode: s.mode === 'act' ? 'act' : 'observe',
4124
+ ...(typeof s.linearTeam === 'string' && s.linearTeam.trim() ? { linearTeam: s.linearTeam.trim() } : {}),
4125
+ ...(Object.keys(roles).length ? { roles } : {}),
4126
+ ...(typeof s.budget === 'number' && Number.isFinite(s.budget) && s.budget >= 0 ? { budget: s.budget } : {}),
4127
+ } };
4128
+ }
4129
+
3896
4130
  export function buildUserConfig(path: string = defaultPath()): UserConfig {
3897
4131
  if (!existsSync(path)) return defaultConfigWithRuntimeProvider();
3898
4132
  let raw: unknown;
@@ -3904,6 +4138,9 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
3904
4138
  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return defaultConfigWithRuntimeProvider();
3905
4139
  const rawObj = raw as Record<string, unknown>;
3906
4140
  observeRetiredConfigKeysOnce(rawObj);
4141
+ const harness = rawObj.harness && typeof rawObj.harness === 'object' && !Array.isArray(rawObj.harness) ? rawObj.harness as Record<string, unknown> : {};
4142
+ const harnessPod = harness.pod && typeof harness.pod === 'object' && !Array.isArray(harness.pod) ? harness.pod as Record<string, unknown> : {};
4143
+ const legacyPod = rawObj.pod && typeof rawObj.pod === 'object' && !Array.isArray(rawObj.pod) ? rawObj.pod as Record<string, unknown> : {};
3907
4144
 
3908
4145
  const sr = (rawObj.skillRouter ?? {}) as Record<string, unknown>;
3909
4146
  let llm = (rawObj.llm ?? {}) as Record<string, unknown>;
@@ -3952,7 +4189,6 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
3952
4189
  const chatSystemPrompt = (chat.systemPrompt ?? {}) as Record<string, unknown>;
3953
4190
  const chatRendering = (chat.rendering ?? {}) as Record<string, unknown>;
3954
4191
  const chatRenderingStreaming = (chatRendering.streaming ?? {}) as Record<string, unknown>;
3955
- const chatRenderingCompactBoundary = (chatRendering.compactBoundary ?? {}) as Record<string, unknown>;
3956
4192
  const chatRenderingWrap = (chatRendering.wrap ?? {}) as Record<string, unknown>;
3957
4193
  const chatRenderingDiff = (chatRendering.diff ?? {}) as Record<string, unknown>;
3958
4194
  const chatRenderingHud = (chatRendering.hud ?? {}) as Record<string, unknown>;
@@ -3969,6 +4205,11 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
3969
4205
  const intakeTelegram = (intake.telegram ?? {}) as Record<string, unknown>;
3970
4206
  const intakeDiscord = (intake.discord ?? {}) as Record<string, unknown>;
3971
4207
  const dash = (rawObj.dashboard ?? {}) as Record<string, unknown>;
4208
+ const retiredModeKeys = (['uiMode', 'defaultMode'] as const)
4209
+ .filter((key) => Object.prototype.hasOwnProperty.call(dash, key));
4210
+ if (retiredModeKeys.length > 0) {
4211
+ debug.log('dashboard.ui-mode', 'retired-config-ignored', { key: retiredModeKeys.join(',') });
4212
+ }
3972
4213
  const dashPromptBank = (dash.promptBank ?? {}) as Record<string, unknown>;
3973
4214
  const vw = (rawObj.vw ?? {}) as Record<string, unknown>;
3974
4215
  const acp = (rawObj.acp ?? {}) as Record<string, unknown>;
@@ -3986,8 +4227,26 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
3986
4227
  ? (rawObj.global as Record<string, unknown>)
3987
4228
  : undefined;
3988
4229
  const rawNotifications = rawGlobalObj?.notifications ?? rawObj.notifications;
4230
+ const autopilotConfig = parseAutopilotConfig(rawObj.autopilot);
4231
+ const stewardLoops = parseStewardLoopsConfig(rawObj.loops);
3989
4232
 
3990
4233
  return {
4234
+ pod: {
4235
+ ...(typeof legacyPod.pool === 'string' && legacyPod.pool.trim() ? { pool: legacyPod.pool.trim() } : {}),
4236
+ ...(typeof legacyPod.groundingUrl === 'string' ? { groundingUrl: legacyPod.groundingUrl } : {}),
4237
+ },
4238
+ harness: {
4239
+ pod: { grokApiKeyOptIn: harnessPod.grokApiKeyOptIn === true },
4240
+ ...(harness.substrate === 'local' || harness.substrate === 'pod' ? { substrate: harness.substrate } : {}),
4241
+ ...(typeof harness.podPool === 'string' && harness.podPool.trim() ? { podPool: harness.podPool.trim() } : {}),
4242
+ ...(typeof harness.defaultRepo === 'string' && isAbsolute(harness.defaultRepo)
4243
+ ? { defaultRepo: harness.defaultRepo } : {}),
4244
+ budgetGate: parseHarnessBudgetGate(
4245
+ rawObj.harness && typeof rawObj.harness === 'object' && !Array.isArray(rawObj.harness)
4246
+ ? (rawObj.harness as Record<string, unknown>).budgetGate
4247
+ : undefined,
4248
+ ),
4249
+ },
3991
4250
  skillRouter: {
3992
4251
  autoRoute: sr.autoRoute === true,
3993
4252
  autoRouteCountdownMs: clampNum(sr.autoRouteCountdownMs, SR_DEFAULTS.autoRouteCountdownMs, 0, 10000),
@@ -4066,6 +4325,8 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4066
4325
  .filter(([, value]) => typeof value === 'number'))
4067
4326
  : undefined,
4068
4327
  // ⛔ 같은 모양(문자열 배열)이라 아래 fallbackChain 과 «같은 자»를 쓴다.
4328
+ codexCreditsAllowed: llm.codexCreditsAllowed === true ? true : undefined,
4329
+ codexQuotaPolicy: isCodexQuotaPolicy(llm.codexQuotaPolicy) ? llm.codexQuotaPolicy : undefined,
4069
4330
  codexAccountOrder: Array.isArray(llm.codexAccountOrder)
4070
4331
  ? llm.codexAccountOrder.filter((v: unknown): v is string => typeof v === 'string' && v.length > 0)
4071
4332
  : undefined,
@@ -4100,6 +4361,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4100
4361
  },
4101
4362
  obsidian: {
4102
4363
  vault: str(ob.vault) ?? obsidianDefaults().vault,
4364
+ ...(str(ob.testVault) ? { testVault: str(ob.testVault)! } : {}),
4103
4365
  },
4104
4366
  telegram: {
4105
4367
  enabled: tg.enabled === true,
@@ -4333,16 +4595,8 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4333
4595
  10_000,
4334
4596
  ),
4335
4597
  },
4336
- compactBoundary: {
4337
- enabled: chatRenderingCompactBoundary.enabled === false
4338
- ? false
4339
- : CHAT_DEFAULTS.rendering.compactBoundary.enabled,
4340
- },
4341
4598
  wrap: {
4342
4599
  urlAware: chatRenderingWrap.urlAware === true,
4343
- preserveOsc8: chatRenderingWrap.preserveOsc8 === false
4344
- ? false
4345
- : CHAT_DEFAULTS.rendering.wrap.preserveOsc8,
4346
4600
  },
4347
4601
  tool: {
4348
4602
  displayMode: normalizeChatRenderingToolDisplayMode(
@@ -4361,22 +4615,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4361
4615
  },
4362
4616
  diff: {
4363
4617
  colorTier: normalizeChatRenderingDiffColorTier(chatRenderingDiff.colorTier),
4364
- adaptiveBg: chatRenderingDiff.adaptiveBg === false
4365
- ? false
4366
- : CHAT_DEFAULTS.rendering.diff.adaptiveBg,
4367
- syntaxPerHunk: chatRenderingDiff.syntaxPerHunk === false
4368
- ? false
4369
- : CHAT_DEFAULTS.rendering.diff.syntaxPerHunk,
4370
- cache: chatRenderingDiff.cache === false
4371
- ? false
4372
- : CHAT_DEFAULTS.rendering.diff.cache,
4373
4618
  headerStyle: normalizeChatRenderingDiffHeaderStyle(chatRenderingDiff.headerStyle),
4374
- turnSummary: chatRenderingDiff.turnSummary === false
4375
- ? false
4376
- : CHAT_DEFAULTS.rendering.diff.turnSummary,
4377
- turnBrowser: chatRenderingDiff.turnBrowser === false
4378
- ? false
4379
- : CHAT_DEFAULTS.rendering.diff.turnBrowser,
4380
4619
  turnBrowserHistory: clampNum(
4381
4620
  chatRenderingDiff.turnBrowserHistory,
4382
4621
  CHAT_DEFAULTS.rendering.diff.turnBrowserHistory,
@@ -4461,12 +4700,6 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4461
4700
  ...(typeof voiceChat.multiTurn === 'boolean' ? { multiTurn: voiceChat.multiTurn } : {}),
4462
4701
  },
4463
4702
  discord: {
4464
- ...(normalizeVoiceDiscordDispatch(voiceDiscord.dispatch) !== undefined
4465
- ? { dispatch: normalizeVoiceDiscordDispatch(voiceDiscord.dispatch)! }
4466
- : {}),
4467
- ...(normalizeVoiceDiscordReplyMode(voiceDiscord.replyMode) !== undefined
4468
- ? { replyMode: normalizeVoiceDiscordReplyMode(voiceDiscord.replyMode)! }
4469
- : {}),
4470
4703
  ...(typeof voiceDiscord.voiceLanguage === 'string' && voiceDiscord.voiceLanguage.length > 0
4471
4704
  ? { voiceLanguage: voiceDiscord.voiceLanguage }
4472
4705
  : {}),
@@ -4523,9 +4756,6 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4523
4756
  : {}),
4524
4757
  },
4525
4758
  pwa: {
4526
- ...(normalizeVoicePwaDispatch(voicePwa.dispatch) !== undefined
4527
- ? { dispatch: normalizeVoicePwaDispatch(voicePwa.dispatch)! }
4528
- : {}),
4529
4759
  },
4530
4760
  },
4531
4761
  intake: {
@@ -4539,6 +4769,10 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4539
4769
  ? { ambientCapture: normalizeIntakeAmbientCaptureMode(intakeDiscord.ambientCapture)! }
4540
4770
  : {}),
4541
4771
  },
4772
+ ...(intake.approvals && typeof intake.approvals === 'object' && !Array.isArray(intake.approvals)
4773
+ && typeof (intake.approvals as Record<string, unknown>).repo === 'string'
4774
+ ? { approvals: { repo: (intake.approvals as { repo: string }).repo } }
4775
+ : {}),
4542
4776
  },
4543
4777
  dashboard: {
4544
4778
  views: dash.views && typeof dash.views === 'object' && !Array.isArray(dash.views)
@@ -4547,12 +4781,6 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4547
4781
  theme: dash.theme && typeof dash.theme === 'object' && !Array.isArray(dash.theme)
4548
4782
  ? dash.theme as Record<string, unknown>
4549
4783
  : undefined,
4550
- defaultMode: dash.defaultMode === 'chat' || dash.defaultMode === 'dashboard'
4551
- ? dash.defaultMode
4552
- : undefined,
4553
- uiMode: dash.uiMode === 'essential' || dash.uiMode === 'rich'
4554
- ? dash.uiMode
4555
- : undefined,
4556
4784
  foldMode: dash.foldMode === 'line' || dash.foldMode === 'task-unit' || dash.foldMode === 'kind-unit'
4557
4785
  ? dash.foldMode
4558
4786
  : 'task-unit',
@@ -4624,12 +4852,15 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4624
4852
  goals: parseGoalsConfig(rawObj.goals),
4625
4853
  registry: parseRegistryConfig(rawObj.registry),
4626
4854
  tools: parseToolsConfig(rawObj.tools),
4855
+ ...(stewardLoops ? { loops: stewardLoops } : {}),
4627
4856
  // M1-1: sparse — undefined when the user hasn't set anything, so
4628
4857
  // resolvers fall through to zero-config defaults.
4629
4858
  ...spreadIfDefined('modelTier', parseModelTierConfig(rawObj.modelTier)),
4630
4859
  ...spreadIfDefined('sessionFabric', parseSessionFabricConfig(rawObj.sessionFabric)),
4860
+ ...spreadIfDefined('nextFluent', parseNextFluentConfig(rawObj.nextFluent)),
4631
4861
  ...spreadIfDefined('taste', parseTasteConfig(rawObj.taste)),
4632
4862
  ...spreadIfDefined('webSearch', parseWebSearchConfig(rawObj.webSearch)),
4863
+ ...spreadIfDefined('design', parseDesignConfig(rawObj.design)),
4633
4864
  ...spreadIfDefined('budget', parseBudgetConfig(rawObj.budget)),
4634
4865
  ...spreadIfDefined('smartDefaults', parseSmartDefaultsConfig(rawObj.smartDefaults)),
4635
4866
  ...spreadIfDefined('roleModels', parseRoleModelConfig(rawObj.roleModels)),
@@ -4637,6 +4868,8 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4637
4868
  ...spreadIfDefined('roleLlm', parseRoleLlmConfig(rawObj.roleLlm)),
4638
4869
  ...spreadIfDefined('autoReview', parseAutoReviewConfig(rawObj.autoReview)),
4639
4870
  ...spreadIfDefined('ops', parseOpsConfig(rawObj.ops)),
4871
+ ...(autopilotConfig ? { autopilot: autopilotConfig } : {}),
4872
+ grounding: parseGroundingSources(rawObj.grounding),
4640
4873
  ...spreadIfDefined('notifications', parseNotificationsConfig(rawNotifications)),
4641
4874
  ...spreadIfDefined('mcp', parseMcpConfig(rawObj.mcp)),
4642
4875
  ...spreadIfDefined('backgroundReasoning', parseBackgroundReasoningConfig(rawObj.backgroundReasoning)),
@@ -5139,10 +5372,6 @@ export function saveUserConfig(
5139
5372
  ...CHAT_DEFAULTS.rendering.streaming,
5140
5373
  ...(cfg.chat.rendering?.streaming ?? {}),
5141
5374
  },
5142
- compactBoundary: {
5143
- ...CHAT_DEFAULTS.rendering.compactBoundary,
5144
- ...(cfg.chat.rendering?.compactBoundary ?? {}),
5145
- },
5146
5375
  wrap: {
5147
5376
  ...CHAT_DEFAULTS.rendering.wrap,
5148
5377
  ...(cfg.chat.rendering?.wrap ?? {}),
@@ -5189,11 +5418,24 @@ export function saveUserConfig(
5189
5418
  // parsers; strip from raw so stale copies don't double-write.
5190
5419
  delete rawRest.modelTier;
5191
5420
  delete rawRest.sessionFabric;
5421
+ delete rawRest.nextFluent;
5192
5422
  delete rawRest.taste;
5193
5423
  delete rawRest.budget;
5194
5424
  delete rawRest.smartDefaults;
5425
+ delete rawRest.grounding;
5426
+ const rawHarness = rawRest.harness && typeof rawRest.harness === 'object' && !Array.isArray(rawRest.harness)
5427
+ ? rawRest.harness as Record<string, unknown> : {};
5428
+ delete rawRest.harness;
5195
5429
 
5196
5430
  const out: Record<string, unknown> = {
5431
+ harness: stripUndef({
5432
+ ...rawHarness,
5433
+ pod: cfg.harness?.pod ?? rawHarness.pod,
5434
+ budgetGate: cfg.harness?.budgetGate ?? rawHarness.budgetGate,
5435
+ defaultRepo: cfg.harness?.defaultRepo ?? rawHarness.defaultRepo,
5436
+ substrate: cfg.harness?.substrate,
5437
+ podPool: cfg.harness?.podPool,
5438
+ }),
5197
5439
  ...rawRest,
5198
5440
  skillRouter: cfg.skillRouter,
5199
5441
  llm: stripUndef({
@@ -5231,6 +5473,9 @@ export function saveUserConfig(
5231
5473
  codexAccountRotationThresholdPercent: cfg.llm.codexAccountRotationThresholdPercent,
5232
5474
  codexAccountRotationThresholdPercentByAccount: cfg.llm.codexAccountRotationThresholdPercentByAccount,
5233
5475
  codexAccountOrder: cfg.llm.codexAccountOrder,
5476
+ // ★ 2026-09-28: 타입·파서에만 넣고 이 whitelist 를 빠뜨려 `config set llm.codexCreditsAllowed true` 가 «직렬화 드롭» 됐다(#21375 직후 운영 실측).
5477
+ codexCreditsAllowed: cfg.llm.codexCreditsAllowed,
5478
+ codexQuotaPolicy: cfg.llm.codexQuotaPolicy,
5234
5479
  fallbackChain: cfg.llm.fallbackChain,
5235
5480
  reviewFallbackModels: cfg.llm.reviewFallbackModels,
5236
5481
  codexStore: cfg.llm.codexStore,
@@ -5265,7 +5510,7 @@ export function saveUserConfig(
5265
5510
  includeClaudePackageSkills: cfg.skills.includeClaudePackageSkills === true ? true : undefined,
5266
5511
  includeClaudePackageCommands: cfg.skills.includeClaudePackageCommands === true ? true : undefined,
5267
5512
  }),
5268
- obsidian: { vault: cfg.obsidian.vault },
5513
+ obsidian: { vault: cfg.obsidian.vault, ...(cfg.obsidian.testVault ? { testVault: cfg.obsidian.testVault } : {}) },
5269
5514
  telegram: stripUndef({
5270
5515
  enabled: cfg.telegram.enabled,
5271
5516
  botToken: cfg.telegram.botToken,
@@ -5364,12 +5609,8 @@ export function saveUserConfig(
5364
5609
  catchUpThresholdLines: chatRendering.streaming.catchUpThresholdLines,
5365
5610
  catchUpAgeMs: chatRendering.streaming.catchUpAgeMs,
5366
5611
  }),
5367
- compactBoundary: stripUndef({
5368
- enabled: chatRendering.compactBoundary.enabled,
5369
- }),
5370
5612
  wrap: stripUndef({
5371
5613
  urlAware: chatRendering.wrap.urlAware,
5372
- preserveOsc8: chatRendering.wrap.preserveOsc8,
5373
5614
  }),
5374
5615
  tool: stripUndef({
5375
5616
  displayMode: chatRendering.tool.displayMode,
@@ -5377,12 +5618,7 @@ export function saveUserConfig(
5377
5618
  }),
5378
5619
  diff: stripUndef({
5379
5620
  colorTier: chatRendering.diff.colorTier,
5380
- adaptiveBg: chatRendering.diff.adaptiveBg,
5381
- syntaxPerHunk: chatRendering.diff.syntaxPerHunk,
5382
- cache: chatRendering.diff.cache,
5383
5621
  headerStyle: chatRendering.diff.headerStyle,
5384
- turnSummary: chatRendering.diff.turnSummary,
5385
- turnBrowser: chatRendering.diff.turnBrowser,
5386
5622
  turnBrowserHistory: chatRendering.diff.turnBrowserHistory,
5387
5623
  turnBrowserMode: chatRendering.diff.turnBrowserMode,
5388
5624
  }),
@@ -5396,10 +5632,6 @@ export function saveUserConfig(
5396
5632
  views: cfg.dashboard.views,
5397
5633
  theme: cfg.dashboard.theme,
5398
5634
  promptBank: cfg.dashboard.promptBank,
5399
- // TUI 부활 T2 — uiMode 런타임 persist(/ui). defaultMode·benchmark 는
5400
- // 종전 serializer 가 드롭하던 latent bug 동반 수리 (round-trip 보존).
5401
- defaultMode: cfg.dashboard.defaultMode,
5402
- uiMode: cfg.dashboard.uiMode,
5403
5635
  foldMode: cfg.dashboard.foldMode,
5404
5636
  benchmark: cfg.dashboard.benchmark,
5405
5637
  enableVirtualWindowSwitchKeys: cfg.dashboard.enableVirtualWindowSwitchKeys,
@@ -5499,10 +5731,15 @@ export function saveUserConfig(
5499
5731
  // users' file clean (no empty modelTier:{} blobs).
5500
5732
  ...(cfg.modelTier ? { modelTier: cfg.modelTier } : {}),
5501
5733
  ...(cfg.sessionFabric ? { sessionFabric: cfg.sessionFabric } : {}),
5734
+ ...(cfg.nextFluent ? { nextFluent: cfg.nextFluent } : {}),
5502
5735
  ...(cfg.taste ? { taste: cfg.taste } : {}),
5503
5736
  ...(cfg.webSearch ? { webSearch: cfg.webSearch } : {}),
5737
+ ...(cfg.design ? { design: cfg.design } : {}),
5504
5738
  ...(cfg.budget ? { budget: cfg.budget } : {}),
5505
5739
  ...(cfg.smartDefaults ? { smartDefaults: cfg.smartDefaults } : {}),
5740
+ ...(cfg.grounding && cfg.grounding.sources.length > 0
5741
+ ? { grounding: { sources: cfg.grounding.sources } }
5742
+ : {}),
5506
5743
  };
5507
5744
  mkdirSync(dirname(path), { recursive: true });
5508
5745
  // FU3: lock-protected atomic write. Path B's patchUserConfig acquires