elanous 0.2.8 → 0.2.10
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/apps/pwa/out/404/index.html +1 -1
- package/apps/pwa/out/404.html +1 -1
- package/apps/pwa/out/_next/static/2DsiDfDCks44g1cPUMhiW/_buildManifest.js +1 -0
- package/apps/pwa/out/_next/static/chunks/24-e6d28380efab7faf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3615-740dd270764ffa24.js +1 -0
- package/apps/pwa/out/_next/static/chunks/3734-1015fe991eb9b7e7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5012-a7fe6f3c8b6fe45a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/5783-ef40ebfc91d55230.js +1 -0
- package/apps/pwa/out/_next/static/chunks/62-ff227c3edb8b248b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7633-1b3709b0854c9412.js +1 -0
- package/apps/pwa/out/_next/static/chunks/7951-8b03dbb10b24cd06.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8067-87ce253ec2f23697.js +1 -0
- package/apps/pwa/out/_next/static/chunks/{5080-1613752891fcadb4.js → 8195-6fde3d7a39859206.js} +5 -5
- package/apps/pwa/out/_next/static/chunks/8894-b5fb36bab837cd29.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9454-84d0d5d77446bd92.js +1 -0
- package/apps/pwa/out/_next/static/chunks/988-5f92e7ab7ccea3dd.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9989-5582582f06429840.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-d2253d7e58ef1890.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-5441d4a9ab35e518.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/board/page-d9b12d680922d980.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/{page-d4b6df905f185055.js → page-54b32bd27726588d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-e268d6d145827a22.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/chat/{page-186fc6952f027acc.js → page-f8116559c7424da7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-1085399fd0f32112.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-1df686a14f65895a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/{page-cbbe03c0da7b081a.js → page-54e1f966ab60a4dc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-7ed95f296f5ee8e9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/page-11edac668d77e5c3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/field/page-59e2b9a22cd5a6d5.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/page-2976df21ad74ab48.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/layout-34d211a67f16d510.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live/page-8ff652d5d950639b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/{page-c0c0d19d51342d3e.js → page-b31610deda76337b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/{page-2e002ad8faa43291.js → page-6cb0e1bbefe5fb3d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-a286a152cf584576.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/not-found-d9237581e7003bcb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-83274e761643fdd2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/page-ceee6cfb1d4e6d68.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-9c9f8bb3e4a64091.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/page-c17217603ea3426a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-efb6177cbf1e8a51.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-d307523703bc4df3.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-462f4e4bab45ce7d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-8990e96f33af3837.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-7464c1987dd76e6d.js → page-e168fa1030af0548.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-1233e05a4068bc9c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-13a1840b1fac337a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/setup/page-64a29fc80b11ab55.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/page-68e787339a16b3dc.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/showroom/{page-d8ab4d1489223459.js → page-4fddc90b23feb215.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-886ba8260dc79c79.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-0f26507a1722e40b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-109d4ccd42259c9d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-f5c2a4e510726774.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-b2e0039416f42522.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-26102fd7350f171e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-708948bc8a802794.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-5e5611620f78fb0b.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-139ba5c367bbf60a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/main-app-202b4e81f33895ea.js +1 -0
- package/apps/pwa/out/_next/static/css/43feca5fd387dcbd.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +30 -29
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +30 -29
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +30 -29
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +27 -26
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +27 -26
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +27 -26
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +30 -29
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +30 -29
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +30 -29
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +30 -29
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +30 -29
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +30 -29
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +27 -26
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +30 -29
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +30 -29
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +27 -26
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +27 -26
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +30 -29
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +30 -29
- package/apps/pwa/out/ops/checklist/index.html +1 -0
- package/apps/pwa/out/ops/checklist/index.txt +30 -0
- package/apps/pwa/out/ops/release/index.html +1 -0
- package/apps/pwa/out/ops/release/index.txt +30 -0
- package/apps/pwa/out/ops/seats/index.html +1 -0
- package/apps/pwa/out/ops/seats/index.txt +30 -0
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +28 -27
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +30 -29
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +27 -26
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +30 -29
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +30 -29
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +30 -29
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +30 -29
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +30 -29
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +27 -26
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +30 -29
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +30 -29
- package/apps/pwa/out/today/index.html +1 -0
- package/apps/pwa/out/today/index.txt +33 -0
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +30 -29
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +30 -29
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +30 -29
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +30 -29
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +30 -29
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +30 -29
- package/graphs/field/field-feed.yaml +2 -0
- package/graphs/implement-loop.yaml +1 -1
- package/graphs/release/recipes.yaml +3 -0
- package/graphs/release/release-loop.yaml +3 -1
- package/graphs/test-diet/nightly-audit.yaml +18 -0
- package/graphs/test-diet/recipes.yaml +3 -0
- package/package.json +1 -1
- package/plugins/card-followup/graphs/run-step.ts +48 -13
- package/plugins/doc-draft/graphs/doc-draft.yaml +3 -3
- package/plugins/doc-draft/graphs/run-step.ts +14 -7
- package/scripts/ci-pwa-build-gate.ts +160 -0
- package/scripts/coord-channel-watch.sh +42 -8
- package/scripts/coord-digest.ts +199 -0
- package/scripts/coord-post.sh +60 -3
- package/scripts/install.ps1 +68 -9
- package/scripts/install.sh +39 -12
- package/scripts/lib/pwa-scenarios/scenarios.ts +20 -0
- package/scripts/lib/tui-regress-checks.ts +146 -0
- package/scripts/memory-lifecycle-cycle.ts +2 -2
- package/scripts/ops-now-probe.ts +327 -0
- package/scripts/publish-internal-dist.ts +11 -1
- package/scripts/release-loop/cutoff.ts +31 -2
- package/scripts/release-loop/export-check-node.ts +85 -0
- package/scripts/release-loop/gate-node.ts +18 -4
- package/scripts/release-loop/node-verdict.ts +8 -1
- package/scripts/release-loop/ops-upgrade-node.ts +72 -16
- package/scripts/release-loop/release-readiness.ts +9 -0
- package/scripts/release-loop/version-node.ts +58 -10
- package/scripts/repo-watch-cycle.ts +1 -1
- package/scripts/retro-cycle.ts +2 -2
- package/scripts/schedule-health-report.ts +1 -1
- package/scripts/storyboard/storyboard.ts +5 -161
- package/scripts/test-diet/lib.ts +31 -1
- package/scripts/test-diet/node.ts +134 -17
- package/scripts/test-timeout-audit.ts +114 -0
- package/scripts/tree-sync-alert.ts +1 -1
- package/scripts/tui-regress.ts +71 -0
- package/scripts/waitlist-daily-digest.ts +1 -1
- package/skills/explainer-video/SKILL.md +4 -0
- package/skills/explainer-video/engine/reel.mjs +18 -13
- package/skills/explainer-video/engine/reel.sh +24 -5
- package/skills/explainer-video/engine/stitch.mjs +145 -0
- package/skills/pitch-deck/SKILL.md +36 -0
- package/skills/pitch-deck/template.html +80 -0
- package/src/acp/codex-approval-adapter.ts +9 -3
- package/src/acp/core-turn-bridge.ts +117 -18
- package/src/acp/fact-question.ts +11 -0
- package/src/acp/server.ts +48 -7
- package/src/acp/tool-approval.ts +126 -0
- package/src/acp/turn-runner.ts +36 -0
- package/src/agent/monad-agent-turn.ts +8 -0
- package/src/ask-user-question/pending-questions.ts +25 -10
- package/src/ask-user-question/types.ts +9 -0
- package/src/auth/setup-link-tokens.fixture.ts +19 -0
- package/src/auth/setup-link-tokens.ts +164 -0
- package/src/autopilot/build/integrity-gate.ts +12 -0
- package/src/boot/daemon-prompt-turn.ts +3 -0
- package/src/boot/daemon-tools/index.ts +8 -0
- package/src/boot/daemon-tools/types.ts +2 -0
- package/src/boot/daemon-tools/web-search.ts +1 -0
- package/src/budget/unified-usage.ts +75 -0
- package/src/channel-bot-token.ts +37 -10
- package/src/chat/ctrl-c-in-input.ts +14 -0
- package/src/chat/index.ts +61 -9
- package/src/chat/pickers/state.ts +6 -2
- package/src/cli/agent-cli.ts +7 -0
- package/src/cli/decisions-cli.ts +25 -3
- package/src/cli/doctor-bundle-upload.ts +68 -0
- package/src/cli/doctor-cli.ts +38 -4
- package/src/cli/op-proxy-sync.ts +83 -0
- package/src/cli/ops-cli.ts +20 -0
- package/src/cli/pod-cli.ts +49 -0
- package/src/cli/pr-cli.ts +37 -4
- package/src/cli/pwa-stop.ts +163 -13
- package/src/cli/pwa-test.ts +3 -0
- package/src/cli/release-cli.ts +98 -15
- package/src/cli/self-update.ts +14 -0
- package/src/cli/storyboard-cli.ts +37 -0
- package/src/cli/test-state-dir-flag.ts +11 -4
- package/src/connectors/linear.ts +146 -0
- package/src/context-bus/coord-events.ts +115 -0
- package/src/dashboard/dashboard-boot-fixture.ts +23 -0
- package/src/dashboard/dashboard-status-lines.ts +45 -0
- package/src/dashboard/first-screen-band.ts +35 -0
- package/src/dashboard/index.ts +128 -34
- package/src/dashboard/provider-slash-runtime.ts +28 -11
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +17 -0
- package/src/dashboard/slash-runtime/help-from-registry.ts +43 -28
- package/src/dashboard/turn-stream-formatter.ts +1 -1
- package/src/decisions/decision-cards.ts +50 -2
- package/src/decisions/decision-ledger.ts +75 -4
- package/src/decisions/decision-linear-projection.ts +157 -0
- package/src/decisions/web-push-decision-cards.ts +50 -0
- package/src/directive/interpretation-card.ts +36 -0
- package/src/discord.ts +2 -1
- package/src/domains/coo-admin-tool.ts +62 -0
- package/src/domains/core-tools.ts +11 -3
- package/src/domains/elanous-card.ts +29 -0
- package/src/domains/ops-facts-tool.ts +76 -0
- package/src/domains/outbound-alert.ts +41 -13
- package/src/domains/release-tool.ts +168 -0
- package/src/domains/telegram-kind-route.ts +19 -1
- package/src/exec-requests/planner.ts +98 -28
- package/src/exec-requests/runner.ts +107 -10
- package/src/exec-requests/store.ts +8 -2
- package/src/field/field-media.ts +10 -7
- package/src/field/field-reel.ts +14 -4
- package/src/git-fs/worktree.ts +45 -6
- package/src/graph-runner/graph-approval-card.ts +113 -0
- package/src/graph-runner/graph-cli.ts +129 -4
- package/src/graph-runner/graph-notify.ts +25 -3
- package/src/graph-runner/runner.ts +142 -16
- package/src/harness/browser-verify.ts +25 -2
- package/src/harness/harness-cli-command.ts +231 -35
- package/src/harness/harness-incidents-writer.fixture.ts +24 -0
- package/src/harness/harness-incidents.ts +129 -0
- package/src/harness/harness-stop.ts +53 -3
- package/src/hitl/clarification-policy.ts +3 -1
- package/src/index.ts +172 -41
- package/src/intake-plane/author-goals.ts +37 -4
- package/src/intake-plane/check.ts +3 -0
- package/src/intake-plane/discord-seat-work.ts +47 -2
- package/src/intake-plane/seat-doc-route.ts +170 -6
- package/src/intake-plane/telegram-seat-work.ts +44 -2
- package/src/intake-plane/telegram-work.ts +1 -0
- package/src/maturity/cli-maturity.ts +34 -0
- package/src/maturity/feature-maturity.ts +100 -1
- package/src/maturity/tui-slash-maturity.ts +31 -0
- package/src/memory.ts +32 -4
- package/src/nexus/api/exec-requests.ts +33 -3
- package/src/nexus/api/http-server.ts +73 -1
- package/src/nexus/api/meta-api.ts +38 -0
- package/src/nexus/api/operator.ts +61 -0
- package/src/nexus/api/ops-api.ts +148 -0
- package/src/nexus/api/ops-seats-sources.ts +95 -0
- package/src/nexus/api/ops-seats.ts +124 -0
- package/src/nexus/api/public-routes.ts +14 -1
- package/src/nexus/api/seat-requests.ts +88 -8
- package/src/nexus/api/sessions-store.ts +63 -0
- package/src/nexus/api/setup-claim.ts +21 -0
- package/src/nexus/api/setup-codex-login.ts +160 -0
- package/src/nexus/api/usage-api.ts +102 -0
- package/src/nexus/config/secrets/file-backend.ts +56 -18
- package/src/nexus/index.ts +45 -4
- package/src/onboarding/first-run-doctor.ts +54 -0
- package/src/onboarding/first-run.ts +89 -0
- package/src/onboarding/lan-address.ts +45 -0
- package/src/onboarding/web-first.ts +119 -24
- package/src/onboarding.ts +4 -0
- package/src/ops-now/ops-now-refresh.ts +100 -0
- package/src/project/project-store.ts +115 -0
- package/src/release-loop/checklist.ts +76 -61
- package/src/release-loop/feature-store.ts +460 -0
- package/src/release-loop/manifest.ts +59 -5
- package/src/release-loop/release-schedule.ts +53 -0
- package/src/repl/index.ts +7 -0
- package/src/seat-dispatch/ceo-commands.ts +98 -0
- package/src/seat-dispatch/ceo-intent.ts +38 -0
- package/src/seat-loop/seat-loop.ts +231 -0
- package/src/seat-loop/seat-report.ts +64 -0
- package/src/self-dev/decompose.ts +66 -11
- package/src/self-dev/run-store.ts +10 -1
- package/src/self-implement/execution-clarification.ts +115 -0
- package/src/self-implement/gate-cli.ts +6 -3
- package/src/self-implement/orchestrator.ts +37 -3
- package/src/self-implement/pipeline-shape.ts +1 -1
- package/src/self-implement/run-status-mapping.ts +5 -3
- package/src/session/chat.ts +2 -0
- package/src/session/index.ts +9 -0
- package/src/shell-env-bootstrap.ts +17 -0
- package/src/skills/tools/usage-slash.ts +8 -7
- package/src/steward/directive.ts +51 -2
- package/src/steward/launch.ts +250 -0
- package/src/steward/outcome-notify.ts +115 -0
- package/src/steward/steward-cards.ts +8 -2
- package/src/steward/triage-plan.ts +32 -4
- package/src/steward/triage.ts +93 -9
- package/src/steward/working-backwards.ts +64 -0
- package/src/storyboard/storyboard.ts +141 -0
- package/src/task-cards/card-store.ts +2 -2
- package/src/task-orchestrator/surfaces/pod-lease.ts +260 -0
- package/src/telegram-card-followup.ts +233 -0
- package/src/telegram-commands.ts +16 -0
- package/src/telegram-report.ts +15 -9
- package/src/telegram-run.ts +90 -13
- package/src/telegram.ts +29 -8
- package/src/thinking-line.ts +28 -20
- package/src/tool-runtime/types.ts +4 -0
- package/src/tui/chat/execution-badge.ts +1 -1
- package/src/tui-client/dashboard-session.ts +2 -0
- package/src/user-config.ts +118 -11
- package/src/ux-sim/turn-states.ts +1 -1
- package/src/version/packed-revision.json +1 -1
- package/src/web-push/notify-exec-request.ts +32 -0
- package/apps/pwa/out/_next/static/chunks/1201-09613bce624467c0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/2929-617f1e66a55be184.js +0 -1
- package/apps/pwa/out/_next/static/chunks/3441-a1dd4acfeda14488.js +0 -1
- package/apps/pwa/out/_next/static/chunks/4836-3084c58c1725a40b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6090-85a3f05f954e5697.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6284-69db415193d5f8bd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/6416-505ba707cacafbba.js +0 -1
- package/apps/pwa/out/_next/static/chunks/7032-f4ef698518fba61c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8067-d976b441a104ab74.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8519-5632377cce994f86.js +0 -1
- package/apps/pwa/out/_next/static/chunks/8894-7317998f6cb97d8c.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9454-a3e0953307216c58.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9740-8f5ff96c522b5f55.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-9aa47b0bc6d570ff.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/autopilot/page-f4d2ecbbae6088d6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-2053e49930c82748.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-a70ba27c33003dd0.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-18166f885d831d3e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-1c9d6cfe68b121c2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c108ff1fdb665c97.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/page-147a328753d983e2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/field/page-799395a9df7d95aa.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/page-6a8158b71d1fe9d7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/layout-9567560270857531.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-e7ed3d010153d818.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/morning/page-b672e02e4bec8deb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/not-found-1ba4a5d857276334.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-9db2226f38c542fb.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-70ee65f5f7a151dc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-0bb8e43203efb23b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-092e1bcf27d751cc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-eb52580c4b75b905.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/page-e573437b0a1c728f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/page-294300625e49e4d3.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-085847b088675978.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/share/page-9fe9d38c36999eb4.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-6141f67f531d8b6a.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-295a02b1026b8255.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-1eb9a0e1e054209d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-82efa177a30f3741.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-d0be51cec4f62606.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/page-2e367075ffdbc062.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-647ed2b66c1d49f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-ba058c56e38f2792.js +0 -1
- package/apps/pwa/out/_next/static/chunks/main-app-6870f30ea99f8346.js +0 -1
- package/apps/pwa/out/_next/static/css/5ef72a618a8994f3.css +0 -1
- package/apps/pwa/out/_next/static/lywc8m_HDzH9MKSDQhyEj/_buildManifest.js +0 -1
- package/src/dashboard/turn-typeahead-echo.ts +0 -23
- /package/apps/pwa/out/_next/static/{lywc8m_HDzH9MKSDQhyEj → 2DsiDfDCks44g1cPUMhiW}/_ssgManifest.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3734],{19528:(e,t,r)=>{r.d(t,{Er:()=>a,cj:()=>c,dc:()=>s,yR:()=>i});let n=/^(oauth\.|harness\.decision|llm\.router)/;function a(e){let t=[],r=e=>{"string"==typeof e&&e.trim()&&!t.includes(e.trim())&&t.push(e.trim())};for(let t of e){var a;let e=null!=(a=t.data)?a:{};if(t.category.startsWith("oauth.")){for(let t of["from","to","name","account"])r(e[t]);if(Array.isArray(e.usage))for(let t of e.usage)r(null==t?void 0:t.name);continue}if(n.test(t.category))for(let t of(r(e.account),["what","why","reason"])){let n=e[t];if("string"==typeof n)for(let e of n.matchAll(/계정\s+([A-Za-z0-9][\w.-]*)/g))r(e[1])}}return t}function l(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function s(e){let t=new Map(e.map((e,t)=>[e,"account-".concat(t+1)])),r=e.length?RegExp("(^|[^\\w-])(".concat(e.map(l).sort((e,t)=>t.length-e.length).join("|"),")(?![\\w-])"),"g"):null,n=new Map;return(e,a)=>{let l=e.replace(/\b[a-z0-9-]+\.tail[0-9a-f]+\.ts\.net\b/gi,"tailnet-host").replace(/\bmsb\d+\b/gi,e=>(e=>{let t=e.toLowerCase();n.has(t)||n.set(t,"remote-".concat(n.size+1));let r=n.get(t);return e===e.toUpperCase()?r.toUpperCase():r})(e)).replace(/\bmbp\b/gi,e=>e===e.toUpperCase()?"LOCAL":"local").replace(/\/Users\/[^/\s"']+/g,"~").replace(/(크레딧|credits?|💳)(\s*[:=]?\s*)[\d][\d,.]*/gi,"$1$2•••").replace(/[\d][\d,.]*(\s*)(크레딧|credits?)/gi,"•••$1$2").replace(/\$\s?[\d][\d,.]*/g,"$•••").replace(/(잔량?|remaining|left)(\s*[:=]?\s*)(?:[A-Za-z0-9][\w.-]*\s+)?\d+(?:\.\d+)?\s?%/gi,"$1$2•••");return a&&r&&(l=l.replace(r,(e,r,n)=>{var a;return"".concat(r).concat(null!=(a=t.get(n))?a:"account")})),l}}function o(e,t){if("string"==typeof e)return t(e);if(Array.isArray(e))return e.map(e=>o(e,t));if(e&&"object"==typeof e){let r={};for(let[n,a]of Object.entries(e))"apiEquivalentUsd"===n||"usd"===n||/credit(s|Balance)?$/i.test(n)||(r[n]=o(a,t));return r}return e}function i(e){let t=s(a(e));return e.map(e=>{let r=n.test(e.category);return{...e,event:t(e.event,!1),data:e.data?o(e.data,e=>t(e,r)):e.data}})}function c(e,t){let r=s(t);return o(e,e=>r(e,!0))}},63734:(e,t,r)=>{r.d(t,{zV:()=>eX});var n=r(41121),a=r(91269),l=r(66062),s=r(54903),o=r(17591),i=r(10679),c=r(2143),d=r(73455);r(68187);var u=r(38519),m=r(51215);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",f=null;function b(){if(f)return f;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)),f=e,e}var x=r(91732);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$/,j=new Map;function S(e,t){let r=j.get(e);return r?(r.sender(t),!0):((0,m.cY)("webterm.input.no-sender",{terminalId:e,bytes:new TextEncoder().encode(t).length}),!1)}let N="elanous.pwa.termFocusStartDisabled",C="elanous.pwa.termFontSize",I=e=>(e.ctrlKey||e.metaKey)&&e.shiftKey&&!e.altKey;function T(e){return Number.isFinite(e)?Math.min(32,Math.max(9,Math.round(e))):13}var Y=r(36715);function E(e){var t;let{sessionId:l,terminalId:h,clearRequest:f=0,readOnly:S=!1,onForeignInputActivity:E}=e,R=(0,a.useRef)(null),A=(0,a.useRef)(null),z=(0,a.useRef)(null),{compact:M}=(0,Y.K)(),[P,D]=(0,a.useState)(!1),L=(0,a.useRef)(P);L.current=P;let U=(0,a.useRef)(!1);(0,a.useEffect)(()=>{var e,t;if(!U.current&&M&&(U.current=!0,null==(e=(t=window).matchMedia)?void 0:e.call(t,"(pointer: coarse)").matches)){let e=null;try{e=window.localStorage}catch(e){}!function(e){try{return(null==e?void 0:e.getItem(N))==="1"}catch(e){return!1}}(e)&&(L.current=!0,D(!0))}},[M]);let F=()=>{let e=L.current;if(L.current=!e,e)try{var t=window.localStorage;try{null==t||t.setItem(N,"1")}catch(e){}}catch(e){}D(!e)},$=(0,a.useRef)(void 0),O=(0,a.useRef)(h);O.current!==h&&(O.current=h,$.current=void 0);let _=(0,a.useRef)(l),B=(0,a.useRef)(E);B.current=E;let{client:Q,config:q,setSessionId:H}=(0,u.Q)(),[K,V]=(0,a.useState)(()=>({state:"CONNECTING",terminalId:h,connectingSince:Date.now()})),[G,J]=(0,a.useState)(0),W=(0,a.useRef)(0),[Z,X]=(0,a.useState)(()=>Date.now()),[ee,et]=(0,a.useState)(null),er=(null==ee?void 0:ee.terminalId)===h?ee:null,en=K.terminalId===h?K.state:"CONNECTING",ea=K.terminalId===h?K.connectingSince:Z;(0,a.useEffect)(()=>{if("CONNECTING"!==en)return;X(Date.now());let e=window.setInterval(()=>X(Date.now()),1e3);return()=>window.clearInterval(e)},[en,h]),(0,a.useEffect)(()=>{var e,t,n;if(!R.current)return;let a=new s.B({fontFamily:'"JetBrainsMono Nerd Font", "JetBrains Mono", monospace',fontSize:function(e){try{let t=null==e?void 0:e.getItem(C);return t?T(Number(t)):13}catch(e){return 13}}(window.localStorage),theme:{background:"#0d0c08",foreground:"#e9e3d4",cursor:"#e9e3d4"},allowProposedApi:!0,scrollback:5e3,cursorBlink:!S,disableStdin:S});(0,m.cY)("webterm.xterm.boot",{sessionId:l,terminalId:h,readOnly:S});let u=new o.Y;a.loadAddon(u),a.loadAddon(new i.c((e,t)=>(0,m.cY)("webterm.link.click",{uri:t}))),a.loadAddon(new c.I);let f=new d.V;a.loadAddon(f),(async()=>{try{let e=await r.e(4323).then(r.bind(r,14323));a.loadAddon(new e.WebglAddon)}catch(e){(0,m.cY)("webterm.webgl.fallback",{reason:String(e)})}})(),(async()=>{try{let e=await r.e(3403).then(r.bind(r,63403));a.loadAddon(new e.ImageAddon),(0,m.cY)("webterm.image-addon.loaded")}catch(e){(0,m.cY)("webterm.image-addon.fallback",{reason:String(e)})}})(),a.unicode.activeVersion="11",a.open(R.current),A.current=a;let N=z.current;N&&(N.__elanousTerm=a),u.fit();let I=(0,x.o1)("xtermScrollback",h),Y=(0,x.N2)(I);"string"==typeof Y&&Y.length>0&&a.write(Y);let E=()=>{},M=!1,P=Q.connectAcp({...l?{sessionId:l}:{},onSession:e=>{e&&(M=!0,_.current=e,E(e)),e&&e!==l&&((0,m.cY)("webterm.acp.session.adopted",{from:l,to:e}),H(e))}});(0,m.cY)("webterm.acp.session.attach",{sessionId:l,terminalId:h});let D=P.onState((e,t)=>{let r=Date.now();V(n=>({state:e,terminalId:h,connectingSince:"CONNECTING"===e?r:n.connectingSince,...(null==t?void 0:t.message)?{reason:t.message}:{}})),"OPEN"===e&&(W.current=0),"CONNECTING"===e&&X(r),(0,m.cY)("webterm.xterm.acp-state",{terminalId:h,state:e,reason:null==t?void 0:t.message})}),L=()=>{},U=!1,F=Date.now(),$=new Promise(e=>{let t=!1;L=r=>{t||(t=!0,(0,m.cY)("webterm.shell.ready",{terminalId:h,via:r,ms:Date.now()-F}),e())}}),O=setTimeout(()=>L("cap-".concat(2e3,"ms")),2e3);P.ready.then(e=>e?(M||(_.current=e),queueMicrotask(()=>E(_.current)),P.send("terminal/spawn",{sessionId:_.current,terminalId:h,cols:a.cols,rows:a.rows,replay:!0})):void L("no-session")).then(e=>{if(void 0===e)return;(0,m.cY)("webterm.spawn.result",e);let t="string"!=typeof e.snapshot||0===e.snapshot.trim().length;if("spawned"===e.status||"attached"===e.status&&t?U=!0:L("attached"===e.status?"attached":"status:".concat(String(e.status))),!S&&_.current){try{u.fit()}catch(e){}(0,m.cY)("webterm.xterm.size-sync",{terminalId:h,cols:a.cols,rows:a.rows,status:e.status}),P.send("terminal/resize",{sessionId:_.current,terminalId:h,cols:a.cols,rows:a.rows}).catch(e=>(0,m.cY)("webterm.resize.send-error",{reason:String(e)}))}"attached"===e.status&&"string"==typeof e.snapshot&&e.snapshot.length>0&&((0,m.cY)("webterm.attach.replay",{terminalId:h,bytes:e.snapshot.length}),a.write("\x1b[2J\x1b[H"+e.snapshot.split("\n").join("\r\n")+"\r\n"))}).catch(e=>{(0,m.cY)("webterm.spawn.error",{reason:String(e)}),L("spawn-error")});let q=P.on("sessionUpdate",e=>{var t,r,n;let l=null!=(r=e.params)?r:{},s=_.current;if(l.sessionId&&s&&l.sessionId!==s)return;let o=l.update;if(!o||"agent_thought_chunk"!==o.sessionUpdate)return;let i=(null==(t=o.content)?void 0:t.type)==="text"?o.content.text:null;if(!i)return;let c=p(i);c&&("terminalOutput"===c.method&&c.payload.terminalId===h?((0,m.cY)("webterm.ws.frame.in",{terminalId:h,bytes:c.payload.data.length}),a.write(c.payload.data),U&&(U=!1,L("first-output"))):"terminalExit"===c.method&&c.payload.terminalId===h?((0,m.cY)("webterm.pty.exit",{terminalId:h,code:c.payload.code}),a.write("\r\n\x1b[2m[exit ".concat(c.payload.code,"]\x1b[0m\r\n"))):"terminalInputActivity"===c.method&&c.payload.terminalId===h&&c.payload.peerId!==b()&&((0,m.cY)("webterm.peer.input",{terminalId:h,peerId:c.payload.peerId.slice(0,4),bytes:c.payload.bytes}),null==(n=B.current)||n.call(B,{peerId:c.payload.peerId,bytes:c.payload.bytes,timestamp:c.payload.timestamp})))}),K=function(e){let t,{send:r,ready:n,getSessionId:a,terminalId:l,getPeerId:s,log:o,shellReady:i}=e,c=!i,d=[],u="",m=!1,p=!1,h=!1,f=!1,b=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";if(h)return;let r=new TextEncoder().encode(t+d.join("")).length;d.length=0,o("webterm.input.send-error",{reason:String(e),dropped:r})},x=async()=>{if(u&&c&&!p&&!h){p=!0;try{for(;d.length&&!h;){let e=d.shift();try{let t=a();await r("terminal/input",{sessionId:m&&t?t:u,terminalId:l,data:e,peerId:s()})}catch(t){b(t,e);break}}}finally{p=!1}}};return i&&i.then(()=>{c=!0,x()}),n.then(e=>{if(!h){if(!e){f=!0,b(t="ACP handshake returned no session");return}u=e,x()}},e=>{f=!0,t=e,b(e)}),{confirmSession(e){!h&&u&&e&&(m=!0)},push(e){if(!h){if(f)return void b(t,e);d.push(e),x()}},dispose(){h=!0,d.length=0}}}({send:(e,t)=>P.send(e,t),ready:P.ready,shellReady:$,getSessionId:()=>_.current,terminalId:h,getPeerId:b,log:(e,t)=>{(0,m.cY)(e,t),t.dropped>0&&et({terminalId:h,dropped:t.dropped})}});E=K.confirmSession;let G=S?null:function(e,t){let r={sender:t};return j.set(e,r),()=>{j.get(e)===r&&j.delete(e)}}(h,K.push),J=S?null:a.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:h,bytes:e.length});(0,m.cY)("webterm.xterm.onData",{terminalId:h,bytes:e.length}),K.push(e)}),Z=S?null:a.onResize(e=>{let{cols:t,rows:r}=e;(0,m.cY)("webterm.xterm.onResize",{terminalId:h,cols:t,rows:r}),P.send("terminal/resize",{sessionId:_.current,terminalId:h,cols:t,rows:r}).catch(e=>(0,m.cY)("webterm.resize.send-error",{reason:String(e)}))}),ee=R.current,er=null,en=e=>{if(1!==e.touches.length){er=null;return}er={y:e.touches[0].clientY,viewportY:a.buffer.active.viewportY,wheelSent:0,bufferType:a.buffer.active.type}},ea=e=>{var t,r,n;if(!er||1!==e.touches.length)return;let l=a.buffer.active.type;if(l!==er.bufferType){er={y:e.touches[0].clientY,viewportY:a.buffer.active.viewportY,wheelSent:0,bufferType:l};return}let s=null==(t=a.element)?void 0:t.querySelector(".xterm-screen"),o=a.rows>0?(null!=(r=null==s?void 0:s.getBoundingClientRect().height)?r:0)/a.rows:0;if(!(o>0))return;let i="alternate"===l?function(e){if(!(e.cellHeight>0))return 0;let t=-Math.trunc((e.currentY-e.startY)/e.cellHeight)-e.sentSteps;return 0===t?0:t}({startY:er.y,currentY:e.touches[0].clientY,cellHeight:o,sentSteps:er.wheelSent}):function(e){if(!(e.cellHeight>0))return 0;let t=-Math.trunc((e.currentY-e.startY)/e.cellHeight)-(e.currentViewportY-e.startViewportY);return 0===t?0:t}({startY:er.y,currentY:e.touches[0].clientY,cellHeight:o,startViewportY:er.viewportY,currentViewportY:a.buffer.active.viewportY}),c=0===(n={bufferType:l,mouseTracking:a.modes.mouseTrackingMode,lines:i}).lines?{kind:"none"}:"alternate"===n.bufferType?{kind:"wheel",steps:n.lines}:{kind:"scrollback",lines:n.lines};if("scrollback"===c.kind)a.scrollLines(c.lines),(0,m.cY)("webterm.touch-scroll",{kind:c.kind,lines:c.lines,bufferType:l});else if("wheel"===c.kind){let t=a.element;if(!t)return;!function(e,t,r,n){for(let a=0;a<Math.abs(t);a++)e.dispatchEvent(new WheelEvent("wheel",{deltaY:100*Math.sign(t),deltaMode:0,clientX:r,clientY:n,bubbles:!0,cancelable:!0}))}(t,c.steps,e.touches[0].clientX,e.touches[0].clientY),er.wheelSent+=c.steps,(0,m.cY)("webterm.touch-scroll",{kind:c.kind,steps:c.steps,bufferType:l})}},el=()=>{er=null};null==(e=ee.addEventListener)||e.call(ee,"touchstart",en,{passive:!0}),null==(t=ee.addEventListener)||t.call(ee,"touchmove",ea,{passive:!0}),null==(n=ee.addEventListener)||n.call(ee,"touchend",el,{passive:!0});let es=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:R.current,onImmediate:()=>{try{u.fit()}catch(e){}},onTrailing:()=>{try{u.fit()}catch(e){}}});return()=>{var e,t,r;try{let e=f.serialize();"string"==typeof e&&(0,x.Os)((0,x.o1)("xtermScrollback",h),e)}catch(e){(0,m.cY)("webterm.xterm.snapshot.error",{reason:String(e)})}try{es.dispose()}catch(e){}null==(e=ee.removeEventListener)||e.call(ee,"touchstart",en),null==(t=ee.removeEventListener)||t.call(ee,"touchmove",ea),null==(r=ee.removeEventListener)||r.call(ee,"touchend",el),null==G||G(),K.dispose(),clearTimeout(O),q(),D();try{null==J||J.dispose()}catch(e){}try{null==Z||Z.dispose()}catch(e){}try{P.close()}catch(e){}A.current===a&&(A.current=null),(null==N?void 0:N.__elanousTerm)===a&&delete N.__elanousTerm;try{a.dispose()}catch(e){}(0,m.cY)("webterm.xterm.teardown",{terminalId:h})}},[h,S,Q,G]);let el="FAILED"===en||"CLOSED"===en?(t=K.reason)&&/auth_failed|\b1008\b|unauthori[sz]ed|\b401\b/i.test(t)?"auth":"transient":null,es=(0,a.useRef)(q.token);(0,a.useEffect)(()=>{es.current!==q.token&&(es.current=q.token,"auth"===el&&q.token&&((0,m.cY)("webterm.acp.reconnect",{terminalId:h,why:"token-changed"}),J(e=>e+1)))},[q.token]),(0,a.useEffect)(()=>{var e,t,r;if(null===el)return;let n=e=>{W.current+=1,(0,m.cY)("webterm.acp.reconnect",{terminalId:h,why:e,attempt:W.current,reason:K.reason}),J(e=>e+1)},a="undefined"==typeof document?null:document,l=window,s=()=>{(null==a?void 0:a.visibilityState)==="visible"&&n("visible")},o=()=>n("online");null==a||null==(e=a.addEventListener)||e.call(a,"visibilitychange",s),null==l||null==(t=l.addEventListener)||t.call(l,"online",o);let i="transient"===el?setTimeout(()=>n("backoff"),(r=W.current,Math.min(3e4,1e3*2**Math.max(0,r)))):void 0;return()=>{var e,t;null==a||null==(e=a.removeEventListener)||e.call(a,"visibilitychange",s),null==l||null==(t=l.removeEventListener)||t.call(l,"online",o),void 0!==i&&clearTimeout(i)}},[el,h]),(0,a.useEffect)(()=>{var e;e=$.current,void 0!==e&&e!==f&&A.current&&(A.current.clear(),(0,m.cY)("webterm.controls.clear.applied",{terminalId:h})),$.current=f},[f,h]);let eo="CONNECTING"===en?W.current>0?"다시 연결 중(".concat(W.current,"회)"):"연결 중":"OPEN"===en?"연결됨":"auth"===el?"토큰 없음":"FAILED"===en?"연결 실패 \xb7 곧 다시 붙습니다":"연결 끊김 \xb7 곧 다시 붙습니다",ei="OPEN"===en?"text-emerald-300":"CONNECTING"===en?"text-amber-300":"text-red-300",ec=h.trim()||"대상 미지정",ed=Math.max(0,Math.floor((Z-ea)/1e3));return(0,a.useEffect)(()=>{if("undefined"==typeof document)return;let e=()=>{var e;let t=z.current;if(!t)return!1;let r=document.activeElement;return!!(r&&t.contains(r))||!(r?null==(e=r.closest)?void 0:e.call(r,"[data-xterm-host]"):null)&&document.querySelector("[data-xterm-host]")===t},t=t=>{if(I(t)&&("KeyF"===t.code||"F"===t.key||"f"===t.key)&&e()){t.preventDefault(),t.stopPropagation(),F();return}let r=I(t)?"Equal"===t.code||"NumpadAdd"===t.code||"+"===t.key||"="===t.key?1:"Minus"===t.code||"NumpadSubtract"===t.code||"_"===t.key||"-"===t.key?-1:0:0,n=A.current;if(0!==r&&n&&e()){t.preventDefault(),t.stopPropagation();let e=T((null!=(a=n.options.fontSize)?a:13)+r);n.options.fontSize=e;var a,l=window.localStorage;try{null==l||l.setItem(C,String(T(e)))}catch(e){}(0,m.cY)("webterm.focus-mode",{event:"font",size:e})}};return document.addEventListener("keydown",t,!0),()=>document.removeEventListener("keydown",t,!0)},[]),(0,a.useEffect)(()=>{var e,t,r,n,a;if((0,m.cY)("webterm.focus-mode",{event:P?"on":"off",terminalId:h}),"undefined"!=typeof document){try{P&&!document.fullscreenElement&&(null==(t=(r=document.documentElement).requestFullscreen)||t.call(r).catch(()=>{})),!P&&document.fullscreenElement&&(null==(n=(a=document).exitFullscreen)||n.call(a).catch(()=>{}))}catch(e){}P&&(null==(e=A.current)||e.focus())}},[P,h]),(0,n.jsxs)("div",{ref:z,"data-xterm-host":!0,"data-focus-mode":P?"1":void 0,className:P?"fixed inset-0 z-[90] h-[100dvh] w-screen bg-[#0d0c08]":"relative h-full w-full bg-[#0d0c08]",children:[(0,n.jsx)("div",{ref:R,className:"h-full w-full"}),(0,n.jsx)("button",{type:"button","data-share-hide":!0,onClick:F,"aria-pressed":P,"aria-label":P?"집중 모드 끄기":"집중 모드 — 터미널만 크게",title:P?"집중 모드 끄기 (Ctrl/⌘+Shift+F)":"집중 모드 — 터미널만 크게 (Ctrl/⌘+Shift+F \xb7 글자 Ctrl/⌘+Shift+\xb1)",className:P?"absolute bottom-2 right-2 z-40 rounded bg-black/60 px-2 py-1 text-xs text-[#e9e3d4]/70 hover:text-[#e9e3d4]":"absolute bottom-2 right-2 z-20 rounded bg-black/60 px-2 py-1 text-xs text-[#e9e3d4]/70 hover:text-[#e9e3d4]",children:P?"⤡ 나가기":"⤢ 집중"}),er&&(0,n.jsxs)("div",{role:"alert",className:"pointer-events-none absolute bottom-2 left-2 right-2 rounded bg-red-950/95 px-3 py-2 text-sm text-red-100",children:["터미널 입력 전송 실패: ",er.dropped,"바이트가 버려졌습니다. 명령이 일부만 실행됐을 수 있습니다. 입력을 확인하고 다시 입력하세요."]}),"auth"===el&&(0,n.jsxs)("div",{role:"alert",className:"absolute left-2 right-2 top-10 z-30 space-y-1 rounded bg-amber-950/95 px-3 py-2 text-sm text-amber-100","data-webterm-auth-missing":!0,children:[(0,n.jsx)("p",{children:"이 기기에 소유자 토큰이 없어 터미널에 연결하지 못했습니다 — 설정에서 토큰을 붙이면 바로 연결됩니다."}),(0,n.jsx)("p",{className:"text-xs text-amber-200/90",children:"토큰 얻기: 이미 연결된 기기의 설정 › 연결 토큰 만들기 에서 만들거나, 데몬 기계에서 pbcopy < ~/.elanous/acp-token → 이 기기의 설정 › 데몬 연결 › 연결 토큰 칸에 붙여 넣기"}),(0,n.jsx)("a",{href:"/app/settings/#bearer-token",className:"inline-block font-medium underline","data-webterm-auth-settings":!0,children:"설정 열기 →"})]}),(0,n.jsxs)("span",{"aria-live":"polite",className:"sr-only",children:["ACP: ",eo]}),(0,n.jsxs)("span",{className:"pointer-events-none absolute right-2 top-2 rounded bg-black/70 px-2 py-1 text-xs ".concat(ei),children:["ACP: ",eo,"CONNECTING"===en&&(0,n.jsxs)("span",{"data-share-hide":!0,children:[" \xb7 ","".concat(ed,"초 \xb7 ").concat(ec," \xb7 ").concat(q.baseUrl)]})]})]})}let R={failures:0,stopped:!1,message:null,screen:null},A=/^\[screen \d+x\d+ cursor=[^\]\n]*\]\r?\n/;function z(e){let t=e.replace(A,"").replace(/\r?\n/g,"\r\n");return"\x1b[H\x1b[2J".concat(t)}function M(e,t){var r;if(e.stopped)return e;if((null==t?void 0:t.status)==="success"&&"string"==typeof t.screen)return{failures:0,stopped:!1,message:null,screen:z(t.screen)};if((null==t?void 0:t.status)==="unknown-pty")return{...e,stopped:!0,message:"PTY 가 끝났습니다"};if((null==t?void 0:t.status)==="denied")return{...e,failures:0,stopped:!0,message:t.reason||"화면 조회가 거부되었습니다"};let n=e.failures+1;return(null==t?void 0:t.status)!=="owner-unreachable"?{...e,failures:n,stopped:n>=5,message:(null==t?void 0:t.reason)||"화면 조회에 실패했습니다"}:{...e,failures:n,stopped:n>=5,message:n>=5?"소유 프로세스에 닿지 않습니다":null!=(r=t.reason)?r:null}}function P(e){var t,r;let{terminal:l,client:o,onClose:d}=e,u=(0,a.useRef)(null),p=(0,a.useRef)(null),h=(0,a.useRef)(null),f=(0,a.useRef)(R),[b,x]=(0,a.useState)(!1),[g,v]=(0,a.useState)(!1),w=(0,a.useRef)(!1),[y,k]=(0,a.useState)(null),[j,S]=(0,a.useState)("connecting");return(0,a.useEffect)(()=>{var e,t,r;let n;if(!u.current)return;let a={closed:!1,owned:!1,accepting:!1,queue:Promise.resolve(),takeover:null,release:null};h.current=a,w.current=!1,v(!1);let d={sourceRoot:null==(e=l.sourceRoot)?void 0:e.dbPath},b=new s.B({cols:110,rows:40,fontFamily:'"JetBrainsMono Nerd Font", "JetBrains Mono", monospace',fontSize:13,theme:{background:"#0d0c08",foreground:"#e9e3d4",cursor:"#e9e3d4"},cursorBlink:!1,disableStdin:!0,scrollback:0,allowProposedApi:!0});b.loadAddon(new i.c),b.loadAddon(new c.I),b.unicode.activeVersion="11",b.open(u.current),b.write("\x1b[?25l"),p.current=b,f.current=R,x(!1),k(null);let g=b.onData(e=>{if(!a.accepting||a.closed||!e)return;let t=e.startsWith("\x1b")||"\r"===e||"\n"===e||""===e||" "===e||"\x03"===e;a.queue=a.queue.then(async()=>{try{let r=t?await o.sendTerminalKey(l.id,e,d):await o.sendTerminalText(l.id,e,d);if(a.closed)return;"success"!==r.status&&("denied"===r.status&&(a.accepting=!1,x(!1),b.options.disableStdin=!0),k(r.reason||"입력 실패: ".concat(r.status)))}catch(e){a.closed||k("입력 전송 실패: ".concat(String(e)))}})}),y=u.current,j=!1,N=e=>{a.queue=a.queue.then(async()=>{try{var t;if(!o.sendTerminalMouse)return;let r=await o.sendTerminalMouse(l.id,e,d);if(a.closed||"success"===r.status)return;if((t=r.reason)&&/mouse mode is off|\?1006/i.test(t)){"click"!==e.kind||j||(j=!0,k("이 앱은 마우스를 받지 않는다(마우스 모드 꺼짐) — 키보드로 조작하세요."));return}k(r.reason||"마우스 전송 실패: ".concat(r.status))}catch(e){a.closed||k("마우스 전송 실패: ".concat(String(e)))}})},C=e=>{var t;let r=null==(t=b.element)?void 0:t.querySelector(".xterm-screen");return r?function(e,t,r,n,a){if(!(r.width>0)||!(r.height>0)||n<1||a<1)return null;let l=Math.floor((e-r.left)/r.width*n)+1,s=Math.floor((t-r.top)/r.height*a)+1;return{x:Math.min(n,Math.max(1,l)),y:Math.min(a,Math.max(1,s))}}(e.clientX,e.clientY,r.getBoundingClientRect(),b.cols,b.rows):null},I=()=>a.accepting&&!a.closed&&"none"===b.modes.mouseTrackingMode,T=e=>{var t;if(!I())return;let r=0===(t=e.button)?"left":1===t?"middle":2===t?"right":null,n=C(e);r&&n&&N({...n,kind:"click",button:r})},Y=e=>{if(!I()||0===e.deltaY)return;let t=C(e);t&&(e.preventDefault(),e.stopPropagation(),N({...t,kind:e.deltaY<0?"scroll-up":"scroll-down"}))};null==(t=y.addEventListener)||t.call(y,"mousedown",T,{capture:!0}),null==(r=y.addEventListener)||r.call(y,"wheel",Y,{passive:!1,capture:!0});let E=async()=>{var e,t,r,s;if(!a.closed&&(e=!document.hidden,t=f.current,e&&!t.stopped)){try{let e=await o.snapshotTerminal(l.id,{ansi:!0,sourceRoot:d.sourceRoot});if(a.closed)return;let t=M(f.current,e);f.current=t,null!==t.screen&&"success"===e.status&&b.write(t.screen+"\x1b[?25l"),k(t.message)}catch(t){if(a.closed)return;let e=M(f.current,null);f.current=e,k(e.message)}a.closed||(r=!document.hidden,s=f.current,!r||s.stopped)||(n=setTimeout(()=>{E()},800))}},A=!o.streamTerminal,P=null,D=()=>{!o.streamTerminal||a.closed||A||(S("connecting"),P=o.streamTerminal(l.id,{sourceRoot:d.sourceRoot},e=>{a.closed||("mode"===e.type?S("bytes"===e.mode?"stream-bytes":"stream-screen"):"reset"===e.type||"screen"===e.type?(b.write(z(e.screen)+"\x1b[?25l"),k(null)):"data"===e.type?b.write(e.chunk):"end"===e.type?(k("PTY 가 끝났습니다"),f.current={...f.current,stopped:!0}):"status"===e.type&&k("화면 조회: ".concat(e.status)))},e=>{a.closed||((0,m.cY)("pwa.terminal.stream-fallback",{id:l.id,reason:e}),A=!0,S("poll"),E())}))},L=()=>{if(n&&clearTimeout(n),n=void 0,!A)return void(document.hidden?(null==P||P(),P=null):P||f.current.stopped||D());document.hidden||a.closed||f.current.stopped||E()};return document.addEventListener("visibilitychange",L),A?(S("poll"),E()):D(),()=>{var e,t;a.closed=!0,a.accepting=!1,n&&clearTimeout(n),null==P||P(),document.removeEventListener("visibilitychange",L),g.dispose(),null==(e=y.removeEventListener)||e.call(y,"mousedown",T,{capture:!0}),null==(t=y.removeEventListener)||t.call(y,"wheel",Y,{capture:!0}),(async()=>{if(await a.takeover,a.release&&await a.release,a.owned){await a.queue;try{let e=await o.controlTerminal(l.id,"release",d);"success"===e.status&&(a.owned=!1)}catch(e){}}})(),h.current===a&&(h.current=null),p.current=null,b.dispose()}},[o,l.id,null==(t=l.sourceRoot)?void 0:t.dbPath]),(0,n.jsxs)("section",{className:"flex h-full min-h-0 flex-col bg-[#0d0c08]","aria-label":"PTY 라이브 화면",children:[(0,n.jsxs)("header",{className:"flex flex-wrap items-center gap-3 border-b border-zinc-700 px-3 py-2 text-sm text-zinc-100",children:[(0,n.jsx)("span",{className:"font-mono",children:l.id}),(0,n.jsx)("span",{children:null!=(r=l.kind)?r:"PTY"}),(0,n.jsx)("span",{children:b?"입력 가능":"읽기 전용"}),(0,n.jsx)("span",{className:"rounded bg-zinc-800 px-1.5 py-0.5 font-mono text-[10px] text-zinc-300","data-pty-feed":j,title:"화면을 받는 방식",children:"stream-bytes"===j?"● 실시간":"stream-screen"===j?"● 실시간(화면)":"poll"===j?"폴링 0.8s":"연결 중"}),(0,n.jsx)("button",{type:"button",disabled:g,onClick:()=>{(e=>{var t;let r=h.current;if(!r||r.closed||w.current)return;w.current=!0,v(!0);let n={sourceRoot:null==(t=l.sourceRoot)?void 0:t.dbPath};"release"===e&&(r.accepting=!1,p.current&&(p.current.options.disableStdin=!0));let a=(async()=>{try{"release"===e&&await r.queue;let t=await o.controlTerminal(l.id,e,n);if("success"===t.status&&(r.owned="takeover"===e),r.closed)return;"success"===t.status?(r.accepting="takeover"===e,x(r.accepting),p.current&&(p.current.options.disableStdin=!r.accepting),k(null)):("release"===e&&(r.accepting=r.owned,p.current&&(p.current.options.disableStdin=!r.accepting)),k(t.reason||("denied"===t.status?"제어 거부: 권한이 없습니다":"제어 실패: ".concat(t.status))))}catch(t){r.closed||("release"===e&&(r.accepting=r.owned,p.current&&(p.current.options.disableStdin=!r.accepting)),k("제어 요청 실패: ".concat(String(t))))}finally{r.closed||(w.current=!1,v(!1))}})();"takeover"===e?r.takeover=a:r.release=a})(b?"release":"takeover")},children:b?"release":"takeover"}),(0,n.jsx)("button",{type:"button",onClick:d,"aria-label":"PTY 라이브 닫기",children:"닫기"})]}),y&&(0,n.jsx)("p",{role:"status",className:"px-3 py-1 text-amber-300",children:y}),(0,n.jsx)("div",{ref:u,className:"min-h-0 flex-1 overflow-auto","aria-label":"".concat(l.id," 화면")})]})}var D=r(19528);let L=e=>"string"==typeof e&&e.trim()?e:null,U={codex:"codex",claude:"claude",gemini:"gemini",grok:"grok",self:"elanous",mission:"elanous 미션",shell:"셸",pty:"PTY"},F={PLAN:"text-sky-400",ROUTE:"text-violet-400",VERIFY:"text-amber-400",HEAL:"text-emerald-400",ESCALATE:"text-rose-400",SHIP:"text-green-400"};function $(e){let{rows:t,client:r,initial:l,onClose:s,stage:o=!1}=e,[i,c]=(0,a.useState)(l);(0,a.useEffect)(()=>{0===i.length&&t.length&&c(function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:3,r=e.filter(e=>e.alive),n=r.filter(e=>e.kind&&["codex","claude","self","mission","gemini","grok"].includes(e.kind)),a=r.filter(e=>!n.includes(e));return[...n,...a].slice(0,t).map(e=>e.id)}(t))},[t,i.length]),(0,a.useEffect)(()=>{let e=new URLSearchParams(window.location.search);i.length?e.set("wall",i.join(",")):e.delete("wall"),window.history.replaceState(null,"","".concat(window.location.pathname,"?").concat(e.toString()))},[i]);let[d,u]=(0,a.useState)([]);(0,a.useEffect)(()=>{let e=!0,t=async()=>{try{var t;let n=await r.fetchJson("/v1/logs?category=harness.decision&store=@active&since=6h&limit=300");e&&u(null!=(t=n.logs)?t:[])}catch(e){}};t();let n=window.setInterval(()=>{document.hidden||t()},5e3);return()=>{e=!1,window.clearInterval(n)}},[r]);let[m,p]=(0,a.useState)(!1);(0,a.useEffect)(()=>{"public"===new URLSearchParams(window.location.search).get("capture")&&p(!0)},[]);let h=(0,a.useMemo)(()=>m?(0,D.yR)(d.map(e=>{var t;return{ts:e.ts,category:"harness.decision",event:"decision",data:null!=(t=e.data)?t:null}})):d,[d,m]),f=(0,a.useMemo)(()=>i.map(e=>t.find(t=>t.id===e)).filter(e=>!!e),[i,t]),b=e=>c(t=>t.includes(e)?t.filter(t=>t!==e):[...t,e].slice(-3));return(0,n.jsxs)("section",{className:"flex h-full min-h-0 flex-col bg-[#0b0a07]","aria-label":"터미널 나란히","data-pty-wall":!0,children:[(0,n.jsxs)("header",{className:"flex flex-wrap items-center gap-2 border-b border-zinc-700 px-3 py-2 text-xs text-zinc-200",children:[(0,n.jsxs)("span",{className:"font-medium",children:["나란히 \xb7 ",f.length,"/3"]}),t.filter(e=>e.alive).slice(0,14).map(e=>{var t,r,a;return(0,n.jsxs)("button",{type:"button",onClick:()=>b(e.id),"aria-pressed":i.includes(e.id),className:"rounded-full border px-2 py-0.5 font-mono ".concat(i.includes(e.id)?"border-emerald-500 bg-emerald-900/40 text-emerald-200":"border-zinc-700 text-zinc-400 hover:bg-zinc-800"),"data-pty-wall-chip":e.id,children:[null!=(r=e.kind)?r:"pty"," \xb7 ",e.nickname||e.id]},"".concat(null!=(a=null==(t=e.sourceRoot)?void 0:t.dbPath)?a:"",":").concat(e.id))}),(0,n.jsx)("button",{type:"button",onClick:s,className:"ml-auto rounded px-2 py-1 text-zinc-400 hover:bg-zinc-800","aria-label":"나란히 닫기",children:"닫기"})]}),0===f.length?(0,n.jsx)("p",{className:"p-6 text-sm text-zinc-400",children:"위에서 PTY 를 1~3개 고르세요 — 살아 있는 에이전트 PTY 가 없으면 비어 있습니다."}):(0,n.jsx)("div",{className:"grid min-h-0 flex-1 gap-1 p-1 ".concat(1===f.length?"grid-cols-1":2===f.length?"grid-cols-2":"grid-cols-3"),children:f.map(e=>{var t,a;let l=function(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:3;return t.filter(t=>{var r;let n=null!=(r=t.data)?r:{};return!!e.runId&&n.runId===e.runId||n.target===e.id||n.shard===e.id}).sort((e,t)=>e.ts<t.ts?1:-1).slice(0,r).map(e=>{var t,r,n,a,l;let s=null!=(t=e.data)?t:{};return{ts:e.ts,kind:(null!=(r=L(s.kind))?r:"PLAN").toUpperCase(),what:null!=(n=L(s.what))?n:"(판단)",why:null!=(l=null!=(a=L(s.reason))?a:L(s.why))?l:L(s.purpose),target:L(s.target)}})}(e,h,2);return(0,n.jsxs)("div",{className:"flex min-h-0 flex-col overflow-hidden rounded border border-zinc-800","data-pty-wall-pane":e.id,children:[(0,n.jsxs)("div",{className:"flex items-center gap-2 bg-zinc-900 px-2 py-1 text-[11px]",children:[(0,n.jsx)("span",{className:"rounded bg-violet-900/50 px-1.5 py-0.5 text-violet-200","data-pty-agent":!0,children:function(e){let t=e.externalToolName&&U[e.externalToolName]||e.kind&&U[e.kind]||e.externalToolName||e.kind||"PTY";return"에이전트: ".concat(t).concat(e.runId?" \xb7 런 ".concat(e.runId.replace(/^run-/,"").slice(0,8)):"")}(e)}),(0,n.jsx)("span",{className:"truncate font-mono text-zinc-500",children:e.id})]}),(0,n.jsx)("div",{className:"min-h-[38px] border-b border-zinc-800 bg-zinc-950/80 px-2 py-1 ".concat(o?"text-sm":"text-[11px]"),"aria-label":"의도 띠","data-pty-intent":!0,children:0===l.length?(0,n.jsx)("span",{className:"text-zinc-500",children:"이 PTY 를 모는 판단 신호 없음(사람이 모는 PTY 거나 MAX 계측 꺼짐)"}):l.map(e=>{var t;return(0,n.jsxs)("div",{className:"truncate",children:[(0,n.jsx)("span",{className:"font-mono ".concat(null!=(t=F[e.kind])?t:"text-zinc-300"),children:e.kind})," ",(0,n.jsx)("span",{className:"text-zinc-100",children:e.what}),e.why&&(0,n.jsxs)("span",{className:"text-zinc-400",children:[" \xb7 왜: ",e.why]}),e.target&&(0,n.jsxs)("span",{className:"text-zinc-500",children:[" → ",e.target]})]},"".concat(e.ts,"-").concat(e.what))})}),(0,n.jsx)("div",{className:"min-h-0 flex-1",children:(0,n.jsx)(P,{terminal:e,client:r,onClose:()=>b(e.id)})})]},"".concat(null!=(a=null==(t=e.sourceRoot)?void 0:t.dbPath)?a:"",":").concat(e.id))})})]})}var O=r(30913);let _={connected:{label:"연결됨",color:"bg-emerald-500"},connecting:{label:"연결 중",color:"bg-amber-500"},disconnected:{label:"끊김",color:"bg-rose-500"}};function B(e){let{activeId:t,tabs:r,status:l,onSwitch:s,onAdd:o,actions:i,children:c}=e,[d,u]=(0,a.useState)(!1),[m,p]=(0,a.useState)(!1);return(0,a.useEffect)(()=>{if(!m&&!d)return;let e=e=>{"Escape"===e.key&&(u(!1),p(!1))};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[d,m]),(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"relative flex h-10 max-h-10 shrink-0 items-center justify-between border-b border-zinc-800 bg-background px-2","aria-label":"간결한 터미널 상단바",children:[(0,n.jsxs)("div",{className:"relative min-w-0 max-w-[calc(50%_-_12px)] flex-1",children:[(0,n.jsxs)("button",{type:"button",className:"max-w-full truncate rounded px-2 py-1 text-left text-xs","aria-label":"터미널 고르기","aria-expanded":d,onClick:()=>{p(!1),u(e=>!e)},children:[null!=t?t:"터미널 준비 중"," ▾"]}),d&&(0,n.jsxs)("div",{className:"absolute left-0 top-full z-40 max-h-[60vh] min-w-48 overflow-auto rounded border border-zinc-700 bg-background p-1 shadow-xl",role:"menu","aria-label":"열린 터미널",children:[r.map(e=>(0,n.jsx)("button",{type:"button",role:"menuitem",className:"block w-full truncate rounded px-2 py-2 text-left text-sm hover:bg-accent","aria-current":e===t?"true":void 0,onClick:()=>{s(e),u(!1)},children:e},e)),(0,n.jsx)("button",{type:"button",role:"menuitem",className:"block w-full rounded px-2 py-2 text-left text-sm hover:bg-accent",onClick:()=>{o(),u(!1)},children:"+ 새 터미널"})]})]}),(0,n.jsx)("span",{className:"absolute left-1/2 h-2 w-2 -translate-x-1/2 rounded-full ".concat(_[l].color),title:_[l].label,"aria-label":_[l].label,role:"status"}),(0,n.jsx)("button",{type:"button",className:"shrink-0 rounded px-2 py-1 text-lg leading-none","aria-label":"터미널 더보기","aria-expanded":m,onClick:()=>{u(!1),p(e=>!e)},children:"⋯"})]}),m&&(0,n.jsx)("button",{type:"button",className:"fixed inset-0 z-40 bg-black/50","aria-label":"터미널 메뉴 닫기",onClick:()=>p(!1)}),(0,n.jsxs)("section",{className:m?"fixed inset-x-0 bottom-0 z-50 max-h-[75dvh] overflow-y-auto rounded-t-xl border-t border-zinc-700 bg-background p-4 shadow-2xl":"hidden","aria-label":"터미널 더보기 시트","aria-hidden":!m,children:[(0,n.jsxs)("div",{className:"mb-3 flex items-center justify-between",children:[(0,n.jsx)("span",{className:"text-sm font-medium",children:"터미널 동작"}),(0,n.jsx)("button",{type:"button",onClick:()=>p(!1),"aria-label":"터미널 메뉴 닫기",children:"닫기"})]}),(0,n.jsx)("div",{className:"flex flex-wrap gap-2 border-b border-zinc-800 pb-3",children:c}),(0,n.jsx)("div",{className:"pt-3",children:i})]})]})}let Q=/\x1b(?:\][^\x07\x1b]*(?:\x07|\x1b\\)|\[[0-?]*[ -/]*[@-~]|[@-Z\\-_])/g,q=new Map;function H(e){let{sessionId:t}=e,{client:r,setSessionId:l}=(0,u.Q)(),[s,o]=(0,a.useState)(q),[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(Q,""):"자기신고하는 elanous 화면이 아직 없습니다. 대시보드(elanous)를 실행하면 여기 라이브로 미러링됩니다."})]})}var K=r(73139),V=r(82823),G=r(82157),J=r(9290),W=r(31113),Z=r(73313);function X(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),f=(0,a.useRef)(!1),b=(0,a.useRef)(e.onFrameUploaded);b.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,f.current=!1},[]),v=(0,a.useCallback)(async()=>{if(f.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"});f.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,Z.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=b.current)||t.call(b,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{f.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 ee(e){let{terminalId:t,onClear:r,onRecordingChange:l,onAttached:s,voice:o,variant:i="default"}=e,{client:c,sessionId:d,config:p}=(0,u.Q)(),[h,f]=(0,a.useState)(null),[b,x]=(0,a.useState)(null),[g,v]=(0,a.useState)(!1),[w,y]=(0,a.useState)(null);(0,a.useEffect)(()=>{null==l||l(null!==h)},[h,l]);let k=(0,a.useRef)(null);(0,a.useEffect)(()=>()=>{try{var e;null==(e=k.current)||e.close()}catch(e){}k.current=null},[]),(0,a.useEffect)(()=>{if(!d)return;k.current||(k.current=c.connectAcp({sessionId:d}));let e=k.current,r=!1;return(async()=>{try{var n;let a=await e.send("terminal/record/list",{sessionId:d});if(r)return;let l=null==a||null==(n=a.recordings)?void 0:n.find(e=>e.terminalId===t);l?f({recorderId:l.recorderId,startedAt:l.startedAt}):f(null),x(null),y(null)}catch(e){(0,m.cY)("webterm.controls.list-error",{reason:String(e)})}})(),()=>{r=!0}},[c,d,t]);let j=(0,a.useCallback)(async()=>{if(!d)return void y("session 미설정 — daemon 연결을 먼저 확인하세요");k.current||(k.current=c.connectAcp({sessionId:d}));let e=k.current;v(!0),y(null),x(null);try{var r,n;let a=await e.send("terminal/record/start",{sessionId:d,terminalId:t});(null==a?void 0:a.started)&&a.recorderId?((0,m.cY)("webterm.controls.record.started",{recorderId:a.recorderId,terminalId:t}),f({recorderId:a.recorderId,startedAt:null!=(r=a.startedAt)?r:Date.now()})):y(null!=(n=null==a?void 0:a.reason)?n:"start failed")}catch(e){y(String(e instanceof Error?e.message:e))}finally{v(!1)}},[c,d,t]),S=(0,a.useCallback)(async()=>{var e,r,n,a;if(!d||!h)return;let l=null!=(e=k.current)?e:c.connectAcp({sessionId:d});k.current=l,v(!0),y(null);try{let e=await l.send("terminal/record/stop",{sessionId:d,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}),x({recorderId:e.recorderId,downloadUrl:e.downloadUrl,frameCount:null!=(r=e.frameCount)?r:0,elapsedSec:null!=(n=e.elapsedSec)?n:0}),f(null)):y(null!=(a=null==e?void 0:e.reason)?a:"stop failed")}catch(e){y(String(e instanceof Error?e.message:e))}finally{v(!1)}},[h,c,d,t]);return(0,n.jsxs)("div",{className:"sheet"===i?"flex flex-wrap items-center gap-2 text-xs":"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)(J.T,{onAttached:s?e=>s([e]):void 0}),(0,n.jsx)(W.u,{onAttached:s}),(0,n.jsx)(X,{}),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,G.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,G.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)(K.A,{className:"h-3.5 w-3.5"}):(0,n.jsx)(V.A,{className:"h-3.5 w-3.5"}),(0,n.jsx)("span",{children:"voice→stdin"})]}),!h&&!b&&(0,n.jsx)("button",{type:"button",disabled:g,className:"rounded border px-2 py-0.5 ".concat(g?"opacity-50":"hover:bg-accent"," text-rose-600 dark:text-rose-400"),onClick:()=>void j(),title:"start asciicast recording",children:"● record"}),h&&(0,n.jsx)("button",{type:"button",disabled:g,className:"rounded border px-2 py-0.5 ".concat(g?"opacity-50":"hover:bg-accent"," bg-rose-600 text-white animate-pulse"),onClick:()=>void S(),title:"stop + save .cast",children:"■ stop"}),b&&(0,n.jsx)("a",{href:(e=>{var t;if(!e)return"";let r=null!=(t=p.baseUrl)?t:"",n=e.includes("?")?"&":"?",a=p.token?"".concat(n,"auth=").concat(encodeURIComponent(p.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:()=>x(null),title:"dismiss","aria-label":"dismiss download",children:"\xd7"}),(h||b)&&(0,n.jsxs)("span",{className:"ml-auto text-[11px] text-muted-foreground",children:[h&&"● recording",b&&!h&&"✓ ".concat(b.recorderId)]}),w&&(0,n.jsx)("span",{className:"ml-2 max-w-[40%] truncate text-[11px] text-rose-500",title:w,children:w})]})}let et={ctrl:!1,alt:!1},er={up:"A",down:"B",right:"C",left:"D"},en="elanous.pwa.hwKeyboard",ea=/^(Escape|Tab|ArrowUp|ArrowDown|ArrowLeft|ArrowRight|F([1-9]|1[0-2]))$/;function el(e,t){try{null==e||e.setItem(en,t?"1":"0")}catch(e){}}let es=[{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 eo(e){let{terminalId:t}=e,{sessionId:r}=(0,u.Q)(),[l,s]=(0,a.useState)(!1),[o,i]=(0,a.useState)(!1),[c,d]=(0,a.useState)(!1);(0,a.useEffect)(()=>{d(function(e){try{return(null==e?void 0:e.getItem(en))==="1"}catch(e){return!1}}(window.localStorage));let e=e=>{var t;t=navigator.userAgent,!e.isComposing&&229!==e.keyCode&&"Unidentified"!==e.key&&"Process"!==e.key&&(ea.test(e.key)||(e.ctrlKey||e.metaKey||e.altKey)&&1===e.key.length||/Android/i.test(t)&&1===e.key.length||0)&&d(t=>t||(el(window.localStorage,!0),(0,m.cY)("webterm.modifier-bar.hw-keyboard",{key:1===e.key.length?"char":e.key}),!0))};return document.addEventListener("keydown",e,!0),()=>document.removeEventListener("keydown",e,!0)},[]);let p=(0,a.useCallback)(()=>{el(window.localStorage,!1),d(!1)},[]),h=(0,a.useRef)(!1),f=(0,a.useRef)(!1);h.current=l,f.current=o;let b=(0,a.useRef)(null),x=(0,a.useCallback)((e,t)=>{null!==b.current&&(clearTimeout(b.current),b.current=null),(e||t)&&(b.current=setTimeout(()=>{s(!1),i(!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)(e=>{if(!r)return void(0,m.cY)("webterm.modbar.no-session",{key:e});let n={ctrl:h.current,alt:f.current},a=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:et;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=er[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,n);(0,m.cY)("webterm.modbar.send",{key:e,ctrl:n.ctrl,alt:n.alt,bytes:a.length});try{S(t,a)}catch(e){(0,m.cY)("webterm.modbar.send-error",{reason:String(e)})}(n.ctrl||n.alt)&&(s(!1),i(!1),x(!1,!1))},[r,t,x]),v=(0,a.useCallback)(()=>{let e=!h.current;s(e),x(e,f.current)},[x]),w=(0,a.useCallback)(()=>{let e=!f.current;i(e),x(h.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 c?(0,n.jsx)("div",{className:"flex items-center border-b border-border bg-background/60 px-2 py-0.5","data-testid":"modifier-bar-collapsed",children:(0,n.jsx)("button",{type:"button",onClick:p,className:"rounded px-1.5 py-0.5 text-[11px] text-muted-foreground hover:text-foreground",title:"물리 키보드가 잡혀 접었다 — 누르면 Esc\xb7Tab\xb7화살표 키 줄을 다시 편다",children:"⌨ 보조 키"})}):(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:[es.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:!r,"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(l),onClick:v,disabled:!r,"aria-label":"Ctrl modifier ".concat(l?"active":"idle"),"aria-pressed":l,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(o),onClick:w,disabled:!r,"aria-label":"Alt modifier ".concat(o?"active":"idle"),"aria-pressed":o,title:"Alt modifier — toggles. Combines with Esc/Tab/arrows. Auto-releases after 5s or one keystroke.","data-testid":"modbar-alt",children:"Alt"})]})}var ei=r(31014);function ec(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),f=(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)(()=>{f();let e=()=>{"visible"===document.visibilityState&&f()};return document.addEventListener("visibilitychange",e),()=>{document.removeEventListener("visibilitychange",e)}},[f]),(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,f()},1800))},[t,f]),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)(ei.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 ed=r(47963);function eu(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,Z.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)(ed.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 em=r(82356),ep=r(330),eh=r(41657),ef=r(8979),eb=r(9189),ex=r(10793),eg=r(50940),ev=r(96811),ew=r(19206),ey=r(38869),ek=r(68355),ej=r(25194),eS=r(72030),eN=r(45977),eC=r(64323);async function eI(e,t){if(!t||0===t.length)return null;try{let r=await e.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(t),"?ifExists=1"));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,eC.$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,eC.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,eC.$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 eT=[":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 eE=(0,a.forwardRef)(function(e,t){let{terminalId:r,open:s,onTabIntent:o,height:i,voice:c}=e,d="number"==typeof i&&Number.isFinite(i)&&i>0?i:void 0,{client:p,config:h,sessionId:f,setSessionId:b}=(0,u.Q)(),x=(0,a.useRef)(f),g=(0,a.useRef)(null),[v,w]=(0,a.useState)([]),[y,k]=(0,a.useState)(!1),[j,S]=(0,a.useState)(null),[N,C]=(0,a.useState)([]),[I,T]=(0,a.useState)(!1),Y=(0,a.useRef)(async()=>{}),E=(0,a.useRef)(!1);E.current=y;let R=(0,a.useRef)(null),[A,z]=(0,a.useState)(!1),M=(0,eN.$)({enabled:!!(null==c?void 0:c.active)&&!A,language:"ko-KR"}),P=(0,a.useRef)(M);P.current=M,(0,a.useEffect)(()=>{x.current=f},[f]),(0,a.useEffect)(()=>{try{var e;null==(e=g.current)||e.close()}catch(e){}if(g.current=null,s&&f)return g.current=p.connectAcp({sessionId:f}),()=>{try{var e;null==(e=g.current)||e.close()}catch(e){}g.current=null}},[p,s,f]),(0,a.useEffect)(()=>{let e=g.current;if(e&&s&&f)return e.on("sessionUpdate",e=>{var t;let r=R.current;if(!r)return;let n=e.params;if(!n||n.sessionId!==f)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;w(t=>t.map(t=>{var n;return t.id===r?{...t,text:(null!=(n=t.text)?n:"")+e}:t})),P.current.pushText(e)}})},[s,f]);let D=(0,a.useRef)(null);(0,a.useEffect)(()=>{if(!s||!f||D.current===f)return;D.current=f;let e=!1;return(async()=>{let t=await eI(p,f);e||null===t||w(t)})(),()=>{e=!0}},[p,s,f]);let L=(0,a.useCallback)(e=>{w(t=>[...t,e].slice(-200))},[]);(0,a.useImperativeHandle)(t,()=>({submitVoiceTranscript:e=>{let t=e.trim();if(t){if(E.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}),Y.current(t)}}}),[]);let U=(0,a.useCallback)(()=>{let e=x.current;return e?(g.current||(g.current=p.connectAcp({sessionId:e})),g.current):null},[p]),F=(0,a.useMemo)(()=>({client:p,sessionId:f,provider:h.provider,setSessionId:b,daemon:{baseUrl:h.baseUrl,...h.token?{token:h.token}:{}},messages:v}),[p,h.baseUrl,h.provider,h.token,v,f,b]),$=(0,a.useCallback)(e=>{C(t=>[...t,...e]),(0,m.cY)("webterm.terminal-chat.attach.queue",{terminalId:r,added:e.length,filenames:e.map(e=>e.filename)})},[r]),O=(0,a.useCallback)(e=>{C(t=>t.filter(t=>t.id!==e))},[]),_=(0,a.useCallback)(async e=>{let t=e.startsWith(":")?null:await (0,eC.yN)(e,F);if(t){"__CLEAR__"===t.text?w([]):L((0,eC.$Q)(t.text,r)),t.newSessionId&&b(t.newSessionId);return}if(!f)return void L((0,eC.$Q)("session 미설정",r));let n=U();if(!n)return void L((0,eC.$Q)("session 미설정",r));let a=await n.send("terminal/repl/exec",{sessionId:f,terminalId:r,line:e});L((0,eC.$Q)(eY(null==a?void 0:a.output),r)),(null==a?void 0:a.sessionIdChange)&&b(a.sessionIdChange),(null==a?void 0:a.tabIntent)!==void 0&&(null==o||o(a.tabIntent),L((0,eC.$Q)("tab intent → ".concat(String(a.tabIntent)),r))),(null==a?void 0:a.injectPath)&&L((0,eC.$Q)("captured → ".concat(a.injectPath),r)),(null==a?void 0:a.agentChatModeEnter)&&L((0,eC.$Q)("agent chat mode hint — terminal dock already runs plain text as agent turns",r))},[L,F,U,o,f,b,r]),B=(0,a.useCallback)(async()=>{let e=x.current;if(e&&j)try{var t;let n=U();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}),L((0,eC.$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);L((0,eC.$Q)("abort failed: ".concat(e),r))}finally{k(!1),S(null)}},[L,U,j,r]),Q=(0,a.useCallback)(async e=>{C([]);let t=N.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),L((0,eC.$Q)("⚠ ".concat(e),r)),(0,m.cY)("webterm.terminal-chat.attach.dropped",{terminalId:r,droppedCount:t,totalCount:N.length})}e.length>0&&L((0,eC.tw)(e,r)),N.length>0&&L((0,eC.$Q)("\uD83D\uDCCE attached: ".concat(N.map(e=>e.filename).join(", ")),r));let n=e.trim();if(n||0!==N.length){k(!0);try{if((0,eC.FM)(n))return void await _(n);if(!f)return void L((0,eC.$Q)("session 미설정",r));let e=U();if(!e)return void L((0,eC.$Q)("session 미설정",r));S(n);let t="assistant-".concat(Date.now(),"-").concat(Math.random().toString(36).slice(2,6));R.current=t,L({id:t,role:"assistant",text:"",timestamp:Date.now(),terminalId:r}),(0,m.cY)("webterm.terminal-chat.turn.start",{terminalId:r,sessionId:f,len:n.length,attachCount:N.length,placeholderId:t});let a=N.filter(e=>e.path).map(e=>"[attached] ".concat(e.path)),l=a.length>0?"".concat(a.join("\n"),"\n\n").concat(n).trimEnd():n,s=await e.send("terminal/repl/exec",{sessionId:f,terminalId:r,line:":agent ".concat(l)});(null==s?void 0:s.agent)?(w(e=>e.map(e=>e.id===t?{...e,text:e.text&&e.text.length>=s.agent.markdown.length?e.text:s.agent.markdown,meta:{provider:s.agent.modelLabel,stopReason:s.agent.stopReason}}:e)),P.current.flush()):(w(e=>e.filter(e=>e.id!==t)),L((0,eC.$Q)(eY(null==s?void 0:s.output),r))),(0,m.cY)("webterm.terminal-chat.turn.end",{terminalId:r,hasAgent:!!(null==s?void 0:s.agent)})}catch(n){let e=n instanceof Error?n.message:String(n),t=R.current;t&&w(e=>e.filter(e=>e.id!==t)),P.current.cancel(),L((0,eC.$Q)("error: ".concat(e),r)),l.oR.error("terminal chat failed: ".concat(e))}finally{R.current=null,k(!1),S(null)}}},[L,U,_,N,f,r]);return((0,a.useEffect)(()=>{Y.current=Q},[Q]),s)?(0,n.jsxs)("div",{className:"shrink-0 border-t border-border bg-background/95","data-terminal-chat-dock":!0,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)(ep.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:[c&&(0,n.jsxs)("button",{type:"button",onClick:c.onToggle,disabled:c.disabled,title:c.disabled?"마이크 사용 불가 (insecure context 등)":c.phaseLabel,"data-elanous-action":"webterm-voice-toggle-dock","aria-pressed":c.active,className:(0,G.cn)("inline-flex h-7 items-center gap-1.5 rounded-md border px-2 text-[11px]",c.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",c.disabled&&"cursor-not-allowed opacity-50"),children:[(0,n.jsx)("span",{className:(0,G.cn)("h-1.5 w-1.5 rounded-full",c.dotColor,("listening"===c.phase||"speaking"===c.phase)&&"animate-pulse"),"aria-hidden":"true"}),c.active?(0,n.jsx)(K.A,{className:"h-3.5 w-3.5"}):(0,n.jsx)(V.A,{className:"h-3.5 w-3.5"}),(0,n.jsx)("span",{className:"hidden sm:inline",children:c.phaseLabel})]}),c&&c.active&&M.supported&&(0,n.jsx)("button",{type:"button",onClick:()=>{A||P.current.cancel(),z(e=>!e)},title:A?"음성 응답 켜기":"음성 응답 끄기","data-elanous-action":"webterm-tts-mute-toggle","aria-pressed":A,className:(0,G.cn)("inline-flex h-7 items-center justify-center rounded-md border px-2 text-[11px]",A?"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:A?(0,n.jsx)(eh.A,{className:"h-3.5 w-3.5"}):(0,n.jsx)(ef.A,{className:"h-3.5 w-3.5"})}),(0,n.jsx)(ek.Qh,{}),(0,n.jsx)(em.vG,{children:(0,n.jsx)(ey.rm,{})}),(0,n.jsx)(em.vG,{children:(0,n.jsx)(ej.D,{})}),j&&(0,n.jsxs)(eS.$,{variant:"destructive",size:"sm",onClick:()=>void B(),title:"abort active terminal-context agent turn",children:[(0,n.jsx)(eb.A,{className:"h-3.5 w-3.5"}),"Stop"]}),(0,n.jsxs)("div",{className:"relative",children:[(0,n.jsx)(eS.$,{variant:"outline",size:"icon-sm",onClick:()=>T(e=>!e),"aria-label":"terminal quick commands",title:"terminal quick commands",children:(0,n.jsx)(ex.A,{className:"h-3.5 w-3.5"})}),I&&(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:eT.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:()=>{T(!1),Q(e)},children:e},e))})]})]})]}),j&&(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)(eg.A,{className:"h-3.5 w-3.5 animate-spin"}),(0,n.jsxs)("span",{className:"truncate",children:["terminal-context agent turn in progress",j.length>0?" \xb7 ".concat(j.slice(0,120)).concat(j.length>120?"…":""):""]})]}),(0,n.jsxs)("div",{className:(0,G.cn)("grid grid-rows-[1fr_auto]",void 0===d?"h-[clamp(160px,30vh,360px)] min-h-[200px]":void 0),...void 0===d?{}:{style:{height:d}},children:[(0,n.jsx)(ev.D,{messages:v,pending:y,tabId:"dock-".concat(r)}),(0,n.jsx)(ew.V,{onSubmit:Q,disabled:y,attachments:N,onAttached:$,onRemoveAttachment:O,tabId:"dock-".concat(r),...c?{voice:c}:{}})]})]}):null});var eR=r(93981),eA=r(72754);let ez=/^100\.(6[4-9]|[7-9]\d|1[01]\d|12[0-7])\./;function eM(){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&&ez.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",eD={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:eD);if((0,a.useEffect)(()=>{l(function(){try{return"1"===window.sessionStorage.getItem(eP)}catch(e){return!1}}()),o(null!=t?t:eM())},[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)(eR.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)(eA.A,{className:"h-3.5 w-3.5"})})]})}async function eU(e){var t;let{terminalId:r,paths:n}=e,a=null==(t=e.alsoCopyToClipboard)||t,l=n.filter(e=>"string"==typeof e&&e.length>0).map(e=>"'".concat(e.replace(/'/g,"'\\''"),"'")).join(" ");if(!l)return{injected:!1,copied:!1};let s="".concat(l," "),o=!1;try{(o=S(r,s))?(0,m.cY)("webterm.attach.inject.ok",{terminalId:r,pathCount:n.length,bytes:s.length}):(0,m.cY)("webterm.attach.inject.error",{terminalId:r,reason:"no-sender"})}catch(e){(0,m.cY)("webterm.attach.inject.error",{terminalId:r,reason:String(e)})}let i=!1;if(a&&"undefined"!=typeof navigator&&navigator.clipboard)try{await navigator.clipboard.writeText(l),i=!0,(0,m.cY)("webterm.attach.clipboard.ok",{pathCount:n.length})}catch(e){(0,m.cY)("webterm.attach.clipboard.skip",{reason:String(e)})}return{injected:o,copied:i}}var eF=r(68158),e$=r(72422),eO=r(38067),e_=r(47940);function eB(e){return e.length<=32?e:"…".concat(e.slice(-32))}function eQ(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}function eq(e){let t=new Map,r=new Set,n=new Set,a=[];for(let r of e){var l,s;if(n.has(r.id))continue;n.add(r.id),a.push(r);let e=null==(l=r.runId)?void 0:l.trim();if(!e)continue;let o=null!=(s=t.get(e))?s:[];o.push(r),t.set(e,o)}let o=[];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}o.push({runId:e,split:t.id,tabs:n.filter(e=>e.id!==t.id).map(e=>{let{id:t}=e;return t})})}let i=new Set(o.flatMap(e=>{let{split:t,tabs:r}=e;return[t,...r]}));return{layouts:o,unknown:a.filter(e=>{let{id:t}=e;return r.has(t)&&!i.has(t)}).map(e=>{let{id:t}=e;return{id:t,reason:"relationship-unavailable"}})}}function eH(e){return{layouts:e.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}))}}let eK=["terminal","observe","pty-list"],eV="elanous.webterm.activeId",eG="elanous.webterm.panelsMinimized",eJ="elanous.webterm.chatDockOpen";function eW(e){return e.sourceRoot?{sourceRoot:e.sourceRoot.dbPath}:{}}function eZ(e){let{layout:t,sessionId:r,onForeignInputActivity:a,terminalIds:l,activeId:s=null,visible:o=!0,clearRequests:i}=e,c=t.layouts.flatMap(e=>e.slots),d=new Map(c.map(e=>[e.terminalId,e])),u=new Set(t.layouts.map(e=>{var t;return null==(t=e.slots[0])?void 0:t.terminalId}).filter(e=>!!e)),m=void 0===l?c.map(e=>e.terminalId):[...new Set([...l,...s?[s]:[],...c.map(e=>e.terminalId)])],p=new Set(c.length>0?c.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)}),m.map(e=>{var t,l;let c=d.get(e),m=o&&p.has(e),h=null!=(t=null==c?void 0:c.position)?t:e===s?"single":"inactive-tab";return(0,n.jsxs)("div",{className:m?"".concat(u.has(e)?"col-start-1 ":"").concat((null==c?void 0:c.position)==="split"?"min-h-0 border border-emerald-600":(null==c?void 0:c.position)==="tab"?"min-h-0 border border-zinc-700":"col-span-2 h-full min-h-0"):"hidden","data-pane-position":h,"data-terminal-id":e,children:[c&&(0,n.jsxs)("p",{className:"sr-only",children:["split"===c.position?"분할 터미널":"탭 터미널",": ",e]}),(0,n.jsx)(E,{sessionId:r,terminalId:e,clearRequest:null!=(l=null==i?void 0:i[e])?l:0,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}}(),{compact:h}=(0,Y.K)(),[f,b]=(0,a.useState)(null),[x,g]=(0,a.useState)({}),[v,w]=(0,a.useState)([]),[y,k]=(0,a.useState)(!1),[j,N]=(0,a.useState)(null),[C,I]=(0,a.useState)(null),[T,E]=(0,a.useState)(!1);(0,a.useEffect)(()=>{var e,t;let r=null!=(t=null==(e=window.location)?void 0:e.search)?t:"",n=function(e){let t=new URLSearchParams(e).get("wall");return t?t.split(",").map(e=>e.trim()).filter(Boolean).slice(0,3):[]}(r);n.length&&I(n),"1"===new URLSearchParams(r).get("stage")&&E(!0)},[]);let[R,A]=(0,a.useState)({status:"pending"}),z=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?e.slow?"데몬이 느립니다 — 터미널을 만드는 중… (기다리는 중)":"터미널 이름을 준비하는 중…":"터미널 이름을 로컬에서 정했습니다 (".concat(n,")."),fallbackBanner:r?"터미널 이름을 로컬에서 정했습니다 (".concat(n,"). 데몬 발급을 확인하지 못했습니다."):null}}(R,null!==f),M=(0,a.useCallback)(e=>{A(e),"pending"===e.status&&b(null)},[]),D=(0,a.useRef)(!1),L=(0,a.useRef)(!1),[U,F]=(0,a.useState)("terminal"),_={view:U,buttons:eK.map(e=>({view:e,selected:e===U}))},Q=(0,a.useCallback)(e=>{F(t=>"observe"===e&&"observe"===t?"terminal":e)},[]),[q,K]=(0,a.useState)(!!s),[V,G]=(0,a.useState)([]),[J,W]=(0,a.useState)(),[Z,X]=(0,a.useState)(new Map),[et,er]=(0,a.useState)("loading"),[en,ea]=(0,a.useState)(null),[el,es]=(0,a.useState)(null),ei=(0,a.useRef)(!1),ed=null!=(r=null==en?void 0:en.id)?r:null,em=en?(0,eO.x3)(en):null,[ep,eh]=(0,a.useState)("raw"),[ef,eb]=(0,a.useState)(new Map),[ex,eg]=(0,a.useState)(new Map),[ev,ew]=(0,a.useState)({status:"unrequested"}),ey=(0,a.useRef)(0),ek=(0,a.useRef)(0);(0,a.useEffect)(()=>{if("terminal"!==U&&"pty-list"!==U)return;let e=!1;er("loading");let t=setTimeout(()=>{(async()=>{try{let[t,r]=await Promise.all([i.listTerminals((0,eO.tC)(q)),i.listProgressFrames().catch(e=>((0,m.cY)("webterm.pty-list.progress.error",{reason:String(e)}),null))]);if(e)return;G((0,eO.xu)(t.terminals)),W(t.scope),X(r?(0,eO.gA)(r.logs):new Map),er("idle")}catch(t){if(e)return;G([]),W(void 0),X(new Map),er("error"),(0,m.cY)("webterm.pty-list.error",{reason:String(t)})}})()},"terminal"!==U||s?0:1200);return()=>{e=!0,clearTimeout(t)}},[i,q,U,s]),(0,a.useEffect)(()=>{null===em||V.some(e=>(0,eO.x3)(e)===em)||(ey.current+=1,ek.current+=1,ea(null),ew({status:"unrequested"}))},[V,em]);let ej=(0,a.useCallback)((e,t)=>{let{id:r}=e,n=(0,eO.x3)(e),a=++ey.current;if("raw"===t){eb(e=>new Map(e).set(n,{status:"loading"})),i.fetchTerminalScrollback(e.id,100,eW(e)).then(e=>{ey.current===a&&e.id===r&&eb(t=>new Map(t).set(n,{status:"ready",scrollback:e.scrollback}))}).catch(e=>{ey.current===a&&(eb(e=>new Map(e).set(n,{status:"error"})),(0,m.cY)("webterm.pty-list.scrollback.error",{id:r,reason:String(e)}))});return}eg(e=>new Map(e).set(n,{status:"loading"})),i.fetchTerminalFrame(e.id,eW(e)).then(e=>{ey.current===a&&e.id===r&&eg(t=>new Map(t).set(n,{status:"ready",frame:e.frame,frameAt:e.frameAt,frameSource:e.frameSource}))}).catch(e=>{ey.current===a&&(eg(e=>new Map(e).set(n,{status:"error"})),(0,m.cY)("webterm.pty-list.frame.error",{id:r,reason:String(e)}))})},[i]),eS=(0,a.useCallback)(function(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],{id:r}=e;if(t&&(k(!1),N(e),null==o||o(e)),em===(0,eO.x3)(e))return;let n=++ek.current;ea(e),ew({status:"loading"}),ej(e,ep),i.fetchTerminalLineage(r).then(e=>{ek.current===n&&e.key===r&&ew({status:"ready",lineage:e})}).catch(e=>{ek.current===n&&(ew({status:"error"}),(0,m.cY)("webterm.pty-list.lineage.error",{id:r,reason:String(e)}))})},[i,o,ep,ej,em]);(0,a.useEffect)(()=>{if(ei.current||"loading"===et||(ei.current=!0,!s))return;if("error"===et){es({kind:"list-unavailable"}),F("pty-list"),(0,m.cY)("webterm.initial-pty-selection",{ptyId:s,kind:"list-unavailable",reason:"pty-list-error"});return}let e=(0,eO.hH)(s,V);es(e),"selected"!==e.kind&&F("pty-list"),(0,m.cY)("webterm.initial-pty-selection",{ptyId:s,kind:e.kind,reason:e.reason}),"selected"===e.kind&&(eS(e.terminal),N(e.terminal))},[eS,s,et,V]);let eN=(0,a.useCallback)(e=>{e!==ep&&(eh(e),en&&ej(en,e))},[ep,ej,en]),eC=(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]),eI=(0,a.useMemo)(()=>(0,eO.lH)(q,V,J,em,ef,ep,ex),[ex,q,V,J,ep,ef,em]),eT=(0,a.useMemo)(()=>(0,eO.Kh)(ed,ev),[ev,ed]),eY=(0,a.useMemo)(()=>(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}))}})(null===j&&(null===s||y)?eH(eq(V)):eH(eq(V.filter(e=>{var t;return e.id!==(null!=(t=null==j?void 0:j.id)?t:s)&&v.includes(e.id)}))),null!=f?f:""),[V,v,j,y,s,f]);(0,a.useEffect)(()=>{if(D.current||s||"loading"===et)return;if(0===V.length){L.current||(L.current=!0,(0,m.cY)("webterm.initial-selection",{skipped:!0,reason:"no-terminals",listState:et}));return}D.current=!0;let e=(0,eO.Dw)({storedId:null,fallbackId:f,terminals:V});(0,m.cY)("webterm.initial-selection",{terminalId:e.terminalId,reason:e.reason,rowCount:V.length}),e.terminalId!==f&&b(e.terminalId)},[V,et]);let[eR,eA]=(0,a.useState)(0),[ez,eP]=(0,a.useState)(!1),[eD,e_]=(0,a.useState)(!0),[eX,e0]=(0,a.useState)(!1),[e1,e2]=(0,a.useState)(0),[e3,e5]=(0,a.useState)(null),e9=(0,a.useCallback)(e=>{e5({intent:e,nonce:Date.now()})},[]),e4=(0,a.useRef)(null),[e7,e8]=(0,a.useState)("none"),e6=(0,a.useRef)(e7);e6.current=e7;let te=(0,a.useRef)(f);te.current=f;let tt=(0,a.useCallback)(e=>{let t=e.trim();if(!t)return;let r=e6.current;if("controls"===r){let e=te.current;if(!e)return;if(!S(e,t+" ")){(0,m.cY)("webterm.voice.stdin-inject-failed",{len:t.length,terminalId:e,reason:"no-sender"}),l.oR.error("터미널 입력 전송 실패 — 터미널 연결을 확인하고 다시 말해 주세요.");return}(0,m.cY)("webterm.voice.stdin-inject",{len:t.length,terminalId:e})}else if("dock"===r){var n;null==(n=e4.current)||n.submitVoiceTranscript(t)}else(0,m.cY)("webterm.voice.transcript-no-source",{len:t.length})},[]),tr=i.voiceWsUrl(),tn=(0,eF.sS)({wsUrl:tr,...c.token?{token:c.token}:{},onTranscript:tt}),ta=(0,a.useMemo)(()=>eM(),[]),tl=!c.baseUrl||!ta.isSecure,ts=(0,a.useCallback)(()=>{tn.active&&"dock"===e7?(e8("none"),tn.toggle()):(e8("dock"),tn.active||tn.toggle())},[tn,e7]),to=(0,a.useCallback)(()=>{tn.active&&"controls"===e7?(e8("none"),tn.toggle()):(e8("controls"),tn.active||tn.toggle())},[tn,e7]),ti=(0,a.useMemo)(()=>({active:tn.active&&"dock"===e7,phase:tn.phase,dotColor:e$.x[tn.phase],phaseLabel:e$.g[tn.phase],disabled:tl,onToggle:ts}),[tn.active,tn.phase,e7,tl,ts]),tc=(0,a.useMemo)(()=>({active:tn.active&&"controls"===e7,phase:tn.phase,dotColor:e$.x[tn.phase],phaseLabel:e$.g[tn.phase],disabled:tl,onToggle:to}),[tn.active,tn.phase,e7,tl,to]),td=(0,a.useRef)(ts);td.current=ts,(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"),e_(!0),td.current())};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[]),(0,a.useEffect)(()=>{let e=window.localStorage.getItem(eV);e&&e.length>0&&(!s||e!==s)&&(b(e),D.current=!0),"1"===window.localStorage.getItem(eG)&&eP(!0),"0"===window.localStorage.getItem(eJ)&&e_(!1)},[]);let tu=(0,a.useCallback)(async e=>{if(!d||!f||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});let r=await eU({terminalId:f,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,f]),tm=(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("button",{type:"button","aria-pressed":_.buttons[0].selected,onClick:()=>{N(null),k(!0),Q("terminal")},className:"rounded px-2 py-1 text-xs ".concat(_.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":_.buttons[1].selected,onClick:()=>{N(null),k(!0),Q("observe")},className:"rounded px-2 py-1 text-xs ".concat(_.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 관측 ",_.buttons[1].selected?"ON":"OFF"]}),(0,n.jsx)("button",{type:"button","aria-pressed":_.buttons[2].selected,onClick:()=>{N(null),k(!0),Q("pty-list")},className:"rounded px-2 py-1 text-xs ".concat(_.buttons[2].selected?"bg-emerald-700 text-white":"bg-zinc-800 text-zinc-300 hover:bg-zinc-700"),children:"PTY 목록"}),(0,n.jsx)("button",{type:"button","aria-pressed":null!==C,onClick:()=>I(e=>null===e?[]:null),className:"rounded px-2 py-1 text-xs ".concat(null!==C?"bg-emerald-700 text-white":"bg-zinc-800 text-zinc-300 hover:bg-zinc-700"),"data-elanous-action":"pty-wall",children:"▦ 나란히"})]}),tp=f&&(0,n.jsx)(ee,{terminalId:f,onClear:()=>g(e=>{var t;return{...e,[f]:(null!=(t=e[f])?t:0)+1}}),onRecordingChange:e0,onAttached:tu,voice:tc,variant:h?"sheet":"default"});return(0,n.jsxs)("div",{className:"flex h-full flex-col",children:[(0,n.jsx)(O.ZO,{variant:h?"sheet":"default",renderSheet:e=>{let{tabs:t,status:r,onSwitch:a,onAdd:l,actions:s}=e;return(0,n.jsxs)(B,{activeId:f,tabs:t,status:r,onSwitch:a,onAdd:l,actions:s,children:[tm,tp]})},activeId:f,onActiveChange:e=>{b(e),window.localStorage.setItem(eV,e),N(null),k(!0),F("terminal")},onInitialTerminalState:M,minimized:ez,onToggleMinimize:()=>{eP(e=>{let t=!e;return window.localStorage.setItem(eG,t?"1":"0"),t})},recording:eX,peerCount:e1,chatDockOpen:eD,onToggleChatDock:()=>{if(ez){eP(!1),window.localStorage.setItem(eG,"0"),e_(!0),window.localStorage.setItem(eJ,"1");return}e_(e=>{let t=!e;return window.localStorage.setItem(eJ,t?"1":"0"),requestAnimationFrame(()=>{window.dispatchEvent(new Event("resize"))}),t})},tabIntent:e3,onTabsChange:w,suspendInitialSpawn:!!s&&!y}),z.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:z.fallbackBanner}),(0,n.jsx)(eL,{}),!h&&(0,n.jsx)("div",{className:ez?"hidden":"flex items-center gap-2 border-b border-zinc-800 px-3 py-1",children:tm}),f?(0,n.jsxs)("div",{className:ez||"terminal"!==U||null!==j||s&&!y?"hidden":"contents",children:[h?(0,n.jsx)("div",{className:"hidden",children:(0,n.jsx)(ec,{foreignActivityTick:eR,onPeerCountChange:e2})}):(0,n.jsx)(ec,{foreignActivityTick:eR,onPeerCountChange:e2}),!h&&tp,p&&(0,n.jsx)(eo,{terminalId:f}),(0,n.jsx)(eu,{onAttached:tu})]}):null,(0,n.jsxs)("div",{className:"relative flex-1 min-h-0",children:[null!==C&&(0,n.jsx)("div",{className:T?"fixed inset-0 z-50":"absolute inset-0 z-20","data-pty-wall-stage":T?"1":void 0,children:(0,n.jsx)($,{rows:V,client:i,initial:C,stage:T,onClose:()=>{I(null);let e=new URLSearchParams(window.location.search);e.delete("wall"),window.history.replaceState(null,"","".concat(window.location.pathname).concat(e.toString()?"?".concat(e):""))}})}),(0,n.jsx)(eZ,{layout:eY,sessionId:d,terminalIds:v.filter(e=>e!==(null==j?void 0:j.id)&&(y||e!==s)),activeId:f&&(f===(null==j?void 0:j.id)||!y&&f===s)?null:f,clearRequests:x,visible:null!==f&&"terminal"===U&&null===j&&(!s||y),onForeignInputActivity:()=>eA(e=>e+1)}),j&&(0,n.jsx)(P,{terminal:j,client:i,onClose:()=>{k(!0),N(null),Q("terminal")}},(0,eO.x3)(j)),j||"terminal"!==U||f&&(!s||y)?j?null:"pty-list"===U?(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:eI.includeAll,onChange:e=>K(e.target.checked)}),"다른 인스턴스도 보기"]}),eI.scopeSummary&&(0,n.jsx)("p",{className:"mb-3 text-xs text-muted-foreground","aria-label":"PTY 목록 범위 요약",children:eI.scopeSummary}),(null==el?void 0:el.kind)==="ambiguous"&&(0,n.jsxs)("p",{className:"mb-3 text-xs text-amber-500",role:"status","aria-label":"URL PTY 선택 상태",children:["주소의 PTY ",s,"가 ",el.candidates.length,"개 행과 맞아 선택하지 않았습니다."]}),(null==el?void 0:el.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==el?void 0:el.kind)==="not-found"&&(0,n.jsxs)("p",{className:"mb-3 text-xs text-rose-500",role:"status","aria-label":"URL PTY 선택 상태",children:["주소의 PTY ",s,"를 찾지 못했습니다 (",el.reason,")."]}),(null==(t=eI.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:eI.rows.find(e=>e.view).view.modes.map(e=>(0,n.jsx)("button",{type:"button","aria-pressed":e.selected,onClick:()=>eN(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"===et?(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"PTY 목록을 불러오는 중…"}):"error"===et?(0,n.jsx)("p",{className:"text-sm text-rose-500",children:"PTY 목록을 불러오지 못했습니다."}):0===V.length?(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"데몬이 아는 PTY가 없습니다."}):(0,n.jsx)("ul",{className:"space-y-2",children:eI.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=eQ(e.startedAt,a),c=void 0===e.lastControlAt?null:eQ(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=Z.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:()=>eS(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:()=>{eC(t)},children:"이름 바꾸기"}),e.selected&&eT&&(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"===eT.kind&&(0,n.jsx)("p",{className:"text-muted-foreground",children:"계보를 불러오는 중…"}),"error"===eT.kind&&(0,n.jsx)("p",{className:"text-rose-400",children:"계보를 불러오지 못했습니다."}),"empty"===eT.kind&&(0,n.jsx)("p",{className:"text-muted-foreground",children:"연결된 다른 화면이 없습니다."}),eT.unreadablePayloadsSummary&&(0,n.jsx)("p",{className:"text-muted-foreground",children:eT.unreadablePayloadsSummary}),eT.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,eO.cl)(e.alive,e.closed)," \xb7 시작 ",(0,eO.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})]})]},(0,eO.x3)(t))})})]}):"observe"===U?(0,n.jsx)(H,{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==el?void 0:el.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:z.placeholder})]})]}),f&&!ez&&"terminal"===U&&!j&&(!s||y)&&(0,n.jsx)(eE,{ref:e4,terminalId:f,open:eD,onTabIntent:e9,voice:ti})]})}}}]);
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[5012],{45012:(e,t,s)=>{s.d(t,{J_:()=>i,ki:()=>l});var n=s(91644),r=s(49536),a=s(51215),o=s(84606);class i extends Error{constructor(e,t,s=[]){super(t),this.status=e,this.code=t,this.seats=s}}class l{updateConfig(e){let t="".concat((0,r.yS)(this.cfg),"\0").concat(this.cfg.token),s="".concat((0,r.yS)(e),"\0").concat(e.token);this.cfg=e,t!==s&&(this.acpConnections.forEach(e=>e.dispose()),this.acpConnections.clear())}async fetchResponse(e,t){var s;let r=await fetch(this.url(e),{...t,headers:{...this.authHeaders(),...null!=(s=null==t?void 0:t.headers)?s:{}}});return 401===r.status&&(0,n.Qb)(e),r}async fetchJson(e,t){var s;if(e.startsWith("/v1/terminals")&&!e.startsWith("/v1/terminals/")&&(!t||(null!=(s=t.method)?s:"GET")==="GET"&&void 0===t.body)){let s=this.inflightTerminals.get(e);if(s)return s;let n=this.fetchJsonOnce(e,t).finally(()=>{this.inflightTerminals.delete(e)});return this.inflightTerminals.set(e,n),n}return this.fetchJsonOnce(e,t)}async fetchJsonOnce(e,t){var s,n,r;let a=await this.fetchResponse(e,t),o=(null!=(s=a.headers.get("content-type"))?s:"").includes("application/json")?await a.json():await a.text();if(!a.ok)throw Error(String("string"==typeof o?o:null!=(r=null!=(n=null==o?void 0:o.reason)?n:null==o?void 0:o.error)?r:"".concat(a.status)));return o}getCodexLogin(){return this.fetchJson("/v1/setup/codex-login")}startCodexLogin(e){return this.fetchJson("/v1/setup/codex-login",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({mode:e})})}async health(){return this.fetchJson("/v1/health")}async fieldDefaultEvent(){return this.fetchJson("/v1/field/uploads")}async fieldReelStatus(e){return this.fetchJson("/v1/field/reel?event=".concat(encodeURIComponent(e)))}uploadField(e,t,s,r){let a=new FormData;t.forEach(e=>a.append("file",e,e.name)),t.forEach(()=>a.append("capturedAt",""));let o=new URLSearchParams({event:e,device:"pwa"});s.trim()&&(o.set("caption",s.trim()),a.append("caption",s.trim()));let i="/v1/field/uploads?".concat(o);return new Promise((e,t)=>{let s=new XMLHttpRequest;s.open("POST",this.url(i)),this.cfg.token&&s.setRequestHeader("authorization","Bearer ".concat(this.cfg.token)),s.upload.onprogress=e=>{e.lengthComputable&&e.total>0&&r(Math.min(100,Math.round(100*e.loaded/e.total)))},s.onerror=()=>t(Error("field upload: network error")),s.onload=()=>{let r;401===s.status&&(0,n.Qb)(i);try{r=JSON.parse(s.responseText)}catch(e){t(Error("field upload ".concat(s.status,": invalid response")));return}if("object"!=typeof r||null===r)return void t(Error("field upload ".concat(s.status,": invalid response")));if(s.status<200||s.status>=300||!0!==r.ok){var a,o;t(Error(null!=(o=null!=(a=r.reason)?a:r.error)?o:"field upload ".concat(s.status)));return}if("string"!=typeof r.event||"number"!=typeof r.count)return void t(Error("field upload ".concat(s.status,": invalid response")));e({event:r.event,count:r.count})},s.send(a)})}async submitConsultRequest(e){let t=await this.fetchResponse("/v1/consult-requests",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)});if(202===t.status||400===t.status)return await t.json();throw Error("consult-requests ".concat(t.status))}async listExecRequests(){return this.fetchJson("/v1/exec-requests")}async getExecRequest(e){return this.fetchJson("/v1/exec-requests/".concat(encodeURIComponent(e)))}async submitExecRequest(e){let t=await this.fetchResponse("/v1/exec-requests",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({text:e})});if(202!==t.status)throw Error("exec-requests ".concat(t.status));return await t.json()}async listSeatRequests(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=new URLSearchParams;void 0!==e.seat&&t.set("seat",e.seat),void 0!==e.limit&&t.set("limit",String(e.limit));let s=t.size?"?".concat(t):"";return this.fetchJson("/v1/seat-requests".concat(s))}async submitSeatRequest(e,t){let{seat:s,text:n,attachments:r}=e,a=await this.fetchResponse("/v1/seat-requests",{method:"POST",headers:{"content-type":"application/json","Idempotency-Key":t},body:JSON.stringify({...void 0!==s?{seat:s}:{},text:n,...(null==r?void 0:r.length)?{attachments:r.map(e=>{let{id:t,filename:s,mediaType:n,size:r}=e;return{id:t,name:s,mediaType:n,bytes:r}})}:{}})}),o=await a.json();if(!a.ok){var l,c;throw new i(a.status,null!=(l=o.error)?l:"http-".concat(a.status),null!=(c=o.seats)?c:[])}return o}subscribeChatEvents(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=new AbortController,r={method:"GET",headers:{accept:"text/event-stream",...this.authHeaders()},signal:s.signal},o="".concat(this.url("/v1/chat/events"),"?sessionId=").concat(encodeURIComponent(e));return(0,a.cY)("webterm.chat.observer.subscribe",{sessionId:e}),(async()=>{var i,l;try{let e=await fetch(o,r);if(401===e.status&&(0,n.Qb)("/v1/chat/events"),!e.ok||!e.body){null==(i=t.onError)||i.call(t,{error:"observer_failed",message:"".concat(e.status,": ").concat(await e.text())});return}await f(e.body,t)}catch(e){if(s.signal.aborted)return;null==(l=t.onError)||l.call(t,{error:"observer_disconnected",message:e instanceof Error?e.message:String(e)})}(0,a.cY)("webterm.chat.observer.end",{sessionId:e})})(),()=>{(0,a.cY)("webterm.chat.observer.dispose",{sessionId:e});try{s.abort()}catch(e){}}}subscribeAgentStatusEvents(e,t){let s=new AbortController,r="".concat(this.url("/v1/events"),"?topics=agent.status");return(0,a.cY)("webterm.agent-status.subscribe",{sessionId:e}),(async()=>{var o,i;try{let a=await fetch(r,{method:"GET",headers:{accept:"text/event-stream",...this.authHeaders()},signal:s.signal});if(401===a.status&&(0,n.Qb)("/v1/events"),!a.ok||!a.body){null==(o=t.onError)||o.call(t,{error:"agent_status_failed",message:"".concat(a.status,": ").concat(await a.text())});return}await g(a.body,e,t)}catch(e){if(s.signal.aborted)return;null==(i=t.onError)||i.call(t,{error:"agent_status_disconnected",message:e instanceof Error?e.message:String(e)})}(0,a.cY)("webterm.agent-status.end",{sessionId:e})})(),()=>{(0,a.cY)("webterm.agent-status.dispose",{sessionId:e});try{s.abort()}catch(e){}}}subscribeHudSegmentEvents(e,t){let s=new AbortController,r="".concat(this.url("/v1/events"),"?topics=hud.segment");return(0,a.cY)("webterm.hud-segment.subscribe",{sessionId:e}),(async()=>{var o,i;try{let a=await fetch(r,{method:"GET",headers:{accept:"text/event-stream",...this.authHeaders()},signal:s.signal});if(401===a.status&&(0,n.Qb)("/v1/events"),!a.ok||!a.body){null==(o=t.onError)||o.call(t,{error:"hud_segment_failed",message:"".concat(a.status,": ").concat(await a.text())});return}await y(a.body,e,t)}catch(e){if(s.signal.aborted)return;null==(i=t.onError)||i.call(t,{error:"hud_segment_disconnected",message:e instanceof Error?e.message:String(e)})}(0,a.cY)("webterm.hud-segment.end",{sessionId:e})})(),()=>{(0,a.cY)("webterm.hud-segment.dispose",{sessionId:e});try{s.abort()}catch(e){}}}subscribeChatFeedbackEvents(e,t){let s=new AbortController,r=["agent.status","hud.segment"],o="".concat(this.url("/v1/events"),"?topics=").concat(r.join(","));return(0,a.cY)("webterm.chat-feedback.subscribe",{sessionId:e,topics:r}),(async()=>{var r,i,l,c,d,u,h,p;try{let a=await fetch(o,{method:"GET",headers:{accept:"text/event-stream",...this.authHeaders()},signal:s.signal});if(401===a.status&&(0,n.Qb)("/v1/events"),!a.ok||!a.body){let e="".concat(a.status,": ").concat(await a.text());null==(r=(i=t.agentStatus).onError)||r.call(i,{error:"agent_status_failed",message:e}),null==(l=(c=t.hudSegment).onError)||l.call(c,{error:"hud_segment_failed",message:e});return}let[d,u]=a.body.tee();await Promise.all([g(d,e,t.agentStatus),y(u,e,t.hudSegment)])}catch(n){if(s.signal.aborted)return;let e=n instanceof Error?n.message:String(n);null==(d=(u=t.agentStatus).onError)||d.call(u,{error:"agent_status_disconnected",message:e}),null==(h=(p=t.hudSegment).onError)||h.call(p,{error:"hud_segment_disconnected",message:e})}(0,a.cY)("webterm.chat-feedback.end",{sessionId:e})})(),()=>{(0,a.cY)("webterm.chat-feedback.dispose",{sessionId:e});try{s.abort()}catch(e){}}}async promptStream(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};(0,a.cY)("webterm.rest.prompt.stream",{sessionId:e.sessionId,len:e.userText.length});let s={method:"POST",headers:{"content-type":"application/json",accept:"text/event-stream",...this.authHeaders()},body:JSON.stringify({...void 0!==e.sessionId?{sessionId:e.sessionId}:{},userText:e.userText,...void 0!==e.userContent?{userContent:e.userContent}:{},...void 0!==e.provider?{provider:e.provider}:{}})};t.signal&&(s.signal=t.signal);let r=!0===t.debugTap?"/v1/prompt/stream?debug-tap=on":"/v1/prompt/stream",o=await fetch(this.url(r),s);if(401===o.status&&(0,n.Qb)(r),!o.ok||!o.body)throw Error("prompt/stream ".concat(o.status,": ").concat(await o.text()));return p(o.body,t)}connectAcp(){let e,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},s=(0,r.yS)(this.cfg);if(!s)throw Error("daemon baseUrl not configured");if(!t.sessionId)return new c(s,this.cfg.token).acquire(t.onSession);let n=t.sessionId,a=this.acpConnections.get(n);return a&&!a.isTerminal?a.acquire(t.onSession):(e=new c(s,this.cfg.token,t.sessionId,()=>{this.acpConnections.get(n)===e&&this.acpConnections.delete(n)}),this.acpConnections.set(n,e),e.acquire(t.onSession))}voiceWsUrl(){return(0,r.uh)(this.cfg)}async voiceCost(){return this.fetchJson("/v1/voice/cost")}async listTerminals(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=!0===e.all&&!0===e.includeTest?"?all=true&includeTest=true":"";return this.fetchJson("/v1/terminals".concat(t))}async fetchTerminalLineage(e){return this.fetchJson("/v1/terminals/lineage?key=".concat(encodeURIComponent(e)))}async fetchTerminalScrollback(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:50,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=encodeURIComponent(e),r=new URLSearchParams({lines:String(t)});return s.sourceRoot&&r.set("sourceRoot",s.sourceRoot),this.fetchJson("/v1/terminals/".concat(n,"/scrollback?").concat(r))}streamTerminal(e,t,r,a){let o=new AbortController,i=t.sourceRoot?"?sourceRoot=".concat(encodeURIComponent(t.sourceRoot)):"",l=this.url("/v1/terminals/".concat(encodeURIComponent(e),"/stream").concat(i));return(async()=>{try{let e=await fetch(l,{method:"GET",headers:{accept:"text/event-stream",...this.authHeaders()},signal:o.signal});if(401===e.status&&(0,n.Qb)("/v1/terminals/stream"),!e.ok||!e.body)return void a("stream ".concat(e.status));let{parseTerminalSse:t}=await s.e(2415).then(s.bind(s,22415)),i=e.body.getReader(),c=new TextDecoder,d="";for(;;){let e=await i.read();if(e.done)break;d+=c.decode(e.value,{stream:!0});let s=t(d);for(let e of(d=s.rest,s.events))r(e)}}catch(e){if(o.signal.aborted)return;a(e instanceof Error?e.message:String(e))}})(),()=>{try{o.abort()}catch(e){}}}async snapshotTerminal(e,t){return this.requestTerminalControl(e,{action:"snapshot",ansi:t.ansi},t)}async sendTerminalText(e,t){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.requestTerminalControl(e,{action:"input-text",chars:t},s)}async sendTerminalKey(e,t){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.requestTerminalControl(e,{action:"input-key",chars:t},s)}async sendTerminalMouse(e,t){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.requestTerminalControl(e,{action:"input-mouse",...t},s)}async controlTerminal(e,t){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.requestTerminalControl(e,{action:t},s)}async requestTerminalControl(e,t){let s,r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},a=encodeURIComponent(e),o=r.sourceRoot?"?sourceRoot=".concat(encodeURIComponent(r.sourceRoot)):"",i=await fetch(this.url("/v1/terminals/".concat(a,"/control").concat(o)),{method:"POST",headers:{"content-type":"application/json",...this.authHeaders()},body:JSON.stringify(t)});401===i.status&&(0,n.Qb)("/v1/terminals/".concat(a,"/control"));try{s=await i.json()}catch(e){throw Error("terminal control ".concat(i.status,": invalid JSON response"))}let l=s&&"object"==typeof s?s.status:void 0,c="write-failed"===l?"failed":l;if("success"!==c&&"unknown-pty"!==c&&"denied"!==c&&"failed"!==c&&"owner-unreachable"!==c||i.status!==({success:200,"unknown-pty":404,denied:409,failed:502,"owner-unreachable":504})[c]){var d;let e=s&&"object"==typeof s?null!=(d=s.reason)?d:s.error:void 0;throw Error("terminal control ".concat(i.status,": ").concat(String(null!=e?e:"unexpected response")))}let u=s;if("snapshot"===t.action&&"success"===c&&"string"!=typeof u.screen)throw Error("terminal control ".concat(i.status,": missing screen"));return{status:c,..."string"==typeof u.reason?{reason:u.reason}:{},..."snapshot"===t.action&&"string"==typeof u.screen?{screen:u.screen}:{}}}async renameTerminal(e,t){let s,r=encodeURIComponent(e),a=await fetch(this.url("/v1/terminals/".concat(r,"/rename")),{method:"POST",headers:{"content-type":"application/json",...this.authHeaders()},body:JSON.stringify({name:t})});401===a.status&&(0,n.Qb)("/v1/terminals/".concat(r,"/rename"));try{s=await a.json()}catch(e){throw Error("terminal rename ".concat(a.status,": invalid JSON response"))}let o=s&&"object"==typeof s?s:{},i="write-failed"===o.status?"failed":"unknown-pty"===o.status||"denied"===o.status||"failed"===o.status||"owner-unreachable"===o.status?o.status:"success"===o.status?"success":"invalid-name"===o.error?"invalid-name":void 0;if(void 0===i||a.status!==({success:200,"invalid-name":400,"unknown-pty":404,denied:409,failed:502,"owner-unreachable":504})[i]||"success"===i&&("string"!=typeof o.id||"string"!=typeof o.name)){var l,c;throw Error("terminal rename ".concat(a.status,": ").concat(String(null!=(c=null!=(l=o.reason)?l:o.error)?c:"unexpected response")))}return"success"===i?{status:i,id:o.id,name:o.name}:{status:i}}async fetchTerminalFrame(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=encodeURIComponent(e),n=t.sourceRoot?"?sourceRoot=".concat(encodeURIComponent(t.sourceRoot)):"",r=await this.fetchJson("/v1/terminals/".concat(s,"/frame").concat(n));return{id:r.id,frame:r.frame,frameAt:r.frameAt,frameSource:r.frameSource}}async createAgentCliSession(e,t,s){let n=(null==s?void 0:s.hitl)==="off"?"/v1/agent-cli/sessions?hitl=off":"/v1/agent-cli/sessions";return this.fetchJson(n,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({backend:e,...t?{cwd:t}:{}})})}async agentCliPromptStream(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s={method:"POST",headers:{"content-type":"application/json",...this.authHeaders()},body:JSON.stringify(e)};t.signal&&(s.signal=t.signal);let r=await fetch(this.url("/v1/agent-cli/prompt"),s);if(401===r.status&&(0,n.Qb)("/v1/agent-cli/prompt"),!r.ok){let e=await r.text().catch(()=>"");throw Error("agent-cli/prompt ".concat(r.status,": ").concat(e))}if(!r.body)throw Error("agent-cli/prompt: no body");let a=r.body.getReader(),o=new TextDecoder,i="",l="",c="end_turn",d=e.sessionId,u=null;for(;;){let{value:e,done:s}=await a.read();if(s)break;let n=(i+=o.decode(e,{stream:!0})).indexOf("\n\n");for(;-1!==n;){var h,p,f,m,g,y;let e=i.slice(0,n);i=i.slice(n+2);let s=e.split("\n"),r="message",a=[];for(let e of s)e.startsWith("event: ")?r=e.slice(7).trim():e.startsWith("data: ")&&a.push(e.slice(6));let o=a.join("\n");if("chunk"===r)try{let e=JSON.parse(o);"string"==typeof e.text&&(l+=e.text,null==(h=t.onTextDelta)||h.call(t,{delta:e.text,full:l}))}catch(e){}else if("stop"===r)try{let e=JSON.parse(o);e.stopReason&&(c=e.stopReason),e.sessionId&&(d=e.sessionId),null==(p=t.onStop)||p.call(t,{stopReason:c,sessionId:d})}catch(e){}else if("tool_call"===r||"tool_call_update"===r)try{let e=JSON.parse(o),s=e.rawOutput,n=null===s||"object"!=typeof s||Array.isArray(s)?void 0:s,a=null==n?void 0:n._meta,i=null===a||"object"!=typeof a||Array.isArray(a)?void 0:a.ui,l=null===i||"object"!=typeof i||Array.isArray(i)?void 0:i.resourceUri,c=null==n?void 0:n["ui/resourceUri"],d="string"==typeof l?l:"string"==typeof c?c:void 0;null==(f=t.onToolCall)||f.call(t,{kind:r,...e.toolCallId?{toolCallId:e.toolCallId}:{},...e.title?{title:e.title}:{},...e.kind?{toolKind:e.kind}:{},...e.status?{status:e.status}:{},...e.contentText?{contentText:e.contentText}:{},...void 0!==s?{rawOutput:s}:{},...void 0!==d?{resourceUri:d}:{}})}catch(e){}else if("usage"===r)try{let e=JSON.parse(o);"number"==typeof e.turnDurationMs&&"number"==typeof e.toolCallCount&&"number"==typeof e.textBytes&&(null==(m=t.onUsage)||m.call(t,{turnDurationMs:e.turnDurationMs,toolCallCount:e.toolCallCount,textBytes:e.textBytes}))}catch(e){}else if("error"===r)try{u=null!=(y=JSON.parse(o).error)?y:"unknown",null==(g=t.onError)||g.call(t,{error:u})}catch(e){u="parse-error"}n=i.indexOf("\n\n")}}if(u)throw Error(u);return{sessionId:d,text:l,stopReason:c}}async cancelAgentCliSession(e){return this.fetchJson("/v1/agent-cli/cancel",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({sessionId:e})})}async closeAgentCliSession(e){let t=encodeURIComponent(e);return this.fetchJson("/v1/agent-cli/sessions/".concat(t),{method:"DELETE"})}async listShowroomLayouts(){return this.fetchJson("/v1/showroom/layouts")}async getShowroomLayout(e){let t=encodeURIComponent(e);return this.fetchJson("/v1/showroom/layouts/".concat(t))}async saveShowroomLayout(e,t){let s=encodeURIComponent(e);return this.fetchJson("/v1/showroom/layouts/".concat(s),{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(t)})}async deleteShowroomLayout(e){let t=encodeURIComponent(e);return this.fetchJson("/v1/showroom/layouts/".concat(t),{method:"DELETE"})}async fetchUrlContext(e){return this.fetchJson("/v1/context/fetch-url",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({url:e})})}async listLlmModels(){let e=await fetch(this.url("/v1/llm/models"),{method:"GET",headers:{...this.authHeaders()}});return(401===e.status&&(0,n.Qb)("/v1/llm/models"),e.ok)?await e.json():{models:[],error:"http-".concat(e.status)}}async getLlmHosts(){return this.fetchJson("/v1/llm/hosts")}async setLlmHosts(e){return this.fetchJson("/v1/llm/hosts",{method:"PUT",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}async clearLlmHosts(){return this.fetchJson("/v1/llm/hosts",{method:"DELETE"})}async transcribeAudio(e,t){let s=new FormData;s.append("file",e,e.name),t&&s.append("language",t);let r=await fetch(this.url("/v1/audio/stt"),{method:"POST",headers:{...this.authHeaders()},body:s});if(401===r.status&&(0,n.Qb)("/v1/audio/stt"),!r.ok){let e="";try{e=await r.text()}catch(e){}throw Error("audio-stt http ".concat(r.status,": ").concat(e.slice(0,200)))}return await r.json()}async judgeRole(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s={prompt:e};t.backend&&(s.backend=t.backend),t.model&&(s.model=t.model);let r=await fetch(this.url("/v1/showroom/role-judge"),{method:"POST",headers:{"content-type":"application/json",...this.authHeaders()},body:JSON.stringify(s)});if(401===r.status&&(0,n.Qb)("/v1/showroom/role-judge"),!r.ok)throw Error("role-judge http ".concat(r.status));return await r.json()}showroomLayoutsEventsUrl(){return this.cfg.baseUrl?this.url("/v1/showroom/layouts/events"):null}personasEventsUrl(){return this.cfg.baseUrl?this.url("/v1/personas/events"):null}sessionStoreEventsUrl(){return this.cfg.baseUrl?"".concat(this.url("/v1/events"),"?topics=session."):null}async listLogs(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=new URLSearchParams(e).toString();return this.fetchJson("/v1/logs".concat(t?"?".concat(t):""))}async listProgressFrames(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:200;return this.listLogs({event:"headless.progress-frame",limit:String(e)})}logsStreamUrl(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!this.cfg.baseUrl)return null;let t=new URLSearchParams(e).toString();return"".concat(this.url("/v1/logs/stream")).concat(t?"?".concat(t):"")}async listPersonas(){return this.fetchJson("/v1/personas")}async getRegistryCatalog(){return this.fetchJson("/v1/registry/catalog")}url(e){let t=this.cfg.baseUrl.replace(/\/$/,"");return"".concat(t).concat(e)}authHeaders(){return this.cfg.token?{authorization:"Bearer ".concat(this.cfg.token)}:{}}constructor(e){this.cfg=e,this.acpConnections=new Map,this.inflightTerminals=new Map}}class c{get ready(){return this.readyPromise}sendRaw(e,t){if("FAILED"===this.stateValue||"CLOSED"===this.stateValue||this.ws.readyState!==WebSocket.OPEN){var s;return Promise.reject(null!=(s=this.stateError)?s:Error("socket is ".concat(this.stateValue)))}let n=this.nextId++,r={jsonrpc:"2.0",id:n,method:e,params:t};return(0,a.cY)("webterm.acp.send",{method:e,id:n}),new Promise((e,t)=>{this.pending.set(n,{resolve:e,reject:t});try{this.ws.send(JSON.stringify(r)+"\n")}catch(e){this.pending.delete(n),t(e),this.closeIfUnused()}})}get readyState(){return this.ws.readyState}get state(){return this.stateValue}get isTerminal(){return"FAILED"===this.stateValue||"CLOSED"===this.stateValue}acquire(e){return this.leases+=1,new d(this,e)}subscribeSession(e){return this.sessionHandlers.add(e),()=>this.sessionHandlers.delete(e)}release(){if(this.leases=Math.max(0,this.leases-1),0===this.leases){if(this.pending.size>0)return void(0,a.cY)("webterm.acp.release-deferred",{pending:this.pending.size});this.closeIfUnused()}}closeIfUnused(){0!==this.leases||0!==this.pending.size||this.isTerminal||this.dispose(Error("ACP transport released"))}dispose(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:Error("ACP transport disposed");"CLOSED"!==this.stateValue&&this.transition("CLOSED",e),this.rejectPending(e),this.notifyTerminal(),this.ws.readyState!==WebSocket.CLOSED&&this.ws.readyState!==WebSocket.CLOSING&&this.ws.close()}onState(e){return this.stateHandlers.add(e),this.notifyStateHandler(e,this.stateValue,this.stateError),()=>this.stateHandlers.delete(e)}transition(e,t){(this.stateValue!==e||this.stateError!==t)&&(this.stateValue=e,t&&(this.stateError=t),this.stateHandlers.forEach(s=>this.notifyStateHandler(s,e,t)),(0,a.cY)("webterm.acp.state",{state:e,reason:null==t?void 0:t.message}))}notifyStateHandler(e,t,s){try{e(t,s)}catch(e){(0,a.cY)("webterm.acp.state-handler.error",{state:t,reason:String(e)})}}rejectPending(e){this.pending.forEach(t=>t.reject(e)),this.pending.clear()}notifyTerminal(){var e;this.terminalNotified||(this.terminalNotified=!0,null==(e=this.onTerminal)||e.call(this))}terminate(e,t){this.isTerminal||this.transition(t,e),this.rejectPending(e),this.notifyTerminal()}fail(e){this.terminate(e,"FAILED"),(this.ws.readyState===WebSocket.CONNECTING||this.ws.readyState===WebSocket.OPEN)&&this.ws.close()}async send(e,t){return await this.readyPromise.catch(()=>void 0),this.sendRaw(e,t)}on(e,t){let s=this.kindHandlers.get(e);return s||(s=new Set,this.kindHandlers.set(e,s)),s.add(t),()=>s.delete(t)}onAny(e){return this.anyHandlers.add(e),()=>this.anyHandlers.delete(e)}onRequest(e,t){let s=Symbol(e),n=this.requestHandlers.get(e);return n||(n=new Map,this.requestHandlers.set(e,n)),n.set(s,t),()=>{let t=this.requestHandlers.get(e);t&&(t.delete(s),0===t.size&&this.requestHandlers.delete(e))}}close(){this.release()}async handleInboundRequest(e,t,s,n){(0,a.cY)("webterm.acp.request.in",{method:t,id:e});try{let r=await n(s);this.sendResponse({jsonrpc:"2.0",id:e,result:r},t)}catch(n){let s=n instanceof Error?n.message:String(n);this.sendResponse({jsonrpc:"2.0",id:e,error:{code:-32603,message:"internal error: ".concat(s)}},t)}}sendErrorResponse(e,t,s){this.sendResponse({jsonrpc:"2.0",id:e,error:{code:t,message:s}},"error-response")}sendResponse(e,t){if("OPEN"!==this.stateValue||this.ws.readyState!==WebSocket.OPEN)return void(0,a.cY)("webterm.acp.request.response.drop",{method:t,id:e.id,state:this.stateValue});try{this.ws.send(JSON.stringify(e)+"\n")}catch(s){(0,a.cY)("webterm.acp.request.response.fail",{method:t,id:e.id,reason:String(s)})}}async waitOpen(){if(this.ws.readyState!==WebSocket.OPEN){if(this.ws.readyState===WebSocket.CLOSED||this.ws.readyState===WebSocket.CLOSING)throw Error("socket already closed");await new Promise((e,t)=>{let s=()=>{a(),this.transition("OPEN"),e()},n=()=>{a(),t(Error("socket open failed"))},r=()=>{a(),t(Error("socket closed before open"))},a=()=>{this.ws.removeEventListener("open",s),this.ws.removeEventListener("error",n),this.ws.removeEventListener("close",r)};this.ws.addEventListener("open",s),this.ws.addEventListener("error",n),this.ws.addEventListener("close",r)})}}onMessage(e){var t;let s,n,r=e.data;if("string"==typeof r)s=r;else if(r instanceof ArrayBuffer)s=new TextDecoder().decode(new Uint8Array(r));else{if("undefined"!=typeof Blob&&r instanceof Blob)return void r.text().then(t=>this.onMessage({...e,data:t}));s=""}try{n=JSON.parse(s)}catch(e){(0,a.cY)("webterm.acp.parse-error",{err:String(e),len:s.length});return}if(!n.kind&&n.method&&"session/update"===n.method&&(n.kind="sessionUpdate"),(0,a.cY)("webterm.acp.frame.in",{method:null!=(t=n.method)?t:"(notif)",kind:n.kind,id:n.id}),void 0!==n.id&&this.pending.has(n.id)){let e=this.pending.get(n.id);this.pending.delete(n.id),n.error?e.reject(Error(n.error.message)):e.resolve(n.result),queueMicrotask(()=>this.closeIfUnused())}else if(void 0!==n.id&&n.method&&this.requestHandlers.has(n.method)){let e=[...this.requestHandlers.get(n.method).values()].at(-1);e&&this.handleInboundRequest(n.id,n.method,n.params,e)}else void 0!==n.id&&n.method&&this.sendErrorResponse(n.id,-32601,"method not found: ".concat(n.method));if(n.kind){let e=this.kindHandlers.get(n.kind);null==e||e.forEach(e=>e(n))}this.anyHandlers.forEach(e=>e(n))}constructor(e,t,s,n){this.nextId=1,this.pending=new Map,this.kindHandlers=new Map,this.anyHandlers=new Set,this.requestHandlers=new Map,this.sessionHandlers=new Set,this.stateHandlers=new Set,this.leases=0,this.stateValue="CONNECTING",this.handshakeComplete=!1,this.terminalNotified=!1;let r=s?"".concat(e,"?session=").concat(encodeURIComponent(s)):e;(0,a.cY)("webterm.acp.connect",{url:r,hasToken:!!t,sessionId:s}),this.ws=t?new WebSocket(r,["bearer.".concat(t)]):new WebSocket(r),this.onTerminal=n,this.ws.binaryType="arraybuffer",this.ws.addEventListener("message",e=>this.onMessage(e)),this.ws.addEventListener("error",()=>{let e=Error(function(e,t){let s="unknown-host";try{s=new URL(t).host}catch(e){}return 0===e?"socket error before open — daemon unreachable or refused (".concat(s,")"):"socket error while open — connection dropped (".concat(s,")")}(this.ws.readyState,r));this.fail(e),(this.ws.readyState===WebSocket.CONNECTING||this.ws.readyState===WebSocket.OPEN)&&this.ws.close(),(0,a.cY)("webterm.acp.error",{reason:e.message})}),this.ws.addEventListener("close",e=>{var t;let s=e.reason?": ".concat(e.reason):"",n=null!=(t=this.stateError)?t:Error("socket closed: ".concat(e.code).concat(s));this.terminate(n,this.handshakeComplete?"CLOSED":"FAILED"),(0,a.cY)("webterm.acp.close",{code:e.code,reason:e.reason,handshakeComplete:this.handshakeComplete})}),this.readyPromise=(async()=>{await this.waitOpen();let e=await this.sendRaw("initialize",{protocolVersion:1,clientCapabilities:{fs:{readTextFile:!1,writeTextFile:!1},terminal:!1,_meta:{elanous:{ui:{showModal:!0,showToast:!0,updateStatusPill:!0,usage:!1},term:{terminalOutput:!0,terminalExit:!0,terminalFrame:!0},ask:{askUserQuestion:!0}}}}});(0,a.cY)("webterm.acp.initialize.done",{res:e});let t="";if(s)try{await this.sendRaw("session/load",{sessionId:s,cwd:"/",mcpServers:[]}),t=s,(0,a.cY)("webterm.acp.session-load.done",{sessionId:t})}catch(e){(0,a.cY)("webterm.acp.session-load.miss",{sessionId:s,reason:String(e)})}if(!t){var n;let e=await this.sendRaw("session/new",{cwd:"/",mcpServers:[]});t=null!=(n=null==e?void 0:e.sessionId)?n:"",(0,a.cY)("webterm.acp.session-new.done",{sessionId:t})}return t&&this.sessionHandlers.forEach(e=>{try{e(t)}catch(e){}}),this.handshakeComplete=!0,t})().catch(e=>{let t=e instanceof Error?e:Error(String(e));return this.fail(t),(0,a.cY)("webterm.acp.handshake-failed",{reason:t.message}),""})}}class d{track(e){return this.closed?(e(),()=>{}):(this.disposers.add(e),()=>{this.disposers.delete(e),e()})}get ready(){return this.core.ready}get readyState(){return this.core.readyState}get state(){return this.core.state}send(e,t){return this.closed?Promise.reject(Error("ACP lease released")):this.core.send(e,t)}on(e,t){return this.closed?()=>{}:this.track(this.core.on(e,t))}onAny(e){return this.closed?()=>{}:this.track(this.core.onAny(e))}onRequest(e,t){return this.closed?()=>{}:this.track(this.core.onRequest(e,t))}onState(e){return this.closed?()=>{}:this.track(this.core.onState(e))}close(){this.closed||(this.closed=!0,this.disposers.forEach(e=>e()),this.disposers.clear(),this.core.release())}constructor(e,t){this.core=e,this.closed=!1,this.disposers=new Set,t&&this.disposers.add(e.subscribeSession(t))}}function u(e){if(!e||"object"!=typeof e||Array.isArray(e))return null;let t=e.result,s=null===t||"object"!=typeof t||Array.isArray(t)?void 0:t,n=null==s?void 0:s._meta,r=null===n||"object"!=typeof n||Array.isArray(n)?void 0:n.ui,a=null===r||"object"!=typeof r||Array.isArray(r)?void 0:r.resourceUri,o=null==s?void 0:s["ui/resourceUri"],i="string"==typeof a?a:"string"==typeof o?o:void 0;return{id:e.id,name:e.name,ok:e.ok,...void 0!==e.summary?{summary:e.summary}:{},...void 0!==t?{rawOutput:t}:{},...void 0!==i?{resourceUri:i}:{},...void 0!==e.resultOmittedReason?{resultOmittedReason:e.resultOmittedReason}:{}}}function h(e){let t="message",s="";for(let n of e.split("\n"))if(n.startsWith("event:"))t=n.slice(6).trim();else if(n.startsWith("data:")){let e=n.slice(5);s+=e.startsWith(" ")?e.slice(1):e}if(!s)return null;try{return{event:t,data:JSON.parse(s)}}catch(e){return null}}async function p(e,t){let s=e.getReader(),n=new TextDecoder,r="",i=null,l=null;for(;;){let e,{value:w,done:b}=await s.read();if(b)break;for(r+=n.decode(w,{stream:!0});(e=r.indexOf("\n\n"))>=0;){var c,d,p,f,m,g,y,v;let s=r.slice(0,e);r=r.slice(e+2);let n=h(s);if(n)if("turn-begin"===n.event)null==(c=t.onTurnBegin)||c.call(t,n.data);else if("text-delta"===n.event)null==(d=t.onTextDelta)||d.call(t,n.data);else if("image-block"===n.event)null==(p=t.onImageBlock)||p.call(t,n.data);else if("tool-call"===n.event)null==(f=t.onToolCall)||f.call(t,n.data);else if("tool-result"===n.event){let e=u(n.data);e&&(null==(m=t.onToolResult)||m.call(t,e))}else"feedback"===n.event?(0,o.L)(n.data)?null==(g=t.onFeedback)||g.call(t,n.data):(0,a.cY)("webterm.sse.feedback.drop",{reason:"schema-mismatch"}):"turn-end"===n.event?(i=n.data,null==(y=t.onTurnEnd)||y.call(t,i)):"error"===n.event&&(l=n.data,null==(v=t.onError)||v.call(t,l))}}if(l){let e=l.message?": ".concat(l.message):"";throw Error("".concat(l.error).concat(e))}if(!i)throw Error("prompt/stream closed without turn-end");return i}async function f(e,t){let s=e.getReader(),n=new TextDecoder,r="";for(;;){let{value:e,done:y}=await s.read();if(y)break;let v=(r+=n.decode(e,{stream:!0})).indexOf("\n\n");for(;v>=0;){var i,l,c,d,p,f,m,g;let e=r.slice(0,v);r=r.slice(v+2);let s=h(e);if(v=r.indexOf("\n\n"),s&&"subscribed"!==s.event)if("turn-begin"===s.event)null==(i=t.onTurnBegin)||i.call(t,s.data);else if("text-delta"===s.event)null==(l=t.onTextDelta)||l.call(t,s.data);else if("image-block"===s.event)null==(c=t.onImageBlock)||c.call(t,s.data);else if("tool-call"===s.event)null==(d=t.onToolCall)||d.call(t,s.data);else if("tool-result"===s.event){let e=u(s.data);e&&(null==(p=t.onToolResult)||p.call(t,e))}else"feedback"===s.event?(0,o.L)(s.data)?null==(f=t.onFeedback)||f.call(t,s.data):(0,a.cY)("webterm.sse.feedback.observer-drop",{reason:"schema-mismatch"}):"turn-end"===s.event?null==(m=t.onTurnEnd)||m.call(t,s.data):"error"===s.event&&(null==(g=t.onError)||g.call(t,s.data))}}}let m={idle:null,working:"running",awaiting:"queued",done:"done",err:"error"};async function g(e,t,s){let n=e.getReader(),r=new TextDecoder,i="",l=new Map,c=e=>{var t;let s=(null!=(t=l.get(e))?t:0)+1;return l.set(e,s),s};for(;;){let{value:e,done:l}=await n.read();if(l)break;let d=(i+=r.decode(e,{stream:!0})).indexOf("\n\n");for(;d>=0;){let e=i.slice(0,d);d=(i=i.slice(d+2)).indexOf("\n\n");let n=h(e);if(!n||"agent.status"!==n.event)continue;let r=n.data;if(!r||"object"!=typeof r)continue;let l=r.detail;if(!l||"string"!=typeof l.agentId||"string"!=typeof l.status)continue;let u=m[l.status];if(null==u)continue;let p="".concat(t,":agent-status:").concat(l.agentId),f={envelopeVersion:1,sessionId:t,blockId:p,kind:"agent.status",phase:"update",emittedAt:"number"==typeof l.updatedAt?l.updatedAt:r.ts,seq:c(p),payload:{agentId:l.agentId,status:u,..."string"==typeof l.lastEvent?{lastEvent:l.lastEvent}:{}},asciiFallback:["".concat(l.agentId," ").concat(u).concat(l.lastEvent?" \xb7 "+l.lastEvent:"")]};if(!(0,o.L)(f)){(0,a.cY)("webterm.agent-status.synthesize.drop",{agentId:l.agentId,status:l.status});continue}s.onFeedback(f)}}}async function y(e,t,s){let n=e.getReader(),r=new TextDecoder,i="",l=new Map,c=e=>{var t;let s=(null!=(t=l.get(e))?t:0)+1;return l.set(e,s),s};for(;;){let{value:e,done:l}=await n.read();if(l)break;let u=(i+=r.decode(e,{stream:!0})).indexOf("\n\n");for(;u>=0;){var d;let e=i.slice(0,u);u=(i=i.slice(u+2)).indexOf("\n\n");let n=h(e);if(!n||"hud.segment"!==n.event)continue;let r=n.data;if(!r||"object"!=typeof r)continue;let l=r.detail;if(!l||"string"!=typeof l.key||!l.key)continue;let p="end"===l.phase?"end":"update",f="".concat(t,":hud:").concat(l.key),m={key:l.key};if("update"===p){if("string"!=typeof l.value){(0,a.cY)("webterm.hud-segment.synthesize.drop",{key:l.key,reason:"missing-value"});continue}m.value=l.value,"number"==typeof l.priority&&(m.priority=l.priority),"string"==typeof l.tone&&(m.tone=l.tone),"string"==typeof l.glyph&&(m.glyph=l.glyph)}else m.value="";let g={envelopeVersion:1,sessionId:t,blockId:f,kind:"hud.segment",phase:p,emittedAt:r.ts,seq:c(f),payload:m,asciiFallback:"update"===p&&"string"==typeof l.value?["".concat(null!=(d=l.glyph)?d:"").concat(l.glyph?" ":"").concat(l.value)]:[]};if(!(0,o.L)(g)){(0,a.cY)("webterm.hud-segment.synthesize.drop",{key:l.key,reason:"wire-guard"});continue}s.onFeedback(g)}}}},49536:(e,t,s)=>{function n(e){if("undefined"==typeof localStorage)return{migrated:!1,currentValue:null};let t=localStorage.getItem(e.currentKey);if(t&&t.length>0)return{migrated:!1,currentValue:t};let s=localStorage.getItem(e.legacyKey);if(!s||0===s.length)return{migrated:!1,currentValue:t};let n=s;if(e.transformValue)try{n=e.transformValue(s)}catch(e){n=null}if(!n||0===n.length)return{migrated:!1,currentValue:t};try{localStorage.setItem(e.currentKey,n),localStorage.removeItem(e.legacyKey)}catch(e){return{migrated:!1,currentValue:t}}return{migrated:!0,currentValue:n}}s.d(t,{yS:()=>d,uh:()=>u,Ip:()=>o,Fp:()=>l,Qc:()=>c});let r={baseUrl:"elanous.nexus.baseUrl",token:"elanous.daemon.token",provider:"elanous.daemon.provider"},a={daemonBaseUrl:"elanous.daemon.baseUrl",voiceWsUrl:"elanous.voice.wsUrl",voiceToken:"elanous.voice.token"};function o(){let e="https:"===window.location.protocol?"https:":"http:";return"".concat(e,"//").concat(window.location.host)}function i(e,t){if(!e)return"";let s=new URL(t,e);return s.protocol="https:"===s.protocol?"wss:":"ws:",s.toString()}function l(){var e,t;n({legacyKey:a.daemonBaseUrl,currentKey:r.baseUrl}),n({legacyKey:a.voiceWsUrl,currentKey:r.baseUrl,transformValue:e=>{try{let t=new URL(e);return t.protocol="wss:"===t.protocol?"https:":"http:",t.pathname="/",t.toString().replace(/\/$/,"")}catch(e){return null}}});let s=localStorage.getItem(a.voiceToken);s&&!localStorage.getItem(r.token)&&localStorage.setItem(r.token,s);let i=localStorage.getItem(r.baseUrl);return{baseUrl:i&&i.length>0?i:o(),token:null!=(e=localStorage.getItem(r.token))?e:"",provider:null!=(t=localStorage.getItem(r.provider))?t:""}}function c(e){void 0!==e.baseUrl&&localStorage.setItem(r.baseUrl,e.baseUrl),void 0!==e.token&&localStorage.setItem(r.token,e.token),void 0!==e.provider&&localStorage.setItem(r.provider,e.provider)}function d(e){return i(e.baseUrl,"/v1/acp")}function u(e){return i(e.baseUrl,"/v1/voice/ws")}},51215:(e,t,s)=>{let n;s.d(t,{cY:()=>d,x8:()=>i});let r={debug:0,info:1,warn:2,error:3},a="/v1/debug-logs/batch",o=null;function i(e){o=e}class l{health(){return{pending:this.queue.length,consecutiveFailures:this.consecutiveFailures,lastOkAt:this.lastOkAt,droppedByCap:this.droppedByCap,fallbackBatches:this.fallbackBatches}}push(e){if(!(r[function(e){let t=e.slice(e.lastIndexOf(".")+1).toLowerCase();return/^(error|exception|crash|fail|failed)$/.test(t)?"error":/^(warn|degraded|timeout)$/.test(t)?"warn":/^(boot|ready|start|begin|open|ok|done|resolve|end|stop|close)$/.test(t)?"info":"debug"}(e.category)]<r[this.minLevel])){if(this.queue.push(e),this.queue.length>500){let e=this.queue.length-500;this.droppedByCap+=e,this.queue.splice(0,e)}if(this.queue.length>=100&&!this.inFlight){null!==this.timer&&(clearTimeout(this.timer),this.timer=null),this.flush();return}null===this.timer&&(this.timer=setTimeout(()=>{this.flush()},this.flushMs))}}async flush(){if(this.timer&&(clearTimeout(this.timer),this.timer=null),this.inFlight||0===this.queue.length)return;let e=this.queue.slice(0,100);this.inFlight=!0;let t=!1,s=JSON.stringify({records:e});try{var n,r;t=await (n=this.fetchFn(s),r=this.postTimeoutMs,new Promise((e,t)=>{let s=setTimeout(()=>t(Error("debug-forward timeout after ".concat(r,"ms"))),r);n.then(t=>{clearTimeout(s),e(t)},e=>{clearTimeout(s),t(e)})}))}catch(e){t=!1}finally{this.inFlight=!1}if(!t){if(this.consecutiveFailures+=1,this.consecutiveFailures>=2&&o)try{await o(JSON.stringify({records:[...e,this.blockedNotice()]}))&&(this.fallbackBatches+=1)}catch(e){}this.wasFailing=!0,this.scheduleRetry();return}let a=this.lastOkAt;this.lastOkAt=Date.now();let i=this.consecutiveFailures;this.consecutiveFailures=0,this.queue.splice(0,e.length),this.wasFailing&&(this.wasFailing=!1,this.queue.push({ts:new Date().toISOString(),category:"pwa.debug-forwarder.recovered",event:"recovered",data:{consecutiveFailures:i,droppedByCap:this.droppedByCap,fallbackBatches:this.fallbackBatches,pending:this.queue.length,previousOkAt:a},source:{platform:"pwa"}})),this.queue.length>0&&null===this.timer&&(this.timer=setTimeout(()=>{this.flush()},this.flushMs))}scheduleRetry(){if(null!==this.timer||0===this.queue.length)return;let e=Math.min(this.flushMs*2**this.consecutiveFailures,3e4);this.timer=setTimeout(()=>{this.flush()},e)}blockedNotice(){return{ts:new Date().toISOString(),category:"pwa.debug-forwarder.http-blocked",event:"http-blocked",data:{consecutiveFailures:this.consecutiveFailures,pending:this.queue.length,droppedByCap:this.droppedByCap,lastOkAt:this.lastOkAt,via:"acp-fallback"},source:{platform:"pwa"}}}beaconFlush(){if(0!==this.queue.length)try{if("undefined"!=typeof navigator&&"function"==typeof navigator.sendBeacon){let e=this.queue.slice(0,100),t=new Blob([JSON.stringify({records:e})],{type:"application/json"});navigator.sendBeacon(a,t)&&this.queue.splice(0,e.length)}}catch(e){}}get pending(){return this.queue.length}constructor(e=c,t="debug",s=1e4,n=100){this.fetchFn=e,this.minLevel=t,this.postTimeoutMs=s,this.flushMs=n,this.queue=[],this.timer=null,this.inFlight=!1,this.consecutiveFailures=0,this.lastOkAt=null,this.droppedByCap=0,this.fallbackBatches=0,this.wasFailing=!1}}async function c(e){return(await fetch(a,{method:"POST",headers:{"content-type":"application/json"},body:e,keepalive:!0,..."undefined"!=typeof AbortSignal&&"function"==typeof AbortSignal.timeout?{signal:AbortSignal.timeout(1e4)}:{}})).ok}function d(e,t){if("undefined"==typeof console)return;let s=new Date().toISOString();if(void 0!==t){let n="";try{let e=new WeakSet;n=JSON.stringify(t,(t,s)=>{if("bigint"==typeof s)return"".concat(s.toString(),"n");if("function"==typeof s)return"[fn ".concat(s.name||"anon","]");if(s&&"object"==typeof s){if(e.has(s))return"[circular]";e.add(s)}return s})}catch(e){n="[unserializable: ".concat(String(e),"]")}n&&n.length>800&&(n=n.slice(0,797)+"..."),console.debug("[".concat(s,"] ").concat(e," ").concat(n),t),u(s,e,n)}else console.debug("[".concat(s,"] ").concat(e)),u(s,e,void 0)}function u(e,t,s){let r,a=function(){if(void 0!==n)return n;let e=function(){try{let e="off"!==window.localStorage.getItem("elanous.pwa.debug.forward"),t=window.localStorage.getItem("elanous.pwa.debug.forwardLevel");return{forward:e,level:"info"===t||"warn"===t||"error"===t?t:"debug"}}catch(e){return{forward:!0,level:"debug"}}}();if(!e.forward)return n=null,null;let t=new l(c,e.level,1e4,1500);try{window.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&t.beaconFlush()})}catch(e){}return n=t,t}();if(!a)return;let o=t.slice(t.lastIndexOf(".")+1)||t;if(void 0!==s&&""!==s)try{r=JSON.parse(s)}catch(e){r=s}a.push({ts:e,category:t,event:o,...void 0!==r?{data:r}:{},source:{platform:"pwa"}})}},84606:(e,t,s)=>{s.d(t,{L:()=>a});let n=new Set(["tool.progress","tool.diff","tool.search-hit","agent.status","agent.thinking","agent.plan","debug.line","perf.tick","hud.segment","mission.update","agent.chat-stream","media.image","media.video","media.job"]),r=new Set(["start","delta","update","end"]);function a(e){return null!==e&&"object"==typeof e&&1===e.envelopeVersion&&"string"==typeof e.sessionId&&!!e.sessionId&&"string"==typeof e.blockId&&!!e.blockId&&"string"==typeof e.kind&&!!n.has(e.kind)&&"string"==typeof e.phase&&!!r.has(e.phase)&&"number"==typeof e.emittedAt&&"number"==typeof e.seq&&!(e.seq<0)&&!!Array.isArray(e.asciiFallback)&&void 0!==e.payload&&null!==e.payload&&(void 0===e.parentToolCallId||"string"==typeof e.parentToolCallId)&&!0}},91644:(e,t,s)=>{s.d(t,{Qb:()=>o,SI:()=>l,dJ:()=>i});let n="elanous:auth-required",r=null,a=!1;function o(e){null===r&&(r=e,window.dispatchEvent(new CustomEvent(n,{detail:{path:e}})))}function i(e){let t=window,s=t=>e(t.detail);return t.addEventListener(n,s),null===r||a||e({path:r}),()=>t.removeEventListener(n,s)}function l(){a=!0}}}]);
|