elanous 0.2.9 → 0.2.11

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 (694) hide show
  1. package/apps/pwa/out/404/index.html +1 -1
  2. package/apps/pwa/out/404.html +1 -1
  3. package/apps/pwa/out/_next/static/Y4zKzL62sakG5momz3SoQ/_buildManifest.js +1 -0
  4. package/apps/pwa/out/_next/static/chunks/1159-0c5ef8bc21cb6afb.js +1 -0
  5. package/apps/pwa/out/_next/static/chunks/1394-556de6d71bbdb0fb.js +1 -0
  6. package/apps/pwa/out/_next/static/chunks/1452.93700483b9d4fc61.js +9 -0
  7. package/apps/pwa/out/_next/static/chunks/{6062-73e68343a9814f6a.js → 1829-b453a1b22d3999bb.js} +1 -1
  8. package/apps/pwa/out/_next/static/chunks/2176-c379e3ebce874151.js +1 -0
  9. package/apps/pwa/out/_next/static/chunks/2310-7a59f043f6db207e.js +1 -0
  10. package/apps/pwa/out/_next/static/chunks/2426.8c6ee0c668d53def.js +1 -0
  11. package/apps/pwa/out/_next/static/chunks/2548-6e316138d347cefe.js +1 -0
  12. package/apps/pwa/out/_next/static/chunks/3170-7ec60a56fa0e4728.js +1 -0
  13. package/apps/pwa/out/_next/static/chunks/3278-ae6ef084769f6195.js +1 -0
  14. package/apps/pwa/out/_next/static/chunks/3454-988a53dac60a1763.js +1 -0
  15. package/apps/pwa/out/_next/static/chunks/3638-aa80b4641ea439db.js +1 -0
  16. package/apps/pwa/out/_next/static/chunks/3735-fe3402553ac1c9c6.js +1 -0
  17. package/apps/pwa/out/_next/static/chunks/3869-a39d1d9921e10d43.js +1 -0
  18. package/apps/pwa/out/_next/static/chunks/390.c373e31b3b9d0c41.js +5 -0
  19. package/apps/pwa/out/_next/static/chunks/3992-2e522a8ac5f2afde.js +25 -0
  20. package/apps/pwa/out/_next/static/chunks/4215-c9d91dd644ec1719.js +1 -0
  21. package/apps/pwa/out/_next/static/chunks/4508-5d0161d1e724d735.js +1 -0
  22. package/apps/pwa/out/_next/static/chunks/4685-c3c1c625b71accd1.js +1 -0
  23. package/apps/pwa/out/_next/static/chunks/4733-623a79345b171e1c.js +1 -0
  24. package/apps/pwa/out/_next/static/chunks/4883.3bd969ea1d3aaaff.js +2 -0
  25. package/apps/pwa/out/_next/static/chunks/507-5acd98bd6dab2d8a.js +1 -0
  26. package/apps/pwa/out/_next/static/chunks/5445-745eb795c5963d79.js +1 -0
  27. package/apps/pwa/out/_next/static/chunks/5532.6899a12958a89b72.js +1 -0
  28. package/apps/pwa/out/_next/static/chunks/5845-e6c003ce8d5fd36a.js +1 -0
  29. package/apps/pwa/out/_next/static/chunks/5978-b27004c677119115.js +1 -0
  30. package/apps/pwa/out/_next/static/chunks/{8046cadf-211ca3c0e00f2b72.js → 5cd7e3a9-404fd6b8d0ecd44c.js} +1 -1
  31. package/apps/pwa/out/_next/static/chunks/6048-4c5c33579bc4ef78.js +1 -0
  32. package/apps/pwa/out/_next/static/chunks/6303-422dbf0f67c72aac.js +1 -0
  33. package/apps/pwa/out/_next/static/chunks/6751-bb3595948b2e311b.js +1 -0
  34. package/apps/pwa/out/_next/static/chunks/7274-19b7279f18b47ab3.js +1 -0
  35. package/apps/pwa/out/_next/static/chunks/{4323.c5dfb6f503304775.js → 7334.a6679d9168f37aa8.js} +1 -1
  36. package/apps/pwa/out/_next/static/chunks/7551-a0e0707b79164ddd.js +1 -0
  37. package/apps/pwa/out/_next/static/chunks/7777-79f845045aa1ed86.js +1 -0
  38. package/apps/pwa/out/_next/static/chunks/79f8be9e-957d68913b590b08.js +1 -0
  39. package/apps/pwa/out/_next/static/chunks/8025-cc24ee5d8f2fb6f8.js +1 -0
  40. package/apps/pwa/out/_next/static/chunks/8039-df92e08fede5de8f.js +1 -0
  41. package/apps/pwa/out/_next/static/chunks/8206-c6684dcde12be721.js +1 -0
  42. package/apps/pwa/out/_next/static/chunks/8421-1c4acfb1395a0edf.js +1 -0
  43. package/apps/pwa/out/_next/static/chunks/8605-ea5bee9dfae512c7.js +1 -0
  44. package/apps/pwa/out/_next/static/chunks/8725.bf46bb1395dd0fa2.js +1 -0
  45. package/apps/pwa/out/_next/static/chunks/8734-252d511cd276c0dc.js +1 -0
  46. package/apps/pwa/out/_next/static/chunks/8834-ca1cb09c1cb1a6bf.js +1 -0
  47. package/apps/pwa/out/_next/static/chunks/{2415.ed6428ff334c7ce2.js → 9269.d2a4795bc6812717.js} +1 -1
  48. package/apps/pwa/out/_next/static/chunks/9538-2816b90923606459.js +1 -0
  49. package/apps/pwa/out/_next/static/chunks/9656-c1540088f5859c80.js +1 -0
  50. package/apps/pwa/out/_next/static/chunks/9906-482c6619b3fdda20.js +1 -0
  51. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-d16993889b125c42.js +1 -0
  52. package/apps/pwa/out/_next/static/chunks/app/approvals/page-1dcdc58fc2de2454.js +1 -0
  53. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-6a061bd97f0b9398.js +1 -0
  54. package/apps/pwa/out/_next/static/chunks/app/board/page-cb95a7432c9ee744.js +1 -0
  55. package/apps/pwa/out/_next/static/chunks/app/botlab/{page-f972fc1c00a62e88.js → page-b12b6d2f8d2d1aea.js} +1 -1
  56. package/apps/pwa/out/_next/static/chunks/app/bots/page-b9efe868bfd36255.js +1 -0
  57. package/apps/pwa/out/_next/static/chunks/app/chat/page-7c97dcdfe2e37a60.js +1 -0
  58. package/apps/pwa/out/_next/static/chunks/app/consult/page-8fd36984f549270a.js +1 -0
  59. package/apps/pwa/out/_next/static/chunks/app/control/page-5721537ca8a3598c.js +1 -0
  60. package/apps/pwa/out/_next/static/chunks/app/design-check/page-b654240a572e4c48.js +1 -0
  61. package/apps/pwa/out/_next/static/chunks/app/editor/page-b9750abc897508c3.js +1 -0
  62. package/apps/pwa/out/_next/static/chunks/app/exec/page-4cd1de371f8ad048.js +1 -0
  63. package/apps/pwa/out/_next/static/chunks/app/field/page-d99f89657828421c.js +1 -0
  64. package/apps/pwa/out/_next/static/chunks/app/healthz/route-d16993889b125c42.js +1 -0
  65. package/apps/pwa/out/_next/static/chunks/app/inside/page-50cb2a0eb15e6c83.js +1 -0
  66. package/apps/pwa/out/_next/static/chunks/app/intake/page-c8b1ccda6ba7ae98.js +1 -0
  67. package/apps/pwa/out/_next/static/chunks/app/layout-d6b1d156fb95e74b.js +1 -0
  68. package/apps/pwa/out/_next/static/chunks/app/live/page-2a9932ddb62d76bd.js +1 -0
  69. package/apps/pwa/out/_next/static/chunks/app/market/page-9688f5b4f1ff950f.js +1 -0
  70. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-6b15dd6456c5df09.js +1 -0
  71. package/apps/pwa/out/_next/static/chunks/app/morning/{page-adfbd2ba9598e59a.js → page-35414e0a007b4082.js} +1 -1
  72. package/apps/pwa/out/_next/static/chunks/app/not-found-e7a529e0507ac86c.js +1 -0
  73. package/apps/pwa/out/_next/static/chunks/app/observatory/page-e001823c35c9dd67.js +1 -0
  74. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-371423d1a573d64b.js +1 -0
  75. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-4b764b125339ac17.js +1 -0
  76. package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-cdf8e4b01067bcf1.js +1 -0
  77. package/apps/pwa/out/_next/static/chunks/app/outputs/page-3a24072b35470157.js +1 -0
  78. package/apps/pwa/out/_next/static/chunks/app/page-94c82eb0ae5abb32.js +1 -0
  79. package/apps/pwa/out/_next/static/chunks/app/reflection/page-0be8d4b2ced75ba0.js +1 -0
  80. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d37cb0d52f9b6bd5.js +1 -0
  81. package/apps/pwa/out/_next/static/chunks/app/sessions/page-686da0df9bf23e5c.js +1 -0
  82. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-4dc614f3ce043e63.js +1 -0
  83. package/apps/pwa/out/_next/static/chunks/app/settings/page-53f80edc6b8dc07c.js +1 -0
  84. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-d02c782fc792e2af.js +1 -0
  85. package/apps/pwa/out/_next/static/chunks/app/setup/layout-d16993889b125c42.js +1 -0
  86. package/apps/pwa/out/_next/static/chunks/app/setup/page-239c17b911b84e72.js +1 -0
  87. package/apps/pwa/out/_next/static/chunks/app/share/page-dc6a79fb003f746c.js +1 -0
  88. package/apps/pwa/out/_next/static/chunks/app/showroom/page-0fffb84cafdc9da6.js +1 -0
  89. package/apps/pwa/out/_next/static/chunks/app/tasks/page-1218753c82d585f6.js +1 -0
  90. package/apps/pwa/out/_next/static/chunks/app/term/page-4b5935e67531efb5.js +1 -0
  91. package/apps/pwa/out/_next/static/chunks/app/today/page-3285bc87caf1eaa5.js +1 -0
  92. package/apps/pwa/out/_next/static/chunks/app/trace/page-ad553b0e06505ecd.js +1 -0
  93. package/apps/pwa/out/_next/static/chunks/app/vault/page-fca096e3e860306f.js +1 -0
  94. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-9ebfa78f0d9885c3.js +1 -0
  95. package/apps/pwa/out/_next/static/chunks/app/workflows/page-3dc5f21f7e39622d.js +1 -0
  96. package/apps/pwa/out/_next/static/chunks/app/workspace/page-c6da2b468454532d.js +1 -0
  97. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-93bc70e36f595414.js +1 -0
  98. package/apps/pwa/out/_next/static/chunks/{2ea96958-e8c7e112de50b067.js → f48170cc-d05d28bf87a43bf4.js} +1 -1
  99. package/apps/pwa/out/_next/static/chunks/framework-172630e6aa5e2d7f.js +1 -0
  100. package/apps/pwa/out/_next/static/chunks/main-app-f0fe2d7477845181.js +1 -0
  101. package/apps/pwa/out/_next/static/chunks/main-fc98ac70b44eccb0.js +1 -0
  102. package/apps/pwa/out/_next/static/chunks/pages/_app-5bd7f10271f72413.js +1 -0
  103. package/apps/pwa/out/_next/static/chunks/pages/_error-97d0d85ea05fef9b.js +1 -0
  104. package/apps/pwa/out/_next/static/chunks/webpack-9e4d02d567b98240.js +1 -0
  105. package/apps/pwa/out/_next/static/css/543f56bcb1f79fca.css +1 -0
  106. package/apps/pwa/out/approvals/index.html +1 -1
  107. package/apps/pwa/out/approvals/index.txt +23 -23
  108. package/apps/pwa/out/autopilot/index.html +1 -1
  109. package/apps/pwa/out/autopilot/index.txt +23 -23
  110. package/apps/pwa/out/board/index.html +1 -1
  111. package/apps/pwa/out/board/index.txt +23 -23
  112. package/apps/pwa/out/botlab/index.html +1 -1
  113. package/apps/pwa/out/botlab/index.txt +22 -22
  114. package/apps/pwa/out/bots/index.html +1 -1
  115. package/apps/pwa/out/bots/index.txt +22 -22
  116. package/apps/pwa/out/chat/index.html +1 -1
  117. package/apps/pwa/out/chat/index.txt +22 -22
  118. package/apps/pwa/out/consult/index.html +1 -1
  119. package/apps/pwa/out/consult/index.txt +23 -23
  120. package/apps/pwa/out/control/index.html +1 -1
  121. package/apps/pwa/out/control/index.txt +23 -23
  122. package/apps/pwa/out/design-check/index.html +1 -1
  123. package/apps/pwa/out/design-check/index.txt +23 -23
  124. package/apps/pwa/out/editor/index.html +1 -1
  125. package/apps/pwa/out/editor/index.txt +23 -23
  126. package/apps/pwa/out/exec/index.html +1 -1
  127. package/apps/pwa/out/exec/index.txt +23 -23
  128. package/apps/pwa/out/field/index.html +1 -1
  129. package/apps/pwa/out/field/index.txt +23 -23
  130. package/apps/pwa/out/healthz +1 -1
  131. package/apps/pwa/out/index.html +1 -1
  132. package/apps/pwa/out/index.txt +22 -22
  133. package/apps/pwa/out/inside/index.html +1 -0
  134. package/apps/pwa/out/inside/index.txt +31 -0
  135. package/apps/pwa/out/intake/index.html +1 -1
  136. package/apps/pwa/out/intake/index.txt +23 -23
  137. package/apps/pwa/out/live/index.html +1 -1
  138. package/apps/pwa/out/live/index.txt +23 -23
  139. package/apps/pwa/out/market/index.html +1 -1
  140. package/apps/pwa/out/market/index.txt +22 -22
  141. package/apps/pwa/out/missions/placeholder/index.html +1 -1
  142. package/apps/pwa/out/missions/placeholder/index.txt +22 -22
  143. package/apps/pwa/out/morning/index.html +1 -1
  144. package/apps/pwa/out/morning/index.txt +23 -23
  145. package/apps/pwa/out/observatory/index.html +1 -1
  146. package/apps/pwa/out/observatory/index.txt +23 -23
  147. package/apps/pwa/out/ops/checklist/index.html +1 -1
  148. package/apps/pwa/out/ops/checklist/index.txt +22 -22
  149. package/apps/pwa/out/ops/release/index.html +1 -1
  150. package/apps/pwa/out/ops/release/index.txt +22 -22
  151. package/apps/pwa/out/ops/seats/index.html +1 -0
  152. package/apps/pwa/out/ops/seats/index.txt +30 -0
  153. package/apps/pwa/out/outputs/index.html +1 -0
  154. package/apps/pwa/out/outputs/index.txt +30 -0
  155. package/apps/pwa/out/reflection/index.html +1 -1
  156. package/apps/pwa/out/reflection/index.txt +23 -23
  157. package/apps/pwa/out/scheduler/index.html +1 -1
  158. package/apps/pwa/out/scheduler/index.txt +23 -23
  159. package/apps/pwa/out/sessions/index.html +1 -1
  160. package/apps/pwa/out/sessions/index.txt +22 -22
  161. package/apps/pwa/out/settings/devices/index.html +1 -1
  162. package/apps/pwa/out/settings/devices/index.txt +23 -23
  163. package/apps/pwa/out/settings/index.html +1 -1
  164. package/apps/pwa/out/settings/index.txt +23 -23
  165. package/apps/pwa/out/setup/done/index.html +1 -1
  166. package/apps/pwa/out/setup/done/index.txt +23 -23
  167. package/apps/pwa/out/setup/index.html +1 -1
  168. package/apps/pwa/out/setup/index.txt +23 -23
  169. package/apps/pwa/out/share/index.html +1 -1
  170. package/apps/pwa/out/share/index.txt +23 -23
  171. package/apps/pwa/out/showroom/index.html +1 -1
  172. package/apps/pwa/out/showroom/index.txt +22 -22
  173. package/apps/pwa/out/tasks/index.html +1 -1
  174. package/apps/pwa/out/tasks/index.txt +23 -23
  175. package/apps/pwa/out/term/index.html +1 -1
  176. package/apps/pwa/out/term/index.txt +23 -24
  177. package/apps/pwa/out/today/index.html +1 -0
  178. package/apps/pwa/out/today/index.txt +33 -0
  179. package/apps/pwa/out/trace/index.html +1 -1
  180. package/apps/pwa/out/trace/index.txt +23 -23
  181. package/apps/pwa/out/vault/index.html +1 -1
  182. package/apps/pwa/out/vault/index.txt +23 -23
  183. package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
  184. package/apps/pwa/out/workflows/chat-ui/index.txt +23 -23
  185. package/apps/pwa/out/workflows/index.html +1 -1
  186. package/apps/pwa/out/workflows/index.txt +23 -23
  187. package/apps/pwa/out/workspace/index.html +1 -1
  188. package/apps/pwa/out/workspace/index.txt +23 -24
  189. package/apps/pwa/out/worktrees/index.html +1 -1
  190. package/apps/pwa/out/worktrees/index.txt +23 -23
  191. package/graphs/drafts/draft-cleanup.yaml +19 -0
  192. package/graphs/drafts/recipes.yaml +23 -0
  193. package/graphs/field/field-feed.yaml +2 -0
  194. package/graphs/implement-loop.yaml +1 -1
  195. package/graphs/intake/intake-daily.yaml +2 -1
  196. package/graphs/ops/recipes.yaml +3 -0
  197. package/graphs/ops/secret-exposure.yaml +24 -0
  198. package/graphs/release/recipes.yaml +3 -0
  199. package/graphs/release/release-loop.yaml +4 -1
  200. package/graphs/video/explainer-line.yaml +2 -2
  201. package/package.json +2 -1
  202. package/plugins/card-followup/graphs/run-step.ts +48 -13
  203. package/plugins/doc-draft/graphs/doc-draft.yaml +3 -3
  204. package/plugins/doc-draft/graphs/run-step.ts +13 -6
  205. package/plugins/elanous-hwp/README.md +25 -0
  206. package/plugins/elanous-hwp/cli.ts +22 -0
  207. package/plugins/elanous-hwp/converter.ts +237 -0
  208. package/plugins/elanous-hwp/fixtures/fixed-controls.hwpx +0 -0
  209. package/plugins/elanous-hwp/fixtures/fixed-table-controls.hwpx +0 -0
  210. package/plugins/elanous-hwp/fixtures/fixed.hwpx +0 -0
  211. package/plugins/elanous-hwp/plugin.json +16 -0
  212. package/plugins/elanous-hwp/plugin.ts +40 -0
  213. package/scripts/ci-public-export-leak-gate.ts +75 -14
  214. package/scripts/ci-public-leak-gate.ts +44 -9
  215. package/scripts/ci-pwa-build-gate.ts +160 -0
  216. package/scripts/context-hooks/claude-stop.sh +4 -0
  217. package/scripts/context-hooks/emit.ts +24 -0
  218. package/scripts/context-hooks/post-tool-use.sh +4 -0
  219. package/scripts/coord-channel-watch.sh +54 -8
  220. package/scripts/coord-digest.ts +199 -0
  221. package/scripts/coord-post.sh +60 -3
  222. package/scripts/coord-requests-bridge.ts +143 -0
  223. package/scripts/field-feed/lib.ts +4 -0
  224. package/scripts/fleet/node-setup.sh +20 -3
  225. package/scripts/homebrew-formula-bump.ts +69 -0
  226. package/scripts/install.ps1 +68 -9
  227. package/scripts/install.sh +39 -12
  228. package/scripts/lib/pwa-scenarios/scenarios.ts +20 -0
  229. package/scripts/lib/tui-regress-checks.ts +146 -0
  230. package/scripts/marketing/measure-site-numbers.ts +169 -0
  231. package/scripts/measure-gate-shards.ts +309 -0
  232. package/scripts/memory-lifecycle-cycle.ts +2 -2
  233. package/scripts/mission-request-judge.ts +31 -1
  234. package/scripts/morning-report.ts +2 -2
  235. package/scripts/opportunity-scan.ts +1 -1
  236. package/scripts/ops-now-probe.ts +327 -0
  237. package/scripts/publish-internal-dist.ts +11 -1
  238. package/scripts/release-loop/auto-approve-node.ts +21 -4
  239. package/scripts/release-loop/cut-branch.ts +84 -0
  240. package/scripts/release-loop/cutoff.ts +19 -8
  241. package/scripts/release-loop/gate-node.ts +14 -13
  242. package/scripts/release-loop/mac-smoke-node.ts +229 -0
  243. package/scripts/release-loop/node-verdict.ts +3 -3
  244. package/scripts/release-loop/ops-upgrade-node.ts +72 -16
  245. package/scripts/release-loop/release-readiness.ts +9 -0
  246. package/scripts/release-loop/tui-node-checks.ts +42 -0
  247. package/scripts/release-loop/tui-sim-node.ts +32 -8
  248. package/scripts/release-loop/unattended-release.ts +5 -3
  249. package/scripts/release-loop/version-node.ts +112 -13
  250. package/scripts/repo-watch-cycle.ts +1 -1
  251. package/scripts/retro-cycle.ts +2 -2
  252. package/scripts/schedule-health-report.ts +1 -1
  253. package/scripts/signal-digest-cycle.ts +2 -7
  254. package/scripts/signal-digest-photo.ts +11 -0
  255. package/scripts/storyboard/storyboard.ts +5 -161
  256. package/scripts/tech1-public-measure.ts +94 -0
  257. package/scripts/test-diet/lib.ts +30 -1
  258. package/scripts/test-diet/node.ts +83 -8
  259. package/scripts/test-timeout-audit.ts +114 -0
  260. package/scripts/tree-sync-alert.ts +1 -1
  261. package/scripts/tui-regress.ts +71 -0
  262. package/scripts/ux/demo-rehearsal.ts +243 -0
  263. package/scripts/ux/lib/rehearsal-verdict.ts +73 -0
  264. package/scripts/waitlist-daily-digest.ts +1 -1
  265. package/skills/diagram-master/SKILL.md +366 -0
  266. package/skills/diagram-master/references/engines/excalidraw/color-palette.md +67 -0
  267. package/skills/diagram-master/references/engines/excalidraw/element-templates.md +182 -0
  268. package/skills/diagram-master/references/engines/excalidraw/json-schema.md +71 -0
  269. package/skills/diagram-master/references/engines/excalidraw/render_excalidraw.py +189 -0
  270. package/skills/diagram-master/references/engines/excalidraw/render_template.html +57 -0
  271. package/skills/diagram-master/references/engines/matplotlib/matplotlib-patterns.md +235 -0
  272. package/skills/diagram-master/references/engines/matplotlib/render_matplotlib.py +184 -0
  273. package/skills/diagram-master/references/engines/mermaid/domain-templates.md +435 -0
  274. package/skills/diagram-master/references/engines/mermaid/render_mermaid.py +116 -0
  275. package/skills/diagram-master/references/engines/mermaid/syntax-reference.md +2247 -0
  276. package/skills/diagram-master/references/engines/nanobannana/render_nanobannana2.py +168 -0
  277. package/skills/diagram-master/references/engines/svg/color-palette.md +188 -0
  278. package/skills/diagram-master/references/engines/svg/html-base-template.html +332 -0
  279. package/skills/diagram-master/references/engines/svg/interactivity-patterns.md +435 -0
  280. package/skills/diagram-master/references/engines/svg/render_interactive_svg.py +212 -0
  281. package/skills/diagram-master/references/engines/svg/svg-element-templates.md +349 -0
  282. package/skills/diagram-master/references/examples/README.md +69 -0
  283. package/skills/diagram-master/references/examples/ref_grid_architecture.png +0 -0
  284. package/skills/diagram-master/references/examples/ref_layered_flow.png +0 -0
  285. package/skills/diagram-master/references/pyproject.toml +16 -0
  286. package/skills/diagram-master/references/quality-checklist.md +33 -0
  287. package/skills/diagram-master/references/routing-guide.md +164 -0
  288. package/skills/diagram-master/references/uv.lock +1356 -0
  289. package/skills/explainer-video/SKILL.md +4 -0
  290. package/skills/explainer-video/engine/reel.mjs +18 -13
  291. package/skills/explainer-video/engine/reel.sh +24 -5
  292. package/skills/explainer-video/engine/stitch.mjs +145 -0
  293. package/skills/google-workspace/SKILL.md +33 -0
  294. package/skills/google-workspace/scripts/gws-safe.sh +177 -0
  295. package/skills/grill-me/SKILL.md +1 -1
  296. package/skills/lecture-note-digitizer/SKILL.md +926 -0
  297. package/skills/lecture-note-digitizer/references/convert_to_pdf.py +30 -0
  298. package/skills/lecture-note-digitizer/references/extract_slide_diagram.py +73 -0
  299. package/skills/lecture-note-digitizer/references/html-template.md +167 -0
  300. package/skills/lecture-note-digitizer/references/katex-style-guide.md +165 -0
  301. package/skills/omni-crawl/SKILL.md +21 -11
  302. package/skills/omni-crawl/scripts/main.ts +6 -6
  303. package/skills/omni-crawl/src/router.ts +3 -3
  304. package/skills/omni-digest/SKILL.md +17 -9
  305. package/skills/omni-digest/digest.md +2 -2
  306. package/skills/omni-digest/src/fetch.ts +30 -3
  307. package/skills/pitch-deck/SKILL.md +36 -0
  308. package/skills/pitch-deck/template.html +80 -0
  309. package/skills/youtube-master/SKILL.md +163 -0
  310. package/skills/youtube-master/package-lock.json +558 -0
  311. package/skills/youtube-master/package.json +13 -0
  312. package/skills/youtube-master/references/study-note-template.md +124 -0
  313. package/skills/youtube-master/scripts/main.ts +435 -0
  314. package/skills/youtube-master/scripts/transcribe-local.ts +24 -0
  315. package/skills/youtube-master/src/audio.ts +63 -0
  316. package/skills/youtube-master/src/domain-staging.ts +50 -0
  317. package/skills/youtube-master/src/env.ts +36 -0
  318. package/skills/youtube-master/src/obsidian.ts +155 -0
  319. package/skills/youtube-master/src/router.ts +110 -0
  320. package/skills/youtube-master/src/stt.ts +199 -0
  321. package/skills/youtube-master/src/study-note.ts +175 -0
  322. package/skills/youtube-master/src/summarize.ts +358 -0
  323. package/skills/youtube-master/src/transcript.ts +76 -0
  324. package/skills/youtube-master/src/types.ts +91 -0
  325. package/skills/youtube-master/src/util.ts +93 -0
  326. package/skills/youtube-master/src/youtube.ts +70 -0
  327. package/skills/youtube-master/tsconfig.json +13 -0
  328. package/src/acp/codex-approval-adapter.ts +9 -3
  329. package/src/acp/core-turn-bridge.ts +117 -18
  330. package/src/acp/fact-question.ts +11 -0
  331. package/src/acp/server.ts +53 -9
  332. package/src/acp/tool-approval.ts +126 -0
  333. package/src/acp/turn-runner.ts +36 -0
  334. package/src/agent/monad-agent-turn.ts +8 -0
  335. package/src/agent-mission/driver.ts +80 -10
  336. package/src/agent-mission/pty-decision.ts +71 -0
  337. package/src/agent-mission/review-loop.ts +30 -0
  338. package/src/ask-user-question/pending-questions.ts +25 -10
  339. package/src/ask-user-question/types.ts +9 -0
  340. package/src/auth/setup-link-tokens.ts +16 -5
  341. package/src/autopilot/build/integrity-gate.ts +12 -0
  342. package/src/autopilot/build/llm-conflict-merge.ts +16 -3
  343. package/src/autopilot/tool-registry.ts +2 -0
  344. package/src/boot/daemon-prompt-turn.ts +8 -0
  345. package/src/boot/daemon-runtime.ts +9 -3
  346. package/src/boot/daemon-tools/index.ts +8 -0
  347. package/src/boot/daemon-tools/types.ts +2 -0
  348. package/src/boot/daemon-tools/web-search.ts +4 -0
  349. package/src/card-followup/core.ts +109 -0
  350. package/src/chat/ctrl-c-in-input.ts +14 -0
  351. package/src/chat/index.ts +53 -0
  352. package/src/chat/pickers/state.ts +6 -2
  353. package/src/cli/agent-cli.ts +7 -0
  354. package/src/cli/decisions-cli.ts +25 -3
  355. package/src/cli/doctor-bundle-upload.ts +68 -0
  356. package/src/cli/doctor-cli.ts +38 -4
  357. package/src/cli/drive-input-jail.ts +101 -0
  358. package/src/cli/hooks-cli.ts +17 -3
  359. package/src/cli/make-cli.ts +43 -0
  360. package/src/cli/ops-cli.ts +20 -0
  361. package/src/cli/persona-cli.ts +90 -4
  362. package/src/cli/plugin-cli.ts +31 -22
  363. package/src/cli/pod-cli.ts +61 -2
  364. package/src/cli/pr-cli.ts +82 -17
  365. package/src/cli/pty-drive-cli.ts +41 -7
  366. package/src/cli/pty-drive-verdict.ts +40 -0
  367. package/src/cli/pwa-stop.ts +163 -13
  368. package/src/cli/pwa-test.ts +3 -0
  369. package/src/cli/release-cli.ts +80 -24
  370. package/src/cli/self-update.ts +14 -0
  371. package/src/cli/setup-cli.ts +43 -1
  372. package/src/cli/skills-cli.ts +17 -1
  373. package/src/cli/storyboard-cli.ts +37 -0
  374. package/src/cli/test-state-dir-flag.ts +11 -4
  375. package/src/connectors/linear.ts +146 -0
  376. package/src/context-bus/claude-hooks-install.ts +10 -0
  377. package/src/context-bus/context-now-surfaces.ts +48 -0
  378. package/src/context-bus/context-now.ts +104 -0
  379. package/src/context-bus/coord-events.ts +115 -0
  380. package/src/context-bus/external-events.ts +52 -0
  381. package/src/context-bus/long-term-memory.ts +108 -0
  382. package/src/dashboard/dashboard-boot-fixture.ts +23 -0
  383. package/src/dashboard/index.ts +63 -21
  384. package/src/dashboard/slash-runtime/dashboard-handlers.ts +14 -1
  385. package/src/dashboard/slash-runtime/help-from-registry.ts +43 -28
  386. package/src/decisions/decision-cards.ts +58 -3
  387. package/src/decisions/decision-ledger.ts +85 -6
  388. package/src/decisions/decision-linear-projection.ts +157 -0
  389. package/src/decisions/web-push-decision-cards.ts +50 -0
  390. package/src/directive/interpretation-card.ts +36 -0
  391. package/src/discord/sprint21-runtime.ts +5 -1
  392. package/src/discord-self-message.ts +32 -0
  393. package/src/discord-slash-wire.ts +5 -1
  394. package/src/discord.ts +19 -2
  395. package/src/domains/coo-admin-tool.ts +62 -0
  396. package/src/domains/core-tools.ts +13 -4
  397. package/src/domains/elanous-card.ts +29 -0
  398. package/src/domains/ops-facts-tool.ts +76 -0
  399. package/src/domains/outbound-alert.ts +46 -13
  400. package/src/domains/release-tool.ts +168 -0
  401. package/src/domains/telegram-kind-route.ts +65 -9
  402. package/src/exec-requests/default-outputs.ts +25 -0
  403. package/src/exec-requests/planner.ts +106 -28
  404. package/src/exec-requests/runner.ts +123 -12
  405. package/src/exec-requests/store.ts +11 -2
  406. package/src/execution-loop/launch-gate.ts +100 -0
  407. package/src/field/field-media.ts +10 -7
  408. package/src/field/field-reel.ts +19 -5
  409. package/src/field-note/index.ts +201 -0
  410. package/src/field-note/transcribe.ts +248 -0
  411. package/src/git-fs/worktree.ts +45 -6
  412. package/src/graph-kinds/registry.ts +3 -3
  413. package/src/graph-runner/graph-approval-card.ts +113 -0
  414. package/src/graph-runner/graph-cli.ts +189 -4
  415. package/src/graph-runner/graph-grow-llm.ts +37 -0
  416. package/src/graph-runner/graph-grow.ts +47 -0
  417. package/src/graph-runner/graph-notify.ts +25 -3
  418. package/src/graph-runner/runner.ts +453 -35
  419. package/src/grok/agent-search.ts +8 -2
  420. package/src/guardian/secret-exposure-scan.ts +101 -0
  421. package/src/harness/browser-verify.ts +25 -2
  422. package/src/harness/harness-cli-command.ts +478 -42
  423. package/src/harness/harness-incidents-writer.fixture.ts +24 -0
  424. package/src/harness/harness-incidents.ts +129 -0
  425. package/src/harness/harness-pod-dispatch.ts +43 -23
  426. package/src/harness/harness-seams.ts +38 -4
  427. package/src/harness/harness-stop.ts +75 -6
  428. package/src/harness/launch-registry.ts +91 -0
  429. package/src/harness/process-garbage.ts +5 -3
  430. package/src/hitl/clarification-policy.ts +3 -1
  431. package/src/hooks/dispatch.ts +82 -0
  432. package/src/hooks/expose.ts +254 -0
  433. package/src/hooks/github-shadow.ts +108 -0
  434. package/src/hooks/providers.ts +71 -5
  435. package/src/hooks/queue.ts +1 -1
  436. package/src/hooks/receiver.ts +21 -20
  437. package/src/index.ts +206 -49
  438. package/src/intake-plane/author-goals.ts +37 -4
  439. package/src/intake-plane/categorize.ts +18 -46
  440. package/src/intake-plane/check.ts +3 -0
  441. package/src/intake-plane/discord-seat-work.ts +57 -2
  442. package/src/intake-plane/front-route-classifier.ts +33 -39
  443. package/src/intake-plane/persona-answer.ts +30 -0
  444. package/src/intake-plane/runtime-callables.ts +8 -1
  445. package/src/intake-plane/seat-doc-route.ts +170 -6
  446. package/src/intake-plane/telegram-seat-work.ts +80 -4
  447. package/src/intake-plane/telegram-work.ts +1 -0
  448. package/src/intake-plane/wish-folder.ts +67 -0
  449. package/src/intent-gate/gate.ts +30 -10
  450. package/src/live/detail-switch.ts +5 -0
  451. package/src/llm/difficulty.ts +57 -0
  452. package/src/llm/judge-layer.ts +101 -0
  453. package/src/llm/mission-router.ts +33 -19
  454. package/src/loops/contract/examples/cmo-seat.loop.yaml +51 -0
  455. package/src/loops/contract/examples/orchestrator.loop.yaml +57 -0
  456. package/src/loops/contract/examples/steward.loop.yaml +50 -0
  457. package/src/loops/contract/loop-agent.schema.json +138 -0
  458. package/src/loops/contract/validate.ts +64 -0
  459. package/src/loops/registry.ts +20 -6
  460. package/src/market/signed-index.ts +4 -0
  461. package/src/maturity/bot-command-maturity.ts +45 -0
  462. package/src/maturity/cli-maturity.ts +34 -0
  463. package/src/maturity/feature-maturity.ts +120 -1
  464. package/src/maturity/tui-slash-maturity.ts +31 -0
  465. package/src/memory.ts +32 -4
  466. package/src/model-tier/index.ts +2 -2
  467. package/src/model-tier/tier-resolver.ts +20 -20
  468. package/src/model-tier/types.ts +6 -6
  469. package/src/mss/logging/log-store.ts +15 -0
  470. package/src/nexus/api/config-model-tier.ts +5 -4
  471. package/src/nexus/api/exec-requests.ts +33 -3
  472. package/src/nexus/api/fabric-plans.ts +53 -0
  473. package/src/nexus/api/harness-api.ts +5 -1
  474. package/src/nexus/api/health.ts +2 -0
  475. package/src/nexus/api/http-server.ts +89 -1
  476. package/src/nexus/api/inside-events.ts +226 -0
  477. package/src/nexus/api/meta-api.ts +32 -8
  478. package/src/nexus/api/missions.ts +6 -1
  479. package/src/nexus/api/ops-api.ts +10 -1
  480. package/src/nexus/api/ops-seats-sources.ts +37 -7
  481. package/src/nexus/api/ops-seats.ts +49 -6
  482. package/src/nexus/api/outputs-route.ts +44 -0
  483. package/src/nexus/api/seat-requests.ts +132 -10
  484. package/src/nexus/api/sessions-store.ts +42 -0
  485. package/src/nexus/api/setup-codex-login.ts +160 -0
  486. package/src/nexus/api/sub-seat-charters.ts +34 -0
  487. package/src/nexus/api/tabs-mutations.ts +3 -1
  488. package/src/nexus/api/trace.ts +18 -6
  489. package/src/nexus/api/usage-api.ts +102 -0
  490. package/src/nexus/api/workflow-run-event-bridge.ts +1 -0
  491. package/src/nexus/api/workflows.ts +80 -6
  492. package/src/nexus/index.ts +47 -4
  493. package/src/nexus/kinds/webterm.ts +2 -1
  494. package/src/nexus/webterm/pty.ts +6 -2
  495. package/src/onboarding/cli-auth-status.ts +80 -0
  496. package/src/onboarding/first-run.ts +89 -0
  497. package/src/onboarding/lan-address.ts +45 -0
  498. package/src/onboarding/voice-ai.ts +3 -3
  499. package/src/onboarding/web-first.ts +119 -24
  500. package/src/onboarding.ts +4 -0
  501. package/src/ops-now/ops-now-refresh.ts +100 -0
  502. package/src/org/seat-budget.ts +48 -0
  503. package/src/org/stall-escalation.ts +63 -0
  504. package/src/outputs/ledger.ts +120 -0
  505. package/src/persona/persona-todo.ts +79 -0
  506. package/src/persona/presets.ts +116 -2
  507. package/src/persona/team-set.ts +155 -0
  508. package/src/plugins/install/plugin-install.ts +14 -0
  509. package/src/plugins/maker/market-bundle.ts +109 -0
  510. package/src/plugins/maker/plugin-maker.ts +254 -11
  511. package/src/plugins/maker/wizard-generate.ts +103 -0
  512. package/src/pod-lease/admission.ts +150 -0
  513. package/src/pod-lease/dependency-state.ts +85 -0
  514. package/src/pod-lease/host-lease.ts +127 -0
  515. package/src/project/project-store.ts +115 -0
  516. package/src/project/project-suggestion.ts +16 -0
  517. package/src/project/session-context.ts +24 -0
  518. package/src/release-loop/checklist.ts +79 -5
  519. package/src/release-loop/feature-store.ts +159 -24
  520. package/src/release-loop/next-md-merge.ts +58 -0
  521. package/src/release-loop/release-note.ts +59 -4
  522. package/src/release-loop/release-schedule.ts +53 -0
  523. package/src/repl/index.ts +7 -0
  524. package/src/seat-dispatch/ceo-commands.ts +41 -8
  525. package/src/seat-dispatch/ceo-intent.ts +38 -0
  526. package/src/seat-dispatch/seat-ask.ts +130 -0
  527. package/src/seat-dispatch/seat-questions.ts +100 -0
  528. package/src/seat-loop/seat-loop.ts +750 -0
  529. package/src/seat-loop/seat-report.ts +99 -0
  530. package/src/self-dev/decompose.ts +66 -11
  531. package/src/self-dev/dev-cli.ts +4 -1
  532. package/src/self-dev/dev-pipeline.ts +37 -1
  533. package/src/self-dev/draft-sweep.ts +38 -33
  534. package/src/self-dev/draft-triage-rules.ts +8 -5
  535. package/src/self-dev/fabric-plan-core.ts +297 -0
  536. package/src/self-dev/orchestrate.ts +36 -4
  537. package/src/self-dev/release-path-guard.ts +62 -0
  538. package/src/self-dev/run-store.ts +10 -1
  539. package/src/self-dev/shard-aggregate.ts +230 -0
  540. package/src/self-dev/shard-placement.ts +60 -0
  541. package/src/self-dev/shard-plan.ts +48 -0
  542. package/src/self-dev/shard-pod-run.ts +77 -0
  543. package/src/self-dev/shard-run.ts +105 -0
  544. package/src/self-implement/execution-clarification.ts +115 -0
  545. package/src/self-implement/gate-baseline.ts +1 -1
  546. package/src/self-implement/gate-cli.ts +46 -4
  547. package/src/self-implement/gate-scope.ts +37 -7
  548. package/src/self-implement/graph-variant.ts +171 -0
  549. package/src/self-implement/harness-policy-gates.ts +1 -1
  550. package/src/self-implement/headless-elanous-driver.ts +22 -3
  551. package/src/self-implement/host-regate.ts +22 -1
  552. package/src/self-implement/importer-test-index.ts +2 -1
  553. package/src/self-implement/l8-merge-queue.ts +130 -0
  554. package/src/self-implement/orchestrator.ts +279 -12
  555. package/src/self-implement/pipeline-shape.ts +1 -1
  556. package/src/self-implement/route-consumer-test-index.ts +122 -0
  557. package/src/self-implement/run-status-mapping.ts +5 -3
  558. package/src/self-implement/seams.ts +72 -11
  559. package/src/self-implement/test-seams.ts +1 -0
  560. package/src/self-implement/uncommitted-work.ts +59 -0
  561. package/src/session/chat.ts +2 -0
  562. package/src/session/index.ts +45 -13
  563. package/src/shell-env-bootstrap.ts +17 -0
  564. package/src/skills/gift-install.ts +215 -0
  565. package/src/skills/tools/web-search.ts +4 -1
  566. package/src/steward/directive.ts +51 -2
  567. package/src/steward/launch.ts +266 -0
  568. package/src/steward/outcome-notify.ts +115 -0
  569. package/src/steward/steward-cards.ts +25 -11
  570. package/src/steward/triage-plan.ts +32 -4
  571. package/src/steward/triage.ts +129 -13
  572. package/src/steward/working-backwards.ts +64 -0
  573. package/src/storyboard/storyboard.ts +141 -0
  574. package/src/task-cards/card-cli.ts +25 -1
  575. package/src/task-cards/card-store.ts +2 -2
  576. package/src/task-orchestrator/mission.ts +5 -0
  577. package/src/task-orchestrator/store.ts +12 -3
  578. package/src/task-orchestrator/surfaces/pod-command-job.ts +29 -7
  579. package/src/task-orchestrator/surfaces/pod-lease.ts +397 -0
  580. package/src/task-orchestrator/surfaces/pod-pool.ts +127 -26
  581. package/src/task-orchestrator/surfaces/self-implement-pod.ts +214 -40
  582. package/src/task-orchestrator/surfaces/self-implement.ts +15 -2
  583. package/src/task-orchestrator/types.ts +2 -0
  584. package/src/telegram-card-followup.ts +153 -0
  585. package/src/telegram-commands.ts +10 -1
  586. package/src/telegram-project-command.ts +71 -0
  587. package/src/telegram-report.ts +29 -19
  588. package/src/telegram-run.ts +7 -0
  589. package/src/telegram.ts +58 -11
  590. package/src/tool-runtime/self-cognition-runtimes.ts +13 -3
  591. package/src/tool-runtime/types.ts +4 -0
  592. package/src/tui-client/dashboard-session.ts +2 -0
  593. package/src/user-config.ts +216 -27
  594. package/src/version/packed-revision.json +1 -1
  595. package/src/web-push/notify-exec-request.ts +32 -0
  596. package/src/web-search/grok.ts +7 -1
  597. package/src/web-search/index.ts +28 -1
  598. package/src/web-search/provider.ts +4 -0
  599. package/src/web-search/x-intent.ts +5 -0
  600. package/src/workflow-runtime/executor.ts +277 -47
  601. package/src/workflow-runtime/index.ts +1 -0
  602. package/src/workflow-runtime/nodes/subworkflow.ts +60 -0
  603. package/src/workflow-runtime/plugin-kind-node.ts +1 -1
  604. package/src/workflow-runtime/schema.ts +79 -4
  605. package/src/workflow-runtime/types.ts +35 -4
  606. package/apps/pwa/out/_next/static/bFI5EEwg7T6aG88ibX4Zq/_buildManifest.js +0 -1
  607. package/apps/pwa/out/_next/static/chunks/1105-c473ed46272fba79.js +0 -1
  608. package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +0 -1
  609. package/apps/pwa/out/_next/static/chunks/1377-1efeffbbac0963ff.js +0 -1
  610. package/apps/pwa/out/_next/static/chunks/1470.98a6ab61ccb4131c.js +0 -1
  611. package/apps/pwa/out/_next/static/chunks/216-5acd01cbde4acda7.js +0 -1
  612. package/apps/pwa/out/_next/static/chunks/2330-c2f07246c8788af1.js +0 -1
  613. package/apps/pwa/out/_next/static/chunks/2375-cb6debea56cce4fb.js +0 -1
  614. package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +0 -1
  615. package/apps/pwa/out/_next/static/chunks/2977-e38442e86289f1d3.js +0 -1
  616. package/apps/pwa/out/_next/static/chunks/2982-2a2df543be3d2e5a.js +0 -25
  617. package/apps/pwa/out/_next/static/chunks/3403.4bc97b4066945a94.js +0 -5
  618. package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +0 -1
  619. package/apps/pwa/out/_next/static/chunks/371-4ad6af55dad02ced.js +0 -1
  620. package/apps/pwa/out/_next/static/chunks/4114-3e63117452378807.js +0 -1
  621. package/apps/pwa/out/_next/static/chunks/5080-1613752891fcadb4.js +0 -10
  622. package/apps/pwa/out/_next/static/chunks/5609-012bb3557211f07e.js +0 -1
  623. package/apps/pwa/out/_next/static/chunks/5791-bb82743fa6299562.js +0 -1
  624. package/apps/pwa/out/_next/static/chunks/6090-85a3f05f954e5697.js +0 -1
  625. package/apps/pwa/out/_next/static/chunks/6284-69db415193d5f8bd.js +0 -1
  626. package/apps/pwa/out/_next/static/chunks/6320-baac91d68843a9a6.js +0 -1
  627. package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +0 -1
  628. package/apps/pwa/out/_next/static/chunks/6725-68ab7cc0b1faf00d.js +0 -1
  629. package/apps/pwa/out/_next/static/chunks/6998-a654fe5c58271600.js +0 -1
  630. package/apps/pwa/out/_next/static/chunks/7032-f4ef698518fba61c.js +0 -1
  631. package/apps/pwa/out/_next/static/chunks/7647.2fcd30d894d5ee30.js +0 -1
  632. package/apps/pwa/out/_next/static/chunks/7673-2eda1507d38dadb8.js +0 -1
  633. package/apps/pwa/out/_next/static/chunks/7990-e12efba616f46e03.js +0 -1
  634. package/apps/pwa/out/_next/static/chunks/8067-d976b441a104ab74.js +0 -1
  635. package/apps/pwa/out/_next/static/chunks/8142-744998d65d7bb17e.js +0 -1
  636. package/apps/pwa/out/_next/static/chunks/8519-5632377cce994f86.js +0 -1
  637. package/apps/pwa/out/_next/static/chunks/8619-4365e03a2862830f.js +0 -1
  638. package/apps/pwa/out/_next/static/chunks/8630-cdfc61e82c653ffc.js +0 -1
  639. package/apps/pwa/out/_next/static/chunks/8894-e263b332208e3957.js +0 -1
  640. package/apps/pwa/out/_next/static/chunks/920-f7dceb78f1c585ef.js +0 -1
  641. package/apps/pwa/out/_next/static/chunks/9454-139040d37c79dbc9.js +0 -1
  642. package/apps/pwa/out/_next/static/chunks/9651-3cd291a6fa1370d2.js +0 -1
  643. package/apps/pwa/out/_next/static/chunks/9740-8f5ff96c522b5f55.js +0 -1
  644. package/apps/pwa/out/_next/static/chunks/ae787e4c-f2998de7f1ba72a4.js +0 -1
  645. package/apps/pwa/out/_next/static/chunks/app/_not-found/page-859cea1570b6227a.js +0 -1
  646. package/apps/pwa/out/_next/static/chunks/app/approvals/page-fb7c2d458f32fcad.js +0 -1
  647. package/apps/pwa/out/_next/static/chunks/app/autopilot/page-35e2713597dd24d1.js +0 -1
  648. package/apps/pwa/out/_next/static/chunks/app/board/page-918b656f064577ba.js +0 -1
  649. package/apps/pwa/out/_next/static/chunks/app/bots/page-5f30e00693527ebd.js +0 -1
  650. package/apps/pwa/out/_next/static/chunks/app/chat/page-7fbae173b3c103a7.js +0 -1
  651. package/apps/pwa/out/_next/static/chunks/app/consult/page-3b4edcce364062ea.js +0 -1
  652. package/apps/pwa/out/_next/static/chunks/app/control/page-c5794f484c251f44.js +0 -1
  653. package/apps/pwa/out/_next/static/chunks/app/design-check/page-1130d8eefcd87e76.js +0 -1
  654. package/apps/pwa/out/_next/static/chunks/app/editor/page-973996d584f008c1.js +0 -1
  655. package/apps/pwa/out/_next/static/chunks/app/exec/page-016e2bda04eecb1f.js +0 -1
  656. package/apps/pwa/out/_next/static/chunks/app/field/page-b4d6d9a3b56f2940.js +0 -1
  657. package/apps/pwa/out/_next/static/chunks/app/healthz/route-859cea1570b6227a.js +0 -1
  658. package/apps/pwa/out/_next/static/chunks/app/intake/page-ec49a466121233ba.js +0 -1
  659. package/apps/pwa/out/_next/static/chunks/app/layout-f72db356744ceade.js +0 -1
  660. package/apps/pwa/out/_next/static/chunks/app/live/page-a6fd9b50d1b85378.js +0 -1
  661. package/apps/pwa/out/_next/static/chunks/app/market/page-8b0402a46a749a3d.js +0 -1
  662. package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-037f83e2a1edc8e2.js +0 -1
  663. package/apps/pwa/out/_next/static/chunks/app/not-found-46fedff57d4bec67.js +0 -1
  664. package/apps/pwa/out/_next/static/chunks/app/observatory/page-0cf318e9dcee2bbf.js +0 -1
  665. package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-899b327cb8b6845c.js +0 -1
  666. package/apps/pwa/out/_next/static/chunks/app/ops/release/page-6c1e6ba743a29dfe.js +0 -1
  667. package/apps/pwa/out/_next/static/chunks/app/page-1a8e4807292f6b17.js +0 -1
  668. package/apps/pwa/out/_next/static/chunks/app/reflection/page-28deba6bcb834916.js +0 -1
  669. package/apps/pwa/out/_next/static/chunks/app/scheduler/page-de68e2205794037d.js +0 -1
  670. package/apps/pwa/out/_next/static/chunks/app/sessions/page-c71c33a573230672.js +0 -1
  671. package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-0df30e0c7e50148a.js +0 -1
  672. package/apps/pwa/out/_next/static/chunks/app/settings/page-4fc56790fe0d2682.js +0 -1
  673. package/apps/pwa/out/_next/static/chunks/app/setup/done/page-59df2aebb38a7c1e.js +0 -1
  674. package/apps/pwa/out/_next/static/chunks/app/setup/layout-859cea1570b6227a.js +0 -1
  675. package/apps/pwa/out/_next/static/chunks/app/setup/page-4647be5dbcbd0795.js +0 -1
  676. package/apps/pwa/out/_next/static/chunks/app/share/page-e025892bda74b743.js +0 -1
  677. package/apps/pwa/out/_next/static/chunks/app/showroom/page-a0955de73b89f078.js +0 -1
  678. package/apps/pwa/out/_next/static/chunks/app/tasks/page-369846d2921af584.js +0 -1
  679. package/apps/pwa/out/_next/static/chunks/app/term/page-72cbc1c8cdd0f65d.js +0 -1
  680. package/apps/pwa/out/_next/static/chunks/app/trace/page-77b28bfb0996d5ea.js +0 -1
  681. package/apps/pwa/out/_next/static/chunks/app/vault/page-3220c4934f49c6c2.js +0 -1
  682. package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-90670589b87abea8.js +0 -1
  683. package/apps/pwa/out/_next/static/chunks/app/workflows/page-7df9243ed021a4cc.js +0 -1
  684. package/apps/pwa/out/_next/static/chunks/app/workspace/page-4498c3853f4f688d.js +0 -1
  685. package/apps/pwa/out/_next/static/chunks/app/worktrees/page-35bedde6d885f08f.js +0 -1
  686. package/apps/pwa/out/_next/static/chunks/framework-ea806bb57f2b8923.js +0 -1
  687. package/apps/pwa/out/_next/static/chunks/main-8d2302399c2c8f87.js +0 -1
  688. package/apps/pwa/out/_next/static/chunks/main-app-6870f30ea99f8346.js +0 -1
  689. package/apps/pwa/out/_next/static/chunks/pages/_app-b10928c60f0b8488.js +0 -1
  690. package/apps/pwa/out/_next/static/chunks/pages/_error-689039227d443fab.js +0 -1
  691. package/apps/pwa/out/_next/static/chunks/webpack-e5bea36f183b25e6.js +0 -1
  692. package/apps/pwa/out/_next/static/css/f92f63a5df0ba229.css +0 -1
  693. package/src/dashboard/turn-typeahead-echo.ts +0 -23
  694. /package/apps/pwa/out/_next/static/{bFI5EEwg7T6aG88ibX4Zq → Y4zKzL62sakG5momz3SoQ}/_ssgManifest.js +0 -0
@@ -50,7 +50,7 @@ import type { SkillTier } from './skills/runner.js';
50
50
  import { sharedAgentSkillRoots } from './skills/shared-agent-skill-roots.js';
51
51
  import {
52
52
  isModelTier,
53
- isModelTierPersona,
53
+ isModelTierProfile,
54
54
  type BudgetUserConfig,
55
55
  type ModelTier,
56
56
  type ModelTierUserConfig,
@@ -450,6 +450,8 @@ export interface SkillSource {
450
450
  export interface SkillsConfig {
451
451
  activeSet: SkillSetName;
452
452
  dirs: string[];
453
+ /** Gift redemption API origin; defaults to https://elanous.ai. */
454
+ giftEndpoint?: string;
453
455
  /** Include the existing shared ~/.agents/skills directory. Default true; false opts out. */
454
456
  includeSharedAgentSkills?: boolean;
455
457
  /**
@@ -766,6 +768,7 @@ function skillsDefaults(): SkillsConfig {
766
768
  return {
767
769
  activeSet: 'claudecode',
768
770
  dirs: d ? [d] : [],
771
+ giftEndpoint: 'https://elanous.ai',
769
772
  includeSharedAgentSkills: true,
770
773
  allow: [],
771
774
  deny: [],
@@ -912,11 +915,13 @@ export interface TelegramConfig {
912
915
  /** 누가 Q&A 폴링을 하나 — 기본(없음·`'nexus'`)은 넥서스 데몬, `'standalone'` 이면
913
916
  * 넥서스는 폴링하지 않고 `elanous telegram run` 이 맡는다. */
914
917
  poller?: 'nexus' | 'standalone';
915
- /** 발송 목적(kind) → 채널 역할. 명시 `channels` 가 있을 때만 쓴다 — 표에 없는 kind 는 옛 `reportChannel` 로 간다.
916
- * 기본표는 `DEFAULT_KIND_ROLES`(telegram-report.ts) · 여기 값이 덮어쓴다. */
918
+ /** 레거시 kind→역할 설정(읽기 호환). 선택한 채널의 봇이 kind 정책의
919
+ * 운영/매매 경계를 지킬 때만 발송 라우팅에 적용한다. */
917
920
  kindRoles?: Record<string, string>;
918
921
  /** `#현장` 캡션에 행사 슬러그가 없을 때 쓸 기본 행사(예: `marketers-night-2026-10`). 없으면 `field-<로컬 날짜>`. */
919
922
  fieldDefaultEvent?: string;
923
+ /** `#현장` 영상의 기본 렌더 모드. 미지정 시 standard, 캡션의 `즉석`/`instant` 가 우선. */
924
+ fieldReelMode?: 'standard' | 'instant';
920
925
  }
921
926
 
922
927
  const TELEGRAM_DEFAULTS: TelegramConfig = { enabled: false, allowedUsers: [] };
@@ -982,6 +987,7 @@ const DISCORD_DEFAULTS: DiscordConfig = { enabled: false, allowedUsers: [] };
982
987
 
983
988
  export interface OnboardingConfig {
984
989
  webFirst?: boolean;
990
+ ready?: boolean;
985
991
  completed: boolean;
986
992
  completedAt?: string;
987
993
  version: number;
@@ -1474,6 +1480,7 @@ export function parseErrorReportsConfig(raw: unknown): ErrorReportsConfig | unde
1474
1480
  }
1475
1481
 
1476
1482
  export interface ChatConfig {
1483
+ factQuestion: { maxToolTurns: number };
1477
1484
  /** Short questions may receive a tool-free first reply. Default true. */
1478
1485
  fastPath: boolean;
1479
1486
  conciseness: ChatConcisenessConfig;
@@ -1502,6 +1509,7 @@ const CHAT_CONCISENESS_DEFAULTS: ChatConcisenessConfig = {
1502
1509
  };
1503
1510
 
1504
1511
  export const CHAT_DEFAULTS: ChatConfig = {
1512
+ factQuestion: { maxToolTurns: 6 },
1505
1513
  fastPath: true,
1506
1514
  conciseness: { ...CHAT_CONCISENESS_DEFAULTS },
1507
1515
  toolOutput: {
@@ -1682,6 +1690,8 @@ export interface AcpHopCapConfig {
1682
1690
 
1683
1691
  export interface AcpConfig {
1684
1692
  hopCap: AcpHopCapConfig;
1693
+ /** ACP client permission response deadline (positive integer milliseconds). */
1694
+ toolApproval: { timeoutMs: number };
1685
1695
  /** ACP PR reviewer and final judge backend. Absent defers to DEFAULT_REVIEW_BACKEND. */
1686
1696
  reviewBackend?: string;
1687
1697
  /** Rework agent backend. Absent defers to the driver default (codex). */
@@ -1707,7 +1717,17 @@ export interface AcpConfig {
1707
1717
  scrubBillingEnv: boolean;
1708
1718
  }
1709
1719
 
1710
- const ACP_DEFAULTS: AcpConfig = { hopCap: {}, scrubBillingEnv: true };
1720
+ const ACP_DEFAULTS: AcpConfig = { hopCap: {}, toolApproval: { timeoutMs: 60_000 }, scrubBillingEnv: true };
1721
+
1722
+ function acpApprovalTimeoutMs(value: unknown): number | undefined {
1723
+ return typeof value === 'number' && Number.isSafeInteger(value) && value > 0 && value <= 2_147_483_647
1724
+ ? value : undefined;
1725
+ }
1726
+
1727
+ function acpApprovalTimeoutEnv(): number | undefined {
1728
+ const raw = process.env.ELANOUS_ACP_TOOL_APPROVAL_TIMEOUT_MS;
1729
+ return raw !== undefined && /^\d+$/.test(raw) ? acpApprovalTimeoutMs(Number(raw)) : undefined;
1730
+ }
1711
1731
 
1712
1732
  // ── Plan mode config (Coding Pipeline P4 followup) ───────────────────
1713
1733
  //
@@ -1912,6 +1932,17 @@ function parseOpenDesignConfig(raw: unknown): OpenDesignConfig | undefined {
1912
1932
  return Object.keys(out).length > 0 ? out : undefined;
1913
1933
  }
1914
1934
 
1935
+ export function parseDiagnosticsConfig(raw: unknown): UserConfig['diagnostics'] {
1936
+ if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
1937
+ const value = (raw as Record<string, unknown>).uploadUrl;
1938
+ if (typeof value !== 'string' || !value.trim()) return undefined;
1939
+ try {
1940
+ const url = new URL(value.trim());
1941
+ if (url.protocol !== 'https:' || !url.hostname || url.username || url.password) return undefined;
1942
+ return { uploadUrl: url.href };
1943
+ } catch { return undefined; }
1944
+ }
1945
+
1915
1946
  function parseDesignConfig(raw: unknown): DesignConfig | undefined {
1916
1947
  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
1917
1948
  const r = raw as Record<string, unknown>;
@@ -1995,7 +2026,12 @@ function parseModelTierFieldOrUndefined(v: unknown): ModelTier | undefined {
1995
2026
  function parseModelTierConfig(raw: unknown): ModelTierUserConfig | undefined {
1996
2027
  if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return undefined;
1997
2028
  const r = raw as Record<string, unknown>;
1998
- const persona = isModelTierPersona(r.persona) ? r.persona : undefined;
2029
+ // Compatibility is read-only: the normalized config and subsequent writes use profile.
2030
+ let profile = isModelTierProfile(r.profile) ? r.profile : undefined;
2031
+ if (r.profile === undefined && r.persona !== undefined) {
2032
+ debug.log('config', 'deprecated-key', { from: 'modelTier.persona', to: 'modelTier.profile' });
2033
+ if (isModelTierProfile(r.persona)) profile = r.persona;
2034
+ }
1999
2035
  const preset = typeof r.preset === 'string' && r.preset.trim().length > 0
2000
2036
  ? r.preset.trim()
2001
2037
  : undefined;
@@ -2029,7 +2065,7 @@ function parseModelTierConfig(raw: unknown): ModelTierUserConfig | undefined {
2029
2065
  const embedding = parseModelTierFieldOrUndefined(r.embedding);
2030
2066
  const vision = parseModelTierFieldOrUndefined(r.vision);
2031
2067
  const out: ModelTierUserConfig = {
2032
- ...spreadIfDefined('persona', persona),
2068
+ ...spreadIfDefined('profile', profile),
2033
2069
  ...spreadIfDefined('preset', preset),
2034
2070
  ...spreadIfDefined('voice', voice),
2035
2071
  ...spreadIfDefined('llm', llm),
@@ -3401,7 +3437,9 @@ export interface RoleLlmResolveOptions {
3401
3437
  * ⛔ 아무 override 도 없으면 ③~⑥ 만 타므로 산출이 종전과 «같다»(§4f 불변식 · NL 진입 무변경). */
3402
3438
  export function resolveRoleLlm(role: ModelRole, opts: RoleLlmResolveOptions = {}): RoleLlmResolution {
3403
3439
  const config = opts.config ?? getUserConfig();
3404
- const globalProvider = resolveActiveProvider(config);
3440
+ // 전역 provider 는 필요할 때만 푼다 — 역할이 provider 를 명시했으면 전역 provider 가 없어도 해석된다.
3441
+ let activeProvider: LLMProviderName | undefined;
3442
+ const globalProvider = (): LLMProviderName => (activeProvider ??= resolveActiveProvider(config));
3405
3443
  // 명시 인자가 있으면 그것이 진실 — 없을 때만 발사 시점에 정해진 값을 읽는다(둘 다 source='flag').
3406
3444
  const flagSpec = (opts.overrides ?? launchRoleLlmOverrides)?.[role];
3407
3445
  const layers: ReadonlyArray<readonly [RoleLlmSpec | undefined, RoleLlmSource]> = [
@@ -3410,7 +3448,7 @@ export function resolveRoleLlm(role: ModelRole, opts: RoleLlmResolveOptions = {}
3410
3448
  ];
3411
3449
  for (const [spec, source] of layers) {
3412
3450
  if (!spec) continue;
3413
- const provider = spec.provider ?? globalProvider;
3451
+ const provider = spec.provider ?? globalProvider();
3414
3452
  const pinned = spec.model?.trim();
3415
3453
  let resolution: RoleLlmResolution | undefined;
3416
3454
  if (pinned) resolution = { model: pinned, provider, ...(spec.tier ? { tier: spec.tier } : {}), source };
@@ -3419,7 +3457,7 @@ export function resolveRoleLlm(role: ModelRole, opts: RoleLlmResolveOptions = {}
3419
3457
  if (resolution) { observeRoleLlm(role, resolution, spec); return resolution; }
3420
3458
  // 세 칸이 «다 비었으면» 아래 층으로 흘린다 — 빈 칸은 선언이 아니다.
3421
3459
  }
3422
- const baseline = resolveRoleLlmBaseline(role, config, globalProvider);
3460
+ const baseline = resolveRoleLlmBaseline(role, config, globalProvider());
3423
3461
  if (opts.overrides || launchRoleLlmOverrides || config.roleLlm?.[role]) observeRoleLlm(role, baseline, flagSpec);
3424
3462
  return baseline;
3425
3463
  }
@@ -3435,21 +3473,66 @@ export function resolveRoleModel(role: ModelRole, config: UserConfig = getUserCo
3435
3473
  }
3436
3474
 
3437
3475
 
3476
+ export type StewardLoopMode = 'off' | 'shadow' | 'live';
3477
+
3438
3478
  export type SeatLoopMode = 'off' | 'shadow' | 'on';
3439
3479
 
3480
+ export interface PersonaLoopConfig { enabled: boolean }
3481
+
3440
3482
  export interface SeatLoopConfig {
3441
3483
  /** No seat actions by default; shadow observes without execution, on permits the seat loop to act. */
3442
3484
  mode: SeatLoopMode;
3485
+ /** Seat-to-seat and human questions default to shadow even when the checklist loop is on. */
3486
+ questions?: 'shadow' | 'on';
3487
+ seats?: string[];
3488
+ podPool?: string;
3489
+ reportPr?: number;
3490
+ /** Parent routing and age limits for checklist stalls; omitted values use findStalls defaults. */
3491
+ stall?: { parents?: Record<string, string>; redMinutes?: number; blockedMinutes?: number };
3492
+ }
3493
+
3494
+ export type EventSeat = 'OP' | 'TC' | 'MK' | 'UX';
3495
+ export interface EventRoute { source: 'linear' | 'asana' | 'github'; kind: string; seat: EventSeat; loop: 'seat' }
3496
+ export interface EventsConfig { mode: 'shadow' | 'on'; routes: EventRoute[]; linearAssignees: Record<string, EventSeat> }
3497
+
3498
+ export function parseEventsConfig(input: unknown): EventsConfig {
3499
+ const events = input && typeof input === 'object' && !Array.isArray(input) ? input as Record<string, unknown> : {};
3500
+ const routes: EventRoute[] = [];
3501
+ const linearAssignees: Record<string, EventSeat> = Object.create(null);
3502
+ if (events.linearAssignees && typeof events.linearAssignees === 'object' && !Array.isArray(events.linearAssignees)) {
3503
+ for (const [id, seat] of Object.entries(events.linearAssignees)) {
3504
+ if (id.trim() && (seat === 'OP' || seat === 'TC' || seat === 'MK' || seat === 'UX')) linearAssignees[id] = seat;
3505
+ }
3506
+ }
3507
+ if (Array.isArray(events.routes)) for (const value of events.routes) {
3508
+ if (!value || typeof value !== 'object' || Array.isArray(value)) continue;
3509
+ const route = value as Record<string, unknown>;
3510
+ if ((route.source === 'linear' || route.source === 'asana' || route.source === 'github') && typeof route.kind === 'string' && route.kind.trim()
3511
+ && (route.seat === 'OP' || route.seat === 'TC' || route.seat === 'MK' || route.seat === 'UX') && route.loop === 'seat')
3512
+ routes.push({ source: route.source, kind: route.kind, seat: route.seat, loop: route.loop });
3513
+ }
3514
+ return { mode: events.mode === 'on' ? 'on' : 'shadow', routes, linearAssignees };
3443
3515
  }
3444
3516
 
3445
3517
  export interface UserConfig {
3518
+ events?: EventsConfig;
3519
+ /** Explicit HTTPS destination for doctor diagnostics; absent means no upload. */
3520
+ diagnostics?: { uploadUrl?: string };
3521
+ /** Root CLI help audience; absent or invalid means owner. */
3522
+ cli?: { helpRole?: 'owner' | 'contributor' | 'general' };
3523
+ /** Execution-phase HITL answer deadline; absent means 30 minutes. */
3524
+ hitl?: { executionDeadlineMinutes?: number };
3525
+ coo?: { linearProject?: string };
3526
+ decisions?: { linearProjection: { enabled: boolean } };
3527
+ /** Per-seat goal and Pod limits; missing or invalid limits use seat-budget defaults. */
3528
+ org?: { budget?: Record<string, { dailyGoals?: number; concurrentPods?: number }> };
3446
3529
  /** Steward and seat loops are parsed independently. An absent seat remains off. */
3447
- loops?: { steward?: { mode?: 'observe' | 'act'; linearTeam?: string; roles?: Record<string, { maxConcurrent?: number }>; budget?: number; tracks?: Record<string, string>; alertAfterFailures?: number }; seat?: SeatLoopConfig };
3530
+ loops?: { steward?: { mode?: StewardLoopMode; linearTeam?: string; roles?: Record<string, { maxConcurrent?: number }>; budget?: number; tracks?: Record<string, string>; alertAfterFailures?: number; launch?: 'off' | 'shadow' | 'live'; maxParallel?: number; podPool?: string }; seat?: SeatLoopConfig; persona?: PersonaLoopConfig };
3448
3531
  /** 🔐 Pod 의 Grok API 키 과금은 명시 opt-in 만. 생략·잘못된 값은 false.
3449
3532
  * budgetGate 와 같은 `harness` 객체다 — 중복 선언이면 뒤 타입이 앞을 지운다. */
3450
- harness?: { pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; defaultRepo?: string; substrate?: 'local' | 'pod'; podPool?: string };
3451
- /** ☸️ Pod 실행 칸 — `pool` = 기존 기본 풀(`컨텍스트[@ssh호스트][:상한]` 쉼표 · 앞이 우선). harness 실행은 인자·ELANOUS_POD_POOL·harness.podPool 다음으로 읽는다. */
3452
- pod?: { pool?: string; /** 호스트 Git 미러 디렉터리 — Pod Job 에 읽기 전용으로 마운트한다. */ hostMirror?: string; /** 원격 그라운딩 엔드포인트(호스트 nexus · tailnet 주소) — Pod 가 토큰으로 «질의→인용»만 묻는다(P13). */ groundingUrl?: string };
3533
+ harness?: { pod?: { grokApiKeyOptIn: boolean }; budgetGate?: HarnessBudgetGateConfig; defaultRepo?: string; substrate?: 'local' | 'pod'; podPool?: string; worktreeAddTimeoutSec?: number };
3534
+ /** ☸️ Pod 실행 칸 — `pool` = 기존 기본 풀(`컨텍스트[@ssh호스트][:상한][#k3d-레지스트리:포트]` 쉼표 · 앞이 우선). harness 실행은 인자·ELANOUS_POD_POOL·harness.podPool 다음으로 읽는다. */
3535
+ pod?: { pool?: string; /** 호스트 Git 미러 디렉터리 — Pod Job 에 읽기 전용으로 마운트한다. */ hostMirror?: string; /** 원격 그라운딩 엔드포인트(호스트 nexus · tailnet 주소) — Pod 가 토큰으로 «질의→인용»만 묻는다(P13). */ groundingUrl?: string; /** 읽기 전용 Pod lease 권장에 쓰는 계정별 동시 수. */ lease?: { perAccount?: number } };
3453
3536
  skillRouter: SkillRouterConfig;
3454
3537
  llm: LLMConfig;
3455
3538
  skills: SkillsConfig;
@@ -3773,7 +3856,10 @@ function parseRoleLlmConfig(raw: unknown): RoleLlmConfig | undefined {
3773
3856
 
3774
3857
  function defaultConfig(): UserConfig {
3775
3858
  return {
3776
- loops: { seat: { mode: 'off' } },
3859
+ cli: { helpRole: 'owner' },
3860
+ coo: { linearProject: '외부 행정·큰 일 (COO)' },
3861
+ decisions: { linearProjection: { enabled: false } },
3862
+ loops: { steward: { mode: 'shadow' }, seat: { mode: 'off', questions: 'shadow', seats: ['MK'], podPool: 'pool-node-b@node-b:8' }, persona: { enabled: false } },
3777
3863
  skillRouter: { ...SR_DEFAULTS },
3778
3864
  llm: { ...LLM_DEFAULTS },
3779
3865
  skills: skillsDefaults(),
@@ -3786,6 +3872,7 @@ function defaultConfig(): UserConfig {
3786
3872
  logs: { retention: { ...LOGS_DEFAULTS.retention } },
3787
3873
  shell: { ...SHELL_DEFAULTS },
3788
3874
  chat: {
3875
+ factQuestion: { ...CHAT_DEFAULTS.factQuestion },
3789
3876
  fastPath: CHAT_DEFAULTS.fastPath,
3790
3877
  conciseness: { ...CHAT_CONCISENESS_DEFAULTS },
3791
3878
  toolOutput: { ...CHAT_DEFAULTS.toolOutput },
@@ -3823,7 +3910,7 @@ function defaultConfig(): UserConfig {
3823
3910
  iulForegroundOnStartup: false,
3824
3911
  order: [...VW_ORDER_DEFAULT],
3825
3912
  },
3826
- acp: { hopCap: { ...ACP_DEFAULTS.hopCap }, scrubBillingEnv: ACP_DEFAULTS.scrubBillingEnv },
3913
+ acp: { hopCap: { ...ACP_DEFAULTS.hopCap }, toolApproval: { timeoutMs: acpApprovalTimeoutEnv() ?? ACP_DEFAULTS.toolApproval.timeoutMs }, scrubBillingEnv: ACP_DEFAULTS.scrubBillingEnv },
3827
3914
  lsp: cloneLspDefaults(),
3828
3915
  plan: { ...PLAN_DEFAULTS },
3829
3916
  goals: { ...GOALS_DEFAULTS },
@@ -4253,18 +4340,43 @@ function parseStewardTracks(input: unknown): Record<string, string> | undefined
4253
4340
  }
4254
4341
 
4255
4342
  function parseSeatLoopsConfig(input: unknown): SeatLoopConfig {
4256
- if (!input || typeof input !== 'object' || Array.isArray(input)) return { mode: 'off' };
4343
+ const defaults: SeatLoopConfig = { mode: 'off', questions: 'shadow', seats: ['MK'], podPool: 'pool-node-b@node-b:8' };
4344
+ if (!input || typeof input !== 'object' || Array.isArray(input)) return defaults;
4257
4345
  const seat = (input as Record<string, unknown>).seat;
4258
- if (!seat || typeof seat !== 'object' || Array.isArray(seat)) return { mode: 'off' };
4259
- const mode = (seat as Record<string, unknown>).mode;
4260
- return { mode: mode === 'on' || mode === 'shadow' ? mode : 'off' };
4346
+ if (!seat || typeof seat !== 'object' || Array.isArray(seat)) return defaults;
4347
+ const values = seat as Record<string, unknown>;
4348
+ const mode = values.mode;
4349
+ return {
4350
+ mode: mode === 'on' || mode === 'shadow' ? mode : 'off',
4351
+ questions: values.questions === 'on' ? 'on' : 'shadow',
4352
+ seats: Array.isArray(values.seats) && values.seats.length > 0
4353
+ && values.seats.every((value) => typeof value === 'string' && /^(?:MK|OP|TC|UX)$/.test(value))
4354
+ ? [...new Set(values.seats as string[])] : ['MK'],
4355
+ podPool: typeof values.podPool === 'string' && values.podPool.trim() ? values.podPool.trim() : defaults.podPool,
4356
+ ...(typeof values.reportPr === 'number' && Number.isSafeInteger(values.reportPr) && values.reportPr > 0
4357
+ ? { reportPr: values.reportPr } : {}),
4358
+ ...(() => {
4359
+ const stall = values.stall;
4360
+ if (!stall || typeof stall !== 'object' || Array.isArray(stall)) return {};
4361
+ const raw = stall as Record<string, unknown>;
4362
+ const parents = raw.parents && typeof raw.parents === 'object' && !Array.isArray(raw.parents)
4363
+ ? Object.fromEntries(Object.entries(raw.parents).filter(([from, to]) =>
4364
+ /^(?:MK|OP|TC|UX)$/.test(from) && typeof to === 'string' && /^(?:MK|OP|TC|UX)$/.test(to) && from !== to))
4365
+ : undefined;
4366
+ const minutes = (value: unknown): value is number => typeof value === 'number' && Number.isFinite(value) && value >= 0;
4367
+ return { stall: {
4368
+ ...(parents ? { parents } : {}),
4369
+ ...(minutes(raw.redMinutes) ? { redMinutes: raw.redMinutes } : {}),
4370
+ ...(minutes(raw.blockedMinutes) ? { blockedMinutes: raw.blockedMinutes } : {}),
4371
+ } };
4372
+ })(),
4373
+ };
4261
4374
  }
4262
4375
 
4263
4376
  function parseStewardLoopsConfig(input: unknown): UserConfig['loops'] {
4264
- if (!input || typeof input !== 'object' || Array.isArray(input)) return undefined;
4265
- const value = (input as Record<string, unknown>).steward;
4266
- if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;
4267
- const s = value as Record<string, unknown>;
4377
+ const loops = input && typeof input === 'object' && !Array.isArray(input) ? input as Record<string, unknown> : {};
4378
+ const value = loops.steward;
4379
+ const s = value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {};
4268
4380
  const roles: NonNullable<NonNullable<UserConfig['loops']>['steward']>['roles'] = {};
4269
4381
  if (s.roles && typeof s.roles === 'object' && !Array.isArray(s.roles)) {
4270
4382
  for (const [role, entry] of Object.entries(s.roles)) {
@@ -4274,7 +4386,12 @@ function parseStewardLoopsConfig(input: unknown): UserConfig['loops'] {
4274
4386
  }
4275
4387
  }
4276
4388
  return { steward: {
4277
- mode: s.mode === 'act' ? 'act' : 'observe',
4389
+ mode: s.mode === 'off' || s.mode === 'shadow' || s.mode === 'live' ? s.mode :
4390
+ s.launch === 'off' || s.launch === 'shadow' || s.launch === 'live' ? s.launch : 'shadow',
4391
+ // A valid legacy launch setting remains effective when mode is absent; explicit mode always wins.
4392
+ ...(s.launch === 'off' || s.launch === 'shadow' || s.launch === 'live' ? { launch: s.launch } : {}),
4393
+ ...(typeof s.maxParallel === 'number' && Number.isSafeInteger(s.maxParallel) && s.maxParallel > 0 ? { maxParallel: s.maxParallel } : {}),
4394
+ ...(typeof s.podPool === 'string' && s.podPool.trim() ? { podPool: s.podPool.trim() } : {}),
4278
4395
  ...(typeof s.linearTeam === 'string' && s.linearTeam.trim() ? { linearTeam: s.linearTeam.trim() } : {}),
4279
4396
  ...(Object.keys(roles).length ? { roles } : {}),
4280
4397
  ...(typeof s.budget === 'number' && Number.isFinite(s.budget) && s.budget >= 0 ? { budget: s.budget } : {}),
@@ -4283,6 +4400,11 @@ function parseStewardLoopsConfig(input: unknown): UserConfig['loops'] {
4283
4400
  } };
4284
4401
  }
4285
4402
 
4403
+ export function parseCliHelpRole(raw: unknown): NonNullable<UserConfig['cli']>['helpRole'] {
4404
+ const cli = raw && typeof raw === 'object' && !Array.isArray(raw) ? raw as Record<string, unknown> : {};
4405
+ return cli.helpRole === 'general' || cli.helpRole === 'contributor' ? cli.helpRole : 'owner';
4406
+ }
4407
+
4286
4408
  export function buildUserConfig(path: string = defaultPath()): UserConfig {
4287
4409
  if (!existsSync(path)) return defaultConfigWithRuntimeProvider();
4288
4410
  let raw: unknown;
@@ -4338,6 +4460,8 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4338
4460
  const logsRaw = (rawObj.logs ?? {}) as Record<string, unknown>;
4339
4461
  const sh = (rawObj.shell ?? {}) as Record<string, unknown>;
4340
4462
  const chat = (rawObj.chat ?? {}) as Record<string, unknown>;
4463
+ const chatFactQuestion = (chat.factQuestion && typeof chat.factQuestion === 'object' && !Array.isArray(chat.factQuestion))
4464
+ ? chat.factQuestion as Record<string, unknown> : {};
4341
4465
  const chatConciseness = (chat.conciseness ?? {}) as Record<string, unknown>;
4342
4466
  const chatToolOutput = (chat.toolOutput ?? {}) as Record<string, unknown>;
4343
4467
  const chatAutoCompact = (chat.autoCompact ?? {}) as Record<string, unknown>;
@@ -4370,6 +4494,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4370
4494
  const vw = (rawObj.vw ?? {}) as Record<string, unknown>;
4371
4495
  const acp = (rawObj.acp ?? {}) as Record<string, unknown>;
4372
4496
  const acpHopCap = (acp.hopCap ?? {}) as Record<string, unknown>;
4497
+ const acpToolApproval = (acp.toolApproval ?? {}) as Record<string, unknown>;
4373
4498
  const lspRaw = (rawObj.lsp ?? {}) as Record<string, unknown>;
4374
4499
 
4375
4500
  // RFC #2161 (PLAN-config-unification-elanous-root) — `elanous nexus config
@@ -4385,17 +4510,40 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4385
4510
  const rawNotifications = rawGlobalObj?.notifications ?? rawObj.notifications;
4386
4511
  const autopilotConfig = parseAutopilotConfig(rawObj.autopilot);
4387
4512
  const stewardLoops = parseStewardLoopsConfig(rawObj.loops);
4513
+ const orgRaw = rawObj.org && typeof rawObj.org === 'object' && !Array.isArray(rawObj.org) ? rawObj.org as Record<string, unknown> : {};
4514
+ const budgetRaw = orgRaw.budget && typeof orgRaw.budget === 'object' && !Array.isArray(orgRaw.budget) ? orgRaw.budget as Record<string, unknown> : {};
4515
+ const seatBudgets: NonNullable<NonNullable<UserConfig['org']>['budget']> = Object.create(null);
4516
+ for (const [seat, value] of Object.entries(budgetRaw)) {
4517
+ if (!seat || !value || typeof value !== 'object' || Array.isArray(value)) continue;
4518
+ const row = value as Record<string, unknown>;
4519
+ const dailyGoals = row.dailyGoals;
4520
+ const concurrentPods = row.concurrentPods;
4521
+ seatBudgets[seat] = {
4522
+ ...(typeof dailyGoals === 'number' && Number.isSafeInteger(dailyGoals) && dailyGoals >= 0 ? { dailyGoals } : {}),
4523
+ ...(typeof concurrentPods === 'number' && Number.isSafeInteger(concurrentPods) && concurrentPods >= 0 ? { concurrentPods } : {}),
4524
+ };
4525
+ }
4388
4526
 
4389
4527
  return {
4528
+ ...(Object.keys(seatBudgets).length ? { org: { budget: seatBudgets } } : {}),
4390
4529
  pod: {
4391
4530
  ...(typeof legacyPod.pool === 'string' && legacyPod.pool.trim() ? { pool: legacyPod.pool.trim() } : {}),
4392
4531
  ...(typeof legacyPod.hostMirror === 'string' && legacyPod.hostMirror.trim() ? { hostMirror: legacyPod.hostMirror.trim() } : {}),
4393
4532
  ...(typeof legacyPod.groundingUrl === 'string' ? { groundingUrl: legacyPod.groundingUrl } : {}),
4533
+ lease: { perAccount: (() => {
4534
+ const lease = legacyPod.lease && typeof legacyPod.lease === 'object' && !Array.isArray(legacyPod.lease)
4535
+ ? (legacyPod.lease as Record<string, unknown>) : {};
4536
+ return typeof lease.perAccount === 'number' && Number.isSafeInteger(lease.perAccount) && lease.perAccount > 0
4537
+ ? lease.perAccount : 4;
4538
+ })() },
4394
4539
  },
4395
4540
  harness: {
4396
4541
  pod: { grokApiKeyOptIn: harnessPod.grokApiKeyOptIn === true },
4397
4542
  ...(harness.substrate === 'local' || harness.substrate === 'pod' ? { substrate: harness.substrate } : {}),
4398
4543
  ...(typeof harness.podPool === 'string' && harness.podPool.trim() ? { podPool: harness.podPool.trim() } : {}),
4544
+ ...(typeof harness.worktreeAddTimeoutSec === 'number' && Number.isSafeInteger(harness.worktreeAddTimeoutSec)
4545
+ && harness.worktreeAddTimeoutSec > 0 && harness.worktreeAddTimeoutSec <= 2_147_483
4546
+ ? { worktreeAddTimeoutSec: harness.worktreeAddTimeoutSec } : {}),
4399
4547
  ...(typeof harness.defaultRepo === 'string' && isAbsolute(harness.defaultRepo)
4400
4548
  ? { defaultRepo: harness.defaultRepo } : {}),
4401
4549
  budgetGate: parseHarnessBudgetGate(
@@ -4509,6 +4657,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4509
4657
  skills: {
4510
4658
  activeSet: normalizeSkillSet(sk.activeSet),
4511
4659
  dirs: strArray(sk.dirs, skillsDefaults().dirs),
4660
+ giftEndpoint: str(sk.giftEndpoint) ?? 'https://elanous.ai',
4512
4661
  includeSharedAgentSkills: sk.includeSharedAgentSkills !== false,
4513
4662
  ...(() => { const sources = parsePersistedSkillSources(sk.sources, sk.connected); return sources ? { sources } : {}; })(),
4514
4663
  allow: strArray(sk.allow, []),
@@ -4533,6 +4682,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4533
4682
  ...(tg.poller === 'standalone' || tg.poller === 'nexus' ? { poller: tg.poller } : {}),
4534
4683
  ...(normalizeKindRoles(tg.kindRoles) ? { kindRoles: normalizeKindRoles(tg.kindRoles)! } : {}),
4535
4684
  ...(str(tg.fieldDefaultEvent) ? { fieldDefaultEvent: str(tg.fieldDefaultEvent)! } : {}),
4685
+ ...(tg.fieldReelMode === 'instant' || tg.fieldReelMode === 'standard' ? { fieldReelMode: tg.fieldReelMode } : {}),
4536
4686
  },
4537
4687
  discord: {
4538
4688
  enabled: dc.enabled === true,
@@ -4593,6 +4743,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4593
4743
  },
4594
4744
  onboarding: {
4595
4745
  ...(typeof ob2.webFirst === 'boolean' ? { webFirst: ob2.webFirst } : {}),
4746
+ ...(typeof ob2.ready === 'boolean' ? { ready: ob2.ready } : {}),
4596
4747
  completed: ob2.completed === true,
4597
4748
  completedAt: str(ob2.completedAt),
4598
4749
  version: typeof ob2.version === 'number' ? ob2.version : 0,
@@ -4640,6 +4791,11 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4640
4791
  },
4641
4792
  ...((): { errorReports?: ErrorReportsConfig } => { const er = parseErrorReportsConfig(rawObj.errorReports); return er ? { errorReports: er } : {}; })(),
4642
4793
  chat: {
4794
+ factQuestion: {
4795
+ maxToolTurns: typeof chatFactQuestion.maxToolTurns === 'number'
4796
+ && Number.isSafeInteger(chatFactQuestion.maxToolTurns) && chatFactQuestion.maxToolTurns > 0
4797
+ ? chatFactQuestion.maxToolTurns : CHAT_DEFAULTS.factQuestion.maxToolTurns,
4798
+ },
4643
4799
  fastPath: chat.fastPath === false || chat.fastPath === 'false' ? false : CHAT_DEFAULTS.fastPath,
4644
4800
  conciseness: {
4645
4801
  enabled: chatConciseness.enabled === false ? false : CHAT_CONCISENESS_DEFAULTS.enabled,
@@ -4999,6 +5155,10 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
4999
5155
  })(),
5000
5156
  acp: {
5001
5157
  hopCap: parseHopCap(acpHopCap),
5158
+ toolApproval: {
5159
+ timeoutMs: acpApprovalTimeoutMs(acpToolApproval.timeoutMs)
5160
+ ?? acpApprovalTimeoutEnv() ?? ACP_DEFAULTS.toolApproval.timeoutMs,
5161
+ },
5002
5162
  ...(typeof acp.reviewBackend === 'string' && acp.reviewBackend.trim()
5003
5163
  ? { reviewBackend: acp.reviewBackend.trim() }
5004
5164
  : {}),
@@ -5019,7 +5179,17 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
5019
5179
  goals: parseGoalsConfig(rawObj.goals),
5020
5180
  registry: parseRegistryConfig(rawObj.registry),
5021
5181
  tools: parseToolsConfig(rawObj.tools),
5022
- loops: { ...(stewardLoops ?? {}), seat: parseSeatLoopsConfig(rawObj.loops) },
5182
+ ...(rawObj.hitl && typeof rawObj.hitl === 'object' && !Array.isArray(rawObj.hitl)
5183
+ && typeof (rawObj.hitl as Record<string, unknown>).executionDeadlineMinutes === 'number'
5184
+ ? { hitl: { executionDeadlineMinutes: (rawObj.hitl as { executionDeadlineMinutes: number }).executionDeadlineMinutes } }
5185
+ : {}),
5186
+ cli: { helpRole: parseCliHelpRole(rawObj.cli) },
5187
+ coo: { linearProject: typeof (rawObj.coo as { linearProject?: unknown } | undefined)?.linearProject === 'string' && (rawObj.coo as { linearProject: string }).linearProject.trim()
5188
+ ? (rawObj.coo as { linearProject: string }).linearProject.trim() : '외부 행정·큰 일 (COO)' },
5189
+ decisions: { linearProjection: { enabled: ((rawObj.decisions as { linearProjection?: { enabled?: unknown } } | undefined)?.linearProjection?.enabled === true) } },
5190
+ loops: { ...(stewardLoops ?? {}), seat: parseSeatLoopsConfig(rawObj.loops),
5191
+ persona: { enabled: (rawObj.loops as { persona?: { enabled?: unknown } } | undefined)?.persona?.enabled === true } },
5192
+ events: parseEventsConfig(rawObj.events),
5023
5193
  // M1-1: sparse — undefined when the user hasn't set anything, so
5024
5194
  // resolvers fall through to zero-config defaults.
5025
5195
  ...spreadIfDefined('modelTier', parseModelTierConfig(rawObj.modelTier)),
@@ -5028,6 +5198,7 @@ export function buildUserConfig(path: string = defaultPath()): UserConfig {
5028
5198
  ...spreadIfDefined('taste', parseTasteConfig(rawObj.taste)),
5029
5199
  ...spreadIfDefined('webSearch', parseWebSearchConfig(rawObj.webSearch)),
5030
5200
  ...spreadIfDefined('design', parseDesignConfig(rawObj.design)),
5201
+ diagnostics: parseDiagnosticsConfig(rawObj.diagnostics),
5031
5202
  ...spreadIfDefined('budget', parseBudgetConfig(rawObj.budget)),
5032
5203
  ...spreadIfDefined('smartDefaults', parseSmartDefaultsConfig(rawObj.smartDefaults)),
5033
5204
  ...spreadIfDefined('roleModels', parseRoleModelConfig(rawObj.roleModels)),
@@ -5590,6 +5761,7 @@ export function saveUserConfig(
5590
5761
  delete rawRest.budget;
5591
5762
  delete rawRest.smartDefaults;
5592
5763
  delete rawRest.grounding;
5764
+ delete rawRest.diagnostics;
5593
5765
  const rawHarness = rawRest.harness && typeof rawRest.harness === 'object' && !Array.isArray(rawRest.harness)
5594
5766
  ? rawRest.harness as Record<string, unknown> : {};
5595
5767
  delete rawRest.harness;
@@ -5597,6 +5769,8 @@ export function saveUserConfig(
5597
5769
  ? rawRest.autopilot as Record<string, unknown> : {};
5598
5770
  const rawLoops = rawRest.loops && typeof rawRest.loops === 'object' && !Array.isArray(rawRest.loops)
5599
5771
  ? rawRest.loops as Record<string, unknown> : {};
5772
+ const rawSteward = rawLoops.steward && typeof rawLoops.steward === 'object' && !Array.isArray(rawLoops.steward)
5773
+ ? rawLoops.steward as Record<string, unknown> : {};
5600
5774
  if (cfg.loops) delete rawRest.loops;
5601
5775
  if (cfg.pod?.hostMirror) {
5602
5776
  const rawPod = rawRest.pod && typeof rawRest.pod === 'object' && !Array.isArray(rawRest.pod)
@@ -5616,7 +5790,14 @@ export function saveUserConfig(
5616
5790
  ...rawRest,
5617
5791
  ...(cfg.loops ? { loops: {
5618
5792
  ...rawLoops,
5619
- ...(cfg.loops.seat ? { seat: { mode: cfg.loops.seat.mode } } : {}),
5793
+ ...(cfg.loops.steward ? { steward: { ...rawSteward, mode: cfg.loops.steward.mode ?? cfg.loops.steward.launch ?? 'shadow' } } : {}),
5794
+ ...(cfg.loops.seat ? { seat: {
5795
+ mode: cfg.loops.seat.mode,
5796
+ questions: cfg.loops.seat.questions ?? 'shadow',
5797
+ seats: cfg.loops.seat.seats ?? ['MK'],
5798
+ podPool: cfg.loops.seat.podPool ?? 'pool-node-b@node-b:8',
5799
+ ...(cfg.loops.seat.reportPr === undefined ? {} : { reportPr: cfg.loops.seat.reportPr }),
5800
+ } } : {}),
5620
5801
  } } : {}),
5621
5802
  ...(cfg.autopilot ? { autopilot: {
5622
5803
  ...rawAutopilot,
@@ -5683,6 +5864,7 @@ export function saveUserConfig(
5683
5864
  skills: stripUndef({
5684
5865
  activeSet: cfg.skills.activeSet,
5685
5866
  dirs: [...cfg.skills.dirs],
5867
+ giftEndpoint: cfg.skills.giftEndpoint === 'https://elanous.ai' ? undefined : cfg.skills.giftEndpoint,
5686
5868
  // EN5 — only connected roots are persisted (preset/shared/package are derived). The dev-only `connected` key is not written back.
5687
5869
  sources: cfg.skills.sources && cfg.skills.sources.some((source) => source.kind === 'connected')
5688
5870
  ? cfg.skills.sources.filter((source) => source.kind === 'connected').map(({ id, path, enabled }) => ({ id, path, enabled }))
@@ -5739,6 +5921,7 @@ export function saveUserConfig(
5739
5921
  // 「직렬화 드롭」으로 조용히 사라졌다 — 운영 전환 스위치를 켤 방법이 없었다(07-22 botUsername 과 같은 모양).
5740
5922
  poller: cfg.telegram.poller,
5741
5923
  fieldDefaultEvent: cfg.telegram.fieldDefaultEvent,
5924
+ fieldReelMode: cfg.telegram.fieldReelMode,
5742
5925
  }),
5743
5926
  discord: stripUndef({
5744
5927
  enabled: cfg.discord.enabled,
@@ -5773,6 +5956,7 @@ export function saveUserConfig(
5773
5956
  }),
5774
5957
  onboarding: stripUndef({
5775
5958
  webFirst: cfg.onboarding.webFirst,
5959
+ ready: cfg.onboarding.ready,
5776
5960
  completed: cfg.onboarding.completed,
5777
5961
  completedAt: cfg.onboarding.completedAt,
5778
5962
  version: cfg.onboarding.version,
@@ -5855,6 +6039,10 @@ export function saveUserConfig(
5855
6039
  : undefined,
5856
6040
  slashMaxTurns: cfg.acp.slashMaxTurns,
5857
6041
  editApproval: cfg.acp.editApproval ? true : undefined,
6042
+ toolApproval: acpApprovalTimeoutMs(
6043
+ (cfg.raw?.acp as { toolApproval?: { timeoutMs?: unknown } } | undefined)?.toolApproval?.timeoutMs,
6044
+ ) !== undefined || cfg.acp.toolApproval.timeoutMs !== (acpApprovalTimeoutEnv() ?? ACP_DEFAULTS.toolApproval.timeoutMs)
6045
+ ? { timeoutMs: cfg.acp.toolApproval.timeoutMs } : undefined,
5858
6046
  scrubBillingEnv: cfg.acp.scrubBillingEnv === false ? false : undefined,
5859
6047
  }),
5860
6048
  lsp: stripUndef({
@@ -5933,12 +6121,13 @@ export function saveUserConfig(
5933
6121
  ...(cfg.tabs && Object.keys(cfg.tabs).length > 0 ? { tabs: cfg.tabs } : {}),
5934
6122
  // M1-2b: sparse — emit only when explicitly set. Keeps Path-A-only
5935
6123
  // users' file clean (no empty modelTier:{} blobs).
5936
- ...(cfg.modelTier ? { modelTier: cfg.modelTier } : {}),
6124
+ ...(cfg.modelTier ? { modelTier: parseModelTierConfig(cfg.modelTier) } : {}),
5937
6125
  ...(cfg.sessionFabric ? { sessionFabric: cfg.sessionFabric } : {}),
5938
6126
  ...(cfg.nextFluent ? { nextFluent: cfg.nextFluent } : {}),
5939
6127
  ...(cfg.taste ? { taste: cfg.taste } : {}),
5940
6128
  ...(cfg.webSearch ? { webSearch: cfg.webSearch } : {}),
5941
6129
  ...(cfg.design ? { design: cfg.design } : {}),
6130
+ ...(cfg.diagnostics?.uploadUrl ? { diagnostics: parseDiagnosticsConfig(cfg.diagnostics) } : {}),
5942
6131
  ...(cfg.budget ? { budget: cfg.budget } : {}),
5943
6132
  ...(cfg.smartDefaults ? { smartDefaults: cfg.smartDefaults } : {}),
5944
6133
  ...(cfg.grounding && cfg.grounding.sources.length > 0
@@ -1 +1 @@
1
- {"commit":"8f3512a904cff53bb1595fffc091f7443a29c2c2"}
1
+ {"commit":"e61a9846510a7f6ac0a0f223d8e4c8b384685df8"}
@@ -0,0 +1,32 @@
1
+ import { debug } from '../debug/log.js';
2
+ import type { ExecRequest } from '../exec-requests/store.js';
3
+ import { sendPushToAll } from './sender.js';
4
+ import { listSubscriptions } from './subscriptions.js';
5
+
6
+ export async function notifyExecRequestTransition(opts: {
7
+ id: string;
8
+ text: string;
9
+ from: ExecRequest['status'];
10
+ to: ExecRequest['status'];
11
+ summary?: string;
12
+ pendingApprovals: number;
13
+ }): Promise<void> {
14
+ const { id, text, from, to, summary, pendingApprovals } = opts;
15
+ const kind = from !== to && (to === 'done' || to === 'failed')
16
+ ? to : pendingApprovals > 0 && from === to ? 'approval' : null;
17
+ if (!kind) return;
18
+ const subscribers = listSubscriptions().length;
19
+ const details = { id, kind, subscribers, textLength: text.length };
20
+ if (!subscribers) {
21
+ debug.log('webpush.exec', 'skipped', details);
22
+ return;
23
+ }
24
+ const title = `${kind === 'done' ? '맡긴 일 완료' : kind === 'failed' ? '맡긴 일 실패' : '게시 승인 대기'} · ${text.slice(0, 40)}`;
25
+ const body = kind === 'approval' ? '승인하거나 보류해 주세요' : (summary ?? '').split(/\r?\n/, 1)[0]!.slice(0, 80);
26
+ try {
27
+ await sendPushToAll({ title, body, url: `/exec?id=${encodeURIComponent(id)}`, tag: `exec-${id}` });
28
+ debug.log('webpush.exec', 'sent', details);
29
+ } catch {
30
+ debug.log('webpush.exec', 'skipped', details);
31
+ }
32
+ }
@@ -19,6 +19,7 @@
19
19
 
20
20
  import { getGrokApiKey } from '../config.js';
21
21
  import { grokAgentSearch, GROK_SEARCH_MODEL } from '../grok/agent-search.js';
22
+ import { wantsXSearch } from './x-intent.js';
22
23
  import type { WebSearchHit, WebSearchProvider, WebSearchResult } from './provider.js';
23
24
 
24
25
  const DEFAULT_LIMIT = 5;
@@ -52,10 +53,15 @@ export function buildGrokWebSearchProvider(): WebSearchProvider {
52
53
 
53
54
  if (!r.ok) throw new Error(r.error ?? 'grok search failed');
54
55
 
55
- const hits: WebSearchHit[] = r.citations.slice(0, limit).map(c => ({
56
+ const xSourceUrls = new Set(r.xSearchSources ?? []);
57
+ const citations = wantsXSearch(q.query)
58
+ ? [...r.citations.filter(c => xSourceUrls.has(c.url)), ...r.citations.filter(c => !xSourceUrls.has(c.url))]
59
+ : r.citations;
60
+ const hits: WebSearchHit[] = citations.slice(0, limit).map(c => ({
56
61
  url: c.url,
57
62
  title: c.title ?? c.url,
58
63
  snippet: '',
64
+ ...(xSourceUrls.has(c.url) ? { xSearchSource: true } : {}),
59
65
  }));
60
66
 
61
67
  const note = r.text.length > 0 ? r.text.slice(0, 1500) : undefined;