elanous 0.2.31 → 0.2.32
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/chunks/{1834-50625904996a8fa8.js → 1834-98b64172bc1efe77.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/69-0a2c8209c6d4a158.js +1 -0
- package/apps/pwa/out/_next/static/chunks/8097-9530c03bcc550f02.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-504204b58c82c253.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/{page-3535a4a69f1fafaa.js → page-a9717a67c2eecbaf.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-5c9ec30aee62dfbf.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-584191533721fa16.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/page-73c4b4bb3ac7ab5f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ceo/{page-5a503541353e60a8.js → page-c0f1ca371f710b06.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/{page-6025101384e361a5.js → page-46430d45a9e04eac.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-3b2ebf1dc64ff0be.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/{page-a645f00a06483e9a.js → page-a27b1e5a0d1b308f.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-25654b82094f7d22.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/{page-e9bab7413b028b28.js → page-8ea49a4c6dd2c6e7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-ce5113aefea0a8d1.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/exec/{page-e547e6ce55f1fb33.js → page-0e5a41fac1c75396.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/field/{page-d27e1b9850fd54bf.js → page-31aaf1ed37c6df9a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-3dcc1fa411e1f4e0.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/intake/{page-0fec29c7ba01894b.js → page-c69247e7134d329d.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/{layout-339a07410cd6f36b.js → layout-66dc5cd3a0999abe.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-26ff7ff651a7217d.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-617b3976981efa96.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/loops/{page-2fd93ed8c9f16580.js → page-d256f5d5d9552823.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/market/{page-9b564dbff0fefc35.js → page-ce8f1907b8a6101c.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-33e182a316263116.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-814ba51385225776.js → page-32866485913d6a04.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/{not-found-397d479626e5a459.js → not-found-7607cca9b84950c6.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/{page-af1bba4e3251b728.js → page-eeab86176b03dc3b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/{page-3ad3be5e7d3fdce9.js → page-5b93dbae3432b996.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-77a6cb90a9cf2b10.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/{page-4da93ad35d4a8d28.js → page-f47e768b5b242b5a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-eb41aa3367fc2505.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-4d13ab0b8a267e3f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-84dad32ff0fc0831.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/scheduler/{page-3a658d5fa6d16a25.js → page-95306f892aa2d0ee.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/{page-0157de6e85f8bb6b.js → page-940fb6c217f6b470.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-0a07363b130182a1.js → page-8c66a3b24a745630.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/{page-841d73d4ac44ed49.js → page-7b675dfd35c36fc9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/{page-6f43a3d1146e6377.js → page-8bd0d3cf7665bcfc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/{page-521ee23ac8c0abfa.js → page-c219f2ed171131be.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/share/{page-a9992ee285efaa83.js → page-40f8fa21bdae955b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/{page-3d48e85fa89ec04f.js → page-468f8313e4f1fbd9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-7bbb8fa353a246c4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/term/page-04d00ae9b0890349.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/{page-233c71cd5f68f0d7.js → page-4214b855d9233ea8.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/{page-70151d78de2f375e.js → page-936752c7aa58762e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/{page-dcac33a3e2cb72c0.js → page-ec052ad359df1797.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-8305570551091338.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/{page-0448145ccd5c45c1.js → page-fad650e4793adb65.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-d90e64743826e1d8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-a16bcfd49af86a32.js +1 -0
- package/apps/pwa/out/_next/static/css/b5d88eba78a3d7bf.css +1 -0
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +14 -14
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +14 -14
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +14 -14
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +14 -14
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +14 -14
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +14 -14
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +14 -14
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +14 -14
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +14 -14
- package/apps/pwa/out/decisions/index.html +1 -1
- package/apps/pwa/out/decisions/index.txt +14 -14
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +14 -14
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +14 -14
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +14 -14
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +14 -14
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +14 -14
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +14 -14
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +14 -14
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +17 -14
- package/apps/pwa/out/live-run/index.html +1 -1
- package/apps/pwa/out/live-run/index.txt +14 -14
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +14 -14
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +14 -14
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +14 -14
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +14 -14
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +14 -14
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +14 -14
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +14 -14
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +14 -14
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +14 -14
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +15 -15
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +14 -14
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +14 -14
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +14 -14
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +14 -14
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +14 -14
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +14 -14
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +14 -14
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +14 -14
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +14 -14
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +14 -14
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +14 -14
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +14 -14
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +14 -14
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +14 -14
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +14 -14
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +14 -14
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +14 -14
- package/graphs/implement-loop.yaml +5 -0
- package/package.json +1 -1
- package/scripts/ci-typecheck-changed.ts +26 -1
- package/scripts/measure-si-task-cpu.ts +143 -0
- package/scripts/ratchets/test-interference-patterns.allowlist.txt +0 -2
- package/scripts/release-loop/prepare-node.ts +102 -4
- package/src/acp/core-turn-bridge.ts +16 -4
- package/src/acp/elanous-extensions.ts +3 -0
- package/src/acp/server.ts +3 -0
- package/src/acp/tool-trace.ts +186 -11
- package/src/agent/self-ambient-cache.ts +156 -0
- package/src/agent/self-ambient.ts +8 -1
- package/src/agent/task-notification.ts +5 -0
- package/src/agent-substrate/pr-reviewer.ts +3 -1
- package/src/ask-user-question/tool.ts +22 -0
- package/src/autopilot/build/llm-conflict-merge.ts +56 -10
- package/src/autopilot/pr-manager.ts +23 -5
- package/src/capture/frame-state-detect.ts +39 -0
- package/src/capture/tui-self-report.ts +134 -6
- package/src/chat/index.ts +61 -15
- package/src/chat/pickers/modal-runtime.ts +6 -0
- package/src/chat/pickers/modals.ts +8 -2
- package/src/cli/ask-bare.ts +1 -0
- package/src/cli/import-cli.ts +12 -0
- package/src/cli/log-event-names.ts +10 -0
- package/src/cli/msg-cli.ts +1 -0
- package/src/cli/pod-cli.ts +14 -3
- package/src/cli/pr-cli.ts +67 -32
- package/src/cli/pr-land-base-read.ts +34 -0
- package/src/cli/pr-land-heavy-remote.ts +81 -25
- package/src/cli/pr-land-overlap-evidence.ts +46 -2
- package/src/cli/pr-land-pod-shadow-job.ts +26 -3
- package/src/cli/pr-land-refusal.ts +20 -5
- package/src/cli/pty-takeover-cli.ts +88 -14
- package/src/cli/sim-cli.ts +18 -0
- package/src/context-bus/ops-events.ts +6 -2
- package/src/core-turn/run-core-turn.ts +1 -0
- package/src/core-turn/run-goal-loop.ts +21 -0
- package/src/core-turn/types.ts +3 -0
- package/src/dashboard/acp-active-model.ts +42 -1
- package/src/dashboard/background-jobs-status.ts +66 -0
- package/src/dashboard/index.ts +117 -44
- package/src/dashboard/input/agent-wake.ts +242 -0
- package/src/dashboard/input/chat-main-entry-runtime.ts +5 -0
- package/src/dashboard/input/external-input-host.ts +23 -9
- package/src/dashboard/input/mouse-wiring.ts +108 -11
- package/src/dashboard/log-click-runtime.ts +118 -2
- package/src/dashboard/turn-preamble.ts +116 -40
- package/src/dashboard/turn-session-layers.ts +4 -2
- package/src/dashboard/turn-start-segments.ts +222 -0
- package/src/display/prompt-row-owner.ts +146 -0
- package/src/display/resize-listener.ts +33 -2
- package/src/fold-stack.ts +4 -2
- package/src/git-fs/index.ts +263 -36
- package/src/harness/gate-reserve.ts +87 -0
- package/src/harness/harness-incidents.ts +13 -0
- package/src/harness/harness-queue.ts +15 -0
- package/src/index.ts +8 -6
- package/src/input/external-input-queue.ts +34 -9
- package/src/llm/route-decision.ts +36 -0
- package/src/llm/tool-loop-steered-rejection.ts +8 -0
- package/src/llm-request-shape.ts +209 -0
- package/src/llm.ts +166 -267
- package/src/loops/orchestrator/tick.ts +24 -2
- package/src/maturity/feature-maturity.ts +1 -1
- package/src/mss/logging/render-categories.ts +5 -0
- package/src/ops/overview.ts +59 -2
- package/src/pr-tool/census.ts +19 -4
- package/src/pr-tool/inflight-registry.ts +143 -0
- package/src/pty-shell/pty-manifest.ts +12 -3
- package/src/pty-shell/tui-run-state.ts +34 -3
- package/src/seat-loop/traffic-signal.ts +2 -1
- package/src/self-dev/ask-launch-flow.ts +13 -0
- package/src/self-dev/draft-residue.ts +243 -24
- package/src/self-dev/shard-plan.ts +11 -3
- package/src/self-dev/shard-run.ts +103 -10
- package/src/self-implement/elanous-tui-spawn.ts +14 -0
- package/src/self-implement/follow-up-placement.ts +79 -0
- package/src/self-implement/gate-artifacts.ts +15 -4
- package/src/self-implement/gate-baseline.ts +96 -5
- package/src/self-implement/gate-cli.ts +7 -2
- package/src/self-implement/gate-remote.ts +26 -1
- package/src/self-implement/host-regate.ts +36 -4
- package/src/self-implement/orchestrator.ts +101 -11
- package/src/self-implement/run-ledger.ts +16 -14
- package/src/session-runtime/index.ts +22 -267
- package/src/shell-runner/background-surface.ts +15 -5
- package/src/skills/tools/agent.ts +39 -6
- package/src/skills/tools/list-dir.ts +11 -0
- package/src/skills/tools/schedule-wakeup.ts +408 -0
- package/src/skills/tools/shell.ts +245 -3
- package/src/status/bar.ts +26 -0
- package/src/steward/digest-delivery.ts +118 -0
- package/src/steward/hold-hygiene.ts +120 -0
- package/src/steward/triage.ts +10 -0
- package/src/surface/shell-runner-boot.ts +5 -2
- package/src/task-agent/task-hand.ts +24 -0
- package/src/task-orchestrator/surfaces/pod-command-job.ts +65 -11
- package/src/task-orchestrator/surfaces/pod-lease.ts +98 -0
- package/src/task-orchestrator/surfaces/pod-ledger-events.ts +1 -1
- package/src/task-orchestrator/surfaces/pod-pool.ts +3 -1
- package/src/task-orchestrator/surfaces/pod-reuse-cleanup.ts +10 -6
- package/src/task-orchestrator/surfaces/pod-warm-worker-pod.ts +525 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runner.ts +90 -0
- package/src/task-orchestrator/surfaces/pod-warm-worker-runtime.ts +156 -2
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +7 -5
- package/src/tui/chat/execution-badge.ts +5 -1
- package/src/tui/input-lag-probe.ts +230 -0
- package/src/tui.ts +4 -0
- package/src/ux-sim/scenario.ts +255 -0
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/8097-92f87bd108322f66.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-bf3634a117322df7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-b9f51447f757fbf2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-2ebb8fd59b9461f9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/bots/page-a2fc4e49a4fa4ba8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-f4b630cc8b5273cd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/decisions/page-61ac22cbab1ee4ec.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/page-c992eafe028b642e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/page-805ac2e137b7a121.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live/page-349f2752d8cd37ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/live-run/page-d5c6dcf31c25cecc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-62f4475d3c38fb9b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/page-f219ccdbc0bf27df.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-456666766e5ce6fc.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-7404e377e8adb8c5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/reflection/page-14456240ed2a36ad.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/page-d2ced71132fac9b2.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-f08358bdf251adb9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/page-149dc1caba411bb9.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/page-9cb0c444903da65d.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/page-17e504c396e0e389.js +0 -1
- package/apps/pwa/out/_next/static/css/3f5fc6f96e2cf7b2.css +0 -1
- /package/apps/pwa/out/_next/static/{LSXfY0u9QtfDbejY0Ukf_ → IVKr3AlRUVLKsw2fh7eXF}/_buildManifest.js +0 -0
- /package/apps/pwa/out/_next/static/{LSXfY0u9QtfDbejY0Ukf_ → IVKr3AlRUVLKsw2fh7eXF}/_ssgManifest.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7081],{6416:(e,t,s)=>{"use strict";s.d(t,{Er:()=>r,cj:()=>c,dc:()=>l,yR:()=>i});let a=/^(oauth\.|harness\.decision|llm\.router)/;function r(e){let t=[],s=e=>{"string"==typeof e&&e.trim()&&!t.includes(e.trim())&&t.push(e.trim())};for(let t of e){var r;let e=null!=(r=t.data)?r:{};if(t.category.startsWith("oauth.")){for(let t of["from","to","name","account"])s(e[t]);if(Array.isArray(e.usage))for(let t of e.usage)s(null==t?void 0:t.name);continue}if(a.test(t.category))for(let t of(s(e.account),["what","why","reason"])){let a=e[t];if("string"==typeof a)for(let e of a.matchAll(/계정\s+([A-Za-z0-9][\w.-]*)/g))s(e[1])}}return t}function n(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function l(e){let t=new Map(e.map((e,t)=>[e,"account-".concat(t+1)])),s=e.length?RegExp("(^|[^\\w-])(".concat(e.map(n).sort((e,t)=>t.length-e.length).join("|"),")(?![\\w-])"),"g"):null,a=new Map;return(e,r)=>{let n=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();a.has(t)||a.set(t,"remote-".concat(a.size+1));let s=a.get(t);return e===e.toUpperCase()?s.toUpperCase():s})(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 r&&s&&(n=n.replace(s,(e,s,a)=>{var r;return"".concat(s).concat(null!=(r=t.get(a))?r:"account")})),n}}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 s={};for(let[a,r]of Object.entries(e))"apiEquivalentUsd"===a||"usd"===a||/credit(s|Balance)?$/i.test(a)||(s[a]=o(r,t));return s}return e}function i(e){let t=l(r(e));return e.map(e=>{let s=a.test(e.category);return{...e,event:t(e.event,!1),data:e.data?o(e.data,e=>t(e,s)):e.data}})}function c(e,t){let s=l(t);return o(e,e=>s(e,!0))}},28434:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>k});var a=s(65863),r=s(6416);function n(e){return e.map(e=>({...(0,r.cj)(e,[]),taskId:e.taskId,...e.wishReply?{wishReply:{surface:e.wishReply.surface,address:null}}:{}}))}var l=s(24815),o=s(45695);function i(e){var t;for(let t of[e.sections.triage,e.sections.intake]){let e=null==t?void 0:t.data.title;if("string"==typeof e&&e.trim())return e.trim()}return(null==(t=e.apiTitle)?void 0:t.trim())||e.taskId}var c=s(89279);let d={green:"순항",yellow:"진행 중",red:"막힘",done:"완료"},u=["intake","triage","gates","relations","memory","workspace","run","landing","release"];function m(e){return null==e?"—":"string"==typeof e?e:JSON.stringify(e)}function p(e){let{entry:t}=e;return(0,a.jsxs)("details",{className:"mt-2 text-xs",children:[(0,a.jsx)("summary",{className:"cursor-pointer text-muted-foreground",children:"JSON"}),(0,a.jsx)("pre",{className:"mt-2 max-h-64 overflow-auto rounded-lg bg-muted p-2 text-xs whitespace-pre-wrap break-all",children:JSON.stringify(t.data,null,2)})]})}function f(e){let{entry:t}=e,s=new Date(t.ts).toISOString();return(0,a.jsxs)("div",{className:"flex flex-wrap gap-x-3 gap-y-1 text-xs text-muted-foreground",children:[(0,a.jsxs)("span",{children:["Owner: ",t.owner]}),(0,a.jsx)("time",{dateTime:s,children:s})]})}function h(e){var t,s,r;let{card:n,placements:o,onClose:c,publicCapture:h=!1}=e,[x,g]=(0,l.useState)(""),[b,y]=(0,l.useState)(!1),[w,k]=(0,l.useState)(null),v=async e=>{if(e.preventDefault(),!(!c||!x.trim()||/[\r\n]/.test(x))&&!b){y(!0),k(null);try{await c(x.trim())}catch(e){k(e instanceof Error?e.message:String(e))}finally{y(!1)}}},j=null==(t=n.sections.gates)?void 0:t.data;return(0,a.jsxs)("section",{"aria-label":"Task card detail",className:"min-w-0 space-y-4 rounded-2xl border border-border bg-card p-4",children:[(0,a.jsxs)("header",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:i(n)}),(0,a.jsx)("p",{className:"break-all text-xs text-muted-foreground",children:n.taskId}),"closed"===n.status?(0,a.jsxs)("p",{role:"status",children:["닫힘 \xb7 ",null!=(s=n.closedReason)?s:"사유 없음"]}):!h&&c?(0,a.jsxs)("form",{onSubmit:v,className:"mt-3 flex flex-wrap items-end gap-2",children:[(0,a.jsxs)("label",{className:"text-sm",children:["닫기 사유 (한 줄)",(0,a.jsx)("input",{type:"text",required:!0,value:x,onChange:e=>g(e.target.value),className:"block rounded-md border border-border bg-background px-2 py-1"})]}),(0,a.jsx)("button",{type:"submit",disabled:b||!x.trim()||/[\r\n]/.test(x),className:"rounded-md border border-border px-3 py-1 text-sm",children:b?"닫는 중…":"닫기"}),w&&(0,a.jsx)("p",{role:"alert",className:"text-sm text-destructive",children:w})]}):null]}),void 0!==n.wishReply&&(0,a.jsxs)("section",{"aria-label":"Wish reply destination",className:"rounded-xl border border-border p-3 text-sm",children:[(0,a.jsx)("h3",{className:"mb-1 font-semibold",children:"어디로 회신하나"}),(0,a.jsx)("p",{className:"break-all",children:n.wishReply?"".concat(null!=(r=({telegram:"텔레그램 대화",pwa:"PWA",tui:"TUI",linear:"Linear"})[n.wishReply.surface])?r:n.wishReply.surface).concat(n.wishReply.address?" \xb7 ".concat(n.wishReply.address):""):"회신 주소 없음"})]}),void 0!==n.wishReply&&(0,a.jsxs)("section",{"aria-label":"Wish reply history",className:"rounded-xl border border-border p-3 text-sm",children:[(0,a.jsx)("h3",{className:"mb-1 font-semibold",children:"회신 이력"}),(0,a.jsx)("p",{className:"text-muted-foreground",children:"카드 원장에는 회신 발송 이력이 기록되지 않습니다"})]}),o&&(0,a.jsxs)("p",{className:"overflow-x-auto whitespace-nowrap text-sm","aria-label":"Wish placement and progress",children:["배치 \xb7 ",o.length?o.map(e=>{let{cellId:t,cellTitle:s,version:a,status:r}=e;return"".concat(t," ").concat(s," \xb7 ").concat(a,"판 \xb7 ").concat(d[r])}).join(" / "):"아직 배치되지 않음"]}),j&&(0,a.jsxs)("p",{className:"overflow-x-auto whitespace-nowrap text-sm","aria-label":"Gate decisions",children:["Gate \xb7 budget: ",m(j.budget)," \xb7 location: ",m(j.location)]}),u.map(e=>{let t=n.sections[e];return t?(0,a.jsxs)("section",{"aria-label":"".concat(e," section"),className:"rounded-xl border border-border p-3",children:[(0,a.jsx)("h3",{className:"mb-1 text-sm font-semibold capitalize",children:e}),(0,a.jsx)(f,{entry:t}),(0,a.jsx)(p,{entry:t})]},e):null}),(0,a.jsxs)("section",{"aria-label":"Incidents",className:"space-y-2",children:[(0,a.jsxs)("h3",{className:"text-sm font-semibold",children:["Incidents (",n.incidents.length,")"]}),n.incidents.length?(0,a.jsx)("ol",{className:"space-y-2",children:n.incidents.map(e=>(0,a.jsxs)("li",{className:"rounded-xl border border-border p-3",children:[(0,a.jsx)(f,{entry:e}),(0,a.jsx)(p,{entry:e})]},e.key))}):(0,a.jsx)("p",{className:"text-xs text-muted-foreground",children:"No incidents."})]})]})}let x=["steward","execution","landing","release","done"],g=new Set(["intake","triage","gates","relations","memory","workspace","run","landing","release","incidents"]);function b(e){let t=[],s=Date.parse(e.createdAt),a=e.sections.find(e=>"intake:reply:0"===e.key),r=null;if(a)try{let e=JSON.parse(a.content);if(e&&"object"==typeof e&&!Array.isArray(e)){let{surface:t,address:s}=e;"string"==typeof t&&("string"==typeof s||null===s)&&(r={surface:t,address:s})}}catch(e){}for(let a of e.sections){let r;if(!g.has(a.key))continue;try{let e=JSON.parse(a.content);r=e&&"object"==typeof e&&!Array.isArray(e)?e:{content:a.content}}catch(e){r={content:a.content}}let n=Date.parse(a.createdAt);t.push({taskId:e.id,section:a.key,key:"".concat(a.key,":").concat(a.createdAt,":").concat(t.length),owner:a.owner,ts:Number.isFinite(n)?n:s,data:r,..."string"==typeof r.runId?{runId:r.runId}:{}})}if(0===t.length&&t.push({taskId:e.id,section:"triage",key:"api:title",owner:"task-card API",ts:s,data:{title:e.title}}),"closed"===e.status){let a=t.filter(e=>"release"===e.section).sort((e,t)=>t.ts-e.ts)[0];t.push({taskId:e.id,section:"release",key:"api:closed",owner:"task-card API",ts:Math.max(s,...t.map(e=>e.ts)),data:{...null==a?void 0:a.data,status:"done"}})}return{...function(e){let t,s=e[0];if(!s)return null;let a={},r=[],n=new Set,l=s.ts,o=-1/0;for(let i of e)if(!(i.taskId!==s.taskId||n.has(i.key)))if(n.add(i.key),l=Math.max(l,i.ts),i.runId&&i.ts>=o&&(t=i.runId,o=i.ts),"incidents"===i.section)r.push(i);else{let e=a[i.section];(!e||i.ts>=e.ts)&&(a[i.section]=i)}return{taskId:s.taskId,sections:a,incidents:r,updatedAt:l,...t?{runId:t}:{}}}(t),apiTitle:e.title,status:e.status,...void 0===e.closedReason?{}:{closedReason:e.closedReason},...e.goalId.startsWith("wish:")?{wishReply:r}:{}}}function y(e){let{cards:t,selectedId:s,onSelect:r,selectedCard:n,detailError:l,placements:o,onCloseCard:c,publicCapture:d}=e,u=(null==n?void 0:n.taskId)===s?n:null;return(0,a.jsxs)("div",{className:"space-y-4 p-4",children:[(0,a.jsx)("h1",{className:"text-xl font-semibold",children:"보드"}),(0,a.jsx)("div",{className:"grid gap-3 md:grid-cols-2 xl:grid-cols-5",children:x.map(e=>(0,a.jsxs)("section",{"aria-label":"".concat(e," column"),className:"min-w-0 space-y-2 rounded-xl border border-border p-3",children:[(0,a.jsx)("h2",{className:"text-sm font-semibold capitalize",children:e}),t.filter(t=>(function(e){var t;let s=null==(t=e.sections.release)?void 0:t.data;return(null==s?void 0:s.status)==="done"||(null==s?void 0:s.status)==="completed"?"done":s?"release":e.sections.landing?"landing":e.sections.run||e.sections.workspace||e.sections.gates||e.sections.relations||e.sections.memory?"execution":"steward"})(t)===e).map(e=>{var t,n;return(0,a.jsxs)("button",{type:"button",onClick:()=>r(e.taskId),"aria-pressed":s===e.taskId,className:"w-full rounded-lg border border-border bg-card p-3 text-left text-sm hover:bg-accent/40",children:[(0,a.jsx)("span",{className:"block font-medium",children:i(e)}),(0,a.jsx)("span",{className:"block text-xs text-muted-foreground",children:(0,a.jsx)("time",{dateTime:new Date(e.updatedAt).toISOString(),title:new Date(e.updatedAt).toLocaleString(),children:(t=function(e){let t=new Map;for(let a of e.incidents){var s;let e=null!=(s=a.data.incidentId)?s:a.data.id,r="string"==typeof e&&e.trim()?e:a.key,n=t.get(r);(!n||a.ts>=n.ts)&&t.set(r,a)}return Array.from(t.values()).filter(e=>"closed"!==e.data.status&&"resolved"!==e.data.status).length}(e),n=Date.now(),[...t>0?["사고 ".concat(t)]:[],...e.runId?["런 ".concat(e.runId.replace(/^run-/,"").slice(0,8))]:[],function(e,t,s){let a=Math.floor((t-e)/6e4);if(!Number.isFinite(a)||a<1)return"방금";if(a<60)return"".concat(a,"분 전");if(a<1440)return"".concat(Math.floor(a/60),"시간 전");let r=new Intl.DateTimeFormat("ko-KR",{month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1,...s?{timeZone:s}:{}}).formatToParts(new Date(e)),n=e=>{var t,s;return null!=(s=null==(t=r.find(t=>t.type===e))?void 0:t.value)?s:""};return"".concat(n("month"),"/").concat(n("day")," ").concat(n("hour"),":").concat(n("minute"))}(e.updatedAt,n,void 0)]).join(" \xb7 ")})})]},e.taskId)})]},e))}),s&&(0,a.jsxs)("aside",{className:"max-w-3xl space-y-2","aria-label":"Selected card",children:[(0,a.jsx)("button",{type:"button",onClick:()=>r(null),"aria-label":"Close card detail",className:"text-sm text-muted-foreground",children:"Close"}),u?(0,a.jsx)(h,{card:u,placements:o,onClose:c,publicCapture:d}):(0,a.jsx)("p",{role:"status",children:null!=l?l:"Loading card detail…"})]})]})}function w(){let{config:e}=(0,o.Q)(),t=(0,l.useMemo)(()=>e.baseUrl?(0,c.xX)({baseUrl:e.baseUrl,...e.token?{token:e.token}:{}}):null,[e.baseUrl,e.token]),[s,i]=(0,l.useState)([]),[d,u]=(0,l.useState)(null),[m,p]=(0,l.useState)(null),[f,h]=(0,l.useState)(void 0),[x,g]=(0,l.useState)(null),[w,k]=(0,l.useState)(null),[v,j]=(0,l.useState)(!1);(0,l.useEffect)(()=>{"public"===new URLSearchParams(window.location.search).get("capture")&&j(!0)},[]);let N=(0,l.useMemo)(()=>v?n(s):s,[s,v]),I=v&&m?n([m])[0]:m,S=v&&f?(0,r.cj)(f,[]):f;(0,l.useEffect)(()=>{let e=!1;if(i([]),u(null),p(null),h(void 0),g(null),!t)return void k("Connect to NEXUS to load task cards.");k(null);let s=()=>t.getTaskCards().then(t=>{let{cards:s}=t;e||(i(s.map(b)),k(null))}).catch(t=>{e||k(t instanceof c.Iu&&404===t.status?"Task cards are not available yet (pre-E1).":t instanceof Error?t.message:String(t))});s();let a=setInterval(()=>{s()},1e4);return()=>{e=!0,clearInterval(a)}},[t]),(0,l.useEffect)(()=>{if(!t||!d)return;let e=!1;return p(null),h(void 0),g(null),t.getTaskCard(d).then(t=>{let{card:s,placements:a}=t;e||(h(a),p(b(s)))}).catch(t=>{e||g(t instanceof Error?t.message:String(t))}),()=>{e=!0}},[t,d]);let C=async e=>{if(!t||!d||v)throw Error("Card close unavailable");let{card:s}=await t.closeTaskCard(d,e);p(e=>(null==e?void 0:e.taskId)===d?b(s):e),i(e=>e.map(e=>e.taskId===s.id?b(s):e))};return(0,a.jsxs)(a.Fragment,{children:[w&&(0,a.jsx)("p",{role:"status",className:"p-4 text-sm text-muted-foreground",children:w}),(0,a.jsx)(y,{cards:N,selectedId:d,selectedCard:I,detailError:x,placements:S,onSelect:e=>{(null===e||d!==e)&&(p(null),h(void 0),g(null),u(e))},onCloseCard:C,publicCapture:v})]})}function k(){return(0,a.jsx)(w,{})}},45695:(e,t,s)=>{"use strict";s.d(t,{C:()=>c,DaemonProvider:()=>d,Q:()=>u});var a=s(65863),r=s(24815),n=s(70086),l=s(89469),o=s(31324),i=s(16263);let c=(0,r.createContext)(null);function d(e){let{children:t}=e,s={baseUrl:"",token:"",provider:""},[d,u]=(0,r.useState)(s),[m,p]=(0,r.useState)(""),[f]=(0,r.useState)(()=>new o.ki(s));(0,r.useEffect)(()=>{let e=(0,n.Fp)();u(e),f.updateConfig(e),p((0,l.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[f]),(0,r.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,n.Fp)();f.updateConfig(t),u(t),(0,i.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&p(t=>t===e.newValue?t:((0,i.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[f]);let h=e=>{u(t=>{let s={...t,...e};return(0,n.Qc)(e),f.updateConfig(s),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),s})},x=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},g=(0,r.useMemo)(()=>({config:d,setConfig:h,client:f,sessionId:m,setSessionId:x}),[d,f,m]);return(0,a.jsx)(c.Provider,{value:g,children:t})}function u(){let e=(0,r.useContext)(c);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},57657:(e,t,s)=>{Promise.resolve().then(s.bind(s,28434))},89469:(e,t,s)=>{"use strict";s.d(t,{Zr:()=>l,f6:()=>r,oD:()=>n});let a="elanous.daemon.sessionId";function r(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function n(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(a,e),e):localStorage.getItem(a)}();if(e)return e;let t=r();return localStorage.setItem(a,t),t}function l(){let e=r();return localStorage.setItem(a,e),e}}},e=>{e.O(0,[1324,9279,5290,607,7358],()=>e(e.s=57657)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7955],{56580:(e,t,s)=>{"use strict";s.d(t,{BotlabPageContent:()=>h});var r,l=s(65863),a=s(24815);let o=(null!=(r=s(55428).env.NEXT_PUBLIC_ELANOUS_BOTLAB_HOST)?r:"").trim(),n="elanous.botlab.wallHost",d=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;function i(e){return e.length>0&&e.length<=253&&d.test(e)}function c(e){var t;let{search:s,remembered:r=null}=e,d=(0,a.useMemo)(()=>(function(e){var t,s;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,l=null;try{l=new URLSearchParams(e).get("host")}catch(e){l=null}let a=null!=(t=null==l?void 0:l.trim())?t:"";if(""!==a&&i(a))return{host:a,source:"query",rejected:null};let n=""===a?null:a,d=null!=(s=null==r?void 0:r.trim())?s:"";return""!==d&&i(d)?{host:d,source:"remembered",rejected:n}:""!==o&&i(o)?{host:o,source:"default",rejected:n}:{host:"",source:"unset",rejected:n}})(s,r),[s,r]),c="unset"===d.source?null:(t=d.host,"https://".concat(t).concat("/bot3/bot-wall.html"));return(0,a.useEffect)(()=>{if("query"===d.source)try{window.localStorage.setItem(n,d.host)}catch(e){}},[d.source,d.host]),(0,l.jsxs)("main",{className:"mx-auto flex w-full max-w-6xl flex-col gap-6 px-6 py-10 sm:px-10","data-testid":"botlab-panel",children:[(0,l.jsxs)("header",{children:[(0,l.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground",children:"Bot screens"}),(0,l.jsx)("h1",{className:"mt-2 text-3xl font-bold",children:"Botlab"}),(0,l.jsxs)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:["Live noVNC screens for the bots, served through Tailscale. One document holds all four sessions, so the VNC password is asked ",(0,l.jsx)("strong",{children:"once"}),", not four times."]}),(0,l.jsx)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:"View-only by default. This surface cannot send commands or control the bots."})]}),(0,l.jsxs)("section",{className:"rounded-xl border border-border bg-card p-4","aria-label":"Wall address",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:"Wall address"}),(0,l.jsx)("p",{className:"mt-1 break-all font-mono text-xs text-muted-foreground","data-testid":"botlab-wall-url",children:null!=c?c:"(no host configured)"}),(0,l.jsx)("p",{className:"mt-2 text-xs text-muted-foreground","data-testid":"botlab-host-source",children:"query"===d.source?"Host came from the ?host= query parameter (remembered on this device).":"remembered"===d.source?"Host is the one remembered on this device; override it with ?host=<tailnet-name>.":"default"===d.source?"Host is the build default (NEXT_PUBLIC_ELANOUS_BOTLAB_HOST); override it with ?host=<tailnet-name>.":"No wall host is configured. Open this page once with ?host=<the VM tailnet name> — it is remembered on this device."}),null!==d.rejected&&(0,l.jsxs)("p",{role:"alert",className:"mt-2 text-xs text-destructive","data-testid":"botlab-host-rejected",children:["Ignored ?host=",d.rejected," — not a valid hostname."]}),null!==c&&(0,l.jsxs)("p",{className:"mt-3 text-xs text-muted-foreground",children:[(0,l.jsx)("a",{className:"underline",href:c,target:"_blank",rel:"noreferrer","data-testid":"botlab-open-tab",children:"Open the wall in a new tab"})," — ","use this if the embedded frame stays blank."]})]}),null!==c&&(0,l.jsx)("section",{"aria-label":"Bot screen wall",children:(0,l.jsx)("iframe",{src:c,title:"Bot screen wall","data-testid":"botlab-wall-frame",className:"h-[70vh] w-full rounded-xl border border-border bg-background"})}),(0,l.jsxs)("section",{className:"rounded-xl border border-border bg-card p-5","aria-label":"If the wall is blank",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:"If the wall stays blank"}),(0,l.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"A blank frame is not necessarily a broken bot. There are three separate reasons, with different fixes:"}),(0,l.jsxs)("ol",{className:"mt-3 list-decimal space-y-2 pl-5 text-sm text-muted-foreground",children:[(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"This device is outside the tailnet."})," The address simply does not exist here. Join the tailnet, or view the screens from a device that is on it."]}),(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"Tailscale serve is not published."})," Re-run"," ",(0,l.jsx)("code",{className:"font-mono text-xs",children:"bash scripts/botlab/deploy-bot-wall.sh"}),", which re-publishes the paths and then verifies each one returns 200."]}),(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"The wall loaded but did not connect."})," That is a VNC-level failure, not a page failure — the wall itself reports connected/failed counts once you enter the password."]})]}),(0,l.jsx)("p",{className:"mt-3 text-xs text-muted-foreground",children:"The VNC password is deliberately not carried in this page or in the URL: any page a bot browser opens could otherwise reach the local websocket, and websockets have no CORS."})]}),(0,l.jsxs)("section",{className:"rounded-xl border border-dashed border-border p-5","aria-label":"Not wired yet",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:"Not wired yet"}),(0,l.jsxs)("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-sm text-muted-foreground",children:[(0,l.jsxs)("li",{children:["Per-bot cell headers (name \xb7 last round verdict \xb7 whether CDP is alive) need"," ",(0,l.jsx)("code",{className:"font-mono text-xs",children:"browserPort"})," and round results on the daemon's persona route. That route is owned by another track and is not published today."]}),(0,l.jsx)("li",{children:"Running a command from this surface needs a POST route that does not exist yet."})]})]})]})}function h(){let e=window.location.search,t=null;try{t=window.localStorage.getItem(n)}catch(e){t=null}return(0,l.jsx)(c,{search:e,remembered:t})}},95529:(e,t,s)=>{Promise.resolve().then(s.bind(s,56580))}},e=>{e.O(0,[5290,607,7358],()=>e(e.s=95529)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2885],{9944:(e,t,n)=>{"use strict";n.d(t,{v:()=>a});var r=n(24815),l=n(16263);let s=null;function a(e){let[t,n]=(0,r.useState)(()=>s&&Date.now()-s.at<6e4?s.data:[]),[a,o]=(0,r.useState)(!1),[i,d]=(0,r.useState)(null),u=(0,r.useCallback)(async()=>{o(!0),d(null);try{let t=await e.listPersonas();s={at:Date.now(),data:t.personas},n(t.personas)}catch(e){d(e instanceof Error?e.message:String(e))}finally{o(!1)}},[e]);(0,r.useEffect)(()=>{if(s&&Date.now()-s.at<6e4)return void n(s.data);u()},[u]);let c=(0,r.useCallback)(async()=>{s=null,await u()},[u]);return(0,r.useEffect)(()=>{let t=e.personasEventsUrl();if(!t)return;let n=null;try{n=new EventSource(t)}catch(e){(0,l.cY)("showroom.personas.sse.construct-error",{error:String(e)});return}let r=e=>()=>{"hello"!==e&&((0,l.cY)("showroom.personas.sse.event",{kind:e}),s=null,u())};return n.addEventListener("hello",r("hello")),n.addEventListener("load-dir",r("load-dir")),n.addEventListener("reload-all",r("reload-all")),n.addEventListener("upsert",r("upsert")),n.addEventListener("remove",r("remove")),n.onerror=e=>{(0,l.cY)("showroom.personas.sse.error",{type:e.type})},()=>{try{null==n||n.close()}catch(e){}}},[e,u]),{personas:t,loading:a,error:i,reload:c}}},33289:(e,t,n)=>{"use strict";n.d(t,{BotsPageContent:()=>D});var r=n(65863),l=n(24815),s=n(45695),a=n(9944);function o(e){if(null==e)return null;let t=e.replace(/[,%\s]/g,"").replace(/\*/g,"").trim();if(""===t||"-"===t||"N/A"===t)return null;let n=Number(t);return Number.isFinite(n)?n:null}let i=e=>"string"==typeof e&&""!==e?e:null,d=e=>"number"==typeof e&&Number.isFinite(e)?e:null,u=e=>"boolean"==typeof e?e:null;function c(e){var t,n,r,l,s;let a=[],c=[];for(let t of null!=(n=e.artifacts)?n:[]){let e=null!=(r=i(null==t?void 0:t.name))?r:"(이름 없음)",n=i(null==t?void 0:t.text);if(null===n){c.push(e);continue}a.push(function(e,t){var n;let r=function(e){let t=e.split("\n").filter(e=>""!==e.trim()&&!e.includes("━")),n=t.slice(0,3).join(" / ").slice(0,160),r=t.slice(0,3).join("\n");return/^Traceback \(most recent call last\):/m.test(r)?{kindOf:"파이썬 예외(Traceback)",head:n}:/^⛔\s*.*(실패|failed|error)/mi.test(r)?{kindOf:"스킬이 \xab실패\xbb라고 말했다",head:n}:/^(Error|error):/m.test(r)?{kindOf:"오류",head:n}:/^\s*command not found|No such file or directory/m.test(r)?{kindOf:"명령\xb7파일이 \xab없다\xbb",head:n}:null}(t);if(null!==r)return{kind:"failure",name:e,kindOf:r.kindOf,head:r.head};let l=function(e){var t,n,r,l;let s=null!=(l=null!=(r=null==(t=/^대상:\s*(\S+)/m.exec(e))?void 0:t[1])?r:null==(n=/^##\s+(\S+)\s+Real-Time Quote/m.exec(e))?void 0:n[1])?l:null;if(null===s)return null;let a=t=>{var n,r;return null!=(r=null==(n=RegExp("\\*\\*".concat(t,":\\*\\*\\s*([-+0-9.,]+)"),"i").exec(e))?void 0:n[1])?r:null},i=/\*\*Change:\*\*\s*([-+0-9.,]+)\s*\(([-+0-9.]+)%\)/i.exec(e),d={symbol:s,close:o(a("Close")),change:i?o(i[1]):o(a("Change")),changePct:i?o(i[2]):null,open:o(a("Open")),high:o(a("High")),low:o(a("Low")),volume:o(a("Volume")),prevClose:o(a("Prev Close"))};return[d.close,d.change,d.open,d.high,d.low,d.volume,d.prevClose].some(e=>null!==e)?d:null}(t);if(null!==l)return{kind:"quote",name:e,quote:l};let s=null!=(n=function(e){var t,n,r,l,s,a,i,d;let u=e.split("\n"),c=u.findIndex(e=>e.includes("|")&&e.includes("외국인")&&e.includes("기관")&&e.includes("개인"));if(c<0)return null;let m=e=>e.split("|").map(e=>e.trim()).filter((e,t,n)=>""!==e||0!==t&&t!==n.length-1),x=m(u[c]),f=e=>x.findIndex(t=>t.includes(e)),[h,g,p,b]=[0,f("외국인"),f("기관"),f("개인")];if(g<0||p<0||b<0)return null;let j=[];for(let e=c+1;e<u.length;e+=1){let t=u[e];if(!t.includes("|")){if(j.length>0)break;continue}if(/^\s*\|?[\s:|-]+\|?\s*$/.test(t))continue;let n=m(t);if(n.length<=Math.max(g,p,b))continue;let r=(null!=(l=n[h])?l:"").trim();""!==r&&j.push({key:r,foreign:o(n[g]),institution:o(n[p]),individual:o(n[b])})}if(0===j.length)return null;let y="";for(let e=c;e>=0;e-=1){let t=/^#{2,3}\s+(.+)$/.exec((null!=(s=u[e])?s:"").trim());if(t){y=t[1];break}}return""===y&&(y=null!=(a=null==(t=u.find(e=>""!==e.trim()&&!e.includes("━")))?void 0:t.trim())?a:"(제목 없음)"),{title:y,unit:null!=(d=null==(n=/\((백만|천|억)\)/.exec(x.join(" ")))?void 0:n[1])?d:null!=(i=null==(r=/\(([^)]*원[^)]*)\)/.exec(x.join(" ")))?void 0:r[1])?i:null,rows:j}}(t))?n:function(e){let t,n=e.trimStart();if(!n.startsWith("{"))return null;try{t=JSON.parse(n)}catch(e){return null}let r=function(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];for(let t of n){let n=e[t];if("number"==typeof n&&Number.isFinite(n))return n}return null},l=[],s=t.periods;if("object"==typeof s&&null!==s&&!Array.isArray(s))for(let[e,t]of Object.entries(s))"object"==typeof t&&null!==t&&l.push({key:e,foreign:r(t,"frgn_net_shares","frgn_net_amount_million"),institution:r(t,"inst_net_shares","inst_net_amount_million"),individual:r(t,"prsn_net_shares","prsn_net_amount_million")});if(0===l.length&&Array.isArray(t.rows))for(let e of t.rows){if("object"!=typeof e||null===e)continue;let t="string"==typeof e.date?e.date:null;null!==t&&l.push({key:t,foreign:r(e,"frgn_net_shares","frgn_net_amount_million"),institution:r(e,"inst_net_shares","inst_net_amount_million"),individual:r(e,"prsn_net_shares","prsn_net_amount_million")})}if(0===l.length)return null;let a="string"==typeof t.ticker?t.ticker:null,o="string"==typeof t.name&&t.name!==a?t.name:null;return{title:null!==o&&null!==a?"".concat(o,"(").concat(a,") 투자자 수급"):null!==a?"".concat(a," 투자자 수급"):"투자자 수급",unit:"주",rows:l}}(t);if(null!==s)return{kind:"flow",name:e,flow:s};let a=function(e){let t,n=e.split("\n"),r=n.findIndex(e=>"---BEGIN_OMNI_CRAWL_JSON---"===e);if(r<0)return{news:null,why:null,fenced:!1};let l=n.findIndex((e,t)=>t>r&&"---END_OMNI_CRAWL_JSON---"===e);if(l<0)return{news:null,why:"Omni crawl JSON 끝 울타리를 \xab못 찾았다\xbb",fenced:!0};try{t=JSON.parse(n.slice(r+1,l).join("\n"))}catch(e){return{news:null,why:"Omni crawl 울타리 안 JSON을 \xab못 읽었다\xbb",fenced:!0}}if("object"!=typeof t||null===t||Array.isArray(t))return{news:null,why:"Omni crawl JSON 최상위가 객체가 아니다",fenced:!0};let s=t;if(!Array.isArray(s.results))return{news:null,why:"Omni crawl JSON에 results 배열이 없다",fenced:!0};let a=[];for(let e of s.results){if("object"!=typeof e||null===e||Array.isArray(e))continue;let t=e.items;if(Array.isArray(t))for(let e of t)"object"!=typeof e||null===e||Array.isArray(e)||a.push({title:"string"==typeof e.title?e.title:null,url:"string"==typeof e.url?e.url:null,date:"string"==typeof e.date?e.date:null})}return{news:{query:"string"==typeof s.query?s.query:null,items:a},why:null,fenced:!0}}(t);if(null!==a.news)return{kind:"news",name:e,news:a.news};let i=t.split("\n").filter(e=>""!==e.trim()&&!e.includes("━")).slice(0,2).join(" / ").slice(0,120);if(a.fenced)return{kind:"unparsed",name:e,why:a.why,head:i};let d=function(e){let t=e.split("\n").filter(e=>""!==e.trim()&&!e.includes("━"));if(t.length<2)return null;let n=[];for(let e of t.slice(1)){let t=/^\s{1,}(\S[^:]*?)\s+:\s+(.+?)\s*$/.exec(e);if(null===t)continue;let r=t[1].trim(),l=t[2].trim();""===r||""===l||r.includes("//")||n.push({label:r,value:l,num:o(l)})}return 0===n.length?null:{title:t[0].trim(),entries:n}}(t);return null!==d?{kind:"keyed",name:e,keyed:d}:{kind:"unparsed",name:e,why:"아는 꼴이 \xab아니다\xbb(시세\xb7수급표\xb7뉴스\xb7라벨:값 넷 다 아님)",head:i}}(e,n))}return{personaId:null!=(l=i(e.personaId))?l:"unknown",runId:i(e.runId),atUtc:i(e.atUtc),ok:u(e.ok),steps:d(e.steps),failed:d(e.failed),source:null!=(s=i(e.source))?s:"unknown",delivered:u(null==(t=e.delivery)?void 0:t.sent),artifacts:a,textless:c}}function m(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(null===e)return"—";let n=Math.abs(e)>=1e3?e.toLocaleString("en-US"):String(e);return!0===t.sign&&e>0?"+".concat(n):n}async function x(e,t,n){try{var r,l,s=await e.fetchJson("/v1/bots/rounds?persona=".concat(encodeURIComponent(t),"&limit=").concat(n));if("object"!=typeof s||null===s)return{kind:"error",reason:"라우트 응답을 \xab못 읽었다\xbb(객체가 아니다)"};if(!Array.isArray(s.rounds))return{kind:"error",reason:"`rounds` 가 \xab배열이 아니다\xbb — 「0건」과 \xab다른 값\xbb이다"};let a=s.unreadableBy,o=void 0===a?null:Object.entries(a).filter(e=>{let[t]=e;return"result-missing"!==t}).reduce((e,t)=>{var n;let[,r]=t;return e+(null!=(n=d(r))?n:0)},0);return{kind:"ready",rounds:s.rounds.map(c),unreadable:null!=(r=d(s.unreadable))?r:0,unreadableNow:null!=o?o:null!=(l=d(s.unreadable))?l:0}}catch(e){return{kind:"error",reason:e instanceof Error&&e.message?e.message:String(e)}}}function f(e){let{a:t}=e,n=t.quote,l=null!==n.changePct&&n.changePct>0,s=null!==n.changePct&&n.changePct<0;return(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"quote-".concat(n.symbol),children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-baseline gap-x-3",children:[(0,r.jsx)("h4",{className:"font-mono text-sm font-semibold",children:n.symbol}),(0,r.jsx)("span",{className:"text-lg font-bold tabular-nums",children:m(n.close)}),(0,r.jsxs)("span",{className:"text-sm font-semibold tabular-nums ".concat(l?"text-emerald-600":s?"text-rose-600":"text-muted-foreground"),children:[m(n.change,{sign:!0}),null!==n.changePct&&" (".concat(m(n.changePct,{sign:!0}),"%)")]})]}),(0,r.jsx)("dl",{className:"mt-2 grid grid-cols-2 gap-x-4 gap-y-1 text-xs text-muted-foreground sm:grid-cols-4",children:[["시가",n.open],["고가",n.high],["저가",n.low],["전일",n.prevClose]].map(e=>{let[t,n]=e;return(0,r.jsxs)("div",{className:"flex justify-between gap-2",children:[(0,r.jsx)("dt",{children:t}),(0,r.jsx)("dd",{className:"tabular-nums text-foreground",children:m(n)})]},t)})})]})}function h(e){let{a:t}=e,n=t.flow;return(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"flow-block",children:[(0,r.jsx)("h4",{className:"text-sm font-semibold",children:n.title}),null!==n.unit&&(0,r.jsxs)("p",{className:"mt-0.5 text-xs text-muted-foreground",children:["단위: ",n.unit]}),(0,r.jsx)("div",{className:"mt-2 overflow-x-auto",children:(0,r.jsxs)("table",{className:"w-full min-w-[22rem] text-xs",children:[(0,r.jsx)("thead",{children:(0,r.jsxs)("tr",{className:"text-muted-foreground",children:[(0,r.jsx)("th",{className:"py-1 text-left font-medium",children:"기간"}),["외국인","기관","개인"].map(e=>(0,r.jsx)("th",{className:"py-1 text-right font-medium",children:e},e))]})}),(0,r.jsx)("tbody",{children:n.rows.slice(0,6).map(e=>(0,r.jsxs)("tr",{className:"border-t border-border/60",children:[(0,r.jsx)("td",{className:"py-1 font-mono",children:e.key}),[e.foreign,e.institution,e.individual].map((e,t)=>(0,r.jsx)("td",{className:"py-1 text-right tabular-nums ".concat(null===e?"text-muted-foreground":e>0?"text-emerald-600":e<0?"text-rose-600":""),children:m(e,{sign:!0})},t))]},e.key))})]})}),n.rows.length>6&&(0,r.jsxs)("p",{className:"mt-1 text-xs text-muted-foreground",children:["…",n.rows.length-6,"줄 더 (전체는 회차 원본에)"]})]})}function g(e){let{a:t}=e,n=t.keyed;return(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"keyed-block",children:[(0,r.jsx)("h4",{className:"text-sm font-semibold",children:n.title}),(0,r.jsx)("dl",{className:"mt-2 grid gap-1 sm:grid-cols-2",children:n.entries.map(e=>(0,r.jsxs)("div",{className:"flex items-baseline justify-between gap-3 text-sm",children:[(0,r.jsx)("dt",{className:"text-muted-foreground",children:e.label}),(0,r.jsx)("dd",{className:"font-semibold tabular-nums",children:e.value})]},e.label))})]})}function p(e){let{a:t}=e;return(0,r.jsxs)("div",{className:"rounded-lg border border-border bg-background/60 p-3","data-testid":"news-block",children:[(0,r.jsx)("h4",{className:"text-sm font-semibold",children:null===t.news.query?"뉴스":"뉴스: ".concat(t.news.query)}),0===t.news.items.length?(0,r.jsx)("p",{className:"mt-2 text-sm text-muted-foreground",children:"수집된 기사가 0건이다."}):(0,r.jsx)("ul",{className:"mt-2 space-y-2",children:t.news.items.map((e,t)=>{var n,l,s,a;return(0,r.jsxs)("li",{className:"text-sm",children:[null===e.url?null!=(n=e.title)?n:"(제목 없음)":(0,r.jsx)("a",{className:"font-medium underline underline-offset-2",href:e.url,children:null!=(l=e.title)?l:e.url}),null!==e.date&&(0,r.jsx)("span",{className:"ml-2 text-xs text-muted-foreground",children:e.date})]},"".concat(null!=(a=null!=(s=e.url)?s:e.title)?a:"article","-").concat(t))})})]})}function b(e){let{a:t}=e;return(0,r.jsxs)("div",{className:"rounded-lg border border-rose-500/40 bg-rose-500/5 p-3","data-testid":"failure-block",children:[(0,r.jsxs)("div",{className:"flex flex-wrap items-baseline gap-2",children:[(0,r.jsx)("h4",{className:"font-mono text-sm font-semibold",children:t.name}),(0,r.jsx)("span",{className:"rounded bg-rose-500/15 px-2 py-0.5 text-xs font-medium text-rose-700",children:"이 단계가 \xab실패\xbb했다"})]}),(0,r.jsx)("p",{className:"mt-1 text-xs text-rose-700",children:t.kindOf}),(0,r.jsx)("p",{className:"mt-1 break-words font-mono text-xs text-muted-foreground",children:t.head})]})}function j(e){let{a:t}=e;return(0,r.jsxs)("div",{className:"rounded-lg border border-dashed border-border bg-background/40 p-3","data-testid":"unparsed-block",children:[(0,r.jsx)("h4",{className:"font-mono text-sm",children:t.name}),(0,r.jsxs)("p",{className:"mt-1 text-xs text-amber-600",children:["⚠️ 이 산출을 \xab못 읽었다\xbb — ",t.why]}),(0,r.jsx)("p",{className:"mt-1 truncate text-xs text-muted-foreground",children:t.head})]})}function y(e){var t;let{round:n}=e,l=null!==n.failed&&n.failed>0;return(0,r.jsxs)("article",{className:"rounded-xl border border-border bg-card p-5","data-testid":"round-".concat(null!=(t=n.runId)?t:"unknown"),children:[(0,r.jsxs)("header",{className:"flex flex-wrap items-baseline justify-between gap-2",children:[(0,r.jsx)("h3",{className:"text-lg font-semibold",children:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"Asia/Seoul";if(null===e)return"시각 \xab모름\xbb";let n=new Date(e);if(Number.isNaN(n.getTime()))return"시각을 \xab못 읽었다\xbb(".concat(e.slice(0,24),")");let r=new Intl.DateTimeFormat("ko-KR",{timeZone:t,month:"2-digit",day:"2-digit",hour:"2-digit",minute:"2-digit",hour12:!1});return"".concat(r.format(n)," KST")}(n.atUtc)}),(0,r.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[(0,r.jsx)("span",{className:"rounded px-2 py-0.5 font-medium ".concat("cron"===n.source?"bg-emerald-500/15 text-emerald-700":"bg-muted text-muted-foreground"),children:"cron"===n.source?"무인(cron)":"manual"===n.source?"손":"출처 \xab모름\xbb"}),(0,r.jsxs)("span",{className:"rounded px-2 py-0.5 font-medium ".concat(l?"bg-rose-500/15 text-rose-700":"bg-muted text-muted-foreground"),children:[null===n.steps?"단계 \xab모름\xbb":"".concat(n.steps,"단계"),l&&" \xb7 실패 ".concat(n.failed)]}),(0,r.jsx)("span",{className:"rounded px-2 py-0.5 font-medium ".concat(!0===n.delivered?"bg-sky-500/15 text-sky-700":"bg-muted text-muted-foreground"),children:null===n.delivered?"배달 \xab모름\xbb":n.delivered?"폰에 갔다":"안 갔다"})]})]}),(0,r.jsxs)("div",{className:"mt-4 space-y-3",children:[n.artifacts.map((e,t)=>"quote"===e.kind?(0,r.jsx)(f,{a:e},t):"flow"===e.kind?(0,r.jsx)(h,{a:e},t):"news"===e.kind?(0,r.jsx)(p,{a:e},t):"keyed"===e.kind?(0,r.jsx)(g,{a:e},t):"failure"===e.kind?(0,r.jsx)(b,{a:e},t):(0,r.jsx)(j,{a:e},t)),0===n.artifacts.length&&0===n.textless.length&&(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"이 회차에 산출이 \xab없다\xbb."}),n.textless.length>0&&(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["본문을 \xab안 받은\xbb 산출 ",n.textless.length,"건: ",n.textless.join(" \xb7 ")]})]})]})}function N(e){let{client:t,persona:n,title:s,subtitle:a,limit:o=3}=e,[i,d]=(0,l.useState)({kind:"loading"});return(0,l.useEffect)(()=>{let e=!0;return d({kind:"loading"}),x(t,n,o).then(t=>{e&&d(t)}),()=>{e=!1}},[t,n,o]),(0,r.jsxs)("section",{className:"flex flex-col gap-4","aria-label":"".concat(n," rounds"),"data-testid":"rounds-".concat(n),children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h2",{className:"text-xl font-bold",children:s}),(0,r.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:a})]}),"loading"===i.kind&&(0,r.jsx)("p",{role:"status",className:"text-sm text-muted-foreground",children:"투자 회차를 불러오는 중…"}),"error"===i.kind&&(0,r.jsxs)("div",{role:"alert",className:"rounded-lg border border-destructive/40 bg-destructive/5 p-3 text-sm",children:[(0,r.jsx)("p",{className:"font-medium text-destructive",children:"회차를 \xab못 받았다\xbb."}),(0,r.jsx)("p",{className:"mt-1 text-xs text-muted-foreground",children:i.reason}),(0,r.jsxs)("p",{className:"mt-2 text-xs text-muted-foreground",children:["⚠️ 라우트 ",(0,r.jsx)("code",{className:"font-mono",children:"/v1/bots/rounds"})," 가 아직 \xab없을 수\xbb 있다(\uD83C\uDD63 축). 그때는 이 자리가 비는 것이 \xab맞다\xbb — 화면이 그것을 말하고 있다."]})]}),"ready"===i.kind&&0===i.rounds.length&&(0,r.jsxs)("p",{className:"text-sm text-muted-foreground",children:["회차가 \xab0건\xbb이다.",i.unreadable>0&&" (못 읽은 자리 ".concat(i.unreadable,"곳 — 「없다」가 아니다)")]}),"ready"===i.kind&&i.rounds.length>0&&(0,r.jsxs)(r.Fragment,{children:[i.unreadableNow>0?(0,r.jsxs)("p",{role:"alert",className:"text-xs text-amber-600",children:["⚠️ ***지금 못 읽는 자리 ",i.unreadableNow,"곳*** — 아래 수는 \xab과소\xbb다."]}):i.unreadable>0?(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["못 읽은 자리 ",i.unreadable,"곳(옛 회차) — 「지금 깨진 것」은 \xab없다\xbb."]}):null,(0,r.jsx)("div",{className:"flex flex-col gap-4",children:i.rounds.map(e=>{var t,n;return(0,r.jsx)(y,{round:e},null!=(n=null!=(t=e.runId)?t:e.atUtc)?n:Math.random())})})]})]})}function w(e){let{client:t,limit:n=3}=e;return(0,r.jsx)(N,{client:t,persona:"investor",limit:n,title:"\uD83D\uDCC8 투자 회차",subtitle:"봇이 \xab실제로 낸\xbb 산출이다. ⛔ 차트는 \xab일부러\xbb 안 그린다 — 글만 낸다."})}function v(e){let{client:t,limit:n=2}=e;return(0,r.jsx)(N,{client:t,persona:"assistant",limit:n,title:"\uD83D\uDDD3️ 비서 회차",subtitle:"안 읽은 메일\xb7앞으로의 일정. ⛔ 「0」도 \xab잰 값\xbb이라 그대로 보여 준다."})}function k(e){let{client:t,limit:n=2}=e;return(0,r.jsx)(N,{client:t,persona:"newsbot",limit:n,title:"\uD83D\uDCF0 뉴스 회차",subtitle:"⚠️ 이 봇의 산출은 꼴이 여럿이다 — 못 읽은 것은 \xab이름을 대고\xbb 남는다."})}async function _(e){try{let t=await e.fetchJson("/v1/bots/commands");return{kind:"ready",commands:t}}catch(e){return{kind:"error",reason:e instanceof Error&&e.message?e.message:"string"==typeof e&&e?e:"Unknown error"}}}function S(e){let{client:t}=e,n=(0,a.v)(t),[s,o]=(0,l.useState)({kind:"loading"});(0,l.useEffect)(()=>{let e=!0;return o({kind:"loading"}),_(t).then(t=>{e&&o(t)}),()=>{e=!1}},[t]);let i=n.error,d="error"===s.kind?s.reason:null,u=null!==i||null!==d,c=!u&&(n.loading||"loading"===s.kind),m="ready"===s.kind?s.commands:[],x=!c&&!u;return(0,r.jsxs)("main",{className:"mx-auto flex w-full max-w-5xl flex-col gap-6 px-6 py-10 sm:px-10","data-testid":"bots-panel",children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground",children:"Bot directory"}),(0,r.jsx)("h1",{className:"mt-2 text-3xl font-bold",children:"Bots"}),(0,r.jsx)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:"Commands are global: every bot exposes the same catalog."}),(0,r.jsx)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:"This surface cannot send commands yet; it only shows what you can ask bots to do."})]}),c&&(0,r.jsx)("p",{role:"status",className:"text-sm text-muted-foreground",children:"Loading bot identities and command catalog…"}),i&&(0,r.jsxs)("p",{role:"alert",className:"text-sm text-destructive",children:["Unable to load bot identities: ",i]}),d&&(0,r.jsxs)("p",{role:"alert",className:"text-sm text-destructive",children:["Unable to load bot catalog: ",d]}),x&&0===n.personas.length&&(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"No bots are configured."}),x&&n.personas.length>0&&0===m.length&&(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"No bot commands are available."}),(0,r.jsx)(w,{client:t}),(0,r.jsx)(v,{client:t}),(0,r.jsx)(k,{client:t}),x&&n.personas.length>0&&m.length>0&&(0,r.jsx)("section",{className:"grid gap-4 md:grid-cols-2","aria-label":"Bot identities",children:n.personas.map(e=>{var t;return(0,r.jsxs)("article",{className:"rounded-xl border border-border bg-card p-5","data-testid":"bot-card-".concat(e.personaId),children:[(0,r.jsx)("h2",{className:"text-lg font-semibold",children:e.displayName}),(0,r.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:null!=(t=e.description)?t:"No description provided."}),(0,r.jsx)("h3",{className:"mt-5 text-sm font-semibold",children:"Available commands"}),(0,r.jsx)("ul",{className:"mt-3 space-y-3","aria-label":"Available bot commands",children:m.map(e=>(0,r.jsxs)("li",{className:"rounded-lg border border-border bg-background/60 p-3",children:[(0,r.jsx)("h4",{className:"font-mono text-sm font-semibold",children:e.name}),(0,r.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:e.description}),e.arguments.length>0?(0,r.jsx)("ul",{className:"mt-2 space-y-1","aria-label":"".concat(e.name," arguments"),children:e.arguments.map(e=>(0,r.jsxs)("li",{className:"text-xs text-muted-foreground",children:[(0,r.jsx)("code",{className:"font-semibold text-foreground",children:e.name}),e.required?" (required)":" (optional)"," — ",e.description]},e.name))}):(0,r.jsx)("p",{className:"mt-2 text-xs text-muted-foreground",children:"No arguments."})]},e.name))})]},e.personaId)})})]})}function D(){let{client:e}=(0,s.Q)();return(0,r.jsx)(S,{client:e})}},45695:(e,t,n)=>{"use strict";n.d(t,{C:()=>d,DaemonProvider:()=>u,Q:()=>c});var r=n(65863),l=n(24815),s=n(70086),a=n(89469),o=n(31324),i=n(16263);let d=(0,l.createContext)(null);function u(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[u,c]=(0,l.useState)(n),[m,x]=(0,l.useState)(""),[f]=(0,l.useState)(()=>new o.ki(n));(0,l.useEffect)(()=>{let e=(0,s.Fp)();c(e),f.updateConfig(e),x((0,a.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[f]),(0,l.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();f.updateConfig(t),c(t),(0,i.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&x(t=>t===e.newValue?t:((0,i.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[f]);let h=e=>{c(t=>{let n={...t,...e};return(0,s.Qc)(e),f.updateConfig(n),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),n})},g=e=>{x(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},p=(0,l.useMemo)(()=>({config:u,setConfig:h,client:f,sessionId:m,setSessionId:g}),[u,f,m]);return(0,r.jsx)(d.Provider,{value:p,children:t})}function c(){let e=(0,l.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},62379:(e,t,n)=>{Promise.resolve().then(n.bind(n,33289))},89469:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>a,f6:()=>l,oD:()=>s});let r="elanous.daemon.sessionId";function l(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function s(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(r,e),e):localStorage.getItem(r)}();if(e)return e;let t=l();return localStorage.setItem(r,t),t}function a(){let e=l();return localStorage.setItem(r,e),e}}},e=>{e.O(0,[1324,5290,607,7358],()=>e(e.s=62379)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3933],{45695:(e,t,s)=>{"use strict";s.d(t,{C:()=>i,DaemonProvider:()=>d,Q:()=>m});var a=s(65863),n=s(24815),r=s(70086),l=s(89469),o=s(31324),c=s(16263);let i=(0,n.createContext)(null);function d(e){let{children:t}=e,s={baseUrl:"",token:"",provider:""},[d,m]=(0,n.useState)(s),[u,p]=(0,n.useState)(""),[x]=(0,n.useState)(()=>new o.ki(s));(0,n.useEffect)(()=>{let e=(0,r.Fp)();m(e),x.updateConfig(e),p((0,l.oD)()),(0,c.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[x]),(0,n.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,r.Fp)();x.updateConfig(t),m(t),(0,c.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&p(t=>t===e.newValue?t:((0,c.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[x]);let f=e=>{m(t=>{let s={...t,...e};return(0,r.Qc)(e),x.updateConfig(s),(0,c.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),s})},h=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,c.cY)("webterm.provider.daemon.session-set",{sessionId:e})},g=(0,n.useMemo)(()=>({config:d,setConfig:f,client:x,sessionId:u,setSessionId:h}),[d,x,u]);return(0,a.jsx)(i.Provider,{value:g,children:t})}function m(){let e=(0,n.useContext)(i);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},59872:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>c});var a=s(65863),n=s(24815),r=s(45695);let l="user@elanvital.ai",o={name:"이름",org:"회사명",kind:"회사/개인",interest:"관심 분야",contact:"연락처",consent:"동의"};function c(){let{client:e}=(0,r.Q)(),[t,s]=(0,n.useState)(""),[c,i]=(0,n.useState)(""),[d,m]=(0,n.useState)("personal"),[u,p]=(0,n.useState)("A"),[x,f]=(0,n.useState)(""),[h,g]=(0,n.useState)(!1),[b,y]=(0,n.useState)(!1),[j,v]=(0,n.useState)(""),[k,N]=(0,n.useState)(!1);async function w(s){if(s.preventDefault(),!h||b)return;let a={name:t.trim(),..."company"===d?{org:c.trim()}:{},kind:d,interest:u,contact:x.trim(),consent:!0},n=a.name?"company"!==d||a.org?a.contact?null:"contact":"org":"name";if(n){N(!0),v("".concat(o[n]," 항목을 입력해 주세요."));return}y(!0),v("");try{let t=await e.submitConsultRequest(a);if("receiptId"in t)N(!1),v("접수했습니다 \xb7 ".concat(t.receiptId," — 곧 연락드리겠습니다"));else{var r;N(!0),v("".concat(null!=(r=o[t.field])?r:"필수"," 항목을 확인해 주세요."))}}catch(e){N(!0),v("접수하지 못했습니다. 서버 또는 연결 상태를 확인하고 다시 보내 주세요.")}finally{y(!1)}}return(0,a.jsxs)("main",{className:"mx-auto w-full max-w-xl px-5 py-10 sm:py-16",children:[(0,a.jsxs)("header",{className:"mb-8",children:[(0,a.jsx)("p",{className:"mb-2 text-sm font-medium text-primary",children:"AX \xb7 상담 문의"}),(0,a.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:"어떤 도움이 필요하신가요?"}),(0,a.jsx)("p",{className:"mt-3 text-sm text-muted-foreground",children:"도입 상담이나 교육 과정에 대해 남겨 주세요. 확인 후 연락드리겠습니다."}),(0,a.jsxs)("p",{className:"mt-2 text-sm text-muted-foreground",children:["메일로 바로 문의: ",(0,a.jsx)("a",{className:"underline",href:"mailto:".concat(l),children:l})]})]}),(0,a.jsxs)("form",{onSubmit:w,noValidate:!0,className:"space-y-6 rounded-xl border border-border bg-card p-5 sm:p-8",children:[(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsx)("label",{htmlFor:"consult-name",className:"block text-sm font-medium",children:"이름"}),(0,a.jsx)("input",{id:"consult-name",name:"name",required:!0,autoComplete:"name",value:t,onChange:e=>s(e.target.value),className:"w-full rounded-md border border-input bg-background px-3 py-2 text-sm"})]}),(0,a.jsxs)("fieldset",{className:"space-y-2",children:[(0,a.jsx)("legend",{className:"text-sm font-medium",children:"회사/개인"}),(0,a.jsxs)("div",{className:"flex gap-5 text-sm",children:[(0,a.jsxs)("label",{className:"flex items-center gap-2",children:[(0,a.jsx)("input",{type:"radio",name:"kind",value:"company",checked:"company"===d,onChange:()=>m("company")}),"회사"]}),(0,a.jsxs)("label",{className:"flex items-center gap-2",children:[(0,a.jsx)("input",{type:"radio",name:"kind",value:"personal",checked:"personal"===d,onChange:()=>m("personal")}),"개인"]})]})]}),"company"===d&&(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsx)("label",{htmlFor:"consult-org",className:"block text-sm font-medium",children:"회사명"}),(0,a.jsx)("input",{id:"consult-org",name:"org",required:!0,autoComplete:"organization",value:c,onChange:e=>i(e.target.value),className:"w-full rounded-md border border-input bg-background px-3 py-2 text-sm"})]}),(0,a.jsxs)("fieldset",{className:"space-y-2",children:[(0,a.jsx)("legend",{className:"text-sm font-medium",children:"관심 분야"}),(0,a.jsxs)("div",{className:"flex flex-col gap-2 text-sm",children:[(0,a.jsxs)("label",{className:"flex items-center gap-2",children:[(0,a.jsx)("input",{type:"radio",name:"interest",value:"A",checked:"A"===u,onChange:()=>p("A")}),"A \xb7 AX 도입 상담"]}),(0,a.jsxs)("label",{className:"flex items-center gap-2",children:[(0,a.jsx)("input",{type:"radio",name:"interest",value:"B",checked:"B"===u,onChange:()=>p("B")}),"B \xb7 과정\xb7교육 문의"]})]})]}),(0,a.jsxs)("div",{className:"space-y-2",children:[(0,a.jsx)("label",{htmlFor:"consult-contact",className:"block text-sm font-medium",children:"연락처 (메일 또는 전화)"}),(0,a.jsx)("input",{id:"consult-contact",name:"contact",required:!0,value:x,onChange:e=>f(e.target.value),className:"w-full rounded-md border border-input bg-background px-3 py-2 text-sm"})]}),(0,a.jsxs)("label",{className:"flex items-start gap-3 text-sm leading-6",children:[(0,a.jsx)("input",{type:"checkbox",name:"consent",checked:h,onChange:e=>g(e.target.checked),className:"mt-1"}),(0,a.jsx)("span",{children:"입력한 정보는 상담 연락을 위해 서버로 전송하며, 상담 연락에만 사용합니다"})]}),j&&(0,a.jsx)("p",{role:k?"alert":"status",className:k?"text-sm text-destructive":"text-sm text-primary",children:j}),(0,a.jsx)("button",{type:"submit",disabled:!h||b,className:"w-full rounded-md bg-primary px-4 py-2.5 text-sm font-medium text-primary-foreground disabled:cursor-not-allowed disabled:opacity-50",children:b?"보내는 중…":"보내기"})]})]})}},64341:(e,t,s)=>{Promise.resolve().then(s.bind(s,59872))},89469:(e,t,s)=>{"use strict";s.d(t,{Zr:()=>l,f6:()=>n,oD:()=>r});let a="elanous.daemon.sessionId";function n(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function r(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(a,e),e):localStorage.getItem(a)}();if(e)return e;let t=n();return localStorage.setItem(a,t),t}function l(){let e=n();return localStorage.setItem(a,e),e}}},e=>{e.O(0,[1324,5290,607,7358],()=>e(e.s=64341)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[1422],{31114:(e,t,r)=>{"use strict";async function n(e){let t=await e.fetchResponse("/v1/ops-board/notices");if(!t.ok)throw Error("notices list failed: ".concat(t.status));return(await t.json()).notices}async function s(e,t,r){let n=await e.fetchResponse("/v1/ops-board/notices",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({noticeId:t,body:r})});if(!n.ok)throw Error("notice reply failed: ".concat(n.status));return(await n.json()).reply}async function a(e){let t=await e.fetchResponse("/v1/decisions?status=open");if(!t.ok)throw Error("decisions list failed: ".concat(t.status));return(await t.json()).decisions}async function i(e,t,r,n){let s=await e.fetchResponse("/v1/decisions/".concat(encodeURIComponent(t),"/decide"),{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({choice:r,...void 0===n?{}:{note:n}})});if(!s.ok)throw Error("decision failed: ".concat(s.status));return s.json()}r.d(t,{LD:()=>i,aj:()=>s,kh:()=>n,qK:()=>a})},45695:(e,t,r)=>{"use strict";r.d(t,{C:()=>d,DaemonProvider:()=>c,Q:()=>u});var n=r(65863),s=r(24815),a=r(70086),i=r(89469),l=r(31324),o=r(16263);let d=(0,s.createContext)(null);function c(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[c,u]=(0,s.useState)(r),[m,p]=(0,s.useState)(""),[x]=(0,s.useState)(()=>new l.ki(r));(0,s.useEffect)(()=>{let e=(0,a.Fp)();u(e),x.updateConfig(e),p((0,i.oD)()),(0,o.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[x]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();x.updateConfig(t),u(t),(0,o.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&p(t=>t===e.newValue?t:((0,o.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[x]);let h=e=>{u(t=>{let r={...t,...e};return(0,a.Qc)(e),x.updateConfig(r),(0,o.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},b=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,o.cY)("webterm.provider.daemon.session-set",{sessionId:e})},f=(0,s.useMemo)(()=>({config:c,setConfig:h,client:x,sessionId:m,setSessionId:b}),[c,x,m]);return(0,n.jsx)(d.Provider,{value:f,children:t})}function u(){let e=(0,s.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},60222:(e,t,r)=>{Promise.resolve().then(r.bind(r,76725))},76725:(e,t,r)=>{"use strict";r.d(t,{DecisionBoard:()=>d});var n=r(65863),s=r(24815),a=r(45695),i=r(31114);let l=e=>new Intl.DateTimeFormat("ko-KR",{timeZone:"Asia/Seoul",year:"numeric",month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1}).format(new Date(e)),o=e=>(null==e?void 0:e.trim())||"(비움)";function d(){let{client:e}=(0,a.Q)(),[t,r]=(0,s.useState)({items:[],error:null,loading:!0}),[d,c]=(0,s.useState)("decisions"),[u,m]=(0,s.useState)(0),[p,x]=(0,s.useState)({items:[],loading:!1,error:null}),[h,b]=(0,s.useState)({}),[f,g]=(0,s.useState)(null),[j,y]=(0,s.useState)({}),[v,w]=(0,s.useState)({}),[k,N]=(0,s.useState)(null),[S,C]=(0,s.useState)(null),[E,D]=(0,s.useState)({}),[A,I]=(0,s.useState)({}),U=(0,s.useRef)(null),R=(0,s.useRef)(0),T=(0,s.useRef)(e);T.current=e,(0,s.useEffect)(()=>{if("notices"!==d)return;let t=!0;return x({items:[],loading:!0,error:null}),(0,i.kh)(e).then(e=>{t&&x({items:e,loading:!1,error:null})}).catch(e=>{t&&x({items:[],loading:!1,error:e instanceof Error?e.message:String(e)})}),()=>{t=!1}},[e,d,u]);let K=(0,s.useRef)(!1),L=async t=>{var r;let n=(null!=(r=h[t.id])?r:"").trim();if(n&&!K.current){K.current=!0,g(t.id),y(e=>({...e,[t.id]:""}));try{if(await (0,i.aj)(e,t.id,n),T.current!==e)return;b(e=>({...e,[t.id]:""})),y(e=>({...e,[t.id]:"".concat(t.from," 수신함으로 보냄")}))}catch(r){T.current===e&&y(e=>({...e,[t.id]:"전송 실패 \xb7 ".concat(r instanceof Error?r.message:String(r))}))}finally{K.current=!1,T.current===e&&g(null)}}};(0,s.useEffect)(()=>{let t=!0;U.current=null;let n=++R.current;return r({items:[],error:null,loading:!0}),w({}),N(null),C(null),D({}),I({}),b({}),g(null),y({}),(0,i.qK)(e).then(e=>{t&&R.current===n&&r({items:[...e].sort((e,t)=>{var r,n;return(e.dueAt?Date.parse(e.dueAt):1/0)-(t.dueAt?Date.parse(t.dueAt):1/0)||(null!=(r=e.raisedAt)?r:"").localeCompare(null!=(n=t.raisedAt)?n:"")||e.id.localeCompare(t.id)}),error:null,loading:!1})}).catch(e=>{t&&R.current===n&&r({items:[],error:e instanceof Error?e.message:String(e),loading:!1})}),()=>{t=!1,++R.current}},[e]);let O=async function(t,r){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if(U.current||E[t.id])return;if(t.irreversible&&(!n||(null==k?void 0:k.id)!==t.id||k.key!==r))return void N({id:t.id,key:r});let s=R.current;U.current=t.id,C(t.id),N(null),I(e=>({...e,[t.id]:""}));try{var a,l,o;let n=await (0,i.LD)(e,t.id,r,(null!=(l=v[t.id])?l:"").replace(/\s+/g," ").trim().slice(0,300)||void 0);if(T.current!==e||R.current!==s)return;let d=null!=(o=null==(a=t.options.find(e=>e.id===r))?void 0:a.label)?o:r;D(e=>({...e,[t.id]:{label:d,at:n.decidedAt}}))}catch(n){if(T.current!==e||R.current!==s)return;let r=n instanceof Error?n.message:String(n);I(e=>({...e,[t.id]:r.includes("decision failed: 409")?"이미 결정됨":r.includes("decision failed: 404")?"사라진 결정":"결정 실패 \xb7 ".concat(r)}))}finally{T.current===e&&R.current===s&&(U.current=null,C(null))}};return(0,n.jsxs)("main",{className:"mx-auto w-full max-w-3xl px-3 py-5 text-foreground sm:px-6",children:[(0,n.jsxs)("header",{className:"mb-5",children:[(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"운영 \xb7 결정"}),(0,n.jsx)("h1",{className:"text-xl font-semibold",children:"결정 대기 카드"})]}),(0,n.jsxs)("nav",{"aria-label":"운영 게시판",className:"mb-4 flex gap-2",children:[(0,n.jsx)("button",{type:"button","aria-current":"decisions"===d?"page":void 0,onClick:()=>c("decisions"),className:"rounded-md border border-border px-3 py-2",children:"결정"}),(0,n.jsx)("button",{type:"button","aria-current":"notices"===d?"page":void 0,onClick:()=>c("notices"),className:"rounded-md border border-border px-3 py-2",children:"공지 \xb7 의견"}),"notices"===d&&(0,n.jsx)("button",{type:"button",onClick:()=>m(e=>e+1),className:"rounded-md border border-border px-3 py-2",children:"공지 새로고침"})]}),"notices"===d?(0,n.jsx)("section",{"aria-label":"공지 \xb7 의견",children:p.loading?(0,n.jsx)("p",{role:"status",children:"공지 읽는 중"}):p.error?(0,n.jsxs)("p",{role:"alert",children:["공지 못 읽음 \xb7 ",p.error]}):0===p.items.length?(0,n.jsx)("p",{children:"도착한 공지가 없습니다."}):(0,n.jsx)("ol",{className:"space-y-4",children:p.items.map(e=>{var t,r,s;return(0,n.jsxs)("li",{className:"rounded-xl border border-border bg-card p-4",children:[(0,n.jsxs)("p",{className:"text-sm text-muted-foreground",children:[e.from," → 대표 \xb7 ",null!=(t=e.kind)?t:"공지"," \xb7 ",(0,n.jsxs)("time",{dateTime:e.createdAt,children:[l(e.createdAt)," KST"]})]}),(0,n.jsx)("p",{className:"my-3 whitespace-pre-wrap break-words",children:e.body}),(0,n.jsxs)("label",{className:"block text-sm",children:[e.from," 자리에게 답글",(0,n.jsx)("textarea",{maxLength:3e3,value:null!=(r=h[e.id])?r:"",onChange:t=>b(r=>({...r,[e.id]:t.target.value})),className:"mt-1 block w-full rounded-md border border-border bg-background px-3 py-2"})]}),(0,n.jsx)("button",{type:"button",disabled:null!==f||!(null!=(s=h[e.id])?s:"").trim(),onClick:()=>{L(e)},className:"mt-2 rounded-md border border-border px-3 py-1 disabled:opacity-50",children:"답글 보내기"}),j[e.id]&&(0,n.jsx)("p",{role:"status",children:j[e.id]})]},e.id)})})}):t.loading?(0,n.jsx)("p",{role:"status",children:"읽는 중"}):t.error?(0,n.jsxs)("p",{role:"alert",children:["못 읽음 \xb7 ",t.error]}):0===t.items.length?(0,n.jsx)("p",{children:"열린 결정이 없습니다."}):(0,n.jsx)("ol",{className:"space-y-4",children:t.items.map(e=>{var t,r,s,a,i,d,c,u,m,p;let x=E[e.id],h=(null==k?void 0:k.id)===e.id?e.options.find(e=>e.id===k.key):void 0,b=e.recommendation;return(0,n.jsx)("li",{className:"min-w-0 rounded-xl border border-border bg-card p-4",children:x?(0,n.jsxs)("details",{children:[(0,n.jsxs)("summary",{className:"cursor-pointer font-medium",children:["결정됨: ",x.label," \xb7 ",x.at?"".concat(l(x.at)," KST"):"시각 미상"]}),(0,n.jsx)("p",{className:"mt-2 text-sm",children:e.title})]}):(0,n.jsxs)("article",{"aria-label":e.title,className:"space-y-3 break-words",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h2",{className:"text-lg font-semibold",children:e.title}),(0,n.jsxs)("p",{className:"text-sm text-muted-foreground",children:["올린 자리: ",null!=(d=null==(t=e.raisedBy)?void 0:t.agent)?d:"(비움)",(null==(r=e.raisedBy)?void 0:r.track)?"(".concat(e.raisedBy.track,")"):""]}),e.category&&(0,n.jsxs)("p",{className:"text-sm text-muted-foreground",children:["분류: ",e.category]}),e.irreversible&&(0,n.jsx)("p",{className:"font-medium text-amber-700",children:"⚠️ 되돌릴 수 없음"})]}),(0,n.jsx)("dl",{className:"space-y-1 text-sm",children:["s","c","q","a"].map(t=>{var r,s;return(0,n.jsxs)("div",{className:"flex gap-2",children:[(0,n.jsxs)("dt",{className:"font-semibold",children:[t.toUpperCase(),":"]}),(0,n.jsx)("dd",{className:"min-w-0 whitespace-pre-wrap",children:o(null!=(s=null==(r=e.scqa)?void 0:r[t])?s:"s"===t?e.situation:void 0)})]},t)})}),(0,n.jsx)("p",{className:"text-sm font-medium",children:"skipped"in b?"권고 없음: ".concat(b.reason):"권고: ".concat(null!=(c=null==(s=e.options.find(e=>e.id===b.option))?void 0:s.label)?c:b.option," — ").concat(b.why)}),e.alternative&&(0,n.jsxs)("p",{className:"text-sm",children:["대안: ",null!=(u=null==(a=e.options.find(t=>t.id===e.alternative))?void 0:a.label)?u:e.alternative]}),(0,n.jsx)("ul",{className:"space-y-2",children:e.options.map(t=>(0,n.jsxs)("li",{className:"flex flex-wrap items-center justify-between gap-2 rounded-lg border border-border p-2 text-sm",children:[(0,n.jsxs)("span",{children:[t.id.toUpperCase(),") ",t.label," — ",o(t.consequence)]}),(0,n.jsxs)("button",{type:"button",disabled:null!==S,onClick:()=>{O(e,t.id)},className:"rounded-md border border-border px-3 py-1 font-medium hover:bg-muted disabled:opacity-50",children:[t.label," 선택"]})]},t.id))}),(0,n.jsx)("p",{className:"text-sm",children:(null==(i=e.crossCheck)?void 0:i.length)?"교차 확인: ".concat(e.crossCheck.map(e=>"".concat(e.seat," ✓ ").concat(e.note).concat(e.at?" \xb7 ".concat(l(e.at)," KST"):"")).join(" \xb7 ")):"교차 확인 없음(".concat(null!=(m=e.crossCheckSkipped)?m:"미기재",")")}),e.dissent&&(0,n.jsxs)("p",{className:"text-sm",children:["이견: ",e.dissent]}),e.dueAt&&(0,n.jsxs)("p",{className:"text-sm",children:["기한: ",(0,n.jsxs)("time",{dateTime:e.dueAt,children:[l(e.dueAt)," KST"]})]}),e.pendingQuestion&&(0,n.jsxs)("details",{className:"text-sm",children:[(0,n.jsx)("summary",{className:"cursor-pointer",children:"대기 질문 전문"}),(0,n.jsx)("p",{className:"mt-2 whitespace-pre-wrap",children:e.pendingQuestion})]}),(0,n.jsxs)("label",{className:"block text-sm",children:["한 줄 의견 (최대 300자)",(0,n.jsx)("input",{type:"text",maxLength:300,value:null!=(p=v[e.id])?p:"",onChange:t=>w(r=>({...r,[e.id]:t.target.value.slice(0,300)})),className:"mt-1 block w-full rounded-md border border-border bg-background px-3 py-2"})]}),h&&(0,n.jsxs)("div",{role:"alert",className:"rounded-md border border-amber-600 p-2 text-sm",children:[(0,n.jsxs)("p",{children:["되돌릴 수 없습니다 — 이것으로 정할까요? (",h.label,")"]}),(0,n.jsx)("button",{type:"button",disabled:null!==S,onClick:()=>{O(e,h.id,!0)},className:"mr-3 underline",children:"예, 결정"}),(0,n.jsx)("button",{type:"button",onClick:()=>N(null),className:"underline",children:"취소"})]}),S===e.id&&(0,n.jsx)("p",{role:"status",children:"기록 중"}),A[e.id]&&(0,n.jsx)("p",{role:"alert",children:A[e.id]})]})},e.id)})})]})}},89469:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>i,f6:()=>s,oD:()=>a});let n="elanous.daemon.sessionId";function s(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function a(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(n,e),e):localStorage.getItem(n)}();if(e)return e;let t=s();return localStorage.setItem(n,t),t}function i(){let e=s();return localStorage.setItem(n,e),e}}},e=>{e.O(0,[1324,5290,607,7358],()=>e(e.s=60222)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6766],{524:(e,t,r)=>{Promise.resolve().then(r.bind(r,43088))},43088:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>eI});var n=r(65863),a=r(24815),o=r(37388),s=r(85458),l=r(76072),i=r(37343),d=r(1437);r(4265);var u=r(52762),c=r(27346),p=r(89279),m=r(64367);let f=[{graph:"workflow",label:"작업 노드",fallbackKinds:m.CF},{graph:"harness",label:"실행 단계 노드",fallbackKinds:m.DN}];var x=r(22430),g=r(3290);r(89326),r(48720);var h=r(2678),b=r(41026),v=r(75058);let y=/^[a-z0-9-]+$/,k=["recipes","overlay","overlays"],j=["ok","rework","fail"];function w(e){return"cmd:".concat(e)}let N="outcome";function S(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"my-graph";return{graphId:e,entry:null,terminals:[],nodes:[],edges:[]}}function C(e,t){var r,n,a,o;let s=null!=(r=t.id)?r:function(e,t){var r;let n=(null!=(r=t.split(":").pop())?r:"node").replace(/[^A-Za-z0-9_-]/g,"-")||"node",a=new Set(e.nodes.map(e=>e.id));for(let e=1;;e++)if(!a.has("".concat(n,"-").concat(e)))return"".concat(n,"-").concat(e)}(e,t.kind);if(e.nodes.some(e=>e.id===s))throw Error("이미 있는 노드 id 입니다: ".concat(s));let l=void 0!==t.x&&void 0!==t.y?{x:t.x,y:t.y}:function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"horizontal",r=e.nodes.length;return"vertical"===t?{x:40,y:40+130*r}:{x:40+r%5*240,y:40+180*Math.floor(r/5)}}(e,t.flow),i={id:s,kind:t.kind,recipe:null!=(n=t.recipe)?n:w(s),maxVisits:null!=(a=t.maxVisits)?a:1,...l};return{graph:{...e,entry:null!=(o=e.entry)?o:s,nodes:[...e.nodes,i]},id:s}}function I(e,t,r){let n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"",a=n.trim();if(t===r)throw Error("같은 노드끼리는 연결할 수 없습니다");return e.edges.some(e=>e.from===t&&e.to===r&&e.outcome===a)?e:{...e,edges:[...e.edges,{from:t,to:r,outcome:a}]}}function E(e,t){var r;let n=e.edges.filter(e=>e.from===t);return n.some(e=>!e.outcome)?"":null!=(r=j.find(e=>!n.some(t=>t.outcome===e)))?r:""}function _(e,t){return{...e,edges:e.edges.filter((e,r)=>r!==t)}}function R(e,t,r){var n;let a=null==(n=r.id)?void 0:n.trim();if(void 0!==a&&a!==t){if(!a)throw Error("노드 id 는 비울 수 없습니다");if(e.nodes.some(e=>e.id===a))throw Error("이미 있는 노드 id 입니다: ".concat(a))}let o=e=>a&&e===t?a:e;return{...e,entry:null===e.entry?null:o(e.entry),terminals:e.terminals.map(o),nodes:e.nodes.map(e=>{var n;if(e.id!==t)return e;let o=null!=(n=r.recipe)?n:a&&e.recipe===w(t)?w(a):e.recipe;return{...e,...r,id:a||t,recipe:o}}),edges:e.edges.map(e=>({...e,from:o(e.from),to:o(e.to)}))}}function z(e,t,r){if(!e.nodes.some(e=>e.id===t))return e;let n=e.terminals.filter(e=>e!==t);return{...e,terminals:r?[...n,t]:n}}function M(e){let t=new Set(e.nodes.map(e=>e.id));return e.terminals.filter(e=>t.has(e))}function A(e){var t,r,n;let a=new u.yo({graph_id:e.graphId,version:"number"==typeof(null==(t=e.extra)?void 0:t.version)?e.extra.version:1,...e.entry?{entry_node:e.entry}:{},terminal_nodes:M(e)}).toString(),o=(0,m.lu)(a);for(let t of e.nodes)(0,m.bC)(o,{nodeId:t.id,kind:t.kind,recipe:t.recipe,maxVisits:t.maxVisits});for(let t of e.edges)t.outcome?(0,m.W3)(o,{from:t.from,outcome:t.outcome,to:t.to}):(0,m.lN)(o,t.from,t.to);for(let[t,n]of Object.entries(null!=(r=e.extra)?r:{}))o.has(t)||o.set(t,o.createNode(n));let s=o.get("nodes");e.nodes.forEach((e,t)=>{let r=(0,u.oP)(s)?s.items[t]:void 0;if((0,u.jh)(r)){var n;for(let[t,a]of Object.entries(null!=(n=e.extra)?n:{}))r.has(t)||r.set(t,o.createNode(a))}});let l=o.get("edges"),i=(0,u.oP)(l)?l.items.filter(e=>(0,u.jh)(e)):[];for(let t of e.edges){let e=i.find(e=>e.get("from")===t.from&&(t.outcome?e.has("map"):e.get("to")===t.to));if(e)for(let[r,a]of Object.entries(null!=(n=t.extra)?n:{}))"on"!==r&&e.has(r)||e.set(r,o.createNode(a))}return(0,m.ys)(o)}function O(e,t){var r,n;let a=[],o=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return a.push({message:e,source:"local",...t})};y.test(e.graphId)||o("그래프 id 는 영문 소문자\xb7숫자\xb7- 만 쓸 수 있습니다"),k.includes(e.graphId)&&o("\xab".concat(e.graphId,"\xbb 는 예약된 그래프 id 입니다")),0===e.nodes.length&&o("노드가 하나도 없습니다");let s=new Map;for(let t of e.nodes)s.set(t.id,(null!=(r=s.get(t.id))?r:0)+1);for(let r of e.nodes)(!r.id.trim()||/\s/.test(r.id))&&o("노드 id 는 비우거나 공백을 넣을 수 없습니다",{nodeId:r.id}),(null!=(n=s.get(r.id))?n:0)>1&&o("노드 id \xab".concat(r.id,"\xbb 가 겹칩니다"),{nodeId:r.id}),t&&!t.includes(r.kind)&&o("팔레트에 없는 kind 입니다: ".concat(r.kind),{nodeId:r.id}),r.recipe.trim()||o("recipe 가 비었습니다",{nodeId:r.id}),(!Number.isInteger(r.maxVisits)||r.maxVisits<1)&&o("max_visits 는 1 이상의 정수여야 합니다",{nodeId:r.id});let l=new Set(e.nodes.map(e=>e.id));for(let t of(e.edges.forEach((e,t)=>{l.has(e.from)||o("간선 출발 \xab".concat(e.from,"\xbb 은 없는 노드입니다"),{edgeIndex:t}),l.has(e.to)||o("간선 도착 \xab".concat(e.to,"\xbb 은 없는 노드입니다"),{edgeIndex:t,...l.has(e.from)?{nodeId:e.from}:{}})}),l)){let r=e.edges.filter(e=>e.from===t),n=r.filter(e=>!e.outcome);n.length>1&&o("조건 없는 간선은 노드마다 하나만 둘 수 있습니다 — 결과 이름을 붙이세요",{nodeId:t}),n.length>0&&n.length<r.length&&o("조건 없는 간선과 결과 간선을 섞을 수 없습니다",{nodeId:t});let a=r.filter(e=>e.outcome).map(e=>e.outcome);new Set(a).size<a.length&&o("같은 결과 이름의 간선이 둘 이상입니다",{nodeId:t})}return e.nodes.length>0&&(e.entry&&l.has(e.entry)||o("시작 노드를 정하세요"),0===M(e).length&&o("끝 노드가 없습니다 — 노드를 골라 \xab끝 노드\xbb 로 표시하세요")),{ok:0===a.length,issues:a}}function D(e,t){let r={};try{var n;r=null!=(n=(0,u.parse)(e))?n:{}}catch(e){}return t.errors.map(e=>{var t,n,a,o,s,l;let i=/\/nodes\/(\d+)/.exec(null!=(s=e.path)?s:""),d=/\/edges\/(\d+)/.exec(null!=(l=e.path)?l:""),u=i?null==(n=r.nodes)||null==(t=n[Number(i[1])])?void 0:t.node_id:d?null==(o=r.edges)||null==(a=o[Number(d[1])])?void 0:a.from:void 0;return{message:e.message,source:"server",..."string"==typeof u?{nodeId:u}:{}}})}function V(e){var t,r;let n=(0,u.parse)(e);if(!n||"object"!=typeof n)throw Error("그래프 YAML 최상위가 맵이 아닙니다");let a=(Array.isArray(n.nodes)?n.nodes:[]).flatMap(e=>e&&"string"==typeof e.node_id?[{id:e.node_id,kind:"string"==typeof e.kind?e.kind:"",recipe:"string"==typeof e.recipe?e.recipe:"",maxVisits:"number"==typeof e.max_visits?e.max_visits:1,x:0,y:0,...L(e,["node_id","kind","recipe","max_visits"])}]:[]),o=(Array.isArray(n.edges)?n.edges:[]).flatMap(e=>e&&"string"==typeof e.from?"string"==typeof e.to?[{from:e.from,to:e.to,outcome:"",...L(e,["from","to"])}]:e.map&&"object"==typeof e.map?Object.entries(e.map).filter(e=>"string"==typeof e[1]).map(t=>{let[r,n]=t;return{from:e.from,to:n,outcome:r,...L(e,["from","map",...e.on===N?["on"]:[]])}}):[]:[]),s="string"==typeof n.entry_node?n.entry_node:null!=(r=null==(t=a[0])?void 0:t.id)?r:null;F(a,o,s,"horizontal");let l=new Set(a.map(e=>e.id)),i=(Array.isArray(n.terminal_nodes)?n.terminal_nodes:[]).filter(e=>"string"==typeof e&&l.has(e));return{graphId:"string"==typeof n.graph_id?n.graph_id:"my-graph",entry:s,terminals:i,nodes:a,edges:o,...L(n,["graph_id","entry_node","terminal_nodes","nodes","edges"])}}let P={width:180,height:72};function G(e){return"fail"===e?"실패 시":e}function F(e,t,r,n,a){let o=(0,b.Fq)(e.map(e=>({id:e.id,...P})),t,{entry:r,flow:n,rename:G,...void 0!==a?{lineLength:a}:{}});for(let t of e){let e=o.get(t.id);e&&(t.x=e.x,t.y=e.y)}}function T(e,t,r){let n=e.nodes.map(e=>({...e}));return F(n,e.edges,e.entry,t,r),{...e,nodes:n}}function L(e,t){let r=Object.fromEntries(Object.entries(e).filter(e=>{let[r]=e;return!t.includes(r)}));return Object.keys(r).length>0?{extra:r}:{}}function B(e){var t;let r=[],n=new Map;for(let t of e.edges){if(!t.outcome){r.push({from:t.from,to:t.to});continue}let e=n.get(t.from);if(e)e[t.outcome]=t.to;else{let e={[t.outcome]:t.to};n.set(t.from,e),r.push({from:t.from,on:N,map:e})}}return{id:e.graphId||"canvas",source:"mine",editable:!0,entry_node:null!=(t=e.entry)?t:"",terminal_nodes:e.terminals,nodes:e.nodes.map(e=>{let t=K(e);return{node_id:e.id,kind:e.kind,recipe:e.recipe,max_visits:e.maxVisits,...null!==t?{group:t}:{}}}),edges:r}}function K(e){var t;return("string"==typeof(null==(t=e.extra)?void 0:t.group)?e.extra.group.trim():"")||null}async function U(e,t,r,n){let a=await e.putRunGraphAccess(t,r,n),o=await e.getRunGraphAccess(t);if(!o.grants.some(e=>e.recipient===a.recipient&&e.permission===n))throw Error("권한 적용을 확인할 수 없습니다");return o}function Y(e){return{ok:!1,issues:[{source:"server",message:e}]}}async function W(e,t,r,n,a){try{let o=a&&Object.keys(a).length?a:void 0,s="create"===n?await e.createRunGraph(t,r,o):await e.putRunGraphYaml(t,r,o);return{ok:!0,id:t,created:"create"===n,..."number"==typeof s.version?{version:s.version}:{}}}catch(a){var o,s;if(!(a instanceof p.Iu))return Y("저장 실패: ".concat(a instanceof Error?a.message:String(a)));let e=null!=(o=a.body)?o:{};if(Array.isArray(e.errors)&&e.errors.length>0)return{ok:!1,issues:D(r,{errors:e.errors})};if("create"===n&&(404===a.status||405===a.status))return Y("새 그래프 저장(POST /v1/graphs)을 이 Daemon 이 아직 지원하지 않습니다 — 서버 업데이트 후 다시 저장하세요");if(409===a.status)return Y("\xab".concat(t,"\xbb 는 이미 있는 그래프 id 입니다 — 다른 id 를 쓰세요"));if("reserved-id"===e.error)return Y("\xab".concat(t,"\xbb 는 예약된 id 라 쓸 수 없습니다 — 다른 id 를 쓰세요"));if("graph-id-mismatch"===e.error)return Y("YAML 의 graph_id 가 저장할 id 와 다릅니다");if(403===a.status)return Y("\xab".concat(t,"\xbb 는 기본 제공 그래프라 덮어쓸 수 없습니다 — 다른 id 를 쓰세요"));if("update"===n&&404===a.status)return Y("\xab".concat(t,"\xbb 가 서버에 없습니다 — 새 그래프로 저장하세요"));return Y(null!=(s=e.reason)?s:e.error?"저장 실패: ".concat(e.error," (").concat(a.status,")"):"저장 실패 (".concat(a.status,")"))}}var Z=r(52187),q=r(92579);let Q="application/x-elanous-graph-kind",J={agent:"#3b82f6",gate:"#f59e0b",git:"#10b981",judge:"#a855f7",observe:"#06b6d4",hitl:"#f43f5e",subgraph:"#8b5cf6"},X={running:{word:"● 도는 중",ring:"#3b82f6",chip:"bg-blue-500/15 text-blue-400"},done:{word:"✓ 끝",ring:"#10b981",chip:"bg-emerald-500/15 text-emerald-400"},failed:{word:"✗ 실패",ring:"#ef4444",chip:"bg-red-500/15 text-red-400"},skipped:{word:"– 건너뜀",ring:"#6b7280",chip:"bg-muted text-muted-foreground"},awaiting_approval:{word:"⏸ 승인 대기",ring:"#f59e0b",chip:"bg-amber-500/15 text-amber-400"}},H={pending:{word:"대기",tint:"var(--border, #94a3b8)"},running:{word:"도는 중",tint:"#f59e0b"},passed:{word:"통과",tint:"var(--chart-2, #16a34a)"},failed:{word:"실패",tint:"var(--destructive, #ef4444)"}},$={running:"running",done:"passed",failed:"failed",skipped:"pending",awaiting_approval:"running"},ee={canvas:function(e){var t;let{data:r,selected:a}=e,o="vertical"===r.flow,s=r.runStatus?X[r.runStatus]:void 0,l=r.unit?H[r.unit.state]:void 0;return(0,n.jsxs)("div",{"data-testid":"canvas-node-".concat(r.id),"data-run-status":r.runStatus,role:r.unit?"button":void 0,tabIndex:r.unit?0:void 0,onClick:e=>{if(r.unit){var t;e.stopPropagation(),null==(t=r.openUnit)||t.call(r,r.unit.name)}},onKeyDown:e=>{if(r.unit&&("Enter"===e.key||" "===e.key)){var t;e.preventDefault(),null==(t=r.openUnit)||t.call(r,r.unit.name)}},className:"rounded-lg border bg-background px-3 py-2 shadow-sm ".concat(r.issueCount?"border-red-500":a?"border-primary":"border-border"," ").concat(r.unit?"cursor-pointer nodrag nopan":""),style:{width:P.width,borderLeft:"4px solid ".concat(l?l.tint:null!=(t=J[r.kind])?t:"#64748b"),...s?{boxShadow:"0 0 0 2px ".concat(s.ring)}:{}},children:[(0,n.jsx)(i.h7,{id:"in",type:"target",position:o?d.yX.Top:d.yX.Left,className:"!h-3 !w-3"}),(0,n.jsxs)("div",{className:"flex items-center gap-1 text-[10px] text-muted-foreground",children:[(0,n.jsx)("span",{children:r.unit?"묶음 \xb7 눌러서 펼치기":r.kind}),r.entry&&(0,n.jsx)("span",{className:"rounded bg-emerald-500/15 px-1 text-emerald-500",children:"시작"}),r.terminal&&(0,n.jsx)("span",{className:"rounded bg-sky-500/15 px-1 text-sky-500",children:"끝"}),r.issueCount>0&&(0,n.jsxs)("span",{className:"rounded bg-red-500/15 px-1 text-red-500",children:["오류 ",r.issueCount]}),l&&(0,n.jsx)("span",{className:"rounded px-1 font-semibold",style:{color:l.tint},children:l.word}),s&&(0,n.jsx)("span",{className:"rounded px-1 font-semibold ".concat(s.chip),children:s.word})]}),r.unit?(0,n.jsxs)(n.Fragment,{children:["subgraph"===r.kind&&(0,v.Fi)(r.id)&&(0,n.jsx)("span",{className:"text-[10px] text-violet-400",children:"묶음 \xb7 눌러서 안쪽 그래프 열기"}),(0,n.jsxs)("div",{className:"max-w-[150px] truncate text-sm font-semibold text-foreground",title:r.unit.name,children:["▣ ",r.unit.name]})]}):r.label?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{className:"max-w-[150px] truncate text-sm font-semibold text-foreground",title:r.label,children:r.label}),(0,n.jsx)("div",{className:"font-mono text-[10px] text-muted-foreground",children:r.id})]}):(0,n.jsx)("div",{className:"font-mono text-sm font-semibold text-foreground",children:r.id}),(0,n.jsx)("div",{className:"max-w-[150px] truncate text-[10px] text-muted-foreground",title:r.recipe,children:r.recipe}),(0,n.jsx)(i.h7,{id:"out",type:"source",position:o?d.yX.Bottom:d.yX.Right,className:"!h-3 !w-3"})]})},...q.r},et={"--xy-controls-button-background-color":"var(--card)","--xy-controls-button-background-color-hover":"var(--muted)","--xy-controls-button-color":"var(--foreground)","--xy-controls-button-color-hover":"var(--foreground)","--xy-controls-button-border-color":"var(--border)","--xy-controls-box-shadow":"0 0 0 1px var(--border)"};function er(e){var t,r,o;let{palette:s,client:l,initialGraph:d,initialSaved:u,nodeStatus:c,renderActions:p,onChange:m,onSaved:f,replace:x,highlight:g,wizardMode:y=!1,nodeLabels:k,wizardSteps:w,installedPacks:N,onKnowledgePackChange:R}=e,[z,F]=(0,a.useState)(()=>null!=d?d:S("")),[L,U]=(0,a.useState)({}),[Y,q]=(0,a.useState)(()=>u?JSON.stringify(null!=w?w:{}):null),[X,H]=(0,a.useState)(void 0),er=(null!=w?w:X)&&Object.fromEntries(Object.entries(null!=(t=null!=w?w:X)?t:{}).map(e=>{let[t,r]=e;return[t,void 0!==L[t]&&"knowledge-rag"===r.step?{...r,arg:L[t]}:r]})),[ea,eo]=(0,a.useState)(null),[es,el]=(0,a.useState)(null),[ei,ed]=(0,a.useState)(null),[eu,ec]=(0,a.useState)(null),[ep,em]=(0,a.useState)(null),[ef,ex]=(0,a.useState)(()=>u&&d?{id:d.graphId,yaml:A(d)}:null),[eg,eh]=(0,a.useState)(null),[eb,ev]=(0,a.useState)([]),[ey,ek]=(0,a.useState)(""),[ej,ew]=(0,a.useState)(null),eN=(0,a.useRef)(null),eS=(0,a.useRef)(null),[eC,eI]=(0,a.useState)("horizontal"),[eE,e_]=(0,a.useState)(void 0),eR=(0,a.useRef)(.85);eR.current=y?.6:.85,(0,a.useEffect)(()=>{let e=eS.current;if(!e||"undefined"==typeof ResizeObserver)return;let t=new ResizeObserver(e=>{var t;let[r]=e,n=null!=(t=null==r?void 0:r.contentRect.width)?t:1e3;eI(n<640?"vertical":"horizontal"),e_(n<640?void 0:100*Math.floor(n/eR.current/100))});return t.observe(e),()=>t.disconnect()},[]);let ez=(0,a.useRef)(!1),eM=(0,a.useRef)({flow:eC,lineLength:eE});eM.current={flow:eC,lineLength:eE};let eA=(0,a.useCallback)(e=>ez.current||e.nodes.length<2?e:T(e,eM.current.flow,eM.current.lineLength),[]),eO=(0,a.useCallback)(function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;setTimeout(()=>{let t=eN.current,r=eS.current;t&&Promise.resolve(t.fitView({padding:.12,maxZoom:1.1,minZoom:eR.current,...e?{duration:e}:{}})).then(()=>{let e=t.getNodes();if(!r||0===e.length)return;let n=t.getNodesBounds(e),{zoom:a,x:o,y:s}=t.getViewport(),l=r.getBoundingClientRect(),i=n.width*a+48>l.width,d=n.height*a+48>l.height;(i||d)&&t.setViewport({zoom:a,x:i?24-n.x*a:o,y:d?24-n.y*a:s})})},80)},[]),eD=(0,a.useRef)("horizontal:undefined");(0,a.useEffect)(()=>{let e="".concat(eC,":").concat(eE);e===eD.current||ez.current||(eD.current=e,F(e=>eA(e)),eO())},[eC,eE,eA,eO]);let[eV,eP]=(0,a.useState)({}),[eG,eF]=(0,a.useState)(()=>new Set),[eT,eL]=(0,a.useState)(null),[eB,eK]=(0,a.useState)(!1),eU=(0,a.useMemo)(()=>(0,v.S0)(B(z)),[z]),eY=(0,a.useMemo)(()=>(0,v.F8)(B(z)),[z]),eW=(0,a.useMemo)(()=>{let e=new Map;for(let r of z.nodes){var t;let n=eY.get(r.id);n&&e.set(n,[...null!=(t=e.get(n))?t:[],r.id])}return e},[z,eY]);(0,a.useEffect)(()=>{eF(e=>{let t=new Set([...e].filter(e=>eU.includes(e)));return t.size===e.size?e:t})},[eU]);let eZ=(eG.size>0||null!==eT)&&eU.length>0,eq=(0,a.useMemo)(()=>{var e;return null!==eT&&eB?function(e,t){var r,n,a,o;let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,l={id:e.graphId,source:"mine",editable:!0,entry_node:null!=(o=e.entry)?o:"",terminal_nodes:e.terminals,nodes:e.nodes.map(e=>{var t;return{node_id:e.id,kind:e.kind,recipe:e.recipe,max_visits:e.maxVisits,..."string"==typeof(null==(t=e.extra)?void 0:t.group)?{group:e.extra.group}:{}}}),edges:e.edges.map(e=>e.outcome?{from:e.from,on:"outcome",map:{[e.outcome]:e.to}}:{from:e.from,to:e.to})},i=(0,v.S0)(l);if(0===i.length||!s&&!i.some(e=>t.has(e)))return e;let d=(0,v.F8)(l),u=s&&i.includes(s)?{...l,nodes:l.nodes.filter(e=>d.get(e.node_id)===s),edges:l.edges.flatMap(e=>{var t;if(d.get(e.from)!==s)return[];if(e.to)return d.get(e.to)===s?[e]:[];let r=Object.fromEntries(Object.entries(null!=(t=e.map)?t:{}).filter(e=>{let[,t]=e;return d.get(t)===s}));return Object.keys(r).length?[{from:e.from,on:e.on,map:r}]:[]})}:(0,v.ws)(l,t).graph,c=new Map(e.nodes.map(e=>[e.id,e])),p=u.nodes.map(t=>{let r=c.get(t.node_id);if(r)return r;let n=e.nodes.find(e=>d.get(e.id)===t.group);return{id:t.node_id,kind:t.kind,recipe:t.recipe,maxVisits:t.max_visits,x:n.x,y:n.y}}),m=u.edges.flatMap(e=>{var t;return e.to?[{from:e.from,to:e.to,outcome:""}]:Object.entries(null!=(t=e.map)?t:{}).map(t=>{let[r,n]=t;return{from:e.from,to:n,outcome:r}})}),f=new Set(p.map(e=>e.id)),x=s?e=>e:(0,v.ws)(l,t).resolve,g=x(null!=(n=e.entry)?n:""),h=f.has(g)?g:null!=(a=null==(r=p[0])?void 0:r.id)?a:null;return{...e,nodes:p,edges:m,entry:h,terminals:[...new Set(e.terminals.map(x))].filter(e=>f.has(e))}}(z,eG,eT):eZ?T(0===(e=null!==eT?new Set([...eG].filter(e=>e!==eT)):eG).size?z:function(e,t){let r=new Map;for(let e of t.nodes){var n;let t=K(e);null!==t&&r.set(t,[...null!=(n=r.get(t))?n:[],e])}let a=new Map(t.nodes.map(e=>[e.id,e])),o=e.nodes.map(e=>{var t,n,o,s,l;let i=(0,v.Fi)(e.node_id)&&null!=(o=r.get(e.node_id.slice(v.EQ.length)))?o:[],d=i.length>0?i.reduce((e,t)=>e+t.x,0)/i.length:null!=(s=null==(t=a.get(e.node_id))?void 0:t.x)?s:0,u=i.length>0?i.reduce((e,t)=>e+t.y,0)/i.length:null!=(l=null==(n=a.get(e.node_id))?void 0:n.y)?l:0;return{id:e.node_id,kind:e.kind,recipe:e.recipe,maxVisits:e.max_visits,x:d,y:u}}),s=e.edges.flatMap(e=>{var t;return"map"in e&&e.map?Object.entries(e.map).map(t=>{let[r,n]=t;return{from:e.from,to:n,outcome:r}}):[{from:e.from,to:null!=(t=e.to)?t:"",outcome:""}]});return{graphId:t.graphId,entry:e.entry_node||null,terminals:e.terminal_nodes,nodes:o,edges:s}}((0,v.ws)(B(z),e).graph,z),eC,eE):z},[z,eG,eT,eB,eZ,eC,eE]),eQ=(0,a.useCallback)(e=>{eF(t=>new Set([...t,e])),eL(t=>t===e?null:t),eK(!0)},[]),eJ=(0,a.useCallback)(e=>{eL(e),setTimeout(()=>{let t=eN.current,r=null==t?void 0:t.getNodes().find(t=>{var r;return"groupBox"===t.type&&(null==(r=t.data)?void 0:r.group)===e});t&&r&&t.fitView({nodes:[{id:r.id}],duration:600,maxZoom:1.4,padding:.2})},80)},[]),eX=(0,a.useCallback)(()=>{eF(e=>e.size===eU.length?new Set:new Set(eU)),eL(null),eK(!1)},[eU]),eH=(0,a.useCallback)(e=>(0,v.Oc)(e.map(e=>{let t=null==c?void 0:c[e];return void 0!==t?$[t]:"pending"})),[c]);(0,a.useEffect)(()=>{null===eT&&eO(300)},[eG,eT,eO]);let e$=(0,a.useRef)(null);(0,a.useEffect)(()=>{var e,t;x&&e$.current!==x.rev&&(e$.current=x.rev,F(eA(x.graph)),U({}),H(void 0),eo(null),ec(null),ed(null),"vertical"===eC&&(null==(t=eS.current)||null==(e=t.scrollIntoView)||e.call(t,{block:"start",behavior:"smooth"})),eO(300))},[x]);let e0=(0,a.useMemo)(()=>{var e;return new Set(null!=(e=null==g?void 0:g.nodes)?e:[])},[g]),e1=(0,a.useMemo)(()=>{var e;return new Set(null!=(e=null==g?void 0:g.edges)?e:[])},[g]),e2=(0,a.useMemo)(()=>s.map(e=>e.kind),[s]),e5=(0,a.useMemo)(()=>A(z),[z]),e4=(0,a.useMemo)(()=>O(z,e2),[z,e2]),e3=(null==eu?void 0:eu.yaml)===e5?eu:null,e6=(null==e3?void 0:e3.server)?e3.issues:[],e8=[...e4.issues,...e6],e9={graphId:z.graphId,yaml:e5,graph:z,valid:e4.ok&&0===e6.length,saved:(null==ef?void 0:ef.id)===z.graphId&&ef.yaml===e5&&(null===Y||Y===JSON.stringify(null!=er?er:{}))},e7=(0,a.useRef)(e9);e7.current=e9,(0,a.useEffect)(()=>{null==m||m(e7.current)},[m,z,e5,e9.valid,e9.saved]),(0,a.useEffect)(()=>{if(!l)return;let e=!0;return l.getRunGraphs().then(t=>{e&&ev(t.graphs)}).catch(()=>{}),()=>{e=!1}},[l,ef]);let te=(0,a.useCallback)(e=>{eZ||F(t=>{try{let r=e(t);return ed(null),r}catch(e){return ed(e instanceof Error?e.message:String(e)),t}})},[eZ]),tt=(0,a.useCallback)(()=>eO(200),[eO]);function tr(e,t){if(eZ)return;let r=null;te(n=>{let a=C(n,{kind:e,flow:eC,...null!=t?t:{}});return r=a.id,a.graph}),r&&eo({type:"node",id:r}),t||tt()}let tn=(0,a.useMemo)(()=>{var e;let t=new Map;for(let r of e8)r.nodeId&&t.set(r.nodeId,(null!=(e=t.get(r.nodeId))?e:0)+1);return t},[e8]),ta=(0,a.useMemo)(()=>new Set(M(eq)),[eq]),to=(0,a.useMemo)(()=>(0,b.gL)(eq.nodes.map(e=>{var t;return{id:e.id,x:e.x,y:e.y,...null!=(t=eV[e.id])?t:P}}),(0,b.IU)(eq.edges),{flow:eC,rename:G}),[eq.nodes,eq.edges,eV,eC]),ts=(0,b.d1)(eq.nodes.some(e=>e.id===es)?es:null,to),tl=eq.nodes.map(e=>{var t,r;return{id:e.id,type:"canvas",position:{x:e.x,y:e.y},selected:(null==ea?void 0:ea.type)==="node"&&ea.id===e.id,draggable:z.nodes.some(t=>t.id===e.id),zIndex:1,className:[c?(0,h.V)(c[e.id]):"",e0.has(e.id)?"graph-wizard-new":""].filter(Boolean).join(" ")||void 0,...ts&&!ts.nodes.has(e.id)?{style:{opacity:b.zZ.dimNode}}:{},data:{id:e.id,kind:e.kind,recipe:e.recipe,...(null==k?void 0:k[e.id])?{label:k[e.id]}:{},entry:eq.entry===e.id,terminal:ta.has(e.id),issueCount:null!=(t=tn.get(e.id))?t:0,flow:eC,...(0,v.Fi)(e.id)?{unit:{name:e.id.slice(v.EQ.length),state:eH(null!=(r=eW.get(e.id.slice(v.EQ.length)))?r:[])},openUnit:eJ}:{},...(null==c?void 0:c[e.id])?{runStatus:c[e.id]}:{}}}}),ti=to.map(e=>{let t=e.indexes.some(e=>{let t=eq.edges[e];return void 0!==t&&e1.has("".concat(t.from,"->").concat(t.to,":").concat(t.outcome))}),r=(0,b.f_)(ts,e.id);return{id:e.id,source:e.from,target:e.to,sourceHandle:"out",targetHandle:"in",type:"tidy",data:{route:e},selected:(null==ea?void 0:ea.type)==="edge"&&e.indexes.some(e=>{let t=eq.edges[e],r=z.edges[ea.index];return!!(t&&r&&t.from===r.from&&t.to===r.to&&t.outcome===r.outcome)}),className:(null==ts?void 0:ts.edges.has(e.id))?"wiring-edge-flow":void 0,animated:r.animated||t||(null==c?void 0:c[e.from])==="done"&&(null==c?void 0:c[e.to])==="running",...ts?{style:r.style}:t?{style:{stroke:"#a855f7",strokeWidth:3}}:{}}}),td=(0,a.useMemo)(()=>(0,v.Vc)(eq.nodes.map(e=>{var t;return{id:e.id,position:{x:e.x,y:e.y},...null!=(t=eV[e.id])?t:P}}),eY),[eq,eV,eY]),tu=[...eB&&null!==eT?[]:td.map(e=>({id:e.id,type:"groupBox",position:{x:e.x,y:e.y},zIndex:0,selectable:!1,draggable:!1,focusable:!1,data:{group:e.group,state:eH(e.members),memberCount:e.members.length,stepCount:e.members.length,width:e.width,height:e.height,onCollapse:eQ}})),...tl];async function tc(){if(eh(null),!e4.ok||!l)return void ec({yaml:e5,issues:e4.issues,server:!1});em("validate");try{let e=await l.validateGraph("harness",e5);ec({yaml:e5,issues:e.ok&&0===e.errors.length?[]:D(e5,e),server:!0})}catch(e){ec({yaml:e5,issues:[{source:"server",message:"검증 요청 실패: ".concat(e instanceof Error?e.message:String(e))}],server:!0})}finally{em(null)}}async function tp(){if(!l||!e4.ok)return void tc();em("save"),eh(null);let e=z.graphId;try{let t=await W(l,e,e5,(null==ef?void 0:ef.id)===e?"update":"create",er);t.ok?(ex({id:e,yaml:e5,...void 0!==t.version?{version:t.version}:{}}),q(JSON.stringify(null!=er?er:{})),eh("\xab".concat(e,"\xbb 를 ").concat(t.created?"새로 ":"","저장했습니다").concat(void 0!==t.version?" (v".concat(t.version,")"):"")),null==f||f(e)):ec({yaml:e5,issues:t.issues,server:!0,from:"save"})}finally{em(null)}}async function tm(e){if(l&&e){em("load");try{var t;let r=await l.getRunGraphYaml(e),n=V(r.yaml);ez.current=!1,F(eA(n)),U({}),H(r.steps),q(JSON.stringify(null!=(t=r.steps)?t:{})),eo(null),ec(null),ex("mine"===r.source?{id:r.id,yaml:A(n)}:null),eh("mine"===r.source?"\xab".concat(e,"\xbb 를 불러왔습니다"):"\xab".concat(e,"\xbb 는 기본 제공 그래프입니다 — id 를 바꿔 내 그래프로 저장하세요")),tt()}catch(e){ed("불러오기 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{em(null)}}}let tf=(null==ea?void 0:ea.type)==="node"&&null!=(r=z.nodes.find(e=>e.id===ea.id))?r:null,tx=(null==ea?void 0:ea.type)==="edge"&&null!=(o=z.edges[ea.index])?o:null,tg=e8.filter(e=>!e.nodeId),th="validate"===ep?null:e3,tb=(0,a.useRef)(null);return(0,a.useEffect)(()=>{var e;z.graphId||null==(e=tb.current)||e.focus()},[z.graphId]),(0,n.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col","data-graph-id":z.graphId,"aria-label":"그래프 만들기",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2 border-b border-border px-3 py-2 text-xs",children:[(0,n.jsxs)("label",{className:"flex items-center gap-1 text-muted-foreground",children:["그래프 id",(0,n.jsx)("input",{ref:tb,"aria-label":"그래프 id",value:z.graphId,disabled:eZ,spellCheck:!1,placeholder:"예: my-graph",autoCapitalize:"off",autoCorrect:"off",onChange:e=>te(t=>{var r;return r=e.target.value,{...t,graphId:r.trim()}}),className:"w-36 rounded border border-border bg-background px-2 py-1 font-mono text-foreground"})]}),(0,n.jsx)("button",{type:"button",onClick:()=>{F(S("")),H(void 0),U({}),q(null),eo(null),ec(null),ex(null),eh(null),ed(null)},className:"rounded border border-border px-2 py-1",children:"새 그래프"}),l&&(0,n.jsxs)("select",{"aria-label":"그래프 불러오기",value:"",disabled:null!==ep,onChange:e=>{tm(e.target.value)},className:"max-w-[10rem] rounded border border-border bg-background px-1 py-1",children:[(0,n.jsx)("option",{value:"",children:"불러오기…"}),eb.map(e=>(0,n.jsxs)("option",{value:e.id,children:[e.id,"mine"===e.source?" \xb7 내 그래프":""]},e.id))]}),(0,n.jsx)("span",{className:"text-muted-foreground",children:e9.saved?"저장됨".concat((null==ef?void 0:ef.version)!==void 0?" \xb7 v".concat(ef.version):""):(null==ef?void 0:ef.id)===z.graphId?"저장 안 된 변경":"아직 저장 안 함"}),(0,n.jsxs)("div",{className:"ml-auto flex flex-wrap items-center gap-2",children:[eU.length>0&&(0,n.jsx)("button",{type:"button","data-testid":"toggle-units",onClick:eX,title:"모든 묶음을 한 그래프에 펼치거나(통합 보기), 묶음마다 노드 하나로 절습니다(접은 보기)",className:"rounded border border-border px-2 py-1",children:eG.size===eU.length?"묶음 펼치기 (통합 보기)":"묶음 접기"}),(0,n.jsx)("button",{type:"button",onClick:()=>{tc()},disabled:null!==ep,title:l?"저장하지 않고 서버의 그래프 로더로 검증합니다":"Daemon 연결이 없어 로컬 검사만 합니다",className:"rounded border border-border px-3 py-1 disabled:opacity-50",children:"validate"===ep?"검증 중…":"검증"}),(0,n.jsx)("button",{type:"button",onClick:()=>{tp()},disabled:!l||null!==ep||e9.saved,className:"rounded bg-primary px-3 py-1 text-primary-foreground disabled:opacity-50",children:"save"===ep?"저장 중…":"저장"}),null==p?void 0:p(e9)]})]}),th&&(0===th.issues.length?(0,n.jsxs)("p",{role:"status","data-testid":"graph-check-line",className:"border-b border-emerald-500/40 bg-emerald-500/10 px-3 py-1.5 text-sm font-medium text-emerald-500",children:["✓ 검증 통과",th.server?"":" (로컬 검사 — Daemon 연결 없음)"]}):(0,n.jsxs)("div",{role:"alert","data-testid":"graph-check-line",className:"border-b border-red-500/40 bg-red-500/10 px-3 py-1.5 text-sm text-red-500",children:[(0,n.jsxs)("p",{className:"font-medium",children:["✗ ","save"===th.from?"저장 실패":"검증 실패"," ",th.issues.length,"건"]}),(0,n.jsx)("ul",{className:"mt-0.5 list-disc pl-5 text-xs",children:th.issues.map((e,t)=>(0,n.jsxs)("li",{children:[e.nodeId?(0,n.jsxs)("span",{className:"font-mono",children:[e.nodeId,": "]}):null,e.message]},t))})]})),(ei||eg)&&(0,n.jsx)("p",{role:ei?"alert":"status",className:"border-b border-border px-3 py-1 text-xs ".concat(ei?"text-red-500":"text-emerald-500"),children:null!=ei?ei:eg}),eU.length>0&&(0,n.jsxs)("div",{"data-testid":"unit-view-bar",className:"flex flex-wrap items-center gap-2 border-b border-border px-3 py-1.5 text-xs",children:[null!==eT?(0,n.jsxs)("nav",{"aria-label":"묶음 위치","data-testid":"unit-breadcrumb",className:"flex items-center gap-1",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{eF(new Set(eU)),eL(null)},title:"모든 묶음을 접어 돌아갑니다",className:"font-mono text-muted-foreground hover:underline",children:z.graphId||"그래프"}),(0,n.jsx)("span",{"aria-hidden":!0,className:"text-muted-foreground",children:"›"}),(0,n.jsxs)("span",{className:"font-mono font-semibold text-foreground",children:["▣ ",eT]})]}):(0,n.jsx)("span",{className:"text-muted-foreground",children:eZ?"접은 보기 — 묶음을 눌러 안쪽 그래프를 여세요 (편집은 통합 보기에서)":"통합 보기 — 모든 묶음이 한 그래프에 펼쳐 있습니다"}),(0,n.jsxs)("span",{className:"ml-auto text-muted-foreground",children:["묶음 ",eU.length," \xb7 접힘 ",eG.size]})]}),(0,n.jsx)("datalist",{id:"graph-canvas-outcomes",children:j.map(e=>(0,n.jsx)("option",{value:e},e))}),eU.length>0&&(0,n.jsxs)("nav",{"aria-label":"유닛 보기",className:"sr-only",children:[(0,n.jsx)("button",{type:"button","aria-label":"부모 그래프",onClick:()=>{eL(null),eo(null),tt()},children:z.graphId||"부모"}),eT&&(0,n.jsxs)("span",{children:["› ",(0,n.jsx)("span",{children:eT})]}),(0,n.jsx)("button",{type:"button","data-testid":"editor-toggle-units",onClick:eX,children:eG.size===eU.length?"묶음 펼치기 (통합 보기)":"묶음 접기"})]}),(0,n.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col ".concat(y?"":"min-[900px]:flex-row"),children:[(0,n.jsxs)("aside",{"aria-label":"노드 팔레트",className:y?"flex shrink-0 items-center gap-2 border-b border-border px-2 py-1.5":"shrink-0 border-b border-border p-2 min-[900px]:w-44 min-[900px]:overflow-y-auto min-[900px]:border-b-0 min-[900px]:border-r",children:[(0,n.jsx)("p",{className:"text-[11px] text-muted-foreground ".concat(y?"shrink-0":"mb-1"),children:y?"눌러서 추가":(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("span",{className:"min-[900px]:hidden",children:"눌러서 추가"}),(0,n.jsx)("span",{className:"hidden min-[900px]:inline",children:"끌어 놓거나 눌러서 추가"})]})}),(0,n.jsx)("ul",{className:y?"flex min-w-0 gap-1 overflow-x-auto":"flex gap-1 overflow-x-auto min-[900px]:flex-col min-[900px]:overflow-visible",children:s.map(e=>{var t,r;return(0,n.jsx)("li",{className:"shrink-0",children:(0,n.jsxs)("button",{type:"button",draggable:!eZ,disabled:eZ,title:e.description||e.kind,"aria-label":"".concat(e.kind," 노드 추가"),onDragStart:t=>{t.dataTransfer.setData(Q,e.kind),t.dataTransfer.effectAllowed="copy"},onClick:()=>tr(e.kind),className:"flex w-full items-center gap-1 rounded border border-border bg-background px-2 py-1.5 text-left text-xs hover:bg-muted",style:{borderLeft:"4px solid ".concat(null!=(t=J[e.kind])?t:"#64748b")},children:[(0,n.jsx)("span",{"aria-hidden":!0,children:"+"}),e.kind,e.plugin&&(0,n.jsx)("small",{className:"rounded bg-accent/15 px-1 text-accent",children:e.plugin})]})},"".concat(null!=(r=e.plugin)?r:"core",":").concat(e.kind))})})]}),(0,n.jsxs)("div",{className:y?"flex min-h-0 flex-1 flex-col min-[900px]:flex-row":"contents",children:[(0,n.jsxs)("section",{ref:eS,"aria-label":"그래프 캔버스",className:"relative h-[56vh] min-h-[300px] shrink-0 bg-background min-[900px]:h-auto min-[900px]:min-w-0 min-[900px]:flex-1",onDragOver:e=>{Array.from(e.dataTransfer.types).includes(Q)&&(e.preventDefault(),e.dataTransfer.dropEffect="copy")},onDrop:e=>{var t,r;let n=e.dataTransfer.getData(Q);if(eZ||!n||!e2.includes(n))return;e.preventDefault();let a=null!=(r=null==(t=eN.current)?void 0:t.screenToFlowPosition({x:e.clientX,y:e.clientY}))?r:{x:40,y:40};tr(n,{x:a.x-85,y:a.y-30})},children:[0===z.nodes.length&&(0,n.jsx)("div",{className:"pointer-events-none absolute inset-0 z-10 flex items-center justify-center p-6 text-center text-sm text-muted-foreground",children:"빈 캔버스입니다. 팔레트에서 노드를 끌어 놓거나 눌러서 추가하세요."}),(0,n.jsxs)(i.Gc,{nodes:tu,edges:ti,nodeTypes:ee,edgeTypes:Z.T,onInit:e=>{eN.current=e},nodesDraggable:!eZ,nodesConnectable:!eZ,onNodesChange:function(e){for(let t of e){if("dimensions"===t.type&&t.dimensions){let{id:e,dimensions:r}=t;eP(t=>{var n,a;return(null==(n=t[e])?void 0:n.width)===r.width&&(null==(a=t[e])?void 0:a.height)===r.height?t:{...t,[e]:r}})}if("position"===t.type&&t.position&&z.nodes.some(e=>e.id===t.id)){let{id:e,position:r}=t;t.dragging&&(ez.current=!0),eZ||te(t=>(function(e,t,r,n){return{...e,nodes:e.nodes.map(e=>e.id===t?{...e,x:r,y:n}:e)}})(t,e,r.x,r.y))}}},onConnect:e=>{!eZ&&e.source&&e.target&&z.nodes.some(t=>t.id===e.source)&&z.nodes.some(t=>t.id===e.target)&&te(t=>I(t,e.source,e.target,E(t,e.source)))},onNodeMouseEnter:(e,t)=>el(t.id),onNodeMouseLeave:()=>el(null),onNodeClick:(e,t)=>{if("groupBox"!==t.type){if((0,v.Fi)(t.id)&&!z.nodes.some(e=>e.id===t.id))return void eJ(t.id.slice(v.EQ.length));eZ||eo({type:"node",id:t.id})}},onEdgeClick:(e,t)=>{if(eZ)return;let r=eq.edges[Number(t.id.slice(1))],n=r?z.edges.findIndex(e=>e.from===r.from&&e.to===r.to&&e.outcome===r.outcome):-1;n>=0&&eo({type:"edge",index:n})},onPaneClick:()=>eo(null),deleteKeyCode:null,fitView:!0,fitViewOptions:{padding:.12,maxZoom:1.1,minZoom:y?.6:.85},minZoom:.3,maxZoom:1.5,className:"!bg-background",style:et,children:[(0,n.jsx)(i.VS,{}),(0,n.jsx)(i.H2,{showInteractive:!1,position:"bottom-left"})]})]}),!eZ&&(!y||ea)&&(0,n.jsxs)("aside",{"aria-label":"속성",className:"shrink-0 overflow-y-auto border-t border-border p-3 text-xs min-[900px]:w-72 min-[900px]:border-l min-[900px]:border-t-0",children:[tf?(0,n.jsx)(en,{graph:z,nodeId:tf.id,palette:s,issues:e8.filter(e=>e.nodeId===tf.id),linkTarget:ey,linkOutcome:ej,setLinkTarget:ek,setLinkOutcome:ew,onEdit:te,onRenamed:e=>eo({type:"node",id:e}),onRemoved:()=>eo(null),installedPacks:N,effectiveSteps:er,onKnowledgePackChange:e=>{U(t=>({...t,[tf.id]:e})),null==R||R(e)}},tf.id):tx&&(null==ea?void 0:ea.type)==="edge"?(0,n.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,n.jsxs)("h2",{className:"text-sm font-semibold",children:["간선 ",(0,n.jsxs)("span",{className:"font-mono",children:[tx.from," → ",tx.to]})]}),(0,n.jsxs)("label",{className:"flex flex-col gap-1 text-muted-foreground",children:["결과 이름 (비우면 조건 없이 이어짐)",(0,n.jsx)("input",{"aria-label":"간선 결과",list:"graph-canvas-outcomes",value:tx.outcome,placeholder:"예: pass \xb7 fail",onChange:e=>te(t=>{var r,n;return r=ea.index,n={outcome:e.target.value},{...t,edges:t.edges.map((e,t)=>{var a;if(t!==r)return e;let o=(null!=(a=n.outcome)?a:e.outcome).trim(),{extra:s,...l}={...e,...n,outcome:o};return s&&!!o==!!e.outcome?{...l,extra:s}:l})}}),className:"rounded border border-border bg-background px-2 py-1 font-mono text-foreground"})]}),(0,n.jsx)("button",{type:"button",onClick:()=>{te(e=>_(e,ea.index)),eo(null)},className:"self-start rounded border border-red-500 px-2 py-1 text-red-500",children:"간선 삭제"})]}):(0,n.jsxs)("div",{className:"flex flex-col gap-2 text-muted-foreground",children:[(0,n.jsx)("h2",{className:"text-sm font-semibold text-foreground",children:"속성"}),(0,n.jsx)("p",{children:"노드를 누르면 id\xb7kind\xb7recipe 를 고칠 수 있습니다. 노드 오른쪽 점을 다른 노드로 끌거나, 노드를 고른 뒤 \xab다음 노드 연결\xbb 로 간선을 잇습니다."}),(0,n.jsxs)("p",{children:["노드 ",z.nodes.length," \xb7 간선 ",z.edges.length,z.entry?" \xb7 시작 ".concat(z.entry):""]})]}),tg.length>0&&(0,n.jsx)("ul",{"aria-label":"그래프 오류",className:"mt-3 flex flex-col gap-1 border-t border-border pt-2",children:tg.map((e,t)=>(0,n.jsx)("li",{className:"text-red-500",children:e.message},t))}),(0,n.jsxs)("details",{className:"mt-3 border-t border-border pt-2",children:[(0,n.jsx)("summary",{className:"cursor-pointer text-muted-foreground",children:"YAML 보기"}),(0,n.jsx)("pre",{"aria-label":"그래프 YAML",className:"mt-2 max-h-64 overflow-auto rounded bg-muted p-2 font-mono text-[11px] text-foreground",children:e5})]})]})]})]}),(0,n.jsxs)("p",{className:"shrink-0 px-3 py-1 text-[11px] text-muted-foreground",children:["배선도 디자인: ",(0,n.jsx)("a",{href:"https://malfoy-meme-making.vercel.app/wiring/index.html",target:"_blank",rel:"noopener noreferrer",className:"underline",children:"공냥이 AI 실험실"})]})]})}function en(e){var t,r,o,s,l,i,d;let{graph:u,nodeId:c,palette:p,issues:m,linkTarget:f,linkOutcome:x,setLinkTarget:g,setLinkOutcome:h,onEdit:b,onRenamed:v,onRemoved:y,installedPacks:k,effectiveSteps:j,onKnowledgePackChange:w}=e,N=u.nodes.find(e=>e.id===c),[S,C]=(0,a.useState)(N.id),[M,A]=(0,a.useState)(null),O=u.nodes.filter(e=>e.id!==c).map(e=>e.id),D=O.includes(f)?f:null!=(o=O[0])?o:"",V=null!=x?x:E(u,c),P=p.find(e=>e.kind===N.kind),G=u.edges.map((e,t)=>({edge:e,index:t})).filter(e=>{let{edge:t}=e;return t.from===c});function F(){let e=S.trim();if(e!==N.id)try{R(u,N.id,{id:e}),b(t=>R(t,N.id,{id:e})),A(null),v(e)}catch(e){A(e instanceof Error?e.message:String(e))}}return(0,n.jsxs)("div",{className:"flex flex-col gap-2",children:[(0,n.jsxs)("h2",{className:"text-sm font-semibold",children:["노드 ",(0,n.jsx)("span",{className:"font-mono",children:N.id})]}),(0,n.jsxs)("label",{className:"flex flex-col gap-1 text-muted-foreground",children:["id",(0,n.jsx)("input",{"aria-label":"노드 id",value:S,spellCheck:!1,onChange:e=>C(e.target.value),onBlur:F,onKeyDown:e=>{"Enter"===e.key&&F()},className:"rounded border border-border bg-background px-2 py-1 font-mono text-foreground"})]}),M&&(0,n.jsx)("p",{role:"alert",className:"text-red-500",children:M}),(0,n.jsxs)("label",{className:"flex flex-col gap-1 text-muted-foreground",children:["kind",(0,n.jsxs)("select",{"aria-label":"노드 kind",value:N.kind,onChange:e=>b(t=>R(t,c,{kind:e.target.value})),className:"rounded border border-border bg-background px-1 py-1 text-foreground",children:[!P&&(0,n.jsxs)("option",{value:N.kind,children:[N.kind," (팔레트에 없음)"]}),p.map(e=>{var t;return(0,n.jsxs)("option",{value:e.kind,children:[e.kind,e.plugin?" \xb7 ".concat(e.plugin):""]},"".concat(null!=(t=e.plugin)?t:"core",":").concat(e.kind))})]})]}),(null==P?void 0:P.description)&&(0,n.jsx)("p",{className:"text-[11px] text-muted-foreground",children:P.description}),k&&(null==j||null==(t=j[c])?void 0:t.step)==="knowledge-rag"&&(0,n.jsxs)("label",{className:"flex flex-col gap-1 text-muted-foreground",children:["지식(RAG) 팩",(0,n.jsxs)("select",{"aria-label":"지식(RAG) 팩",value:null!=(s=null==(r=j[c])?void 0:r.arg)?s:"",onChange:e=>null==w?void 0:w(e.target.value),className:"rounded border border-border bg-background px-1 py-1 text-foreground",children:[(0,n.jsx)("option",{value:"",disabled:!0,children:"팩 선택"}),k.map(e=>(0,n.jsxs)("option",{value:e.id,children:[e.title," (",e.id,")"]},e.id))]})]}),(0,n.jsxs)("label",{className:"flex flex-col gap-1 text-muted-foreground",children:["recipe",(0,n.jsx)("input",{"aria-label":"recipe",value:N.recipe,spellCheck:!1,onChange:e=>b(t=>R(t,c,{recipe:e.target.value})),className:"rounded border border-border bg-background px-2 py-1 font-mono text-foreground"})]}),(0,n.jsxs)("label",{className:"flex flex-col gap-1 text-muted-foreground",children:["최대 방문 (max_visits)",(0,n.jsx)("input",{"aria-label":"max_visits",type:"number",min:1,step:1,value:N.maxVisits,onChange:e=>b(t=>R(t,c,{maxVisits:Number(e.target.value)})),className:"w-24 rounded border border-border bg-background px-2 py-1 text-foreground"})]}),(0,n.jsxs)("label",{className:"flex items-center gap-2 text-foreground",children:[(0,n.jsx)("input",{type:"checkbox","aria-label":"끝 노드",checked:u.terminals.includes(c),onChange:e=>b(t=>z(t,c,e.target.checked))}),"끝 노드 (여기서 실행이 끝남)"]}),(0,n.jsxs)("div",{className:"flex flex-wrap gap-2",children:[u.entry===c?(0,n.jsx)("span",{className:"rounded bg-emerald-500/15 px-2 py-1 text-emerald-500",children:"시작 노드"}):(0,n.jsx)("button",{type:"button",onClick:()=>b(e=>e.nodes.some(e=>e.id===c)?{...e,entry:c}:e),className:"rounded border border-border px-2 py-1",children:"시작 노드로"}),(0,n.jsx)("button",{type:"button",onClick:()=>{b(e=>(function(e,t){var r,n;let a=e.nodes.filter(e=>e.id!==t);return{...e,entry:e.entry===t?null!=(n=null==(r=a[0])?void 0:r.id)?n:null:e.entry,terminals:e.terminals.filter(e=>e!==t),nodes:a,edges:e.edges.filter(e=>e.from!==t&&e.to!==t)}})(e,c)),y()},className:"rounded border border-red-500 px-2 py-1 text-red-500",children:"노드 삭제"})]}),(0,n.jsxs)("label",{className:"flex flex-col gap-1 border-t border-border pt-2 text-muted-foreground",children:["실패 시 다음 노드",(0,n.jsxs)("select",{"aria-label":"실패 시 다음 노드",value:null!==(l=null!=(d=null==(i=u.edges.find(e=>e.from===c&&"fail"===e.outcome))?void 0:i.to)?d:null)&&void 0!==l?l:"",onChange:e=>b(t=>(function(e,t,r){if(r===t)throw Error("실패 경로를 자기 자신으로 둘 수 없습니다");let n=e.edges.filter(e=>e.from!==t||"fail"!==e.outcome).map(e=>null===r||e.from!==t||e.outcome?e:{...e,outcome:"ok"});return{...e,edges:null===r?n:[...n,{from:t,to:r,outcome:"fail"}]}})(t,c,e.target.value||null)),className:"rounded border border-border bg-background px-1 py-1 font-mono text-foreground",children:[(0,n.jsx)("option",{value:"",children:"선택 안 함"}),O.map(e=>(0,n.jsx)("option",{value:e,children:e},e))]})]}),(0,n.jsxs)("fieldset",{className:"mt-1 flex flex-col gap-1 border-t border-border pt-2",children:[(0,n.jsx)("legend",{className:"text-muted-foreground",children:"다음 노드 연결"}),0===O.length?(0,n.jsx)("p",{className:"text-muted-foreground",children:"이을 다른 노드가 없습니다."}):(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-1",children:[(0,n.jsx)("select",{"aria-label":"연결할 노드",value:D,onChange:e=>g(e.target.value),className:"rounded border border-border bg-background px-1 py-1 font-mono text-foreground",children:O.map(e=>(0,n.jsx)("option",{value:e,children:e},e))}),(0,n.jsx)("input",{"aria-label":"연결 결과",list:"graph-canvas-outcomes",value:V,placeholder:"결과(비우면 조건 없음)",onChange:e=>h(e.target.value),className:"w-24 rounded border border-border bg-background px-2 py-1 font-mono text-foreground"}),(0,n.jsx)("button",{type:"button",onClick:()=>{b(e=>I(e,c,D,V)),h(null)},className:"rounded border border-border px-2 py-1",children:"연결"})]}),G.length>0&&(0,n.jsx)("ul",{className:"flex flex-col gap-1",children:G.map(e=>{let{edge:t,index:r}=e;return(0,n.jsxs)("li",{className:"flex items-center gap-2 font-mono",children:[(0,n.jsxs)("span",{children:["→ ",t.to,t.outcome?" (".concat(t.outcome,")"):""]}),(0,n.jsx)("button",{type:"button","aria-label":"".concat(t.to," 간선 삭제"),onClick:()=>b(e=>_(e,r)),className:"rounded px-1 text-red-500 hover:bg-red-500/10",children:"삭제"})]},r)})})]}),m.length>0&&(0,n.jsx)("ul",{"aria-label":"노드 오류",className:"flex flex-col gap-1 border-t border-border pt-2",children:m.map((e,t)=>(0,n.jsx)("li",{className:"text-red-500",children:e.message},t))})]})}let ea=e=>null!==e&&"object"==typeof e&&!Array.isArray(e);async function eo(e,t){try{let r=await e.startRunGraphRun(t);return"string"==typeof(null==r?void 0:r.runId)?{kind:"started",runId:r.runId}:{kind:"error",status:0,message:"런 id 가 없다"}}catch(r){if(!(r instanceof p.Iu))return{kind:"error",status:0,message:"데몬에 닿지 못했다"};let e=r.body;if(403===r.status)return{kind:"forbidden"};if(409===r.status&&ea(e)&&"string"==typeof e.error&&e.error.startsWith("peer-edit-"))return{kind:"peer-edit",message:"string"==typeof e.reason&&e.reason?e.reason:"상대가 바꾼 그래프 — 변경을 확인하고 승인해야 실행할 수 있다",..."peer-edit-unapproved"===e.error&&"string"==typeof e.version?{version:e.version}:{},..."string"==typeof e.editedBy?{editedBy:e.editedBy}:{}};if(422===r.status&&ea(e)&&Array.isArray(e.issues))return{kind:"not-runnable",issues:e.issues.filter(e=>"string"==typeof e)};let t=ea(e)&&"string"==typeof e.reason?e.reason:ea(e)&&"string"==typeof e.error?e.error:"";return{kind:"error",status:r.status,message:t}}}async function es(e,t,r){try{var n;return n=await e.getRunGraphRun(t,r),ea(n)&&"string"==typeof n.runId&&"string"==typeof n.status&&Array.isArray(n.path)&&Array.isArray(n.nodes)?n:null}catch(e){return null}}let el=new Set(["done","failed","budget-exceeded","awaiting-approval"]);function ei(e){return Object.fromEntries(Object.entries(function(e){let t={};for(let r of e.nodes){let e=r.startedAt&&r.endedAt?Math.max(0,Date.parse(r.endedAt)-Date.parse(r.startedAt)):void 0,n=r.ok?"done":"failed";t[r.nodeId]={status:n,...void 0!==e&&Number.isFinite(e)?{durationMs:e}:{},...r.error?{error:r.error}:{}}}return e.currentNode&&!el.has(e.status)&&(t[e.currentNode.nodeId]={status:"running"}),"awaiting-approval"===e.status&&e.currentNode&&(t[e.currentNode.nodeId]={status:"awaiting_approval"}),t}(e)).map(e=>{let[t,r]=e;return[t,r.status]}))}function ed(e){let{context:t,client:r,onStatus:o}=e,[s,l]=(0,a.useState)({kind:"idle"}),i=(0,a.useRef)(t.graphId),d=t.graphId?t.valid?t.saved?null:"저장한 뒤 실행할 수 있습니다 — 서버는 저장된 판을 돌립니다":"검증을 통과해야 실행할 수 있습니다":"그래프 id 가 없습니다";(0,a.useEffect)(()=>{i.current!==t.graphId&&(i.current=t.graphId,l({kind:"idle"}),o(void 0))},[t.graphId,o]);let u="running"===s.kind?s.runId:null,c="running"===s.kind&&null!==s.run&&el.has(s.run.status);(0,a.useEffect)(()=>{if(!u||c)return;let e=!1,n="running"===s.kind?s:null,a=setTimeout(async()=>{let a=await es(r,t.graphId,u);if(!e&&n){if(!a){let e=n.misses+1;l(e>=5?{kind:"refused",lines:["런 상태를 ".concat(e,"번 연속 읽지 못했습니다 — 데몬을 확인한 뒤 다시 실행하세요")]}:{...n,misses:e,tick:n.tick+1});return}if(Date.now()-n.since>18e4&&!el.has(a.status)){l({kind:"refused",lines:["데모 실행이 ".concat(Math.round(3),"분 넘게 끝나지 않습니다 — 원장이 \xab도는 중\xbb으로 남았을 수 있습니다(데몬 재시작 등)")]}),o(ei(a));return}l({...n,run:a,misses:0,tick:n.tick+1}),o(ei(a))}},1e3);return()=>{e=!0,clearTimeout(a)}},[u,c,s,r,t.graphId,o]);let p=async()=>{l({kind:"starting"}),o(void 0);let e=await eo(r,t.graphId);"started"===e.kind?l({kind:"running",runId:e.runId,run:null,misses:0,since:Date.now(),tick:0}):"not-runnable"===e.kind?l({kind:"refused",lines:e.issues}):"forbidden"===e.kind?l({kind:"refused",lines:["운영자만 실행할 수 있습니다"]}):"peer-edit"===e.kind?l({kind:"peer-edit",message:e.message,...e.version?{version:e.version}:{},...e.editedBy?{editedBy:e.editedBy}:{}}):l({kind:"refused",lines:["실행을 시작하지 못했습니다".concat(e.message?" — ".concat(e.message):"").concat(e.status?" (".concat(e.status,")"):"")]})},m=async()=>{if("peer-edit"===s.kind&&s.version&&r.approveRunGraph){l({...s,approving:!0});try{await r.approveRunGraph(t.graphId,s.version),l({kind:"idle"})}catch(e){l({...s,approving:!1,error:"승인 실패".concat(e instanceof Error?" — ".concat(e.message):"")})}}},f="starting"===s.kind||"running"===s.kind&&!c,x="running"===s.kind?s.run:null,g=(null==x?void 0:x.status)==="done"?"text-emerald-700 dark:text-emerald-400":x&&el.has(x.status)?"text-red-700 dark:text-red-400":"text-sky-700 dark:text-sky-400";return(0,n.jsxs)("span",{className:"flex min-w-0 flex-wrap items-center gap-2",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{p()},disabled:f||null!==d,title:null!=d?d:"저장된 그래프를 데모 레시피로 실행합니다",className:"rounded border border-sky-600/60 bg-sky-600/10 px-2.5 py-1 text-xs font-semibold text-sky-800 disabled:cursor-not-allowed disabled:opacity-50 dark:text-sky-300",children:"▶ 데모 실행"}),d&&"idle"===s.kind&&(0,n.jsx)("span",{className:"text-xs text-muted-foreground",children:d}),"starting"===s.kind&&(0,n.jsx)("span",{role:"status",className:"text-xs text-sky-700 dark:text-sky-400",children:"데모 실행 \xb7 시작하는 중"}),"running"===s.kind&&(0,n.jsx)("span",{role:"status","aria-live":"polite",className:"text-xs font-semibold ".concat(g),children:x?function(e){let t=e.path.length,r=t-new Set(e.path).size;switch(e.status){case"starting":return"데모 실행 \xb7 시작하는 중";case"running":return"데모 실행 \xb7 도는 중".concat(e.currentNode?" ".concat(e.currentNode.nodeId):""," \xb7 지난 노드 ").concat(e.nodes.length);case"done":return"데모 실행 \xb7 성공 \xb7 거친 노드 ".concat(t).concat(r?"(다시 지남 ".concat(r,")"):"");case"budget-exceeded":return"데모 실행 \xb7 방문 한도 초과".concat(e.path.at(-1)?" ".concat(e.path.at(-1)):""," — max_visits 를 늘려 저장하고 다시 실행");case"awaiting-approval":return"데모 실행 \xb7 승인 대기".concat(e.currentNode?" ".concat(e.currentNode.nodeId):"");default:{let t=[...e.nodes].reverse().find(e=>!e.ok);return"데모 실행 \xb7 실패".concat(t?" ".concat(t.nodeId):"").concat(e.error?" — ".concat(e.error):(null==t?void 0:t.error)?" — ".concat(t.error):"")}}}(x):"데모 실행 \xb7 시작하는 중"}),"refused"===s.kind&&(0,n.jsx)("span",{role:"alert",className:"text-xs font-semibold text-red-700 dark:text-red-400",children:s.lines.join(" \xb7 ")}),"peer-edit"===s.kind&&(0,n.jsxs)("span",{role:"alert",className:"text-xs font-semibold text-red-700 dark:text-red-400",children:[s.message,s.editedBy?" (".concat(s.editedBy,")"):"",s.error?" \xb7 ".concat(s.error):""]}),"peer-edit"===s.kind&&s.version&&r.approveRunGraph&&(0,n.jsx)("button",{type:"button",onClick:()=>{m()},disabled:!0===s.approving,title:"캔버스에서 상대의 변경을 확인한 뒤 승인하세요 — 승인하면 이 판을 실행할 수 있습니다",className:"rounded border border-red-600/60 px-2.5 py-1 text-xs font-semibold text-red-800 disabled:opacity-50 dark:text-red-300",children:"변경 확인 \xb7 승인"})]})}var eu=r(89858);let ec=["매일 아침 AI 뉴스 요약해서 텔레그램으로","PR 리뷰하고 문제 없으면 머지","조사해서 표로 정리하고 내가 승인하면 게시"];function ep(e){if("string"==typeof e)return e;if(e&&"object"==typeof e){let t="string"==typeof e.nodeId?e.nodeId:"string"==typeof e.path?e.path:"",r="string"==typeof e.message?e.message:JSON.stringify(e);return t?"".concat(t,": ").concat(r):r}return String(e)}async function em(e,t,r){if(!t.prompt.trim())return{kind:"empty"};try{let n=await e.graphWizard(t,r?{signal:r}:void 0);return ef(n)}catch(e){if((null==r?void 0:r.aborted)||e instanceof Error&&"AbortError"===e.name)return{kind:"cancelled"};if(e instanceof p.Iu){var n,a;if(404===e.status||405===e.status)return{kind:"unsupported"};if(422===e.status&&e.body&&"object"==typeof e.body&&"ok"in e.body)return ef(e.body);let t=null!=(n=e.body)?n:{};if(400===e.status&&(!t.reason||"prompt required"===t.reason))return{kind:"empty"};if(400===e.status)return{kind:"error",message:"요청을 받지 않았습니다 — ".concat(t.reason)};return{kind:"error",message:null!=(a=t.reason)?a:t.error?"".concat(t.error," (").concat(e.status,")"):"요청 실패 (".concat(e.status,")")}}return{kind:"error",message:e instanceof Error?e.message:String(e)}}}function ef(e){var t;let r,n=(null!=(t=e.issues)?t:[]).map(ep),a="string"==typeof e.yaml?e.yaml:"",o=null;if(a.trim()){try{o=V(a)}catch(e){r=e instanceof Error?e.message:String(e)}o&&0===o.nodes.length&&(o=null,r="초안에 노드가 없습니다")}else r="응답에 YAML 이 없습니다";return{kind:"draft",ok:!0===e.ok&&0===n.length,yaml:a,graph:o,issues:n,...r?{parseError:r}:{},...e.base?{base:e.base}:{},..."number"==typeof e.attempts?{attempts:e.attempts}:{},...e.summary?{summary:e.summary}:{},...e.labels&&"object"==typeof e.labels?{labels:Object.fromEntries(Object.entries(e.labels).filter(e=>"string"==typeof e[1]&&""!==e[1].trim()))}:{},...e.steps&&"object"==typeof e.steps&&!Array.isArray(e.steps)?{steps:e.steps}:{},..."string"==typeof e.baseReason&&e.baseReason.trim()?{baseReason:e.baseReason.trim()}:{}}}function ex(e){return e.baseReason?e.base?"기반: ".concat(e.base," — 이유 ").concat(e.baseReason):"기반 선택 이유: ".concat(e.baseReason):null}function eg(e){return"".concat(e.from,"->").concat(e.to,":").concat(e.outcome)}function eh(e){var t,r,o;let{client:s,current:l,laid:i,onApply:d,onRestore:u,initialPrompt:c,packId:p,className:m=""}=e,[f,x]=(0,a.useState)([]),[g,h]=(0,a.useState)(""),[b,v]=(0,a.useState)(null),[y,k]=(0,a.useState)(0),[j,w]=(0,a.useState)(!1),N=(0,a.useRef)(1),S=(0,a.useRef)(null),C=(0,a.useRef)(null),I=(0,a.useRef)(!1),E=(0,a.useRef)(f);E.current=f;let _=(0,a.useRef)(null);function R(e){let t=N.current++;return x(r=>[...r,{...e,id:t}]),t}async function z(e,t,r){let n=e.trim();if(b)return;if(!n)return void R({role:"assistant",text:"무엇을 만들지 한 줄로 적어 주세요.",tone:"warn"});let a=void 0!==t?t:l(),o=!a||0===a.graph.nodes.length,u=E.current.filter(e=>!e.undone&&(void 0===r||e.id<r)).map(e=>({role:e.role,text:e.text})),c=R({role:"user",text:n});h("");let m=new AbortController;v({startedAt:Date.now(),controller:m});try{var f,x,g,y;let e=await em(s,{...(y=o?null:a.yaml,{prompt:n.trim(),kind:"harness",...y?{currentYaml:y}:{},...u.length?{history:u.slice(-10).map(e=>({role:e.role,text:e.text}))}:{}}),...p?{packId:p}:{}},m.signal);if("cancelled"===e.kind)return void R({role:"assistant",text:"취소했습니다 — 캔버스는 그대로입니다.",tone:"warn"});if("unsupported"===e.kind)return void R({role:"assistant",text:"이 Daemon 이 아직 그래프 마법사를 지원하지 않습니다 — 서버 업데이트 후 다시 시도하세요",tone:"error"});if("empty"===e.kind)return void R({role:"assistant",text:"무엇을 만들지 한 줄로 적어 주세요.",tone:"warn"});if("error"===e.kind)return void R({role:"assistant",text:"만들기 실패: ".concat(e.message),tone:"error"});let t=o?null:a.graph,r=i?i():_.current;if(e.graph){let n=function(e,t){if(!t||0===t.nodes.length)return!1;if(!e)return!0;let r=new Map(e.nodes.map(e=>[e.id,e]));return t.nodes.some(e=>{let t=r.get(e.id);return!t||t.x!==e.x||t.y!==e.y})}(r,t),a=function(e,t){var r,n,a;let o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},s=null==(r=o.keepPositions)||r,l=new Map((null!=(n=null==e?void 0:e.nodes)?n:[]).map(e=>[e.id,e])),i=t.nodes.map(e=>{let t=s?l.get(e.id):void 0;return t?{...e,x:t.x,y:t.y}:e}),d=new Set((null!=(a=null==e?void 0:e.edges)?a:[]).map(eg));return{graph:{...t,nodes:i},added:{nodes:t.nodes.filter(e=>!l.has(e.id)).map(e=>e.id),edges:t.edges.filter(e=>!d.has(eg(e))).map(eg)}}}(t,e.graph,{keepPositions:n});d(a.graph,a.added,!n,e.labels,e.steps),(null==(f=(x=window).matchMedia)?void 0:f.call(x,"(max-width: 1023.98px)").matches)&&w(!0),_.current=a.graph}R({role:"assistant",text:null!=(g=e.summary)?g:o?"그래프 초안을 만들었습니다.":"그래프를 고쳤습니다.",tone:e.ok?"ok":e.graph?"warn":"error",status:function(e){let t=e.base?" \xb7 기반 템플릿 ".concat(e.base):"",r=void 0!==e.attempts?"(시도 ".concat(e.attempts,")"):"";return e.ok?"초안".concat(t," \xb7 검증 통과").concat(r):"초안".concat(t," \xb7 검증 실패 ").concat(e.issues.length,"건").concat(r)}(e),...ex(e)?{baseLine:ex(e)}:{},...e.issues.length?{issues:e.issues}:{},...e.parseError?{parseError:e.parseError}:{},...e.graph?{before:t,applied:!0,laidBefore:r,...e.steps?{steps:e.steps}:{}}:{},prompt:n,userId:c})}finally{v(null)}}function M(e){var t,r,n;let a=E.current.find(t=>t.id===e);if(!a||"assistant"!==a.role||!a.applied||a.undone)return;let o=[...E.current].reverse().find(t=>"assistant"===t.role&&t.applied&&!t.undone&&t.id<e);u(null!=(t=a.before)?t:null,o&&"assistant"===o.role?o.steps:void 0),_.current=null!=(r=a.laidBefore)?r:null;let s=null!=(n=a.userId)?n:e;x(e=>e.map(e=>e.id>=s?{...e,undone:!0}:e))}function O(){var e;h("검증 오류를 고쳐줘"),null==(e=C.current)||e.focus()}(0,eu.dJ)("graph-wizard"),(0,a.useEffect)(()=>{if(!b)return;k(0);let e=setInterval(()=>k(Math.floor((Date.now()-b.startedAt)/1e3)),1e3);return()=>clearInterval(e)},[b]),(0,a.useEffect)(()=>{let e=S.current;e&&"function"==typeof e.scrollTo&&e.scrollTo({top:e.scrollHeight})},[f,b,j]),(0,a.useEffect)(()=>{c&&!I.current&&(I.current=!0,z(c))},[c]);let D=null!=(o=null==(t=[...f].reverse().find(e=>"assistant"===e.role))?void 0:t.text)?o:"",V=null==(r=[...f].reverse().find(e=>"assistant"===e.role&&e.applied&&!e.undone))?void 0:r.id;return(0,n.jsxs)("aside",{"aria-label":"말로 만들기","data-testid":"graph-wizard-chat",className:"flex min-h-0 shrink-0 flex-col border-border bg-background ".concat(j?"":"max-lg:h-[38vh]"," max-lg:border-t lg:h-auto lg:w-[360px] lg:shrink-0 lg:border-l ").concat(m),children:[(0,n.jsxs)("header",{className:"flex items-center gap-2 border-b border-border px-3 py-2 text-sm",children:[(0,n.jsx)("strong",{className:"shrink-0",children:"말로 만들기"}),j&&D?(0,n.jsx)("span",{"data-testid":"wizard-collapsed-line",className:"min-w-0 truncate text-xs text-muted-foreground lg:hidden",children:D}):null,(0,n.jsx)("span",{className:"text-xs text-muted-foreground ".concat(j&&D?"max-lg:hidden":""),children:"말하면 노드와 간선이 생깁니다"}),(0,n.jsx)("button",{type:"button",onClick:()=>w(e=>!e),"aria-expanded":!j,className:"ml-auto shrink-0 whitespace-nowrap rounded px-2 py-0.5 text-xs text-muted-foreground hover:bg-muted lg:hidden",children:j?"펼치기":"접기"})]}),(0,n.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col ".concat(j?"max-lg:hidden":""),children:[(0,n.jsxs)("ol",{ref:S,className:"flex min-h-0 flex-1 flex-col gap-2 overflow-y-auto px-3 py-2 text-sm","aria-live":"polite",children:[0===f.length&&(0,n.jsxs)("li",{className:"text-xs text-muted-foreground",children:[(0,n.jsx)("p",{children:"만들고 싶은 일을 한 줄로 적으세요. 이어서 말하면 지금 그래프를 고칩니다."}),(0,n.jsx)("div",{className:"mt-2 flex flex-wrap gap-1.5",children:ec.map(e=>(0,n.jsx)("button",{type:"button",onClick:()=>{z(e)},disabled:null!==b,className:"rounded-full border border-border px-2.5 py-1 text-left text-foreground hover:bg-muted disabled:opacity-50",children:e},e))})]}),f.map(e=>"user"===e.role?(0,n.jsx)("li",{"data-role":"user",className:"max-w-[85%] self-end whitespace-pre-wrap break-words rounded-lg bg-primary/15 px-3 py-1.5 text-foreground ".concat(e.undone?"opacity-50 line-through decoration-muted-foreground/60":""),children:e.text},e.id):(0,n.jsxs)("li",{"data-role":"assistant","data-tone":e.tone,className:"rounded-lg border px-3 py-1.5 ".concat(e.undone?"opacity-50":""," ").concat("ok"===e.tone?"border-emerald-500/40":"warn"===e.tone?"border-amber-500/40":"border-red-500/40"),children:[(0,n.jsx)("p",{className:"error"===e.tone?"text-red-500":"text-foreground",children:e.text}),e.status&&(0,n.jsxs)("p",{"data-testid":"wizard-status",className:"mt-0.5 text-xs ".concat("ok"===e.tone?"text-emerald-500":"text-amber-500"),children:["ok"===e.tone?"✓ ":"✗ ",e.status]}),e.baseLine&&(0,n.jsx)("p",{"data-testid":"wizard-base",className:"mt-0.5 text-xs text-muted-foreground",children:e.baseLine}),e.parseError&&(0,n.jsxs)("p",{className:"mt-0.5 text-xs text-red-500",children:["초안을 캔버스에 올리지 못했습니다: ",e.parseError]}),e.issues&&(0,n.jsx)("ul",{"data-testid":"wizard-issues",className:"mt-1 list-disc pl-5 text-xs text-red-500",children:e.issues.map((e,t)=>(0,n.jsx)("li",{children:e},t))}),e.undone&&(0,n.jsx)("p",{className:"mt-0.5 text-xs text-muted-foreground",children:"되돌림"}),(0,n.jsxs)("div",{className:"mt-1 flex flex-wrap gap-1.5 text-xs",children:[e.applied&&!e.undone&&(0,n.jsx)("button",{type:"button",onClick:()=>M(e.id),disabled:null!==b,title:e.id===V?"이 답 전의 캔버스로":"이 답과 그 뒤의 답을 모두 되돌립니다",className:"rounded border border-border px-2 py-0.5 hover:bg-muted disabled:opacity-50",children:"되돌리기"}),e.prompt&&!e.undone&&(0,n.jsx)("button",{type:"button",onClick:()=>(function(e){var t;let r=E.current.find(t=>t.id===e);if(!r||"assistant"!==r.role||!r.prompt)return;let n=r.applied?r.before?{graph:r.before,yaml:A(r.before)}:null:void 0;M(e);let a=g.trim();z(a?"".concat(r.prompt,"\n추가 지시: ").concat(a):r.prompt,n,null!=(t=r.userId)?t:e)})(e.id),disabled:null!==b,title:"이 답을 되돌리고 같은 말(+ 입력창의 추가 지시)로 다시 만듭니다",className:"rounded border border-border px-2 py-0.5 hover:bg-muted disabled:opacity-50",children:"다시 만들기"}),e.issues&&!e.undone&&(0,n.jsx)("button",{type:"button",onClick:O,disabled:null!==b,className:"rounded border border-amber-500/50 px-2 py-0.5 text-amber-500 hover:bg-amber-500/10 disabled:opacity-50",children:"고쳐서 다시"})]})]},e.id)),b&&(0,n.jsxs)("li",{role:"status","data-testid":"wizard-pending",className:"rounded-lg border border-border px-3 py-2 text-xs text-muted-foreground",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("span",{className:"inline-block h-2 w-2 animate-pulse rounded-full bg-primary"}),(0,n.jsx)("span",{"data-testid":"wizard-phase",className:"text-foreground",children:y<4?"요청을 읽는 중…":y<12?"노드 구성 중…":y<22?"간선 잇는 중…":"검증하고 고치는 중…"}),(0,n.jsxs)("span",{className:"tabular-nums",children:[y,"초"]}),(0,n.jsx)("button",{type:"button",onClick:()=>b.controller.abort(),className:"ml-auto rounded border border-border px-2 py-0.5 text-foreground hover:bg-muted",children:"취소"})]}),(0,n.jsx)("div",{className:"mt-1.5 h-1 overflow-hidden rounded bg-muted","aria-hidden":!0,children:(0,n.jsx)("div",{className:"h-full rounded bg-primary transition-[width] duration-1000 ease-linear",style:{width:"".concat(Math.min(92,Math.round(100*(1-Math.exp(-y/15)))),"%")}})})]})]}),(0,n.jsxs)("form",{className:"flex items-end gap-2 border-t border-border px-3 py-2",onSubmit:e=>{e.preventDefault(),z(g)},children:[(0,n.jsx)("textarea",{ref:C,"aria-label":"만들고 싶은 일",value:g,rows:2,placeholder:"예: 매일 아침 AI 뉴스 요약해서 텔레그램으로",onChange:e=>h(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||e.nativeEvent.isComposing||(e.preventDefault(),z(g))},className:"min-h-[2.5rem] flex-1 resize-none rounded border border-border bg-background px-2 py-1.5 text-sm text-foreground"}),(0,n.jsx)("button",{type:"submit",disabled:null!==b,className:"rounded bg-primary px-3 py-2 text-sm text-primary-foreground disabled:opacity-50",children:"만들기"})]})]})]})}function eb(e){let{onStart:t}=e,[r,o]=(0,a.useState)(""),[s,l]=(0,a.useState)(null);function i(e){if(!e.trim())return void l("무엇을 만들지 한 줄로 적어 주세요.");l(null),t(e.trim())}return(0,n.jsxs)("section",{"aria-label":"말로 만들기","data-testid":"graph-wizard-entry",className:"border-b border-border bg-primary/5 px-4 py-3",children:[(0,n.jsx)("h2",{className:"text-sm font-semibold",children:"말로 만들기"}),(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"하고 싶은 일을 말하면 그래프 초안이 생깁니다. 이어서 말하며 고치세요."}),(0,n.jsxs)("form",{className:"mt-2 flex flex-col gap-2 min-[640px]:flex-row min-[640px]:items-end",onSubmit:e=>{e.preventDefault(),i(r)},children:[(0,n.jsx)("textarea",{"aria-label":"만들고 싶은 일",value:r,rows:2,onChange:e=>o(e.target.value),onKeyDown:e=>{"Enter"!==e.key||e.shiftKey||e.nativeEvent.isComposing||(e.preventDefault(),i(r))},placeholder:"예: PR 리뷰하고 문제 없으면 머지",className:"min-h-[2.5rem] flex-1 resize-none rounded border border-border bg-background px-2 py-1.5 text-sm text-foreground"}),(0,n.jsx)("button",{type:"submit",className:"rounded bg-primary px-4 py-2 text-sm text-primary-foreground",children:"만들기"})]}),s&&(0,n.jsx)("p",{role:"status",className:"mt-1 text-xs text-amber-500",children:s}),(0,n.jsx)("div",{className:"mt-2 flex flex-wrap gap-1.5 text-xs",children:ec.map(e=>(0,n.jsx)("button",{type:"button",onClick:()=>i(e),className:"rounded-full border border-border px-2.5 py-1 hover:bg-muted",children:e},e))})]})}var ev=r(66943);function ey(e){let{groups:t,onAdd:r}=e;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("strong",{children:"노드 팔레트"}),(0,n.jsx)("div",{className:"flex flex-wrap gap-4",children:t.map(e=>(0,n.jsxs)("section",{"aria-label":e.label,className:"min-w-0 flex-1",children:[(0,n.jsx)("h2",{className:"font-semibold",children:e.label}),(0,n.jsx)("div",{className:"flex flex-wrap items-center gap-2",children:e.kinds.map(t=>r?(0,n.jsxs)("button",{type:"button",title:t.description,"data-graph":t.graph,"aria-label":"".concat(e.label," ").concat(t.kind," 추가"),onClick:()=>r(t),className:"rounded border border-border px-2 py-0.5",children:[t.kind," ",t.plugin&&(0,n.jsx)("small",{children:t.plugin})]},"".concat(t.graph,":").concat(t.kind)):(0,n.jsxs)("span",{title:t.description,"data-graph":t.graph,className:"rounded border border-border px-2 py-0.5",children:[t.kind," ",t.plugin&&(0,n.jsx)("small",{children:t.plugin})]},"".concat(t.graph,":").concat(t.kind)))}),e.fallback&&(0,n.jsx)("p",{role:"status",className:"mt-1 text-warning",children:"어휘 목록을 불러오지 못해 코어 팔레트를 표시합니다."})]},e.graph))})]})}function ek(e){let{groups:t,onAdd:r}=e,a=t.reduce((e,t)=>e+t.kinds.length,0);return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("details",{className:"border-b border-border px-3 py-2 text-xs min-[640px]:hidden","aria-label":"노드 팔레트",children:[(0,n.jsxs)("summary",{className:"cursor-pointer",children:["노드 더하기 (",a,")"]}),(0,n.jsx)("div",{className:"mt-2",children:(0,n.jsx)(ey,{groups:t,onAdd:r})})]}),(0,n.jsx)("div",{className:"hidden border-b border-border px-3 py-2 text-xs min-[640px]:block","aria-label":"노드 팔레트",children:(0,n.jsx)(ey,{groups:t,onAdd:r})})]})}let ej={shared:function(e){let{data:t}=e;return(0,n.jsxs)("div",{className:"rounded border border-border bg-background px-3 py-2 text-xs","data-graph":t.graph,children:[(0,n.jsx)(i.h7,{type:"target",position:d.yX.Left}),(0,n.jsxs)("span",{children:["workflow"===t.graph?"작업 노드":"실행 단계 노드"," \xb7 ",t.kind]}),(0,n.jsx)("div",{className:"font-mono",children:t.id}),(0,n.jsx)(i.h7,{type:"source",position:d.yX.Right})]})}};function ew(e){let{groups:t,client:r}=e,[o,s]=(0,a.useState)([]),[l,d]=(0,a.useState)([]),[c,p]=(0,a.useState)({workflow:"",harness:""}),[m,f]=(0,a.useState)({workflow:"",harness:""}),[x,g]=(0,a.useState)({workflow:"",harness:""}),[h,b]=(0,a.useState)(!1);async function v(e,n){let a=c[e].trim();if(!a||!o.some(t=>t.graph===e))return void g(t=>({...t,[e]:"그래프 이름과 노드가 필요합니다."}));if("workflow"===e&&o.some(t=>{var r;return t.graph===e&&"subworkflow"===t.kind&&!(null==(r=t.workflow)?void 0:r.trim())}))return void g(t=>({...t,[e]:"subworkflow 참조 워크플로를 입력하세요."}));let s=function(e,t,r,n){let a=r.filter(t=>t.graph===e);if("workflow"===e){let e={name:t,nodes:[]};for(let t of a)e=t.kind.includes(":")?{...e,nodes:[...e.nodes,{id:t.id,kind:t.kind,inputs:{}}]}:"subworkflow"===t.kind?{...e,nodes:[...e.nodes,{id:t.id,kind:"subworkflow",workflow:t.workflow,inputs:{}}]}:(0,ev.iu)(e,t.kind,{id:t.id});return e={...e,nodes:e.nodes.map(e=>({...e,...n.filter(t=>t.to===e.id&&a.some(e=>e.id===t.from)).length?{depends_on:n.filter(t=>t.to===e.id&&a.some(e=>e.id===t.from)).map(e=>e.from)}:{}}))},(0,u.As)(e)}let o=S(t);for(let e of a)o=C(o,{kind:e.kind,id:e.id,x:e.x,y:e.y}).graph;return(o={...o,edges:n.filter(e=>a.some(t=>t.id===e.from)&&a.some(t=>t.id===e.to)).map(e=>({...e,outcome:""}))}).nodes.length&&(o=z(o,o.nodes[o.nodes.length-1].id,!0)),A(o)}(e,a,o,l);if("harness"===e){let r=O(V(s),t.find(t=>t.graph===e).kinds.map(e=>e.kind));if(!r.ok)return void g(t=>({...t,[e]:r.issues.map(e=>e.message).join(", ")}))}b(!0);try{let t=await r.validateGraph(e,s);if(!t.ok)return void g(r=>({...r,[e]:t.errors.map(e=>e.message).join(", ")}));n&&("workflow"===e?await r.saveWorkflow(a,{yaml:s,scope:"project"}):m.harness===a?await r.putRunGraphYaml(a,s):await r.createRunGraph(a,s),f(t=>({...t,[e]:a}))),g(t=>({...t,[e]:n?"저장했습니다.":"검증 통과"}))}catch(t){g(r=>({...r,[e]:t instanceof Error?t.message:String(t)}))}finally{b(!1)}}let y=o.map(e=>({id:e.id,type:"shared",position:{x:e.x,y:e.y},data:e})),k=l.map(e=>({id:"".concat(e.from,":").concat(e.to),source:e.from,target:e.to}));return(0,n.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col",children:[(0,n.jsx)(ek,{groups:t,onAdd:function(e){s(t=>{let r="".concat(e.graph,"-").concat(e.kind.split(":").pop().replace(/[^a-zA-Z0-9-]/g,"-")),n=1;for(;t.some(e=>e.id==="".concat(r,"-").concat(n));)n++;return[...t,{graph:e.graph,kind:e.kind,id:"".concat(r,"-").concat(n),x:40+t.length%5*210,y:40+130*Math.floor(t.length/5)}]})}}),o.filter(e=>"workflow"===e.graph&&"subworkflow"===e.kind).map(e=>{var t;return(0,n.jsxs)("label",{className:"px-3 py-1 text-xs",children:[e.id," 참조 워크플로",(0,n.jsx)("input",{"aria-label":"".concat(e.id," 참조 워크플로"),value:null!=(t=e.workflow)?t:"",onChange:t=>s(r=>r.map(r=>r.id===e.id?{...r,workflow:t.target.value}:r)),className:"ml-2 rounded border border-border bg-background px-2 py-1"})]},e.id)}),(0,n.jsx)("div",{className:"flex flex-wrap gap-4 border-b border-border px-3 py-2 text-xs",children:t.map(e=>(0,n.jsxs)("section",{"aria-label":"".concat(e.label," 검증과 저장"),children:[(0,n.jsxs)("label",{children:[e.label," 이름 ",(0,n.jsx)("input",{"aria-label":"".concat(e.label," 이름"),value:c[e.graph],onChange:t=>p(r=>({...r,[e.graph]:t.target.value})),className:"rounded border border-border bg-background px-2 py-1"})]}),(0,n.jsx)("button",{type:"button",disabled:h,onClick:()=>{v(e.graph,!1)},children:"검증"}),(0,n.jsx)("button",{type:"button",disabled:h,onClick:()=>{v(e.graph,!0)},children:"저장"}),x[e.graph]&&(0,n.jsx)("span",{role:"status",children:x[e.graph]})]},e.graph))}),(0,n.jsx)("div",{className:"min-h-[300px] flex-1","aria-label":"그래프 캔버스",children:(0,n.jsxs)(i.Gc,{nodes:y,edges:k,nodeTypes:ej,fitView:!0,onNodesChange:e=>{let t=new Set(e.filter(e=>"remove"===e.type).map(e=>e.id));s(r=>r.filter(e=>!t.has(e.id)).map(t=>{let r=e.find(e=>"position"===e.type&&e.id===t.id);return(null==r?void 0:r.type)==="position"&&r.position?{...t,...r.position}:t})),t.size&&d(e=>e.filter(e=>!t.has(e.from)&&!t.has(e.to)))},onEdgesChange:e=>{let t=new Set(e.filter(e=>"remove"===e.type).map(e=>e.id));t.size&&d(e=>e.filter(e=>!t.has("".concat(e.from,":").concat(e.to))))},onConnect:e=>{let t=o.find(t=>t.id===e.source),r=o.find(t=>t.id===e.target);t&&r&&t.id!==r.id&&t.graph===r.graph&&d(e=>e.some(e=>e.from===t.id&&e.to===r.id)?e:[...e,{from:t.id,to:r.id}])},children:[(0,n.jsx)(i.VS,{}),(0,n.jsx)(i.H2,{})]})})]})}function eN(e){var t;let{context:r,client:o}=e,[s,l]=(0,a.useState)(null),[i,d]=(0,a.useState)(""),[u,c]=(0,a.useState)("view"),[p,m]=(0,a.useState)(!1),f=r&&(t=r).saved&&t.graphId.trim()?t.graphId:null;async function x(){if(f&&i.trim()&&!p){m(!0),l(null);try{await U(o,f,i.trim(),u),l("".concat("edit"===u?"편집":"보기"," 권한을 부여하고 서버에서 확인했습니다."))}catch(e){l("권한 설정 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{m(!1)}}}return(0,a.useEffect)(()=>{l(null),d("")},[f]),(0,n.jsxs)("div",{className:"ml-auto flex flex-wrap items-center gap-2",children:[(0,n.jsxs)("label",{children:["공유용 그래프 토큰 ",(0,n.jsx)("input",{"aria-label":"공유용 그래프 토큰",autoComplete:"off",value:i,onChange:e=>{d(e.target.value),l(null)},className:"rounded border border-border px-2 py-1"})]}),(0,n.jsx)("button",{type:"button",onClick:()=>{d("eg_".concat(Array.from(crypto.getRandomValues(new Uint8Array(24)),e=>e.toString(16).padStart(2,"0")).join(""))),l(null)},className:"rounded border border-border px-2 py-1",children:"새 토큰 만들기"}),(0,n.jsx)("span",{children:"권한 설정 뒤 이 토큰과 그래프 ID를 상대에게 전달하세요. 상대는 Nexus 연결 토큰으로 이 값을 사용해 해당 그래프 API에 접근합니다. 목록\xb7실행은 공유되지 않습니다."}),(0,n.jsxs)("label",{children:["권한 ",(0,n.jsxs)("select",{"aria-label":"공유 권한",value:u,onChange:e=>{c(e.target.value),l(null)},children:[(0,n.jsx)("option",{value:"view",children:"보기"}),(0,n.jsx)("option",{value:"edit",children:"편집"})]})]}),"edit"===u&&(0,n.jsx)("span",{role:"note",className:"font-semibold text-red-700 dark:text-red-400",children:"상대가 바꾼 그래프를 실행하면 상대 명령이 이 기계에서 돈다 — 실행 전 승인 필요"}),(0,n.jsx)("button",{type:"button",onClick:()=>{x()},disabled:!f||!i.trim()||p,title:f?"그래프 접근 권한을 설정합니다":"저장 안 된 변경은 공유할 수 없습니다. 먼저 저장하세요",className:"rounded border border-border px-2 py-1 disabled:opacity-50",children:"권한 설정"}),s&&(0,n.jsx)("span",{role:"status",children:s})]})}function eS(){let e=(0,c.Qj)();return e?(0,n.jsx)(eC,{client:e}):(0,n.jsxs)("div",{className:"flex h-full min-h-0 flex-col",children:[(0,n.jsx)("header",{className:"border-b border-border px-4 py-2",children:(0,n.jsx)("h1",{className:"text-sm font-semibold",children:"편집기"})}),(0,n.jsx)("p",{className:"p-4 text-sm text-text-tertiary",children:"Daemon 연결이 설정되지 않았습니다. Settings 에서 Base URL 을 입력하세요."})]})}function eC(e){var t,r,i,d,u;let{client:c}=e,m=(0,l.useSearchParams)(),h="harness"===(null!=(i=null==m?void 0:m.get("mode"))?i:null)?"harness":"workflow",[b,v]=(0,a.useState)(h),[y,k]=(0,a.useState)(()=>(null==m?void 0:m.get("mode"))!=null);(0,a.useEffect)(()=>{v(h)},[h]);let j=(0,a.useCallback)(e=>{v(e),window.history.replaceState(null,"",function(e){let t=f.find(t=>t.graph===e);return"/app/editor/?mode=".concat(t.graph)}(e))},[]),w=(0,o.jE)(),[N,C]=(0,a.useState)(null),[I,E]=(0,a.useState)(null),[_,R]=(0,a.useState)(void 0),[z,M]=(0,a.useState)(""),A=(0,s.I)({queryKey:["graph-wizard-packs"],queryFn:()=>c.getGraphWizardPacks(),enabled:"harness"===b&&!!c.getGraphWizardPacks,retry:!1}),O=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:2600,[t,r]=(0,a.useState)(void 0),[n,o]=(0,a.useState)(void 0),[s,l]=(0,a.useState)({}),[i,d]=(0,a.useState)(void 0),u=(0,a.useRef)(null),c=(0,a.useRef)(0),p=(0,a.useRef)(null),m=(0,a.useRef)(!1),f=(0,a.useCallback)(e=>{u.current=e,m.current&&(p.current=e.graph,m.current=!1)},[]),x=(0,a.useCallback)(()=>p.current,[]),g=(0,a.useCallback)(()=>u.current?{graph:u.current.graph,yaml:u.current.yaml}:null,[]),h=(0,a.useCallback)(function(e,t){let n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],a=arguments.length>3?arguments[3]:void 0,s=arguments.length>4?arguments[4]:void 0;d(s&&Object.keys(s).length?s:void 0),a&&Object.keys(a).length&&l(e=>({...e,...a})),c.current+=1,m.current=!0,r({rev:c.current,graph:e,...n?{autoLayout:n}:{}}),o(t)},[]),b=(0,a.useCallback)((e,t)=>{var n,a;d(t&&Object.keys(t).length?t:void 0),c.current+=1,m.current=!0,r({rev:c.current,graph:null!=e?e:S(null!=(a=null==(n=u.current)?void 0:n.graphId)?a:"")}),o(void 0)},[]),v=(0,a.useCallback)(()=>{u.current=null,p.current=null,m.current=!1,r(void 0),o(void 0),l({}),d(void 0)},[]);return(0,a.useEffect)(()=>{if(!n)return;let t=setTimeout(()=>o(void 0),e);return()=>clearTimeout(t)},[n,e]),{replace:t,highlight:n,labels:s,steps:i,onChange:f,current:g,laid:x,apply:h,restore:b,reset:v}}(),[D,P]=(0,a.useState)(!1),G=(0,a.useCallback)(e=>{O.reset(),P(!!e.wizardPrompt),E(null),C({key:Date.now(),...e})},[O.reset]),F=null!=(d=null==m?void 0:m.get("wizard"))?d:null,T=(0,a.useRef)(null);(0,a.useEffect)(()=>{"harness"===b&&F&&T.current!==F&&(T.current=F,k(!0),G({saved:!1,wizardPrompt:F}))},[b,F,G]);let L=(0,a.useCallback)(e=>R(e),[]),B=(0,s.I)({queryKey:["graph-kinds","workflow"],queryFn:()=>c.getGraphKinds("workflow"),retry:!1}),K=(0,s.I)({queryKey:["graph-kinds","harness"],queryFn:()=>c.getGraphKinds("harness"),retry:!1}),U=(0,a.useMemo)(()=>{var e,t,r,n,a;return a=[...null!=(r=null==(e=B.data)?void 0:e.kinds)?r:[],...null!=(n=null==(t=K.data)?void 0:t.kinds)?n:[]],f.map(e=>{let{graph:t,label:r,fallbackKinds:n}=e,o=a.filter(e=>e.graph===t);return{graph:t,label:r,kinds:o.length?o:n.map(e=>({graph:t,kind:e,plugin:null,description:"",schema:{},core:!0})),fallback:0===o.length}})},[B.data,K.data]),Y=U.find(e=>e.graph===b).kinds,W=U.find(e=>e.graph===b).fallback,Z=e=>{e!==b&&(C(null),E(null),R(void 0),j(e)),k(!0)},q=(0,a.useCallback)(e=>{O.onChange(e),E(e)},[O.onChange]);return(0,n.jsxs)("div",{className:"flex h-full min-h-0 flex-col",children:[(0,n.jsxs)("header",{className:"flex items-center gap-3 border-b border-border px-4 py-2",children:[(0,n.jsx)("h1",{className:"text-sm font-semibold",children:"편집기"}),(0,n.jsx)("button",{type:"button","aria-pressed":!y,onClick:()=>{var e;k(!1),null==(e=window.history)||e.replaceState(null,"","/app/editor/")},children:"통합 캔버스"}),(0,n.jsx)("button",{type:"button","aria-pressed":y&&"workflow"===b,onClick:()=>Z("workflow"),children:"워크플로 목록"}),(0,n.jsx)("button",{type:"button","aria-pressed":y&&"harness"===b,onClick:()=>Z("harness"),children:"실행 그래프 목록"})]}),(0,n.jsx)("div",{className:y?"hidden":"flex min-h-0 flex-1 flex-col",children:(0,n.jsx)(ew,{groups:U,client:c})}),y&&(0,n.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col",children:[!("harness"===b&&N)&&(0,n.jsx)(eb,{onStart:e=>{j("harness"),G({saved:!1,wizardPrompt:e})}}),"workflow"===b?(0,n.jsx)(x.N,{palette:Y}):N?(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2 border-b border-border px-3 py-1.5 text-xs",children:[(0,n.jsx)("button",{type:"button",onClick:()=>{C(null),E(null),R(void 0)},children:"← 그래프 목록"}),(0,n.jsx)(eN,{context:I,client:c},N.key),W&&(0,n.jsx)("span",{role:"status",children:"어휘 목록을 불러오지 못해 코어 팔레트를 씁니다."})]}),(0,n.jsxs)("div",{className:"border-b border-border px-3 py-2 text-xs",children:[(0,n.jsx)("label",{htmlFor:"knowledge-pack",children:"지식(RAG) 노드 \xb7 설치된 팩"}),(0,n.jsxs)("select",{id:"knowledge-pack",value:z,onChange:e=>M(e.target.value),className:"ml-2 rounded border border-border bg-background px-2 py-1",children:[(0,n.jsx)("option",{value:"",children:"팩 사용 안 함"}),(null!=(u=null==(t=A.data)?void 0:t.packs)?u:[]).map(e=>(0,n.jsxs)("option",{value:e.id,children:[e.title," (",e.id,")"]},e.id))]}),A.isError&&(0,n.jsx)("span",{role:"status",children:"설치된 팩을 불러오지 못했습니다."})]}),(0,n.jsxs)("div",{className:"flex min-h-0 flex-1 flex-col lg:flex-row",children:[(0,n.jsx)("div",{className:"flex min-h-0 min-w-0 flex-1 flex-col max-lg:overflow-y-auto",children:(0,n.jsx)(er,{palette:Y,client:c,wizardMode:D,...N.graph?{initialGraph:N.graph,initialSaved:N.saved}:{},..._?{nodeStatus:_}:{},...O.replace?{replace:O.replace}:{},...O.highlight?{highlight:O.highlight}:{},nodeLabels:O.labels,...O.steps?{wizardSteps:O.steps}:{},onChange:q,installedPacks:null==(r=A.data)?void 0:r.packs,onKnowledgePackChange:M,renderActions:e=>(0,n.jsx)(ed,{context:e,client:c,onStatus:L}),onSaved:()=>{w.invalidateQueries({queryKey:["run-graphs"]})}},N.key)}),(0,n.jsx)(eh,{client:function(e){let t=e.graphWizard;return t?{graphWizard:(e,r)=>t(e,r)}:{graphWizard:async()=>{throw new p.Iu(404,"/v1/graphs/wizard",null)}}}(c),current:O.current,laid:O.laid,...z?{packId:z}:{},onApply:(e,t,r,n,a)=>{P(!0),O.apply(e,t,r,n,a)},onRestore:O.restore,...N.wizardPrompt?{initialPrompt:N.wizardPrompt}:{}},N.key)]})]}):(0,n.jsx)(g.F,{palette:Y,onNewGraph:()=>G({saved:!1}),onOpenInCanvas:(e,t)=>G({graph:V(t),saved:!0})})]})]})}function eI(){return(0,n.jsx)(a.Suspense,{fallback:(0,n.jsx)("p",{className:"p-4 text-sm",children:"편집기를 불러오는 중…"}),children:(0,n.jsx)(eS,{})})}},45695:(e,t,r)=>{"use strict";r.d(t,{C:()=>d,DaemonProvider:()=>u,Q:()=>c});var n=r(65863),a=r(24815),o=r(70086),s=r(89469),l=r(31324),i=r(16263);let d=(0,a.createContext)(null);function u(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[u,c]=(0,a.useState)(r),[p,m]=(0,a.useState)(""),[f]=(0,a.useState)(()=>new l.ki(r));(0,a.useEffect)(()=>{let e=(0,o.Fp)();c(e),f.updateConfig(e),m((0,s.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[f]),(0,a.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,o.Fp)();f.updateConfig(t),c(t),(0,i.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&m(t=>t===e.newValue?t:((0,i.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[f]);let x=e=>{c(t=>{let r={...t,...e};return(0,o.Qc)(e),f.updateConfig(r),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},g=e=>{m(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},h=(0,a.useMemo)(()=>({config:u,setConfig:x,client:f,sessionId:p,setSessionId:g}),[u,f,p]);return(0,n.jsx)(d.Provider,{value:h,children:t})}function c(){let e=(0,a.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},48720:()=>{},75058:(e,t,r)=>{"use strict";r.d(t,{EQ:()=>n,F8:()=>o,Fi:()=>a,Oc:()=>d,S0:()=>s,Vc:()=>i,ws:()=>l});let n="group:",a=e=>e.startsWith(n);function o(e){let t=new Map;for(let r of e.nodes){let e="string"==typeof r.group?r.group.trim():"";e&&t.set(r.node_id,e)}return t}function s(e){return[...new Set(o(e).values())]}function l(e,t){let r=o(e),a=e=>{let a=r.get(e);return a&&t.has(a)?"".concat(n).concat(a):e};if(![...r.values()].some(e=>t.has(e)))return{graph:e,resolve:a};let s=[],l=new Set;for(let t of e.nodes){let n=a(t.node_id);if(l.has(n))continue;if(l.add(n),n===t.node_id){s.push(t);continue}let o=r.get(t.node_id),i=e.nodes.filter(e=>r.get(e.node_id)===o);s.push({node_id:n,kind:"subgraph",recipe:"묶음 \xb7 노드 ".concat(i.length,"개"),max_visits:Math.max(...i.map(e=>e.max_visits)),group:o})}let i=[];for(let t of e.edges){let e=a(t.from);if(t.map){let r={};for(let[n,o]of Object.entries(t.map)){let t=a(o);t!==e&&(r[n]=t)}Object.keys(r).length&&i.push({from:e,...t.on?{on:t.on}:{},map:r})}else if(t.to){let r=a(t.to);r!==e&&i.push({from:e,to:r})}}let d=[];for(let e of i){let t=d.find(t=>t.from===e.from&&!!t.map==!!e.map&&(e.map||t.to===e.to));if(!t){d.push(e.map?{...e,map:{...e.map}}:e);continue}if(e.map&&t.map)for(let[r,a]of Object.entries(e.map))r in t.map?t.map[r]===a||Object.values(t.map).includes(a)||(t.map["".concat(r,"\xb7").concat(a.replace(n,""))]=a):t.map[r]=a}let u=a(e.entry_node),c=[...new Set(e.terminal_nodes.map(a))];return{graph:{...e,entry_node:u,terminal_nodes:c,nodes:s,edges:d},resolve:a}}function i(e,t){let r=new Map;for(let o of e){var n;let e=t.get(o.id);!e||a(o.id)||r.set(e,[...null!=(n=r.get(e))?n:[],o])}return[...r.entries()].map(e=>{let[t,r]=e,n=Math.min(...r.map(e=>e.position.x)),a=Math.min(...r.map(e=>e.position.y)),o=Math.max(...r.map(e=>e.position.x+e.width)),s=Math.max(...r.map(e=>e.position.y+e.height));return{id:"box:".concat(t),group:t,members:r.map(e=>e.id),x:n-18,y:a-18-26,width:o-n+36,height:s-a+36+26}})}function d(e){return e.includes("running")?"running":e.includes("failed")?"failed":e.includes("passed")?"passed":"pending"}},89469:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>s,f6:()=>a,oD:()=>o});let n="elanous.daemon.sessionId";function a(){return"undefined"!=typeof crypto&&"function"==typeof crypto.randomUUID?crypto.randomUUID():"s-".concat(Date.now().toString(36),"-").concat(Math.random().toString(36).slice(2,10))}function o(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(n,e),e):localStorage.getItem(n)}();if(e)return e;let t=a();return localStorage.setItem(n,t),t}function s(){let e=a();return localStorage.setItem(n,e),e}},89858:(e,t,r)=>{"use strict";r.d(t,{$5:()=>d,dJ:()=>u});var n=r(24815);let a=new Set,o=new Set;function s(e,t){if(t!==a.has(e))for(let r of(t?a.add(e):a.delete(e),o))r()}function l(){return a.size>0}function i(e){return o.add(e),()=>{o.delete(e)}}function d(){return(0,n.useSyncExternalStore)(i,l,()=>!1)}function u(e){let t=!(arguments.length>1)||void 0===arguments[1]||arguments[1];(0,n.useEffect)(()=>(s(e,t),()=>s(e,!1)),[e,t])}},92579:(e,t,r)=>{"use strict";r.d(t,{r:()=>s});var n=r(65863);let a={pending:"var(--border, #94a3b8)",running:"#f59e0b",passed:"var(--chart-2, #16a34a)",failed:"var(--destructive, #ef4444)"},o={pending:"대기",running:"도는 중",passed:"통과",failed:"실패"},s={groupBox:function(e){let{data:t}=e,r=a[t.state];return(0,n.jsx)("div",{"data-testid":"group-box-".concat(t.group),"data-state":t.state,className:"pointer-events-none rounded-xl border-2 border-dashed ".concat(t.unrecorded?"opacity-60":""),style:{width:t.width,height:t.height,borderColor:r,background:"color-mix(in srgb, ".concat(r," 6%, transparent)")},children:(0,n.jsxs)("div",{className:"pointer-events-auto flex items-center gap-2 px-2.5 py-1 text-xs",children:[(0,n.jsx)("span",{className:"font-mono font-semibold text-text-primary",children:t.group}),(0,n.jsx)("span",{className:"text-[11px]",style:{color:r},children:t.unrecorded?"기록 없음":o[t.state]}),(0,n.jsx)("span",{className:"text-[11px] text-text-tertiary",children:void 0===t.stepCount?"노드 ".concat(t.memberCount):"걸음 ".concat(t.stepCount)}),t.onCollapse&&(0,n.jsx)("button",{type:"button",onClick:e=>{var r;e.stopPropagation(),null==(r=t.onCollapse)||r.call(t,t.group)},className:"nodrag ml-auto rounded border border-border bg-background px-1.5 text-[11px] text-text-secondary",children:"접기"})]})})}}}},e=>{e.O(0,[1082,2573,6135,442,8260,5458,1085,9667,9398,1335,1324,9279,5415,8215,7569,5290,607,7358],()=>e(e.s=524)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8891],{1450:(e,t,s)=>{"use strict";function n(e){return e.metaKey||e.ctrlKey}function r(e){let t=e.key.toLowerCase();return!n(e)||e.shiftKey||e.altKey||"k"!==t?n(e)&&e.shiftKey&&!e.altKey&&"j"===t?e.fromEditable?null:"toggle-role-judge":n(e)&&e.shiftKey&&!e.altKey&&"m"===t?e.fromEditable?null:"toggle-voice":n(e)&&e.shiftKey&&!e.altKey&&"y"===t?e.fromEditable?null:"toggle-tts":"?"!==e.key||n(e)||e.altKey?null:e.fromEditable?null:"open-help":"focus-broadcast-input"}function a(e){var t;if(!e)return!1;let s=e.tagName;if(!s)return!1;if("INPUT"===s||"TEXTAREA"===s||"SELECT"===s)return!0;let n=null==(t=e.getAttribute)?void 0:t.call(e,"contenteditable");return""===n||"true"===n}s.d(t,{ZQ:()=>r,_i:()=>a,nm:()=>l});let l=[{id:"focus-broadcast-input",combo:"⌘K / Ctrl+K",effect:"Focus broadcast input"},{id:"toggle-role-judge",combo:"⌘⇧J / Ctrl+⇧J",effect:"Toggle role-judge backend"},{id:"toggle-voice",combo:"⌘⇧M / Ctrl+⇧M",effect:"Toggle voice mode (mic)"},{id:"toggle-tts",combo:"⌘⇧Y / Ctrl+⇧Y",effect:"Toggle TTS mute"},{id:"open-help",combo:"?",effect:"Open this help overlay"}]},43272:(e,t,s)=>{"use strict";s.d(t,{InsidePage:()=>P});var n=s(65863),r=s(24815),a=s(76072),l=s(1450);let i=[{id:"loop-agent",title:"루프 에이전트",oneLine:"일을 반복 관측하고 다음 행동을 고릅니다.",docs:["docs/manual/MANUAL-execution-and-landing-loops-2026-09-29.md"],code:["src/harness/mission-solve-loop.ts","src/mission-loop/composite-cycle.ts"]},{id:"graph-engineering",title:"그래프 엔지니어링",oneLine:"실행의 노드와 경로를 그래프로 읽습니다.",docs:["docs/manual/MANUAL-graph-operations-2026-09-10.md"],code:["src/self-implement/graph-templates.ts","src/self-implement/graph-authority.ts"]},{id:"pty-intelligence",title:"PTY 인텔리전스",oneLine:"에이전트가 터미널의 실행과 관측을 연결합니다.",docs:["docs/manual/MANUAL-external-agent-pty-missions-2026-08-11.md"],code:["src/self-dev/dev-cli.ts"]},{id:"harness",title:"받침 \xb7 하니스",oneLine:"구현과 검증이 지나가는 실행 받침입니다.",docs:["docs/TECH-harness-execution-anatomy-current-state-2026-08-10.md"],code:["src/self-implement/orchestrator.ts","src/self-dev/dev-cli.ts"]},{id:"mission-fabric",title:"미션 패브릭",oneLine:"들어온 일을 미션으로 정하고 실행에 잇습니다.",docs:["docs/manual/MANUAL-mission-fabric-integration-2026-09-03.md"],code:["src/mission-loop/composite-cycle.ts","src/harness/mission-solve-loop.ts"]},{id:"observation",title:"바닥 \xb7 관측\xb7인지\xb7힐링",oneLine:"본 것을 이해하고 스스로 고치는 바닥입니다.",docs:["docs/manual/MANUAL-self-cognition-observability-2026-07-14.md"],code:["src/self-implement/orchestrator.ts"]}];var o=s(25089);function d(e){let{entry:t}=e,[s,a]=(0,r.useState)(!1);return(0,n.jsxs)("details",{open:s,style:{minWidth:0,border:"1px solid #68788f",borderRadius:12,padding:18,background:"#16263b"},children:[(0,n.jsx)("summary",{onClick:e=>{e.preventDefault(),a(e=>!e)},style:{cursor:"pointer",fontWeight:700,overflowWrap:"anywhere"},children:(0,o.t)(t.title)}),(0,n.jsx)("p",{children:(0,o.t)(t.oneLine)}),(0,n.jsxs)("div",{children:[(0,n.jsx)("strong",{children:"문서"}),(0,n.jsx)("ul",{children:t.docs.map(e=>(0,n.jsx)("li",{style:{overflowWrap:"anywhere"},children:(0,o.t)(e)},e))}),(0,n.jsx)("strong",{children:"코드"}),(0,n.jsx)("ul",{children:t.code.map(e=>(0,n.jsx)("li",{style:{overflowWrap:"anywhere"},children:(0,o.t)(e)},e))})]})]})}function c(){return(0,n.jsxs)("div",{"data-architecture-scene":!0,style:{width:"100%",maxWidth:1600,margin:"auto",display:"grid",gap:20,fontSize:18},children:[(0,n.jsx)("h2",{style:{fontSize:28,margin:0},children:"엘라누스의 구조"}),(0,n.jsx)("div",{"aria-label":"메인",style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(min(100%, 240px), 1fr))",gap:16},children:i.slice(0,2).map(e=>(0,n.jsx)(d,{entry:e},e.id))}),(0,n.jsx)("div",{"aria-label":"받침",style:{display:"grid",gridTemplateColumns:"repeat(auto-fit, minmax(min(100%, 240px), 1fr))",gap:16},children:i.slice(2,4).map(e=>(0,n.jsx)(d,{entry:e},e.id))}),(0,n.jsx)("div",{"aria-label":"실행 이음",style:{width:"100%",maxWidth:480,justifySelf:"center"},children:(0,n.jsx)(d,{entry:i[4]})}),(0,n.jsx)("div",{"aria-label":"바닥",children:(0,n.jsx)(d,{entry:i[5]})})]})}var u=s(45695),p=s(79818);let m={currentMissionId:null,missions:{}},h=e=>null!==e&&"object"==typeof e&&!Array.isArray(e),f=e=>"string"==typeof e&&e.trim().length>0;function g(e){let t=e;if("string"==typeof t)try{t=JSON.parse(t)}catch(e){return null}if(!t||"object"!=typeof t||Array.isArray(t))return null;let s=t;if("wizard.step"!==s.category||"wizard.step"!==s.event||!s.data||"object"!=typeof s.data||Array.isArray(s.data))return null;let n=s.data;return"string"==typeof n.ts&&Number.isFinite(Date.parse(n.ts))&&"string"==typeof n.wizardId&&n.wizardId&&["request","research","draft","validate","install","done"].includes(n.step)&&"string"==typeof n.text?{ts:n.ts,wizardId:n.wizardId,step:n.step,text:n.text,...void 0===n.detail?{}:{detail:n.detail}}:null}function x(e,t){let s=e.logsStreamUrl({exactCategory:"wizard.step"});return s?(0,p.BX)(s,{events:{log:e=>{let s=g(e.data);s&&t(s)}}}):()=>{}}let y={currentRunId:null,runs:{}},b={start:"border-sky-400 bg-sky-500/15 text-sky-200",ok:"border-green-500 bg-green-500/15 text-green-300",fail:"border-red-500 bg-red-500/15 text-red-300"};function v(e){let{state:t,now:s,receivedAt:r,lastSettlement:a,lastActivityTs:l=null,activityStatus:i="loading",wizardSteps:d=[]}=e,c=t.currentRunId?t.runs[t.currentRunId]:null,u=!c||s-r>6e4,p=null==c?void 0:c.order.some(e=>"start"===c.nodes[e].phase),m=a&&!p&&s-a.receivedAt<15e3,h=a&&!p&&s-a.receivedAt>=15e3,f=c?Math.max(0,Math.floor((s-Date.parse(c.startedAt))/1e3)):0,g=c&&a?Math.max(0,Math.floor((Date.parse(a.ts)-Date.parse(c.startedAt))/1e3)):0,x=h?"fail"===a.phase?"실패 \xb7 ".concat(a.nodeId):"완료 \xb7 ".concat(g,"초"):null;return(0,n.jsxs)("section",{"aria-label":"라이브 트레이스",className:"min-w-0 space-y-6 p-6 text-lg leading-relaxed",children:[d.length>0&&(0,n.jsx)("ol",{"aria-label":"플러그인 마법사 흐름",children:d.map(e=>(0,n.jsxs)("li",{children:["마법사 ",e.step," \xb7 ",(0,o.t)(e.text)]},"".concat(e.wizardId,":").concat(e.step)))}),u?(0,n.jsxs)("div",{className:"space-y-4 text-muted-foreground",children:[(0,n.jsx)("p",{children:"지금 도는 런이 없습니다"}),(0,n.jsxs)("p",{role:"status",children:["마지막 활동: ",l&&Number.isFinite(Date.parse(l))?(0,n.jsxs)("time",{dateTime:l,children:[new Date(l).toLocaleString("ko-KR",{timeZone:"Asia/Seoul"})," KST"]}):"loading"===i?"확인 중":"unavailable"===i?"못 읽음":"기록 없음"]}),(0,n.jsx)("button",{type:"button",className:"rounded-lg border border-border px-5 py-3 text-lg",disabled:!0,children:"녹화 보기"})]}):(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("header",{className:"flex flex-wrap items-center gap-x-5 gap-y-2 break-all text-lg",children:[(0,n.jsx)("h2",{className:"font-semibold",children:c.graphId}),(0,n.jsxs)("span",{children:["런 ",c.runId.slice(0,6)]}),(0,n.jsxs)("span",{children:["경과 ",f,"초"]}),x&&(0,n.jsx)("span",{role:"status",children:x})]}),(0,n.jsxs)("div",{role:"list","aria-label":"노드 흐름",className:"flex flex-wrap gap-3",children:[m&&(0,n.jsx)("span",{className:"rounded-lg border border-border bg-muted px-3 py-1 text-sm text-muted-foreground",children:"다음 단계 준비 중"}),c.order.map(e=>{let t=c.nodes[e];return(0,n.jsxs)("div",{role:"listitem",className:"min-w-0 max-w-full break-all rounded-lg border px-5 py-3 ".concat(b[t.phase]),children:[(0,n.jsxs)("span",{className:"start"===t.phase?"animate-pulse":"",children:[t.nodeId," \xb7 ","start"===t.phase?"진행 중":"ok"===t.phase?"ok":"fail"]}),t.retries>0&&(0,n.jsxs)("span",{className:"ml-3","aria-label":"다시 ".concat(t.retries,"회"),children:["↻",t.retries]})]},e)})]})]})]})}function w(){let{client:e,config:t}=(0,u.Q)(),[s,a]=(0,r.useState)(()=>({client:e,baseUrl:t.baseUrl,token:t.token,state:y,receivedAt:0,lastSettlement:null,lastActivityTs:null,activityStatus:"loading"})),[l,i]=(0,r.useState)(0),[o,d]=(0,r.useState)([]),c=s.client===e&&s.baseUrl===t.baseUrl&&s.token===t.token;return(0,r.useEffect)(()=>{let s=!0;a({client:e,baseUrl:t.baseUrl,token:t.token,state:y,receivedAt:0,lastSettlement:null,lastActivityTs:null,activityStatus:"loading"}),d([]),e.listLogs({category:"graph.run",event:"node",limit:"1"}).then(n=>{s&&a(s=>{var r,a;if(s.client!==e||s.baseUrl!==t.baseUrl||s.token!==t.token)return s;let l=null==(a=n.logs)||null==(r=a[0])?void 0:r.ts,i="string"==typeof l&&Number.isFinite(Date.parse(l))?l:null,o=i&&(!s.lastActivityTs||Date.parse(i)>Date.parse(s.lastActivityTs))?i:s.lastActivityTs;return{...s,lastActivityTs:o,activityStatus:n.ok&&Array.isArray(n.logs)?"ready":"unavailable"}})}).catch(()=>{s&&a(s=>s.client===e&&s.baseUrl===t.baseUrl&&s.token===t.token?{...s,activityStatus:"unavailable"}:s)});let n=x(e,e=>{s&&d(t=>"request"===e.step?[e]:[...t.filter(t=>t.wizardId===e.wizardId),e].slice(-6))}),r=function(e,t){let s=e.logsStreamUrl({category:"graph.run"});return s?(0,p.BX)(s,{events:{log:e=>{let s=function(e){let t=e;if("string"==typeof t)try{t=JSON.parse(t)}catch(e){return null}if("object"!=typeof t||null===t||Array.isArray(t))return null;let s=t;if("graph.run"!==s.category||"node"!==s.event)return null;let n=s.data;return"object"!=typeof n||null===n||Array.isArray(n)?null:["graphId","runId","nodeId"].every(e=>"string"==typeof n[e]&&n[e].trim().length>0)&&("start"===n.phase||"ok"===n.phase||"fail"===n.phase)&&"string"==typeof s.ts&&Number.isFinite(Date.parse(s.ts))&&(void 0===n.seconds||"number"==typeof n.seconds&&Number.isFinite(n.seconds)&&!(n.seconds<0))?{kind:"node",graphId:n.graphId,runId:n.runId,nodeId:n.nodeId,phase:n.phase,ts:s.ts,...void 0===n.seconds?{}:{seconds:n.seconds}}:null}(e.data);s&&t(s)}}}):()=>{}}(e,n=>{if(!s)return;let r=Date.now();a(a=>{var l,i;if(!s)return a;let o=a.client===e&&a.baseUrl===t.baseUrl&&a.token===t.token,d=o?a.state:y,c=d.currentRunId===n.runId&&"start"!==n.phase&&(null==(i=d.runs[n.runId])||null==(l=i.nodes[n.nodeId])?void 0:l.phase)===n.phase,u=d.currentRunId!==n.runId&&d.runs[n.runId]?a.lastSettlement:"start"===n.phase||d.currentRunId!==n.runId?null:c?a.lastSettlement:{receivedAt:r,nodeId:n.nodeId,phase:n.phase,ts:n.ts},p=!o||!a.lastActivityTs||Date.parse(n.ts)>Date.parse(a.lastActivityTs)?n.ts:a.lastActivityTs;return{client:e,baseUrl:t.baseUrl,token:t.token,receivedAt:r,lastSettlement:u,lastActivityTs:p,activityStatus:o?a.activityStatus:"loading",state:function(e,t){var s,n,r,a;let l=Object.hasOwn(e.runs,t.runId)?e.runs[t.runId]:void 0,i=l&&Object.hasOwn(l.nodes,t.nodeId)?l.nodes[t.nodeId]:void 0,o={nodeId:t.nodeId,phase:t.phase,retries:(null!=(s=null==i?void 0:i.retries)?s:0)+("start"===t.phase&&i?1:0)},d={graphId:t.graphId,runId:t.runId,startedAt:null!=(n=null==l?void 0:l.startedAt)?n:t.ts,order:i?l.order:[...null!=(r=null==l?void 0:l.order)?r:[],t.nodeId],nodes:{...null==l?void 0:l.nodes,[t.nodeId]:o}};return{currentRunId:l&&null!=(a=e.currentRunId)?a:t.runId,runs:{...e.runs,[t.runId]:d}}}(d,n)}}),i(r)}),l=setInterval(()=>i(Date.now()),1e3);return()=>{s=!1,r(),n(),clearInterval(l)}},[e,t.baseUrl,t.token]),(0,n.jsx)(v,{state:c?s.state:y,now:l,receivedAt:s.receivedAt,lastSettlement:c?s.lastSettlement:null,lastActivityTs:c?s.lastActivityTs:null,activityStatus:c?s.activityStatus:"loading",wizardSteps:c?o:[]})}var j=s(3290),k=s(22430),I=s(64367);let A=I.DN.map(e=>({graph:"harness",kind:e,plugin:null,description:"",schema:{},core:!0})),S=I.CF.map(e=>({graph:"workflow",kind:e,plugin:null,description:"",schema:{},core:!0}));function N(){let{GraphEditor:e=j.F,WorkflowEditor:t=k.N}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},[s,a]=(0,r.useState)("harness");return(0,n.jsxs)("section",{"aria-label":"그래프 편집기",className:"flex h-full min-h-[640px] min-w-0 flex-col",children:[(0,n.jsx)("div",{role:"tablist","aria-label":"그래프 편집 모드",className:"flex shrink-0 gap-2 border-b border-border px-4 py-3",children:["harness","workflow"].map(e=>(0,n.jsx)("button",{type:"button",role:"tab",id:"inside-editor-tab-".concat(e),"aria-controls":"inside-editor-panel-".concat(e),"aria-selected":s===e,onClick:()=>a(e),className:"rounded-lg px-4 py-2 text-lg min-[1440px]:text-[22px] ".concat(s===e?"bg-accent/15 text-text-primary":"text-text-tertiary hover:bg-surface-elevated"),children:"harness"===e?"실행 그래프":"워크플로"},e))}),(0,n.jsx)("div",{id:"inside-editor-panel-harness",role:"tabpanel","aria-labelledby":"inside-editor-tab-harness",hidden:"harness"!==s,className:"harness"===s?"min-h-0 min-w-0 flex-1 overflow-x-auto":"hidden",children:(0,n.jsx)("div",{className:"flex h-full min-h-[640px] min-w-[700px] flex-col min-[700px]:min-w-0",children:(0,n.jsx)(e,{palette:A,initialGraphId:"self-implement"})})}),(0,n.jsx)("div",{id:"inside-editor-panel-workflow",role:"tabpanel","aria-labelledby":"inside-editor-tab-workflow",hidden:"workflow"!==s,className:"workflow"===s?"min-h-0 min-w-0 flex-1 overflow-x-auto":"hidden",children:(0,n.jsx)("div",{className:"flex h-full min-h-[640px] min-w-[700px] flex-col min-[700px]:min-w-0",children:(0,n.jsx)(t,{palette:S})})})]})}var T=s(14063);let D=/^\s*(승인|거부|반려|보류|허용|차단|중단|취소)(?=$|[\s.,!?;:])/;function z(e){let{decisions:t,now:s=Date.now()}=e,r=Object.values(t.missions).flat().filter(e=>"answer"===e.step).sort((e,t)=>Date.parse(t.ts)-Date.parse(e.ts)||t.seq-e.seq),a=r[0],l=a?Math.max(0,Math.floor((s-Date.parse(a.ts))/6e4)):null,i=r.flatMap(e=>{var t;let n=null==(t=D.exec(e.detail.answer))?void 0:t[1];return n&&s-Date.parse(e.ts)<3e5?[{item:e,outcome:n}]:[]});return(0,n.jsxs)("section",{"aria-label":"PTY 인텔리전스",className:"min-w-0 rounded-xl border border-slate-600 p-5 text-lg leading-relaxed min-[1440px]:text-[22px]",children:[(0,n.jsx)("h2",{className:"mb-5 font-semibold",children:"PTY 판단"}),0===i.length?(0,n.jsxs)("p",{role:"status",children:["지금 PTY 판단이 없습니다 — 마지막 판단 ",null===l?"기록 없음":"".concat(l,"분 전")]}):(0,n.jsx)("ol",{"aria-label":"최근 PTY 판단",className:"space-y-4",children:i.slice(0,3).map(e=>{let{item:t,outcome:s}=e;return(0,n.jsxs)("li",{className:"min-w-0 rounded-lg border border-slate-600 p-4",children:[(0,n.jsx)("time",{dateTime:t.ts,children:(0,o.t)(t.ts)})," \xb7 ",(0,o.t)(s)]},"".concat(t.missionId,":").concat(t.seq))})})]})}let U=[{step:"request",label:"요청"},{step:"research",label:"조사"},{step:"draft",label:"초안"},{step:"validate",label:"검증"},{step:"install",label:"설치"},{step:"done",label:"끝"}],C={done:"border-green-500 bg-green-500/15 text-green-300",now:"border-sky-400 bg-sky-500/15 text-sky-200",todo:"border-slate-500 bg-slate-500/15 text-slate-300",failed:"border-red-500 bg-red-500/15 text-red-300"},E={done:"완료",now:"진행 중",todo:"대기",failed:"실패"};function L(e){let{events:t}=e,s=function(e){if(0===e.length)return[];let t=e[e.length-1].wizardId,s=e.filter(e=>e.wizardId===t),n=s[s.length-1],r=U.findIndex(e=>e.step===n.step);return U.map((e,t)=>{let{step:a,label:l}=e,i=s.findLast(e=>e.step===a),o=(null==i?void 0:i.detail)!=null&&"object"==typeof i.detail&&!Array.isArray(i.detail)&&!1===i.detail.ok;return{step:a,label:l,state:"done"===n.step?"done":o?"failed":t<r?"done":t===r?"now":"todo",...i?{text:i.text,at:i.ts}:{}}})}(t);return(0,n.jsx)("section",{"aria-label":"마법사 → 마켓",className:"min-w-0 space-y-6 p-4 text-lg min-[1440px]:text-[22px]",children:0===s.length?(0,n.jsxs)("p",{children:["마법사가 아직 돌지 않았습니다 — ",(0,n.jsx)("code",{children:'elanous plugin make "<한 줄>"'})," 로 시작"]}):(0,n.jsx)("ol",{"aria-label":"마법사 단계",className:"grid grid-cols-1 gap-3 min-[900px]:grid-cols-6",children:s.map(e=>(0,n.jsxs)("li",{"data-wizard-step":e.step,"data-state":e.state,className:"min-w-0 rounded-xl border p-4 ".concat(C[e.state]),children:[(0,n.jsxs)("div",{className:"font-semibold",children:[e.label," ",(0,n.jsxs)("span",{className:"font-normal",children:["\xb7 ",E[e.state]]})]}),e.text&&(0,n.jsx)("p",{className:"mt-3 overflow-hidden text-ellipsis whitespace-nowrap",title:(0,o.t)(e.text),children:(0,o.t)(e.text)})]},e.step))})})}let M=e=>"".concat(e.wizardId,":").concat(e.step,":").concat(e.ts,":").concat(e.text);function K(){let{client:e}=(0,u.Q)(),[t,s]=(0,r.useState)(()=>({client:e,events:[]}));return(0,r.useEffect)(()=>{let t=!0;s({client:e,events:[]});let n=n=>{t&&n.length&&s(t=>({client:e,events:function(e,t){let s=new Map;for(let n of[...e,...t])s.set(M(n),n);return[...s.values()].sort((e,t)=>e.ts.localeCompare(t.ts)).slice(-50)}(t.client===e?t.events:[],n)}))},r=e.fetchJson;"function"==typeof r&&r.call(e,"/v1/logs?exactCategory=wizard.step&limit=".concat(50)).then(e=>{let t=null==e?void 0:e.logs;n(Array.isArray(t)?t.map(g).filter(e=>null!==e):[])}).catch(()=>{});let a=x(e,e=>n([e]));return()=>{t=!1,a()}},[e]),(0,n.jsx)(L,{events:t.client===e?t.events:[]})}let R=["문서 아키텍처","라이브 트레이스","루프 에이전트","그래프 편집기","마법사 → 마켓","PTY 인텔리전스"],q=R.length,O="elanous.inside.demo";function F(e){return null!==e&&/^[1-9]$/.test(e)&&Number(e)<=q?Number(e):1}function P(){let e=(0,a.useSearchParams)();return(0,n.jsx)(W,{search:e})}function W(e){let{search:t,liveTrace:s=(0,n.jsx)(w,{}),editorScene:a=(0,n.jsx)(N,{}),loopScene:i=(0,n.jsx)(T.p1,{}),wizardScene:d=(0,n.jsx)(K,{}),ptyScene:u=(0,n.jsx)(Y,{})}=e,[p,m]=(0,r.useState)(()=>F(t.get("scene"))),[h,f]=(0,r.useState)(()=>"1"===t.get("demo")),g=(0,r.useRef)(null),x=(0,r.useRef)(p),y=(0,r.useRef)(h);x.current=p,y.current=h;let b=(0,r.useCallback)(e=>{let t=new URL(window.location.href);for(let[s,n]of Object.entries(e))t.searchParams.set(s,n);window.history.replaceState(window.history.state,"",t.toString())},[]),v=(0,r.useCallback)(e=>{e<1||e>q||(x.current=e,m(e),b({scene:String(e)}))},[b]),j=(0,r.useCallback)(()=>{let e=!y.current;y.current=e,f(e),b({demo:e?"1":"0"});try{window.localStorage.setItem(O,e?"1":"0")}catch(e){}},[b]);return(0,r.useEffect)(()=>{let e=t.get("demo"),s="1"===e;if(null===e)try{s="1"===window.localStorage.getItem(O)}catch(e){}else try{window.localStorage.setItem(O,s?"1":"0")}catch(e){}y.current=s,f(s);let n=F(t.get("scene"));x.current=n,m(n)},[t]),(0,r.useEffect)(()=>{window.dispatchEvent(new window.Event("elanous:inside-demo"))},[h]),(0,r.useEffect)(()=>{let e=e=>{if(!(e.altKey||e.ctrlKey||e.metaKey||(0,l._i)(e.target))){if("ArrowLeft"===e.key||"ArrowRight"===e.key){e.preventDefault();let t="ArrowRight"===e.key?1:-1;v(Math.min(q,Math.max(1,x.current+t)))}else if("d"===e.key.toLowerCase())j();else if("f"===e.key.toLowerCase()){var t;"function"==typeof(null==(t=g.current)?void 0:t.requestFullscreen)&&g.current.requestFullscreen().catch(()=>{})}}};return window.addEventListener("keydown",e),()=>window.removeEventListener("keydown",e)},[v,j]),(0,n.jsxs)("main",{ref:g,"data-inside-page":!0,style:{width:"100%",minHeight:"100vh",minWidth:0,padding:20,boxSizing:"border-box",background:"#0c1828",color:"#f1f5fa",fontSize:18},children:[(0,n.jsx)("style",{children:'@media (min-width: 1440px) {\n [data-inside-page] h1 { font-size: 40px !important; }\n [data-inside-page] nav button { font-size: 22px !important; }\n [data-inside-page] [data-inside-scene="1"] [data-architecture-scene],\n [data-inside-page] [data-inside-scene="2"] section,\n [data-inside-page] [data-inside-scene="2"] header,\n [data-inside-page] [data-inside-scene="2"] button,\n [data-inside-page] [data-inside-scene="2"] .text-sm { font-size: 22px !important; }\n }'}),(0,n.jsxs)("header",{style:{display:"flex",alignItems:"center",gap:16},children:[(0,n.jsx)("h1",{style:{fontSize:28,margin:0},children:"엘라누스 안쪽"}),h&&(0,n.jsx)("span",{"aria-label":"시연 모드",style:{fontSize:18},children:"시연"})]}),(0,n.jsx)("nav",{"aria-label":"장면 선택",style:{display:"flex",minHeight:48,overflowX:"auto",gap:8,margin:"18px 0",whiteSpace:"nowrap"},children:R.map((e,t)=>(0,n.jsx)("button",{type:"button","aria-current":p===t+1?"page":void 0,onClick:()=>v(t+1),style:{flexShrink:0,minHeight:48,padding:"8px 16px",fontSize:18,borderRadius:8,border:"1px solid #7188a5",color:"#fff",background:p===t+1?"#22558b":"#203147"},children:(0,o.t)("".concat(t+1," ").concat(e))},e))}),R.map((e,t)=>(0,n.jsx)("section",{"data-inside-scene":t+1,hidden:p!==t+1,"aria-label":(0,o.t)("".concat(t+1," ").concat(e)),style:{minWidth:0},children:0===t?(0,n.jsx)(c,{}):1===t?s:2===t?i:3===t?a:4===t?d:u},e))]})}function Y(){let{client:e}=(0,u.Q)(),[t,s]=(0,r.useState)(()=>({client:e,decisions:m})),[a,l]=(0,r.useState)(()=>Date.now());return(0,r.useEffect)(()=>{let e=setInterval(()=>l(Date.now()),6e4);return()=>clearInterval(e)},[]),(0,r.useEffect)(()=>{let t=!0;s({client:e,decisions:m});let n=function(e,t){let s=e.logsStreamUrl({exactCategory:"pty.decision"});return s?(0,p.BX)(s,{events:{log:e=>{let s;try{s=JSON.parse(e.data)}catch(e){return}if(!s||"object"!=typeof s||Array.isArray(s))return;let n=s;if("pty.decision"!==n.category)return;let r=function(e){if(!h(e))return null;let{ts:t,missionId:s,seq:n,sessionId:r,terminalId:a,agent:l,step:i,text:o,detail:d}=e;if(!f(t)||!Number.isFinite(Date.parse(t))||!f(s)||!Number.isSafeInteger(n)||n<0||!f(r)||!f(a)||!f(l)||!f(o)||void 0!==d&&!h(d)||h(d)&&(void 0!==d.keys&&"string"!=typeof d.keys||void 0!==d.row&&(!Number.isSafeInteger(d.row)||d.row<0)))return null;let c={ts:t,missionId:s,seq:n,sessionId:r,terminalId:a,agent:l,text:o},u=h(d)?{...void 0!==d.keys?{keys:d.keys}:{},...void 0!==d.row?{row:d.row}:{}}:{};return"answer"===i?h(d)&&f(d.question)&&f(d.answer)?{...c,step:i,detail:{...u,question:d.question,answer:d.answer}}:null:"recover"===i?h(d)&&f(d.blocked)&&f(d.action)?{...c,step:i,detail:{...u,blocked:d.blocked,action:d.action}}:null:"done"===i?h(d)&&h(d.result)&&f(d.result.ref)&&("pr"===d.result.kind||"file"===d.result.kind||"text"===d.result.kind)?{...c,step:i,detail:{...u,result:{kind:d.result.kind,ref:d.result.ref}}}:null:"read"===i||"judge"===i||"input"===i?{...c,step:i,...void 0!==d?{detail:u}:{}}:null}(n.data);r&&n.event===r.step&&t(r)}}}):()=>{}}(e,n=>{t&&s(t=>({client:e,decisions:function(e,t){let s=Object.hasOwn(e.missions,t.missionId)?e.missions[t.missionId]:[];if(s.some(e=>e.seq===t.seq))return e;let n=[...s,t].sort((e,t)=>e.seq-t.seq),r={...e.missions,[t.missionId]:n},a=e.currentMissionId?r[e.currentMissionId]:void 0,l=n.at(-1),i=null==a?void 0:a.at(-1);return{missions:r,currentMissionId:!i||Date.parse(l.ts)>Date.parse(i.ts)?t.missionId:e.currentMissionId}}(t.client===e?t.decisions:m,n)}))});return()=>{t=!1,n()}},[e]),(0,n.jsx)(z,{decisions:t.client===e?t.decisions:m,now:a})}},86139:(e,t,s)=>{Promise.resolve().then(s.bind(s,43272))}},e=>{e.O(0,[1082,2573,442,8260,5458,1085,9667,9398,1335,1324,9279,7886,5415,8215,7569,4063,5290,607,7358],()=>e(e.s=86139)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3141],{6930:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>I});var n=a(65863),r=a(24815),l=a(85458),s=a(7413),i=a(82963),o=a(27346),d=a(71733),c=a(55210),u=a(52132),x=a(6416),m=a(15991),h=a(41893);let p={PLAN:"text-sky-600 dark:text-sky-400",ROUTE:"text-violet-600 dark:text-violet-400",VERIFY:"text-amber-600 dark:text-amber-400",HEAL:"text-emerald-600 dark:text-emerald-400",ESCALATE:"text-rose-600 dark:text-rose-400",SHIP:"text-green-700 dark:text-green-400 font-semibold"};function g(e){let{board:t,lines:a,mode:r,onSelectRun:l,selectedRunId:s,role:i="owner"}=e,o="max"===r,d="owner"===i,u=t.gauges,{snapshot:x}=t,m=d?0:t.stream.filter(e=>null!=e.why&&(0,c.Yu)(e.why)).length;return(0,n.jsxs)("div",{className:(0,h.cn)("space-y-4",o&&"live-max"),"data-live-mode":r,children:[(0,n.jsxs)("div",{className:"grid grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-6",children:[(0,n.jsx)(v,{label:"LIVE",hint:"도는 런",value:String(u.live),tone:u.live>0?"live":"idle",max:o}),(0,n.jsx)(v,{label:"DECISIONS/MIN",hint:"판단 ".concat(u.decisions,"건"),value:String(u.decisionsPerMin),max:o}),(0,n.jsx)(v,{label:"SHIPPED",hint:"병합\xb7PR",value:String(u.shipped),tone:"ok",max:o}),(0,n.jsx)(v,{label:"SELF-HEAL",hint:u.selfHealRuns?"수리 런 ".concat(u.selfHealRuns):"수리 런 없음",value:null===u.selfHealRate?"—":"".concat(u.selfHealRate,"%"),max:o}),(0,n.jsx)(v,{label:"BURN",hint:"토큰/분",value:f(u.burnTokensPerMin),max:o}),(0,n.jsx)(v,{label:"BLOCKED",hint:"막힌 런",value:String(x.counters.blocked),tone:x.counters.blocked?"bad":"idle",max:o})]}),(0,n.jsxs)("section",{className:"space-y-2","aria-label":"런",children:[(0,n.jsxs)("h2",{className:"text-sm font-medium",children:["런 ",(0,n.jsxs)("span",{className:"text-xs text-muted-foreground",children:["최근 ",x.windowMinutes,"분 \xb7 ",x.runs.length]})]}),0===x.runs.length?(0,n.jsx)("p",{className:"rounded-md border border-dashed p-4 text-sm text-muted-foreground","data-live-empty":!0,children:"지금 이 창에 런 신호가 없습니다 — 텔레그램이나 Intake 로 한 줄 보내면 여기에 런이 뜹니다."}):(0,n.jsx)("ul",{className:"space-y-1.5",children:x.runs.slice(0,12).map(e=>(0,n.jsx)(b,{run:e,round:t.rounds[e.runId],max:o,selected:e.runId===s,onSelect:l,owner:d},e.runId))})]}),(0,n.jsxs)("div",{className:"grid gap-4 lg:grid-cols-5",children:[(0,n.jsxs)("section",{className:"space-y-2 lg:col-span-3","aria-label":"판단 스트림",children:[(0,n.jsxs)("h2",{className:"flex flex-wrap items-center gap-2 text-sm font-medium",children:["판단 스트림",c.jg.map(e=>(0,n.jsx)("span",{className:(0,h.cn)("text-[11px] lg:text-[10px] font-mono",p[e]),children:e},e))]}),0===t.stream.length?(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"이 창에 판단 신호가 없습니다."}):(0,n.jsx)("ul",{className:"max-h-80 space-y-1 overflow-auto rounded-md border p-2 font-mono text-[11px]","data-live-stream":!0,children:t.stream.slice(0,40).map((e,t)=>(0,n.jsxs)("li",{className:(0,h.cn)("leading-relaxed",o&&0===t&&"live-line-in",o&&"SHIP"===e.kind&&"live-ship"),children:[(0,n.jsxs)("span",{className:"text-muted-foreground",children:[(0,n.jsx)("span",{title:e.ts,children:(0,c.qo)(e.ts)})," "]}),(0,n.jsxs)("span",{className:p[e.kind],children:["[",e.kind,"]"]})," ",d?e.what:(0,c.hS)(e.what.replace(/run-[0-9a-f]{8}-[^\s]*/gi,""),i),e.why&&(0,n.jsxs)("span",{className:"text-muted-foreground",children:[" \xb7 왜: ",(0,c.hS)(e.why,i)]}),e.purpose&&(0,n.jsxs)("span",{className:"text-muted-foreground",children:[" \xb7 목적: ",e.purpose]}),e.target&&(0,n.jsxs)("span",{className:"text-muted-foreground",children:[" → ",e.target]})]},"".concat(e.ts,"-").concat(t)))})]}),(0,n.jsxs)("section",{className:"space-y-2 lg:col-span-2","aria-label":"성적표",children:[(0,n.jsx)("h2",{className:"text-sm font-medium",children:"모델 성적표"}),0===t.scorecard.length?(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"이 창에 모델 요청이 없습니다."}):(0,n.jsxs)("table",{className:"w-full text-[11px]",children:[(0,n.jsx)("thead",{children:(0,n.jsxs)("tr",{className:"text-muted-foreground",children:[(0,n.jsx)("th",{className:"text-left font-normal",children:"모델"}),(0,n.jsx)("th",{className:"text-right font-normal",children:"요청"}),(0,n.jsx)("th",{className:"text-right font-normal",children:"토큰"}),(0,n.jsx)("th",{className:"text-right font-normal",children:"과금"})]})}),(0,n.jsx)("tbody",{children:t.scorecard.slice(0,8).map(e=>{var t;return(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{className:"truncate",children:e.model}),(0,n.jsx)("td",{className:"text-right tabular-nums",children:e.requests}),(0,n.jsx)("td",{className:"text-right tabular-nums",children:f(e.tokens)}),(0,n.jsx)("td",{className:"text-right text-muted-foreground",children:null!=(t=e.billing)?t:"—"})]},e.model)})})]}),(0,n.jsx)("h2",{className:"pt-2 text-sm font-medium",children:"리뷰 판정"}),(0,n.jsx)(j,{items:x.reviewVerdicts,max:o})]})]}),(0,n.jsxs)("div",{className:"grid gap-4 lg:grid-cols-2",children:[d?(0,n.jsxs)("section",{className:"space-y-2","aria-label":"흐르는 로그",children:[(0,n.jsx)("h2",{className:"text-sm font-medium",children:"흐르는 로그"}),(0,n.jsx)("pre",{className:"max-h-60 overflow-auto rounded-md border bg-muted/30 p-2 text-[11px] leading-relaxed","data-live-log":!0,children:a.slice(0,60).join("\n")||"—"})]}):m>0?(0,n.jsxs)("p",{className:"text-xs text-muted-foreground","data-live-folded-errors":!0,children:["오류 ",m,"건 접힘"]}):null,(0,n.jsxs)("section",{className:"space-y-2","aria-label":"빈 칸 표",children:[(0,n.jsxs)("h2",{className:"text-sm font-medium",children:["빈 칸 표 ",(0,n.jsx)("span",{className:"text-xs text-muted-foreground",children:"판단 로그에 없는 칸"})]}),0===t.missing.length?(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"빈 칸 없음."}):(0,n.jsx)("table",{className:"w-full text-[11px]","data-live-missing":!0,children:(0,n.jsx)("tbody",{children:t.missing.slice(0,10).map(e=>(0,n.jsxs)("tr",{children:[(0,n.jsx)("td",{className:"font-mono",children:e.key}),(0,n.jsx)("td",{className:"text-right tabular-nums",children:e.count}),(0,n.jsx)("td",{className:"pl-2 text-muted-foreground",children:e.lacks.join(" \xb7 ")})]},e.key))})})]})]})]})}function f(e){return e>=1e6?"".concat((e/1e6).toFixed(1),"M"):e>=1e3?"".concat((e/1e3).toFixed(e>=1e5?0:1),"k"):String(e)}function v(e){let{label:t,hint:a,value:r,tone:l="idle",max:s}=e;return(0,n.jsxs)("div",{className:(0,h.cn)("rounded-lg border p-3","live"===l&&"border-primary/50","bad"===l&&"border-error/50","ok"===l&&"border-green-600/40",s&&"live-gauge",s&&"live"===l&&"live-glow"),children:[(0,n.jsx)("div",{className:"font-mono text-[11px] lg:text-[10px] tracking-wider text-muted-foreground",children:t}),(0,n.jsx)("div",{className:(0,h.cn)("text-2xl font-semibold tabular-nums",s&&"live-count"),"data-live-gauge":t,children:r}),(0,n.jsx)("div",{className:"text-[11px] lg:text-[10px] text-muted-foreground",children:a})]})}function b(e){let{run:t,round:a,max:r,selected:l,onSelect:s,owner:i}=e;return(0,n.jsx)("li",{children:(0,n.jsxs)("button",{type:"button","data-live-run":t.runId,onClick:()=>null==s?void 0:s(t.runId),className:(0,h.cn)("flex w-full items-center gap-3 rounded-md border px-3 py-2 text-left text-xs hover:bg-muted/40",l&&"ring-1 ring-primary"),children:[(0,n.jsx)("span",{className:"w-24 shrink-0 truncate font-mono text-[11px] text-muted-foreground",children:i?t.runId.replace(/^run-/,"").slice(0,8):"런"}),(0,n.jsx)("span",{className:"flex flex-1 gap-1","aria-label":"단계",children:c.lV.map(e=>{let a=t.stages[e],l=t.current===e;return(0,n.jsx)("span",{title:"".concat(c.fQ[e]," \xb7 ").concat(null!=a?a:"신호 없음"),"data-stage":e,"data-tone":null!=a?a:"none",className:(0,h.cn)("h-2 flex-1 rounded-full bg-muted","info"===a&&"bg-primary/60","ok"===a&&"bg-green-600","bad"===a&&"bg-error",r&&l&&"bad"!==a&&"live-pulse",r&&l&&"bad"===a&&"live-pulse-bad")},e)})}),(0,n.jsx)("span",{className:"w-14 shrink-0 text-right font-mono text-[11px] lg:text-[10px] text-muted-foreground",children:a?"R ".concat(a,"/3"):""}),(0,n.jsx)("span",{className:"w-24 shrink-0 text-right text-[11px]",children:t.blocked?(0,n.jsx)("span",{className:"text-error",children:"막힘"}):"ok"===t.stages.land?(0,n.jsxs)("span",{className:"text-green-700",children:["착지",t.pr?" #".concat(t.pr):""]}):t.current?c.fQ[t.current]:""})]})})}function j(e){let{items:t,max:a}=e,r=Math.max(1,...t.map(e=>e.count));return 0===t.length?(0,n.jsx)("div",{className:"text-[11px] text-muted-foreground",children:"—"}):(0,n.jsx)("ul",{className:"space-y-1",children:t.slice(0,6).map(e=>(0,n.jsxs)("li",{className:"flex items-center gap-2 text-[11px]",children:[(0,n.jsx)("span",{className:"w-24 shrink-0 truncate",children:e.name}),(0,n.jsx)("span",{className:"h-1.5 flex-1 rounded-full bg-muted",children:(0,n.jsx)("span",{className:(0,h.cn)("block h-1.5 rounded-full bg-primary/70",a&&"transition-[width] duration-700"),style:{width:"".concat(e.count/r*100,"%")}})}),(0,n.jsx)("span",{className:"w-8 text-right tabular-nums",children:e.count})]},e.name))})}var N=a(99239),w=a(14158);let y=[15,60,360,1440],k="@active";function S(){return(0,o.Qj)()?(0,n.jsx)(E,{}):(0,n.jsxs)("div",{className:"mx-auto max-w-2xl space-y-2 p-6",children:[(0,n.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Live"}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"Connect to a NEXUS daemon to watch runs live."})]})}function E(){var e,t,a,h,p,f;let v=(0,m.In)(),[b,j]=(0,r.useState)("practical"),[S,E]=(0,r.useState)(null),[I,C]=(0,r.useState)("all"),[L,R]=(0,r.useState)(!1);(0,r.useEffect)(()=>{try{window.localStorage.removeItem("elanous.live.mode")}catch(e){}},[]),(0,r.useEffect)(()=>{if(!S)return;let e=setTimeout(()=>{j("practical"),E(null)},Math.max(0,S-Date.now()));return()=>clearTimeout(e)},[S]);let H=(0,o.M1)(),[D,P]=(0,r.useState)(null),X=e=>{e.on?(j("max"),C(e.scope&&"all"!==e.scope?"run":"all"),E(e.until?Date.parse(e.until):Date.now()+18e5)):(j("practical"),E(null))};(0,r.useEffect)(()=>{let e=!0;return H.getLiveDetail().then(t=>{e&&X(t)}).catch(()=>{}),()=>{e=!1}},[H]);let q=e=>{R(!1),P(null);let t="run"===e&&z?z:"all";H.setLiveDetail({scope:t,ttlMin:30,by:"pwa-live"}).then(X).catch(e=>P(e instanceof Error?e.message:String(e)))},[O,U]=(0,r.useState)(60),[_,B]=(0,r.useState)(""),T=(0,r.useRef)(!1);(0,r.useEffect)(()=>{"max"!==b||T.current||(T.current=!0,B(k),U(1440)),"max"!==b&&(T.current=!1)},[b]);let[z,F]=(0,r.useState)(null),{logs:W,runs:K,instances:V}=(0,d.HI)({store:_||void 0,windowMinutes:O}),[Q,Y]=(0,r.useState)(()=>Date.now());(0,r.useEffect)(()=>{Y(Date.now())},[W.dataUpdatedAt]);let[Z,G]=(0,r.useState)(!1);(0,r.useEffect)(()=>{"public"===new URLSearchParams(window.location.search).get("capture")&&G(!0)},[]);let $=null!=(h=null==(e=W.data)?void 0:e.logs)?h:M,J=(0,r.useMemo)(()=>Z?(0,x.yR)($):$,[$,Z]),ee=(0,l.I)({queryKey:["live","shipped",O],queryFn:()=>H.getLiveShipped("".concat(O,"m")),refetchInterval:6e4}),et=(0,r.useMemo)(()=>{var e,t,a;let n=(0,c.Hc)(J,null!=(a=null==(e=K.data)?void 0:e.entries)?a:[],{now:Q,windowMinutes:O}),r=null==(t=ee.data)?void 0:t.merged;if("number"!=typeof r)return n;let l=(0,u.NZ)(J).length;return{...n,gauges:{...n.gauges,shipped:r,selfHealRuns:l,selfHealRate:r>0?Math.round(l/r*100):null}}},[J,K.data,Q,O,ee.data]),ea=O>0?Math.round(J.length/O*10)/10:0,en=Math.round(JSON.stringify(J).length/1024),er=(0,r.useMemo)(()=>J.filter(e=>{var t;return!z||(null==(t=e.data)?void 0:t.runId)===z}).map(e=>(0,c.BP)(e)),[J,z]),el=(null!=(p=null==(t=V.data)?void 0:t.instances)?p:[]).filter(e=>!1!==e.dbExists&&!e.current);return(0,n.jsxs)("div",{className:"mx-auto ".concat("max"===b?"max-w-none space-y-2 p-2":"max-w-6xl space-y-4 p-4 sm:p-6"),children:[(0,n.jsx)("style",{children:A}),(0,n.jsxs)("header",{className:"flex flex-wrap items-center gap-3 ".concat("max"===b?"justify-end":"justify-between"),children:[(0,n.jsxs)("div",{className:"max"===b?"hidden":"",children:[(0,n.jsxs)("h1",{className:"flex items-center gap-2 text-xl font-semibold tracking-tight",children:[(0,n.jsx)(s.A,{className:"h-5 w-5","aria-hidden":!0})," Live"]}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"하니스 런이 판단하고 기획하는 신호 — 보이는 수는 전부 진짜다."})]}),(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs",children:[(0,n.jsx)("select",{"aria-label":"시간 창",value:O,onChange:e=>U(Number(e.target.value)),className:"rounded-md border bg-background px-2 py-1",children:y.map(e=>(0,n.jsx)("option",{value:e,children:e<60?"".concat(e,"분"):"".concat(e/60,"시간")},e))}),(0,n.jsxs)("select",{"aria-label":"신호 출처",value:_,onChange:e=>B(e.target.value),className:"max-w-48 rounded-md border bg-background px-2 py-1",children:[(0,n.jsx)("option",{value:"",children:"이 인스턴스"}),(0,n.jsx)("option",{value:k,children:"전체(연합 \xb7 최근 24시간에 쓰인 우주)"}),el.map(e=>(0,n.jsx)("option",{value:e.name,children:e.name},e.name))]}),(0,n.jsx)("button",{type:"button","data-elanous-action":"live-public-capture","aria-pressed":Z,onClick:()=>G(e=>!e),title:"녹화\xb7스크린샷용 — 계정 이름 → account-N \xb7 크레딧\xb7USD 숨김 \xb7 홈 경로 가림",className:"rounded-md border px-2 py-1 ".concat(Z?"border-emerald-500 text-emerald-600 dark:text-emerald-300":"hover:bg-muted"),children:Z?"● 공개 캡처 켜짐":"공개 캡처"}),"max"===b?(0,n.jsxs)("button",{type:"button","data-elanous-action":"live-max-off",onClick:()=>{P(null),H.setLiveDetail({scope:"all",ttlMin:0,by:"pwa-live"}).then(X).catch(e=>P(e instanceof Error?e.message:String(e))),j("practical"),E(null)},className:"inline-flex items-center gap-1 rounded-md border border-primary px-2 py-1 text-primary hover:bg-muted",children:[(0,n.jsx)(i.A,{className:"h-3.5 w-3.5","aria-hidden":!0})," 화려함 MAX 켜짐 \xb7 끄기"]}):(0,n.jsxs)("button",{type:"button","data-elanous-action":"live-max-on",onClick:()=>R(!0),className:"inline-flex items-center gap-1 rounded-md border px-2 py-1 hover:bg-muted",children:[(0,n.jsx)(i.A,{className:"h-3.5 w-3.5","aria-hidden":!0})," 화려함 MAX"]})]})]}),L&&(0,n.jsxs)("div",{role:"dialog","aria-label":"화려함 MAX 켜기",className:"space-y-2 rounded-md border border-primary/50 bg-primary/5 p-3 text-sm","data-live-max-confirm":!0,children:[(0,n.jsx)("p",{className:"font-medium",children:"화려함 MAX 를 켤까요?"}),(0,n.jsxs)("p",{className:"text-xs text-muted-foreground",children:["마케팅(시연\xb7녹화)과 상세 런 디버깅용입니다. 켜면 하니스가 판단마다 \xab왜\xb7목적\xb7보낸 곳\xbb을 추가로 기록합니다(부하가 듭니다) — 30분 뒤 자동으로 꺼지고, 다른 기기에서도 같은 상태로 보입니다. 지금 이 화면이 받는 신호: 분당 ",ea,"건 \xb7 응답 약 ",en,"KB."]}),(0,n.jsxs)("div",{className:"flex flex-wrap gap-2 text-xs",children:[(0,n.jsx)("button",{type:"button","data-elanous-action":"live-max-all",onClick:()=>q("all"),className:"rounded-md border px-2 py-1 hover:bg-muted",children:"전체로 켜기"}),(0,n.jsx)("button",{type:"button","data-elanous-action":"live-max-run",disabled:!z,onClick:()=>q("run"),className:"rounded-md border px-2 py-1 hover:bg-muted disabled:opacity-50",children:z?"이 런만 켜기":"이 런만 켜기(먼저 런을 고르세요)"}),(0,n.jsx)("button",{type:"button",onClick:()=>R(!1),className:"rounded-md px-2 py-1 text-muted-foreground hover:bg-muted",children:"취소"})]})]}),D&&(0,n.jsxs)("p",{className:"rounded-md bg-error/10 p-2 text-xs text-error",children:["MAX 스위치를 못 바꿨다: ",D]}),"max"===b&&(0,n.jsxs)("p",{className:"rounded-md border border-primary/40 px-3 py-1 text-[11px] lg:text-[10px] text-muted-foreground","data-live-cost-badge":!0,children:["화려함 MAX \xb7 범위 ","run"===I&&z?"런 ".concat(z.replace(/^run-/,"").slice(0,8)):"전체"," \xb7 받는 신호 분당 ",ea,"건 \xb7 응답 약 ",en,"KB",S?" \xb7 ".concat(Math.max(0,Math.round((S-Q)/6e4)),"분 뒤 자동 꺼짐"):""," \xb7 하니스 판단 이벤트 ",et.emitted,"건"]}),W.error?(0,n.jsxs)("p",{className:"rounded-md bg-error/10 p-3 text-sm text-error",children:["신호를 못 읽었다: ",W.error instanceof Error?W.error.message:String(W.error)]}):null,z&&(0,n.jsx)(w.RT,{runId:z,run:null!=(f=et.snapshot.runs.find(e=>e.runId===z))?f:null,lines:er,onClose:()=>F(null)}),"max"===b?(0,n.jsx)(N.xl,{board:et,rows:J,windowMinutes:O,sourceLabel:_===k?"federated":_||"this instance",shippedSource:"number"==typeof(null==(a=ee.data)?void 0:a.merged)?"github":"log",publicCapture:Z,role:v,onSelectRun:e=>F(t=>t===e?null:e)}):(0,n.jsx)(g,{board:et,lines:er,mode:b,role:v,selectedRunId:z,onSelectRun:e=>F(t=>t===e?null:e)}),(0,n.jsxs)("p",{className:"text-[11px] text-muted-foreground ".concat("max"===b?"hidden":""),children:["갱신 5초 \xb7 출처 ",(0,n.jsx)("code",{children:"/v1/logs"})," \xb7 ",(0,n.jsx)("code",{children:"/v1/harness/runs"})," \xb7 비밀처럼 보이는 조각은 가린다."]})]})}let M=[],A="\n@keyframes live-pulse { 0%,100% { opacity: 1; box-shadow: 0 0 0 0 rgba(99,102,241,0) } 50% { opacity: .55; box-shadow: 0 0 10px 2px rgba(99,102,241,.55) } }\n@keyframes live-pulse-bad { 0%,100% { opacity: 1 } 50% { opacity: .4; box-shadow: 0 0 10px 2px rgba(239,68,68,.6) } }\n@keyframes live-glow { 0%,100% { box-shadow: 0 0 0 0 rgba(99,102,241,0) } 50% { box-shadow: 0 0 18px 2px rgba(99,102,241,.35) } }\n@keyframes live-line-in { from { transform: translateY(-6px); opacity: 0 } to { transform: none; opacity: 1 } }\n@keyframes live-ship { 0% { background: rgba(34,197,94,.35) } 100% { background: transparent } }\n.live-max .live-pulse { animation: live-pulse 1.4s ease-in-out infinite }\n.live-max .live-pulse-bad { animation: live-pulse-bad 1s ease-in-out infinite }\n.live-max .live-glow { animation: live-glow 2.4s ease-in-out infinite }\n.live-max .live-line-in { animation: live-line-in .45s ease-out }\n.live-max .live-ship { animation: live-ship 2.4s ease-out; font-size: 12px }\n.live-max .live-gauge { background: radial-gradient(120% 120% at 0% 0%, rgba(99,102,241,.10), transparent 60%) }\n.live-max .live-count { text-shadow: 0 0 12px rgba(99,102,241,.45) }\n.live-stage { background: radial-gradient(120% 90% at 50% 0%, rgba(79,70,229,.25), rgba(2,6,23,.98) 60%), #020617; box-shadow: inset 0 0 0 1px rgba(99,102,241,.25) }\n.live-stage .live-line-in { animation: live-line-in .45s ease-out }\n@keyframes live-v5-marquee { from { transform: translateX(0) } to { transform: translateX(-50%) } }\n@keyframes live-v5-blink { 0%,100% { opacity: 1 } 50% { opacity: .45 } }\n@keyframes live-v5-hot { 0%,100% { box-shadow: 0 0 14px #a78bfa55, inset 0 0 14px #a78bfa22 } 50% { box-shadow: 0 0 26px #a78bfa99, inset 0 0 22px #a78bfa44 } }\n.live-v5-marquee { animation: live-v5-marquee linear infinite }\n.live-v5-blink { animation: live-v5-blink 1.6s ease-in-out infinite }\n.live-v5-hot { animation: live-v5-hot 1.8s ease-in-out infinite }\n@media (prefers-reduced-motion: reduce) { .live-max *, .live-v5 * { animation: none !important; transition: none !important } }\n";function I(){return(0,n.jsx)(S,{})}},7413:(e,t,a)=>{"use strict";a.d(t,{A:()=>n});let n=(0,a(71747).A)("activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]])},15991:(e,t,a)=>{"use strict";a.d(t,{GC:()=>r,In:()=>d,OG:()=>i});var n=a(24815);let r="elanous.pwa.role",l="elanous:pwa-role";function s(){try{let e=window.localStorage.getItem(r);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function i(e){try{window.localStorage.setItem(r,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(l))}function o(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(l,e);let t=t=>{(t.key===r||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(l,e),window.removeEventListener("storage",t)}}function d(){return(0,n.useSyncExternalStore)(o,s,()=>"general")}},66405:(e,t,a)=>{Promise.resolve().then(a.bind(a,6930))},71747:(e,t,a)=>{"use strict";a.d(t,{A:()=>d});var n=a(24815);let r=function(){for(var e=arguments.length,t=Array(e),a=0;a<e;a++)t[a]=arguments[a];return t.filter((e,t,a)=>!!e&&""!==e.trim()&&a.indexOf(e)===t).join(" ").trim()},l=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,a)=>a?a.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)};var s={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let i=(0,n.createContext)({}),o=(0,n.forwardRef)((e,t)=>{var a,l,o;let{color:d,size:c,strokeWidth:u,absoluteStrokeWidth:x,className:m="",children:h,iconNode:p,...g}=e,{size:f=24,strokeWidth:v=2,absoluteStrokeWidth:b=!1,color:j="currentColor",className:N=""}=null!=(a=(0,n.useContext)(i))?a:{},w=(null!=x?x:b)?24*Number(null!=u?u:v)/Number(null!=c?c:f):null!=u?u:v;return(0,n.createElement)("svg",{ref:t,...s,width:null!=(l=null!=c?c:f)?l:s.width,height:null!=(o=null!=c?c:f)?o:s.height,stroke:null!=d?d:j,strokeWidth:w,className:r("lucide",N,m),...!h&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(g)&&{"aria-hidden":"true"},...g},[...p.map(e=>{let[t,a]=e;return(0,n.createElement)(t,a)}),...Array.isArray(h)?h:[h]])}),d=(e,t)=>{let a=(0,n.forwardRef)((a,s)=>{let{className:i,...d}=a;return(0,n.createElement)(o,{ref:s,iconNode:t,className:r("lucide-".concat(l(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),i),...d})});return a.displayName=l(e),a}},82963:(e,t,a)=>{"use strict";a.d(t,{A:()=>n});let n=(0,a(71747).A)("sparkles",[["path",{d:"M11.017 2.814a1 1 0 0 1 1.966 0l1.051 5.558a2 2 0 0 0 1.594 1.594l5.558 1.051a1 1 0 0 1 0 1.966l-5.558 1.051a2 2 0 0 0-1.594 1.594l-1.051 5.558a1 1 0 0 1-1.966 0l-1.051-5.558a2 2 0 0 0-1.594-1.594l-5.558-1.051a1 1 0 0 1 0-1.966l5.558-1.051a2 2 0 0 0 1.594-1.594z",key:"1s2grr"}],["path",{d:"M20 2v4",key:"1rf3ol"}],["path",{d:"M22 4h-4",key:"gwowj6"}],["circle",{cx:"4",cy:"20",r:"2",key:"6kqj1y"}]])}},e=>{e.O(0,[3541,8260,8519,5458,8097,5290,607,7358],()=>e(e.s=66405)),_N_E=e.O()}]);
|