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
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9058],{29058:(e,t,r)=>{r.d(t,{zV:()=>eX});var n=r(54728),a=r(8740),l=r(25583),s=r(7096),o=r(36040),i=r(7240),c=r(28776),d=r(9728);r(42947);var u=r(3839),m=r(85351);function p(e){let t=e.split("\n"),r=t[0];if(!r)return null;let n=/^\[elanous\/term\/([a-zA-Z]+)\] (.+)$/.exec(r);if(!n)return null;let a=n[1];if("terminalOutput"!==a&&"terminalExit"!==a&&"terminalInputActivity"!==a&&"terminalFrame"!==a)return null;let l=[];for(let e=1;e<t.length;e++){let r=t[e];if(/^<<elanous-term-end /.test(r))break;l.push(r)}try{let e=JSON.parse(l.join("\n"));if("string"!=typeof e.terminalId)return null;if("terminalOutput"===a){if("string"!=typeof e.data)return null;return{method:a,payload:{terminalId:e.terminalId,data:e.data}}}if("terminalExit"===a){if("number"!=typeof e.code)return null;return{method:a,payload:{terminalId:e.terminalId,code:e.code}}}if("terminalFrame"===a){if("string"!=typeof e.frame||"string"!=typeof e.instance||"number"!=typeof e.at||!Number.isFinite(e.at))return null;return{method:a,payload:{terminalId:e.terminalId,frame:e.frame,instance:e.instance,at:e.at}}}if("string"!=typeof e.peerId||"number"!=typeof e.timestamp||"number"!=typeof e.bytes)return null;return{method:a,payload:{terminalId:e.terminalId,peerId:e.peerId,timestamp:e.timestamp,bytes:e.bytes}}}catch(e){return null}}let h="elanous.pwa.peerId",b=null;function f(){if(b)return b;let e=window.sessionStorage.getItem(h);return e&&0!==e.length||(e=function(){if("undefined"!=typeof crypto&&"function"==typeof crypto.getRandomValues){let e=new Uint32Array(2);return crypto.getRandomValues(e),(BigInt(e[0])<<32n|BigInt(e[1])).toString(36).slice(0,8)}return Math.random().toString(36).slice(2,10)}(),window.sessionStorage.setItem(h,e)),b=e,e}var x=r(76556);let g=/^\x1b\[[?>=][\d;]*[a-zA-Z$]/,v=/^\x1b\[\d+;\d+R$/,w=/^\x1b\[0?n$/,y=/^\x1b\][\d;]+;[^\x07\x1b]*(?:\x07|\x1b\\)$/,k=/^\x1b\[\d+;\d+;\d+t$/;function j(e){let{sessionId:t,terminalId:l,readOnly:h=!1,onForeignInputActivity:b}=e,j=(0,a.useRef)(null),N=(0,a.useRef)(t);N.current=t;let S=(0,a.useRef)(b);S.current=b;let{client:C,config:I,setSessionId:E}=(0,u.Q)(),[T,A]=(0,a.useState)(()=>({state:"CONNECTING",terminalId:l,connectingSince:Date.now()})),[Y,R]=(0,a.useState)(()=>Date.now()),D=T.terminalId===l?T.state:"CONNECTING",M=T.terminalId===l?T.connectingSince:Y;(0,a.useEffect)(()=>{if("CONNECTING"!==D)return;R(Date.now());let e=window.setInterval(()=>R(Date.now()),1e3);return()=>window.clearInterval(e)},[D,l]),(0,a.useEffect)(()=>{if(!j.current)return;let e=new s.B({fontFamily:'"JetBrainsMono Nerd Font", "JetBrains Mono", monospace',fontSize:13,theme:{background:"#0d0c08",foreground:"#e9e3d4",cursor:"#e9e3d4"},allowProposedApi:!0,scrollback:5e3,cursorBlink:!h,disableStdin:h});(0,m.cY)("webterm.xterm.boot",{sessionId:t,terminalId:l,readOnly:h});let n=new o.Y;e.loadAddon(n),e.loadAddon(new i.c((e,t)=>(0,m.cY)("webterm.link.click",{uri:t}))),e.loadAddon(new c.I);let a=new d.V;e.loadAddon(a),(async()=>{try{let t=await r.e(6804).then(r.bind(r,26804));e.loadAddon(new t.WebglAddon)}catch(e){(0,m.cY)("webterm.webgl.fallback",{reason:String(e)})}})(),(async()=>{try{let t=await r.e(4012).then(r.bind(r,84012));e.loadAddon(new t.ImageAddon),(0,m.cY)("webterm.image-addon.loaded")}catch(e){(0,m.cY)("webterm.image-addon.fallback",{reason:String(e)})}})(),e.unicode.activeVersion="11",e.open(j.current),n.fit();let u=(0,x.o1)("xtermScrollback",l),b=(0,x.N2)(u);"string"==typeof b&&b.length>0&&e.write(b);let I=C.connectAcp({...t?{sessionId:t}:{},onSession:e=>{e&&e!==t&&((0,m.cY)("webterm.acp.session.adopted",{from:t,to:e}),E(e))}});(0,m.cY)("webterm.acp.session.attach",{sessionId:t,terminalId:l});let T=I.onState((e,t)=>{let r=Date.now();A(t=>({state:e,terminalId:l,connectingSince:"CONNECTING"===e?r:t.connectingSince})),"CONNECTING"===e&&R(r),(0,m.cY)("webterm.xterm.acp-state",{terminalId:l,state:e,reason:null==t?void 0:t.message})});I.ready.then(t=>{if(t)return I.send("terminal/spawn",{sessionId:t,terminalId:l,cols:e.cols,rows:e.rows,replay:!0})}).then(t=>{void 0!==t&&((0,m.cY)("webterm.spawn.result",t),"attached"===t.status&&"string"==typeof t.snapshot&&t.snapshot.length>0&&((0,m.cY)("webterm.attach.replay",{terminalId:l,bytes:t.snapshot.length}),e.write("\x1b[2J\x1b[H"+t.snapshot.split("\n").join("\r\n")+"\r\n")))}).catch(e=>(0,m.cY)("webterm.spawn.error",{reason:String(e)}));let Y=I.on("sessionUpdate",t=>{var r,n,a;let s=null!=(n=t.params)?n:{},o=N.current;if(s.sessionId&&o&&s.sessionId!==o)return;let i=s.update;if(!i||"agent_thought_chunk"!==i.sessionUpdate)return;let c=(null==(r=i.content)?void 0:r.type)==="text"?i.content.text:null;if(!c)return;let d=p(c);d&&("terminalOutput"===d.method&&d.payload.terminalId===l?((0,m.cY)("webterm.ws.frame.in",{terminalId:l,bytes:d.payload.data.length}),e.write(d.payload.data)):"terminalExit"===d.method&&d.payload.terminalId===l?((0,m.cY)("webterm.pty.exit",{terminalId:l,code:d.payload.code}),e.write("\r\n\x1b[2m[exit ".concat(d.payload.code,"]\x1b[0m\r\n"))):"terminalInputActivity"===d.method&&d.payload.terminalId===l&&d.payload.peerId!==f()&&((0,m.cY)("webterm.peer.input",{terminalId:l,peerId:d.payload.peerId.slice(0,4),bytes:d.payload.bytes}),null==(a=S.current)||a.call(S,{peerId:d.payload.peerId,bytes:d.payload.bytes,timestamp:d.payload.timestamp})))}),D=h?null:e.onData(e=>{if(e&&!(e.length<2)&&27===e.charCodeAt(0)&&(g.test(e)||v.test(e)||w.test(e)||y.test(e)||k.test(e)))return void(0,m.cY)("webterm.xterm.onData.capability-swallow",{terminalId:l,bytes:e.length});(0,m.cY)("webterm.xterm.onData",{terminalId:l,bytes:e.length}),I.send("terminal/input",{sessionId:N.current,terminalId:l,data:e,peerId:f()}).catch(e=>(0,m.cY)("webterm.input.send-error",{reason:String(e)}))}),M=h?null:e.onResize(e=>{let{cols:t,rows:r}=e;(0,m.cY)("webterm.xterm.onResize",{terminalId:l,cols:t,rows:r}),I.send("terminal/resize",{sessionId:N.current,terminalId:l,cols:t,rows:r}).catch(e=>(0,m.cY)("webterm.resize.send-error",{reason:String(e)}))}),z=function(e){var t,r;let n=null!=(t=e.trailingDebounceMs)?t:32,a=null,l=!1,s=()=>{if((a=null,!l)&&e.onTrailing)try{e.onTrailing()}catch(e){}},o=t=>{var r,o;if(l)return;let i=performance.now(),c=null==(o=e.target)||null==(r=o.getBoundingClientRect)?void 0:r.call(o),d=c?Math.round(c.width):void 0,u=c?Math.round(c.height):void 0;if((null==c?void 0:c.height)===0){null!==a&&(clearTimeout(a),a=null),(0,m.cY)("webterm.resize.skip",{source:t,...void 0!==d?{w:d}:{},h:u,reason:"zero-height"});return}let p=null;try{e.onImmediate()}catch(e){p=e instanceof Error?e.message:String(e)}(0,m.cY)("webterm.resize.trigger",{source:t,dt:Math.round((performance.now()-i)*100)/100,...void 0!==d?{w:d}:{},...void 0!==u?{h:u}:{},...p?{err:p}:{}}),e.onTrailing&&(null!==a&&clearTimeout(a),a=setTimeout(s,n))},i=null;"undefined"!=typeof ResizeObserver&&(i=new ResizeObserver(()=>o("ro"))).observe(e.target);let c=()=>o("win");window.addEventListener("resize",c);let d=null!=(r=window.visualViewport)?r:null,u=()=>o("vv");return d&&d.addEventListener("resize",u),{dispose(){if(!l){if(l=!0,null!==a&&(clearTimeout(a),a=null),i){try{i.disconnect()}catch(e){}i=null}window.removeEventListener("resize",c),d&&d.removeEventListener("resize",u)}},flushPending(){null!==a&&(clearTimeout(a),s())}}}({target:j.current,onImmediate:()=>{try{n.fit()}catch(e){}},onTrailing:()=>{try{n.fit()}catch(e){}}});return()=>{try{let e=a.serialize();"string"==typeof e&&(0,x.Os)((0,x.o1)("xtermScrollback",l),e)}catch(e){(0,m.cY)("webterm.xterm.snapshot.error",{reason:String(e)})}try{z.dispose()}catch(e){}Y(),T();try{null==D||D.dispose()}catch(e){}try{null==M||M.dispose()}catch(e){}try{I.close()}catch(e){}try{e.dispose()}catch(e){}(0,m.cY)("webterm.xterm.teardown",{terminalId:l})}},[l,h,C]);let z="CONNECTING"===D?"연결 중":"OPEN"===D?"연결됨":"FAILED"===D?"연결 실패":"연결 종료",P="OPEN"===D?"text-emerald-300":"CONNECTING"===D?"text-amber-300":"text-red-300",U=l.trim()||"대상 미지정",L=Math.max(0,Math.floor((Y-M)/1e3));return(0,n.jsxs)("div",{className:"relative h-full w-full bg-[#0d0c08]",children:[(0,n.jsx)("div",{ref:j,className:"h-full w-full"}),(0,n.jsxs)("span",{"aria-live":"polite",className:"sr-only",children:["ACP: ",z]}),(0,n.jsxs)("span",{className:"pointer-events-none absolute right-2 top-2 rounded bg-black/70 px-2 py-1 text-xs ".concat(P),children:["ACP: ",z,"CONNECTING"===D&&" \xb7 ".concat(L,"초 \xb7 ").concat(U," \xb7 ").concat(I.baseUrl)]})]})}var N=r(40474);let S=/\x1b(?:\][^\x07\x1b]*(?:\x07|\x1b\\)|\[[0-?]*[ -/]*[@-~]|[@-Z\\-_])/g,C=new Map;function I(e){let{sessionId:t}=e,{client:r,setSessionId:l}=(0,u.Q)(),[s,o]=(0,a.useState)(C),[i,c]=(0,a.useState)(null);(0,a.useEffect)(()=>{let e=r.connectAcp({...t?{sessionId:t}:{},onSession:e=>{e&&e!==t&&l(e)}});(0,m.cY)("tui-mirror.attach",{sessionId:t});let n=e.on("sessionUpdate",e=>{var t,r;let n=(null!=(r=e.params)?r:{}).update;if(!n||"agent_thought_chunk"!==n.sessionUpdate)return;let a=(null==(t=n.content)?void 0:t.type)==="text"?n.content.text:null;a&&o(e=>{let t=function(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Date.now(),n=p(t);if(!n||"terminalFrame"!==n.method)return e;let{terminalId:a,frame:l,instance:s,at:o}=n.payload,i="".concat(s).concat("\0").concat(a),c=e.get(i);if(c&&o<c.at)return e;let d=new Map(e);return d.set(i,{key:i,surfaceId:a,frame:l,instance:s,at:o,receivedAt:r}),d}(e,a);return t!==e&&(0,m.cY)("tui-mirror.frame",{bytes:a.length}),t})}),a=setInterval(()=>{o(e=>(function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:15e3,n=!1;for(let a of e.values())if(t-a.receivedAt>r){n=!0;break}if(!n)return e;let a=new Map;for(let[n,l]of e)t-l.receivedAt<=r&&a.set(n,l);return a})(e))},5e3);return()=>{clearInterval(a);try{n()}catch(e){}try{e.close()}catch(e){}}},[r,t,l]);let d=(0,a.useMemo)(()=>[...s.values()].sort((e,t)=>t.receivedAt-e.receivedAt||e.key.localeCompare(t.key)),[s]);(0,a.useEffect)(()=>{var e,t;i&&s.has(i)||c(null!=(t=null==(e=d[0])?void 0:e.key)?t:null)},[d,i,s]);let h=i?s.get(i):void 0;return(0,n.jsxs)("div",{className:"flex h-full min-h-0 flex-col bg-zinc-950 text-zinc-100",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2 border-b border-zinc-800 px-3 py-2 text-xs text-zinc-400",children:[(0,n.jsx)("span",{className:"font-semibold text-zinc-200",children:"\uD83D\uDDA5 TUI 관측"}),(0,n.jsx)("span",{"aria-live":"polite",children:0===d.length?"자기신고 화면 대기 중…":"".concat(d.length,"개 화면 \xb7 라이브 미러")}),d.length>0&&(0,n.jsx)("select",{"aria-label":"관측할 TUI 화면 선택",className:"ml-auto rounded border border-zinc-700 bg-zinc-900 px-2 py-1 text-zinc-100",value:null!=i?i:"",onChange:e=>c(e.target.value),children:d.map(e=>(0,n.jsxs)("option",{value:e.key,children:[e.surfaceId," \xb7 ",e.instance]},e.key))})]}),(0,n.jsx)("pre",{className:"m-0 min-h-0 flex-1 overflow-auto whitespace-pre p-3 font-mono text-xs leading-snug text-zinc-100","aria-live":"polite","aria-label":"선택한 TUI 화면의 라이브 렌더 프레임",children:h?h.frame.replace(S,""):"자기신고하는 elanous 화면이 아직 없습니다. 대시보드(elanous)를 실행하면 여기 라이브로 미러링됩니다."})]})}var E=r(37102),T=r(76482),A=r(99461),Y=r(10514),R=r(20513),D=r(31673);function M(e){let{onFrameUploaded:t}=e,{config:r,client:l,sessionId:s}=(0,u.Q)(),o=(0,a.useRef)(null);(0,a.useEffect)(()=>()=>{try{var e;null==(e=o.current)||e.close()}catch(e){}o.current=null},[]);let i=(0,a.useCallback)(async e=>{if(t){try{t(e)}catch(e){}return}if(s){o.current||(o.current=l.connectAcp({sessionId:s}));try{var r;await o.current.send("terminal/camera/frame/notify",{sessionId:s,attachmentId:e.id,ts:null!=(r=e.createdAt)?r:Date.now()})}catch(e){(0,m.cY)("webterm.live-cam.notify-failed",{reason:e instanceof Error?e.message:String(e)})}}},[l,s,t]),c=function(e){var t,r,n;let l=null!=(t=e.intervalMs)?t:1e3,s=null!=(r=e.jpegQuality)?r:.85,o=null!=(n=e.maxDimension)?n:1280,[i,c]=(0,a.useState)({status:"idle",framesUploaded:0,lastAttachmentId:null,error:null}),d=(0,a.useRef)(null),u=(0,a.useRef)(null),p=(0,a.useRef)(null),h=(0,a.useRef)(null),b=(0,a.useRef)(!1),f=(0,a.useRef)(e.onFrameUploaded);f.current=e.onFrameUploaded;let x=(0,a.useRef)({baseUrl:e.baseUrl,token:e.token});x.current={baseUrl:e.baseUrl,token:e.token};let g=(0,a.useCallback)(()=>{null!==h.current&&(clearInterval(h.current),h.current=null);let e=d.current;if(e){for(let t of e.getTracks())try{t.stop()}catch(e){}d.current=null}if(u.current){try{u.current.pause()}catch(e){}u.current.srcObject=null,u.current=null}p.current=null,b.current=!1},[]),v=(0,a.useCallback)(async()=>{if(b.current)return void(0,m.cY)("webterm.live-cam.frame-dropped",{reason:"in-flight"});let e=u.current;if(!e||0===e.videoWidth||0===e.videoHeight)return void(0,m.cY)("webterm.live-cam.frame-skipped",{reason:"video-not-ready"});b.current=!0;try{let r=function(e,t,r){if(e<=r&&t<=r)return{width:e,height:t};let n=e/t;return e>=t?{width:r,height:Math.round(r/n)}:{width:Math.round(r*n),height:r}}(e.videoWidth,e.videoHeight,o),n=p.current;n&&n.width===r.width&&n.height===r.height||(p.current=n=function(e,t){let r=document.createElement("canvas");return r.width=e,r.height=t,r}(r.width,r.height));let a=n.getContext("2d");if(!a)return void(0,m.cY)("webterm.live-cam.no-ctx");a.drawImage(e,0,0,r.width,r.height);let l=await new Promise(e=>{n.toBlob(t=>e(t),"image/jpeg",s)});if(!l)return void(0,m.cY)("webterm.live-cam.toBlob-null");let i="live-frame-".concat(Date.now(),".jpg"),d=await (0,D.v)({baseUrl:x.current.baseUrl,token:x.current.token,file:l,filename:i});if(!d.ok){c(e=>({...e,error:d.reason})),(0,m.cY)("webterm.live-cam.upload-failed",{reason:d.reason});return}c(e=>({...e,framesUploaded:e.framesUploaded+1,lastAttachmentId:d.meta.id,error:null}));try{var t;null==(t=f.current)||t.call(f,d.meta)}catch(e){(0,m.cY)("webterm.live-cam.onFrameUploaded-throw",{reason:e instanceof Error?e.message:String(e)})}}catch(t){let e=t instanceof Error?t.message:String(t);c(t=>({...t,error:e})),(0,m.cY)("webterm.live-cam.capture-error",{reason:e})}finally{b.current=!1}},[s,o]),w=(0,a.useCallback)(async()=>{var e;let t;if("undefined"==typeof navigator||!(null==(e=navigator.mediaDevices)?void 0:e.getUserMedia))return void c(e=>({...e,status:"unsupported",error:"getUserMedia not available"}));if(!x.current.baseUrl)return void c(e=>({...e,status:"error",error:"daemon baseUrl not configured"}));if(d.current)return;c(e=>({...e,status:"requesting",error:null}));try{t=await navigator.mediaDevices.getUserMedia({video:{facingMode:{ideal:"environment"}}})}catch(r){let e=r instanceof Error?r.message:String(r),t=e.includes("Permission")||e.includes("NotAllowed");c(r=>({...r,status:t?"denied":"error",error:e})),(0,m.cY)("webterm.live-cam.getUserMedia-failed",{reason:e,denied:t});return}d.current=t;let r=document.createElement("video");r.srcObject=t,r.muted=!0,r.playsInline=!0,u.current=r;try{await r.play()}catch(e){(0,m.cY)("webterm.live-cam.video-play-failed",{reason:e instanceof Error?e.message:String(e)})}c(e=>({...e,status:"streaming",framesUploaded:0,error:null})),null!==h.current&&clearInterval(h.current),h.current=setInterval(()=>{v()},l),(0,m.cY)("webterm.live-cam.started",{intervalMs:l})},[v,l]),y=(0,a.useCallback)(()=>{g(),c({status:"idle",framesUploaded:0,lastAttachmentId:null,error:null}),(0,m.cY)("webterm.live-cam.stopped")},[g]);return(0,a.useEffect)(()=>()=>{g()},[g]),{...i,start:w,stop:y,isRunning:"streaming"===i.status}}({baseUrl:r.baseUrl,...r.token?{token:r.token}:{},onFrameUploaded:i});return"unsupported"!==c.status&&r.baseUrl?"denied"===c.status?(0,n.jsx)("button",{type:"button",disabled:!0,className:"rounded border border-rose-300 bg-rose-50 px-2 py-0.5 text-[11px] text-rose-700 dark:border-rose-800 dark:bg-rose-950 dark:text-rose-200",title:"Camera permission denied. Enable in iOS Settings → Safari → Camera, then reload.","data-testid":"live-camera-denied",children:"Camera denied"}):c.isRunning?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("button",{type:"button",onClick:()=>c.stop(),className:"rounded border border-rose-300 bg-rose-50 px-2 py-0.5 text-rose-700 dark:border-rose-800 dark:bg-rose-950 dark:text-rose-200 hover:bg-rose-100 dark:hover:bg-rose-900",title:"Stop live camera","data-testid":"live-camera-stop",children:"■ Stop"}),(0,n.jsxs)("span",{className:"rounded border border-border bg-card px-1.5 py-0.5 font-mono text-[10px] text-muted-foreground","data-testid":"live-camera-stats","aria-live":"polite",children:[c.framesUploaded,"f",c.error?(0,n.jsx)("span",{className:"ml-1 text-rose-500",children:"err"}):null]})]}):(0,n.jsx)("button",{type:"button",disabled:"requesting"===c.status,onClick:()=>{c.start()},className:"rounded border px-2 py-0.5 hover:bg-accent disabled:opacity-50",title:"Start live camera — uploads a 1Hz frame stream so the agent can see what you point at","data-testid":"live-camera-start",children:"requesting"===c.status?"Requesting…":"\uD83D\uDCF9 Live"}):null}function z(e){let{terminalId:t,onClear:r,onRecordingChange:l,onAttached:s,voice:o}=e,{client:i,sessionId:c,config:d}=(0,u.Q)(),[p,h]=(0,a.useState)(null),[b,f]=(0,a.useState)(null),[x,g]=(0,a.useState)(!1),[v,w]=(0,a.useState)(null);(0,a.useEffect)(()=>{null==l||l(null!==p)},[p,l]);let y=(0,a.useRef)(null);(0,a.useEffect)(()=>()=>{try{var e;null==(e=y.current)||e.close()}catch(e){}y.current=null},[]),(0,a.useEffect)(()=>{if(!c)return;y.current||(y.current=i.connectAcp({sessionId:c}));let e=y.current,r=!1;return(async()=>{try{var n;let a=await e.send("terminal/record/list",{sessionId:c});if(r)return;let l=null==a||null==(n=a.recordings)?void 0:n.find(e=>e.terminalId===t);l?h({recorderId:l.recorderId,startedAt:l.startedAt}):h(null),f(null),w(null)}catch(e){(0,m.cY)("webterm.controls.list-error",{reason:String(e)})}})(),()=>{r=!0}},[i,c,t]);let k=(0,a.useCallback)(async()=>{if(!c)return void w("session 미설정 — daemon 연결을 먼저 확인하세요");y.current||(y.current=i.connectAcp({sessionId:c}));let e=y.current;g(!0),w(null),f(null);try{var r,n;let a=await e.send("terminal/record/start",{sessionId:c,terminalId:t});(null==a?void 0:a.started)&&a.recorderId?((0,m.cY)("webterm.controls.record.started",{recorderId:a.recorderId,terminalId:t}),h({recorderId:a.recorderId,startedAt:null!=(r=a.startedAt)?r:Date.now()})):w(null!=(n=null==a?void 0:a.reason)?n:"start failed")}catch(e){w(String(e instanceof Error?e.message:e))}finally{g(!1)}},[i,c,t]),j=(0,a.useCallback)(async()=>{var e,r,n,a;if(!c||!p)return;let l=null!=(e=y.current)?e:i.connectAcp({sessionId:c});y.current=l,g(!0),w(null);try{let e=await l.send("terminal/record/stop",{sessionId:c,terminalId:t});(null==e?void 0:e.stopped)&&e.recorderId&&e.downloadUrl?((0,m.cY)("webterm.controls.record.stopped",{recorderId:e.recorderId,frameCount:e.frameCount,elapsedSec:e.elapsedSec}),f({recorderId:e.recorderId,downloadUrl:e.downloadUrl,frameCount:null!=(r=e.frameCount)?r:0,elapsedSec:null!=(n=e.elapsedSec)?n:0}),h(null)):w(null!=(a=null==e?void 0:e.reason)?a:"stop failed")}catch(e){w(String(e instanceof Error?e.message:e))}finally{g(!1)}},[p,i,c,t]);return(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2 border-b px-2 py-1 text-xs",children:[(0,n.jsx)("button",{type:"button",className:"rounded border px-2 py-0.5 hover:bg-accent",onClick:()=>{(0,m.cY)("webterm.controls.clear"),r()},children:"clear"}),(0,n.jsx)(Y.T,{onAttached:s?e=>s([e]):void 0}),(0,n.jsx)(R.u,{onAttached:s}),(0,n.jsx)(M,{}),o&&(0,n.jsxs)("button",{type:"button",onClick:o.onToggle,disabled:o.disabled,title:o.disabled?"마이크 사용 불가 (insecure context 등)":"".concat(o.phaseLabel," \xb7 xterm 으로 typing"),"data-elanous-action":"webterm-voice-toggle-controls","aria-pressed":o.active,className:(0,A.cn)("inline-flex items-center gap-1 rounded border px-2 py-0.5",o.active?"border-rose-300 bg-rose-100 text-rose-800 dark:border-rose-700 dark:bg-rose-950/40 dark:text-rose-100":"hover:bg-accent",o.disabled&&"cursor-not-allowed opacity-50"),children:[(0,n.jsx)("span",{className:(0,A.cn)("h-1.5 w-1.5 rounded-full",o.dotColor,("listening"===o.phase||"speaking"===o.phase)&&"animate-pulse"),"aria-hidden":"true"}),o.active?(0,n.jsx)(E.A,{className:"h-3.5 w-3.5"}):(0,n.jsx)(T.A,{className:"h-3.5 w-3.5"}),(0,n.jsx)("span",{children:"voice→stdin"})]}),!p&&!b&&(0,n.jsx)("button",{type:"button",disabled:x,className:"rounded border px-2 py-0.5 ".concat(x?"opacity-50":"hover:bg-accent"," text-rose-600 dark:text-rose-400"),onClick:()=>void k(),title:"start asciicast recording",children:"● record"}),p&&(0,n.jsx)("button",{type:"button",disabled:x,className:"rounded border px-2 py-0.5 ".concat(x?"opacity-50":"hover:bg-accent"," bg-rose-600 text-white animate-pulse"),onClick:()=>void j(),title:"stop + save .cast",children:"■ stop"}),b&&(0,n.jsx)("a",{href:(e=>{var t;if(!e)return"";let r=null!=(t=d.baseUrl)?t:"",n=e.includes("?")?"&":"?",a=d.token?"".concat(n,"auth=").concat(encodeURIComponent(d.token)):"";return"".concat(r).concat(e).concat(a)})(b.downloadUrl),download:"".concat(b.recorderId,".cast"),className:"rounded border border-emerald-500 px-2 py-0.5 text-emerald-600 hover:bg-emerald-50 dark:hover:bg-emerald-950",onClick:()=>(0,m.cY)("webterm.controls.download.click",{recorderId:b.recorderId}),title:"".concat(b.frameCount," frames \xb7 ").concat(b.elapsedSec.toFixed(1),"s"),children:"⬇ download .cast"}),b&&(0,n.jsx)("button",{type:"button",className:"rounded border px-2 py-0.5 text-muted-foreground hover:bg-accent",onClick:()=>f(null),title:"dismiss","aria-label":"dismiss download",children:"\xd7"}),(0,n.jsxs)("span",{className:"ml-auto text-[11px] text-muted-foreground",children:[p&&"● recording",b&&!p&&"✓ ".concat(b.recorderId),!p&&!b&&"screenshot — WT-C-2"]}),v&&(0,n.jsx)("span",{className:"ml-2 max-w-[40%] truncate text-[11px] text-rose-500",title:v,children:v})]})}var P=r(68874),U=r(37069),L=r(32235),O=r(30321),$=r(81897),F=r(22014),Q=r(75982),_=r(74573),B=r(27696),H=r(64476),q=r(95692),V=r(96598);function W(e){let{...t}=e;return(0,n.jsx)($.D,{"data-slot":"sheet",...t})}function G(e){let{...t}=e;return(0,n.jsx)(F.Z,{"data-slot":"sheet-portal",...t})}function K(e){let{className:t,...r}=e;return(0,n.jsx)(Q.X,{"data-slot":"sheet-overlay",className:(0,A.cn)("fixed inset-0 z-50 bg-black/10 transition-opacity duration-150 data-ending-style:opacity-0 data-starting-style:opacity-0 supports-backdrop-filter:backdrop-blur-xs",t),...r})}function Z(e){let{className:t,children:r,side:a="right",showCloseButton:l=!0,...s}=e;return(0,n.jsxs)(G,{children:[(0,n.jsx)(K,{}),(0,n.jsxs)(_.h,{"data-slot":"sheet-content","data-side":a,className:(0,A.cn)("fixed z-50 flex flex-col gap-4 bg-popover bg-clip-padding text-sm text-popover-foreground shadow-lg transition duration-200 ease-in-out data-ending-style:opacity-0 data-starting-style:opacity-0 data-[side=bottom]:inset-x-0 data-[side=bottom]:bottom-0 data-[side=bottom]:h-auto data-[side=bottom]:border-t data-[side=bottom]:data-ending-style:translate-y-[2.5rem] data-[side=bottom]:data-starting-style:translate-y-[2.5rem] data-[side=left]:inset-y-0 data-[side=left]:left-0 data-[side=left]:h-full data-[side=left]:w-3/4 data-[side=left]:border-r data-[side=left]:data-ending-style:translate-x-[-2.5rem] data-[side=left]:data-starting-style:translate-x-[-2.5rem] data-[side=right]:inset-y-0 data-[side=right]:right-0 data-[side=right]:h-full data-[side=right]:w-3/4 data-[side=right]:border-l data-[side=right]:data-ending-style:translate-x-[2.5rem] data-[side=right]:data-starting-style:translate-x-[2.5rem] data-[side=top]:inset-x-0 data-[side=top]:top-0 data-[side=top]:h-auto data-[side=top]:border-b data-[side=top]:data-ending-style:translate-y-[-2.5rem] data-[side=top]:data-starting-style:translate-y-[-2.5rem] data-[side=left]:sm:max-w-sm data-[side=right]:sm:max-w-sm",t),...s,children:[r,l&&(0,n.jsxs)(B.H,{"data-slot":"sheet-close",render:(0,n.jsx)(V.$,{variant:"ghost",className:"absolute top-3 right-3",size:"icon-sm"}),children:[(0,n.jsx)(L.A,{}),(0,n.jsx)("span",{className:"sr-only",children:"Close"})]})]})]})}function J(e){let{className:t,...r}=e;return(0,n.jsx)("div",{"data-slot":"sheet-header",className:(0,A.cn)("flex flex-col gap-0.5 p-4",t),...r})}function X(e){let{className:t,...r}=e;return(0,n.jsx)(H.L,{"data-slot":"sheet-title",className:(0,A.cn)("font-heading text-base font-medium text-foreground",t),...r})}function ee(e){let{className:t,...r}=e;return(0,n.jsx)(q.r,{"data-slot":"sheet-description",className:(0,A.cn)("text-sm text-muted-foreground",t),...r})}var et=r(82124);let er={pre:r(22765).j};function en(e){let{pendingTurn:t,response:r,onAbort:l,onResponseClose:s}=e,o=null!==t||null!==r;if((0,a.useEffect)(()=>{o&&(r?(0,m.cY)("webterm.agent.sheet.open",{modelLabel:r.modelLabel,stopReason:r.stopReason,mdLen:r.markdown.length,ctxLines:r.contextLines}):t&&(0,m.cY)("webterm.agent.sheet.pending",{promptLen:t.prompt.length}))},[o,r,t]),!o)return null;let i=t?t.prompt.length>120?"".concat(t.prompt.slice(0,117),"…"):t.prompt:"";return(0,n.jsx)(W,{open:o,onOpenChange:e=>{e||(t?l():s())},children:(0,n.jsx)(Z,{side:"top",className:"max-h-[70vh] min-h-[200px] w-full overflow-auto sm:max-w-none",children:r?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(J,{children:[(0,n.jsxs)(X,{className:"font-mono text-sm",children:["agent \xb7 ",r.modelLabel]}),(0,n.jsx)(ee,{className:"font-mono text-[11px]",children:r.contextLines>0?"with ".concat(r.contextLines," buffer line(s) of terminal context \xb7 stop=").concat(r.stopReason):"no buffer context attached \xb7 stop=".concat(r.stopReason)})]}),(0,n.jsx)("div",{className:"prose prose-sm dark:prose-invert max-w-none px-4 pb-6 [&_pre]:overflow-auto [&_pre]:rounded [&_pre]:bg-muted [&_pre]:p-2 [&_code]:font-mono [&_code]:text-[13px]","data-testid":"agent-response-markdown",children:(0,n.jsx)(O.oz,{remarkPlugins:et.c,components:er,children:r.markdown})})]}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)(J,{children:[(0,n.jsxs)(X,{className:"flex items-center gap-2 font-mono text-sm",children:[(0,n.jsx)(U.A,{className:"h-4 w-4 animate-spin"}),"agent \xb7 thinking"]}),(0,n.jsx)(ee,{className:"font-mono text-[11px]",children:"Esc twice to abort \xb7 or click Stop"})]}),(0,n.jsx)("div",{className:"px-4 pb-2 font-mono text-[12px] text-muted-foreground","data-testid":"agent-pending-prompt",children:i}),(0,n.jsx)("div",{className:"flex justify-end px-4 pb-4",children:(0,n.jsxs)("button",{type:"button",onClick:l,className:"flex items-center gap-1 rounded border border-rose-300 bg-rose-50 px-2 py-1 font-mono text-[11px] text-rose-700 hover:bg-rose-100 dark:border-rose-700 dark:bg-rose-950 dark:text-rose-200 dark:hover:bg-rose-900","data-testid":"agent-abort-stop",children:[(0,n.jsx)(L.A,{className:"h-3 w-3"}),"Stop"]})})]})})})}let ea="elanous.webterm.replHistory",el=[":help",":agent ",":tab next",":tab prev",":cwd",":capture",":peers"];function es(e){let{terminalId:t,onTabIntent:r,onMirror:l}=e,{client:s,sessionId:o}=(0,u.Q)(),[i,c]=(0,a.useState)(":"),[d,p]=(0,a.useState)(!1),[h,b]=(0,a.useState)(null),[x,g]=(0,a.useState)([]),[v,w]=(0,a.useState)(-1),[y,k]=(0,a.useState)(!1),[j,N]=(0,a.useState)(null),[S,C]=(0,a.useState)(!1),[I,E]=(0,a.useState)(null),[T,A]=(0,a.useState)(!1),Y=(0,a.useRef)(null),R=(0,a.useRef)(null);(0,a.useEffect)(()=>{g(function(){try{let e=window.localStorage.getItem(ea);if(!e)return[];let t=JSON.parse(e);if(!Array.isArray(t))return[];return t.filter(e=>"string"==typeof e&&e.length>0).slice(-32)}catch(e){return[]}}())},[]),(0,a.useEffect)(()=>{if(o)return Y.current||(Y.current=s.connectAcp({sessionId:o})),()=>{try{var e;null==(e=Y.current)||e.close()}catch(e){}Y.current=null}},[s,o]);let D=(0,a.useCallback)(async e=>{let n=e.trim(),a=S&&!n.startsWith(":")&&n.length>0?":agent ".concat(n):n;if(!a.startsWith(":"))return void b("meta commands must start with `:`");if(!o)return void b("session 미설정");Y.current||(Y.current=s.connectAcp({sessionId:o}));let i=Y.current,d=function(e){var t;let r=e.match(/^:agent\s+(.*)$/);if(!r)return null;let n=null!=(t=r[1])?t:"";return(n=n.replace(/^--scroll\s+\S+\s+/,""),/^--chat(\s|$)/.test(n))?null:(n=n.trim()).length>0?n:null}(a);null!==d?E({prompt:d}):p(!0),b(null);try{var u,h;let e=await i.send("terminal/repl/exec",{sessionId:o,terminalId:t,line:a});if((0,m.cY)("webterm.repl.exec",{cmd:a,consumed:null==e?void 0:e.consumed,outputLen:null!=(h=null==e||null==(u=e.output)?void 0:u.length)?h:0,sessionIdChange:null==e?void 0:e.sessionIdChange,tabIntent:null==e?void 0:e.tabIntent,hasInject:!!(null==e?void 0:e.injectPath),hasAgent:!!(null==e?void 0:e.agent),chatEnter:!!(null==e?void 0:e.agentChatModeEnter),chatExit:S&&!!(null==e?void 0:e.exitRequested)}),(null==e?void 0:e.agent)&&N(e.agent),l&&(l({kind:"replCommand",line:a}),(null==e?void 0:e.agent)?l({kind:"agentResult",markdown:e.agent.markdown,modelLabel:e.agent.modelLabel}):(null==e?void 0:e.replSystem)?l({kind:"systemMessage",level:e.replSystem.level,text:e.replSystem.text}):"string"==typeof(null==e?void 0:e.output)&&e.output.length>0&&l({kind:"replOutput",output:e.output}),(null==e?void 0:e.agentChatModeEnter)?l({kind:"note",text:"agent chat mode entered"}):S&&(null==e?void 0:e.exitRequested)&&l({kind:"note",text:"agent chat mode exited"})),(null==e?void 0:e.agentChatModeEnter)?C(!0):S&&(null==e?void 0:e.exitRequested)&&C(!1),(null==e?void 0:e.tabIntent)!==void 0&&r&&r(e.tabIntent),null==e?void 0:e.injectPath)try{await i.send("terminal/input",{sessionId:o,terminalId:t,data:"'".concat(e.injectPath.replace(/'/g,"'\\''"),"' "),peerId:f()})}catch(e){(0,m.cY)("webterm.repl.inject-error",{reason:String(e)})}g(e=>{let t=e[e.length-1]===a?e:[...e,a].slice(-32);return window.localStorage.setItem(ea,JSON.stringify(t.slice(-32))),t}),w(-1);let n=null!=e&&!!e.agentChatModeEnter||(!S||null==e||!e.exitRequested)&&S;c(n?"":":")}catch(t){let e=String(t instanceof Error?t.message:t);b(e),l&&l({kind:"systemMessage",level:"error",text:":repl dispatch error — ".concat(e)})}finally{p(!1),E(null),A(!1)}},[s,o,t,S]),M=(0,a.useCallback)(async()=>{if(!I||!o)return void A(!1);A(!1);try{var e,r;let n=null!=(e=Y.current)?e:s.connectAcp({sessionId:o});Y.current=n;let a=await n.send("terminal/repl/agent/abort",{sessionId:o,terminalId:t});(0,m.cY)("webterm.repl.agent.abort",{aborted:null!=(r=null==a?void 0:a.aborted)&&r})}catch(e){(0,m.cY)("webterm.repl.agent.abort-error",{reason:String(e)})}E(null)},[s,o,t,I]);return(0,n.jsxs)("div",{className:"flex items-center gap-2 border-b px-2 py-1 text-xs ".concat(S?"border-primary/40 bg-primary/5":"border-border bg-background/40"),children:[(0,n.jsx)("span",{className:"font-mono text-[11px] ".concat(S?"text-primary":"text-muted-foreground"),title:S?"agent chat mode — :exit to leave":"REPL meta command",children:S?"agent>":"REPL"}),(0,n.jsx)("input",{ref:R,type:"text",value:i,onChange:e=>c(e.target.value),onKeyDown:e=>{var t,r;if(T)return void("Escape"===e.key||"Enter"===e.key?(e.preventDefault(),M()):(e.preventDefault(),A(!1)));if(I&&"Escape"===e.key){e.preventDefault(),A(!0);return}if(I&&"Enter"===e.key)return void e.preventDefault();if("Enter"===e.key)e.preventDefault(),D(i);else if("ArrowUp"===e.key){if(e.preventDefault(),0===x.length)return;let r=v<0?x.length-1:Math.max(0,v-1);w(r),c(null!=(t=x[r])?t:":")}else if("ArrowDown"===e.key){if(e.preventDefault(),v<0)return;let t=v+1;t>=x.length?(w(-1),c(":")):(w(t),c(null!=(r=x[t])?r:":"))}else"Escape"===e.key&&(c(S?"":":"),w(-1),b(null))},disabled:d,spellCheck:!1,autoCorrect:"off",autoCapitalize:"none",placeholder:S?"ask the agent — :exit to leave chat mode":":agent <prompt> \xb7 :help \xb7 :tab \xb7 :cwd \xb7 :capture",className:"flex-1 rounded border border-border bg-card px-2 py-0.5 font-mono text-[11px] text-foreground outline-none focus:border-primary disabled:opacity-50"}),(0,n.jsx)(en,{pendingTurn:I,response:j,onAbort:()=>{M()},onResponseClose:()=>N(null)}),T&&(0,n.jsx)("div",{className:"fixed inset-0 z-50 flex items-center justify-center bg-black/50",role:"alertdialog","aria-modal":"true","data-testid":"agent-abort-gate",onClick:()=>A(!1),children:(0,n.jsxs)("div",{className:"rounded-md border border-rose-300 bg-card p-4 shadow-lg dark:border-rose-700",onClick:e=>e.stopPropagation(),children:[(0,n.jsx)("h3",{className:"font-mono text-sm",children:"Abort agent turn?"}),(0,n.jsx)("p",{className:"mt-1 font-mono text-[11px] text-muted-foreground",children:"Esc again or Enter to confirm \xb7 any other key to cancel"}),(0,n.jsxs)("div",{className:"mt-3 flex justify-end gap-2",children:[(0,n.jsx)("button",{type:"button",onClick:()=>A(!1),className:"rounded border border-border bg-background px-2 py-1 font-mono text-[11px] hover:bg-accent",children:"Cancel"}),(0,n.jsx)("button",{type:"button",onClick:()=>{M()},className:"rounded bg-rose-600 px-2 py-1 font-mono text-[11px] text-white hover:bg-rose-700","data-testid":"agent-abort-confirm",children:"Abort"})]})]})}),(0,n.jsxs)("div",{className:"relative",children:[(0,n.jsx)("button",{type:"button",onClick:()=>k(e=>!e),"aria-label":"quick commands",title:"quick commands",className:"rounded p-1 text-muted-foreground hover:bg-accent hover:text-foreground",children:(0,n.jsx)(P.A,{className:"h-3.5 w-3.5"})}),y&&(0,n.jsx)("ul",{className:"absolute right-0 top-full z-40 mt-1 min-w-[140px] rounded-md border border-border bg-popover p-1 shadow-md",children:el.map(e=>(0,n.jsx)("li",{children:(0,n.jsx)("button",{type:"button",className:"block w-full rounded px-2 py-1 text-left font-mono text-[11px] hover:bg-accent",onClick:()=>{var t;c(e+" "),k(!1),null==(t=R.current)||t.focus()},children:e})},e))})]}),h&&(0,n.jsx)("span",{className:"ml-1 max-w-[40%] truncate text-[11px] text-rose-500",title:h,children:h})]})}let eo={ctrl:!1,alt:!1},ei={up:"A",down:"B",right:"C",left:"D"},ec=[{key:"esc",label:"Esc",width:"wide",title:"Escape (vim normal mode)"},{key:"tab",label:"Tab",width:"wide",title:"Tab (autocomplete)"},{key:"left",label:"←",width:"narrow",title:"Left arrow"},{key:"down",label:"↓",width:"narrow",title:"Down arrow"},{key:"up",label:"↑",width:"narrow",title:"Up arrow"},{key:"right",label:"→",width:"narrow",title:"Right arrow"}];function ed(e){let{terminalId:t}=e,{client:r,sessionId:l}=(0,u.Q)(),[s,o]=(0,a.useState)(!1),[i,c]=(0,a.useState)(!1),d=(0,a.useRef)(!1),p=(0,a.useRef)(!1);d.current=s,p.current=i;let h=(0,a.useRef)(null),b=(0,a.useRef)(null);(0,a.useEffect)(()=>{if(l)return h.current||(h.current=r.connectAcp({sessionId:l})),()=>{try{var e;null==(e=h.current)||e.close()}catch(e){}h.current=null}},[r,l]);let x=(0,a.useCallback)((e,t)=>{null!==b.current&&(clearTimeout(b.current),b.current=null),(e||t)&&(b.current=setTimeout(()=>{o(!1),c(!1),b.current=null,(0,m.cY)("webterm.modbar.auto-release",{})},5e3))},[]);(0,a.useEffect)(()=>()=>{null!==b.current&&(clearTimeout(b.current),b.current=null)},[]);let g=(0,a.useCallback)(async e=>{if(!l)return void(0,m.cY)("webterm.modbar.no-session",{key:e});h.current||(h.current=r.connectAcp({sessionId:l}));let n=h.current,a={ctrl:d.current,alt:p.current},s=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:eo;switch(e){case"esc":return t.alt?"\x1b\x1b":"\x1b";case"tab":return t.alt?"\x1b ":" ";case"up":case"down":case"left":case"right":{let r=ei[e],n=function(e){if(!e.ctrl&&!e.alt)return null;let t=0;return e.alt&&(t+=2),e.ctrl&&(t+=4),1+t}(t);return null===n?"\x1b[".concat(r):"\x1b[1;".concat(n).concat(r)}}}(e,a);(0,m.cY)("webterm.modbar.send",{key:e,ctrl:a.ctrl,alt:a.alt,bytes:s.length});try{await n.send("terminal/input",{sessionId:l,terminalId:t,data:s,peerId:f()})}catch(e){(0,m.cY)("webterm.modbar.send-error",{reason:String(e)})}(a.ctrl||a.alt)&&(o(!1),c(!1),x(!1,!1))},[r,l,t,x]),v=(0,a.useCallback)(()=>{let e=!d.current;o(e),x(e,p.current)},[x]),w=(0,a.useCallback)(()=>{let e=!p.current;c(e),x(d.current,e)},[x]),y=e=>["flex h-7 items-center justify-center rounded border font-mono text-[11px] px-2 min-w-[36px] active:translate-y-px disabled:opacity-50 transition-colors",e?"border-amber-400 bg-amber-100 text-amber-900 dark:border-amber-500 dark:bg-amber-900 dark:text-amber-100":"border-border bg-card text-muted-foreground hover:bg-muted hover:border-primary hover:text-foreground"].join(" ");return(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-1 border-b border-border bg-background/60 px-2 py-1","data-testid":"modifier-bar",role:"toolbar","aria-label":"Mobile keyboard modifiers",children:[ec.map(e=>(0,n.jsx)("button",{type:"button",className:["flex h-7 items-center justify-center rounded border border-border bg-card font-mono text-[11px] text-muted-foreground hover:bg-muted hover:border-primary hover:text-foreground active:translate-y-px disabled:opacity-50","wide"===e.width?"px-2 min-w-[36px]":"w-8"].join(" "),onClick:()=>{g(e.key)},disabled:!l,"aria-label":e.title,title:e.title,"data-testid":"modbar-".concat(e.key),children:e.label},e.key)),(0,n.jsx)("span",{className:"mx-1 text-[10px] text-muted-foreground/60","aria-hidden":!0,children:"\xb7"}),(0,n.jsx)("button",{type:"button",className:y(s),onClick:v,disabled:!l,"aria-label":"Ctrl modifier ".concat(s?"active":"idle"),"aria-pressed":s,title:"Ctrl modifier — toggles. Combines with arrow keys (e.g. Ctrl+→ = next word). Auto-releases after 5s or one keystroke.","data-testid":"modbar-ctrl",children:"Ctrl"}),(0,n.jsx)("button",{type:"button",className:y(i),onClick:w,disabled:!l,"aria-label":"Alt modifier ".concat(i?"active":"idle"),"aria-pressed":i,title:"Alt modifier — toggles. Combines with Esc/Tab/arrows. Auto-releases after 5s or one keystroke.","data-testid":"modbar-alt",children:"Alt"})]})}var eu=r(41395);function em(e){let{foreignActivityTick:t,onPeerCountChange:r}=e,{client:l,sessionId:s}=(0,u.Q)(),[o,i]=(0,a.useState)(0),[c,d]=(0,a.useState)(!1);(0,a.useEffect)(()=>{null==r||r(o)},[o,r]);let p=(0,a.useRef)(null),h=(0,a.useRef)(null),b=(0,a.useCallback)(async()=>{if(!s)return;p.current||(p.current=l.connectAcp({sessionId:s}));let e=p.current;try{let t=await e.send("terminal/peers/count",{sessionId:s});"number"==typeof(null==t?void 0:t.count)&&(i(t.count),(0,m.cY)("webterm.peers.count",{count:t.count}))}catch(e){(0,m.cY)("webterm.peers.count.error",{reason:String(e)})}},[l,s]);return((0,a.useEffect)(()=>{b();let e=()=>{"visible"===document.visibilityState&&b()};return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)}},[b]),(0,a.useEffect)(()=>()=>{try{var e;null==(e=p.current)||e.close()}catch(e){}p.current=null,h.current&&clearTimeout(h.current)},[]),(0,a.useEffect)(()=>{t&&(d(!0),h.current&&clearTimeout(h.current),h.current=setTimeout(()=>{d(!1),h.current=null,b()},1800))},[t,b]),o<=1&&!c)?null:(0,n.jsxs)("div",{className:"flex items-center gap-2 border-b border-border bg-amber-500/10 px-2 py-0.5 text-[11px]",children:[(0,n.jsx)(eu.A,{className:"h-3 w-3 text-amber-600","aria-hidden":!0}),o>1&&(0,n.jsxs)("span",{className:"font-mono text-amber-700 dark:text-amber-400",children:[o," devices"]}),c&&(0,n.jsx)("span",{className:"ml-auto rounded bg-amber-500 px-1.5 py-0.5 font-medium text-white animate-pulse",children:"\uD83D\uDC64 typing"})]})}var ep=r(52440);function eh(e){let{onAttached:t,pageWide:r=!0}=e,{config:s}=(0,u.Q)(),[o,i]=(0,a.useState)(!1),[c,d]=(0,a.useState)(!1),p=(0,a.useRef)(0),h=(0,a.useCallback)(async e=>{if(0!==e.length){if(!s.baseUrl)return void l.oR.error("Daemon URL 미설정 — Settings 에서 입력");d(!0),(0,m.cY)("webterm.dropzone.drop",{count:e.length,totalBytes:e.reduce((e,t)=>e+t.size,0)});try{let r=await (0,D.K)(e.map(e=>({file:e,filename:e.name})),{baseUrl:s.baseUrl,...s.token?{token:s.token}:{}}),n=r.filter(e=>e.ok),a=r.filter(e=>!e.ok);n.length>0&&(l.oR.success(1===n.length?"\uD83D\uDCCE ".concat(n[0].meta.filename):"\uD83D\uDCCE ".concat(n.length," files dropped")),null==t||t(n.map(e=>e.meta))),a.length>0&&l.oR.error(1===a.length?"드롭 실패: ".concat(a[0].reason.slice(0,80)):"".concat(a.length," 파일 드롭 실패"))}finally{d(!1)}}},[s.baseUrl,s.token,t]);return((0,a.useEffect)(()=>{if(!r)return;let e=e=>{e.dataTransfer&&e.dataTransfer.types.includes("Files")&&(e.preventDefault(),p.current+=1,i(!0))},t=e=>{e.dataTransfer&&e.dataTransfer.types.includes("Files")&&e.preventDefault()},n=e=>{e.dataTransfer&&e.dataTransfer.types.includes("Files")&&(e.preventDefault(),p.current=Math.max(0,p.current-1),0===p.current&&i(!1))},a=e=>{if(!e.dataTransfer)return;let t=e.dataTransfer.files;t&&0!==t.length&&(e.preventDefault(),p.current=0,i(!1),h(Array.from(t)))};return document.addEventListener("dragenter",e),document.addEventListener("dragover",t),document.addEventListener("dragleave",n),document.addEventListener("drop",a),()=>{document.removeEventListener("dragenter",e),document.removeEventListener("dragover",t),document.removeEventListener("dragleave",n),document.removeEventListener("drop",a)}},[h,r]),o||c)?(0,n.jsx)("div",{className:"pointer-events-none fixed inset-0 z-50 flex items-center justify-center bg-primary/20 backdrop-blur-sm",children:(0,n.jsxs)("div",{className:"rounded-xl border-2 border-dashed border-primary bg-card px-6 py-4 text-center shadow-lg",children:[(0,n.jsx)(ep.A,{className:"mx-auto h-10 w-10 text-primary","aria-hidden":!0}),(0,n.jsx)("div",{className:"mt-2 text-sm font-medium text-foreground",children:c?"업로드 중…":"Drop files to attach"}),(0,n.jsx)("div",{className:"mt-1 text-xs text-muted-foreground",children:c?"":"iCloud \xb7 Files.app \xb7 폴더 모두 지원"})]})}):null}var eb=r(42135),ef=r(13342),ex=r(6588),eg=r(23182),ev=r(67841),ew=r(81761),ey=r(91342),ek=r(27980),ej=r(81203),eN=r(21931),eS=r(38546),eC=r(61105),eI=r(96556);let eE=/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g;async function eT(e,t){if(!t||0===t.length)return null;try{let r=await e.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(t)));if(!r||!Array.isArray(r.messages))return null;let n=function(e){let t=[];return e.forEach((e,r)=>{let n=function(e,t){let r=e.role;if("tool"===r)return{...(0,eI.$Q)("\uD83D\uDEE0️ ".concat(e.toolName||"tool")),id:"hydrate-t-".concat(t)};let n=function(e){if("string"==typeof e)return e;if(!Array.isArray(e))return"";let t=[];for(let n of e)if(n&&"object"==typeof n){let e=n.type;if("text"===e&&"string"==typeof n.text)t.push(n.text);else if("image"===e)t.push("\uD83D\uDCCE image");else if("audio"===e)t.push("\uD83D\uDCCE audio");else if("tool_use"===e){var r;let e=null!=(r=n.name)?r:"tool";t.push("\uD83D\uDEE0️ ".concat(e))}else"tool_result"===e&&t.push("\uD83D\uDEE0️ result")}return t.join("\n").trim()}(e.content);return 0===n.length?null:"user"===r?{...(0,eI.tw)(n),id:"hydrate-u-".concat(t)}:"assistant"===r?{id:"hydrate-a-".concat(t),role:"assistant",text:n,timestamp:Date.now(),meta:{provider:"history"}}:"system"===r?null:{...(0,eI.$Q)(n),id:"hydrate-m-".concat(t)}}(e,r);n&&t.push(n)}),t.slice(-200)}(r.messages);return(0,m.cY)("webterm.terminal-chat.hydrate.ok",{sessionId:t,serverCount:r.messages.length,mappedCount:n.length}),n}catch(e){return(0,m.cY)("webterm.terminal-chat.hydrate.skip",{sessionId:t,reason:e instanceof Error?e.message:String(e)}),null}}let eA=[":cwd",":capture",":peers",":tab next",":tab prev"];function eY(e){let t=(null!=e?e:"").replace(/\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])/g,"").replace(/\r/g,"").trim();return t.length>0?t:"(no output)"}let eR=(0,a.forwardRef)(function(e,t){let{terminalId:r,open:s,replOpen:o,onToggleRepl:i,height:c,voice:d}=e,p="number"==typeof c&&Number.isFinite(c)&&c>0?c:void 0,{client:h,config:b,setConfig:f,sessionId:x,setSessionId:g}=(0,u.Q)(),v=(0,a.useRef)(x),w=(0,a.useRef)(null),[y,k]=(0,a.useState)([]),[j,N]=(0,a.useState)(!1),[S,C]=(0,a.useState)(null),[I,Y]=(0,a.useState)([]),[R,D]=(0,a.useState)(!1),M=(0,a.useRef)(async()=>{}),z=(0,a.useRef)(!1);z.current=j;let L=(0,a.useRef)(null),[O,$]=(0,a.useState)(!1),F=(0,eC.$)({enabled:!!(null==d?void 0:d.active)&&!O,language:"ko-KR"}),Q=(0,a.useRef)(F);Q.current=F,(0,a.useEffect)(()=>{v.current=x},[x]),(0,a.useEffect)(()=>{try{var e;null==(e=w.current)||e.close()}catch(e){}if(w.current=null,s&&x)return w.current=h.connectAcp({sessionId:x}),()=>{try{var e;null==(e=w.current)||e.close()}catch(e){}w.current=null}},[h,s,x]),(0,a.useEffect)(()=>{let e=w.current;if(e&&s&&x)return e.on("sessionUpdate",e=>{var t;let r=L.current;if(!r)return;let n=e.params;if(!n||n.sessionId!==x)return;let a=n.update;if(a&&"agent_message_chunk"===a.sessionUpdate&&(null==(t=a.content)?void 0:t.type)==="text"&&"string"==typeof a.content.text){let e=a.content.text;if(0===e.length)return;k(t=>t.map(t=>{var n;return t.id===r?{...t,text:(null!=(n=t.text)?n:"")+e}:t})),Q.current.pushText(e)}})},[s,x]);let _=(0,a.useRef)(null);(0,a.useEffect)(()=>{if(!s||!x||_.current===x)return;_.current=x;let e=!1;return(async()=>{let t=await eT(h,x);e||null===t||k(t)})(),()=>{e=!0}},[h,s,x]);let B=(0,a.useCallback)(e=>{k(t=>[...t,e].slice(-200))},[]);(0,a.useImperativeHandle)(t,()=>({appendMirrored:e=>{B(function(e){switch(e.kind){case"replCommand":return(0,eI.$Q)("▸ REPL \xb7 ".concat(e.line));case"replOutput":{let t=e.output.replace(eE,"").replace(/\r/g,"").trim();return(0,eI.$Q)(t.length>0?t:"(no output)")}case"agentResult":return{id:"mirror-agent-".concat(Date.now(),"-").concat(Math.random().toString(36).slice(2,6)),role:"assistant",text:e.markdown,timestamp:Date.now(),meta:{provider:e.modelLabel,mirrored:"repl"}};case"note":return(0,eI.$Q)(e.text);case"systemMessage":return{id:"mirror-sys-".concat(Date.now(),"-").concat(Math.random().toString(36).slice(2,6)),role:"system",text:e.text,timestamp:Date.now(),meta:{mirrored:"repl",systemLevel:e.level}}}}(e)),(0,m.cY)("webterm.terminal-chat.mirror",{terminalId:r,kind:e.kind})},submitVoiceTranscript:e=>{let t=e.trim();if(t){if(z.current)return void(0,m.cY)("webterm.terminal-chat.voice.skip-pending",{len:t.length});(0,m.cY)("webterm.terminal-chat.voice.auto-send",{len:t.length}),M.current(t)}}}),[B,r]);let H=(0,a.useCallback)(()=>{let e=v.current;return e?(w.current||(w.current=h.connectAcp({sessionId:e})),w.current):null},[h]),q=(0,a.useMemo)(()=>({client:h,sessionId:x,provider:b.provider,setSessionId:g,setProvider:e=>f({provider:e})}),[h,b.provider,x,f,g]),W=(0,a.useCallback)(e=>{Y(t=>[...t,...e]),(0,m.cY)("webterm.terminal-chat.attach.queue",{terminalId:r,added:e.length,filenames:e.map(e=>e.filename)})},[r]),G=(0,a.useCallback)(e=>{Y(t=>t.filter(t=>t.id!==e))},[]),K=(0,a.useCallback)(async e=>{let t=await (0,eI.yN)(e,q);if(t){"__CLEAR__"===t.text?k([]):B((0,eI.$Q)(t.text,r)),t.newSessionId&&g(t.newSessionId),void 0!==t.newProvider&&f({provider:t.newProvider});return}if(!x)return void B((0,eI.$Q)("session 미설정",r));let n=H();if(!n)return void B((0,eI.$Q)("session 미설정",r));let a=await n.send("terminal/repl/exec",{sessionId:x,terminalId:r,line:e});B((0,eI.$Q)(eY(null==a?void 0:a.output),r)),(null==a?void 0:a.sessionIdChange)&&g(a.sessionIdChange),(null==a?void 0:a.tabIntent)!==void 0&&B((0,eI.$Q)("tab intent → ".concat(String(a.tabIntent)),r)),(null==a?void 0:a.injectPath)&&B((0,eI.$Q)("captured → ".concat(a.injectPath),r)),(null==a?void 0:a.agentChatModeEnter)&&B((0,eI.$Q)("agent chat mode hint — terminal dock already runs plain text as agent turns",r))},[B,q,H,x,f,g,r]),Z=(0,a.useCallback)(async()=>{let e=v.current;if(e&&S)try{var t;let n=H();if(!n)return;let a=await n.send("terminal/repl/agent/abort",{sessionId:e,terminalId:r});(0,m.cY)("webterm.terminal-chat.abort",{terminalId:r,aborted:null!=(t=null==a?void 0:a.aborted)&&t}),B((0,eI.$Q)((null==a?void 0:a.aborted)?"agent turn aborted":"no active agent turn to abort",r))}catch(t){let e=t instanceof Error?t.message:String(t);B((0,eI.$Q)("abort failed: ".concat(e),r))}finally{N(!1),C(null)}},[B,H,S,r]),J=(0,a.useCallback)(async e=>{Y([]);let t=I.filter(e=>!("string"==typeof e.path&&e.path.length>0)).length;if(t>0){let e=1===t?"첨부 1건이 path 누락으로 누락됐습니다":"첨부 ".concat(t,"건이 path 누락으로 누락됐습니다");l.oR.warning(e),B((0,eI.$Q)("⚠ ".concat(e),r)),(0,m.cY)("webterm.terminal-chat.attach.dropped",{terminalId:r,droppedCount:t,totalCount:I.length})}e.length>0&&B((0,eI.tw)(e,r)),I.length>0&&B((0,eI.$Q)("\uD83D\uDCCE attached: ".concat(I.map(e=>e.filename).join(", ")),r));let n=e.trim();if(n||0!==I.length){N(!0);try{if(n.startsWith(":"))return void await K(n);if(!x)return void B((0,eI.$Q)("session 미설정",r));let e=H();if(!e)return void B((0,eI.$Q)("session 미설정",r));C(n);let t="assistant-".concat(Date.now(),"-").concat(Math.random().toString(36).slice(2,6));L.current=t,B({id:t,role:"assistant",text:"",timestamp:Date.now(),terminalId:r}),(0,m.cY)("webterm.terminal-chat.turn.start",{terminalId:r,sessionId:x,len:n.length,attachCount:I.length,placeholderId:t});let a=await e.send("terminal/repl/exec",{sessionId:x,terminalId:r,line:":agent ".concat(n),attachments:I});(null==a?void 0:a.agent)?(k(e=>e.map(e=>e.id===t?{...e,text:e.text&&e.text.length>=a.agent.markdown.length?e.text:a.agent.markdown,meta:{provider:a.agent.modelLabel,stopReason:a.agent.stopReason}}:e)),Q.current.flush()):(k(e=>e.filter(e=>e.id!==t)),B((0,eI.$Q)(eY(null==a?void 0:a.output),r))),(0,m.cY)("webterm.terminal-chat.turn.end",{terminalId:r,hasAgent:!!(null==a?void 0:a.agent)})}catch(n){let e=n instanceof Error?n.message:String(n),t=L.current;t&&k(e=>e.filter(e=>e.id!==t)),Q.current.cancel(),B((0,eI.$Q)("error: ".concat(e),r)),l.oR.error("terminal chat failed: ".concat(e))}finally{L.current=null,N(!1),C(null)}}},[B,H,K,I,x,r]);return((0,a.useEffect)(()=>{M.current=J},[J]),s)?(0,n.jsxs)("div",{className:"shrink-0 border-t border-border bg-background/95",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2 border-b border-border/80 px-3 py-2",children:[(0,n.jsxs)("div",{className:"flex min-w-0 flex-1 items-center gap-2",children:[(0,n.jsx)("span",{className:"inline-flex h-7 w-7 items-center justify-center rounded-md border border-primary/30 bg-primary/10 text-primary",children:(0,n.jsx)(eb.A,{className:"h-4 w-4"})}),(0,n.jsxs)("div",{className:"min-w-0",children:[(0,n.jsx)("div",{className:"truncate text-sm font-medium",children:"Terminal Chat Dock"}),(0,n.jsxs)("div",{className:"truncate text-[11px] text-muted-foreground",children:[r," \xb7 plain text = contextual agent turn \xb7 ",(0,n.jsx)("code",{className:"rounded bg-muted px-1",children:":commands"})," stay local"]})]})]}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[d&&(0,n.jsxs)("button",{type:"button",onClick:d.onToggle,disabled:d.disabled,title:d.disabled?"마이크 사용 불가 (insecure context 등)":d.phaseLabel,"data-elanous-action":"webterm-voice-toggle-dock","aria-pressed":d.active,className:(0,A.cn)("inline-flex h-7 items-center gap-1.5 rounded-md border px-2 text-[11px]",d.active?"border-rose-300 bg-rose-100 text-rose-800 dark:border-rose-700 dark:bg-rose-950/40 dark:text-rose-100":"border-border hover:bg-accent",d.disabled&&"cursor-not-allowed opacity-50"),children:[(0,n.jsx)("span",{className:(0,A.cn)("h-1.5 w-1.5 rounded-full",d.dotColor,("listening"===d.phase||"speaking"===d.phase)&&"animate-pulse"),"aria-hidden":"true"}),d.active?(0,n.jsx)(E.A,{className:"h-3.5 w-3.5"}):(0,n.jsx)(T.A,{className:"h-3.5 w-3.5"}),(0,n.jsx)("span",{className:"hidden sm:inline",children:d.phaseLabel})]}),d&&d.active&&F.supported&&(0,n.jsx)("button",{type:"button",onClick:()=>{O||Q.current.cancel(),$(e=>!e)},title:O?"음성 응답 켜기":"음성 응답 끄기","data-elanous-action":"webterm-tts-mute-toggle","aria-pressed":O,className:(0,A.cn)("inline-flex h-7 items-center justify-center rounded-md border px-2 text-[11px]",O?"border-border bg-muted text-muted-foreground":"border-fuchsia-300 bg-fuchsia-50 text-fuchsia-800 dark:border-fuchsia-700 dark:bg-fuchsia-950/40 dark:text-fuchsia-100"),children:O?(0,n.jsx)(ef.A,{className:"h-3.5 w-3.5"}):(0,n.jsx)(ex.A,{className:"h-3.5 w-3.5"})}),(0,n.jsx)(eN.Qh,{}),(0,n.jsx)(ek.r,{}),(0,n.jsx)(eS.D,{}),(0,n.jsx)(ej.Y,{}),S&&(0,n.jsxs)(V.$,{variant:"destructive",size:"sm",onClick:()=>void Z(),title:"abort active terminal-context agent turn",children:[(0,n.jsx)(eg.A,{className:"h-3.5 w-3.5"}),"Stop"]}),(0,n.jsxs)("div",{className:"relative",children:[(0,n.jsx)(V.$,{variant:"outline",size:"icon-sm",onClick:()=>D(e=>!e),"aria-label":"terminal quick commands",title:"terminal quick commands",children:(0,n.jsx)(P.A,{className:"h-3.5 w-3.5"})}),R&&(0,n.jsx)("div",{className:"absolute right-0 top-full z-40 mt-1 w-44 rounded-md border border-border bg-popover p-1 shadow-md",children:eA.map(e=>(0,n.jsx)("button",{type:"button",className:"block w-full rounded px-2 py-1 text-left font-mono text-[11px] hover:bg-accent",onClick:()=>{D(!1),J(e)},children:e},e))})]}),(0,n.jsxs)(V.$,{variant:o?"secondary":"outline",size:"sm",onClick:i,title:o?"hide command strip":"show command strip",children:[(0,n.jsx)(ev.A,{className:"h-3.5 w-3.5"}),o?"REPL on":"REPL off"]})]})]}),S&&(0,n.jsxs)("div",{className:"flex items-center gap-2 border-b border-border/70 px-3 py-2 text-[11px] text-muted-foreground",children:[(0,n.jsx)(U.A,{className:"h-3.5 w-3.5 animate-spin"}),(0,n.jsxs)("span",{className:"truncate",children:["terminal-context agent turn in progress",S.length>0?" \xb7 ".concat(S.slice(0,120)).concat(S.length>120?"…":""):""]})]}),(0,n.jsxs)("div",{className:(0,A.cn)("grid grid-rows-[1fr_auto]",void 0===p?"h-[clamp(160px,30vh,360px)] min-h-[200px]":void 0),...void 0===p?{}:{style:{height:p}},children:[(0,n.jsx)(ew.D,{messages:y,pending:j,tabId:"dock-".concat(r)}),(0,n.jsx)(ey.V,{onSubmit:J,disabled:j,attachments:I,onAttached:W,onRemoveAttachment:G,tabId:"dock-".concat(r),...d?{voice:d}:{}})]})]}):null});var eD=r(24206);let eM=/^100\.(6[4-9]|[7-9]\d|1[01]\d|12[0-7])\./;function ez(){if(!window.location)return{isSecure:!1,reason:"unknown",hostname:"",protocol:""};let e=function(e,t){let r="https:"===e,n="http:"===e;return"localhost"===t||"127.0.0.1"===t||"[::1]"===t||"::1"===t?{isSecure:!0,reason:"localhost",hostname:t,protocol:e}:r&&/\.ts\.net$/i.test(t)?{isSecure:!0,reason:"https-tsnet",hostname:t,protocol:e}:r?{isSecure:!0,reason:"https-other",hostname:t,protocol:e}:n&&eM.test(t)?{isSecure:!1,reason:"http-tailscale",hostname:t,protocol:e,guidance:"Tailscale 100.x 주소는 HTTP라 마이크 권한이 차단됩니다. `tailscale serve` 또는 funnel 로 ts.net HTTPS 호스트를 노출하면 마이크가 동작합니다."}:n?{isSecure:!1,reason:"http-other",hostname:t,protocol:e,guidance:"브라우저는 HTTP origin 에서 마이크 접근을 차단합니다. HTTPS 로 접속하거나 localhost 로 옮기세요."}:{isSecure:!1,reason:"unknown",hostname:t,protocol:e}}(window.location.protocol,window.location.hostname);return e.isSecure&&!1===window.isSecureContext?{...e,isSecure:!1,reason:"unknown",guidance:"현재 origin 이 secure context 가 아닙니다 (브라우저 판정). HTTPS 로 접속하세요."}:e}let eP="elanous.webterm.voiceBanner.dismissed",eU={isSecure:!1,reason:"unknown",hostname:"",protocol:""};function eL(){var e;let{statusOverride:t}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},[r,l]=(0,a.useState)(!1),[s,o]=(0,a.useState)(null!=t?t:eU);if((0,a.useEffect)(()=>{l(function(){try{return"1"===window.sessionStorage.getItem(eP)}catch(e){return!1}}()),o(null!=t?t:ez())},[t]),s.isSecure||r)return null;let i="http-tailscale"===s.reason?"\uD83C\uDF99 Tailscale HTTP 에서 마이크가 차단됩니다":"\uD83C\uDF99 마이크 사용을 위해 HTTPS 가 필요합니다";return(0,n.jsxs)("div",{role:"alert","aria-live":"polite","data-testid":"webterm-voice-banner","data-reason":s.reason,className:"flex items-start gap-2 border-b border-amber-300 bg-amber-50 px-3 py-2 text-[12px] text-amber-900 dark:border-amber-700 dark:bg-amber-950/40 dark:text-amber-100",children:[(0,n.jsx)(eD.A,{className:"mt-[1px] h-3.5 w-3.5 shrink-0","aria-hidden":"true"}),(0,n.jsxs)("div",{className:"flex-1",children:[(0,n.jsx)("div",{className:"font-medium",children:i}),(0,n.jsx)("div",{className:"mt-0.5 text-amber-800/90 dark:text-amber-200/80",children:null!=(e=s.guidance)?e:"브라우저는 secure context (HTTPS \xb7 localhost) 에서만 마이크를 허용합니다."}),"http-tailscale"===s.reason&&(0,n.jsxs)("div",{className:"mt-1 font-mono text-[11px] text-amber-700 dark:text-amber-200/90",children:[(0,n.jsx)("code",{children:"tailscale serve --bg --https=443 31415"})," ","or"," ",(0,n.jsx)("a",{href:"https://tailscale.com/kb/1242/tailscale-serve",target:"_blank",rel:"noopener noreferrer",className:"underline hover:text-amber-900 dark:hover:text-amber-50",children:"ts.net HTTPS 가이드"})]})]}),(0,n.jsx)("button",{type:"button",onClick:()=>{try{window.sessionStorage.setItem(eP,"1")}catch(e){}l(!0)},"aria-label":"dismiss banner",title:"이 세션 동안 숨기기",className:"rounded p-0.5 text-amber-700 hover:bg-amber-100 dark:text-amber-200 dark:hover:bg-amber-900/40",children:(0,n.jsx)(L.A,{className:"h-3.5 w-3.5"})})]})}async function eO(e){var t;let{acp:r,sessionId:n,terminalId:a,paths:l}=e,s=null==(t=e.alsoCopyToClipboard)||t,o=l.filter(e=>"string"==typeof e&&e.length>0).map(e=>"'".concat(e.replace(/'/g,"'\\''"),"'")).join(" ");if(!o)return{injected:!1,copied:!1};let i="".concat(o," "),c=!1;try{await r.send("terminal/input",{sessionId:n,terminalId:a,data:i,peerId:f()}),c=!0,(0,m.cY)("webterm.attach.inject.ok",{terminalId:a,pathCount:l.length,bytes:i.length})}catch(e){(0,m.cY)("webterm.attach.inject.error",{terminalId:a,reason:String(e)})}let d=!1;if(s&&"undefined"!=typeof navigator&&navigator.clipboard)try{await navigator.clipboard.writeText(o),d=!0,(0,m.cY)("webterm.attach.clipboard.ok",{pathCount:l.length})}catch(e){(0,m.cY)("webterm.attach.clipboard.skip",{reason:String(e)})}return{injected:c,copied:d}}var e$=r(73455),eF=r(40798),eQ=r(13659),e_=r(67388);function eB(e){return e.length<=32?e:"…".concat(e.slice(-32))}function eH(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now();if("number"!=typeof e||!Number.isFinite(e)||!Number.isFinite(t)||e>t)return null;let r=new Date(e);return Number.isFinite(r.getTime())?(0,e_.KW)(r.toISOString(),t):null}let eq=["terminal","observe","pty-list"],eV="elanous.webterm.activeId",eW="elanous.webterm.panelsMinimized",eG="elanous.webterm.chatDockOpen",eK="elanous.webterm.replOpen";function eZ(e){return e.sourceRoot?{sourceRoot:e.sourceRoot.dbPath}:{}}function eJ(e){let{layout:t,sessionId:r,onForeignInputActivity:a,terminalIds:l,activeId:s=null,visible:o=!0}=e,i=t.layouts.flatMap(e=>e.slots),c=new Map(i.map(e=>[e.terminalId,e])),d=new Set(t.layouts.map(e=>{var t;return null==(t=e.slots[0])?void 0:t.terminalId}).filter(e=>!!e)),u=void 0===l?i.map(e=>e.terminalId):[...new Set([...l,...s?[s]:[],...i.map(e=>e.terminalId)])],m=new Set(i.length>0?i.map(e=>e.terminalId):s?[s]:[]);return(0,n.jsxs)("div",{className:o?"grid h-full min-h-0 grid-cols-2 gap-2 p-2":"hidden","aria-label":"런별 터미널 배치",children:[t.layouts.map(e=>{let{runId:t}=e;return(0,n.jsx)("section",{className:"sr-only","aria-label":"런 ".concat(t," 터미널")},t)}),u.map(e=>{var t;let l=c.get(e),i=o&&m.has(e),u=null!=(t=null==l?void 0:l.position)?t:e===s?"single":"inactive-tab";return(0,n.jsxs)("div",{className:i?"".concat(d.has(e)?"col-start-1 ":"").concat((null==l?void 0:l.position)==="split"?"min-h-0 border border-emerald-600":(null==l?void 0:l.position)==="tab"?"min-h-0 border border-zinc-700":"col-span-2 h-full min-h-0"):"hidden","data-pane-position":u,"data-terminal-id":e,children:[l&&(0,n.jsxs)("p",{className:"sr-only",children:["split"===l.position?"분할 터미널":"탭 터미널",": ",e]}),(0,n.jsx)(j,{sessionId:r,terminalId:e,onForeignInputActivity:a},e)]},e)}),t.unknown.map(e=>{let{id:t,reason:r}=e;return(0,n.jsxs)("p",{className:"text-xs text-muted-foreground","data-terminal-id":t,"data-pane-relationship":r,children:["터미널 ",t,": 관계를 알 수 없어 배치하지 않았습니다."]},t)})]})}function eX(){var e,t,r;let{initialPtyId:s=null,onPtySelection:o}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},{client:i,config:c,sessionId:d}=(0,u.Q)(),{isCoarsePointer:p}=function(){let[e,t]=(0,a.useState)(!1);return(0,a.useEffect)(()=>{if(!window.matchMedia)return;let e=window.matchMedia("(pointer: coarse)");t(e.matches);let r=e=>{t(e.matches)};return"function"==typeof e.addEventListener?(e.addEventListener("change",r),()=>e.removeEventListener("change",r)):"function"==typeof e.addListener?(e.addListener(r),()=>e.removeListener(r)):void 0},[]),{isCoarsePointer:e}}(),[h,b]=(0,a.useState)(null),[x,g]=(0,a.useState)([]),[v,w]=(0,a.useState)(null),y=(0,a.useRef)(null),[k,j]=(0,a.useState)({status:"pending"}),S=function(e,t){let r="ready"===e.status&&"local"===e.issuedBy&&"restored-tab"!==e.fallbackReason,n="ready"===e.status&&e.fallbackReason?e.fallbackReason:"사유 미상";return{placeholder:t?null:"pending"===e.status?"터미널 이름을 준비하는 중…":"터미널 이름을 로컬에서 정했습니다 (".concat(n,")."),fallbackBanner:r?"터미널 이름을 로컬에서 정했습니다 (".concat(n,"). 데몬 발급을 확인하지 못했습니다."):null}}(k,null!==h),C=(0,a.useCallback)(e=>{j(e),"pending"===e.status&&b(null)},[]),E=(0,a.useRef)(!1),T=(0,a.useRef)(!1),[A,Y]=(0,a.useState)("terminal"),R={view:A,buttons:eq.map(e=>({view:e,selected:e===A}))},D=(0,a.useCallback)(e=>{Y(t=>"observe"===e&&"observe"===t?"terminal":e)},[]),[M,P]=(0,a.useState)(!1),[U,L]=(0,a.useState)([]),[O,$]=(0,a.useState)(),[F,Q]=(0,a.useState)(new Map),[_,B]=(0,a.useState)("loading"),[H,q]=(0,a.useState)(null),[V,W]=(0,a.useState)(null),G=(0,a.useRef)(!1),K=null!=(r=null==H?void 0:H.id)?r:null,Z=H?(0,eQ.x3)(H):null,[J,X]=(0,a.useState)("raw"),[ee,et]=(0,a.useState)(new Map),[er,en]=(0,a.useState)(new Map),[ea,el]=(0,a.useState)({status:"unrequested"}),eo=(0,a.useRef)(0),ei=(0,a.useRef)(0),ec=(0,a.useRef)(null);(0,a.useEffect)(()=>()=>{try{var e;null==(e=ec.current)||e.close()}catch(e){}ec.current=null},[]),(0,a.useEffect)(()=>{if("terminal"!==A&&"pty-list"!==A)return;let e=!1;return B("loading"),(async()=>{try{let[t,r]=await Promise.all([i.listTerminals((0,eQ.tC)(M)),i.listProgressFrames().catch(e=>((0,m.cY)("webterm.pty-list.progress.error",{reason:String(e)}),null))]);if(e)return;L((0,eQ.xu)(t.terminals)),$(t.scope),Q(r?(0,eQ.gA)(r.logs):new Map),B("idle")}catch(t){if(e)return;L([]),$(void 0),Q(new Map),B("error"),(0,m.cY)("webterm.pty-list.error",{reason:String(t)})}})(),()=>{e=!0}},[i,M,A]),(0,a.useEffect)(()=>{null===Z||U.some(e=>(0,eQ.x3)(e)===Z)||(eo.current+=1,ei.current+=1,q(null),el({status:"unrequested"}))},[U,Z]);let eu=(0,a.useCallback)((e,t)=>{let{id:r}=e,n=(0,eQ.x3)(e),a=++eo.current;if("raw"===t){et(e=>new Map(e).set(n,{status:"loading"})),i.fetchTerminalScrollback(e.id,100,eZ(e)).then(e=>{eo.current===a&&e.id===r&&et(t=>new Map(t).set(n,{status:"ready",scrollback:e.scrollback}))}).catch(e=>{eo.current===a&&(et(e=>new Map(e).set(n,{status:"error"})),(0,m.cY)("webterm.pty-list.scrollback.error",{id:r,reason:String(e)}))});return}en(e=>new Map(e).set(n,{status:"loading"})),i.fetchTerminalFrame(e.id,eZ(e)).then(e=>{eo.current===a&&e.id===r&&en(t=>new Map(t).set(n,{status:"ready",frame:e.frame,frameAt:e.frameAt,frameSource:e.frameSource}))}).catch(e=>{eo.current===a&&(en(e=>new Map(e).set(n,{status:"error"})),(0,m.cY)("webterm.pty-list.frame.error",{id:r,reason:String(e)}))})},[i]),ep=(0,a.useCallback)(function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],{id:r}=e;if(t&&(y.current=e,w(e=>{var t;return{id:r,nonce:(null!=(t=null==e?void 0:e.nonce)?t:0)+1}})),Z===(0,eQ.x3)(e))return;let n=++ei.current;q(e),el({status:"loading"}),eu(e,J),i.fetchTerminalLineage(r).then(e=>{ei.current===n&&e.key===r&&el({status:"ready",lineage:e})}).catch(e=>{ei.current===n&&(el({status:"error"}),(0,m.cY)("webterm.pty-list.lineage.error",{id:r,reason:String(e)}))})},[i,o,J,eu,Z]);(0,a.useEffect)(()=>{if(G.current||"loading"===_||(G.current=!0,!s))return;if("error"===_){W({kind:"list-unavailable"}),(0,m.cY)("webterm.initial-pty-selection",{ptyId:s,kind:"list-unavailable",reason:"pty-list-error"});return}let e=(0,eQ.hH)(s,U);W(e),(0,m.cY)("webterm.initial-pty-selection",{ptyId:s,kind:e.kind,reason:e.reason}),"selected"===e.kind&&ep(e.terminal)},[ep,s,_,U]);let eb=(0,a.useCallback)(e=>{e!==J&&(X(e),H&&eu(H,e))},[J,eu,H]),ef=(0,a.useCallback)(async e=>{var t;let r=window.prompt("새 PTY 이름을 입력하세요.",null!=(t=e.nickname)?t:"");if(null!==r)try{let t=await i.renameTerminal(e.id,r),n=function(e){switch(e.status){case"success":return"PTY 이름을 '".concat(e.name,"'(으)로 바꿨습니다.");case"invalid-name":return"이 이름은 사용할 수 없습니다. 다른 이름을 입력해 주세요.";case"unknown-pty":return"이 PTY를 찾을 수 없습니다. 목록을 새로고침한 뒤 다시 시도해 주세요.";case"denied":return"이 PTY의 이름을 바꿀 권한이 없습니다.";case"failed":return"PTY 이름 변경에 실패했습니다. 잠시 후 다시 시도해 주세요.";case"owner-unreachable":return"PTY 소유 프로세스에 연결할 수 없어 이름을 바꾸지 못했습니다.";default:return e}}(t);"success"===t.status?l.oR.success(n):l.oR.error(n)}catch(e){l.oR.error("PTY 이름 변경 요청에 실패했습니다: ".concat(String(e)))}},[i]),ex=(0,a.useMemo)(()=>(0,eQ.lH)(M,U,O,Z,ee,J,er),[er,M,U,O,J,ee,Z]),eg=(0,a.useMemo)(()=>(0,eQ.Kh)(K,ea),[ea,K]),ev=(0,a.useMemo)(()=>{var e;return function(e,t){let r=t.trim();return r?{layouts:e.layouts.filter(e=>{let{slots:t}=e;return t.some(e=>e.terminalId===r)}).map(e=>({runId:e.runId,slots:e.slots.map(e=>({...e}))})),unknown:e.unknown.map(e=>({...e}))}:{layouts:[],unknown:e.unknown.map(e=>({...e}))}}({layouts:(e=function(e){let t=new Map,r=new Set;for(let l of e){var n,a;let e=null==(n=l.runId)?void 0:n.trim();if(!e){r.add(l.id);continue}let s=null!=(a=t.get(e))?a:[];s.push(l),t.set(e,s)}let l=[];for(let[e,n]of t){let t=function(e){let t=e.filter(e=>e.alive&&Number.isFinite(e.startedAt));if(0===t.length)return;let r=Math.max(...t.map(e=>{let{startedAt:t}=e;return t})),n=t.filter(e=>{let{startedAt:t}=e;return t===r});return 1===n.length?n[0]:void 0}(n);if(!t){for(let e of n)r.add(e.id);continue}l.push({runId:e,split:t.id,tabs:n.filter(e=>e.id!==t.id).map(e=>{let{id:t}=e;return t})})}let s=new Set(l.flatMap(e=>{let{split:t,tabs:r}=e;return[t,...r]}));return{layouts:l,unknown:e.filter(e=>{let{id:t}=e;return r.has(t)&&!s.has(t)}).map(e=>{let{id:t}=e;return{id:t,reason:"relationship-unavailable"}})}}(U)).layouts.map(e=>{let{runId:t,split:r,tabs:n}=e;return{runId:t,slots:[{terminalId:r,position:"split"},...n.map(e=>({terminalId:e,position:"tab"}))]}}),unknown:e.unknown.map(e=>({...e}))},null!=h?h:"")},[U,h]);(0,a.useEffect)(()=>{if(E.current||"loading"===_)return;if(0===U.length){T.current||(T.current=!0,(0,m.cY)("webterm.initial-selection",{skipped:!0,reason:"no-terminals",listState:_}));return}E.current=!0;let e=(0,eQ.Dw)({storedId:null,fallbackId:h,terminals:U});(0,m.cY)("webterm.initial-selection",{terminalId:e.terminalId,reason:e.reason,rowCount:U.length}),e.terminalId!==h&&b(e.terminalId)},[U,_]);let[ew,ey]=(0,a.useState)(0),[ek,ej]=(0,a.useState)(!1),[eN,eS]=(0,a.useState)(!0),[eC,eI]=(0,a.useState)(!1),[eE,eT]=(0,a.useState)(!1),[eA,eY]=(0,a.useState)(0),[eD,eM]=(0,a.useState)(null),eP=(0,a.useCallback)(e=>{eM({intent:e,nonce:Date.now()})},[]),eU=(0,a.useRef)(null),e_=(0,a.useCallback)(e=>{var t;null==(t=eU.current)||t.appendMirrored(e)},[]),[eX,e0]=(0,a.useState)("none"),e1=(0,a.useRef)(eX);e1.current=eX;let e2=(0,a.useRef)(h);e2.current=h;let e3=(0,a.useRef)(d);e3.current=d;let e5=(0,a.useCallback)(e=>{let t=e.trim();if(!t)return;let r=e1.current;if("controls"===r){let e=e3.current,r=e2.current;if(!e)return;ec.current||(ec.current=i.connectAcp({sessionId:e})),ec.current.send("terminal/input",{sessionId:e,terminalId:r,data:t+" ",peerId:f()}).catch(e=>{(0,m.cY)("webterm.voice.stdin-inject.error",{reason:String(e)})}),(0,m.cY)("webterm.voice.stdin-inject",{len:t.length,terminalId:r})}else if("dock"===r){var n;null==(n=eU.current)||n.submitVoiceTranscript(t)}else(0,m.cY)("webterm.voice.transcript-no-source",{len:t.length})},[i]),e4=i.voiceWsUrl(),e7=(0,e$.sS)({wsUrl:e4,...c.token?{token:c.token}:{},onTranscript:e5}),e8=(0,a.useMemo)(()=>ez(),[]),e6=!c.baseUrl||!e8.isSecure,e9=(0,a.useCallback)(()=>{e7.active&&"dock"===eX?(e0("none"),e7.toggle()):(e0("dock"),e7.active||e7.toggle())},[e7,eX]),te=(0,a.useCallback)(()=>{e7.active&&"controls"===eX?(e0("none"),e7.toggle()):(e0("controls"),e7.active||e7.toggle())},[e7,eX]),tt=(0,a.useMemo)(()=>({active:e7.active&&"dock"===eX,phase:e7.phase,dotColor:eF.x[e7.phase],phaseLabel:eF.g[e7.phase],disabled:e6,onToggle:e9}),[e7.active,e7.phase,eX,e6,e9]),tr=(0,a.useMemo)(()=>({active:e7.active&&"controls"===eX,phase:e7.phase,dotColor:eF.x[e7.phase],phaseLabel:eF.g[e7.phase],disabled:e6,onToggle:te}),[e7.active,e7.phase,eX,e6,te]),tn=(0,a.useRef)(e9);tn.current=e9,(0,a.useEffect)(()=>{let e=e=>{"m"===e.key.toLowerCase()&&e.shiftKey&&(e.metaKey||e.ctrlKey)&&(e.preventDefault(),(0,m.cY)("webterm.voice.shortcut.toggle"),eS(!0),tn.current())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]),(0,a.useEffect)(()=>{let e=window.localStorage.getItem(eV);e&&e.length>0&&(b(e),E.current=!0),"1"===window.localStorage.getItem(eW)&&ej(!0),"0"===window.localStorage.getItem(eG)&&eS(!1),"1"===window.localStorage.getItem(eK)&&eI(!0)},[]);let ta=(0,a.useCallback)(async e=>{if(!d||!h||0===e.length)return;let t=e.map(e=>e.path).filter(e=>"string"==typeof e&&e.length>0);if(0===t.length)return void(0,m.cY)("webterm.attach.no-path",{count:e.length});ec.current||(ec.current=i.connectAcp({sessionId:d}));let r=await eO({acp:ec.current,sessionId:d,terminalId:h,paths:t});if(r.injected){let e=1===t.length?"터미널에 path 첨부됨":"".concat(t.length," paths 터미널에 첨부됨"),n=r.copied?" \xb7 clipboard 도 복사":"";l.oR.success(e+n)}else l.oR.error("터미널 inject 실패 — 직접 paste 해주세요")},[i,d,h]);return(0,n.jsxs)("div",{className:"flex h-full flex-col",children:[(0,n.jsx)(N.ZO,{activeId:h,onActiveChange:e=>{b(e);let t=y.current;(null==t?void 0:t.id)===e&&(y.current=null,null==o||o(t)),window.localStorage.setItem(eV,e)},onInitialTerminalState:C,minimized:ek,onToggleMinimize:()=>{ej(e=>{let t=!e;return window.localStorage.setItem(eW,t?"1":"0"),t})},recording:eE,peerCount:eA,chatDockOpen:eN,onToggleChatDock:()=>{if(ek){ej(!1),window.localStorage.setItem(eW,"0"),eS(!0),window.localStorage.setItem(eG,"1");return}eS(e=>{let t=!e;return window.localStorage.setItem(eG,t?"1":"0"),requestAnimationFrame(()=>{window.dispatchEvent(new Event("resize"))}),t})},tabIntent:eD,ptyTabSelection:v,onTabsChange:g}),S.fallbackBanner&&(0,n.jsx)("p",{className:"border-b border-amber-700/50 bg-amber-950/30 px-3 py-1 text-xs text-amber-200",role:"status",children:S.fallbackBanner}),(0,n.jsx)(eL,{}),(0,n.jsxs)("div",{className:ek?"hidden":"flex items-center gap-2 border-b border-zinc-800 px-3 py-1",children:[(0,n.jsx)("button",{type:"button","aria-pressed":R.buttons[0].selected,onClick:()=>D("terminal"),className:"rounded px-2 py-1 text-xs ".concat(R.buttons[0].selected?"bg-emerald-700 text-white":"bg-zinc-800 text-zinc-300 hover:bg-zinc-700"),children:"터미널"}),(0,n.jsxs)("button",{type:"button","aria-pressed":R.buttons[1].selected,onClick:()=>D("observe"),className:"rounded px-2 py-1 text-xs ".concat(R.buttons[1].selected?"bg-emerald-700 text-white":"bg-zinc-800 text-zinc-300 hover:bg-zinc-700"),title:"자기신고하는 elanous 대시보드 TUI 를 라이브로 관측(읽기 전용)",children:["\uD83D\uDDA5 TUI 관측 ",R.buttons[1].selected?"ON":"OFF"]}),(0,n.jsx)("button",{type:"button","aria-pressed":R.buttons[2].selected,onClick:()=>D("pty-list"),className:"rounded px-2 py-1 text-xs ".concat(R.buttons[2].selected?"bg-emerald-700 text-white":"bg-zinc-800 text-zinc-300 hover:bg-zinc-700"),children:"PTY 목록"})]}),h?(0,n.jsxs)("div",{className:ek||"terminal"!==A?"hidden":"contents",children:[(0,n.jsx)(em,{foreignActivityTick:ew,onPeerCountChange:eY}),(0,n.jsx)(z,{terminalId:h,onClear:()=>{},onRecordingChange:eT,onAttached:ta,voice:tr}),eC&&(0,n.jsx)(es,{terminalId:h,onTabIntent:eP,onMirror:e_}),p&&(0,n.jsx)(ed,{terminalId:h}),(0,n.jsx)(eh,{onAttached:ta})]}):null,(0,n.jsxs)("div",{className:"flex-1 min-h-0",children:[(0,n.jsx)(eJ,{layout:ev,sessionId:d,terminalIds:x,activeId:h,visible:null!==h&&"terminal"===A,onForeignInputActivity:()=>ey(e=>e+1)}),h?"pty-list"===A?(0,n.jsxs)("div",{className:"h-full overflow-auto p-3","aria-label":"데몬 PTY 목록",children:[(0,n.jsxs)("label",{className:"mb-3 flex items-center gap-2 text-sm",children:[(0,n.jsx)("input",{type:"checkbox",checked:ex.includeAll,onChange:e=>P(e.target.checked)}),"다른 인스턴스도 보기"]}),ex.scopeSummary&&(0,n.jsx)("p",{className:"mb-3 text-xs text-muted-foreground","aria-label":"PTY 목록 범위 요약",children:ex.scopeSummary}),(null==V?void 0:V.kind)==="ambiguous"&&(0,n.jsxs)("p",{className:"mb-3 text-xs text-amber-500",role:"status","aria-label":"URL PTY 선택 상태",children:["주소의 PTY ",s,"가 ",V.candidates.length,"개 행과 맞아 선택하지 않았습니다."]}),(null==V?void 0:V.kind)==="list-unavailable"&&(0,n.jsxs)("p",{className:"mb-3 text-xs text-rose-500",role:"status","aria-label":"URL PTY 선택 상태",children:["PTY 목록을 읽지 못해 주소의 PTY ",s,"를 확인할 수 없습니다. 목록이 비었다는 뜻이 \xab아닙니다\xbb."]}),(null==V?void 0:V.kind)==="not-found"&&(0,n.jsxs)("p",{className:"mb-3 text-xs text-rose-500",role:"status","aria-label":"URL PTY 선택 상태",children:["주소의 PTY ",s,"를 찾지 못했습니다 (",V.reason,")."]}),(null==(t=ex.rows.find(e=>e.view))||null==(e=t.view)?void 0:e.visible)&&(0,n.jsx)("div",{className:"mb-3 flex gap-2","aria-label":"PTY 화면 보기",children:ex.rows.find(e=>e.view).view.modes.map(e=>(0,n.jsx)("button",{type:"button","aria-pressed":e.selected,onClick:()=>eb(e.mode),className:"rounded px-2 py-1 text-xs ".concat(e.selected?"bg-emerald-700 text-white":"bg-zinc-800 text-zinc-300 hover:bg-zinc-700"),children:e.label},e.mode))}),"loading"===_?(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"PTY 목록을 불러오는 중…"}):"error"===_?(0,n.jsx)("p",{className:"text-sm text-rose-500",children:"PTY 목록을 불러오지 못했습니다."}):0===U.length?(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"데몬이 아는 PTY가 없습니다."}):(0,n.jsx)("ul",{className:"space-y-2",children:ex.rows.map(e=>{let{terminal:t}=e,r=function(e){var t,r,n;let a=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),l=e.name||e.id,s=function(e,t,r){let n=[e,t].filter(Boolean).join("/")||r;if(!n||!e||n.length<=32)return n&&eB(n);if(!t)return e.length<=32?e:"…".concat(e.slice(-31));let a=32-e.length-2;return a<=0?e.length<=32?e:"…".concat(e.slice(-31)):"".concat(e,"/…").concat(t.slice(-a))}(e.treeName,e.worktreeName,e.workdir),o=function(e){var t;if(!(null==e?void 0:e.name)&&!(null==e?void 0:e.dbPath))return null;let r=[e.name&&eB(e.name),e.dbPath&&((t=e.dbPath).length<=32?t:"".concat(t.slice(0,31),"…"))].filter(e=>!!e);return"세션: ".concat(r.join(" \xb7 "))}(e.sourceRoot),i=eH(e.startedAt,a),c=void 0===e.lastControlAt?null:eH(e.lastControlAt,a);return{title:l,details:[...l===e.id?[]:[e.id],...e.status?["상태: ".concat(e.status)]:[],...e.kind?["종류: ".concat(e.kind)]:[],...e.nickname?["별명: ".concat(eB(e.nickname))]:[],...s?["위치: ".concat(s)]:[],e.alive?"생존: 실행 중":0===e.exitCode?"종료: 정상 종료 (exit 0)":"number"==typeof e.exitCode?"종료: 비정상 종료 (exit ".concat(e.exitCode,")"):"종료: 종료 코드 미상",function(e){if("direct-human"===e.terminalOriginCategory)return"출처: 사람";if("elanous"===e.terminalOriginCategory)return"출처: elanous";if("external-tool"===e.terminalOriginCategory)return e.externalToolName?"출처: 외부 도구 \xb7 ".concat(eB(e.externalToolName)):"출처: 외부 도구";let t=e.terminalOriginReason?" \xb7 ".concat(eB(e.terminalOriginReason)):"";return"출처: 이 행에서는 알 수 없음".concat(t)}(e),...e.controller?["통제: ".concat(eB(e.controller))]:[],"write"===(t=e.accessMode)?"접근: 쓰기":"read"===t?"접근: 읽기":"auto"===t?"접근: 자동":"접근: 이 행에서는 알 수 없음","running"===(r=e.ownerRunUsage)?"소유 런: 실행 중":"terminated-live-owner"===r?"소유 런: 종료됐지만 터미널 유지":"no-run-id"===r?"소유 런: 소유 런 정보 없음":"소유 런: 이 행에서는 알 수 없음",...e.instance?["우주: ".concat(eB(e.instance))]:[],...e.runId?["런: ".concat((n=e.runId).length<=8?n:"".concat(n.slice(0,8),"…"))]:[],...o?[o]:[],...i?["시작: ".concat(i)]:[],"마지막 제어: ".concat(null!=c?c:"이 행에서는 알 수 없음")]}}(t),a=F.get(t.id);return(0,n.jsxs)("li",{className:"rounded border p-2 text-sm ".concat(e.selected?"border-emerald-500":"border-border"),children:[(0,n.jsxs)("button",{type:"button",className:"w-full text-left","aria-pressed":e.selected,onClick:()=>ep(t,!0),children:[(0,n.jsx)("p",{className:"font-medium",children:r.title}),r.details.map((e,r)=>(0,n.jsx)("p",{className:0===r?"font-mono text-xs text-muted-foreground":"text-xs text-muted-foreground",children:e},"".concat(t.id,"-").concat(e))),a&&(0,n.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground","aria-label":"현재 활동: ".concat("complete"===a.status?"완료":"진행 중"),children:["complete"===a.status?"완료":"진행 중",": ",a.line,a.hasMissingFrames?" \xb7 일부 진행 프레임 누락":""]})]}),(0,n.jsx)("button",{type:"button",className:"mt-2 rounded bg-zinc-800 px-2 py-1 text-xs text-zinc-100 hover:bg-zinc-700",onClick:()=>{ef(t)},children:"이름 바꾸기"}),e.selected&&eg&&(0,n.jsxs)("section",{className:"mt-2 rounded bg-zinc-900 p-2 text-xs","aria-label":"선택 PTY 계보",children:[(0,n.jsx)("p",{className:"font-medium",children:"계보"}),"loading"===eg.kind&&(0,n.jsx)("p",{className:"text-muted-foreground",children:"계보를 불러오는 중…"}),"error"===eg.kind&&(0,n.jsx)("p",{className:"text-rose-400",children:"계보를 불러오지 못했습니다."}),"empty"===eg.kind&&(0,n.jsx)("p",{className:"text-muted-foreground",children:"연결된 다른 화면이 없습니다."}),eg.unreadablePayloadsSummary&&(0,n.jsx)("p",{className:"text-muted-foreground",children:eg.unreadablePayloadsSummary}),eg.groups.map(e=>(0,n.jsxs)("div",{className:"mt-2",children:[(0,n.jsxs)("p",{className:"font-mono",children:["묶음: ",e.joinedBy," \xb7 ",e.key]}),(0,n.jsx)("ul",{className:"mt-1 space-y-1",children:e.rows.map(e=>(0,n.jsxs)("li",{className:e.selected?"rounded bg-emerald-900 px-1 text-emerald-100":"",children:[e.selected?"현재 선택 \xb7 ":"",e.ptyId," \xb7 ",e.kind," \xb7 ",e.instance," \xb7 ",(0,eQ.cl)(e.alive,e.closed)," \xb7 시작 ",(0,eQ.OZ)(e.startedAt)]},e.ptyId))})]},"".concat(e.joinedBy,"-").concat(e.key)))]}),e.view&&(0,n.jsxs)("div",{className:"mt-2",children:[e.view.display.frameInfo&&(0,n.jsx)("p",{className:"mb-1 font-mono text-xs text-muted-foreground","aria-label":"렌더 화면 정보",children:e.view.display.frameInfo}),e.view.display.frameMetadata&&(0,n.jsxs)("p",{className:"mb-1 text-xs text-muted-foreground","aria-label":"렌더 프레임 메타데이터",children:["관측: ",e.view.display.frameMetadata.frameAt," \xb7 출처: ",e.view.display.frameMetadata.frameSource]}),(0,n.jsx)("pre",{className:"whitespace-pre-wrap rounded bg-zinc-950 p-2 text-xs ".concat("error"===e.view.display.kind?"text-rose-400":"text-zinc-100"),children:e.view.display.text})]})]},t.id)})})]}):"observe"===A?(0,n.jsx)(I,{sessionId:d},d):null:(0,n.jsxs)("div",{className:"flex h-full flex-col items-center justify-center gap-2 text-sm text-muted-foreground",role:"status","aria-live":"polite",children:[(null==V?void 0:V.kind)==="list-unavailable"&&(0,n.jsxs)("p",{className:"text-xs text-rose-500","aria-label":"URL PTY 선택 상태",children:["PTY 목록을 읽지 못해 주소의 PTY ",s,"를 확인할 수 없습니다. 목록이 비었다는 뜻이 \xab아닙니다\xbb."]}),(0,n.jsx)("span",{children:S.placeholder})]})]}),h&&!ek&&"pty-list"!==A&&(0,n.jsx)(eR,{ref:eU,terminalId:h,open:eN,replOpen:eC,onToggleRepl:()=>{eI(e=>{let t=!e;return window.localStorage.setItem(eK,t?"1":"0"),requestAnimationFrame(()=>{window.dispatchEvent(new Event("resize"))}),t})},voice:tt})]})}}}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3787,6815,9492],{89440:()=>{}},_=>{_.O(0,[9096,1380,7358],()=>_(_.s=89440)),_N_E=_.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2922],{36953:(e,t,s)=>{Promise.resolve().then(s.bind(s,80147))},48774:(e,t,s)=>{"use strict";s.d(t,{NE:()=>i,Yt:()=>l});let r=["task","goal-loop","single-shot"],n=["scheduler","monitor-trigger"];function a(e){var t,s,a,l,i,o,d;let c=e.autopilot,u=null!=(t=null==c?void 0:c.executionModel)?t:null;return{id:e.id,goal:e.title||e.description||e.id,source:null!=(s=null==c?void 0:c.origin)?s:"human",status:null!=(a=null==c?void 0:c.apmStatus)?a:e.status,model:u,tier:null!=(l=null==c?void 0:c.tier)?l:null,engine:null!=(i=null==c?void 0:c.engine)?i:null,kind:(d=null!=(o=null==c?void 0:c.executionModel)?o:null)&&r.includes(d)?"finite":d&&n.includes(d)?"continuous":"other",reviewDue:!1,createdAt:new Date(e.createdAt).toISOString(),isAutopilot:null!=c,toxStatus:e.status,taskCount:e.taskCount,taskCounts:e.taskStatusCounts}}class l{async triagePreview(e,t){return this.client.fetchJson("/v1/autopilot/triage-preview",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({goal:e,...t?{category:t}:{}})})}async commitMission(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"intake",s=arguments.length>2?arguments[2]:void 0;return this.client.fetchJson("/v1/autopilot/triage-preview",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({goal:e,commit:!0,source:t,...s?{category:s}:{}})})}async missions(e,t){let s=new URLSearchParams({...e?{status:e}:{},...t?{source:t}:{}}).toString();return this.client.fetchJson("/v1/autopilot/missions".concat(s?"?".concat(s):""))}async missionsUnified(e){var t,s;let r=new URLSearchParams({...e?{status:e}:{}}).toString(),n=await this.client.fetchJson("/v1/missions".concat(r?"?".concat(r):"")),l=null!=(t=n.missions)?t:[];return{ok:!0,total:null!=(s=n.total)?s:l.length,missions:l.map(a)}}async trace(e){return this.client.fetchJson("/v1/autopilot/trace?id=".concat(encodeURIComponent(e)))}async missionArcMap(){var e,t,s;let r=await this.client.fetchJson("/v1/missions"),n=new Map;for(let a of null!=(e=r.missions)?e:[]){let e=null==(t=a.autopilot)?void 0:t.arcs;e&&e.length>0&&n.set(a.id,{apmStatus:null==(s=a.autopilot)?void 0:s.apmStatus,arcs:e})}return n}async missionAction(e,t){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.client.fetchJson("/v1/autopilot/mission-action",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:e,action:t,...s})})}async repoWatch(){return this.client.fetchJson("/v1/autopilot/repo-watch")}async autonomy(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:50,t=arguments.length>1?arguments[1]:void 0,s=new URLSearchParams({limit:String(e),...t?{loop:t}:{}});return this.client.fetchJson("/v1/autopilot/autonomy?".concat(s.toString()))}async arming(){return this.client.fetchJson("/v1/autopilot/arming")}constructor(e){this.client=e}}let i={task:{label:"작업 분해",tone:"bg-sky-500/15 text-sky-200 ring-sky-500/30"},"goal-loop":{label:"목표 루프",tone:"bg-violet-500/15 text-violet-200 ring-violet-500/30"},scheduler:{label:"스케줄러",tone:"bg-emerald-500/15 text-emerald-200 ring-emerald-500/30"},"monitor-trigger":{label:"감시 트리거",tone:"bg-amber-500/15 text-amber-200 ring-amber-500/30"},hybrid:{label:"하이브리드",tone:"bg-fuchsia-500/15 text-fuchsia-200 ring-fuchsia-500/30"},fanout:{label:"병렬 팬아웃",tone:"bg-cyan-500/15 text-cyan-200 ring-cyan-500/30"},"single-shot":{label:"즉답",tone:"bg-muted text-muted-foreground ring-border"},"hitl-delegate":{label:"HITL 위임",tone:"bg-rose-500/15 text-rose-200 ring-rose-500/30"}}},80147:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>S});var r=s(54728),n=s(8740),a=s(3839),l=s(43736),i=s(96598);function o(e){let{api:t}=e,[s,a]=(0,n.useState)([]),[l,o]=(0,n.useState)(!0),d=(0,n.useCallback)(async()=>{try{var e;let s=await t.repoWatch();a(null!=(e=s.repos)?e:[])}catch(e){}finally{o(!1)}},[t]);return((0,n.useEffect)(()=>{d()},[d]),l)?(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"불러오는 중…"}):(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"참조 에이전트 repo 감시 — 새 커밋을 흡수 후보로 분석(제안은 텔레그램 report\xb7크론 08:40\xb720:40)."}),(0,r.jsx)(i.$,{size:"sm",variant:"outline",onClick:()=>void d(),children:"새로고침"})]}),(0,r.jsx)("div",{className:"grid gap-3 sm:grid-cols-3",children:s.map(e=>(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-card/50 p-3",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsx)("span",{className:"font-medium",children:e.key}),e.lastNew>0&&(0,r.jsxs)("span",{className:"rounded bg-amber-500/15 px-2 py-0.5 text-xs text-amber-300 ring-1 ring-amber-500/30",children:["새 ",e.lastNew]})]}),(0,r.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:e.repo}),(0,r.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:e.note}),(0,r.jsxs)("div",{className:"mt-2 flex items-center justify-between text-xs",children:[(0,r.jsx)("span",{className:"font-mono text-muted-foreground",children:e.lastSha?e.lastSha.slice(0,7):"—"}),(0,r.jsx)("span",{className:"text-muted-foreground",children:function(e){if(!e)return"미감지";let t=Date.now()-Date.parse(e);if(Number.isNaN(t))return"—";let s=Math.round(t/6e4);if(s<60)return"".concat(s,"분 전");let r=Math.round(s/60);return r<24?"".concat(r,"시간 전"):"".concat(Math.round(r/24),"일 전")}(e.lastSeen)})]})]},e.repo))}),(0,r.jsx)("p",{className:"text-[11px] text-muted-foreground",children:"흡수 채택 → PR 초안 + 빌드/테스트 증거는 P2(disarmed) \xb7 merge/재부팅은 대표 HITL."})]})}let d=["dig","backtest","trade","retro","replay","delegate","autopilot"],c={trade:"bg-rose-500/15 text-rose-300 ring-rose-500/30",dig:"bg-sky-500/15 text-sky-200 ring-sky-500/30",backtest:"bg-violet-500/15 text-violet-200 ring-violet-500/30",retro:"bg-amber-500/15 text-amber-200 ring-amber-500/30",replay:"bg-indigo-500/15 text-indigo-200 ring-indigo-500/30",delegate:"bg-emerald-500/15 text-emerald-200 ring-emerald-500/30",autopilot:"bg-fuchsia-500/15 text-fuchsia-200 ring-fuchsia-500/30"};function u(e){let{api:t}=e,[s,a]=(0,n.useState)([]),[l,o]=(0,n.useState)(null),[u,m]=(0,n.useState)(!0),x=(0,n.useCallback)(async()=>{m(!0);try{var e;let s=await t.autonomy(80,null!=l?l:void 0);a(null!=(e=s.actions)?e:[])}catch(e){}finally{m(!1)}},[t,l]);return(0,n.useEffect)(()=>{x()},[x]),(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsx)("button",{type:"button",onClick:()=>o(null),className:["rounded px-2 py-0.5 text-xs ring-1",null===l?"bg-primary/20 text-foreground ring-primary/40":"bg-muted text-muted-foreground ring-border"].join(" "),children:"전체"}),d.map(e=>{var t;return(0,r.jsx)("button",{type:"button",onClick:()=>o(e),className:["rounded px-2 py-0.5 text-xs ring-1",l===e?null!=(t=c[e])?t:"bg-primary/20 ring-primary/40":"bg-muted text-muted-foreground ring-border"].join(" "),children:e},e)}),(0,r.jsx)(i.$,{size:"sm",variant:"outline",className:"ml-auto",onClick:()=>void x(),children:"새로고침"})]}),u?(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"불러오는 중…"}):0===s.length?(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"아직 기록된 자율행동이 없습니다. 자율루프가 돌면 여기에 “무엇을 왜 했나”가 쌓입니다."}):(0,r.jsx)("ul",{className:"space-y-2",children:s.map((e,t)=>{var s;return(0,r.jsxs)("li",{className:"rounded-lg border border-border bg-card/50 p-3",children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("span",{className:["rounded px-2 py-0.5 text-xs ring-1",null!=(s=c[e.loop])?s:"bg-muted text-muted-foreground ring-border"].join(" "),children:e.loop}),(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:function(e){try{return new Intl.DateTimeFormat("ko-KR",{timeZone:"Asia/Seoul",month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit"}).format(new Date(e))}catch(t){return e.slice(5,16)}}(e.ts)}),e.importance>=8&&(0,r.jsx)("span",{className:"rounded bg-rose-500/15 px-1.5 text-[10px] text-rose-300 ring-1 ring-rose-500/30",children:"중요"})]}),(0,r.jsx)("pre",{className:"mt-1.5 whitespace-pre-wrap font-sans text-sm text-foreground/90",children:e.text})]},"".concat(e.ts,"-").concat(t))})})]})}var m=s(48774);let x={ok:{icon:"✅",tone:"text-emerald-300",label:"정상"},done:{icon:"✅",tone:"text-emerald-300",label:"완료"},stale:{icon:"⏰",tone:"text-amber-300",label:"밀림"},error:{icon:"❌",tone:"text-rose-400",label:"실패"},active:{icon:"\uD83D\uDD35",tone:"text-sky-300",label:"실행중"},pending:{icon:"⏳",tone:"text-muted-foreground",label:"대기"}},p={cron:"크론",task:"태스크",action:"자율행동"};function g(e){var t;let{counts:s,total:n}=e,a=Object.entries(null!=s?s:{}).filter(e=>{let[,t]=e;return t>0});if(!n||0===n)return(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:"태스크 0"});let l=null!=(t=null==s?void 0:s.done)?t:0;return(0,r.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,r.jsxs)("span",{className:"text-xs text-muted-foreground",children:["태스크 ",l,"/",n]}),a.map(e=>{let[t,s]=e;return(0,r.jsxs)("span",{className:"text-[11px] text-muted-foreground",children:[t,":",s]},t)})]})}function h(e){let{r:t}=e;if(!t||0===t.total)return(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:"파생 0"});let s=(e,t)=>e>0?(0,r.jsxs)("span",{className:["text-xs",x[t].tone].join(" "),children:[x[t].icon,e]},t):null;return(0,r.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,r.jsxs)("span",{className:"text-xs text-muted-foreground",children:["파생 ",t.total]}),s(t.ok,"ok"),s(t.stale,"stale"),s(t.error,"error"),s(t.active,"active"),s(t.pending,"pending")]})}function b(e){let{api:t,m:s,onDone:a}=e,l="scheduler"===s.model,o="task"===s.model,[d,c]=(0,n.useState)(""),[u,m]=(0,n.useState)(""),[x,p]=(0,n.useState)(""),[g,h]=(0,n.useState)(null),[b,f]=(0,n.useState)(null);if(!l&&!o)return(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["이 실행모델(",s.model,")은 지속 잡을 만들지 않아 구체화 대상이 아닙니다."]});let j=async e=>{h(e),f(null);let r=l?{command:d.trim(),...u.trim()?{cron:u.trim()}:{}}:{...x.trim()?{prompt:x.trim()}:{}};try{let l=await t.missionAction(s.id,e,r);if(l.error)f("오류: ".concat(l.error));else{var n;f("arm"===e?"승인\xb7arming ON 시 자동 실행":"구체화 완료(".concat(null!=(n=l.engine)?n:"",")")),a()}}catch(e){f(e instanceof Error?e.message:String(e))}finally{h(null)}};return(0,r.jsxs)("div",{className:"mt-3 space-y-2 rounded-md border border-border bg-background/50 p-2.5",children:[l&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("input",{value:d,onChange:e=>c(e.target.value),placeholder:"실행할 명령 (예: scripts/foo.ts) — 필수",className:"w-full rounded border border-border bg-background px-2 py-1 text-xs"}),(0,r.jsx)("input",{value:u,onChange:e=>m(e.target.value),placeholder:"cron (선택 \xb7 비우면 골에서 추론)",className:"w-full rounded border border-border bg-background px-2 py-1 font-mono text-xs"})]}),o&&(0,r.jsx)("input",{value:x,onChange:e=>p(e.target.value),placeholder:"태스크 내용 (선택 \xb7 비우면 골 사용)",className:"w-full rounded border border-border bg-background px-2 py-1 text-xs"}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)(i.$,{size:"sm",disabled:!!g||l&&!d.trim(),onClick:()=>void j("materialize"),children:"materialize"===g?"…":"지금 구체화"}),(0,r.jsx)(i.$,{size:"sm",variant:"outline",disabled:!!g||l&&!d.trim(),onClick:()=>void j("arm"),children:"arm"===g?"…":"승인(arm)"}),b&&(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:b})]})]})}function f(e){let{api:t,m:s}=e,a=!1===s.isAutopilot,[l,o]=(0,n.useState)(!1),[d,c]=(0,n.useState)(null),[u,f]=(0,n.useState)(!1),j=s.model?m.NE[s.model]:null,y=(0,n.useCallback)(async()=>{f(!0);try{c(await t.trace(s.id))}catch(e){}finally{f(!1)}},[t,s.id]),[v,N]=(0,n.useState)(!1),[k,w]=(0,n.useState)(!1),[S,C]=(0,n.useState)(null),E=!a&&"proposed"===s.status,A=(0,n.useCallback)(async()=>{let e=!l;o(e),!e||d||a||await y()},[l,d,y,a]),z=(0,n.useCallback)(async()=>{N(!0),C(null);try{await t.missionAction(s.id,"cancel"),await y()}catch(e){}finally{N(!1)}},[t,s.id,y]),M=(0,n.useCallback)(async()=>{w(!0),C(null);try{var e;let r=await t.missionAction(s.id,"approve");r.error?C("오류: ".concat(r.error)):C("✅ 승인 — 태스크 ".concat(null!=(e=r.activated)?e:0,"건 실행 시작(ready). 미션 running.")),await y()}catch(e){C(e instanceof Error?e.message:String(e))}finally{w(!1)}},[t,s.id,y]);return(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-card/50",children:[(0,r.jsxs)("button",{type:"button",onClick:()=>void A(),className:"flex w-full items-start gap-3 p-3 text-left",children:[(0,r.jsx)("span",{className:"mt-0.5 text-muted-foreground",children:l?"▾":"▸"}),(0,r.jsxs)("div",{className:"min-w-0 flex-1 space-y-1.5",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[a?(0,r.jsx)("span",{className:"rounded bg-slate-500/15 px-2 py-0.5 text-xs font-medium text-slate-300 ring-1 ring-slate-500/30",children:"사람 \xb7 intake"}):j&&(0,r.jsx)("span",{className:["rounded px-2 py-0.5 text-xs font-medium ring-1",j.tone].join(" "),children:j.label}),!a&&"continuous"===s.kind&&(0,r.jsx)("span",{className:"rounded bg-sky-500/15 px-1.5 py-0.5 text-[11px] text-sky-300 ring-1 ring-sky-500/30",children:"상시"}),!a&&"finite"===s.kind&&(0,r.jsx)("span",{className:"rounded bg-violet-500/15 px-1.5 py-0.5 text-[11px] text-violet-300 ring-1 ring-violet-500/30",children:"유한"}),(0,r.jsx)("span",{className:"rounded bg-muted px-1.5 py-0.5 text-[11px] text-muted-foreground ring-1 ring-border",children:s.source}),E?(0,r.jsx)("span",{className:"rounded bg-amber-500/15 px-1.5 py-0.5 text-[11px] font-medium text-amber-300 ring-1 ring-amber-500/40",children:"승인 대기"}):(0,r.jsx)("span",{className:"rounded bg-muted px-1.5 py-0.5 text-[11px] text-muted-foreground ring-1 ring-border",children:s.status}),s.reviewDue&&(0,r.jsx)("span",{className:"rounded bg-amber-500/15 px-1.5 py-0.5 text-[11px] text-amber-300 ring-1 ring-amber-500/30",children:"⚠ 30일+ 리뷰"}),a?(0,r.jsx)(g,{counts:s.taskCounts,total:s.taskCount}):(0,r.jsx)(h,{r:s.derived})]}),(0,r.jsx)("p",{className:"truncate text-sm text-foreground/90",children:s.goal}),(0,r.jsx)("p",{className:"font-mono text-[10px] text-muted-foreground",children:s.id})]})]}),l&&a&&(0,r.jsxs)("div",{className:"border-t border-border px-4 py-3 space-y-2",children:[(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"사람이 Intake 로 만든 미션입니다. 실행은 Task 보드에서 진행됩니다."}),(0,r.jsx)(g,{counts:s.taskCounts,total:s.taskCount}),(0,r.jsx)("a",{href:"/tasks",className:"inline-block text-xs text-primary hover:underline",children:"Tasks 보드에서 보기 →"})]}),l&&!a&&(0,r.jsxs)("div",{className:"border-t border-border px-4 py-3",children:[E&&(0,r.jsxs)("div",{className:"mb-3 space-y-2 rounded-md border border-amber-500/30 bg-amber-500/5 p-3",children:[(0,r.jsx)("p",{className:"text-sm font-medium text-amber-200",children:"자동 분해 완료 \xb7 승인 대기"}),(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["골을 태스크로 자동 구체화했습니다(아직 ",(0,r.jsx)("b",{children:"실행 안 함"}),"). 승인하면 실행이 시작됩니다.","scheduler"===s.model&&" 반복 스케줄은 승인 후 배선됩니다."]}),(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)(i.$,{size:"sm",disabled:k||v,onClick:()=>void M(),children:k?"승인 중…":"✅ 승인(실행 시작)"}),(0,r.jsx)(i.$,{size:"sm",variant:"ghost",disabled:k||v,onClick:()=>void z(),className:"text-rose-400 hover:text-rose-300",children:v?"거절 중…":"거절"}),S&&(0,r.jsx)("span",{className:"text-xs text-muted-foreground",children:S})]})]}),u&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"계보 조회 중…"}),d&&0===d.derived.length&&(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:d.note}),d&&d.derived.length>0&&(0,r.jsx)("ul",{className:"space-y-1.5",children:d.derived.map((e,t)=>{let s=x[e.status];return(0,r.jsxs)("li",{className:"flex items-start gap-2 text-sm",children:[(0,r.jsx)("span",{className:s.tone,children:s.icon}),(0,r.jsx)("span",{className:"rounded bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground ring-1 ring-border",children:p[e.kind]}),(0,r.jsxs)("span",{className:"min-w-0 flex-1",children:[(0,r.jsx)("span",{className:"text-foreground/90",children:e.name}),e.detail&&(0,r.jsx)("span",{className:"ml-2 text-xs text-muted-foreground",children:e.detail})]})]},t)})}),d&&"done"!==s.status&&"proposed"!==s.status&&(0,r.jsxs)("div",{className:"mt-2 flex items-center gap-2",children:[(0,r.jsx)(i.$,{size:"sm",variant:"ghost",disabled:v,onClick:()=>void z(),className:"text-rose-400 hover:text-rose-300",children:v?"종료 중…":"미션 종료(파생 잡 release)"}),"continuous"===s.kind&&(0,r.jsx)("span",{className:"text-[11px] text-muted-foreground",children:"상시 미션 — 종료 전까지 계속 실행"})]}),d&&!E&&(0,r.jsx)(b,{api:t,m:s,onDone:()=>void y()})]})]})}function j(e){let{api:t,onCommitted:s}=e,[a,l]=(0,n.useState)(""),[o,d]=(0,n.useState)(null),[c,u]=(0,n.useState)(!1),[x,p]=(0,n.useState)(!1),[g,h]=(0,n.useState)(null),b=(0,n.useCallback)(async()=>{let e=a.trim();if(e){u(!0),h(null);try{d((await t.triagePreview(e)).triage)}catch(e){h(e instanceof Error?e.message:String(e))}finally{u(!1)}}},[t,a]),f=(0,n.useCallback)(async()=>{let e=a.trim();if(e){p(!0),h(null);try{(await t.commitMission(e,"intake")).missionId?(l(""),d(null),s()):h("미션 생성 실패")}catch(e){h(e instanceof Error?e.message:String(e))}finally{p(!1)}}},[t,a,s]),j=o?m.NE[o.executionModel]:null;return(0,r.jsxs)("div",{className:"space-y-2 rounded-lg border border-border bg-card/40 p-3",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("span",{className:"text-sm font-medium",children:["골 던지기 ",(0,r.jsx)("span",{className:"text-xs font-normal text-muted-foreground",children:"— 소망을 말하면 미션이 됩니다"})]}),(0,r.jsx)("span",{className:"text-[11px] text-muted-foreground",children:"텔레그램에선 “미션:” 마커로"})]}),(0,r.jsx)("textarea",{value:a,onChange:e=>l(e.target.value),onKeyDown:e=>{"Enter"===e.key&&(e.metaKey||e.ctrlKey)&&b()},placeholder:"예: 삼성전자 급락하면 매매 검토 / 이 주제 끝까지 파봐 / 매일 아침 반도체 뉴스 정리",className:"min-h-[60px] w-full resize-y rounded-md border border-border bg-background px-3 py-2 text-sm"}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,r.jsx)(i.$,{onClick:()=>void b(),disabled:c||!a.trim(),size:"sm",variant:"outline",children:c?"분류 중…":"Triage (⌘↵)"}),(0,r.jsx)(i.$,{onClick:()=>void f(),disabled:x||!a.trim(),size:"sm",children:x?"커밋 중…":"미션 커밋 →"}),o&&j&&(0,r.jsxs)("span",{className:"flex flex-wrap items-center gap-1.5 text-xs",children:[(0,r.jsx)("span",{className:["rounded px-2 py-0.5 ring-1",j.tone].join(" "),children:j.label}),(0,r.jsx)("span",{className:"rounded bg-muted px-1.5 py-0.5 text-muted-foreground ring-1 ring-border",children:"heavy"===o.tier?"무거움":"가벼움"}),(0,r.jsx)("span",{className:"text-muted-foreground",children:o.rationale})]}),g&&(0,r.jsx)("span",{className:"text-xs text-rose-400",children:g})]})]})}function y(e){var t,s;let{api:a}=e,[l,o]=(0,n.useState)(null),[d,c]=(0,n.useState)(null),[u,m]=(0,n.useState)(!1),x=(0,n.useCallback)(async()=>{m(!0),c(null);try{let e=[...(await a.missionsUnified()).missions].sort((e,t)=>e.createdAt<t.createdAt?1:-1);o(e)}catch(e){c(e instanceof Error?e.message:String(e))}finally{m(!1)}},[a]);(0,n.useEffect)(()=>{x()},[x]);let p=null!=(t=null==l?void 0:l.filter(e=>e.isAutopilot).length)?t:0,g=(null!=(s=null==l?void 0:l.length)?s:0)-p;return(0,r.jsxs)("div",{className:"space-y-3",children:[(0,r.jsxs)("div",{className:"flex items-center justify-between",children:[(0,r.jsxs)("p",{className:"text-sm text-muted-foreground",children:["모든 미션(사람 intake + 자율)의 계보\xb7실행 상태.",l&&(0,r.jsxs)("span",{className:"ml-1 text-[11px]",children:["자율 ",p," \xb7 사람 ",g]})]}),(0,r.jsx)(i.$,{onClick:()=>void x(),disabled:u,size:"sm",variant:"outline",children:u?"…":"새로고침"})]}),(0,r.jsx)(j,{api:a,onCommitted:()=>void x()}),d&&(0,r.jsx)("p",{className:"text-xs text-rose-400",children:d}),l&&0===l.length&&(0,r.jsx)("p",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:"아직 미션이 없습니다. 아래 “골 던지기”로 자율 미션을 만들거나, Intake 에서 메모를 포착하세요."}),l&&l.length>0&&(0,r.jsx)("div",{className:"space-y-2",children:l.map(e=>(0,r.jsx)(f,{api:a,m:e},e.id))})]})}var v=s(93848);let N=[{id:"missions",label:"Missions"},{id:"repo",label:"Repo Watch"},{id:"autonomy",label:"자율행동"},{id:"loops",label:"루프 오케스트라"}];function k(e){var t;let{arming:s}=e;if(!s)return null;let n=(e,t)=>(0,r.jsxs)("span",{className:["rounded px-2 py-0.5 text-xs ring-1",e?"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30":"bg-muted text-muted-foreground ring-border"].join(" "),children:[t," ",e?"ON":"OFF"]});return(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs text-muted-foreground",children:[(0,r.jsx)("span",{children:"자율 경계:"}),n(s.absorb,"흡수 PR초안(".concat(s.absorbBackend,")")),n(s.merge,"mandate merge"),n(s.reboot,"재부팅"),n(null!=(t=s.materialize)&&t,"자율 구체화"),(0,r.jsx)("span",{className:"text-[11px]",children:"\xb7 재부팅은 항상 HITL \xb7 기본 disarmed(fail-closed)"})]})}function w(){let{client:e}=(0,a.Q)(),t=(0,n.useMemo)(()=>new m.Yt(e),[e]),[s,i]=(0,n.useState)("missions"),[d,c]=(0,n.useState)(null);return(0,n.useEffect)(()=>{let e=!0;return t.arming().then(t=>{e&&c(t.arming)}).catch(()=>{}),()=>{e=!1}},[t]),(0,r.jsxs)("div",{className:"mx-auto max-w-[1400px] px-4 pt-4",children:[(0,r.jsx)("div",{className:"mb-3",children:(0,r.jsx)(v.r,{active:"autopilot"})}),(0,r.jsxs)("div",{className:"mb-3 space-y-2",children:[(0,r.jsxs)("h1",{className:"text-lg font-semibold",children:["Autopilot ",(0,r.jsx)("span",{className:"text-sm font-normal text-muted-foreground",children:"미션 지휘 센터"})]}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"미션(사람 + 자율)의 계보\xb7상태\xb7자율행동. 아래 “골 던지기” 또는 텔레그램 “미션:” 마커로 소망을 던지면 미션이 됩니다."}),(0,r.jsx)(k,{arming:d})]}),(0,r.jsx)("div",{className:"flex gap-1 border-b border-border",children:N.map(e=>(0,r.jsx)("button",{type:"button",onClick:()=>i(e.id),className:["-mb-px border-b-2 px-4 py-2 text-sm font-medium transition-colors",s===e.id?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"].join(" "),children:e.label},e.id))}),(0,r.jsxs)("div",{className:"py-4",children:["missions"===s&&(0,r.jsx)(y,{api:t}),"repo"===s&&(0,r.jsx)(o,{api:t}),"autonomy"===s&&(0,r.jsx)(u,{api:t}),"loops"===s&&(0,r.jsx)(l.s,{})]})]})}function S(){return(0,r.jsx)(w,{})}},93848:(e,t,s)=>{"use strict";s.d(t,{r:()=>i});var r=s(54728),n=s(20526),a=s.n(n);let l=[{key:"autopilot",href:"/autopilot",num:"①",label:"Autopilot",sub:"미션\xb7포착"},{key:"tasks",href:"/tasks",num:"②",label:"Tasks",sub:"실행"},{key:"scheduler",href:"/scheduler",num:"③",label:"Scheduler",sub:"트리거"}];function i(e){let{active:t}=e;return(0,r.jsxs)("nav",{"aria-label":"Mission Fabric 파이프라인","data-testid":"fabric-stage-header",className:"flex flex-wrap items-center gap-1 text-xs",children:[(0,r.jsx)("span",{className:"mr-1 text-muted-foreground",children:"Mission Fabric"}),l.map((e,s)=>(0,r.jsxs)("span",{className:"flex items-center gap-1",children:[(0,r.jsxs)(a(),{href:e.href,"aria-current":e.key===t?"page":void 0,className:["rounded px-2 py-1 ring-1 transition-colors",e.key===t?"bg-primary/15 font-medium text-foreground ring-primary/40":"text-muted-foreground ring-border hover:bg-muted hover:text-foreground"].join(" "),children:[(0,r.jsx)("span",{className:"mr-1",children:e.num}),e.label,(0,r.jsx)("span",{className:"ml-1 text-[10px] opacity-70",children:e.sub})]}),s<l.length-1&&(0,r.jsx)("span",{className:"text-muted-foreground/50","aria-hidden":!0,children:"→"})]},e.key))]})}}},e=>{e.O(0,[7235,7482,5583,526,3839,3736,9096,1380,7358],()=>e(e.s=36953)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7955],{90184:(e,t,s)=>{Promise.resolve().then(s.bind(s,96298))},96298:(e,t,s)=>{"use strict";s.d(t,{BotlabPageContent:()=>h});var r,l=s(54728),a=s(8740);let o=(null!=(r=s(66601).env.NEXT_PUBLIC_ELANOUS_BOTLAB_HOST)?r:"").trim(),n="elanous.botlab.wallHost",d=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;function i(e){return e.length>0&&e.length<=253&&d.test(e)}function c(e){var t;let{search:s,remembered:r=null}=e,d=(0,a.useMemo)(()=>(function(e){var t,s;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,l=null;try{l=new URLSearchParams(e).get("host")}catch(e){l=null}let a=null!=(t=null==l?void 0:l.trim())?t:"";if(""!==a&&i(a))return{host:a,source:"query",rejected:null};let n=""===a?null:a,d=null!=(s=null==r?void 0:r.trim())?s:"";return""!==d&&i(d)?{host:d,source:"remembered",rejected:n}:""!==o&&i(o)?{host:o,source:"default",rejected:n}:{host:"",source:"unset",rejected:n}})(s,r),[s,r]),c="unset"===d.source?null:(t=d.host,"https://".concat(t).concat("/bot3/bot-wall.html"));return(0,a.useEffect)(()=>{if("query"===d.source)try{window.localStorage.setItem(n,d.host)}catch(e){}},[d.source,d.host]),(0,l.jsxs)("main",{className:"mx-auto flex w-full max-w-6xl flex-col gap-6 px-6 py-10 sm:px-10","data-testid":"botlab-panel",children:[(0,l.jsxs)("header",{children:[(0,l.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground",children:"Bot screens"}),(0,l.jsx)("h1",{className:"mt-2 text-3xl font-bold",children:"Botlab"}),(0,l.jsxs)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:["Live noVNC screens for the bots, served through Tailscale. One document holds all four sessions, so the VNC password is asked ",(0,l.jsx)("strong",{children:"once"}),", not four times."]}),(0,l.jsx)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:"View-only by default. This surface cannot send commands or control the bots."})]}),(0,l.jsxs)("section",{className:"rounded-xl border border-border bg-card p-4","aria-label":"Wall address",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:"Wall address"}),(0,l.jsx)("p",{className:"mt-1 break-all font-mono text-xs text-muted-foreground","data-testid":"botlab-wall-url",children:null!=c?c:"(no host configured)"}),(0,l.jsx)("p",{className:"mt-2 text-xs text-muted-foreground","data-testid":"botlab-host-source",children:"query"===d.source?"Host came from the ?host= query parameter (remembered on this device).":"remembered"===d.source?"Host is the one remembered on this device; override it with ?host=<tailnet-name>.":"default"===d.source?"Host is the build default (NEXT_PUBLIC_ELANOUS_BOTLAB_HOST); override it with ?host=<tailnet-name>.":"No wall host is configured. Open this page once with ?host=<the VM tailnet name> — it is remembered on this device."}),null!==d.rejected&&(0,l.jsxs)("p",{role:"alert",className:"mt-2 text-xs text-destructive","data-testid":"botlab-host-rejected",children:["Ignored ?host=",d.rejected," — not a valid hostname."]}),null!==c&&(0,l.jsxs)("p",{className:"mt-3 text-xs text-muted-foreground",children:[(0,l.jsx)("a",{className:"underline",href:c,target:"_blank",rel:"noreferrer","data-testid":"botlab-open-tab",children:"Open the wall in a new tab"})," — ","use this if the embedded frame stays blank."]})]}),null!==c&&(0,l.jsx)("section",{"aria-label":"Bot screen wall",children:(0,l.jsx)("iframe",{src:c,title:"Bot screen wall","data-testid":"botlab-wall-frame",className:"h-[70vh] w-full rounded-xl border border-border bg-background"})}),(0,l.jsxs)("section",{className:"rounded-xl border border-border bg-card p-5","aria-label":"If the wall is blank",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:"If the wall stays blank"}),(0,l.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"A blank frame is not necessarily a broken bot. There are three separate reasons, with different fixes:"}),(0,l.jsxs)("ol",{className:"mt-3 list-decimal space-y-2 pl-5 text-sm text-muted-foreground",children:[(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"This device is outside the tailnet."})," The address simply does not exist here. Join the tailnet, or view the screens from a device that is on it."]}),(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"Tailscale serve is not published."})," Re-run"," ",(0,l.jsx)("code",{className:"font-mono text-xs",children:"bash scripts/botlab/deploy-bot-wall.sh"}),", which re-publishes the paths and then verifies each one returns 200."]}),(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"The wall loaded but did not connect."})," That is a VNC-level failure, not a page failure — the wall itself reports connected/failed counts once you enter the password."]})]}),(0,l.jsx)("p",{className:"mt-3 text-xs text-muted-foreground",children:"The VNC password is deliberately not carried in this page or in the URL: any page a bot browser opens could otherwise reach the local websocket, and websockets have no CORS."})]}),(0,l.jsxs)("section",{className:"rounded-xl border border-dashed border-border p-5","aria-label":"Not wired yet",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:"Not wired yet"}),(0,l.jsxs)("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-sm text-muted-foreground",children:[(0,l.jsxs)("li",{children:["Per-bot cell headers (name \xb7 last round verdict \xb7 whether CDP is alive) need"," ",(0,l.jsx)("code",{className:"font-mono text-xs",children:"browserPort"})," and round results on the daemon's persona route. That route is owned by another track and is not published today."]}),(0,l.jsx)("li",{children:"Running a command from this surface needs a POST route that does not exist yet."})]})]})]})}function h(){let e=window.location.search,t=null;try{t=window.localStorage.getItem(n)}catch(e){t=null}return(0,l.jsx)(c,{search:e,remembered:t})}}},e=>{e.O(0,[9096,1380,7358],()=>e(e.s=90184)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2885],{12982:(e,t,n)=>{Promise.resolve().then(n.bind(n,38087))},33368:(e,t,n)=>{"use strict";n.d(t,{v:()=>a});var l=n(8740),r=n(85351);let s=null;function a(e){let[t,n]=(0,l.useState)(()=>s&&Date.now()-s.at<6e4?s.data:[]),[a,o]=(0,l.useState)(!1),[i,d]=(0,l.useState)(null),u=(0,l.useCallback)(async()=>{o(!0),d(null);try{let t=await e.listPersonas();s={at:Date.now(),data:t.personas},n(t.personas)}catch(e){d(e instanceof Error?e.message:String(e))}finally{o(!1)}},[e]);(0,l.useEffect)(()=>{if(s&&Date.now()-s.at<6e4)return void n(s.data);u()},[u]);let c=(0,l.useCallback)(async()=>{s=null,await u()},[u]);return(0,l.useEffect)(()=>{let t=e.personasEventsUrl();if(!t)return;let n=null;try{n=new EventSource(t)}catch(e){(0,r.cY)("showroom.personas.sse.construct-error",{error:String(e)});return}let l=e=>()=>{"hello"!==e&&((0,r.cY)("showroom.personas.sse.event",{kind:e}),s=null,u())};return n.addEventListener("hello",l("hello")),n.addEventListener("load-dir",l("load-dir")),n.addEventListener("reload-all",l("reload-all")),n.addEventListener("upsert",l("upsert")),n.addEventListener("remove",l("remove")),n.onerror=e=>{(0,r.cY)("showroom.personas.sse.error",{type:e.type})},()=>{try{null==n||n.close()}catch(e){}}},[e,u]),{personas:t,loading:a,error:i,reload:c}}},38087:(e,t,n)=>{"use strict";n.d(t,{BotsPageContent:()=>S});var l=n(54728),r=n(8740),s=n(3839),a=n(33368);function o(e){if(null==e)return null;let t=e.replace(/[,%\s]/g,"").replace(/\*/g,"").trim();if(""===t||"-"===t||"N/A"===t)return null;let n=Number(t);return Number.isFinite(n)?n:null}let i=e=>"string"==typeof e&&""!==e?e:null,d=e=>"number"==typeof e&&Number.isFinite(e)?e:null,u=e=>"boolean"==typeof e?e:null;function c(e){var t,n,l,r,s;let a=[],c=[];for(let t of null!=(n=e.artifacts)?n:[]){let e=null!=(l=i(null==t?void 0:t.name))?l:"(이름 없음)",n=i(null==t?void 0:t.text);if(null===n){c.push(e);continue}a.push(function(e,t){var n;let l=function(e){let t=e.split("\n").filter(e=>""!==e.trim()&&!e.includes("━")),n=t.slice(0,3).join(" / ").slice(0,160),l=t.slice(0,3).join("\n");return/^Traceback \(most recent call last\):/m.test(l)?{kindOf:"파이썬 예외(Traceback)",head:n}:/^⛔\s*.*(실패|failed|error)/mi.test(l)?{kindOf:"스킬이 \xab실패\xbb라고 말했다",head:n}:/^(Error|error):/m.test(l)?{kindOf:"오류",head:n}:/^\s*command not found|No such file or directory/m.test(l)?{kindOf:"명령\xb7파일이 \xab없다\xbb",head:n}:null}(t);if(null!==l)return{kind:"failure",name:e,kindOf:l.kindOf,head:l.head};let r=function(e){var t,n,l,r;let s=null!=(r=null!=(l=null==(t=/^대상:\s*(\S+)/m.exec(e))?void 0:t[1])?l:null==(n=/^##\s+(\S+)\s+Real-Time Quote/m.exec(e))?void 0:n[1])?r:null;if(null===s)return null;let a=t=>{var n,l;return null!=(l=null==(n=RegExp("\\*\\*".concat(t,":\\*\\*\\s*([-+0-9.,]+)"),"i").exec(e))?void 0:n[1])?l:null},i=/\*\*Change:\*\*\s*([-+0-9.,]+)\s*\(([-+0-9.]+)%\)/i.exec(e),d={symbol:s,close:o(a("Close")),change:i?o(i[1]):o(a("Change")),changePct:i?o(i[2]):null,open:o(a("Open")),high:o(a("High")),low:o(a("Low")),volume:o(a("Volume")),prevClose:o(a("Prev Close"))};return[d.close,d.change,d.open,d.high,d.low,d.volume,d.prevClose].some(e=>null!==e)?d:null}(t);if(null!==r)return{kind:"quote",name:e,quote:r};let s=null!=(n=function(e){var t,n,l,r,s,a,i,d;let u=e.split("\n"),c=u.findIndex(e=>e.includes("|")&&e.includes("외국인")&&e.includes("기관")&&e.includes("개인"));if(c<0)return null;let m=e=>e.split("|").map(e=>e.trim()).filter((e,t,n)=>""!==e||0!==t&&t!==n.length-1),x=m(u[c]),f=e=>x.findIndex(t=>t.includes(e)),[h,g,p,b]=[0,f("외국인"),f("기관"),f("개인")];if(g<0||p<0||b<0)return null;let j=[];for(let e=c+1;e<u.length;e+=1){let t=u[e];if(!t.includes("|")){if(j.length>0)break;continue}if(/^\s*\|?[\s:|-]+\|?\s*$/.test(t))continue;let n=m(t);if(n.length<=Math.max(g,p,b))continue;let l=(null!=(r=n[h])?r:"").trim();""!==l&&j.push({key:l,foreign:o(n[g]),institution:o(n[p]),individual:o(n[b])})}if(0===j.length)return null;let N="";for(let e=c;e>=0;e-=1){let t=/^#{2,3}\s+(.+)$/.exec((null!=(s=u[e])?s:"").trim());if(t){N=t[1];break}}return""===N&&(N=null!=(a=null==(t=u.find(e=>""!==e.trim()&&!e.includes("━")))?void 0:t.trim())?a:"(제목 없음)"),{title:N,unit:null!=(d=null==(n=/\((백만|천|억)\)/.exec(x.join(" ")))?void 0:n[1])?d:null!=(i=null==(l=/\(([^)]*원[^)]*)\)/.exec(x.join(" ")))?void 0:l[1])?i:null,rows:j}}(t))?n:function(e){let t,n=e.trimStart();if(!n.startsWith("{"))return null;try{t=JSON.parse(n)}catch(e){return null}let l=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),l=1;l<t;l++)n[l-1]=arguments[l];for(let t of n){let n=e[t];if("number"==typeof n&&Number.isFinite(n))return n}return null},r=[],s=t.periods;if("object"==typeof s&&null!==s&&!Array.isArray(s))for(let[e,t]of Object.entries(s))"object"==typeof t&&null!==t&&r.push({key:e,foreign:l(t,"frgn_net_shares","frgn_net_amount_million"),institution:l(t,"inst_net_shares","inst_net_amount_million"),individual:l(t,"prsn_net_shares","prsn_net_amount_million")});if(0===r.length&&Array.isArray(t.rows))for(let e of t.rows){if("object"!=typeof e||null===e)continue;let t="string"==typeof e.date?e.date:null;null!==t&&r.push({key:t,foreign:l(e,"frgn_net_shares","frgn_net_amount_million"),institution:l(e,"inst_net_shares","inst_net_amount_million"),individual:l(e,"prsn_net_shares","prsn_net_amount_million")})}if(0===r.length)return null;let a="string"==typeof t.ticker?t.ticker:null,o="string"==typeof t.name&&t.name!==a?t.name:null;return{title:null!==o&&null!==a?"".concat(o,"(").concat(a,") 투자자 수급"):null!==a?"".concat(a," 투자자 수급"):"투자자 수급",unit:"주",rows:r}}(t);if(null!==s)return{kind:"flow",name:e,flow:s};let a=function(e){let t,n=e.split("\n"),l=n.findIndex(e=>"---BEGIN_OMNI_CRAWL_JSON---"===e);if(l<0)return{news:null,why:null,fenced:!1};let r=n.findIndex((e,t)=>t>l&&"---END_OMNI_CRAWL_JSON---"===e);if(r<0)return{news:null,why:"Omni crawl JSON 끝 울타리를 \xab못 찾았다\xbb",fenced:!0};try{t=JSON.parse(n.slice(l+1,r).join("\n"))}catch(e){return{news:null,why:"Omni crawl 울타리 안 JSON을 \xab못 읽었다\xbb",fenced:!0}}if("object"!=typeof t||null===t||Array.isArray(t))return{news:null,why:"Omni crawl JSON 최상위가 객체가 아니다",fenced:!0};let s=t;if(!Array.isArray(s.results))return{news:null,why:"Omni crawl JSON에 results 배열이 없다",fenced:!0};let a=[];for(let e of s.results){if("object"!=typeof e||null===e||Array.isArray(e))continue;let t=e.items;if(Array.isArray(t))for(let e of t)"object"!=typeof e||null===e||Array.isArray(e)||a.push({title:"string"==typeof e.title?e.title:null,url:"string"==typeof e.url?e.url:null,date:"string"==typeof e.date?e.date:null})}return{news:{query:"string"==typeof s.query?s.query:null,items:a},why:null,fenced:!0}}(t);if(null!==a.news)return{kind:"news",name:e,news:a.news};let i=t.split("\n").filter(e=>""!==e.trim()&&!e.includes("━")).slice(0,2).join(" / ").slice(0,120);if(a.fenced)return{kind:"unparsed",name:e,why:a.why,head:i};let d=function(e){let t=e.split("\n").filter(e=>""!==e.trim()&&!e.includes("━"));if(t.length<2)return null;let n=[];for(let e of t.slice(1)){let t=/^\s{1,}(\S[^:]*?)\s+:\s+(.+?)\s*$/.exec(e);if(null===t)continue;let l=t[1].trim(),r=t[2].trim();""===l||""===r||l.includes("//")||n.push({label:l,value:r,num:o(r)})}return 0===n.length?null:{title:t[0].trim(),entries:n}}(t);return null!==d?{kind:"keyed",name:e,keyed:d}:{kind:"unparsed",name:e,why:"아는 꼴이 \xab아니다\xbb(시세\xb7수급표\xb7뉴스\xb7라벨:값 넷 다 아님)",head:i}}(e,n))}return{personaId:null!=(r=i(e.personaId))?r:"unknown",runId:i(e.runId),atUtc:i(e.atUtc),ok:u(e.ok),steps:d(e.steps),failed:d(e.failed),source:null!=(s=i(e.source))?s:"unknown",delivered:u(null==(t=e.delivery)?void 0:t.sent),artifacts:a,textless:c}}function m(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(null===e)return"—";let n=Math.abs(e)>=1e3?e.toLocaleString("en-US"):String(e);return!0===t.sign&&e>0?"+".concat(n):n}async function x(e,t,n){try{var l,r,s=await e.fetchJson("/v1/bots/rounds?persona=".concat(encodeURIComponent(t),"&limit=").concat(n));if("object"!=typeof s||null===s)return{kind:"error",reason:"라우트 응답을 \xab못 읽었다\xbb(객체가 아니다)"};if(!Array.isArray(s.rounds))return{kind:"error",reason:"`rounds` 가 \xab배열이 아니다\xbb — 「0건」과 \xab다른 값\xbb이다"};let a=s.unreadableBy,o=void 0===a?null:Object.entries(a).filter(e=>{let[t]=e;return"result-missing"!==t}).reduce((e,t)=>{var n;let[,l]=t;return e+(null!=(n=d(l))?n:0)},0);return{kind:"ready",rounds:s.rounds.map(c),unreadable:null!=(l=d(s.unreadable))?l:0,unreadableNow:null!=o?o:null!=(r=d(s.unreadable))?r:0}}catch(e){return{kind:"error",reason:e instanceof Error&&e.message?e.message:String(e)}}}function f(e){let{a:t}=e,n=t.quote,r=null!==n.changePct&&n.changePct>0,s=null!==n.changePct&&n.changePct<0;return(0,l.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"quote-".concat(n.symbol),children:[(0,l.jsxs)("div",{className:"flex flex-wrap items-baseline gap-x-3",children:[(0,l.jsx)("h4",{className:"font-mono text-sm font-semibold",children:n.symbol}),(0,l.jsx)("span",{className:"text-lg font-bold tabular-nums",children:m(n.close)}),(0,l.jsxs)("span",{className:"text-sm font-semibold tabular-nums ".concat(r?"text-emerald-600":s?"text-rose-600":"text-muted-foreground"),children:[m(n.change,{sign:!0}),null!==n.changePct&&" (".concat(m(n.changePct,{sign:!0}),"%)")]})]}),(0,l.jsx)("dl",{className:"mt-2 grid grid-cols-2 gap-x-4 gap-y-1 text-xs text-muted-foreground sm:grid-cols-4",children:[["시가",n.open],["고가",n.high],["저가",n.low],["전일",n.prevClose]].map(e=>{let[t,n]=e;return(0,l.jsxs)("div",{className:"flex justify-between gap-2",children:[(0,l.jsx)("dt",{children:t}),(0,l.jsx)("dd",{className:"tabular-nums text-foreground",children:m(n)})]},t)})})]})}function h(e){let{a:t}=e,n=t.flow;return(0,l.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"flow-block",children:[(0,l.jsx)("h4",{className:"text-sm font-semibold",children:n.title}),null!==n.unit&&(0,l.jsxs)("p",{className:"mt-0.5 text-xs text-muted-foreground",children:["단위: ",n.unit]}),(0,l.jsx)("div",{className:"mt-2 overflow-x-auto",children:(0,l.jsxs)("table",{className:"w-full min-w-[22rem] text-xs",children:[(0,l.jsx)("thead",{children:(0,l.jsxs)("tr",{className:"text-muted-foreground",children:[(0,l.jsx)("th",{className:"py-1 text-left font-medium",children:"기간"}),["외국인","기관","개인"].map(e=>(0,l.jsx)("th",{className:"py-1 text-right font-medium",children:e},e))]})}),(0,l.jsx)("tbody",{children:n.rows.slice(0,6).map(e=>(0,l.jsxs)("tr",{className:"border-t border-border/60",children:[(0,l.jsx)("td",{className:"py-1 font-mono",children:e.key}),[e.foreign,e.institution,e.individual].map((e,t)=>(0,l.jsx)("td",{className:"py-1 text-right tabular-nums ".concat(null===e?"text-muted-foreground":e>0?"text-emerald-600":e<0?"text-rose-600":""),children:m(e,{sign:!0})},t))]},e.key))})]})}),n.rows.length>6&&(0,l.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground",children:["…",n.rows.length-6,"줄 더 (전체는 회차 원본에)"]})]})}function g(e){let{a:t}=e,n=t.keyed;return(0,l.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"keyed-block",children:[(0,l.jsx)("h4",{className:"text-sm font-semibold",children:n.title}),(0,l.jsx)("dl",{className:"mt-2 grid gap-1 sm:grid-cols-2",children:n.entries.map(e=>(0,l.jsxs)("div",{className:"flex items-baseline justify-between gap-3 text-sm",children:[(0,l.jsx)("dt",{className:"text-muted-foreground",children:e.label}),(0,l.jsx)("dd",{className:"font-semibold tabular-nums",children:e.value})]},e.label))})]})}function p(e){let{a:t}=e;return(0,l.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"news-block",children:[(0,l.jsx)("h4",{className:"text-sm font-semibold",children:null===t.news.query?"뉴스":"뉴스: ".concat(t.news.query)}),0===t.news.items.length?(0,l.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:"수집된 기사가 0건이다."}):(0,l.jsx)("ul",{className:"mt-2 space-y-2",children:t.news.items.map((e,t)=>{var n,r,s,a;return(0,l.jsxs)("li",{className:"text-sm",children:[null===e.url?null!=(n=e.title)?n:"(제목 없음)":(0,l.jsx)("a",{className:"font-medium underline underline-offset-2",href:e.url,children:null!=(r=e.title)?r:e.url}),null!==e.date&&(0,l.jsx)("span",{className:"ml-2 text-xs text-muted-foreground",children:e.date})]},"".concat(null!=(a=null!=(s=e.url)?s:e.title)?a:"article","-").concat(t))})})]})}function b(e){let{a:t}=e;return(0,l.jsxs)("div",{className:"rounded-lg border border-rose-500/40 bg-rose-500/5 p-3","data-testid":"failure-block",children:[(0,l.jsxs)("div",{className:"flex flex-wrap items-baseline gap-2",children:[(0,l.jsx)("h4",{className:"font-mono text-sm font-semibold",children:t.name}),(0,l.jsx)("span",{className:"rounded bg-rose-500/15 px-2 py-0.5 text-xs font-medium text-rose-700",children:"이 단계가 \xab실패\xbb했다"})]}),(0,l.jsx)("p",{className:"mt-1 text-xs text-rose-700",children:t.kindOf}),(0,l.jsx)("p",{className:"mt-1 break-words font-mono text-xs text-muted-foreground",children:t.head})]})}function j(e){let{a:t}=e;return(0,l.jsxs)("div",{className:"rounded-lg border border-dashed border-border bg-background/40 p-3","data-testid":"unparsed-block",children:[(0,l.jsx)("h4",{className:"font-mono text-sm",children:t.name}),(0,l.jsxs)("p",{className:"mt-1 text-xs text-amber-600",children:["⚠️ 이 산출을 \xab못 읽었다\xbb — ",t.why]}),(0,l.jsx)("p",{className:"mt-1 truncate text-xs text-muted-foreground",children:t.head})]})}function N(e){var t;let{round:n}=e,r=null!==n.failed&&n.failed>0;return(0,l.jsxs)("article",{className:"rounded-xl border border-border bg-card p-5","data-testid":"round-".concat(null!=(t=n.runId)?t:"unknown"),children:[(0,l.jsxs)("header",{className:"flex flex-wrap items-baseline justify-between gap-2",children:[(0,l.jsx)("h3",{className:"text-lg font-semibold",children:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"Asia/Seoul";if(null===e)return"시각 \xab모름\xbb";let n=new Date(e);if(Number.isNaN(n.getTime()))return"시각을 \xab못 읽었다\xbb(".concat(e.slice(0,24),")");let l=new Intl.DateTimeFormat("ko-KR",{timeZone:t,month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1});return"".concat(l.format(n)," KST")}(n.atUtc)}),(0,l.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[(0,l.jsx)("span",{className:"rounded px-2 py-0.5 font-medium ".concat("cron"===n.source?"bg-emerald-500/15 text-emerald-700":"bg-muted text-muted-foreground"),children:"cron"===n.source?"무인(cron)":"manual"===n.source?"손":"출처 \xab모름\xbb"}),(0,l.jsxs)("span",{className:"rounded px-2 py-0.5 font-medium ".concat(r?"bg-rose-500/15 text-rose-700":"bg-muted text-muted-foreground"),children:[null===n.steps?"단계 \xab모름\xbb":"".concat(n.steps,"단계"),r&&" \xb7 실패 ".concat(n.failed)]}),(0,l.jsx)("span",{className:"rounded px-2 py-0.5 font-medium ".concat(!0===n.delivered?"bg-sky-500/15 text-sky-700":"bg-muted text-muted-foreground"),children:null===n.delivered?"배달 \xab모름\xbb":n.delivered?"폰에 갔다":"안 갔다"})]})]}),(0,l.jsxs)("div",{className:"mt-4 space-y-3",children:[n.artifacts.map((e,t)=>"quote"===e.kind?(0,l.jsx)(f,{a:e},t):"flow"===e.kind?(0,l.jsx)(h,{a:e},t):"news"===e.kind?(0,l.jsx)(p,{a:e},t):"keyed"===e.kind?(0,l.jsx)(g,{a:e},t):"failure"===e.kind?(0,l.jsx)(b,{a:e},t):(0,l.jsx)(j,{a:e},t)),0===n.artifacts.length&&0===n.textless.length&&(0,l.jsx)("p",{className:"text-sm text-muted-foreground",children:"이 회차에 산출이 \xab없다\xbb."}),n.textless.length>0&&(0,l.jsxs)("p",{className:"text-xs text-muted-foreground",children:["본문을 \xab안 받은\xbb 산출 ",n.textless.length,"건: ",n.textless.join(" \xb7 ")]})]})]})}function y(e){let{client:t,persona:n,title:s,subtitle:a,limit:o=3}=e,[i,d]=(0,r.useState)({kind:"loading"});return(0,r.useEffect)(()=>{let e=!0;return d({kind:"loading"}),x(t,n,o).then(t=>{e&&d(t)}),()=>{e=!1}},[t,n,o]),(0,l.jsxs)("section",{className:"flex flex-col gap-4","aria-label":"".concat(n," rounds"),"data-testid":"rounds-".concat(n),children:[(0,l.jsxs)("header",{children:[(0,l.jsx)("h2",{className:"text-xl font-bold",children:s}),(0,l.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:a})]}),"loading"===i.kind&&(0,l.jsx)("p",{role:"status",className:"text-sm text-muted-foreground",children:"투자 회차를 불러오는 중…"}),"error"===i.kind&&(0,l.jsxs)("div",{role:"alert",className:"rounded-lg border border-destructive/40 bg-destructive/5 p-3 text-sm",children:[(0,l.jsx)("p",{className:"font-medium text-destructive",children:"회차를 \xab못 받았다\xbb."}),(0,l.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:i.reason}),(0,l.jsxs)("p",{className:"mt-2 text-xs text-muted-foreground",children:["⚠️ 라우트 ",(0,l.jsx)("code",{className:"font-mono",children:"/v1/bots/rounds"})," 가 아직 \xab없을 수\xbb 있다(\uD83C\uDD63 축). 그때는 이 자리가 비는 것이 \xab맞다\xbb — 화면이 그것을 말하고 있다."]})]}),"ready"===i.kind&&0===i.rounds.length&&(0,l.jsxs)("p",{className:"text-sm text-muted-foreground",children:["회차가 \xab0건\xbb이다.",i.unreadable>0&&" (못 읽은 자리 ".concat(i.unreadable,"곳 — 「없다」가 아니다)")]}),"ready"===i.kind&&i.rounds.length>0&&(0,l.jsxs)(l.Fragment,{children:[i.unreadableNow>0?(0,l.jsxs)("p",{role:"alert",className:"text-xs text-amber-600",children:["⚠️ ***지금 못 읽는 자리 ",i.unreadableNow,"곳*** — 아래 수는 \xab과소\xbb다."]}):i.unreadable>0?(0,l.jsxs)("p",{className:"text-xs text-muted-foreground",children:["못 읽은 자리 ",i.unreadable,"곳(옛 회차) — 「지금 깨진 것」은 \xab없다\xbb."]}):null,(0,l.jsx)("div",{className:"flex flex-col gap-4",children:i.rounds.map(e=>{var t,n;return(0,l.jsx)(N,{round:e},null!=(n=null!=(t=e.runId)?t:e.atUtc)?n:Math.random())})})]})]})}function v(e){let{client:t,limit:n=3}=e;return(0,l.jsx)(y,{client:t,persona:"investor",limit:n,title:"\uD83D\uDCC8 투자 회차",subtitle:"봇이 \xab실제로 낸\xbb 산출이다. ⛔ 차트는 \xab일부러\xbb 안 그린다 — 글만 낸다."})}function w(e){let{client:t,limit:n=2}=e;return(0,l.jsx)(y,{client:t,persona:"assistant",limit:n,title:"\uD83D\uDDD3️ 비서 회차",subtitle:"안 읽은 메일\xb7앞으로의 일정. ⛔ 「0」도 \xab잰 값\xbb이라 그대로 보여 준다."})}function k(e){let{client:t,limit:n=2}=e;return(0,l.jsx)(y,{client:t,persona:"newsbot",limit:n,title:"\uD83D\uDCF0 뉴스 회차",subtitle:"⚠️ 이 봇의 산출은 꼴이 여럿이다 — 못 읽은 것은 \xab이름을 대고\xbb 남는다."})}async function _(e){try{let t=await e.fetchJson("/v1/bots/commands");return{kind:"ready",commands:t}}catch(e){return{kind:"error",reason:e instanceof Error&&e.message?e.message:"string"==typeof e&&e?e:"Unknown error"}}}function O(e){let{client:t}=e,n=(0,a.v)(t),[s,o]=(0,r.useState)({kind:"loading"});(0,r.useEffect)(()=>{let e=!0;return o({kind:"loading"}),_(t).then(t=>{e&&o(t)}),()=>{e=!1}},[t]);let i=n.error,d="error"===s.kind?s.reason:null,u=null!==i||null!==d,c=!u&&(n.loading||"loading"===s.kind),m="ready"===s.kind?s.commands:[],x=!c&&!u;return(0,l.jsxs)("main",{className:"mx-auto flex w-full max-w-5xl flex-col gap-6 px-6 py-10 sm:px-10","data-testid":"bots-panel",children:[(0,l.jsxs)("header",{children:[(0,l.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground",children:"Bot directory"}),(0,l.jsx)("h1",{className:"mt-2 text-3xl font-bold",children:"Bots"}),(0,l.jsx)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:"Commands are global: every bot exposes the same catalog."}),(0,l.jsx)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:"This surface cannot send commands yet; it only shows what you can ask bots to do."})]}),c&&(0,l.jsx)("p",{role:"status",className:"text-sm text-muted-foreground",children:"Loading bot identities and command catalog…"}),i&&(0,l.jsxs)("p",{role:"alert",className:"text-sm text-destructive",children:["Unable to load bot identities: ",i]}),d&&(0,l.jsxs)("p",{role:"alert",className:"text-sm text-destructive",children:["Unable to load bot catalog: ",d]}),x&&0===n.personas.length&&(0,l.jsx)("p",{className:"text-sm text-muted-foreground",children:"No bots are configured."}),x&&n.personas.length>0&&0===m.length&&(0,l.jsx)("p",{className:"text-sm text-muted-foreground",children:"No bot commands are available."}),(0,l.jsx)(v,{client:t}),(0,l.jsx)(w,{client:t}),(0,l.jsx)(k,{client:t}),x&&n.personas.length>0&&m.length>0&&(0,l.jsx)("section",{className:"grid gap-4 md:grid-cols-2","aria-label":"Bot identities",children:n.personas.map(e=>{var t;return(0,l.jsxs)("article",{className:"rounded-xl border border-border bg-card p-5","data-testid":"bot-card-".concat(e.personaId),children:[(0,l.jsx)("h2",{className:"text-lg font-semibold",children:e.displayName}),(0,l.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:null!=(t=e.description)?t:"No description provided."}),(0,l.jsx)("h3",{className:"mt-5 text-sm font-semibold",children:"Available commands"}),(0,l.jsx)("ul",{className:"mt-3 space-y-3","aria-label":"Available bot commands",children:m.map(e=>(0,l.jsxs)("li",{className:"rounded-lg border border-border bg-background/60 p-3",children:[(0,l.jsx)("h4",{className:"font-mono text-sm font-semibold",children:e.name}),(0,l.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:e.description}),e.arguments.length>0?(0,l.jsx)("ul",{className:"mt-2 space-y-1","aria-label":"".concat(e.name," arguments"),children:e.arguments.map(e=>(0,l.jsxs)("li",{className:"text-xs text-muted-foreground",children:[(0,l.jsx)("code",{className:"font-semibold text-foreground",children:e.name}),e.required?" (required)":" (optional)"," — ",e.description]},e.name))}):(0,l.jsx)("p",{className:"mt-2 text-xs text-muted-foreground",children:"No arguments."})]},e.name))})]},e.personaId)})})]})}function S(){let{client:e}=(0,s.Q)();return(0,l.jsx)(O,{client:e})}}},e=>{e.O(0,[3839,9096,1380,7358],()=>e(e.s=12982)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8457],{3720:(e,r,t)=>{"use strict";t.d(r,{A:()=>d});var i=t(8740);let l=function(){for(var e=arguments.length,r=Array(e),t=0;t<e;t++)r[t]=arguments[t];return r.filter((e,r,t)=>!!e&&""!==e.trim()&&t.indexOf(e)===r).join(" ").trim()},n=e=>{let r=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,r,t)=>t?t.toUpperCase():r.toLowerCase());return r.charAt(0).toUpperCase()+r.slice(1)};var a={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let o=(0,i.createContext)({}),s=(0,i.forwardRef)((e,r)=>{var t,n,s;let{color:d,size:u,strokeWidth:c,absoluteStrokeWidth:f,className:p="",children:b,iconNode:h,...g}=e,{size:m=24,strokeWidth:v=2,absoluteStrokeWidth:k=!1,color:w="currentColor",className:x=""}=null!=(t=(0,i.useContext)(o))?t:{},y=(null!=f?f:k)?24*Number(null!=c?c:v)/Number(null!=u?u:m):null!=c?c:v;return(0,i.createElement)("svg",{ref:r,...a,width:null!=(n=null!=u?u:m)?n:a.width,height:null!=(s=null!=u?u:m)?s:a.height,stroke:null!=d?d:w,strokeWidth:y,className:l("lucide",x,p),...!b&&!(e=>{for(let r in e)if(r.startsWith("aria-")||"role"===r||"title"===r)return!0;return!1})(g)&&{"aria-hidden":"true"},...g},[...h.map(e=>{let[r,t]=e;return(0,i.createElement)(r,t)}),...Array.isArray(b)?b:[b]])}),d=(e,r)=>{let t=(0,i.forwardRef)((t,a)=>{let{className:o,...d}=t;return(0,i.createElement)(s,{ref:a,iconNode:r,className:l("lucide-".concat(n(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),o),...d})});return t.displayName=n(e),t}},17342:(e,r,t)=>{"use strict";t.d(r,{A:()=>i});let i=(0,t(3720).A)("circle-alert",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["line",{x1:"12",x2:"12",y1:"8",y2:"12",key:"1pkeuh"}],["line",{x1:"12",x2:"12.01",y1:"16",y2:"16",key:"4dfq90"}]])},80060:(e,r,t)=>{Promise.resolve().then(t.bind(t,92347))},90814:(e,r,t)=>{"use strict";t.d(r,{p:()=>a});var i=t(54728);t(8740);var l=t(17701),n=t(99461);function a(e){let{className:r,type:t,...a}=e;return(0,i.jsx)(l.p,{type:t,"data-slot":"input",className:(0,n.cn)("h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",r),...a})}}},e=>{e.O(0,[7235,7482,5583,7701,6258,3089,3839,6820,1863,8617,2347,9096,1380,7358],()=>e(e.s=80060)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2580],{2565:(e,r,a)=>{"use strict";a.d(r,{U:()=>g});var t=a(54728),n=a(8740),s=a(3839),i=a(96598),o=a(90814);function l(e){let{items:r}=e;return 0===r.length?(0,t.jsx)("div",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:"No control signals matched the current filter."}):(0,t.jsx)("ul",{className:"space-y-2",children:r.map((e,r)=>{var a,n,s,i,o;let l=[(null==(a=e.scope)?void 0:a.surface)&&"surface=".concat(e.scope.surface),(null==(n=e.scope)?void 0:n.channel)&&"channel=".concat(e.scope.channel),(null==(s=e.scope)?void 0:s.sessionId)&&"session=".concat(e.scope.sessionId)].filter(Boolean).join(" \xb7 ")||"unscoped";return(0,t.jsxs)("li",{className:"rounded-lg border border-border bg-card p-3 shadow-sm",children:[(0,t.jsxs)("div",{className:"text-sm font-medium",children:[e.kind," \xb7 ",e.urgency]}),(0,t.jsxs)("div",{className:"mt-0.5 font-mono text-[10px] text-muted-foreground",children:[function(e){let r=Date.now()-new Date(e).getTime();return r<6e4?"just now":r<36e5?"".concat(Math.floor(r/6e4),"m ago"):r<864e5?"".concat(Math.floor(r/36e5),"h ago"):"".concat(Math.floor(r/864e5),"d ago")}(e.createdAt)," \xb7 ",null!=(i=e.source)?i:"unknown"," \xb7 ",l]}),(0,t.jsx)("pre",{className:"mt-2 overflow-x-auto rounded-md bg-muted p-2 text-[11px]",children:JSON.stringify(null!=(o=e.payload)?o:{},null,2)})]},r)})})}let d=["background","quick-pass","normal","priority","critical"];class c{async list(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=new URLSearchParams;Object.entries(e).forEach(e=>{let[a,t]=e;t&&r.set(a,t)});let a=r.toString();return this.client.fetchJson("/v1/control-signals".concat(a?"?".concat(a):""))}emit(e){return this.client.fetchJson("/v1/control-signals",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}constructor(e){this.client=e}}var u=a(25583),p=a(85351);function g(){var e,r,a,g;let{client:m}=(0,s.Q)(),x=(0,n.useMemo)(()=>new c(m),[m]),[v,h]=(0,n.useState)({items:[]}),[b,f]=(0,n.useState)(!1),[y,j]=(0,n.useState)(""),[N,k]=(0,n.useState)(""),[w,S]=(0,n.useState)(""),[z,C]=(0,n.useState)(""),[_,O]=(0,n.useState)(""),[E,J]=(0,n.useState)(""),[P,R]=(0,n.useState)("normal"),[$,D]=(0,n.useState)("operator"),[I,M]=(0,n.useState)(""),[U,q]=(0,n.useState)(""),[A,B]=(0,n.useState)(""),[F,Q]=(0,n.useState)(""),[T,Y]=(0,n.useState)(!1),K=(0,n.useCallback)(async()=>{(0,p.cY)("webterm.control.list.refresh",{kind:y,surface:N,minUrgency:w,sessionId:z,limit:_}),f(!0);try{let e=await x.list({kind:y||void 0,surface:N||void 0,minUrgency:w||void 0,sessionId:z||void 0,limit:_||void 0});h(e)}catch(e){u.oR.error("signals list failed: ".concat(e instanceof Error?e.message:e))}finally{f(!1)}},[x,y,N,w,z,_]);(0,n.useEffect)(()=>{K()},[K]);let L=async e=>{if(e.preventDefault(),!E.trim())return void u.oR.error("kind required");let r={};if(F.trim())try{r=JSON.parse(F)}catch(e){u.oR.error("payload must be valid JSON");return}let a={kind:E.trim(),urgency:P,source:$.trim()||"operator",mayPreempt:T,payload:r,scope:{...I?{surface:I}:{},...U?{channel:U}:{},...A?{sessionId:A}:{}}};(0,p.cY)("webterm.control.emit",{kind:a.kind,urgency:a.urgency});try{f(!0),await x.emit(a),u.oR.success("signal emitted"),Q(""),await K()}catch(e){u.oR.error("emit failed: ".concat(e instanceof Error?e.message:e))}finally{f(!1)}},V=null!=(e=v.countsByKind)?e:{};return(0,t.jsxs)("div",{className:"mx-auto max-w-5xl space-y-4 p-4",children:[(0,t.jsxs)("header",{className:"space-y-2",children:[(0,t.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Control signals"}),(0,t.jsxs)("div",{className:"flex flex-wrap gap-2 text-[11px] text-muted-foreground",children:[(0,t.jsxs)("span",{className:"rounded-full border border-border px-2 py-0.5",children:["total ",null!=(r=v.total)?r:0]}),(0,t.jsxs)("span",{className:"rounded-full border border-border px-2 py-0.5",children:["latest ",null!=(a=v.latest)?a:"-"]}),Object.entries(V).map(e=>{let[r,a]=e;return(0,t.jsxs)("span",{className:"rounded-full border border-border px-2 py-0.5",children:[r," ",a]},r)})]})]}),(0,t.jsxs)("form",{onSubmit:e=>{e.preventDefault(),K()},className:"flex flex-wrap items-center gap-2 rounded-lg border border-border bg-card p-3 shadow-sm",children:[(0,t.jsx)(o.p,{value:y,onChange:e=>j(e.target.value),placeholder:"kind",className:"flex-1 min-w-[140px]"}),(0,t.jsx)(o.p,{value:N,onChange:e=>k(e.target.value),placeholder:"surface",className:"flex-1 min-w-[140px]"}),(0,t.jsxs)("select",{value:w,onChange:e=>S(e.target.value),className:"h-9 flex-1 min-w-[170px] rounded-md border border-input bg-background px-2 text-sm",children:[(0,t.jsx)("option",{value:"",children:"min urgency (any)"}),d.map(e=>(0,t.jsx)("option",{value:e,children:e},e))]}),(0,t.jsx)(o.p,{value:z,onChange:e=>C(e.target.value),placeholder:"session id",className:"flex-1 min-w-[140px]"}),(0,t.jsx)(o.p,{value:_,onChange:e=>O(e.target.value),placeholder:"limit",type:"number",className:"w-[100px]"}),(0,t.jsx)(i.$,{type:"submit",size:"sm",disabled:b,children:"Filter"})]}),(0,t.jsxs)("form",{onSubmit:L,className:"space-y-2 rounded-lg border border-border bg-card p-3 shadow-sm",children:[(0,t.jsx)("h2",{className:"text-sm font-semibold",children:"Emit a signal"}),(0,t.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,t.jsx)(o.p,{value:E,onChange:e=>J(e.target.value),placeholder:"kind (required)",className:"flex-1 min-w-[140px]"}),(0,t.jsx)("select",{value:P,onChange:e=>{let r=e.target.value;"string"==typeof r&&d.includes(r)&&R(r)},className:"h-9 rounded-md border border-input bg-background px-2 text-sm",children:d.map(e=>(0,t.jsx)("option",{value:e,children:e},e))}),(0,t.jsx)(o.p,{value:$,onChange:e=>D(e.target.value),placeholder:"source",className:"flex-1 min-w-[120px]"}),(0,t.jsx)(o.p,{value:I,onChange:e=>M(e.target.value),placeholder:"scope.surface",className:"flex-1 min-w-[120px]"}),(0,t.jsx)(o.p,{value:U,onChange:e=>q(e.target.value),placeholder:"scope.channel",className:"flex-1 min-w-[120px]"}),(0,t.jsx)(o.p,{value:A,onChange:e=>B(e.target.value),placeholder:"scope.session",className:"flex-1 min-w-[120px]"}),(0,t.jsxs)("label",{className:"flex items-center gap-1.5 text-xs",children:[(0,t.jsx)("input",{type:"checkbox",checked:T,onChange:e=>Y(e.target.checked)}),"mayPreempt"]})]}),(0,t.jsx)("textarea",{value:F,onChange:e=>Q(e.target.value),placeholder:'payload JSON (optional, e.g. {"reason":"manual"})',rows:3,className:"w-full resize-y rounded-md border border-input bg-background px-3 py-2 font-mono text-xs"}),(0,t.jsx)(i.$,{type:"submit",size:"sm",disabled:b,children:"Emit"})]}),(0,t.jsx)(l,{items:null!=(g=v.items)?g:[]})]})}},28769:(e,r,a)=>{"use strict";a.r(r),a.d(r,{default:()=>s});var t=a(54728),n=a(2565);function s(){return(0,t.jsx)(n.U,{})}},83343:(e,r,a)=>{Promise.resolve().then(a.bind(a,28769))},90814:(e,r,a)=>{"use strict";a.d(r,{p:()=>i});var t=a(54728);a(8740);var n=a(17701),s=a(99461);function i(e){let{className:r,type:a,...i}=e;return(0,t.jsx)(n.p,{type:a,"data-slot":"input",className:(0,s.cn)("h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",r),...i})}},96598:(e,r,a)=>{"use strict";a.d(r,{$:()=>l});var t=a(54728),n=a(86649),s=a(76882),i=a(99461);let o=(0,s.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function l(e){let{className:r,variant:a="default",size:s="default",...l}=e;return(0,t.jsx)(n.$,{"data-slot":"button",className:(0,i.cn)(o({variant:a,size:s,className:r})),...l})}},99461:(e,r,a)=>{"use strict";a.d(r,{cn:()=>s});var t=a(41828),n=a(568);function s(){for(var e=arguments.length,r=Array(e),a=0;a<e;a++)r[a]=arguments[a];return(0,n.QP)((0,t.$)(r))}}},e=>{e.O(0,[7235,7482,5583,7701,3839,9096,1380,7358],()=>e(e.s=83343)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5105],{3720:(e,t,s)=>{"use strict";s.d(t,{A:()=>d});var l=s(8740);let a=function(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];return t.filter((e,t,s)=>!!e&&""!==e.trim()&&s.indexOf(e)===t).join(" ").trim()},r=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,s)=>s?s.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)};var n={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let c=(0,l.createContext)({}),o=(0,l.forwardRef)((e,t)=>{var s,r,o;let{color:d,size:i,strokeWidth:u,absoluteStrokeWidth:x,className:m="",children:p,iconNode:h,...g}=e,{size:f=24,strokeWidth:b=2,absoluteStrokeWidth:j=!1,color:v="currentColor",className:N=""}=null!=(s=(0,l.useContext)(c))?s:{},y=(null!=x?x:j)?24*Number(null!=u?u:b)/Number(null!=i?i:f):null!=u?u:b;return(0,l.createElement)("svg",{ref:t,...n,width:null!=(r=null!=i?i:f)?r:n.width,height:null!=(o=null!=i?i:f)?o:n.height,stroke:null!=d?d:v,strokeWidth:y,className:a("lucide",N,m),...!p&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(g)&&{"aria-hidden":"true"},...g},[...h.map(e=>{let[t,s]=e;return(0,l.createElement)(t,s)}),...Array.isArray(p)?p:[p]])}),d=(e,t)=>{let s=(0,l.forwardRef)((s,n)=>{let{className:c,...d}=s;return(0,l.createElement)(o,{ref:n,iconNode:t,className:a("lucide-".concat(r(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),c),...d})});return s.displayName=r(e),s}},33303:(e,t,s)=>{"use strict";s.d(t,{A:()=>l});let l=(0,s(3720).A)("refresh-cw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]])},49987:(e,t,s)=>{"use strict";var l=s(95115);s.o(l,"useParams")&&s.d(t,{useParams:function(){return l.useParams}}),s.o(l,"usePathname")&&s.d(t,{usePathname:function(){return l.usePathname}}),s.o(l,"useRouter")&&s.d(t,{useRouter:function(){return l.useRouter}}),s.o(l,"useSearchParams")&&s.d(t,{useSearchParams:function(){return l.useSearchParams}})},64716:(e,t,s)=>{Promise.resolve().then(s.bind(s,80370))},80370:(e,t,s)=>{"use strict";s.d(t,{DashboardTabs:()=>J});var l=s(54728),a=s(8740),r=s(33303),n=s(3839),c=s(96598);function o(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,s=Math.max(-1,Math.min(1,e/(2.5*t)));return .1>Math.abs(s)?"hsl(0 0% 50% / 0.15)":s>0?"hsl(142 60% 40% / ".concat(.15+.5*s,")"):"hsl(0 70% 48% / ".concat(.15+-(.5*s),")")}let d=e=>"".concat(e>0?"+":"").concat(e.toFixed(1),"%"),i=e=>{try{return new Date(e).toLocaleString("ko-KR",{timeZone:"Asia/Seoul",month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit"})}catch(t){return e}},u=e=>{try{return new Date(e).toLocaleString("ko-KR",{timeZone:"Asia/Seoul",hour:"2-digit",minute:"2-digit"})}catch(t){return e}};function x(e){let{label:t,value:s,bg:a,corner:r,cornerBottom:n}=e;return(0,l.jsxs)("div",{className:"relative flex flex-col items-center justify-center rounded-md px-1.5 py-1.5 text-center",style:{background:a},children:[r?(0,l.jsx)("span",{className:"absolute right-1 top-0.5 text-[10px]",children:r}):null,n?(0,l.jsx)("span",{className:"absolute bottom-0.5 right-0.5 text-xs leading-none",children:n}):null,(0,l.jsx)("span",{className:"text-[11px] leading-tight text-foreground/80",children:t}),(0,l.jsx)("span",{className:"text-xs font-semibold tabular-nums",children:s})]})}function m(e){let{title:t,sub:s,children:a,right:r}=e;return(0,l.jsxs)("div",{className:"rounded-xl border bg-card p-3 shadow-sm",children:[(0,l.jsxs)("div",{className:"mb-2 flex items-center justify-between gap-2",children:[(0,l.jsxs)("div",{className:"flex items-baseline gap-2",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:t}),s?(0,l.jsx)("span",{className:"text-[10px] text-muted-foreground",children:s}):null]}),r]}),a]})}function p(e){let{backtest:t}=e;if(!t)return(0,l.jsx)("p",{className:"p-4 text-xs text-muted-foreground",children:"백테스팅 루프 미실행 — 평일 20:00 크론(`bun scripts/backtest-cycle.ts`) 후 표시됩니다."});let s=e=>"CONFIRMED"===e?"text-emerald-500":"REJECTED"===e?"text-red-500":"text-muted-foreground";return(0,l.jsxs)("div",{className:"flex flex-col gap-3",children:[(0,l.jsxs)(m,{title:"\uD83E\uDDEA 백테스팅 루프",sub:"총 ".concat(t.stats.total," 실험 \xb7 오늘 ").concat(t.stats.today," \xb7 CONFIRMED ").concat(t.stats.confirmed," \xb7 페이퍼 체결 ").concat(t.stats.paperFills),children:[Object.keys(t.byVerdict).length?(0,l.jsx)("div",{className:"mb-2 flex flex-wrap gap-1.5 text-[10px]",children:Object.entries(t.byVerdict).map(e=>{let[t,a]=e;return(0,l.jsxs)("span",{className:"rounded bg-secondary px-1.5 py-0.5 ".concat(s(t)),children:[t," ",a]},t)})}):(0,l.jsx)("p",{className:"mb-2 text-[10px] text-muted-foreground",children:"오늘 실험 없음"}),(0,l.jsx)("p",{className:"mb-1 text-[10px] uppercase tracking-wide text-muted-foreground",children:"최근 실험 (모멘텀\xb7스윙 가설)"}),t.recent.length?(0,l.jsx)("ul",{className:"flex flex-col gap-1",children:t.recent.slice(0,12).map(e=>(0,l.jsxs)("li",{className:"flex items-center justify-between gap-2 border-b border-border/40 py-1 text-xs last:border-0",children:[(0,l.jsxs)("div",{className:"min-w-0",children:[(0,l.jsxs)("p",{className:"truncate font-medium",children:[e.concept," \xb7 ",e.strategy]}),(0,l.jsx)("p",{className:"truncate text-[10px] text-muted-foreground",children:e.hypothesis})]}),(0,l.jsxs)("div",{className:"flex shrink-0 items-center gap-1.5 text-[10px] tabular-nums",children:[(0,l.jsx)("span",{className:s(e.verdict),children:e.verdict}),null!=e.sharpe?(0,l.jsxs)("span",{className:"text-muted-foreground",children:["Sh ",e.sharpe]}):null,null!=e.pbo?(0,l.jsxs)("span",{className:"text-muted-foreground",children:["PBO ",e.pbo]}):null]})]},e.id))}):(0,l.jsx)("p",{className:"text-[10px] text-muted-foreground",children:"실험 없음"})]}),t.promotions.length?(0,l.jsx)(m,{title:"\uD83D\uDE80 승격 이력",sub:"".concat(t.promotions.length,"건"),children:(0,l.jsx)("ul",{className:"flex flex-col gap-1",children:t.promotions.map((e,t)=>(0,l.jsxs)("li",{className:"flex items-center justify-between gap-2 border-b border-border/40 py-1 text-xs last:border-0",children:[(0,l.jsx)("span",{className:"min-w-0 truncate",children:e.expId}),(0,l.jsxs)("span",{className:"shrink-0 text-[10px] text-muted-foreground",children:[e.stage," \xb7 ",e.fund]})]},t))})}):null,(0,l.jsx)("p",{className:"text-[10px] text-muted-foreground",children:"페이퍼\xb7disarmed \xb7 실집행은 대표 arm 게이트(aggressive fund) \xb7 승격 게이트 PBO<10%\xb7DSR>0\xb7CPCV≥85%\xb7OOS Sharpe>1.5\xb7WRC\xb7Pre-Bull"})]})}function h(e){let{value:t,onChange:s}=e;return(0,l.jsx)("div",{className:"flex overflow-hidden rounded-md border text-[11px]",children:["day","week"].map(e=>(0,l.jsx)("button",{type:"button",onClick:()=>s(e),className:"px-2 py-0.5 ".concat(t===e?"bg-primary text-primary-foreground":"bg-background text-muted-foreground"),children:"day"===e?"일간":"주간"},e))})}function g(e){let{moves:t,live:s,range:a}=e,r=new Map((null!=s?s:[]).map(e=>[e.symbol,e.dayPct])),n=t.map(e=>{var t;let s="day"===a?r.get(e.symbol):void 0,l="week"===a?null!=(t=e.weekPct)?t:0:null!=s?s:e.dayPct;return{...e,v:l,isLive:null!=s}}).sort((e,t)=>t.v-e.v),c="week"===a?3:1;return(0,l.jsx)("div",{className:"grid grid-cols-4 gap-1.5 sm:grid-cols-6",children:n.map(e=>(0,l.jsx)(x,{label:e.name,bg:o(e.v,c),value:"".concat(d(e.v)).concat("day"===a&&Math.abs(e.streak)>=3?e.streak>0?" ↑".concat(e.streak):" ↓".concat(-e.streak):""),...e.isLive?{corner:"\xb7"}:{}},e.symbol))})}function f(e){let{r:t}=e;return(0,l.jsxs)("li",{className:"flex items-center justify-between gap-2 border-b border-border/40 py-1 last:border-0",children:[(0,l.jsxs)("div",{className:"min-w-0",children:[(0,l.jsx)("p",{className:"truncate text-xs font-medium",children:t.name}),(0,l.jsx)("p",{className:"text-[10px] text-muted-foreground",children:t.symbol})]}),(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)("span",{className:"text-xs tabular-nums",children:t.last.toLocaleString(void 0,{maximumFractionDigits:2})}),(0,l.jsx)("span",{className:"w-14 rounded px-1 py-0.5 text-center text-[11px] font-semibold tabular-nums",style:{background:o(t.dayPct)},children:d(t.dayPct)})]})]})}function b(){var e,t,s,b,j,v,N,y,k,w,D,S,C,E,M,L,O,P,A,R,I,F,T,U;let{config:z}=(0,n.Q)(),[B,J]=(0,a.useState)(null),[_,W]=(0,a.useState)(null),[$,H]=(0,a.useState)([]),[V,q]=(0,a.useState)([]),[K,Q]=(0,a.useState)(null),[Z,Y]=(0,a.useState)(null),[G,X]=(0,a.useState)(null),[ee,et]=(0,a.useState)(null),[es,el]=(0,a.useState)("overview"),[ea,er]=(0,a.useState)("day"),[en,ec]=(0,a.useState)(!1),[eo,ed]=(0,a.useState)(!1),[ei,eu]=(0,a.useState)(null),ex=(0,a.useCallback)(async()=>{if(!z.baseUrl)return;ec(!0);let e=async e=>{let t=await fetch("".concat(z.baseUrl).concat(e),{...z.token?{headers:{authorization:"Bearer ".concat(z.token)}}:{}});if(!t.ok)throw Error("HTTP ".concat(t.status," (").concat(e,")"));return t.json()};try{var t,s,l,a,r,n;let[c,o,d,i,u,x,m,p]=await Promise.all([e("/v1/dashboard/summary"),e("/v1/dashboard/heatmap"),e("/v1/dashboard/timeline?hours=48&floor=6"),e("/v1/dashboard/digs?limit=8"),e("/v1/dashboard/schedules"),e("/v1/dashboard/ontology"),e("/v1/dashboard/backtest"),e("/v1/dashboard/loops")]);J(c.summary),W(o.heatmap),H(null!=(t=d.signals)?t:[]),q(null!=(s=i.digs)?s:[]),Q(null!=(l=u.schedules)?l:null),X(null!=(a=m.backtest)?a:null),Y(null!=(r=x.ontology)?r:null),et(null!=(n=p.loops)?n:null),eu(null)}catch(e){eu(String(e instanceof Error?e.message:e))}finally{ec(!1)}},[z.baseUrl,z.token]);(0,a.useEffect)(()=>{ex();let e=setInterval(()=>{ex()},6e4);return()=>clearInterval(e)},[ex]);let em=(0,a.useCallback)(async()=>{if(ex(),z.baseUrl)try{let e=await fetch("".concat(z.baseUrl,"/v1/dashboard/refresh-live"),{method:"POST",...z.token?{headers:{authorization:"Bearer ".concat(z.token)}}:{}});(await e.json()).started&&(ed(!0),setTimeout(()=>{ex()},25e3),setTimeout(()=>{ex(),ed(!1)},55e3))}catch(e){}},[z.baseUrl,z.token,ex]),ep=null!=(S=null==_?void 0:_.usSectors)?S:null,eh=null!=(C=null==_?void 0:_.krSectors)?C:null,eg=null!=(E=null==_?void 0:_.attractiveness)?E:null,ef=null!=(M=null==_?void 0:_.live)?M:null,eb=ef?"\uD83D\uDD34 라이브 ".concat(u(ef.ts)," (").concat(ef.session.us.startsWith("OPEN")||"PRE"===ef.session.us||"AFTER"===ef.session.us?"US ".concat(ef.session.us):"KR ".concat(ef.session.kr),")"):null;return(0,l.jsxs)("section",{"data-testid":"finance-dashboard-panel",className:"mx-auto flex max-w-5xl flex-col gap-3 p-3 pb-16",children:[(0,l.jsxs)("header",{className:"flex items-start justify-between gap-2",children:[(0,l.jsxs)("div",{children:[(0,l.jsx)("h1",{className:"font-heading text-lg font-medium",children:"시그널 대시보드"}),(0,l.jsxs)("p",{className:"text-xs text-muted-foreground",children:[(null==B||null==(e=B.capstone)?void 0:e.target)?(0,l.jsxs)(l.Fragment,{children:["캡스톤 ",(0,l.jsx)("span",{className:"rounded bg-primary/10 px-1.5 py-0.5 font-semibold text-primary",children:B.capstone.target})," "]}):null,"신호 24h ",null!=(L=null==B||null==(t=B.signals)?void 0:t.day.total)?L:"–","건 \xb7 7d ",null!=(O=null==B||null==(s=B.signals)?void 0:s.week.total)?O:"–","건(\uD83D\uDEA8",null!=(P=null==B||null==(b=B.signals)?void 0:b.week.alerted)?P:0,") \xb7 디깅 7d ",null!=(A=null==B||null==(j=B.digs)?void 0:j.week)?A:0,"건",eb?(0,l.jsxs)(l.Fragment,{children:[" \xb7 ",(0,l.jsx)("span",{className:"font-medium text-foreground",children:eb})]}):" \xb7 EOD"]})]}),(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)(h,{value:ea,onChange:er}),(0,l.jsx)(c.$,{type:"button",variant:"ghost",size:"sm","aria-label":"refresh dashboard",onClick:()=>{em()},children:(0,l.jsx)(r.A,{className:"size-4 ".concat(en||eo?"animate-spin":"")})})]})]}),ei?(0,l.jsx)("p",{className:"rounded-md bg-destructive/10 px-2 py-1 text-xs text-destructive",children:ei}):null,(0,l.jsx)("div",{className:"flex gap-1 border-b border-border/40",children:["overview","backtest"].map(e=>(0,l.jsx)("button",{type:"button",onClick:()=>el(e),className:"px-3 py-1.5 text-xs font-medium transition-colors ".concat(es===e?"border-b-2 border-primary text-primary":"text-muted-foreground hover:text-foreground"),children:"overview"===e?"개요":"\uD83E\uDDEA 백테스팅"},e))}),(0,l.jsxs)("div",{className:"grid gap-3 lg:grid-cols-[1fr_300px] ".concat("overview"===es?"":"hidden"),children:[(0,l.jsxs)("div",{className:"flex min-w-0 flex-col gap-3",children:[ep?(0,l.jsxs)(m,{title:"\uD83C\uDDFA\uD83C\uDDF8 US 섹터 순환",sub:"day"===ea?(null==ef||null==(v=ef.usSectors)?void 0:v.length)?"라이브 ".concat(u(ef.ts)):"".concat(ep.date," EOD"):"주간 (5거래일) \xb7 ~".concat(ep.date),children:[(0,l.jsx)("div",{className:"mb-2 grid grid-cols-3 gap-1.5",children:("day"===ea&&(null==ef||null==(N=ef.usAnchors)?void 0:N.length)?ef.usAnchors.map(e=>({symbol:e.symbol,name:e.name,v:e.dayPct})):ep.anchors.map(e=>{var t;return{symbol:e.symbol,name:e.name,v:"week"===ea?null!=(t=e.weekPct)?t:0:e.dayPct}})).map(e=>(0,l.jsx)(x,{label:e.name,value:d(e.v),bg:o(e.v,"week"===ea?3:1)},e.symbol))}),(0,l.jsx)(g,{moves:ep.sectors,live:null!=(R=null==ef?void 0:ef.usSectors)?R:null,range:ea}),ep.notables.length?(0,l.jsx)("div",{className:"mt-2 flex flex-wrap gap-1",children:ep.notables.map(e=>{var t,s,a,r;let n="day"===ea?(null!=(t=null==ef?void 0:ef.notables)?t:[]).concat(null!=(s=null==ef?void 0:ef.stocks)?s:[]).find(t=>t.symbol===e.symbol):void 0,c="week"===ea?null!=(a=e.weekPct)?a:e.dayPct:null!=(r=null==n?void 0:n.dayPct)?r:e.dayPct;return(0,l.jsxs)("span",{className:"rounded-full px-2 py-0.5 text-[11px] font-medium",style:{background:o(c,"week"===ea?5:2)},children:[e.symbol," ",d(c),n?"\xb7L":"",Math.abs(e.streak)>=4?e.streak>0?" ↑".concat(e.streak,"d"):" ↓".concat(-e.streak,"d"):"",e.high20&&e.dayPct>0?" \uD83C\uDFD4":""]},e.symbol)})}):null]}):null,eh?(0,l.jsx)(m,{title:"\uD83C\uDDF0\uD83C\uDDF7 KR 섹터 (KODEX)",sub:"day"===ea?(null==ef||null==(y=ef.krSectors)?void 0:y.length)?"라이브 ".concat(u(ef.ts)):"".concat(eh.date," EOD"):"주간 (5거래일)",children:(0,l.jsx)(g,{moves:eh.sectors,live:null!=(I=null==ef?void 0:ef.krSectors)?I:null,range:ea})}):null,eg?(0,l.jsxs)(m,{title:"\uD83C\uDF10 매력도 (자산\xd7국가\xd7섹터)",sub:"".concat(null!=(F=eg.asOf)?F:"?"," \xb7 Δ는 ").concat(null!=(T=eg.prevAsOf)?T:"직전"," 대비 방향"),children:[["asset","country","sector"].map(e=>eg[e].length?(0,l.jsxs)("div",{className:"mb-1.5",children:[(0,l.jsx)("p",{className:"mb-1 text-[10px] uppercase tracking-wide text-muted-foreground",children:"asset"===e?"자산군":"country"===e?"국가":"섹터"}),(0,l.jsx)("div",{className:"grid grid-cols-4 gap-1.5 sm:grid-cols-6",children:eg[e].map(e=>(0,l.jsx)(x,{label:e.label,bg:o(e.score-50,10),value:String(e.score),...e.dir?{corner:"up"===e.dir?"▲":"down"===e.dir?"▼":"─"}:{},..."BUY"===e.signal?{cornerBottom:"✅"}:"SELL"===e.signal?{cornerBottom:"⛔"}:{}},e.key))})]},e):null),(0,l.jsx)("p",{className:"mt-1 text-[10px] text-muted-foreground",children:"셀 색=점수(50 중립) \xb7 우상단 ▲▼=변화 방향 \xb7 우하단 ✅매수/⛔매도 시그널(\xb11σ\xb7HOLD 생략)"})]}):null,(null==_||null==(k=_.newsSectors)?void 0:k.length)?(0,l.jsx)(m,{title:"\uD83D\uDCE1 뉴스 신호 섹터 분포",sub:"7일 \xb7 유의(6+)",children:(0,l.jsx)("div",{className:"flex flex-wrap gap-1",children:_.newsSectors.map(e=>{var t;return(0,l.jsxs)("span",{className:"rounded-full bg-secondary px-2 py-0.5 text-[11px]",children:[null!=(t=e.label)?t:e.sector," ",(0,l.jsx)("b",{children:e.n})]},e.sector)})})}):null,(0,l.jsx)(m,{title:"\uD83D\uDD52 신호 타임라인",sub:"48h \xb7 floor 6+",children:0===$.length?(0,l.jsx)("p",{className:"text-xs text-muted-foreground",children:"신호 없음"}):(0,l.jsx)("ul",{className:"flex flex-col gap-2",children:$.slice(0,12).map(e=>{var t,s,a,r,n;return(0,l.jsxs)("li",{className:"border-l-2 pl-2 text-xs",style:{borderColor:o((null!=(t=e.market)?t:0)-5,2)},children:[(0,l.jsxs)("span",{className:"text-[10px] text-muted-foreground",children:[i(e.ts)," \xb7 ",e.author,e.alerted?" \xb7 \uD83D\uDEA8":""," \xb7 [",null!=(s=e.sector)?s:"?",null!=(a=e.impact)?a:0,"\xb7시장",null!=(r=e.market)?r:0,"]"]}),(0,l.jsx)("p",{className:"leading-snug",children:null!=(n=e.reason)?n:e.text.slice(0,150)}),e.url?(0,l.jsxs)("a",{href:e.url,target:"_blank",rel:"noopener noreferrer",className:"mt-0.5 inline-block text-[10px] text-primary underline-offset-2 hover:underline",children:[e.url.includes("//x.com")?"\uD835\uDD4F":e.url.includes("t.me")?"Telegram":"기사"," 원문 ↗"]}):e.reason?(0,l.jsxs)("details",{className:"mt-0.5",children:[(0,l.jsx)("summary",{className:"cursor-pointer text-[10px] text-muted-foreground",children:"원문"}),(0,l.jsx)("p",{className:"text-[11px] leading-snug text-foreground/70",children:e.text.slice(0,200)})]}):null]},e.id)})})}),(0,l.jsx)(m,{title:"\uD83D\uDD0E 디깅 피드",sub:"적응 해상도 \xb7 최근 8",children:0===V.length?(0,l.jsx)("p",{className:"text-xs text-muted-foreground",children:"디깅 없음"}):(0,l.jsx)("ul",{className:"flex flex-col gap-2",children:V.map(e=>(0,l.jsxs)("li",{className:"rounded-md bg-secondary/50 p-2 text-xs",children:[(0,l.jsxs)("p",{className:"mb-1 text-[10px] text-muted-foreground",children:[i(e.ts)," \xb7 ",e.sector," \xb7 확신도 ",e.confidence]}),(0,l.jsx)("p",{className:"font-medium leading-snug",children:e.topic.slice(0,110)}),(0,l.jsxs)("details",{className:"mt-1",children:[(0,l.jsx)("summary",{className:"cursor-pointer text-[11px] text-primary",children:"분석 보기"}),(0,l.jsx)("p",{className:"mt-1 whitespace-pre-wrap leading-relaxed text-foreground/90",children:e.verdict})]})]},e.id))})}),K?(0,l.jsx)(m,{title:"\uD83D\uDDD3 스케줄러",sub:"".concat(K.total,"잡 \xb7 elanous실행 ").concat(K.adopted," \xb7 ").concat(Object.entries(K.byCategory).map(e=>{let[t,s]=e;return"".concat(t," ").concat(s)}).join(" \xb7 ")),children:(0,l.jsx)("ul",{className:"flex flex-col gap-1",children:K.jobs.slice(0,40).map(e=>{var t;return(0,l.jsxs)("li",{className:"flex items-center justify-between gap-2 border-b border-border/40 py-1 text-xs last:border-0",children:[(0,l.jsxs)("div",{className:"min-w-0",children:[(0,l.jsxs)("p",{className:"truncate font-medium",children:[e.enabled?"":"⏸ ",e.name]}),(0,l.jsxs)("p",{className:"truncate text-[10px] text-muted-foreground",children:[null!=(t=e.cron)?t:e.intervalMs?"".concat(Math.round(e.intervalMs/6e4),"분"):"?"," \xb7 ",e.category,"crontab"!==e.source?" \xb7 ".concat(e.source):""]})]}),(0,l.jsxs)("div",{className:"flex shrink-0 items-center gap-1.5",children:["elanous"===e.runVia?(0,l.jsx)("span",{className:"rounded bg-primary/20 px-1 text-[10px] text-primary",children:"elanous"}):"daemon"===e.runVia?(0,l.jsx)("span",{className:"rounded bg-secondary px-1 text-[10px] text-muted-foreground",children:"daemon"}):null,e.lastRun?(0,l.jsx)("span",{className:"text-[10px] tabular-nums text-muted-foreground",children:u(e.lastRun)}):null]})]},e.id)})})}):null,Z?(0,l.jsxs)(m,{title:"\uD83E\uDDE0 온톨로지",sub:"".concat(Z.stats.nodes," 노드 \xb7 ").concat(Z.stats.edges," 엣지 \xb7 ").concat(Z.stats.chains," 체인 \xb7 ").concat(Z.stats.companies," 종목").concat(Z.causalEdges?" \xb7 인과 ".concat(Z.causalEdges):""),children:[Z.propagation.length>0?(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)("p",{className:"mb-1 text-[10px] uppercase tracking-wide text-muted-foreground",children:"미국 → 한국 전파 (lead-lag)"}),(0,l.jsx)("ul",{className:"mb-2 flex flex-col gap-1",children:Z.propagation.slice(0,10).map((e,t)=>(0,l.jsxs)("li",{className:"flex items-center justify-between gap-2 border-b border-border/40 py-1 text-xs last:border-0",children:[(0,l.jsxs)("span",{className:"min-w-0 truncate",children:[e.from," ",(0,l.jsx)("span",{className:"text-muted-foreground",children:"→"})," ",e.to]}),(0,l.jsxs)("span",{className:"shrink-0 tabular-nums text-[10px]",children:[(0,l.jsxs)("span",{className:"동조"===e.dir?"text-emerald-500":"text-red-500",children:["동조"===e.dir?"▲":"▼"," ",Math.abs(e.weight).toFixed(2)]}),(0,l.jsxs)("span",{className:"text-muted-foreground",children:[" \xb7 ",e.leadLag,"일"]})]})]},t))})]}):(0,l.jsx)("p",{className:"mb-2 text-[10px] text-muted-foreground",children:"측정된 전파 없음"}),Z.p7m7?(0,l.jsxs)("p",{className:"text-[10px] text-muted-foreground",children:["P7↔M7 로테이션: ",(0,l.jsxs)("span",{className:"역관계"===Z.p7m7.relation?"text-red-500":"text-emerald-500",children:[Z.p7m7.relation," (",Z.p7m7.weight.toFixed(2),")"]})]}):null,(0,l.jsxs)("p",{className:"mt-1 truncate text-[10px] text-muted-foreground",children:["체인: ",Z.chains.join(" \xb7 ")]})]}):null,ee&&ee.loops.length>0?(0,l.jsx)(m,{title:"\uD83D\uDD01 자율 루프",sub:"".concat(ee.loops.length,"개 \xb7 run 상태 관측"),children:(0,l.jsx)("ul",{className:"flex flex-col gap-1",children:ee.loops.map(e=>(0,l.jsxs)("li",{className:"flex items-center justify-between gap-2 border-b border-border/40 py-1 text-xs last:border-0",children:[(0,l.jsxs)("span",{className:"min-w-0 truncate",children:[null===e.armed?(0,l.jsx)("span",{className:"text-muted-foreground",children:"◦"}):(0,l.jsx)("span",{className:e.armed?"text-emerald-500":"text-muted-foreground",children:e.armed?"● armed":"○ off"}),(0,l.jsx)("span",{className:"ml-1",children:e.label})]}),(0,l.jsxs)("span",{className:"shrink-0 tabular-nums text-[10px] text-muted-foreground",children:["오늘 ",e.today,e.last?(0,l.jsxs)("span",{className:"ml-1",children:["\xb7 ",e.last.status]}):null]})]},e.name))})}):null]}),(0,l.jsxs)("aside",{className:"flex flex-col gap-3",children:[(null==B?void 0:B.capstone)?(0,l.jsxs)(m,{title:"\uD83E\uDDED 캡스톤 (삼성 슬리브)",sub:B.capstone.updatedAt?"".concat(i(B.capstone.updatedAt)," EOD"):void 0,children:[(0,l.jsxs)("div",{className:"mb-2 flex items-center gap-2",children:[(0,l.jsx)("span",{className:"rounded bg-primary/10 px-2 py-0.5 text-sm font-bold text-primary",children:null!=(U=B.capstone.target)?U:"?"}),null!=B.capstone.targetExposure?(0,l.jsxs)("span",{className:"text-xs text-muted-foreground",children:["목표 ",B.capstone.targetExposure,"\xd7"]}):null]}),B.capstone.label?(0,l.jsx)("p",{className:"mb-2 text-[11px] text-muted-foreground",children:B.capstone.label}):null,B.capstone.signals?(0,l.jsx)("ul",{className:"flex flex-col gap-1",children:["A","B","C","D","E"].map(e=>{let t=B.capstone.signals[e];return t?(0,l.jsxs)("li",{className:"flex items-center justify-between gap-2 text-xs",children:[(0,l.jsxs)("span",{className:"flex items-center gap-1.5",children:[(0,l.jsx)("span",{className:"inline-block size-2 rounded-full ".concat(t.bear?"bg-red-500":"bg-emerald-500")}),(0,l.jsx)("b",{children:e})," ",t.name]}),(0,l.jsx)("span",{className:"text-right text-[11px] text-muted-foreground",children:t.detail})]},e):null})}):(0,l.jsx)("p",{className:"text-[11px] text-muted-foreground",children:"A~E 상세는 다음 08:30 신호 갱신부터"}),B.capstone.samsung?(0,l.jsxs)("p",{className:"mt-2 text-[11px] text-muted-foreground",children:["삼성전자 ₩",B.capstone.samsung.toLocaleString(),B.capstone.r3Level?(0,l.jsxs)(l.Fragment,{children:[" \xb7 ",(0,l.jsxs)("b",{className:"text-foreground/90",children:["R3 ₩",B.capstone.r3Level.toLocaleString()]})," 회복 시 LONG"," ","(",(0,l.jsx)("span",{className:"tabular-nums",children:d((B.capstone.r3Level/B.capstone.samsung-1)*100)})," 남음)"]}):" \xb7 R3 회복 시 LONG 전환"]}):null,!1===B.capstone.reliable?(0,l.jsx)("p",{className:"mt-1 rounded bg-destructive/10 px-1.5 py-0.5 text-[10px] text-destructive",children:"⚠️ EOD 조회 실패 — 신호 신뢰 불가(fail-closed)"}):null,(0,l.jsx)("p",{className:"mt-1.5 text-[10px] text-muted-foreground",children:"\uD83D\uDD34 방어 요인 발동 \xb7 \uD83D\uDFE2 정상 \xb7 E는 발동=매수기회(과도폭락 반등)"})]}):null,(0,l.jsx)(m,{title:"\uD83D\uDCC8 지수\xb7FX",sub:ef?"라이브 ".concat(u(ef.ts)):"수집 대기",children:(null==ef||null==(w=ef.indices)?void 0:w.length)?(0,l.jsx)("ul",{children:ef.indices.map(e=>(0,l.jsx)(f,{r:e},e.symbol))}):(0,l.jsx)("p",{className:"text-xs text-muted-foreground",children:"장중 수집 전 (2시간 주기)"})}),(0,l.jsx)(m,{title:"⭐ 대표 종목",sub:ef?"라이브 ".concat(u(ef.ts)):"수집 대기",children:(null==ef||null==(D=ef.stocks)?void 0:D.length)?(0,l.jsx)("ul",{children:ef.stocks.map(e=>(0,l.jsx)(f,{r:e},e.symbol))}):(0,l.jsx)("p",{className:"text-xs text-muted-foreground",children:"장중 수집 전 (2시간 주기)"})})]})]}),"backtest"===es?(0,l.jsx)(p,{backtest:G}):null,(0,l.jsxs)("p",{className:"text-center text-[10px] text-muted-foreground",children:["READ-ONLY 관찰 \xb7 매매는 verify+HITL \xb7 갱신: 신호\xb7디깅=준실시간 / 라이브 시세=장중 30분(↻=즉시 재수집\xb73분 가드) / EOD\xb7매력도=일 1회",eo?" \xb7 \uD83D\uDD04 라이브 재수집 중(~40초)":""]})]})}var j=s(25583);let v={buzz:{label:"버즈",badge:"bg-orange-500/15 text-orange-500",ring:"border-orange-500/40"},dig:{label:"디깅",badge:"bg-sky-500/15 text-sky-500",ring:"border-sky-500/40"},signal:{label:"신호",badge:"bg-rose-500/15 text-rose-500",ring:"border-rose-500/40"},regime:{label:"국면",badge:"bg-violet-500/15 text-violet-500",ring:"border-violet-500/40"},reflection:{label:"회고",badge:"bg-emerald-500/15 text-emerald-500",ring:"border-emerald-500/40"}};function N(e){if(!e)return"";let t=Date.parse(e);if(Number.isNaN(t))return e;let s=Math.max(0,Math.floor((Date.now()-t)/1e3));if(s<60)return"".concat(s,"s");let l=Math.floor(s/60);if(l<60)return"".concat(l,"m");let a=Math.floor(l/60);return a<24?"".concat(a,"h"):"".concat(Math.floor(a/24),"d")}function y(){var e,t,s,r,o,d,i;let{client:u}=(0,n.Q)(),[x,m]=(0,a.useState)(null),[p,h]=(0,a.useState)(!1),[g,f]=(0,a.useState)("all"),b=(0,a.useCallback)(async()=>{h(!0);try{var e;let t=await u.fetchJson("/v1/signals/board?limit=60");m(null!=(e=t.board)?e:null)}catch(e){j.oR.error("시그널 보드 로드 실패: ".concat(e instanceof Error?e.message:e))}finally{h(!1)}},[u]);(0,a.useEffect)(()=>{b();let e=window.setInterval(()=>void b(),6e4);return()=>window.clearInterval(e)},[b]);let y=(0,a.useMemo)(()=>{var e;let t=null!=(e=null==x?void 0:x.feed)?e:[];return"all"===g?t:t.filter(e=>e.source===g)},[x,g]),k=null==x?void 0:x.capstone;return(0,l.jsxs)("div",{className:"mx-auto max-w-[1400px] px-4 py-4",children:[(0,l.jsxs)("div",{className:"mb-4 grid grid-cols-1 gap-3 sm:grid-cols-2",children:[(0,l.jsxs)("div",{className:"rounded-lg border border-violet-500/30 bg-violet-500/5 p-3",children:[(0,l.jsx)("div",{className:"text-xs text-muted-foreground",children:"\uD83E\uDDED 국면 (regime)"}),(0,l.jsxs)("div",{className:"mt-1 flex items-baseline gap-2",children:[(0,l.jsx)("span",{className:"text-lg font-semibold",children:null!=(o=null==x||null==(e=x.regime)?void 0:e.label)?o:"—"}),(null==x||null==(t=x.regime)?void 0:t.composite)!=null&&(0,l.jsxs)("span",{className:x.regime.composite>=0?"text-emerald-500":"text-rose-500",children:[x.regime.composite>=0?"+":"",x.regime.composite.toFixed(3)]}),(null==x||null==(s=x.regime)?void 0:s.transition)&&(0,l.jsx)("span",{className:"rounded bg-violet-500/20 px-1.5 text-xs text-violet-500",children:"전환"})]}),(0,l.jsxs)("div",{className:"mt-0.5 text-xs text-muted-foreground",children:[N(null==x||null==(r=x.regime)?void 0:r.asOf)," 전"]})]}),(0,l.jsxs)("div",{className:"rounded-lg border border-amber-500/30 bg-amber-500/5 p-3",children:[(0,l.jsx)("div",{className:"text-xs text-muted-foreground",children:"\uD83E\uDDED 캡스톤 (capstone)"}),(0,l.jsxs)("div",{className:"mt-1 flex items-baseline gap-2",children:[(0,l.jsx)("span",{className:"text-lg font-semibold",children:null!=(i=null!=(d=null==k?void 0:k.target)?d:null==k?void 0:k.label)?i:"—"}),(null==k?void 0:k.samsung)!=null&&(0,l.jsxs)("span",{className:"text-sm text-muted-foreground",children:["삼성 ₩",Number(k.samsung).toLocaleString()]})]}),(null==k?void 0:k.r3Level)!=null&&(0,l.jsxs)("div",{className:"mt-0.5 text-xs text-muted-foreground",children:["R3 회복선 ₩",Number(k.r3Level).toLocaleString()]})]})]}),(0,l.jsxs)("div",{className:"mb-2 flex flex-wrap items-center gap-1.5",children:[(0,l.jsx)("span",{className:"text-xs font-medium text-muted-foreground",children:"감지 피드"}),["all","buzz","signal","dig","regime","reflection"].map(e=>{var t,s,a,r;let n="all"===e?null!=(a=null==x||null==(t=x.feed)?void 0:t.length)?a:0:null!=(r=null==x||null==(s=x.bySource)?void 0:s[e])?r:0,c=g===e;return(0,l.jsxs)("button",{type:"button",onClick:()=>f(e),className:["rounded-full px-2.5 py-0.5 text-xs transition-colors",c?"bg-primary text-primary-foreground":"bg-muted text-muted-foreground hover:text-foreground"].join(" "),children:["all"===e?"전체":v[e].label," ",n>0&&(0,l.jsx)("span",{className:"opacity-70",children:n})]},e)}),(0,l.jsx)("div",{className:"ml-auto",children:(0,l.jsx)(c.$,{variant:"ghost",size:"sm",onClick:()=>void b(),disabled:p,children:p?"…":"↻"})})]}),(0,l.jsxs)("div",{className:"space-y-1.5",children:[0===y.length&&(0,l.jsx)("div",{className:"rounded-lg border border-border p-6 text-center text-sm text-muted-foreground",children:p?"로딩…":"감지된 신호 없음"}),y.map((e,t)=>{let s=v[e.source],a=(0,l.jsx)("div",{className:["rounded-lg border bg-card p-2.5",s.ring].join(" "),children:(0,l.jsxs)("div",{className:"flex items-start gap-2",children:[(0,l.jsx)("span",{className:["mt-0.5 shrink-0 rounded px-1.5 py-0.5 text-[10px] font-medium",s.badge].join(" "),children:s.label}),(0,l.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,l.jsx)("div",{className:"truncate text-sm font-medium text-foreground",children:e.title}),e.detail&&(0,l.jsx)("div",{className:"mt-0.5 line-clamp-2 text-xs text-muted-foreground",children:e.detail})]}),(0,l.jsx)("span",{className:"shrink-0 text-[10px] text-muted-foreground",children:N(e.ts)})]})});return e.link?(0,l.jsx)("a",{href:e.link,target:"_blank",rel:"noreferrer",className:"block hover:opacity-90",children:a},"".concat(e.source,"-").concat(t)):(0,l.jsx)("div",{children:a},"".concat(e.source,"-").concat(t))})]}),(null==x?void 0:x.generatedAt)&&(0,l.jsxs)("div",{className:"mt-3 text-center text-[10px] text-muted-foreground",children:["갱신 ",N(x.generatedAt)," 전 \xb7 60s 자동"]})]})}function k(e){if(!e)return"";let t=Date.parse(e);if(Number.isNaN(t))return e;let s=Math.max(0,Math.floor((Date.now()-t)/1e3));if(s<60)return"".concat(s,"s");let l=Math.floor(s/60);if(l<60)return"".concat(l,"m");let a=Math.floor(l/60);return a<24?"".concat(a,"h"):"".concat(Math.floor(a/24),"d")}let w={done:"text-emerald-500",submitted:"text-emerald-500",executed:"text-emerald-500",running:"text-sky-500",failed:"text-rose-500",error:"text-rose-500",braked:"text-amber-500",blocked:"text-amber-500"};function D(e){let{byStatus:t}=e,s=Object.entries(t).sort((e,t)=>t[1]-e[1]);return s.length?(0,l.jsx)("div",{className:"flex flex-wrap gap-1.5",children:s.map(e=>{var t;let[s,a]=e;return(0,l.jsxs)("span",{className:["rounded px-1.5 py-0.5 text-xs font-medium bg-muted",null!=(t=w[s])?t:"text-foreground"].join(" "),children:[s," ",a]},s)})}):(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:"없음"})}function S(e){let{title:t,sub:s,children:a}=e;return(0,l.jsxs)("div",{className:"rounded-lg border border-border bg-card p-3",children:[(0,l.jsxs)("div",{className:"mb-2 flex items-baseline justify-between",children:[(0,l.jsx)("span",{className:"text-sm font-semibold",children:t}),s?(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:s}):null]}),a]})}function C(){let{client:e}=(0,n.Q)(),[t,s]=(0,a.useState)(null),[r,c]=(0,a.useState)(null),[o,d]=(0,a.useState)(null),[i,u]=(0,a.useState)(null),[x,m]=(0,a.useState)(null),[p,h]=(0,a.useState)(null),g=(0,a.useCallback)(async()=>{try{var t;let l=await e.fetchJson("/v1/dashboard/ops");s(null!=(t=l.ops)?t:null),c(null)}catch(e){c(e instanceof Error?e.message:String(e))}},[e]);(0,a.useEffect)(()=>{g();let e=window.setInterval(()=>void g(),6e4);return()=>window.clearInterval(e)},[g]);let f=(0,a.useCallback)(async(t,s)=>{m(t),h(null);let l="approve"===s?"승인\xb7실행":"거절\xb7종료",a=j.oR.loading("".concat(l," 중…"));try{let r=await e.fetchJson("/v1/autopilot/mission-action",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({id:t,action:s})});if(r.error)h("실패: ".concat(r.error)),j.oR.error("".concat(l," 실패: ").concat(r.error),{id:a});else{let e="approve"===s?"✅ 승인\xb7실행됨".concat(r.scheduledCron?" \xb7 예약 ".concat(r.scheduledCron):""):"✅ 거절\xb7종료됨";h(e),j.oR.success(e,{id:a})}await g()}catch(t){let e=t instanceof Error?t.message:String(t);h("실패: ".concat(e)),j.oR.error("".concat(l," 실패: ").concat(e),{id:a})}finally{m(null)}},[e,g]);if((0,a.useEffect)(()=>{if(!o)return void u(null);let t=!1;return u(null),e.fetchJson("/v1/dashboard/ops?mission=".concat(encodeURIComponent(o))).then(e=>{var s;t||u(null!=(s=e.missionDetail)?s:null)}).catch(()=>{t||u(null)}),()=>{t=!0}},[o,e]),r)return(0,l.jsxs)("div",{className:"mx-auto max-w-[1400px] p-4 text-sm text-rose-500",children:["운영 상황판 로드 실패: ",r]});if(!t)return(0,l.jsx)("div",{className:"mx-auto max-w-[1400px] p-4 text-sm text-muted-foreground",children:"불러오는 중…"});let b=t.health.healthy;return(0,l.jsxs)("div",{className:"mx-auto max-w-[1400px] space-y-3 p-4",children:[(0,l.jsxs)("div",{className:["rounded-lg border p-3",b?"border-emerald-500/40 bg-emerald-500/5":"border-rose-500/40 bg-rose-500/5"].join(" "),children:[(0,l.jsxs)("div",{className:"flex items-center justify-between",children:[(0,l.jsx)("span",{className:["text-sm font-semibold",b?"text-emerald-500":"text-rose-500"].join(" "),children:b?"자율 시스템 정상 ✓":"이상 ".concat(t.health.anomalies.length,"건 ⚠ (개입은 대표 결정\xb7HITL)")}),(0,l.jsxs)("span",{className:"text-xs text-muted-foreground",children:["갱신 ",k(t.generatedAt)," 전"]})]}),b?null:(0,l.jsx)("div",{className:"mt-2 space-y-1",children:t.health.anomalies.slice(0,8).map((e,t)=>(0,l.jsxs)("div",{className:"text-xs",children:[(0,l.jsx)("span",{className:"rounded bg-rose-500/15 px-1 py-0.5 font-medium text-rose-500",children:e.kind})," ",(0,l.jsx)("span",{className:"font-medium",children:e.entity})," — ",(0,l.jsx)("span",{className:"text-muted-foreground",children:e.detail})]},t))})]}),(0,l.jsxs)("div",{className:"grid grid-cols-1 gap-3 md:grid-cols-2 lg:grid-cols-4",children:[(0,l.jsxs)(S,{title:"미션",sub:"".concat(t.missions.total,"건"),children:[(0,l.jsx)(D,{byStatus:t.missions.byStatus}),(0,l.jsx)("div",{className:"mt-1 text-xs text-muted-foreground",children:"proposed = 승인대기(HITL\xb7멈춤 아님)"})]}),(0,l.jsx)(S,{title:"태스크",sub:"".concat(t.tasks.total,"건"),children:(0,l.jsxs)("div",{className:"space-y-0.5 text-xs",children:[(0,l.jsxs)("div",{children:[(0,l.jsxs)("span",{className:"font-medium text-emerald-500",children:["스케줄 실행 ",t.tasks.scheduleBacked]})," ",(0,l.jsxs)("span",{className:"text-muted-foreground",children:["(최근 발화 ",t.tasks.recentlyActive,")"]})]}),(0,l.jsxs)("div",{children:[(0,l.jsxs)("span",{className:"font-medium text-sky-500",children:["디스패치 대기 ",t.tasks.dispatchPending]})," \xb7 blocked ",t.tasks.blocked.length]}),(0,l.jsx)("div",{className:"text-[10px] text-muted-foreground",children:"backlog 대부분은 스케줄로 실행됨(멈춤 아님)"})]})}),(0,l.jsxs)(S,{title:"계약 루프",sub:"armed=".concat(t.loops.armed," \xb7 ").concat(t.loops.executionMode),children:[t.loops.loops.length?(0,l.jsx)("div",{className:"space-y-1",children:t.loops.loops.map(e=>{var t,s;return(0,l.jsxs)("div",{className:"flex items-center justify-between text-xs",children:[(0,l.jsx)("span",{className:"truncate",children:e.id}),(0,l.jsxs)("span",{className:null!=(s=w[null!=(t=e.lastState)?t:""])?s:"text-muted-foreground",children:[e.lastState," \xb7 ",k(e.at)]})]},e.id)})}):(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:"최근 사이클 없음"}),t.loops.paperSources.length?(0,l.jsxs)("div",{className:"mt-1 text-xs text-amber-500",children:["페이퍼: ",t.loops.paperSources.join(", ")]}):null]}),(0,l.jsx)(S,{title:"스케줄",sub:t.schedules?"".concat(t.schedules.elanousTotal," elanous"):"—",children:t.schedules?(0,l.jsxs)("div",{className:"text-xs",children:[(0,l.jsxs)("span",{className:t.schedules.staleCount?"text-amber-500":"text-muted-foreground",children:["stale ",t.schedules.staleCount]})," \xb7 ",(0,l.jsxs)("span",{className:t.schedules.erroredCount?"text-rose-500":"text-muted-foreground",children:["error ",t.schedules.erroredCount]})]}):(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:"없음"})})]}),t.missions.active.length?(0,l.jsx)(S,{title:"미션",sub:"활성 ".concat(t.missions.active.length,"건 \xb7 클릭=상세(관련 태스크/스케줄)"),children:(0,l.jsx)("div",{className:"space-y-1",children:t.missions.active.map(e=>{var t,s;return(0,l.jsxs)("div",{children:[(0,l.jsxs)("button",{type:"button",onClick:()=>d(o===e.id?null:e.id),className:"flex w-full items-start gap-2 text-left text-xs hover:opacity-80",children:[(0,l.jsx)("span",{className:"shrink-0 rounded bg-muted px-1.5 py-0.5 font-medium text-amber-500",children:e.disposition}),(0,l.jsx)("span",{className:"truncate",children:e.goal}),(0,l.jsxs)("span",{className:"shrink-0 text-muted-foreground",children:[o===e.id?"▲":"▼"," ",function(e){switch(e){case"human-intent":return"내가 던진 골";case"discovery":return"elanous 발굴";case"repo-watch":return"레포 감시";case"manual":return"수동";default:return e}}(e.source)]})]}),o===e.id?(0,l.jsxs)("div",{className:"ml-2 mt-1 space-y-1 border-l border-border pl-2",children:["proposed"===e.status?(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[(0,l.jsx)("button",{type:"button",disabled:x===e.id,onClick:()=>void f(e.id,"approve"),className:"rounded bg-emerald-600 px-2.5 py-1 text-[11px] font-medium text-white hover:bg-emerald-500 disabled:opacity-50",children:x===e.id?"처리 중…":"승인하고 실행"}),(0,l.jsx)("button",{type:"button",disabled:x===e.id,onClick:()=>void f(e.id,"cancel"),className:"rounded border border-border px-2.5 py-1 text-[11px] font-medium text-muted-foreground hover:text-rose-500 disabled:opacity-50",children:"거절(종료)"}),p&&x!==e.id?(0,l.jsx)("span",{className:"text-[11px] text-emerald-500",children:p}):null]}):null,i?(null==(t=i.mission)?void 0:t.id)!==e.id?(0,l.jsx)("div",{className:"text-[11px] text-muted-foreground",children:"…"}):(0,l.jsxs)("div",{className:"space-y-0.5 text-[11px]",children:[i.planDraft?(0,l.jsxs)("details",{className:"rounded border border-border bg-muted/30 p-1.5",open:!0,children:[(0,l.jsx)("summary",{className:"cursor-pointer font-medium text-foreground",children:"\uD83D\uDCCB 멀티페이즈 플랜 (승인 전 검토)"}),(0,l.jsx)("pre",{className:"mt-1 max-h-72 overflow-auto whitespace-pre-wrap break-words text-[10px] leading-snug text-muted-foreground",children:i.planDraft})]}):null,(null==(s=i.mission)?void 0:s.rationale)?(0,l.jsxs)("div",{className:"text-muted-foreground",children:["근거: ",i.mission.rationale]}):null,(0,l.jsxs)("div",{className:"font-medium",children:["관련 파생물 ",i.derived.length,"건 (태스크/스케줄/자율행동)"]}),i.derived.map((e,t)=>(0,l.jsxs)("div",{className:"text-muted-foreground",children:["\xb7 [",e.kind,"] ",e.name," — ",e.status,e.detail?" (".concat(e.detail,")"):""]},t)),i.transitions.length?(0,l.jsxs)("div",{className:"font-medium",children:["전이 ",i.transitions.length,"건"]}):null,i.transitions.map((e,t)=>{var s;return(0,l.jsxs)("div",{className:"text-muted-foreground",children:["\xb7 ",k(e.ts)," ",e.event," ",null!=(s=e.toState)?s:""]},t)})]}):(0,l.jsx)("div",{className:"text-[11px] text-muted-foreground",children:"상세 불러오는 중…"})]}):null]},e.id)})})}):null,t.tasks.dispatchable.length?(0,l.jsx)(S,{title:"디스패치 대기 태스크",sub:"".concat(t.tasks.dispatchPending,"건 \xb7 스케줄 아님\xb7실행 대기"),children:(0,l.jsx)("div",{className:"space-y-1",children:t.tasks.dispatchable.map(e=>(0,l.jsx)("div",{className:"text-xs",children:e.title},e.id))})}):null,t.tasks.blocked.length?(0,l.jsx)(S,{title:"막힌 태스크",sub:"".concat(t.tasks.blocked.length,"건"),children:(0,l.jsx)("div",{className:"space-y-1",children:t.tasks.blocked.map(e=>(0,l.jsxs)("div",{className:"text-xs",children:[(0,l.jsx)("span",{className:"font-medium",children:e.title}),e.note?(0,l.jsxs)("span",{className:"text-muted-foreground",children:[" — ",e.note]}):null]},e.id))})}):null,t.orchestration.recent.length?(0,l.jsx)(S,{title:"오케스트레이터 조율",sub:"최근",children:(0,l.jsx)("div",{className:"space-y-1",children:t.orchestration.recent.slice(0,6).map((e,t)=>(0,l.jsxs)("div",{className:"flex items-center justify-between text-xs",children:[(0,l.jsxs)("span",{children:[(0,l.jsx)("span",{className:"font-medium",children:e.event})," ",e.state?"\xb7 ".concat(e.state):""]}),(0,l.jsx)("span",{className:"text-muted-foreground",children:k(e.at)})]},t))})}):null,(0,l.jsx)(S,{title:"상태 전이 타임라인",sub:"최근 ".concat(t.timeline.length,"건"),children:t.timeline.length?(0,l.jsx)("div",{className:"space-y-1",children:t.timeline.map((e,t)=>{var s,a,r,n;return(0,l.jsxs)("div",{className:"flex items-start gap-2 text-xs",children:[(0,l.jsx)("span",{className:"w-10 shrink-0 text-muted-foreground",children:k(e.ts)}),(0,l.jsxs)("span",{className:"w-24 shrink-0 text-muted-foreground",children:[e.entityType,"\xb7",e.actor]}),(0,l.jsx)("span",{className:"font-medium",children:e.event}),(0,l.jsxs)("span",{className:null!=(a=w[null!=(s=e.toState)?s:""])?a:"text-muted-foreground",children:[e.fromState?"".concat(e.fromState,"→"):"",null!=(r=e.toState)?r:""]}),(0,l.jsx)("span",{className:"truncate text-muted-foreground",children:null!=(n=e.rationale)?n:e.entityId})]},t)})}):(0,l.jsx)("span",{className:"text-xs text-muted-foreground",children:"기록된 전이 없음(데몬이 새 관측 코드로 재시작되면 채워짐)."})})]})}var E=s(49987),M=s(85351);let L={critical:"bg-rose-600/20 text-rose-300 ring-rose-600/40",error:"bg-rose-500/15 text-rose-300 ring-rose-500/30",warn:"bg-amber-500/15 text-amber-300 ring-amber-500/30",info:"bg-sky-500/15 text-sky-300 ring-sky-500/30",debug:"bg-muted text-muted-foreground ring-border",trace:"bg-muted text-muted-foreground/60 ring-border"},O=["debug","info","warn","error"],P="elanous.pwa.logs.savedQueries",A={level:"",surfaces:[],components:[],grep:""};function R(e){let t={};return e.level&&(t.level=e.level),e.surfaces.length&&(t.surface=e.surfaces.join(",")),e.components.length&&(t.category=e.components.join(",")),e.grep.trim()&&(t.grep=e.grep.trim()),t}function I(e){let{buckets:t}=e;if(0===t.length)return(0,l.jsx)("p",{className:"text-xs text-muted-foreground",children:"최근 1시간 데이터 없음."});let s=Math.max(...t.map(e=>e.count),1),a=Math.max(2,Math.floor(600/Math.max(t.length,60))-1);return(0,l.jsx)("svg",{viewBox:"0 0 ".concat(600," ").concat(48),className:"h-12 w-full",preserveAspectRatio:"none",role:"img","aria-label":"분당 로그 히스토그램",children:t.map((e,t)=>{let r=Math.max(1,Math.round(e.count/s*46)),n=e.errors>0?Math.max(1,Math.round(e.errors/s*46)):0,c=t*(a+1);return(0,l.jsxs)("g",{children:[(0,l.jsx)("rect",{x:c,y:48-r,width:a,height:r,className:"fill-primary/40"}),n>0&&(0,l.jsx)("rect",{x:c,y:48-r,width:a,height:n,className:"fill-rose-500"}),(0,l.jsx)("title",{children:"".concat(new Date(e.bucket).toLocaleTimeString()," \xb7 ").concat(e.count,"건 (error ").concat(e.errors,")")})]},e.bucket)})})}function F(e){let{active:t,label:s,count:a,onClick:r}=e;return(0,l.jsxs)("button",{type:"button",onClick:r,className:["rounded-full px-2.5 py-0.5 text-[11px] ring-1 transition-colors",t?"bg-primary/20 text-primary ring-primary/40":"bg-muted/40 text-muted-foreground ring-border hover:text-foreground"].join(" "),children:[s,void 0!==a&&(0,l.jsx)("span",{className:"ml-1 opacity-60",children:a})]})}function T(e){var t;let{log:s,onSession:r}=e,[n,c]=(0,a.useState)(!1),o=s.ts.length>=23?s.ts.slice(11,23):s.ts;return(0,l.jsxs)("div",{className:"border-b border-border/50 font-mono text-[12px] leading-5",children:[(0,l.jsxs)("button",{type:"button",onClick:()=>c(e=>!e),className:"flex w-full items-start gap-2 px-2 py-0.5 text-left hover:bg-muted/30",children:[(0,l.jsx)("span",{className:"shrink-0 text-muted-foreground/70",children:o}),(0,l.jsx)("span",{className:"shrink-0 rounded px-1 text-[10px] ring-1 ".concat(null!=(t=L[s.level])?t:L.debug),children:s.level.slice(0,1).toUpperCase()}),s.instance&&(0,l.jsx)("span",{className:"shrink-0 rounded bg-primary/10 px-1 text-[10px] text-primary",children:s.instance}),(0,l.jsx)("span",{className:"shrink-0 rounded bg-muted px-1 text-[10px]",children:s.surface}),(0,l.jsx)("span",{className:"shrink-0 text-muted-foreground",children:s.category}),(0,l.jsx)("span",{className:"min-w-0 flex-1 truncate",children:s.event})]}),n&&(0,l.jsxs)("div",{className:"space-y-1 bg-muted/20 px-8 py-1.5 text-[11px]",children:[void 0!==s.data&&(0,l.jsx)("pre",{className:"max-h-48 overflow-auto whitespace-pre-wrap break-all text-muted-foreground",children:"string"==typeof s.data?s.data:JSON.stringify(s.data,null,2)}),s.sessionId&&(0,l.jsxs)("button",{type:"button",onClick:()=>r(s.sessionId),className:"text-primary underline-offset-2 hover:underline",children:["session ",s.sessionId.slice(0,8),"… → /sessions"]})]})]})}function U(){var e,t;let{client:s}=(0,n.Q)(),r=(0,E.useRouter)(),[o,d]=(0,a.useState)(A),[i,u]=(0,a.useState)([]),[x,m]=(0,a.useState)([]),[p,h]=(0,a.useState)(null),[g,f]=(0,a.useState)([]),[b,j]=(0,a.useState)([]),[v,N]=(0,a.useState)(!1),[y,k]=(0,a.useState)([]),[w,D]=(0,a.useState)(null),[S,C]=(0,a.useState)([]),L=(0,a.useRef)(v);L.current=v,(0,a.useEffect)(()=>{C(function(){try{let e=window.localStorage.getItem(P),t=e?JSON.parse(e):[];return Array.isArray(t)?t.map(e=>{var t;let s=Array.isArray(e.stores)?e.stores:"string"==typeof e.store&&e.store?[e.store]:[];return{name:String(null!=(t=e.name)?t:""),q:e.q,stores:[...new Set(s.filter(e=>"string"==typeof e&&e.length>0))]}}):[]}catch(e){return[]}}())},[]),(0,a.useEffect)(()=>{let e=!0,t=async()=>{try{var t;let l=await s.fetchJson("/v1/logs/instances");e&&u(null!=(t=l.instances)?t:[])}catch(e){}};t();let l=setInterval(()=>{t()},6e4);return()=>{e=!1,clearInterval(l)}},[s]);let U=(0,a.useMemo)(()=>x.map(e=>["store",e]),[x]),z=(0,a.useMemo)(()=>U.map(e=>{let[t,s]=e;return"&".concat(t,"=").concat(encodeURIComponent(s))}).join(""),[U]),B=(0,a.useMemo)(()=>{let e={};return 1===x.length&&(e.store=x[0]),e},[x]),J=(0,a.useCallback)(async()=>{D(null);try{var e;let t=new URLSearchParams([...Object.entries(R(o)),...U,["limit","200"],["since","2h"]]).toString(),l=await s.fetchJson("/v1/logs?".concat(t));j((null!=(e=l.logs)?e:[]).slice().reverse()),k([])}catch(e){D(e instanceof Error?e.message:String(e))}},[s,o,U]);(0,a.useEffect)(()=>{J()},[J]),(0,a.useEffect)(()=>{let e=!0,t=async()=>{try{var t;let l=await s.fetchJson("/v1/logs/facets?since=6h".concat(z));e&&h(l);let a=o.surfaces.length?"&surface=".concat(o.surfaces.join(",")):"",r=await s.fetchJson("/v1/logs/histogram?since=1h".concat(a).concat(z));e&&f(null!=(t=r.buckets)?t:[])}catch(e){}};t();let l=setInterval(()=>{t()},3e4);return()=>{e=!1,clearInterval(l)}},[s,o.surfaces,z]),(0,a.useEffect)(()=>{if(x.length>1)return;let e=s.logsStreamUrl({...R(o),...B});if(!e)return;let t=null;try{(t=new EventSource(e)).addEventListener("log",e=>{try{let t=JSON.parse(e.data);L.current?k(e=>[...e,t].slice(-500)):j(e=>[...e,t].slice(-500))}catch(e){}})}catch(e){(0,M.cY)("pwa.logs.stream.error",{reason:String(e)})}return()=>{null==t||t.close()}},[s,o,B]);let _=(0,a.useCallback)(()=>{N(!1),k(e=>(e.length&&j(t=>[...t,...e].slice(-500)),[]))},[]),W=(e,t)=>{d(s=>{let l=new Set(s[e]);return l.has(t)?l.delete(t):l.add(t),{...s,[e]:[...l]}})},$=(0,a.useRef)(null);return(0,a.useEffect)(()=>{var e;v||null==(e=$.current)||e.scrollIntoView({block:"end"})},[b,v]),(0,l.jsxs)("div",{className:"mx-auto max-w-[1400px] space-y-3 p-4",children:[(0,l.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,l.jsxs)("div",{children:[(0,l.jsxs)("h2",{className:"text-base font-semibold",children:["Logs ",(0,l.jsx)("span",{className:"text-xs font-normal text-muted-foreground",children:"전 서피스 실시간 (logs.db)"})]}),w&&(0,l.jsxs)("p",{className:"text-xs text-rose-400",children:[w," — 데몬이 LF1 이후 버전인지 확인"]})]}),(0,l.jsxs)("div",{className:"flex items-center gap-2",children:[i.length>1&&(0,l.jsx)("select",{className:"rounded-md border border-border bg-background px-2 py-1 text-xs",multiple:!0,value:x,onChange:e=>{m([...new Set(Array.from(e.target.selectedOptions,e=>e.value).filter(Boolean))]),j([]),k([])},title:"로그 인스턴스 — 다른 엘라누스의 스토어를 read-only 연합 조회 (LF7-d)",children:i.filter(e=>!e.current).map(e=>(0,l.jsxs)("option",{value:e.name,disabled:!e.dbExists,children:[e.name,e.alive?"":" (정지)"]},e.name))}),S.length>0&&(0,l.jsxs)("select",{className:"rounded-md border border-border bg-background px-2 py-1 text-xs",value:"",onChange:e=>{let t=S.find(t=>t.name===e.target.value);t&&d(t.q),t&&m(t.stores)},children:[(0,l.jsx)("option",{value:"",children:"저장 쿼리…"}),S.map(e=>(0,l.jsx)("option",{value:e.name,children:e.name},e.name))]}),(0,l.jsx)(c.$,{size:"sm",variant:"outline",onClick:()=>{let e=window.prompt("저장할 쿼리 이름:");if(!e)return;let t=[...S.filter(t=>t.name!==e),{name:e,q:o,stores:x}];C(t);try{window.localStorage.setItem(P,JSON.stringify(t))}catch(e){}},children:"쿼리 저장"}),(0,l.jsx)(c.$,{size:"sm",variant:v?"default":"outline",onClick:()=>v?_():N(!0),children:v?"▶ 재개".concat(y.length?" (+".concat(y.length,")"):""):"⏸ 일시정지"})]})]}),(0,l.jsx)("div",{className:"rounded-lg border border-border bg-card/50 p-2",children:(0,l.jsx)(I,{buckets:g})}),(0,l.jsxs)("div",{className:"space-y-1.5 rounded-lg border border-border bg-card/50 p-2.5",children:[(0,l.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,l.jsx)("span",{className:"text-[11px] text-muted-foreground w-16",children:"level ≥"}),O.map(e=>(0,l.jsx)(F,{active:o.level===e,label:e,onClick:()=>d(t=>({...t,level:t.level===e?"":e}))},e))]}),(0,l.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,l.jsx)("span",{className:"text-[11px] text-muted-foreground w-16",children:"surface"}),(null!=(e=null==p?void 0:p.surfaces)?e:[]).map(e=>(0,l.jsx)(F,{active:o.surfaces.includes(e.surface),label:e.surface,count:e.count,onClick:()=>W("surfaces",e.surface)},e.surface))]}),(0,l.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5",children:[(0,l.jsx)("span",{className:"text-[11px] text-muted-foreground w-16",children:"component"}),(null!=(t=null==p?void 0:p.components)?t:[]).slice(0,16).map(e=>(0,l.jsx)(F,{active:o.components.includes(e.component),label:e.component,count:e.count,onClick:()=>W("components",e.component)},e.component))]}),(0,l.jsxs)("div",{className:"flex items-center gap-1.5 pt-0.5",children:[(0,l.jsx)("span",{className:"text-[11px] text-muted-foreground w-16",children:"grep"}),(0,l.jsx)("input",{value:o.grep,onChange:e=>d(t=>({...t,grep:e.target.value})),placeholder:"event/data/category 부분 일치…",className:"w-72 rounded-md border border-border bg-background px-2 py-1 text-xs outline-none placeholder:text-muted-foreground/50"}),(o.level||o.surfaces.length>0||o.components.length>0||o.grep)&&(0,l.jsx)(c.$,{size:"sm",variant:"ghost",onClick:()=>d(A),children:"필터 초기화"})]})]}),(0,l.jsxs)("div",{className:"h-[52vh] overflow-y-auto rounded-lg border border-border bg-card/50",children:[0===b.length?(0,l.jsx)("p",{className:"p-4 text-sm text-muted-foreground",children:"일치하는 로그 없음."}):b.map(e=>{var t;return(0,l.jsx)(T,{log:e,onSession:()=>r.push("/sessions")},"".concat(null!=(t=e.instance)?t:"unknown",":").concat(e.id))}),(0,l.jsx)("div",{ref:$})]})]})}var z=s(43736);let B=[{id:"signals",label:"통합 시그널"},{id:"overview",label:"개요"},{id:"ops",label:"운영 상황판"},{id:"loops",label:"루프 오케스트라"},{id:"logs",label:"Logs"}];function J(){let[e,t]=(0,a.useState)("signals");return(0,l.jsxs)("div",{children:[(0,l.jsx)("div",{className:"mx-auto max-w-[1400px] px-4 pt-4",children:(0,l.jsx)("div",{className:"flex gap-1 border-b border-border",children:B.map(s=>(0,l.jsx)("button",{type:"button",onClick:()=>t(s.id),className:["-mb-px border-b-2 px-4 py-2 text-sm font-medium transition-colors",e===s.id?"border-primary text-foreground":"border-transparent text-muted-foreground hover:text-foreground"].join(" "),children:s.label},s.id))})}),"signals"===e?(0,l.jsx)(y,{}):"overview"===e?(0,l.jsx)(b,{}):"ops"===e?(0,l.jsx)(C,{}):"logs"===e?(0,l.jsx)(U,{}):(0,l.jsx)(z.s,{})]})}}},e=>{e.O(0,[7235,7482,5583,3839,3736,9096,1380,7358],()=>e(e.s=64716)),_N_E=e.O()}]);
|