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