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.
- package/.env.example +6 -0
- package/README.md +16 -14
- package/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/chunks/1105-c473ed46272fba79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1191-7b13a24117a689fa.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1377-1efeffbbac0963ff.js +1 -0
- package/apps/pwa/out/_next/static/chunks/1470.98a6ab61ccb4131c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/216-5acd01cbde4acda7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2330-c2f07246c8788af1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2375-3fcae5186c64fe6b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2415.ed6428ff334c7ce2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2977-e38442e86289f1d3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/2982-2a2df543be3d2e5a.js +25 -0
- package/apps/pwa/out/_next/static/chunks/{2a79f15a-2013e4d421d6df88.js → 2ea96958-e8c7e112de50b067.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/319-d37df1b6e0cbeff4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3403.4bc97b4066945a94.js +5 -0
- package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +1 -0
- package/apps/pwa/out/_next/static/chunks/371-4ad6af55dad02ced.js +1 -0
- package/apps/pwa/out/_next/static/chunks/4114-3e63117452378807.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{6804.8ed6ab492bc5fc0a.js → 4323.c5dfb6f503304775.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/4836-3c93795ab834381e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{320-d7013ec072863e5e.js → 5080-1613752891fcadb4.js} +4 -4
- package/apps/pwa/out/_next/static/chunks/5609-012bb3557211f07e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5791-bb82743fa6299562.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6062-73e68343a9814f6a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6090-1bd6077591603947.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6320-baac91d68843a9a6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6725-68ab7cc0b1faf00d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/6998-a654fe5c58271600.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7457-f5cb1cc8db9f7453.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7647.2fcd30d894d5ee30.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7673-2eda1507d38dadb8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7990-e12efba616f46e03.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8046cadf-211ca3c0e00f2b72.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8067-f74bf14d67ad98f1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8142-011e1f474efb8b33.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8519-0059d82bdb4812bf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8619-4365e03a2862830f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/920-f7dceb78f1c585ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9651-3cd291a6fa1370d2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9740-52467f244755917f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9804-64c02c3c127d5014.js +1 -0
- package/apps/pwa/out/_next/static/chunks/ae787e4c-f2998de7f1ba72a4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-859cea1570b6227a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-21c3261af6ab377c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-1991445b8ea86274.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-4ebfaee2369fe248.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-9fa879ebf5959096.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-ca7c3cc305c3285a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/page-9951930add3d2051.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-4472ddf1e2458e69.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-4de08d4b766f134b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/editor/page-7a975e2b9db1dfb7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-859cea1570b6227a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-49270714ef35bb96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-33fbdf353e2a5982.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-259f122e2dd64317.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-65b82726753658e1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-4b8df3748dc06285.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/page-112f7e477bda77fd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-542a5c0006da637c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-63ffb347831262ea.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-98e4e359d97263b4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-97e24ac675ce576e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-ac6391f26391d89d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9f45c9d45ffc43bd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-36995b9cb5d98218.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/page-0c795b577988d63f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-b4311e2f71c6735a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-859cea1570b6227a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-eb2381074df20dba.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-b01336e64eba01ae.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-7af7f21c1f2858ef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-a98ecd364586c89b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-57f0502dfbfa089b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-3467d2e1abd8a14a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-7842ca23d53ba682.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-ae9ac882912b0198.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-3a0d72e3f783bcef.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-f3b39fe8358c2a97.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-5a22af3181ac2afb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/framework-ea806bb57f2b8923.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-8d2302399c2c8f87.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-1457627bb302a22c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_app-b10928c60f0b8488.js +1 -0
- package/apps/pwa/out/_next/static/chunks/pages/_error-689039227d443fab.js +1 -0
- package/apps/pwa/out/_next/static/chunks/webpack-e5bea36f183b25e6.js +1 -0
- package/apps/pwa/out/_next/static/css/e66b7f5efc8df3f3.css +1 -0
- package/apps/pwa/out/_next/static/zoQX5iTvXOsIvCjxCe1Ji/_buildManifest.js +1 -0
- package/apps/pwa/out/approvals/index.html +1 -0
- package/apps/pwa/out/approvals/index.txt +30 -0
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +27 -26
- package/apps/pwa/out/board/index.html +1 -0
- package/apps/pwa/out/board/index.txt +30 -0
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +24 -23
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +24 -23
- package/apps/pwa/out/chat/index.html +1 -2
- package/apps/pwa/out/chat/index.txt +24 -23
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +27 -26
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +27 -26
- package/apps/pwa/out/editor/index.html +1 -0
- package/apps/pwa/out/editor/index.txt +31 -0
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +24 -23
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +27 -26
- package/apps/pwa/out/live/index.html +1 -0
- package/apps/pwa/out/live/index.txt +30 -0
- package/apps/pwa/out/market/index.html +1 -0
- package/apps/pwa/out/market/index.txt +27 -0
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +24 -23
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +27 -26
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +27 -26
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +25 -24
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +27 -26
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +24 -23
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +27 -26
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +27 -26
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +27 -26
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +27 -26
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +27 -26
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +24 -23
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +27 -26
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +27 -26
- package/apps/pwa/out/trace/index.html +1 -0
- package/apps/pwa/out/trace/index.txt +30 -0
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +27 -26
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +27 -26
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +27 -27
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +27 -26
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +27 -26
- package/catalog/resources.yaml +8 -11
- package/docs/design/systems/LICENSE +201 -0
- package/docs/design/systems/NOTICE.md +29 -0
- package/docs/design/systems/SOURCE.json +291 -0
- package/docs/design/systems/application/DESIGN.md +71 -0
- package/docs/design/systems/application/manifest.json +54 -0
- package/docs/design/systems/application/tokens.css +63 -0
- package/docs/design/systems/artistic/DESIGN.md +71 -0
- package/docs/design/systems/artistic/manifest.json +54 -0
- package/docs/design/systems/artistic/tokens.css +63 -0
- package/docs/design/systems/bento/DESIGN.md +71 -0
- package/docs/design/systems/bento/manifest.json +54 -0
- package/docs/design/systems/bento/tokens.css +63 -0
- package/docs/design/systems/bold/DESIGN.md +71 -0
- package/docs/design/systems/bold/manifest.json +54 -0
- package/docs/design/systems/bold/tokens.css +63 -0
- package/docs/design/systems/brutalism/DESIGN.md +71 -0
- package/docs/design/systems/brutalism/manifest.json +54 -0
- package/docs/design/systems/brutalism/tokens.css +63 -0
- package/docs/design/systems/cafe/DESIGN.md +71 -0
- package/docs/design/systems/cafe/manifest.json +54 -0
- package/docs/design/systems/cafe/tokens.css +63 -0
- package/docs/design/systems/claymorphism/DESIGN.md +71 -0
- package/docs/design/systems/claymorphism/manifest.json +54 -0
- package/docs/design/systems/claymorphism/tokens.css +63 -0
- package/docs/design/systems/clean/DESIGN.md +71 -0
- package/docs/design/systems/clean/manifest.json +54 -0
- package/docs/design/systems/clean/tokens.css +63 -0
- package/docs/design/systems/colorful/DESIGN.md +71 -0
- package/docs/design/systems/colorful/manifest.json +54 -0
- package/docs/design/systems/colorful/tokens.css +63 -0
- package/docs/design/systems/contemporary/DESIGN.md +71 -0
- package/docs/design/systems/contemporary/manifest.json +54 -0
- package/docs/design/systems/contemporary/tokens.css +63 -0
- package/docs/design/systems/corporate/DESIGN.md +71 -0
- package/docs/design/systems/corporate/manifest.json +54 -0
- package/docs/design/systems/corporate/tokens.css +63 -0
- package/docs/design/systems/cosmic/DESIGN.md +71 -0
- package/docs/design/systems/cosmic/manifest.json +54 -0
- package/docs/design/systems/cosmic/tokens.css +63 -0
- package/docs/design/systems/creative/DESIGN.md +71 -0
- package/docs/design/systems/creative/manifest.json +54 -0
- package/docs/design/systems/creative/tokens.css +63 -0
- package/docs/design/systems/dashboard/DESIGN.md +71 -0
- package/docs/design/systems/dashboard/manifest.json +54 -0
- package/docs/design/systems/dashboard/tokens.css +63 -0
- package/docs/design/systems/default/DESIGN.md +62 -0
- package/docs/design/systems/default/manifest.json +69 -0
- package/docs/design/systems/default/tokens.css +200 -0
- package/docs/design/systems/dithered/DESIGN.md +71 -0
- package/docs/design/systems/dithered/manifest.json +54 -0
- package/docs/design/systems/dithered/tokens.css +63 -0
- package/docs/design/systems/doodle/DESIGN.md +71 -0
- package/docs/design/systems/doodle/manifest.json +54 -0
- package/docs/design/systems/doodle/tokens.css +63 -0
- package/docs/design/systems/dramatic/DESIGN.md +71 -0
- package/docs/design/systems/dramatic/manifest.json +54 -0
- package/docs/design/systems/dramatic/tokens.css +63 -0
- package/docs/design/systems/editorial/DESIGN.md +71 -0
- package/docs/design/systems/editorial/manifest.json +54 -0
- package/docs/design/systems/editorial/tokens.css +63 -0
- package/docs/design/systems/elegant/DESIGN.md +71 -0
- package/docs/design/systems/elegant/manifest.json +54 -0
- package/docs/design/systems/elegant/tokens.css +63 -0
- package/docs/design/systems/energetic/DESIGN.md +72 -0
- package/docs/design/systems/energetic/manifest.json +54 -0
- package/docs/design/systems/energetic/tokens.css +63 -0
- package/docs/design/systems/enterprise/DESIGN.md +71 -0
- package/docs/design/systems/enterprise/manifest.json +54 -0
- package/docs/design/systems/enterprise/tokens.css +63 -0
- package/docs/design/systems/expressive/DESIGN.md +71 -0
- package/docs/design/systems/expressive/manifest.json +54 -0
- package/docs/design/systems/expressive/tokens.css +63 -0
- package/docs/design/systems/fantasy/DESIGN.md +71 -0
- package/docs/design/systems/fantasy/manifest.json +54 -0
- package/docs/design/systems/fantasy/tokens.css +63 -0
- package/docs/design/systems/flat/DESIGN.md +71 -0
- package/docs/design/systems/flat/manifest.json +54 -0
- package/docs/design/systems/flat/tokens.css +63 -0
- package/docs/design/systems/friendly/DESIGN.md +71 -0
- package/docs/design/systems/friendly/manifest.json +54 -0
- package/docs/design/systems/friendly/tokens.css +63 -0
- package/docs/design/systems/glassmorphism/DESIGN.md +71 -0
- package/docs/design/systems/glassmorphism/manifest.json +54 -0
- package/docs/design/systems/glassmorphism/tokens.css +63 -0
- package/docs/design/systems/gradient/DESIGN.md +71 -0
- package/docs/design/systems/gradient/manifest.json +54 -0
- package/docs/design/systems/gradient/tokens.css +63 -0
- package/docs/design/systems/luxury/DESIGN.md +71 -0
- package/docs/design/systems/luxury/manifest.json +54 -0
- package/docs/design/systems/luxury/tokens.css +63 -0
- package/docs/design/systems/minimal/DESIGN.md +71 -0
- package/docs/design/systems/minimal/manifest.json +54 -0
- package/docs/design/systems/minimal/tokens.css +63 -0
- package/docs/design/systems/modern/DESIGN.md +71 -0
- package/docs/design/systems/modern/manifest.json +54 -0
- package/docs/design/systems/modern/tokens.css +63 -0
- package/docs/design/systems/mono/DESIGN.md +71 -0
- package/docs/design/systems/mono/manifest.json +54 -0
- package/docs/design/systems/mono/tokens.css +63 -0
- package/docs/design/systems/neobrutalism/DESIGN.md +71 -0
- package/docs/design/systems/neobrutalism/manifest.json +54 -0
- package/docs/design/systems/neobrutalism/tokens.css +63 -0
- package/docs/design/systems/neon/DESIGN.md +71 -0
- package/docs/design/systems/neon/manifest.json +54 -0
- package/docs/design/systems/neon/tokens.css +63 -0
- package/docs/design/systems/neumorphism/DESIGN.md +71 -0
- package/docs/design/systems/neumorphism/manifest.json +54 -0
- package/docs/design/systems/neumorphism/tokens.css +63 -0
- package/docs/design/systems/paper/DESIGN.md +71 -0
- package/docs/design/systems/paper/manifest.json +54 -0
- package/docs/design/systems/paper/tokens.css +63 -0
- package/docs/design/systems/perspective/DESIGN.md +71 -0
- package/docs/design/systems/perspective/manifest.json +54 -0
- package/docs/design/systems/perspective/tokens.css +63 -0
- package/docs/design/systems/premium/DESIGN.md +71 -0
- package/docs/design/systems/premium/manifest.json +54 -0
- package/docs/design/systems/premium/tokens.css +63 -0
- package/docs/design/systems/professional/DESIGN.md +71 -0
- package/docs/design/systems/professional/manifest.json +54 -0
- package/docs/design/systems/professional/tokens.css +63 -0
- package/docs/design/systems/publication/DESIGN.md +71 -0
- package/docs/design/systems/publication/manifest.json +54 -0
- package/docs/design/systems/publication/tokens.css +63 -0
- package/docs/design/systems/refined/DESIGN.md +71 -0
- package/docs/design/systems/refined/manifest.json +54 -0
- package/docs/design/systems/refined/tokens.css +63 -0
- package/docs/design/systems/retro/DESIGN.md +71 -0
- package/docs/design/systems/retro/manifest.json +54 -0
- package/docs/design/systems/retro/tokens.css +63 -0
- package/docs/design/systems/shadcn/DESIGN.md +71 -0
- package/docs/design/systems/shadcn/manifest.json +54 -0
- package/docs/design/systems/shadcn/tokens.css +255 -0
- package/docs/design/systems/simple/DESIGN.md +71 -0
- package/docs/design/systems/simple/manifest.json +54 -0
- package/docs/design/systems/simple/tokens.css +63 -0
- package/docs/design/systems/skeumorphism/DESIGN.md +71 -0
- package/docs/design/systems/skeumorphism/manifest.json +54 -0
- package/docs/design/systems/skeumorphism/tokens.css +63 -0
- package/docs/design/systems/sleek/DESIGN.md +71 -0
- package/docs/design/systems/sleek/manifest.json +54 -0
- package/docs/design/systems/sleek/tokens.css +63 -0
- package/docs/design/systems/spacious/DESIGN.md +71 -0
- package/docs/design/systems/spacious/manifest.json +54 -0
- package/docs/design/systems/spacious/tokens.css +63 -0
- package/docs/design/systems/storytelling/DESIGN.md +71 -0
- package/docs/design/systems/storytelling/manifest.json +54 -0
- package/docs/design/systems/storytelling/tokens.css +63 -0
- package/docs/design/systems/tom-modern/DESIGN.md +361 -0
- package/docs/design/systems/tom-modern/manifest.json +16 -0
- package/docs/design/systems/tom-modern/tokens.css +99 -0
- package/docs/design/systems/vibrant/DESIGN.md +71 -0
- package/docs/design/systems/vibrant/manifest.json +54 -0
- package/docs/design/systems/vibrant/tokens.css +63 -0
- package/docs/design/systems/vintage/DESIGN.md +71 -0
- package/docs/design/systems/vintage/manifest.json +54 -0
- package/docs/design/systems/vintage/tokens.css +63 -0
- package/docs/design/systems/warm-editorial/DESIGN.md +65 -0
- package/docs/design/systems/warm-editorial/manifest.json +54 -0
- package/docs/design/systems/warm-editorial/tokens.css +63 -0
- package/docs/goal-context/01-goal-authoring-checks.md +18 -0
- package/docs/goal-context/steward-directives-2026-09-28.md +44 -0
- package/graphs/catalog/catalog.yaml +615 -0
- package/graphs/default-loop.yaml +1 -1
- package/graphs/document-loop.yaml +1 -1
- package/graphs/examples/stale-draft-digest/digest.ts +26 -0
- package/graphs/examples/stale-draft-digest/recipes.yaml +8 -0
- package/graphs/examples/stale-draft-digest/stale-draft-digest.yaml +22 -0
- package/graphs/heal/heal-loop.yaml +155 -0
- package/graphs/heal/recipes.yaml +19 -0
- package/graphs/implement-loop.yaml +2 -2
- package/graphs/intake/intake-daily.yaml +55 -0
- package/graphs/intake/recipes.yaml +16 -0
- package/graphs/landing/landing-heal.yaml +22 -0
- package/graphs/landing/recipes.yaml +8 -0
- package/graphs/launch/launch-head.yaml +66 -0
- package/graphs/launch/recipes.yaml +8 -0
- package/graphs/operate-loop.yaml +1 -1
- package/graphs/ops/docs-publish.yaml +31 -0
- package/graphs/ops/recipes.yaml +8 -0
- package/graphs/release/recipes.yaml +38 -0
- package/graphs/release/release-loop.yaml +40 -0
- package/graphs/research-loop.yaml +1 -1
- package/graphs/steward/recipes.yaml +12 -0
- package/graphs/steward/steward.yaml +45 -0
- package/graphs/video/broll-line.yaml +54 -0
- package/package.json +7 -5
- package/plugins/job-coach/.agents/plugins/marketplace.json +12 -0
- package/plugins/job-coach/.codex-plugin/plugin.json +6 -0
- package/plugins/job-coach/.mcp.json +9 -0
- package/plugins/job-coach/README.md +20 -0
- package/plugins/job-coach/connectors/ncs/server.ts +89 -0
- package/plugins/job-coach/examples/interview-sample.md +11 -0
- package/plugins/job-coach/graphs/course-links.ts +46 -0
- package/plugins/job-coach/graphs/recipes.yaml +18 -0
- package/plugins/job-coach/graphs/report.yaml +20 -0
- package/plugins/job-coach/graphs/run-step.ts +108 -0
- package/plugins/job-coach/plugin.json +13 -0
- package/plugins/job-coach/plugin.ts +6 -0
- package/plugins/job-coach/skills/career-report/SKILL.md +6 -0
- package/plugins/job-coach/skills/interview-to-profile/SKILL.md +6 -0
- package/plugins/job-coach/skills/run-report/SKILL.md +15 -0
- package/scripts/backup/elanous-backup.sh +139 -13
- package/scripts/backup/elanous-restore.sh +122 -0
- package/scripts/ci-daemon-port-gate.ts +164 -0
- package/scripts/ci-typecheck-changed.ts +15 -1
- package/scripts/cli-json-exit-scan.ts +126 -0
- package/scripts/codex-quota-alert-format.ts +52 -0
- package/scripts/codex-quota-alert.ts +63 -13
- package/scripts/continuation-dogfood.ts +2 -1
- package/scripts/coord-channel-watch.sh +5 -5
- package/scripts/coord-tracks.json +5 -4
- package/scripts/cron-run.ts +37 -16
- package/scripts/daemon-port-baseline.txt +9 -0
- package/scripts/design/extract-corpus-bench.ts +469 -0
- package/scripts/design/extract-corpus-score.ts +510 -0
- package/scripts/design/vendor-open-design-systems.ts +100 -0
- package/scripts/docs-lint.ts +1 -1
- package/scripts/fleet/node-setup.sh +38 -4
- package/scripts/heal/run-role.ts +328 -0
- package/scripts/install-role-watch.sh +95 -0
- package/scripts/install.ps1 +11 -1
- package/scripts/install.sh +81 -9
- package/scripts/isolation-hardcode-baseline.txt +1 -1
- package/scripts/landing-heal/must-fix-match.ts +37 -0
- package/scripts/landing-heal/run-mission.ts +101 -0
- package/scripts/lib/pwa-scenarios/acp-replay.ts +79 -0
- package/scripts/lib/pwa-scenarios/cdp-driver.ts +67 -0
- package/scripts/lib/pwa-scenarios/runner.ts +200 -0
- package/scripts/lib/pwa-scenarios/scenarios.ts +202 -0
- package/scripts/market/db-check.ts +212 -0
- package/scripts/market-posture-cycle.ts +63 -4
- package/scripts/nightly-docops.ts +1 -1
- package/scripts/ops/channel-bot-token-migrate.ts +146 -0
- package/scripts/ops-health-check.ts +15 -3
- package/scripts/pty-scenarios/run.ts +272 -0
- package/scripts/public-leak-baseline.txt +0 -7
- package/scripts/publish-internal-dist.ts +119 -0
- package/scripts/pwa-scenarios.ts +106 -0
- package/scripts/rebrand-elanous.ts +1 -1
- package/scripts/release-loop/cutoff.ts +139 -0
- package/scripts/release-loop/docs-land-node.ts +65 -0
- package/scripts/release-loop/docs-node.ts +172 -0
- package/scripts/release-loop/gate-diff.ts +29 -0
- package/scripts/release-loop/gate-node.ts +353 -0
- package/scripts/release-loop/node-verdict.ts +85 -0
- package/scripts/release-loop/prepare-node.ts +31 -0
- package/scripts/release-loop/publish-node.ts +57 -0
- package/scripts/release-loop/pwa-node-verdict.ts +45 -0
- package/scripts/release-loop/pwa-scenarios-node.ts +140 -0
- package/scripts/release-loop/release-docs.ts +102 -0
- package/scripts/release-loop/tui-node-checks.ts +29 -0
- package/scripts/release-loop/tui-sim-node.ts +113 -0
- package/scripts/release-loop/upgrade-node.ts +25 -0
- package/scripts/release-loop/verify-node.ts +21 -0
- package/scripts/release-loop/version-node.ts +147 -0
- package/scripts/release-upgrade-check.sh +53 -0
- package/scripts/se-mission-prepare.ts +9 -15
- package/scripts/test-deterministic.ts +2 -1
- package/scripts/uninstall.sh +10 -3
- package/scripts/video-broll-line.ts +89 -0
- package/scripts/waitlist-daily-digest.ts +108 -0
- package/scripts/window-landings.sh +1 -1
- package/skills/motion-broll/LICENSE +25 -0
- package/skills/motion-broll/SKILL.md +150 -0
- package/skills/motion-broll/SOURCE.md +6 -0
- package/skills/motion-broll/engine/base.css +19 -0
- package/skills/motion-broll/engine/beats.js +11 -0
- package/skills/motion-broll/engine/build.py +21 -0
- package/skills/motion-broll/engine/fonts/Geist-Variable.woff2 +0 -0
- package/skills/motion-broll/engine/fonts/GeistMono-Medium.woff2 +0 -0
- package/skills/motion-broll/engine/fonts/OFL-Geist.txt +92 -0
- package/skills/motion-broll/engine/motion.js +146 -0
- package/skills/motion-broll/engine/render.js +22 -0
- package/skills/motion-broll/examples/opus-aoe2/01-opus-drop.html +41 -0
- package/skills/motion-broll/examples/opus-aoe2/02-pip-builds.html +110 -0
- package/skills/motion-broll/examples/opus-aoe2/03-effort-slider.html +38 -0
- package/skills/motion-broll/examples/opus-aoe2/04-master-prompt.html +56 -0
- package/skills/motion-broll/examples/opus-aoe2/05-low-vs-max.html +49 -0
- package/skills/motion-broll/examples/opus-aoe2/06-chapter.html +18 -0
- package/skills/motion-broll/examples/opus-aoe2/plan.json +14 -0
- package/skills/motion-broll/reference/engine-api.md +106 -0
- package/skills/motion-broll/scripts/composite.py +14 -0
- package/skills/motion-broll/scripts/inspect_video.py +34 -0
- package/skills/motion-broll/scripts/make_pages.py +34 -0
- package/skills/motion-broll/scripts/setup.sh +16 -0
- package/skills/motion-broll/scripts/words.py +13 -0
- package/skills/motion-broll/templates/compare.html +135 -0
- package/skills/motion-broll/templates/viewer.html +97 -0
- package/skills/omni-digest/SKILL.md +260 -0
- package/skills/omni-digest/digest.md +197 -0
- package/skills/omni-digest/docs/diagrams/noncode-terminal-promotion-path-2026-08-13.mmd +32 -0
- package/skills/omni-digest/package-lock.json +558 -0
- package/skills/omni-digest/package.json +13 -0
- package/skills/omni-digest/scripts/main.ts +404 -0
- package/skills/omni-digest/src/delegate.ts +34 -0
- package/skills/omni-digest/src/detect.ts +46 -0
- package/skills/omni-digest/src/diagram.ts +72 -0
- package/skills/omni-digest/src/domain-staging.ts +50 -0
- package/skills/omni-digest/src/env.ts +38 -0
- package/skills/omni-digest/src/fetch.ts +237 -0
- package/skills/omni-digest/src/media.ts +180 -0
- package/skills/omni-digest/src/obsidian.ts +69 -0
- package/skills/omni-digest/src/ocr.ts +149 -0
- package/skills/omni-digest/src/router.ts +60 -0
- package/skills/omni-digest/src/summarize.ts +87 -0
- package/skills/omni-digest/src/types.ts +124 -0
- package/skills/omni-digest/src/util.ts +34 -0
- package/skills/omni-digest/src/visual.ts +129 -0
- package/skills/omni-digest/src/x-api.ts +151 -0
- package/skills/omni-digest/tsconfig.json +13 -0
- package/src/a2a/agent-card.ts +29 -0
- package/src/a2a/server.ts +173 -0
- package/src/acp/auto-persist.ts +3 -6
- package/src/acp/backend-registry.ts +6 -10
- package/src/acp/channel-browser-shell.ts +1 -535
- package/src/acp/client.ts +106 -36
- package/src/acp/fs-roots.ts +20 -4
- package/src/acp/obsidian-tags.ts +6 -3
- package/src/acp/server.ts +189 -32
- package/src/agent/pty-binding.ts +1 -1
- package/src/agent/spawn-embodied-agent-in-vw.ts +5 -336
- package/src/agent/subagent-callable.ts +39 -1
- package/src/agent-mission/browser-login.ts +241 -0
- package/src/agent-mission/capabilities-cli.ts +33 -0
- package/src/agent-mission/capability-matrix.ts +31 -0
- package/src/agent-mission/capability-readers.ts +79 -0
- package/src/agent-mission/capability-types.ts +15 -0
- package/src/agent-mission/claude-headless.ts +131 -0
- package/src/agent-mission/claude-subscription.ts +57 -0
- package/src/agent-mission/doc-guided-install.ts +185 -0
- package/src/agent-mission/driver.ts +821 -69
- package/src/agent-mission/env-profile.ts +68 -0
- package/src/agent-mission/handoff.ts +128 -0
- package/src/agent-mission/in-agent-plugin.ts +311 -0
- package/src/agent-mission/mission-cli.ts +19 -1
- package/src/agent-mission/parse.ts +9 -4
- package/src/agent-mission/pr-review-watch.ts +62 -13
- package/src/agent-mission/resource-ladder.ts +187 -0
- package/src/agent-mission/tool-install.ts +249 -0
- package/src/agent-mission/tool-ladder.ts +37 -0
- package/src/agent-room/room-builder.ts +6 -600
- package/src/agent-substrate/review-intent.ts +43 -1
- package/src/auth/scope.ts +8 -4
- package/src/auth/temp-tokens.ts +131 -0
- package/src/auto-research/obsidian-bridge.ts +2 -0
- package/src/autopilot/build/integrity-gate.ts +27 -4
- package/src/autopilot/build/isolated-instance.ts +2 -1
- package/src/autopilot/build/llm-conflict-merge.ts +27 -0
- package/src/autopilot/llm-control-brain.ts +54 -12
- package/src/autopilot/mission-engine.ts +15 -1
- package/src/autopilot/mission-notify.ts +4 -2
- package/src/autopilot/mission-origin.ts +5 -5
- package/src/autopilot/mission-phase-track.ts +52 -0
- package/src/autopilot/mission-tool.ts +1 -1
- package/src/autopilot/pty-control-loop.ts +94 -2
- package/src/autopilot/track-agent.ts +138 -0
- package/src/autopilot/track-courier.ts +153 -0
- package/src/boot/acp-server.ts +16 -2
- package/src/boot/check-same-origin.ts +19 -5
- package/src/boot/daemon-multi-llm-runtime.ts +14 -8
- package/src/boot/daemon-prompt-turn.ts +2 -0
- package/src/boot/daemon-runtime.ts +36 -14
- package/src/boot/daemon-tools/index.ts +16 -0
- package/src/boot/daemon-tools/self-implement.ts +4 -0
- package/src/boot/daemon-tools/types.ts +3 -0
- package/src/browser-cdp/chrome-flags.ts +7 -0
- package/src/browser-cdp/client.ts +2 -0
- package/src/browser-pane/mount.ts +1 -246
- package/src/budget/codex-reset-credit-state.ts +15 -0
- package/src/budget/fetchers/codex.ts +2 -1
- package/src/budget/run-usage-rollup.ts +11 -4
- package/src/budget/unified-usage.ts +2 -1
- package/src/capture/tui-self-report.ts +10 -0
- package/src/channel-bot-token.ts +126 -0
- package/src/chat/index.ts +21 -45
- package/src/chat/input-text-key.ts +2 -2
- package/src/chat/mode/manual.ts +2 -4
- package/src/chat/pickers/state.ts +10 -27
- package/src/chat/search/modal.ts +14 -2
- package/src/chat/tool-render/types.ts +1 -1
- package/src/chat/turn-typeahead.ts +2 -1
- package/src/chat/wrap.ts +6 -8
- package/src/cli/__fixtures__/agent-help-before/agent.txt +18 -0
- package/src/cli/__fixtures__/agent-help-before/registry.txt +13 -0
- package/src/cli/__fixtures__/agent-help-before/root.txt +100 -0
- package/src/cli/__fixtures__/agent-help-before/tier.txt +15 -0
- package/src/cli/a2a-cli.ts +52 -0
- package/src/cli/agent-cli.ts +721 -0
- package/src/cli/autopilot-cli.ts +739 -0
- package/src/cli/bg-launch.ts +20 -4
- package/src/cli/claude-plugin-setup.ts +199 -0
- package/src/cli/config-test-sync.ts +94 -10
- package/src/cli/connector-cli.ts +204 -0
- package/src/cli/control-cli.ts +220 -0
- package/src/cli/control-join-cli.ts +142 -0
- package/src/cli/docs-cli.ts +38 -0
- package/src/cli/doctor-cli.ts +225 -26
- package/src/cli/doctor-distro.ts +17 -1
- package/src/cli/doctor-fix.ts +145 -17
- package/src/cli/doctor-llm-assist.ts +71 -0
- package/src/cli/doctor-private-files.ts +66 -0
- package/src/cli/doctor-readiness.ts +8 -5
- package/src/cli/fleet-cli.ts +63 -0
- package/src/cli/g6a-registration-probe.ts +16 -0
- package/src/cli/git-install-plan.ts +51 -0
- package/src/cli/hooks-cli.ts +44 -0
- package/src/cli/ingest-token-cli.ts +21 -0
- package/src/cli/intake-cli.ts +416 -0
- package/src/cli/labels-cli.ts +74 -0
- package/src/cli/leader-cli.ts +10 -159
- package/src/cli/live-cli.ts +48 -0
- package/src/cli/llm-detect-cli.ts +130 -0
- package/src/cli/logs-cli.ts +231 -7
- package/src/cli/machine-cli.ts +38 -0
- package/src/cli/mcp-call.ts +43 -13
- package/src/cli/mcp-gateway-cli.ts +90 -0
- package/src/cli/mcp-login.ts +116 -8
- package/src/cli/mcp-reload.ts +20 -3
- package/src/cli/nexus-dist.ts +18 -13
- package/src/cli/nexus-ios-bind.ts +20 -7
- package/src/cli/ops-cli.ts +225 -0
- package/src/cli/plugin-cli.ts +103 -0
- package/src/cli/pod-cli.ts +83 -0
- package/src/cli/port-lease-local.ts +124 -0
- package/src/cli/pr-cli.ts +12 -1
- package/src/cli/provider-cli.ts +720 -0
- package/src/cli/pty-record-cli.ts +63 -0
- package/src/cli/pty-takeover-cli.ts +57 -40
- package/src/cli/pty-web-address.ts +52 -0
- package/src/cli/publish-cli.ts +44 -0
- package/src/cli/pwa-build.ts +18 -12
- package/src/cli/pwa-dev.ts +13 -8
- package/src/cli/pwa-registry.ts +6 -0
- package/src/cli/pwa-share.ts +65 -22
- package/src/cli/pwa-show.ts +20 -4
- package/src/cli/pwa-start.ts +99 -27
- package/src/cli/pwa-test.ts +201 -96
- package/src/cli/release-cli.ts +90 -7
- package/src/cli/remotes-cli.ts +20 -1
- package/src/cli/remotes.ts +2 -1
- package/src/cli/repo-cli.ts +315 -36
- package/src/cli/research-cli.ts +66 -0
- package/src/cli/role-cli.ts +320 -0
- package/src/cli/schedule-cli.ts +246 -0
- package/src/cli/self-update.ts +98 -10
- package/src/cli/setup-cli.ts +64 -2
- package/src/cli/shadow-cli.ts +188 -0
- package/src/cli/share-auto-mount.ts +12 -8
- package/src/cli/start-cli.ts +221 -0
- package/src/cli/stdout-flush.ts +8 -0
- package/src/cli/storage-cli.ts +334 -0
- package/src/cli/tailscale-serve.ts +34 -19
- package/src/cli/tasks-cli.ts +176 -0
- package/src/cli/test-state-dir-flag.ts +1 -1
- package/src/cli/usage-cli.ts +15 -4
- package/src/cli/where-cli.ts +22 -55
- package/src/code-edit/diff-render.ts +6 -32
- package/src/code-edit/source-delta-browser.ts +0 -1
- package/src/codex/models.ts +1 -1
- package/src/config.ts +8 -13
- package/src/connectors/event-ledger.ts +41 -0
- package/src/connectors/linear-projector.ts +88 -0
- package/src/connectors/linear.ts +143 -0
- package/src/connectors/types.ts +19 -0
- package/src/control-plane/lease-holder.ts +41 -0
- package/src/control-plane/ledger.ts +146 -0
- package/src/control-plane/light-member.ts +164 -0
- package/src/control-plane/member-tokens.ts +88 -0
- package/src/control-plane/member.ts +159 -0
- package/src/control-plane/port-lease-heartbeat.ts +101 -0
- package/src/control-plane/ports.ts +40 -0
- package/src/control-plane/primary.ts +169 -0
- package/src/control-plane/server.ts +216 -0
- package/src/dashboard/acp-boot.ts +11 -38
- package/src/dashboard/assistant-render-state-runtime.ts +2 -2
- package/src/dashboard/assistant-sample-runtime.ts +2 -2
- package/src/dashboard/auto-compact-runtime.ts +11 -16
- package/src/dashboard/browser-help-runtime.ts +2 -3
- package/src/dashboard/chat/acp-chat.ts +2 -5
- package/src/dashboard/code-edit-post-turn-runtime.ts +1 -2
- package/src/dashboard/compact-surface-assembly.ts +0 -14
- package/src/dashboard/compact-surface-dispatch.ts +1 -38
- package/src/dashboard/compact-surface-inventory.ts +0 -8
- package/src/dashboard/compact-surface-runtime.ts +0 -14
- package/src/dashboard/context-menu-provider-boot.ts +0 -9
- package/src/dashboard/context-window-runtime-boot.ts +0 -37
- package/src/dashboard/index.ts +278 -2558
- package/src/dashboard/input/chat-main-plain-turn-runtime.ts +0 -6
- package/src/dashboard/input/chat-main-slash-command.ts +2 -2
- package/src/dashboard/input/dashboard-priority-key-route.ts +1 -43
- package/src/dashboard/input/mouse-modal-surface-runtime.ts +1 -5
- package/src/dashboard/input/mouse-wiring.ts +2 -3
- package/src/dashboard/layout-display-runtime-registration.ts +0 -10
- package/src/dashboard/modals/pane-multi.ts +1 -1
- package/src/dashboard/replay-preview.ts +1 -1
- package/src/dashboard/runtime/approvers.ts +0 -1
- package/src/dashboard/runtime/state-snapshot.ts +0 -90
- package/src/dashboard/scenario-runtime-boot.ts +16 -16
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +134 -1456
- package/src/dashboard/slash-runtime/design-pick.ts +96 -0
- package/src/dashboard/slash-runtime/help-from-registry.ts +77 -0
- package/src/dashboard/surface-registry-wiring.ts +2 -15
- package/src/dashboard/turn-message-runtime.ts +0 -4
- package/src/dashboard/turn-preamble.ts +1 -1
- package/src/dashboard/turn-stream-formatter.ts +2 -2
- package/src/dashboard/turn-stream-runtime.ts +2 -2
- package/src/dashboard-pane-context-menu.ts +0 -14
- package/src/debug/log.ts +7 -0
- package/src/decide/boundary-shadow.ts +131 -0
- package/src/design/apply-direction.ts +209 -0
- package/src/design/css-root-tokens.ts +89 -0
- package/src/design/custom-system-create.ts +230 -0
- package/src/design/design-directions.ts +61 -41
- package/src/design/design-gate.ts +241 -0
- package/src/design/design-library.ts +57 -0
- package/src/design/design-previews.ts +138 -0
- package/src/design/design-systems.ts +61 -0
- package/src/design/lint-artifact-run.ts +46 -6
- package/src/design/lint-artifact.ts +5 -1
- package/src/design/open-design-client.ts +247 -0
- package/src/design/system-from-extract.ts +767 -0
- package/src/design/system-schema.ts +123 -0
- package/src/discord-slash-wire.ts +2 -1
- package/src/discord-test-runner.ts +2 -1
- package/src/discord-voice-wire.ts +2 -1
- package/src/discord.ts +1 -1
- package/src/dispatch/opportunistic-launcher.ts +24 -1
- package/src/domains/ops-status.ts +35 -2
- package/src/domains/outbound-alert.ts +16 -4
- package/src/domains/repeated-failure.ts +89 -0
- package/src/domains/schedule-manage-tool.ts +28 -8
- package/src/domains/schedule-migrate.ts +22 -4
- package/src/domains/schedule-registry.ts +88 -33
- package/src/domains/schedule-runs.ts +132 -0
- package/src/domains/schedule-state.ts +152 -0
- package/src/element-registry/address.ts +1 -3
- package/src/git-fs/gh-cli.ts +47 -17
- package/src/git-fs/retry.ts +1 -0
- package/src/git-fs/runner.ts +1 -0
- package/src/git-fs/worktree.ts +6 -5
- package/src/github/pr-labels.ts +68 -0
- package/src/graph-kinds/plugin-nodes.ts +60 -0
- package/src/graph-kinds/registry.ts +118 -0
- package/src/graph-runner/graph-cli.ts +103 -0
- package/src/graph-runner/graph-notify.ts +220 -0
- package/src/graph-runner/graph-tick.ts +119 -0
- package/src/graph-runner/release-manifest.ts +93 -0
- package/src/graph-runner/runner.ts +457 -0
- package/src/grok/credential.ts +158 -5
- package/src/grounding/ensure-grounding.ts +131 -0
- package/src/grounding/mirror-export.ts +89 -0
- package/src/grounding/mirror-manifest.ts +252 -0
- package/src/grounding/sources-cli.ts +209 -0
- package/src/grounding/sources.ts +333 -0
- package/src/grounding/token.ts +115 -0
- package/src/harness/harness-cli-command.ts +352 -19
- package/src/harness/harness-pod-dispatch.ts +110 -0
- package/src/harness/harness-stop.ts +131 -0
- package/src/harness/harness-substrate-default.ts +40 -0
- package/src/harness/harness-worktrees.ts +1 -1
- package/src/harness/harness-write-boundary.ts +2 -0
- package/src/harness/llm-decompose.ts +2 -1
- package/src/harness/self-send-decide.ts +224 -0
- package/src/harness/shell-relay.ts +5 -0
- package/src/hooks/providers.ts +77 -0
- package/src/hooks/queue.ts +73 -0
- package/src/hooks/receiver.ts +133 -0
- package/src/index.ts +666 -3406
- package/src/input-core/dispatcher.ts +1 -1
- package/src/input-core/drag-esc-interceptor.ts +1 -1
- package/src/instance/current.ts +5 -5
- package/src/instance/leader.ts +10 -326
- package/src/instance/nexus-run-refusal.ts +27 -92
- package/src/instance/project-local-exclude.ts +27 -0
- package/src/instance/resolve.ts +40 -175
- package/src/intake-plane/capture.ts +14 -1
- package/src/intake-plane/check.ts +34 -14
- package/src/intake-plane/collect-github.ts +258 -0
- package/src/intake-plane/collect-pod.ts +100 -0
- package/src/intake-plane/collect-telegram-saved.ts +86 -0
- package/src/intake-plane/digest.ts +102 -0
- package/src/intake-plane/enrich-plugins.ts +1 -1
- package/src/intake-plane/front-classifier.ts +56 -0
- package/src/intake-plane/front-route-classifier.ts +80 -0
- package/src/intake-plane/front-route-rules.ts +152 -0
- package/src/intake-plane/grounding-docs.ts +185 -0
- package/src/intake-plane/harness-target.ts +20 -0
- package/src/intake-plane/intake-to-tasks.ts +303 -0
- package/src/intake-plane/items.ts +247 -0
- package/src/intake-plane/link-ledger.ts +27 -0
- package/src/intake-plane/route.ts +104 -0
- package/src/intake-plane/runtime-callables.ts +3 -1
- package/src/intake-plane/sketch-ledger.ts +34 -0
- package/src/intake-plane/slash.ts +30 -2
- package/src/intake-plane/submit-intake-work.ts +160 -0
- package/src/intake-plane/telegram-work.ts +56 -0
- package/src/iul/sidebar-shell.ts +0 -165
- package/src/launch-head/capability-check.ts +162 -0
- package/src/launch-head/launch-head-cli.ts +242 -0
- package/src/launch-head/load-balance.ts +81 -0
- package/src/live/detail-switch.ts +175 -0
- package/src/llm/provider-detect.ts +247 -0
- package/src/llm/provider-probe.ts +57 -0
- package/src/llm.ts +55 -23
- package/src/log-entry.ts +1 -1
- package/src/log-pane/attachment-popup.ts +1 -2
- package/src/loops/loop-cli.ts +37 -0
- package/src/loops/registry.ts +174 -0
- package/src/market/official-keys.ts +5 -0
- package/src/market/publish.ts +273 -0
- package/src/market/signed-index.ts +156 -0
- package/src/market/tgz.ts +121 -0
- package/src/mcp/client.ts +1 -1
- package/src/mcp/mcp-oauth.ts +40 -5
- package/src/mcp/server.ts +75 -7
- package/src/mcp-gateway/gateway.ts +128 -0
- package/src/mcp-gateway/pat-store.ts +124 -0
- package/src/mss/logging/log-store.ts +91 -2
- package/src/mss/logging/scoped-level.ts +5 -9
- package/src/native-tool-catalog.ts +64 -343
- package/src/nexus/api/connect-info.ts +23 -25
- package/src/nexus/api/context-url.ts +1 -1
- package/src/nexus/api/design-check.ts +90 -59
- package/src/nexus/api/design-previews-route.ts +182 -0
- package/src/nexus/api/design-system-create-route.ts +123 -0
- package/src/nexus/api/graph-kinds.ts +69 -0
- package/src/nexus/api/graphs-api.ts +221 -0
- package/src/nexus/api/harness-api.ts +31 -2
- package/src/nexus/api/health.ts +15 -0
- package/src/nexus/api/http-server.ts +274 -43
- package/src/nexus/api/image-generate.ts +3 -0
- package/src/nexus/api/ingest-token.ts +175 -0
- package/src/nexus/api/intake-ledger-api.ts +54 -0
- package/src/nexus/api/intake-route.ts +111 -0
- package/src/nexus/api/json-response.ts +33 -0
- package/src/nexus/api/live-detail.ts +47 -0
- package/src/nexus/api/live-shipped.ts +78 -0
- package/src/nexus/api/log-fabric.ts +33 -2
- package/src/nexus/api/markdown-publish.ts +3 -2
- package/src/nexus/api/mcp-http.ts +14 -9
- package/src/nexus/api/mcp-oauth-hint.ts +30 -0
- package/src/nexus/api/mcp-public-allowlist.ts +33 -0
- package/src/nexus/api/merge-approvals-gate.ts +79 -0
- package/src/nexus/api/merge-approvals.ts +306 -0
- package/src/nexus/api/meta-api.ts +4 -0
- package/src/nexus/api/next-fluent-wiring.ts +7 -9
- package/src/nexus/api/plugins-market.ts +125 -0
- package/src/nexus/api/pod-credential-api.ts +133 -0
- package/src/nexus/api/public-routes.ts +80 -0
- package/src/nexus/api/rest-route-paths.ts +15 -0
- package/src/nexus/api/schedules-action.ts +12 -3
- package/src/nexus/api/schedules-read.ts +228 -0
- package/src/nexus/api/sessions-store.ts +8 -2
- package/src/nexus/api/setup-answer-priority.ts +130 -0
- package/src/nexus/api/setup-channel-bot.ts +56 -0
- package/src/nexus/api/setup-child-llm.ts +228 -0
- package/src/nexus/api/setup-obsidian-skills.ts +93 -0
- package/src/nexus/api/task-cards-api.ts +34 -0
- package/src/nexus/api/tasks-create.ts +136 -0
- package/src/nexus/api/telegram-trigger-bot.ts +3 -3
- package/src/nexus/api/terminals.ts +204 -18
- package/src/nexus/api/trace.ts +354 -0
- package/src/nexus/api/vault-api.ts +140 -7
- package/src/nexus/api/worktrees.ts +18 -2
- package/src/nexus/boot/register-mcp-clients.ts +38 -4
- package/src/nexus/daemon-endpoint.ts +85 -0
- package/src/nexus/default-port.ts +1 -0
- package/src/nexus/index.ts +329 -111
- package/src/nexus/onboarding/pwa-share-prompt.ts +31 -8
- package/src/nexus/onboarding/tailscale-probe.ts +9 -1
- package/src/nexus/setup-status.ts +58 -0
- package/src/nexus/supervisor/lock.ts +8 -0
- package/src/nexus/webterm/pty.ts +15 -0
- package/src/oauth/codex-account-rotation.ts +122 -16
- package/src/oauth/codex-account-store.ts +88 -19
- package/src/oauth/codex-quota-policy.ts +55 -0
- package/src/oauth/store.ts +28 -25
- package/src/obsidian/default-vault.ts +17 -0
- package/src/obsidian/vault-write-guard.ts +46 -0
- package/src/onboarding/help/llm.md +2 -2
- package/src/onboarding.ts +2 -2
- package/src/panes/alt-skip-predicate.ts +4 -3
- package/src/panes/external-terminal-pane.ts +3 -4
- package/src/panes/factory.ts +1 -18
- package/src/panes/index.ts +1 -5
- package/src/panes/pane-cycle.ts +1 -1
- package/src/panes/types.ts +1 -1
- package/src/platform/env-literal.ts +4 -0
- package/src/plugin-hooks/dispatcher.ts +10 -4
- package/src/plugins/core/host.ts +94 -4
- package/src/plugins/core/manifest.ts +104 -7
- package/src/plugins/install/market-fetch.ts +249 -0
- package/src/plugins/install/plugin-install.ts +387 -0
- package/src/policy/claude-subscription-guard.ts +25 -0
- package/src/preview/terminal.ts +24 -1
- package/src/preview-pane/mount.ts +1 -142
- package/src/prompt/references.ts +4 -51
- package/src/pty-shell/pty-control-ipc.ts +57 -3
- package/src/pty-shell/pty-mouse.ts +75 -0
- package/src/pty-shell/pty-recording.ts +108 -0
- package/src/pty-shell/registry.ts +53 -3
- package/src/python/resolve-python.ts +1 -1
- package/src/release-loop/manifest.ts +65 -0
- package/src/release-loop/release-note.ts +174 -0
- package/src/roles/lease-cas.ts +52 -0
- package/src/roles/machine-name.ts +48 -0
- package/src/roles/machine-profile.ts +65 -0
- package/src/roles/role-lease-read.ts +81 -0
- package/src/roles/role-lease.ts +63 -0
- package/src/roles/role-watch.ts +69 -0
- package/src/self-dev/ask-launch-flow.ts +39 -22
- package/src/self-dev/ask-launch-io.ts +1 -1
- package/src/self-dev/dev-cli.ts +250 -139
- package/src/self-dev/dev-pipeline.ts +80 -8
- package/src/self-dev/draft-sweep.ts +231 -0
- package/src/self-dev/draft-triage-rules.ts +42 -0
- package/src/self-dev/entrance-baseline.ts +156 -4
- package/src/self-dev/fabric-decompose-adapter.ts +10 -0
- package/src/self-dev/launch-preflight.ts +1 -1
- package/src/self-dev/orchestrate.ts +297 -20
- package/src/self-dev/repair-signals.ts +6 -0
- package/src/self-dev/run-store.ts +20 -5
- package/src/self-dev/run-supervisor.ts +43 -3
- package/src/self-implement/abandoned-classification.ts +15 -1
- package/src/self-implement/blocked-draft-policy.ts +6 -0
- package/src/self-implement/budget-gate.ts +236 -0
- package/src/self-implement/child-llm-preference.ts +84 -0
- package/src/self-implement/decision-events.ts +57 -0
- package/src/self-implement/decision-signal-press.ts +5 -2
- package/src/self-implement/dependency-change-gate.ts +90 -0
- package/src/self-implement/gate-baseline.ts +32 -1
- package/src/self-implement/gate-cli.ts +29 -7
- package/src/self-implement/gate-scope.ts +7 -1
- package/src/self-implement/goal-author-decompose.ts +22 -4
- package/src/self-implement/goal-author.ts +23 -2
- package/src/self-implement/goal-boundary.ts +65 -0
- package/src/self-implement/goal-clarification-escalation.ts +1 -0
- package/src/self-implement/goal-documents-dir.ts +6 -1
- package/src/self-implement/goal-execution-records.ts +58 -0
- package/src/self-implement/goal-run-store.ts +42 -24
- package/src/self-implement/graph-authority.ts +13 -28
- package/src/self-implement/graph-catalog.ts +48 -0
- package/src/self-implement/graph-run-contract.ts +127 -0
- package/src/self-implement/graph-templates.ts +14 -7
- package/src/self-implement/graph-yaml.ts +35 -6
- package/src/self-implement/harness-policy-gates.ts +42 -0
- package/src/self-implement/headless-elanous-driver.ts +30 -6
- package/src/self-implement/heal-triage.ts +229 -0
- package/src/self-implement/host-regate.ts +240 -0
- package/src/self-implement/non-git-consent.ts +23 -0
- package/src/self-implement/orchestrator.ts +481 -132
- package/src/self-implement/pipeline-shape.ts +1 -1
- package/src/self-implement/pr-evidence-artifact.ts +6 -19
- package/src/self-implement/prior-draft-findings.ts +128 -0
- package/src/self-implement/pwa-import-graph.ts +65 -0
- package/src/self-implement/repo-provision.ts +18 -21
- package/src/self-implement/report-origin.ts +39 -0
- package/src/self-implement/rework-policy.ts +21 -0
- package/src/self-implement/run-ledger-compact.ts +438 -0
- package/src/self-implement/run-ledger.ts +212 -29
- package/src/self-implement/run-report.ts +24 -0
- package/src/self-implement/run-status-mapping.ts +2 -0
- package/src/self-implement/running-runs.ts +112 -14
- package/src/self-implement/scoped-typecheck-config.ts +49 -0
- package/src/self-implement/seams.ts +203 -38
- package/src/self-implement/self-implement-cli.ts +17 -2
- package/src/self-implement/shadow-repo.ts +350 -0
- package/src/self-implement/supervision-vocabulary.ts +7 -0
- package/src/shell-runner/dispatch.ts +3 -0
- package/src/shell-runner/index.ts +0 -7
- package/src/skills/runner.ts +0 -69
- package/src/skills/tools/agent-room-slash.ts +2 -1
- package/src/skills/tools/agent-room.ts +8 -140
- package/src/skills/tools/agent.ts +5 -3
- package/src/skills/tools/context.ts +5 -140
- package/src/skills/tools/control.ts +4 -188
- package/src/skills/tools/dashboard-slash.ts +3 -11
- package/src/skills/tools/dashboard-state.ts +3 -5
- package/src/skills/tools/dev-harness.ts +3 -2
- package/src/skills/tools/omni-search.ts +29 -1
- package/src/skills/tools/shell.ts +11 -29
- package/src/skills/tools/spawn-coding-agent-headless.ts +6 -9
- package/src/ssh/ssh-picker-modal.ts +1 -1
- package/src/steward/directive.ts +99 -0
- package/src/steward/triage.ts +203 -0
- package/src/storage/cli-bin.ts +67 -0
- package/src/storage/object-store-visibility.ts +169 -0
- package/src/storage/object-store.ts +452 -0
- package/src/storage/s3.ts +53 -10
- package/src/storage/storage-detect.ts +337 -0
- package/src/surface/address.ts +3 -5
- package/src/surface/index.ts +0 -6
- package/src/surface/llm-tools.ts +1 -2
- package/src/surface/shell-runner-boot.ts +4 -89
- package/src/task-cards/card-cli.ts +64 -0
- package/src/task-cards/card-store.ts +241 -0
- package/src/task-orchestrator/boot.ts +27 -1
- package/src/task-orchestrator/dispatcher.ts +49 -7
- package/src/task-orchestrator/external-fingerprint.ts +10 -0
- package/src/task-orchestrator/external-policy.ts +86 -0
- package/src/task-orchestrator/feedback-loop.ts +4 -2
- package/src/task-orchestrator/graph.ts +18 -1
- package/src/task-orchestrator/runtimes/create.ts +128 -0
- package/src/task-orchestrator/store.ts +78 -18
- package/src/task-orchestrator/surface-registry.ts +5 -2
- package/src/task-orchestrator/surfaces/external-exec.ts +180 -0
- package/src/task-orchestrator/surfaces/idea-approval-pr.ts +118 -0
- package/src/task-orchestrator/surfaces/index.ts +4 -3
- package/src/task-orchestrator/surfaces/pod-account-broker.ts +60 -5
- package/src/task-orchestrator/surfaces/pod-artifact-return.ts +136 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +348 -0
- package/src/task-orchestrator/surfaces/pod-ledger-collect.ts +177 -0
- package/src/task-orchestrator/surfaces/pod-pool.ts +128 -12
- package/src/task-orchestrator/surfaces/pod-skills.ts +11 -3
- package/src/task-orchestrator/surfaces/pod-source-bundle.ts +132 -0
- package/src/task-orchestrator/surfaces/pod-source-receive.ts +91 -0
- package/src/task-orchestrator/surfaces/pod-source-spec.ts +77 -0
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +782 -41
- package/src/task-orchestrator/surfaces/self-implement.ts +8 -1
- package/src/task-orchestrator/tox-loop.ts +204 -0
- package/src/task-orchestrator/types.ts +21 -1
- package/src/telegram-commands.ts +8 -0
- package/src/telegram-report.ts +2 -1
- package/src/telegram-run.ts +18 -5
- package/src/telegram.ts +92 -22
- package/src/tool-runtime/acp-session-runtime.ts +28 -7
- package/src/tool-runtime/agent-runtime.ts +1 -0
- package/src/tool-runtime/context-runtime.ts +18 -35
- package/src/tool-runtime/control-runtime.ts +8 -21
- package/src/tool-runtime/dashboard-state-runtime.ts +1 -5
- package/src/tool-runtime/elanous-asana-runtimes.ts +205 -0
- package/src/tool-runtime/elanous-control-runtimes.ts +16 -2
- package/src/tool-runtime/elanous-task-submit-runtime.ts +124 -0
- package/src/tool-runtime/index.ts +4 -1
- package/src/tool-runtime/scenario-runtimes.ts +22 -21
- package/src/tool-runtime/scenario-target-mount.ts +6 -32
- package/src/tool-runtime/types.ts +8 -0
- package/src/tui/chat/attachment-summary.ts +4 -4
- package/src/tui-client/headless-core-guard.ts +0 -1
- package/src/tui.ts +8 -5
- package/src/typecheck-ratchet.ts +15 -0
- package/src/ui/hover-presenter.ts +3 -7
- package/src/user-config.ts +427 -190
- package/src/version/code-revision.ts +33 -8
- package/src/version/packed-revision.json +1 -1
- package/src/video-pipeline/broll-agent.ts +102 -0
- package/src/video-pipeline/recipes/broll.ts +263 -0
- package/src/video-pipeline/walk-line.ts +2 -1
- package/src/views/scratch-image-size.ts +10 -0
- package/src/voice/channel-adapters/pwa-voice-adapter.ts +2 -18
- package/src/voice/channel-adapters/telegram-voice-adapter.ts +1 -6
- package/src/voice/voice-tts-singleton.ts +46 -8
- package/src/web-push/vapid-keys.ts +1 -1
- package/src/web-search/index.ts +5 -5
- package/src/web-terminal/preview-tap-registry.ts +152 -43
- package/src/workflow-runtime/executor.ts +18 -22
- package/src/workflow-runtime/node-catalog.ts +20 -1
- package/src/workflow-runtime/nodes/bash.ts +1 -0
- package/src/workflow-runtime/nodes/task.ts +74 -0
- package/src/workflow-runtime/nodes/triggers.ts +24 -1
- package/src/workflow-runtime/plugin-kind-node.ts +138 -0
- package/src/workflow-runtime/schema.ts +98 -2
- package/src/workflow-runtime/triggers/webhook-router.ts +43 -3
- package/src/workflow-runtime/triggers/webhook-source.ts +19 -1
- package/src/workflow-runtime/types.ts +74 -4
- package/apps/pwa/out/_next/static/Ksn99fVf2HUWhSyV1-FC8/_buildManifest.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1176-4943bd83b00e53a2.js +0 -25
- package/apps/pwa/out/_next/static/chunks/1380-9c652e1002032c86.js +0 -1
- package/apps/pwa/out/_next/static/chunks/1863-2ea170dfec26b88b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2091-2d6b7f4f16300f83.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2347-366617ec73babe3b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2598.814f64e3268634e7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3089-e60cc8f5d35ee239.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3158-c77ed9ea34f9cc9f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3607-f0b5c5ee18fcf56a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3659-05b2d5d971b42dbc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3736-b6a7bfdcb8f56ec6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3839-eebf298e89a7bb77.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4012.832a2824b978e7ee.js +0 -5
- package/apps/pwa/out/_next/static/chunks/4706-d85d7f3345f3ff91.js +0 -1
- package/apps/pwa/out/_next/static/chunks/526-17a6a2e0e6dc4498.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5508-676ac75f2757ad40.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5583-8a0317f4b8e68db9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/5927.8378481a12cc8044.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6258-b58f722b10e8d31d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6820-32fd097e6186fdc9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6852-983db7ca958634b7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7235-e583e4a015e159b9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7482-7b417330b24a996a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7701-99b7d4dedb955bf8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/77f1928d-bd3777589042d3ea.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8366-36956cafc5e33614.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8370-23d0de995be666f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8617-307421f3b0e8b2a2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8837-e45de46a9fedf1f5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9058-0e8055a5ea3ebdd6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/_not-found/page-84b84eca12acada4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-1f23568c29e88f7a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-bf6fc9aafd6135a7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-3f8539ae4b719d2e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/page-d2900febb74ecf32.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-e82dec647dd79c36.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/dashboard/page-096ec743a8ee955a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/design-check/page-255c2ceded4b3493.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/healthz/route-84b84eca12acada4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-2db61b2f9efba61f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-e11ee17f221aaa9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e075974e029ce4c4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-ec5b68a9af3366a0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-986c177afb4adae6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-a72781461af2f2a3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-92781cbaafc487ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-2c14d2a1f2930f33.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-22ee4bf8070b2b4d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9c06e4a8297942a8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/page-d0cd32f6d373798f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-0c1642018d87ebb8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-93e5e97d614df487.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/layout-84b84eca12acada4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-b1ce871940d7393e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-ae154addf345febe.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/page-90af3aa813d2053c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-f3f962fda428a738.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-1c1f7cc1d5def06d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-09d4cbdaaacf06c1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-e877b8e8ca90b27f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-71d902f463dea526.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-40ea576cefa25fe6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a56a3f178c3831f6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/bcc499d1-804a270d878e0842.js +0 -1
- package/apps/pwa/out/_next/static/chunks/framework-b25b7c5501c59b6d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-a9ec9da43387afff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-aa2c05954aaa6754.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_app-bb3768fb4b84aebb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/pages/_error-2820ba75b87b2f5e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/webpack-58c73b145f189b1c.js +0 -1
- package/apps/pwa/out/_next/static/css/effec8adf767aa75.css +0 -1
- package/apps/pwa/out/dashboard/index.html +0 -1
- package/apps/pwa/out/dashboard/index.txt +0 -26
- package/src/acp/resident-shell.ts +0 -244
- package/src/agent/spawn-local-llm-in-vw.ts +0 -240
- package/src/dashboard/agent-spawn-tools-boot.ts +0 -14
- package/src/dashboard/dock-picker-inventory.ts +0 -41
- package/src/dashboard/goal-plan-hud-bridge.ts +0 -112
- package/src/dashboard/hud-mirror.ts +0 -207
- package/src/dashboard/input/mouse-dock-runtime.ts +0 -156
- package/src/dashboard/input/mouse-hover-runtime.ts +0 -46
- package/src/dashboard/input/mouse-pill-context-runtime.ts +0 -74
- package/src/dashboard/input/mouse-workspace-restore-runtime.ts +0 -64
- package/src/dashboard/input/scratch-actions.ts +0 -36
- package/src/dashboard/input/virtual-window-key-router.ts +0 -24
- package/src/dashboard/rich-scratch-viewers.ts +0 -77
- package/src/dashboard/scratch-slash-runtime.ts +0 -36
- package/src/dashboard/scratch-state-runtime.ts +0 -42
- package/src/dashboard/scratch-widget-runtime.ts +0 -37
- package/src/dashboard/sim-shell.ts +0 -313
- package/src/dashboard/virtual-window-control-runtime.ts +0 -57
- package/src/dashboard/virtual-window-help-runtime.ts +0 -113
- package/src/dashboard/virtual-window-input-runtime.ts +0 -99
- package/src/dashboard/virtual-window-mutation-runtime.ts +0 -102
- package/src/dashboard/virtual-window-split-runtime.ts +0 -70
- package/src/dashboard/vw-popup-openers.ts +0 -126
- package/src/dashboard/window-picker-popup.ts +0 -74
- package/src/dashboard/window-slash-runtime.ts +0 -108
- package/src/dashboard/windowing/companion-slash.ts +0 -78
- package/src/dashboard/windowing/fast-switch.ts +0 -138
- package/src/dashboard/windowing/lifecycle.ts +0 -185
- package/src/dashboard/windowing/virtual-windows.ts +0 -259
- package/src/dashboard/windowing/visibility-chord.ts +0 -77
- package/src/iul/resident-vw.ts +0 -55
- package/src/panes/content-adapter.ts +0 -162
- package/src/prompt/vw-reference.ts +0 -153
- package/src/shell-runner/external-terminal-pane.ts +0 -157
- package/src/sim/resident-vw.ts +0 -48
- package/src/skills/tools/spawn-coding-agent-vw.ts +0 -181
- package/src/skills/tools/virtual-windows.ts +0 -632
- package/src/surface/adapters/window-surface-adapter.ts +0 -141
- package/src/tool-runtime/layout-runtimes.ts +0 -81
- package/src/tool-runtime/scenario-window-mount.ts +0 -207
- package/src/views/ui-mode.ts +0 -100
- package/src/virtual-window-context-menu.ts +0 -97
- package/src/virtual-windows/addressing.ts +0 -195
- package/src/virtual-windows/benchmark-preset.ts +0 -119
- package/src/virtual-windows/event-bus.ts +0 -202
- package/src/virtual-windows/layout/apply-planner.ts +0 -189
- package/src/virtual-windows/layout/index.ts +0 -68
- package/src/virtual-windows/layout/layout-commands.ts +0 -186
- package/src/virtual-windows/layout/layout-tools.ts +0 -262
- package/src/virtual-windows/layout/persistence.ts +0 -219
- package/src/virtual-windows/layout/presets.ts +0 -114
- package/src/virtual-windows/layout/restore-planner.ts +0 -223
- package/src/virtual-windows/layout/serializer.ts +0 -197
- package/src/virtual-windows/layout/tree.ts +0 -147
- package/src/virtual-windows/layout/types.ts +0 -63
- package/src/virtual-windows/layout-tree.ts +0 -389
- package/src/virtual-windows/navigation.ts +0 -251
- package/src/virtual-windows/pane-capture.ts +0 -142
- package/src/virtual-windows/pane-content.ts +0 -611
- package/src/virtual-windows/pane-spawner.ts +0 -278
- package/src/virtual-windows/pty-tail-content.ts +0 -291
- package/src/virtual-windows/resident-window.ts +0 -59
- package/src/virtual-windows/secondary-action.ts +0 -25
- package/src/virtual-windows/terminal-slot-content.ts +0 -165
- package/src/virtual-windows/virtual-window.ts +0 -1301
- package/src/virtual-windows/vw-local-input-target-popup.ts +0 -110
- package/src/virtual-windows/vw-rename-modal.ts +0 -77
- package/src/virtual-windows/vw-selector-popup.ts +0 -177
- package/src/virtual-windows/window-registry.ts +0 -519
- package/src/voice/channel-adapters/discord-voice-adapter.ts +0 -202
- package/src/voice/voice-pwa-dispatch.ts +0 -245
- package/src/window-picker-modal.ts +0 -135
- /package/apps/pwa/out/_next/static/{Ksn99fVf2HUWhSyV1-FC8 → zoQX5iTvXOsIvCjxCe1Ji}/_ssgManifest.js +0 -0
- /package/src/dashboard/{companion-slash-runtime.ts → companion-messages-runtime.ts} +0 -0
package/src/user-config.ts
CHANGED
|
@@ -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 {
|
|
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
|
|
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
|
-
/**
|
|
981
|
-
|
|
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,
|
|
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`(억제).
|
|
1102
|
-
*
|
|
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
|
-
|
|
1249
|
-
|
|
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
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1380
|
-
|
|
1381
|
-
|
|
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 서피스 특유
|
|
1698
|
-
*
|
|
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?: {
|
|
1703
|
-
discord?: {
|
|
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: {
|
|
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
|
|
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,
|
|
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
|
-
|
|
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).
|
|
3259
|
-
*
|
|
3260
|
-
|
|
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
|
-
/**
|
|
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
|
-
|
|
3410
|
-
if (
|
|
3411
|
-
|
|
3412
|
-
|
|
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
|
-
|
|
3415
|
-
|
|
3416
|
-
|
|
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
|
|
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
|