elanous 0.2.16 → 0.2.17
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/{1307-b46d45b705e8c9ae.js → 1307-aac7332576c4d6fc.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/{6877-7c6208705c284124.js → 6877-fe94e76a5841ee9b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/8401-4ce1c42c8d89903f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/899-f41be85e8a680651.js +1 -0
- package/apps/pwa/out/_next/static/chunks/9247-269e4464cc4b491c.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-3143b07a817d1da9.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/autopilot/{page-3cb52e5ea8fc2fa5.js → page-17ba086ef82d339b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-7eb661ff23af7da2.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-6b8444914da74ca6.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/bots/{page-482c5dbde699947c.js → page-6e5c3a867557298b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ceo/{page-1e962b31d1f11081.js → page-7110f732f45bf944.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/chat/{page-8c2d9526164f5d09.js → page-9a41d65355fc25b9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-5e77cd1802567c89.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/control/page-41afec0b255ed2bb.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/design-check/{page-c53598cfce6156f2.js → page-4187666132fc98c4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/editor/{page-13a63953f53c6a23.js → page-09328d499162bae4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/exec/{page-5d3c8429d04f3831.js → page-29ff3a8f84f03b6a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/field/{page-3193bdc0bbab047a.js → page-80ec7401bc83f511.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/inside/{page-76270efaee638f17.js → page-ab93b240f687d69a.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/intake/{page-6107ca8ddd5e3bdd.js → page-fc7d86467291ae38.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/{layout-dce686e582c23937.js → layout-de43a186e5ba5683.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/live/{page-d3d53b146416e422.js → page-8b08cafad27759c9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-0e2d6985fb42cd2f.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/market/page-13e4108999f58d13.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-e8296ee284aa1293.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/morning/{page-4167348049166852.js → page-043a9111e74f6b24.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/{not-found-de52e8fdf9095f7a.js → not-found-23a4601ceb7f452e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-1ed1324b1dc36754.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/ops/checklist/{page-ca3952cd78a83ca2.js → page-10d958605a77b3bd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/release/{page-5b042736aa113756.js → page-166745e51ac0c7b0.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/ops/seats/{page-acb749f1e432bcf3.js → page-a04260b8ccc968d4.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-7a1d85e121065cc8.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/page-1f50e3d4e13435f4.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/reflection/{page-1ebfe049c640e171.js → page-12916918988ac97e.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-d8a3347a9d0c3f4a.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-a9117d2cd3093d36.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/settings/devices/{page-31fa1ce4c4aff9ae.js → page-5a64cb5208c6a8fd.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/settings/{page-0f5cd57ca928f42b.js → page-1407ec83ea64c1f9.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/done/{page-abe8e3b74bea1ffc.js → page-1d824510df025d18.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-6e878ebbe1737d00.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/share/{page-d28573d6792b4275.js → page-7f49fe645d5132f7.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/showroom/{page-59f03fda76c03d22.js → page-81a4e7f8dbfe74cb.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/tasks/{page-d751de5f8062ff5e.js → page-27d71f131acd9320.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-3ab59d19913b200e.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/today/page-bf85b2f5bf077925.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/trace/page-424659bacfb8cdd7.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/vault/page-ab32a8f522a60371.js +1 -0
- package/apps/pwa/out/_next/static/chunks/app/workflows/chat-ui/{page-d4aef67abf264874.js → page-fc2df261f8a2c7df.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/workflows/{page-1ea64acadd704ace.js → page-09461366af82ef13.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/workspace/{page-3544f154c87b43ee.js → page-5d4fef9ccd7d406b.js} +1 -1
- package/apps/pwa/out/_next/static/chunks/app/worktrees/{page-30c2073bfc21c004.js → page-ea90a8ac73ce2749.js} +1 -1
- package/apps/pwa/out/approvals/index.html +1 -1
- package/apps/pwa/out/approvals/index.txt +13 -13
- package/apps/pwa/out/autopilot/index.html +1 -1
- package/apps/pwa/out/autopilot/index.txt +13 -13
- package/apps/pwa/out/board/index.html +1 -1
- package/apps/pwa/out/board/index.txt +13 -13
- package/apps/pwa/out/botlab/index.html +1 -1
- package/apps/pwa/out/botlab/index.txt +13 -13
- package/apps/pwa/out/bots/index.html +1 -1
- package/apps/pwa/out/bots/index.txt +13 -13
- package/apps/pwa/out/ceo/index.html +1 -1
- package/apps/pwa/out/ceo/index.txt +13 -13
- package/apps/pwa/out/chat/index.html +1 -1
- package/apps/pwa/out/chat/index.txt +13 -13
- package/apps/pwa/out/consult/index.html +1 -1
- package/apps/pwa/out/consult/index.txt +13 -13
- package/apps/pwa/out/control/index.html +1 -1
- package/apps/pwa/out/control/index.txt +13 -13
- package/apps/pwa/out/design-check/index.html +1 -1
- package/apps/pwa/out/design-check/index.txt +13 -13
- package/apps/pwa/out/editor/index.html +1 -1
- package/apps/pwa/out/editor/index.txt +13 -13
- package/apps/pwa/out/exec/index.html +1 -1
- package/apps/pwa/out/exec/index.txt +13 -13
- package/apps/pwa/out/field/index.html +1 -1
- package/apps/pwa/out/field/index.txt +13 -13
- package/apps/pwa/out/healthz +1 -1
- package/apps/pwa/out/index.html +1 -1
- package/apps/pwa/out/index.txt +13 -13
- package/apps/pwa/out/inside/index.html +1 -1
- package/apps/pwa/out/inside/index.txt +13 -13
- package/apps/pwa/out/intake/index.html +1 -1
- package/apps/pwa/out/intake/index.txt +13 -13
- package/apps/pwa/out/live/index.html +1 -1
- package/apps/pwa/out/live/index.txt +13 -13
- package/apps/pwa/out/loops/index.html +1 -1
- package/apps/pwa/out/loops/index.txt +13 -13
- package/apps/pwa/out/market/index.html +1 -1
- package/apps/pwa/out/market/index.txt +13 -13
- package/apps/pwa/out/missions/placeholder/index.html +1 -1
- package/apps/pwa/out/missions/placeholder/index.txt +13 -13
- package/apps/pwa/out/morning/index.html +1 -1
- package/apps/pwa/out/morning/index.txt +13 -13
- package/apps/pwa/out/observatory/index.html +1 -1
- package/apps/pwa/out/observatory/index.txt +13 -13
- package/apps/pwa/out/ops/checklist/index.html +1 -1
- package/apps/pwa/out/ops/checklist/index.txt +13 -13
- package/apps/pwa/out/ops/release/index.html +1 -1
- package/apps/pwa/out/ops/release/index.txt +13 -13
- package/apps/pwa/out/ops/seats/index.html +1 -1
- package/apps/pwa/out/ops/seats/index.txt +13 -13
- package/apps/pwa/out/outputs/index.html +1 -1
- package/apps/pwa/out/outputs/index.txt +13 -13
- package/apps/pwa/out/reflection/index.html +1 -1
- package/apps/pwa/out/reflection/index.txt +14 -14
- package/apps/pwa/out/scheduler/index.html +1 -1
- package/apps/pwa/out/scheduler/index.txt +13 -13
- package/apps/pwa/out/sessions/index.html +1 -1
- package/apps/pwa/out/sessions/index.txt +13 -13
- package/apps/pwa/out/settings/devices/index.html +1 -1
- package/apps/pwa/out/settings/devices/index.txt +13 -13
- package/apps/pwa/out/settings/index.html +1 -1
- package/apps/pwa/out/settings/index.txt +13 -13
- package/apps/pwa/out/setup/done/index.html +1 -1
- package/apps/pwa/out/setup/done/index.txt +13 -13
- package/apps/pwa/out/setup/index.html +1 -1
- package/apps/pwa/out/setup/index.txt +13 -13
- package/apps/pwa/out/share/index.html +1 -1
- package/apps/pwa/out/share/index.txt +13 -13
- package/apps/pwa/out/showroom/index.html +1 -1
- package/apps/pwa/out/showroom/index.txt +13 -13
- package/apps/pwa/out/tasks/index.html +1 -1
- package/apps/pwa/out/tasks/index.txt +13 -13
- package/apps/pwa/out/term/index.html +1 -1
- package/apps/pwa/out/term/index.txt +13 -13
- package/apps/pwa/out/today/index.html +1 -1
- package/apps/pwa/out/today/index.txt +13 -13
- package/apps/pwa/out/trace/index.html +1 -1
- package/apps/pwa/out/trace/index.txt +13 -13
- package/apps/pwa/out/vault/index.html +1 -1
- package/apps/pwa/out/vault/index.txt +13 -13
- package/apps/pwa/out/workflows/chat-ui/index.html +1 -1
- package/apps/pwa/out/workflows/chat-ui/index.txt +13 -13
- package/apps/pwa/out/workflows/index.html +1 -1
- package/apps/pwa/out/workflows/index.txt +13 -13
- package/apps/pwa/out/workspace/index.html +1 -1
- package/apps/pwa/out/workspace/index.txt +13 -13
- package/apps/pwa/out/worktrees/index.html +1 -1
- package/apps/pwa/out/worktrees/index.txt +13 -13
- package/graphs/intake/intake-daily.yaml +9 -2
- package/graphs/intake/news-sources.yaml +4 -0
- package/graphs/intake/recipes.yaml +6 -1
- package/package.json +1 -1
- package/scripts/__fixtures__/intake-news.xml +7 -0
- package/scripts/intake-news.ts +169 -0
- package/scripts/release-loop/docs-land-node.ts +69 -10
- package/scripts/release-loop/publish-node.ts +2 -2
- package/scripts/release-loop/release-docs.ts +134 -0
- package/scripts/release-loop/version-node.ts +7 -4
- package/scripts/release-story/draft.ts +42 -14
- package/src/agent-mission/driver.ts +53 -10
- package/src/autopilot/track-agent.ts +5 -3
- package/src/cli/autopilot-cli.ts +66 -0
- package/src/cli/decisions-cli.ts +4 -1
- package/src/cli/intake-cli.ts +1 -1
- package/src/cli/log-event-names.ts +1 -0
- package/src/cli/pr-cli.ts +12 -1
- package/src/cli/provider-cli.ts +14 -0
- package/src/cli/self-update-canary.ts +46 -0
- package/src/cli/self-update.ts +200 -1
- package/src/context-card/index.ts +45 -0
- package/src/context-card/task.ts +76 -0
- package/src/dashboard/slash-runtime/dashboard-handlers.ts +2 -0
- package/src/decisions/decision-ledger.ts +10 -1
- package/src/harness/harness-cli-command.ts +142 -10
- package/src/harness/harness-pod-dispatch.ts +11 -0
- package/src/harness/harness-queue.ts +86 -7
- package/src/harness/nested-elanous-policy.ts +23 -4
- package/src/hq/fence-wrapper.ts +123 -0
- package/src/hq/hq.ts +8 -0
- package/src/index.ts +57 -8
- package/src/intake-plane/digest.ts +39 -4
- package/src/nexus/api/grid.ts +61 -0
- package/src/nexus/api/http-server.ts +19 -1
- package/src/nexus/api/task-cards-api.ts +19 -0
- package/src/oauth/codex.ts +82 -2
- package/src/release-loop/landing-freeze.ts +18 -10
- package/src/seat-loop/seat-loop.ts +95 -31
- package/src/self-dev/ask-launch-flow.ts +26 -7
- package/src/self-dev/run-store.ts +5 -1
- package/src/self-dev/run-supervisor.ts +7 -1
- package/src/self-dev/supervisor-verdict-edges.ts +46 -0
- package/src/self-implement/frozen-merges.ts +25 -20
- package/src/self-implement/goal-author-clarification.ts +81 -0
- package/src/self-implement/goal-author-cli.ts +33 -5
- package/src/self-implement/goal-author.ts +88 -12
- package/src/self-implement/goal-clarification-escalation.ts +37 -1
- package/src/self-implement/goal-document-write.ts +28 -0
- package/src/self-implement/heal-intake.ts +4 -0
- package/src/self-implement/host-regate.ts +3 -1
- package/src/self-implement/orchestrator.ts +19 -1
- package/src/task-agent/actions.ts +118 -0
- package/src/task-agent/judge.ts +96 -0
- package/src/task-cards/card-store.ts +4 -1
- package/src/task-orchestrator/surfaces/pod-failure-reason.ts +33 -4
- package/src/task-orchestrator/surfaces/pod-lease.ts +5 -2
- package/src/task-orchestrator/surfaces/pod-pool.ts +81 -13
- package/src/task-orchestrator/surfaces/self-implement-pod.ts +151 -29
- package/src/telegram-commands.ts +1 -1
- package/src/telegram-loops-command.ts +21 -14
- package/src/user-config.ts +25 -3
- package/src/version/packed-revision.json +1 -1
- package/apps/pwa/out/_next/static/chunks/8827-e2f5b09a8d37e83b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/899-46946fe8363e1262.js +0 -1
- package/apps/pwa/out/_next/static/chunks/9247-29d889b809288e65.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/approvals/page-79c3ed84baaedd03.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/board/page-a424ef80885d1743.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/botlab/page-c1e20d7d338713f1.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/consult/page-ffff6d819fbc6e0f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/control/page-a0e2a6d1bfb52fc5.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/loops/page-1a61c7ca1ceb3ae7.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/market/page-51f811fa119308b6.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/missions/[id]/page-dacff46049e1557e.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/observatory/page-36a7d994f4ca0299.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/outputs/page-cd78862707999911.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/page-54b9ef8afe6278fd.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/scheduler/page-57924393e3e4e539.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/sessions/page-9e0ce6c8129fa641.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/setup/page-4364ef9f4e7c7f0f.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/term/page-fe1759f94003b32b.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/today/page-d64c984e855c8c68.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/trace/page-86914b0dee8ab7f8.js +0 -1
- package/apps/pwa/out/_next/static/chunks/app/vault/page-9afdee66b820c76e.js +0 -1
- /package/apps/pwa/out/_next/static/{rv9cierV0jSOvDBm1g0XB → yRA5ur6DcPl0YHSRheH2O}/_buildManifest.js +0 -0
- /package/apps/pwa/out/_next/static/{rv9cierV0jSOvDBm1g0XB → yRA5ur6DcPl0YHSRheH2O}/_ssgManifest.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6605],{3704:(e,t,a)=>{"use strict";a.d(t,{A:()=>i});var r=a(46124);let n=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()},s=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 l={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};let o=(0,r.createContext)({}),c=(0,r.forwardRef)((e,t)=>{var a,s,c;let{color:i,size:d,strokeWidth:u,absoluteStrokeWidth:m,className:p="",children:h,iconNode:b,...x}=e,{size:f=24,strokeWidth:g=2,absoluteStrokeWidth:w=!1,color:y="currentColor",className:v=""}=null!=(a=(0,r.useContext)(o))?a:{},N=(null!=m?m:w)?24*Number(null!=u?u:g)/Number(null!=d?d:f):null!=u?u:g;return(0,r.createElement)("svg",{ref:t,...l,width:null!=(s=null!=d?d:f)?s:l.width,height:null!=(c=null!=d?d:f)?c:l.height,stroke:null!=i?i:y,strokeWidth:N,className:n("lucide",v,p),...!h&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(x)&&{"aria-hidden":"true"},...x},[...b.map(e=>{let[t,a]=e;return(0,r.createElement)(t,a)}),...Array.isArray(h)?h:[h]])}),i=(e,t)=>{let a=(0,r.forwardRef)((a,l)=>{let{className:o,...i}=a;return(0,r.createElement)(c,{ref:l,iconNode:t,className:n("lucide-".concat(s(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),o),...i})});return a.displayName=s(e),a}},5997:(e,t,a)=>{"use strict";a.d(t,{Zr:()=>l,f6:()=>n,oD:()=>s});let r="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 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=n();return localStorage.setItem(r,t),t}function l(){let e=n();return localStorage.setItem(r,e),e}},15151:(e,t,a)=>{"use strict";a.d(t,{C:()=>i,DaemonProvider:()=>d,Q:()=>u});var r=a(55539),n=a(46124),s=a(8101),l=a(5997),o=a(18060),c=a(72215);let i=(0,n.createContext)(null);function d(e){let{children:t}=e,a={baseUrl:"",token:"",provider:""},[d,u]=(0,n.useState)(a),[m,p]=(0,n.useState)(""),[h]=(0,n.useState)(()=>new o.ki(a));(0,n.useEffect)(()=>{let e=(0,s.Fp)();u(e),h.updateConfig(e),p((0,l.oD)()),(0,c.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[h]),(0,n.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();h.updateConfig(t),u(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)},[h]);let b=e=>{u(t=>{let a={...t,...e};return(0,s.Qc)(e),h.updateConfig(a),(0,c.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),a})},x=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,c.cY)("webterm.provider.daemon.session-set",{sessionId:e})},f=(0,n.useMemo)(()=>({config:d,setConfig:b,client:h,sessionId:m,setSessionId:x}),[d,h,m]);return(0,r.jsx)(i.Provider,{value:f,children:t})}function u(){let e=(0,n.useContext)(i);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},42827:(e,t,a)=>{"use strict";a.d(t,{GM:()=>o,J3:()=>l,WF:()=>r,bR:()=>s,m:()=>c,r5:()=>n});let r="/v1/devices",n="/v1/approvals/merges",s="/v1/templates/capability-preview",l="/v1/idle-nudge/preview",o="/v1/morning-digest/showroom",c="/v1/next-fluent/dispatch"},54508:(e,t,a)=>{"use strict";a.d(t,{V5:()=>s,tV:()=>l});var r=a(42827);class n extends Error{constructor(e,t,a){super(a||t),this.status=e,this.error=t,this.reason=a,this.name="MergeApprovalsApiError"}}function s(e,t){return e instanceof n?401===e.status||"unauthorized"===e.error?{text:"이 기기에 소유자 토큰이 없어 승인 목록을 못 읽었습니다 — 이미 연결된 기기의 설정 › 연결 토큰 만들기 에서 토큰을 만들어, 이 기기의 설정 › 데몬 연결 › 연결 토큰 칸에 붙이면 바로 보입니다.",href:"/app/settings/#bearer-token"}:"gh-failed"===e.error?{text:"데몬이 GitHub 를 읽지 못했습니다(데몬 기계의 gh 로그인\xb7네트워크) — 잠시 뒤 다시 열어 보세요.".concat(e.reason?" 사유: ".concat(e.reason.split("\n")[0].slice(0,160)):"")}:"gh-invalid-response"===e.error?{text:"GitHub 응답을 해석하지 못했습니다 — 잠시 뒤 다시 열어 보세요."}:"approvals-repo-unknown"===e.error?{text:"승인할 저장소를 모릅니다 — 데몬 설정 intake.approvals.repo(예: owner/repo)를 채워 주세요.",href:"/app/settings/"}:e.reason?{text:e.reason}:{text:"".concat(t," (").concat(e.status," ").concat(e.error,")")}:e instanceof TypeError?{text:"데몬에 닿지 못했습니다 — 데몬이 켜져 있는지, 이 기기가 같은 네트워크(tailnet)에 있는지 확인하세요."}:{text:e instanceof Error&&e.message?e.message:t}}function l(e){var t,a;let s=null!=(t=e.fetchImpl)?t:fetch,l=(null!=(a=e.baseUrl)?a:"").replace(/\/+$/,"");async function o(t,a){let r={...a,headers:{"content-type":"application/json",...e.authHeader?{authorization:e.authHeader}:{}}},o=e.client?await e.client.fetchResponse(t,r):await s("".concat(l).concat(t),r),c=await o.json().catch(()=>null);if(!o.ok){var i;let e=c&&"object"==typeof c?c:{};throw new n(o.status,null!=(i=e.error)?i:"request-failed",e.reason)}return c}return{list:function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"open";return o("merged"===e?"".concat(r.r5,"?state=merged"):r.r5)},get:e=>o("".concat(r.r5,"/").concat(e)),check:(e,t)=>o("".concat(r.r5,"/").concat(e,"/check"),{method:"POST",body:JSON.stringify({headSha:t})}),merge:(e,t)=>o("".concat(r.r5,"/").concat(e,"/merge"),{method:"POST",body:JSON.stringify({headSha:t})})}}},74780:(e,t,a)=>{"use strict";function r(e){return{slides:e.slides.map(e=>{let{image:t,caption:a,include:r}=e;return{image:t,caption:a,include:r}}),caption:{hook:e.caption.hook,body:e.caption.body},hashtags:[...e.hashtags],cover:{text:e.cover.text,sub:e.cover.sub},location:e.location}}a.d(t,{$Y:()=>l,LP:()=>c,Mz:()=>r,ll:()=>d,rH:()=>o});class n extends Error{constructor(e,t){super(t),this.status=e,this.name="GraphApprovalsApiError"}}let s={list:"목록을 보려면",decide:"승인하려면",save:"초안을 저장하려면"},l="/app/settings/#bearer-token";function o(e){return e instanceof n&&(401===e.status||403===e.status)}function c(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"decide";return e instanceof n?401===e.status||403===e.status?"".concat(s[t]," 이 기기를 데몬에 연결해야 합니다 — 설정 › 데몬 연결 › 연결 토큰 칸에 토큰을 넣어 주세요."):404===e.status?"이 실행을 찾지 못했습니다. 목록을 다시 확인해 주세요.":409===e.status?"이미 결정된 실행입니다. 목록을 다시 확인해 주세요.":400===e.status?"결정 내용을 확인한 뒤 다시 시도해 주세요.":"승인 요청을 처리하지 못했습니다. 잠시 뒤 다시 시도해 주세요.":e instanceof TypeError?"서버에 연결하지 못했습니다. 연결 상태를 확인해 주세요.":"승인 요청을 처리하지 못했습니다. 잠시 뒤 다시 시도해 주세요."}let i="/v1/graph-approvals";function d(e){var t,a;let r=(null!=(t=e.baseUrl)?t:"").replace(/\/+$/,""),s=null!=(a=e.fetchImpl)?a:fetch;async function l(t,a){let l={...a,headers:{"content-type":"application/json",...e.authHeader?{authorization:e.authHeader}:{}}},o=e.client?await e.client.fetchResponse(t,l):await s("".concat(r).concat(t),l),c=await o.json().catch(()=>null);if(!o.ok){let e=c&&"object"==typeof c&&"error"in c&&"string"==typeof c.error?c.error:"request-failed";throw new n(o.status,e)}return c}return{list:()=>l(i),decide:(e,t,a)=>l("".concat(i,"/").concat(encodeURIComponent(e),"/").concat(encodeURIComponent(t)),{method:"POST",body:JSON.stringify({decision:a})}),saveFeedDraft:(e,t,a)=>l("".concat(i,"/").concat(encodeURIComponent(e),"/").concat(encodeURIComponent(t),"/feed-draft"),{method:"PUT",body:JSON.stringify(a)}),feedMedia:async(t,a,l)=>{let o="".concat(i,"/").concat(encodeURIComponent(t),"/").concat(encodeURIComponent(a),"/media?path=").concat(encodeURIComponent(l)),c={headers:e.authHeader?{authorization:e.authHeader}:{}},d=e.client?await e.client.fetchResponse(o,c):await s("".concat(r).concat(o),c);if(!d.ok)throw new n(d.status,"media-failed");return d.blob()}}}},76573:(e,t,a)=>{"use strict";a.d(t,{A:()=>r});let r=(0,a(3704).A)("loader-circle",[["path",{d:"M21 12a9 9 0 1 1-6.219-8.56",key:"13zald"}]])},88843:(e,t,a)=>{"use strict";a.r(t),a.d(t,{default:()=>j});var r=a(55539),n=a(46124),s=a(65761),l=a(77362),o=a(15151),c=a(97479),i=a(54508);function d(e,t){return"UNKNOWN"===t&&e<3?3e3:null}async function u(e,t){let a,r=0,n=d(0,"UNKNOWN");for(;null!==n;){var s,l,o;if(await t.sleep(n),t.isActive&&!t.isActive())break;r++;try{a=await e(),null==(l=t.onDetail)||l.call(t,a)}catch(e){}null==(s=t.onAttempt)||s.call(t),n=d(r,null!=(o=null==a?void 0:a.mergeable)?o:"UNKNOWN")}return{attempts:r,...a?{last:a}:{}}}var m=a(76573);function p(e){let{view:t,target:a}=e,[s]=(0,n.useState)(()=>Date.now()),[l,o]=(0,n.useState)(s);(0,n.useEffect)(()=>{let e=window.setInterval(()=>o(Date.now()),100);return()=>window.clearInterval(e)},[]);let c=function(e,t,a){let r="".concat((Math.max(0,e)/1e3).toFixed(1),"초");return{title:"merged"===t?"GitHub 에서 반영된 코드 변경을 읽고 있습니다":a?"GitHub 에서 승인을 기다리는 코드 변경과 #".concat(a," 카드를 읽고 있습니다"):"GitHub 에서 승인을 기다리는 코드 변경을 읽고 있습니다",clock:r,hint:e>=8e3?"평소(2~5초)보다 오래 걸립니다 — GitHub 응답을 기다리는 중이며 멈추지 않았습니다.":null}}(l-s,t,a);return(0,r.jsxs)("section",{role:"status","aria-live":"polite","aria-busy":"true",className:"space-y-3","data-approvals-loading":!0,children:[(0,r.jsxs)("div",{className:"flex items-center gap-3 rounded-xl border border-blue-500/40 bg-blue-500/5 p-4",children:[(0,r.jsx)(m.A,{className:"h-6 w-6 shrink-0 text-blue-500 motion-safe:animate-spin","aria-hidden":!0}),(0,r.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,r.jsx)("p",{className:"font-medium",children:c.title}),c.hint&&(0,r.jsx)("p",{className:"mt-1 text-sm text-amber-600 dark:text-amber-400",children:c.hint})]}),(0,r.jsx)("span",{className:"font-mono text-lg tabular-nums text-blue-600 dark:text-blue-300","aria-label":"경과 시간",children:c.clock})]}),(0,r.jsx)("div",{className:"h-1 overflow-hidden rounded-full bg-muted","aria-hidden":!0,children:(0,r.jsx)("div",{className:"h-full w-1/3 rounded-full bg-blue-500 motion-safe:animate-[approvals-slide_1.2s_ease-in-out_infinite]"})}),(0,r.jsx)("style",{children:"@keyframes approvals-slide{0%{transform:translateX(-100%)}100%{transform:translateX(300%)}}"}),[0,1].map(e=>(0,r.jsxs)("div",{className:"space-y-3 rounded-xl border border-border bg-card p-5 motion-safe:animate-pulse","aria-hidden":!0,children:[(0,r.jsx)("div",{className:"h-4 w-2/3 rounded bg-muted"}),(0,r.jsx)("div",{className:"h-3 w-full rounded bg-muted"}),(0,r.jsx)("div",{className:"h-3 w-5/6 rounded bg-muted"})]},e))]})}function h(e){let{view:t,onChange:a}=e,n=(e,n)=>(0,r.jsx)("button",{type:"button",role:"tab","aria-selected":t===e,onClick:()=>a(e),className:"rounded-md px-3 py-1 text-sm ".concat(t===e?"bg-foreground text-background":"bg-muted text-foreground"),children:n});return(0,r.jsxs)("div",{role:"tablist","aria-label":"승인 목록 보기",className:"flex gap-2",children:[n("open","승인 대기"),n("merged","완료")]})}function b(e){let{brief:t,lineage:a,summary:n}=e;return(0,r.jsxs)(r.Fragment,{children:[null!==t?(0,r.jsx)("section",{"aria-label":"승인 요약",className:"mt-3 break-words text-sm leading-relaxed [&_a]:text-blue-600 [&_a]:underline [&_blockquote]:border-l-2 [&_blockquote]:pl-3 [&_h3]:mt-3 [&_h3]:font-semibold [&_li]:ml-5 [&_li]:list-disc [&_p]:my-2 [&_table]:block [&_table]:overflow-x-auto",children:(0,r.jsx)(s.oz,{remarkPlugins:[l.A],components:{a:e=>{let{href:t,children:a}=e;return(0,r.jsx)("a",{href:t,target:"_blank",rel:"noreferrer",children:a})}},children:t})}):(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("p",{className:"mt-3 rounded border border-amber-500/40 bg-amber-500/15 p-3 text-sm text-amber-800 dark:text-amber-300",children:"승인 요약 내용이 없습니다 — GitHub 본문을 보거나 발사자에게 요청하세요"}),(0,r.jsx)("p",{className:"mt-3 whitespace-pre-wrap text-sm",children:n})]}),a&&(0,r.jsxs)("p",{className:"mt-3 text-sm text-muted-foreground",children:["아이디어 원장: ",a]})]})}function x(e){var t;let{gate:a,busy:n,blocked:s,mergeLabel:l,onCheck:o,onMerge:c}=e;return(0,r.jsxs)("div",{className:"mt-3 space-y-2","aria-label":"머지 전 검사",children:["none"===a.status&&(0,r.jsx)("button",{type:"button",onClick:o,disabled:n,className:"rounded-lg border px-3 py-2 text-sm disabled:opacity-50",children:"머지 전 검사 시작"}),"running"===a.status&&(0,r.jsx)("p",{role:"status",className:"text-sm",children:"검사 중…"}),"passed"===a.status&&(0,r.jsxs)("p",{className:"text-sm text-green-700 dark:text-green-400",children:["검사 통과 (",null!=(t=a.os)?t:"unknown",")",a.baseDrifted?" \xb7 검사 뒤 main 이 움직였다 — 머지 때 겹치는 파일이 있으면 다시 검사를 요구한다":""]}),("failed"===a.status||"unmeasured"===a.status)&&(0,r.jsxs)("div",{role:"alert",className:"text-sm text-red-600",children:[(0,r.jsx)("p",{children:"failed"===a.status?"검사 실패":"검사 측정 불가"}),(0,r.jsx)("ul",{className:"list-inside list-disc",children:a.failures.map((e,t)=>(0,r.jsx)("li",{children:e},t))}),(0,r.jsx)("button",{type:"button",onClick:o,disabled:n,className:"mt-2 rounded-lg border px-3 py-2 disabled:opacity-50",children:"머지 전 검사 다시 시작"})]}),(0,r.jsx)("button",{type:"button",onClick:c,disabled:n||s||"passed"!==a.status,className:"rounded-lg bg-blue-600 px-4 py-2 text-sm font-medium text-white disabled:cursor-not-allowed disabled:opacity-50",children:null!=l?l:"승인하고 머지"})]})}function f(e){let{card:t,api:a,attempt:r,onAttempt:s,onUpdate:l}=e,o="UNKNOWN"===t.mergeable&&!t.merged&&"OPEN"===t.state;return(0,n.useEffect)(()=>{if(!o||r>0)return;let e=!0,n=[];return u(()=>a.get(t.number),{sleep:e=>new Promise(t=>{n.push(window.setTimeout(t,e))}),isActive:()=>e,onDetail:a=>{e&&l(a,t.headSha)},onAttempt:()=>{e&&s(t.number)}}),()=>{for(let t of(e=!1,n))window.clearTimeout(t)}},[a,t.number,o,r,s,l]),null}function g(){let e=(0,c.In)(),{client:t}=(0,o.Q)(),a=(0,n.useMemo)(()=>(0,i.tV)({client:t}),[t]),[s,l]=(0,n.useState)([]),[u,m]=(0,n.useState)(!0),[g,w]=(0,n.useState)(null),[y,v]=(0,n.useState)(null),[N,j]=(0,n.useState)({}),[k,S]=(0,n.useState)({}),[C,I]=(0,n.useState)(null),[E,U]=(0,n.useState)("open"),L=(0,n.useCallback)(e=>{S(t=>{var a;return{...t,[e]:(null!=(a=t[e])?a:0)+1}})},[]),R=(0,n.useCallback)((e,t)=>{l(a=>a.map(a=>a.number!==e.number||a.headSha!==t?a:{...e,gate:e.headSha===t?e.gate:{status:"none",failures:[]},merged:a.merged}))},[]);async function O(e){v(e.number),j(t=>({...t,[e.number]:""}));try{let{gate:t}=await a.check(e.number,e.headSha);l(a=>a.map(a=>a.number===e.number&&a.headSha===e.headSha?{...a,gate:t}:a))}catch(t){j(a=>({...a,[e.number]:(0,i.V5)(t,"검사를 시작하지 못했습니다.").text}))}finally{v(null)}}async function M(e){if(window.confirm("#".concat(e.number," ").concat(e.title,"\n현재 확인한 변경을 승인하고 머지할까요?"))){v(e.number),j(t=>({...t,[e.number]:""}));try{await a.merge(e.number,e.headSha),l(t=>t.map(t=>t.number===e.number?{...t,merged:!0,state:"MERGED"}:t))}catch(t){j(a=>({...a,[e.number]:(0,i.V5)(t,"머지하지 못했습니다.").text}))}finally{v(null)}}}return((0,n.useEffect)(()=>{let e=s.filter(e=>"OPEN"===e.state&&("running"===e.gate.status||"passed"===e.gate.status));if("open"!==E||!e.length)return;let t=!0,r=window.setInterval(()=>{for(let r of e)a.get(r.number).then(e=>{t&&R(e,r.headSha)}).catch(e=>{t&&j(t=>({...t,[r.number]:(0,i.V5)(e,"검사 상태를 불러오지 못했습니다.").text}))})},1e4);return()=>{t=!1,window.clearInterval(r)}},[a,s,R,E]),(0,n.useEffect)(()=>{let e=!0,t=Number(new URLSearchParams(window.location.search).get("pr")),r=Number.isSafeInteger(t)&&t>0?t:null;return(m(!0),w(null),I(r),"merged"===E)?(a.list("merged").then(t=>{let{items:a}=t;e&&l(a)}).catch(t=>{e&&w((0,i.V5)(t,"목록을 불러오지 못했습니다."))}).finally(()=>{e&&m(!1)}),()=>{e=!1}):(a.list().then(async t=>{let{items:n}=t;if(!e)return;let s=n.find(e=>e.number===r);if(r&&!s)try{let t=await a.get(r);e&&l([t,...n])}catch(t){e&&w((0,i.V5)(t,"PR 을 불러오지 못했습니다.")),e&&l(n)}else l(r?[...n].sort((e,t)=>Number(t.number===r)-Number(e.number===r)):n)}).catch(t=>{e&&w((0,i.V5)(t,"목록을 불러오지 못했습니다."))}).finally(()=>{e&&m(!1)}),()=>{e=!1})},[a,E]),"owner"===e||"open"!==E||u||s.length||g)?(0,r.jsxs)("main",{className:"mx-auto max-w-3xl space-y-5 p-4 pb-20 text-foreground sm:p-8",children:[(0,r.jsxs)("header",{children:[(0,r.jsx)("h1",{className:"text-2xl font-semibold",children:"코드 변경 승인"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"자동으로 만든 코드 변경(PR)을 확인하고 승인합니다."})]}),(0,r.jsx)(h,{view:E,onChange:e=>{l([]),U(e)}}),u&&(0,r.jsx)(p,{view:E,target:C}),g&&(0,r.jsxs)("p",{role:"alert",className:"text-red-600","data-approvals-error":!0,children:[g.text,g.href&&(0,r.jsxs)(r.Fragment,{children:[" ",(0,r.jsx)("a",{href:g.href,className:"font-semibold underline underline-offset-2","data-approvals-settings":!0,children:"설정 열기 →"})]})]}),!u&&!s.length&&!g&&(0,r.jsx)("p",{children:"merged"===E?"승인해 반영된 코드 변경이 아직 없습니다.":"승인을 기다리는 코드 변경이 없습니다."}),s.map(e=>{var t,n;let s=e.merged||"MERGED"===e.state,l="OPEN"!==e.state&&!s,o=e.draft?"초안 PR 은 머지할 수 없습니다. GitHub에서 초안을 해제한 뒤 다시 확인하세요.":e.checks.failure>0?"실패한 검사가 있습니다.":e.checks.pending>0?"검사가 아직 끝나지 않았습니다.":"CONFLICTING"===e.mergeable?"머지 충돌이 있습니다.":"MERGEABLE"!==e.mergeable?"머지 가능 여부가 아직 확인되지 않았습니다.":"main"!==e.base?"대상 브랜치가 main 이 아닙니다.":"",c=C===e.number,i=null!=(t=k[e.number])?t:0;return(0,r.jsxs)("article",{className:"rounded-xl border bg-card p-5 shadow-sm ".concat(c?"border-blue-500 ring-2 ring-blue-500/30":"border-border"),children:[(0,r.jsx)(f,{card:e,api:a,attempt:i,onAttempt:L,onUpdate:R}),(0,r.jsxs)("div",{className:"flex flex-wrap items-start justify-between gap-2",children:[(0,r.jsxs)("h2",{className:"font-semibold",children:["#",e.number," \xb7 ",e.title]}),(0,r.jsx)("span",{className:"rounded bg-muted px-2 py-1 text-xs",children:s?function(e){if(!e)return"머지됨";let t=new Date(e);if(Number.isNaN(t.getTime()))return"머지됨";let a=new Date(t.getTime()+324e5).toISOString();return"머지됨 ".concat(a.slice(5,10)," ").concat(a.slice(11,16)," KST")}(e.mergedAt):l?"닫힘":e.draft?"초안":"열림"})]}),(0,r.jsx)(b,{brief:e.brief,lineage:e.lineage,summary:e.summary}),(0,r.jsxs)("p",{className:"mt-3 text-sm text-muted-foreground",children:["+",e.additions," 추가 / −",e.deletions," 삭제 \xb7 파일 ",e.changedFiles]}),(0,r.jsxs)("div",{className:"mt-2 flex flex-wrap gap-2 text-xs","aria-label":"검사 상태",children:[(0,r.jsxs)("span",{className:"rounded bg-green-500/15 px-2 py-1",children:["성공 ",e.checks.success]}),(0,r.jsxs)("span",{className:"rounded bg-red-500/15 px-2 py-1",children:["실패 ",e.checks.failure]}),(0,r.jsxs)("span",{className:"rounded bg-yellow-500/15 px-2 py-1",children:["대기 ",e.checks.pending]}),e.checks.success+e.checks.failure+e.checks.pending===0&&(0,r.jsx)("span",{className:"rounded bg-slate-500/15 px-2 py-1",children:"GitHub 검사 없음 — 머지 전 검사는 아래에서 별도로 실행"})]}),(0,r.jsxs)("details",{open:c,className:"mt-3 text-sm",children:[(0,r.jsx)("summary",{className:"cursor-pointer",children:"바뀐 파일 보기"}),(0,r.jsx)("ul",{className:"mt-2 list-inside list-disc break-all",children:e.files.map(e=>(0,r.jsx)("li",{children:e},e))})]}),(0,r.jsxs)("div",{className:"mt-4 flex flex-wrap items-center gap-4",children:[(0,r.jsx)("a",{className:"text-sm text-blue-600 underline",href:e.url,target:"_blank",rel:"noopener noreferrer",children:"GitHub 에서 보기"}),!s&&!l&&(0,r.jsx)(x,{gate:e.gate,busy:null!==y,blocked:!!o,mergeLabel:y===e.number?"머지 중…":"UNKNOWN"!==(n=e.mergeable)?"승인하고 머지":null===d(i,n)?"확인 종료":"확인 중…",onCheck:()=>O(e),onMerge:()=>M(e)})]}),o&&!s&&!l&&(0,r.jsxs)("p",{className:"mt-2 text-sm text-amber-600",children:[o,"UNKNOWN"===e.mergeable&&i>=3?" 자동 확인이 끝났습니다. 최신 상태는 페이지를 새로고침하세요.":""]}),N[e.number]&&(0,r.jsx)("p",{role:"alert",className:"mt-2 text-sm text-red-600",children:N[e.number]})]},e.number)})]}):null}var w=a(74780);function y(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),a="release-loop"===e.graphId?"릴리스 발행":"announce-loop"===e.graphId?"공지":e.graphId,r=Date.parse(e.since),n=Number.isNaN(r)?0:Math.max(0,Math.floor((t-r)/6e4)),s=n<1?"방금 전":n<60?"".concat(n,"분 전"):n<1440?"".concat(Math.floor(n/60),"시간 전"):"".concat(Math.floor(n/1440),"일 전");return{title:a,nodeId:e.nodeId,waiting:s,message:e.message,recent:e.recent.map(e=>"".concat(e.ok&&"fail"!==e.outcome&&"error"!==e.outcome?"✓":"✗"," ").concat(e.nodeId).concat(e.outcome?" \xb7 ".concat(e.outcome):"").concat(e.summary?" \xb7 ".concat(e.summary):""))}}function v(e){var t,a,s,l,o,c,i;let{item:d,api:u,onDecided:m,confirm:p}=e,[h,b]=(0,n.useState)(d.feed),[x,f]=(0,n.useState)(()=>(0,w.Mz)(d.feed)),[g,y]=(0,n.useState)(!1),[v,N]=(0,n.useState)(0),[j,k]=(0,n.useState)(!1),[S,C]=(0,n.useState)(!1),[I,E]=(0,n.useState)(""),[U,L]=(0,n.useState)(""),[R,O]=(0,n.useState)(!1),M=(e,t)=>{L((0,w.LP)(e,t)),O((0,w.rH)(e))},[D,A]=(0,n.useState)({}),P=(0,n.useRef)(null),_=null!=p?p:e=>window.confirm(e),H=(i=(0,w.Mz)(h),JSON.stringify(x)!==JSON.stringify(i)),G=(0,n.useMemo)(()=>(function(e,t){let a=[];for(let r of(e.cover.image&&a.push({image:e.cover.image,isCover:!0}),t.slides))r.include&&a.push({image:r.image,caption:r.caption});return a})(h,x),[h,x]),T=G[Math.min(v,Math.max(0,G.length-1))],F=(0,n.useMemo)(()=>[h.cover.image,...h.slides.map(e=>e.image)].filter(e=>!!e),[h]);function V(e){N(t=>Math.max(0,Math.min(G.length-1,t+e)))}function z(e,t){f(a=>({...a,slides:a.slides.map((a,r)=>r===e?{...a,...t}:a)}))}function W(e,t){f(a=>{let r=e+t;if(r<0||r>=a.slides.length)return a;let n=[...a.slides];return[n[e],n[r]]=[n[r],n[e]],{...a,slides:n}})}async function Y(){C(!0),L(""),O(!1),E("");try{let e=await u.saveFeedDraft(d.graphId,d.runId,x);return b(e.feed),f((0,w.Mz)(e.feed)),E("저장했어요 \xb7 수정 ".concat(e.feed.revision," \xb7 아직 게시 전입니다")),!0}catch(e){return M(e,"save"),!1}finally{C(!1)}}async function J(){if(_("게시할까요? 승인하면 이 초안으로 게시 준비 묶음이 텔레그램으로 갑니다.")&&(!H||await Y())){C(!0),L("");try{await u.decide(d.graphId,d.runId,"approved"),m()}catch(e){M(e,"decide")}finally{C(!1)}}}async function K(){if(_("이 게시 초안을 거절할까요?")){C(!0),L("");try{await u.decide(d.graphId,d.runId,"rejected"),m()}catch(e){M(e,"decide")}finally{C(!1)}}}(0,n.useEffect)(()=>{let e=!0,t=[],a="undefined"!=typeof URL&&"function"==typeof URL.createObjectURL;return Promise.all(F.map(async r=>{try{let n=await u.feedMedia(d.graphId,d.runId,r);if(!e||!a)return null;let s=URL.createObjectURL(n);return t.push(s),[r,s]}catch(e){return null}})).then(t=>{e&&A(Object.fromEntries(t.filter(e=>!!e)))}),()=>{e=!1,a&&"function"==typeof URL.revokeObjectURL&&t.forEach(e=>URL.revokeObjectURL(e))}},[u,d.graphId,d.runId,F]);let $=(null==(t=h.brand)?void 0:t.name)||"브랜드",q=$.trim().charAt(0).toUpperCase()||"\xb7",Q=x.hashtags.join(" "),X=x.cover.text!==(null!=(s=h.cover.renderedText)?s:h.cover.text)||x.cover.sub!==(null!=(l=h.cover.renderedSub)?l:h.cover.sub);return(0,r.jsxs)("article",{"aria-label":"피드 미리보기","data-feed-revision":h.revision,className:"mx-auto w-full max-w-md overflow-hidden rounded-xl border border-border bg-card text-foreground shadow-sm",children:[(0,r.jsxs)("header",{className:"flex items-center gap-3 px-3 py-2",children:[(0,r.jsx)("span",{"aria-hidden":!0,className:"flex h-8 w-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm font-semibold",children:q}),(0,r.jsxs)("div",{className:"min-w-0",children:[(0,r.jsx)("p",{className:"truncate text-sm font-semibold",children:$}),(null==(a=h.brand)?void 0:a.handle)&&(0,r.jsx)("p",{className:"truncate text-xs text-muted-foreground",children:h.brand.handle})]}),(0,r.jsxs)("span",{className:"ml-auto shrink-0 text-xs text-muted-foreground",children:["수정 ",h.revision,H?" \xb7 저장 안 됨":""]})]}),(0,r.jsxs)("div",{className:"relative aspect-[4/5] w-full touch-pan-y select-none overflow-hidden bg-muted",onTouchStart:e=>{var t,a;P.current=null!=(a=null==(t=e.touches[0])?void 0:t.clientX)?a:null},onTouchEnd:e=>{var t;let a=P.current;P.current=null;let r=null==(t=e.changedTouches[0])?void 0:t.clientX;null==a||null==r||40>Math.abs(r-a)||V(r<a?1:-1)},children:[(null==T?void 0:T.image)&&D[T.image]?(0,r.jsx)("img",{src:D[T.image],alt:T.isCover?x.cover.text:null!=(o=T.caption)?o:"",className:"h-full w-full object-cover"}):(0,r.jsx)("div",{className:"flex h-full w-full items-center justify-center text-sm text-muted-foreground",children:"이미지 불러오는 중"}),G.length>1&&(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)("button",{type:"button","aria-label":"이전 장",disabled:0===v,onClick:()=>V(-1),className:"absolute left-2 top-1/2 -translate-y-1/2 rounded-full bg-black/40 px-2 py-1 text-white disabled:opacity-0",children:"‹"}),(0,r.jsx)("button",{type:"button","aria-label":"다음 장",disabled:v>=G.length-1,onClick:()=>V(1),className:"absolute right-2 top-1/2 -translate-y-1/2 rounded-full bg-black/40 px-2 py-1 text-white disabled:opacity-0",children:"›"})]})]}),G.length>1&&(0,r.jsx)("div",{"aria-label":"장 표시",className:"flex justify-center gap-1.5 py-2",children:G.map((e,t)=>(0,r.jsx)("span",{"data-dot":t===v?"on":"off",className:"h-1.5 w-1.5 rounded-full ".concat(t===v?"bg-primary":"bg-muted-foreground/40")},t))}),X&&(0,r.jsxs)("p",{"data-cover-pending":!0,className:"mx-3 mb-2 rounded border border-dashed border-border px-2 py-1 text-xs text-muted-foreground",children:["커버 문구 변경 — \xab",x.cover.text,x.cover.sub?" \xb7 ".concat(x.cover.sub):"","\xbb \xb7 게시 때 커버를 다시 그립니다"]}),(0,r.jsxs)("div",{className:"space-y-2 px-3 pb-3 text-sm",children:[(0,r.jsxs)("p",{className:"break-words",children:[(0,r.jsx)("span",{className:"font-semibold",children:$})," ",x.caption.hook]}),x.caption.body&&(j?(0,r.jsx)("p",{className:"whitespace-pre-wrap break-words",children:x.caption.body}):(0,r.jsx)("button",{type:"button",onClick:()=>k(!0),className:"text-muted-foreground",children:"더 보기"})),x.hashtags.length>0&&(0,r.jsx)("p",{className:"flex flex-wrap gap-x-1.5 text-primary",children:x.hashtags.map((e,t)=>(0,r.jsx)("span",{className:"whitespace-nowrap",children:e},"".concat(e,"-").concat(t)))}),x.location&&(0,r.jsxs)("p",{className:"text-xs text-muted-foreground",children:["\uD83D\uDCCD ",x.location]})]}),g&&(0,r.jsxs)("section",{"aria-label":"초안 편집",className:"space-y-3 border-t border-border px-3 py-3 text-sm",children:[(0,r.jsxs)("label",{className:"block",children:["커버 문구",(0,r.jsx)("input",{value:x.cover.text,onChange:e=>f({...x,cover:{...x.cover,text:e.target.value}}),className:"mt-1 w-full rounded border border-border bg-background px-2 py-1"})]}),(0,r.jsxs)("label",{className:"block",children:["커버 부제",(0,r.jsx)("input",{value:x.cover.sub,onChange:e=>f({...x,cover:{...x.cover,sub:e.target.value}}),className:"mt-1 w-full rounded border border-border bg-background px-2 py-1"})]}),(0,r.jsxs)("label",{className:"block",children:["첫 줄",(0,r.jsx)("input",{value:x.caption.hook,onChange:e=>f({...x,caption:{...x.caption,hook:e.target.value}}),className:"mt-1 w-full rounded border border-border bg-background px-2 py-1"})]}),(0,r.jsxs)("label",{className:"block",children:["본문",(0,r.jsx)("textarea",{value:x.caption.body,rows:4,onChange:e=>f({...x,caption:{...x.caption,body:e.target.value}}),className:"mt-1 w-full rounded border border-border bg-background px-2 py-1"})]}),(0,r.jsxs)("label",{className:"block",children:["해시태그(띄어쓰기로 구분)",(0,r.jsx)("input",{value:Q,onChange:e=>f({...x,hashtags:e.target.value.split(/\s+/).filter(Boolean)}),className:"mt-1 w-full rounded border border-border bg-background px-2 py-1"})]}),(0,r.jsxs)("label",{className:"block",children:["위치(비우면 없음)",(0,r.jsx)("input",{value:null!=(c=x.location)?c:"",onChange:e=>f({...x,location:e.target.value.trim()?e.target.value:null}),className:"mt-1 w-full rounded border border-border bg-background px-2 py-1"})]}),(0,r.jsx)("ol",{"aria-label":"사진 순서",className:"space-y-2",children:x.slides.map((e,t)=>(0,r.jsxs)("li",{"data-slide":e.image,className:"rounded border border-border p-2 ".concat(e.include?"":"opacity-50"),children:[(0,r.jsxs)("div",{className:"flex items-center gap-2",children:[(0,r.jsx)("span",{className:"w-6 shrink-0 text-xs text-muted-foreground",children:t+1}),(0,r.jsx)("input",{"aria-label":"".concat(t+1,"번 사진 설명"),value:e.caption,onChange:e=>z(t,{caption:e.target.value}),className:"min-w-0 flex-1 rounded border border-border bg-background px-2 py-1"})]}),(0,r.jsxs)("div",{className:"mt-2 flex gap-2",children:[(0,r.jsx)("button",{type:"button",disabled:0===t,onClick:()=>W(t,-1),className:"rounded border px-2 py-0.5 disabled:opacity-40",children:"앞으로"}),(0,r.jsx)("button",{type:"button",disabled:t===x.slides.length-1,onClick:()=>W(t,1),className:"rounded border px-2 py-0.5 disabled:opacity-40",children:"뒤로"}),(0,r.jsx)("button",{type:"button",onClick:()=>z(t,{include:!e.include}),className:"rounded border px-2 py-0.5",children:e.include?"빼기":"되살리기"})]})]},e.image))})]}),(I||U)&&(0,r.jsx)("p",{role:U?"alert":"status",className:"px-3 pb-2 text-sm ".concat(U?"text-red-600":"text-muted-foreground"),children:U||I}),U&&R&&(0,r.jsx)("p",{className:"px-3 pb-2 text-sm",children:(0,r.jsx)("a",{href:w.$Y,className:"font-medium underline","data-connect-token-link":!0,children:"연결 토큰 칸 열기 →"})}),(0,r.jsxs)("footer",{className:"flex flex-wrap gap-2 border-t border-border px-3 py-3",children:[(0,r.jsx)("button",{type:"button",disabled:S,onClick:()=>y(e=>!e),className:"rounded-lg border px-3 py-2 text-sm disabled:opacity-50",children:g?"편집 닫기":"편집"}),(0,r.jsx)("button",{type:"button",disabled:S||!H,onClick:()=>{Y()},className:"rounded-lg border px-3 py-2 text-sm disabled:opacity-50",children:"수정 저장"}),(0,r.jsx)("button",{type:"button",disabled:S,onClick:()=>{J()},className:"rounded-lg bg-blue-600 px-3 py-2 text-sm font-medium text-white disabled:opacity-50",children:"최종 게시"}),(0,r.jsx)("button",{type:"button",disabled:S,onClick:()=>{K()},className:"ml-auto rounded-lg px-3 py-2 text-sm text-muted-foreground disabled:opacity-50",children:"거절"})]})]})}function N(){let e,{client:t}=(0,o.Q)(),a=(0,n.useMemo)(()=>(0,w.ll)({client:t}),[t]),[s,l]=(0,n.useState)([]),[c,i]=(0,n.useState)(""),[d,u]=(0,n.useState)(!1),[m,p]=(0,n.useState)(!1),h=(0,n.useRef)((e=0,{begin:()=>e+=1,isLatest:t=>t===e})).current,b=(0,n.useCallback)(async()=>{let e=h.begin();try{let t=await a.list();if(!h.isLatest(e))return;l(t.items),i(""),u(!1)}catch(t){h.isLatest(e)&&(i((0,w.LP)(t,"list")),u((0,w.rH)(t)))}},[a,h]);async function x(e,t){if("rejected"!==t||window.confirm("".concat(y(e).title," 실행을 거절할까요?"))){p(!0),i(""),h.begin();try{await a.decide(e.graphId,e.runId,t),await b()}catch(e){i((0,w.LP)(e,"decide")),u((0,w.rH)(e))}finally{p(!1)}}}(0,n.useEffect)(()=>{b();let e=window.setInterval(()=>{b()},3e4);return()=>window.clearInterval(e)},[b]);let f=s.filter(e=>!!e.feed),g=s.filter(e=>!e.feed);return s.length||c?(0,r.jsxs)(r.Fragment,{children:[f.length>0&&(0,r.jsxs)("section",{"aria-label":"게시 대기",className:"mx-auto max-w-3xl space-y-4 px-4 pt-6 text-foreground sm:px-8",children:[(0,r.jsx)("h2",{className:"text-xl font-semibold",children:"게시 대기"}),(0,r.jsx)("p",{className:"text-sm text-muted-foreground",children:"고쳐서 저장해도 대기열에 남습니다. \xab최종 게시\xbb를 눌러야만 올라갑니다."}),f.map(e=>(0,r.jsx)(v,{item:e,api:a,onDecided:()=>{h.begin(),b()}},"".concat(e.graphId,"/").concat(e.runId)))]}),(g.length>0||c)&&(0,r.jsxs)("section",{"aria-label":"실행 승인",className:"mx-auto max-w-3xl space-y-4 px-4 pt-6 text-foreground sm:px-8",children:[(0,r.jsx)("h2",{className:"text-xl font-semibold",children:"실행 승인"}),c&&(0,r.jsx)("p",{role:"alert",className:"text-sm text-red-600",children:c}),c&&d&&(0,r.jsx)("p",{className:"text-sm",children:(0,r.jsx)("a",{href:w.$Y,className:"font-medium underline","data-connect-token-link":!0,children:"연결 토큰 칸 열기 →"})}),g.map(e=>{let t=y(e);return(0,r.jsxs)("article",{className:"rounded-xl border border-border bg-card p-5 shadow-sm",children:[(0,r.jsx)("h3",{className:"font-semibold",children:t.title}),(0,r.jsxs)("p",{className:"mt-1 text-sm text-muted-foreground",children:["멈춘 단계: ",t.nodeId," \xb7 ",t.waiting,"부터 대기 중"]}),(0,r.jsx)("p",{className:"mt-3 whitespace-pre-wrap break-words text-sm",children:t.message}),t.recent.length>0&&(0,r.jsxs)("div",{className:"mt-3 text-sm",children:[(0,r.jsx)("p",{className:"font-medium",children:"최근 단계"}),(0,r.jsx)("ul",{className:"mt-1 space-y-1",children:t.recent.map((e,t)=>(0,r.jsx)("li",{className:"break-words",children:e},t))})]}),(0,r.jsxs)("div",{className:"mt-4 flex gap-2",children:[(0,r.jsx)("button",{type:"button",disabled:m,onClick:()=>{x(e,"approved")},className:"rounded-lg bg-blue-600 px-4 py-2 text-sm font-medium text-white disabled:opacity-50",children:"승인"}),(0,r.jsx)("button",{type:"button",disabled:m,onClick:()=>{x(e,"rejected")},className:"rounded-lg border px-4 py-2 text-sm disabled:opacity-50",children:"거절"})]})]},"".concat(e.graphId,"/").concat(e.runId))})]})]}):null}function j(){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(N,{}),(0,r.jsx)(g,{})]})}},90519:(e,t,a)=>{Promise.resolve().then(a.bind(a,88843))},97479:(e,t,a)=>{"use strict";a.d(t,{GC:()=>n,In:()=>i,OG:()=>o});var r=a(46124);let n="elanous.pwa.role",s="elanous:pwa-role";function l(){try{let e=window.localStorage.getItem(n);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function o(e){try{window.localStorage.setItem(n,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(s))}function c(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(s,e);let t=t=>{(t.key===n||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(s,e),window.removeEventListener("storage",t)}}function i(){return(0,r.useSyncExternalStore)(c,l,()=>"general")}}},e=>{e.O(0,[1826,8060,2463,2196,7358],()=>e(e.s=90519)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7081],{5997:(e,t,n)=>{"use strict";n.d(t,{Zr:()=>l,f6:()=>a,oD:()=>s});let r="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 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=a();return localStorage.setItem(r,t),t}function l(){let e=a();return localStorage.setItem(r,e),e}},7456:(e,t,n)=>{"use strict";n.d(t,{Er:()=>a,cj:()=>c,dc:()=>l,yR:()=>i});let r=/^(oauth\.|harness\.decision|llm\.router)/;function a(e){let t=[],n=e=>{"string"==typeof e&&e.trim()&&!t.includes(e.trim())&&t.push(e.trim())};for(let t of e){var a;let e=null!=(a=t.data)?a:{};if(t.category.startsWith("oauth.")){for(let t of["from","to","name","account"])n(e[t]);if(Array.isArray(e.usage))for(let t of e.usage)n(null==t?void 0:t.name);continue}if(r.test(t.category))for(let t of(n(e.account),["what","why","reason"])){let r=e[t];if("string"==typeof r)for(let e of r.matchAll(/계정\s+([A-Za-z0-9][\w.-]*)/g))n(e[1])}}return t}function s(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function l(e){let t=new Map(e.map((e,t)=>[e,"account-".concat(t+1)])),n=e.length?RegExp("(^|[^\\w-])(".concat(e.map(s).sort((e,t)=>t.length-e.length).join("|"),")(?![\\w-])"),"g"):null,r=new Map;return(e,a)=>{let s=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();r.has(t)||r.set(t,"remote-".concat(r.size+1));let n=r.get(t);return e===e.toUpperCase()?n.toUpperCase():n})(e)).replace(/\bmbp\b/gi,e=>e===e.toUpperCase()?"LOCAL":"local").replace(/\/Users\/[^/\s"']+/g,"~").replace(/(크레딧|credits?|💳)(\s*[:=]?\s*)[\d][\d,.]*/gi,"$1$2•••").replace(/[\d][\d,.]*(\s*)(크레딧|credits?)/gi,"•••$1$2").replace(/\$\s?[\d][\d,.]*/g,"$•••").replace(/(잔량?|remaining|left)(\s*[:=]?\s*)(?:[A-Za-z0-9][\w.-]*\s+)?\d+(?:\.\d+)?\s?%/gi,"$1$2•••");return a&&n&&(s=s.replace(n,(e,n,r)=>{var a;return"".concat(n).concat(null!=(a=t.get(r))?a:"account")})),s}}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 n={};for(let[r,a]of Object.entries(e))"apiEquivalentUsd"===r||"usd"===r||/credit(s|Balance)?$/i.test(r)||(n[r]=o(a,t));return n}return e}function i(e){let t=l(a(e));return e.map(e=>{let n=r.test(e.category);return{...e,event:t(e.event,!1),data:e.data?o(e.data,e=>t(e,n)):e.data}})}function c(e,t){let n=l(t);return o(e,e=>n(e,!0))}},15151:(e,t,n)=>{"use strict";n.d(t,{C:()=>c,DaemonProvider:()=>d,Q:()=>u});var r=n(55539),a=n(46124),s=n(8101),l=n(5997),o=n(18060),i=n(72215);let c=(0,a.createContext)(null);function d(e){let{children:t}=e,n={baseUrl:"",token:"",provider:""},[d,u]=(0,a.useState)(n),[m,p]=(0,a.useState)(""),[f]=(0,a.useState)(()=>new o.ki(n));(0,a.useEffect)(()=>{let e=(0,s.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,a.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.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 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=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},x=(0,a.useMemo)(()=>({config:d,setConfig:h,client:f,sessionId:m,setSessionId:g}),[d,f,m]);return(0,r.jsx)(c.Provider,{value:x,children:t})}function u(){let e=(0,a.useContext)(c);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},39399:(e,t,n)=>{Promise.resolve().then(n.bind(n,99850))},99850:(e,t,n)=>{"use strict";n.r(t),n.d(t,{default:()=>k});var r=n(55539),a=n(7456);function s(e){return e.map(e=>({...(0,a.cj)(e,[]),taskId:e.taskId,...e.wishReply?{wishReply:{surface:e.wishReply.surface,address:null}}:{}}))}var l=n(46124),o=n(15151);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=n(79247);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,r.jsxs)("details",{className:"mt-2 text-xs",children:[(0,r.jsx)("summary",{className:"cursor-pointer text-muted-foreground",children:"JSON"}),(0,r.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,n=new Date(t.ts).toISOString();return(0,r.jsxs)("div",{className:"flex flex-wrap gap-x-3 gap-y-1 text-xs text-muted-foreground",children:[(0,r.jsxs)("span",{children:["Owner: ",t.owner]}),(0,r.jsx)("time",{dateTime:n,children:n})]})}function h(e){var t,n;let{card:a,placements:s}=e,l=null==(t=a.sections.gates)?void 0:t.data;return(0,r.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,r.jsxs)("header",{children:[(0,r.jsx)("h2",{className:"text-lg font-semibold",children:i(a)}),(0,r.jsx)("p",{className:"break-all text-xs text-muted-foreground",children:a.taskId})]}),void 0!==a.wishReply&&(0,r.jsxs)("section",{"aria-label":"Wish reply destination",className:"rounded-xl border border-border p-3 text-sm",children:[(0,r.jsx)("h3",{className:"mb-1 font-semibold",children:"어디로 회신하나"}),(0,r.jsx)("p",{className:"break-all",children:a.wishReply?"".concat(null!=(n=({telegram:"텔레그램 대화",pwa:"PWA",tui:"TUI",linear:"Linear"})[a.wishReply.surface])?n:a.wishReply.surface).concat(a.wishReply.address?" \xb7 ".concat(a.wishReply.address):""):"회신 주소 없음"})]}),void 0!==a.wishReply&&(0,r.jsxs)("section",{"aria-label":"Wish reply history",className:"rounded-xl border border-border p-3 text-sm",children:[(0,r.jsx)("h3",{className:"mb-1 font-semibold",children:"회신 이력"}),(0,r.jsx)("p",{className:"text-muted-foreground",children:"카드 원장에는 회신 발송 이력이 기록되지 않습니다"})]}),s&&(0,r.jsxs)("p",{className:"overflow-x-auto whitespace-nowrap text-sm","aria-label":"Wish placement and progress",children:["배치 \xb7 ",s.length?s.map(e=>{let{cellId:t,cellTitle:n,version:r,status:a}=e;return"".concat(t," ").concat(n," \xb7 ").concat(r,"판 \xb7 ").concat(d[a])}).join(" / "):"아직 배치되지 않음"]}),l&&(0,r.jsxs)("p",{className:"overflow-x-auto whitespace-nowrap text-sm","aria-label":"Gate decisions",children:["Gate \xb7 budget: ",m(l.budget)," \xb7 location: ",m(l.location)]}),u.map(e=>{let t=a.sections[e];return t?(0,r.jsxs)("section",{"aria-label":"".concat(e," section"),className:"rounded-xl border border-border p-3",children:[(0,r.jsx)("h3",{className:"mb-1 text-sm font-semibold capitalize",children:e}),(0,r.jsx)(f,{entry:t}),(0,r.jsx)(p,{entry:t})]},e):null}),(0,r.jsxs)("section",{"aria-label":"Incidents",className:"space-y-2",children:[(0,r.jsxs)("h3",{className:"text-sm font-semibold",children:["Incidents (",a.incidents.length,")"]}),a.incidents.length?(0,r.jsx)("ol",{className:"space-y-2",children:a.incidents.map(e=>(0,r.jsxs)("li",{className:"rounded-xl border border-border p-3",children:[(0,r.jsx)(f,{entry:e}),(0,r.jsx)(p,{entry:e})]},e.key))}):(0,r.jsx)("p",{className:"text-xs text-muted-foreground",children:"No incidents."})]})]})}let g=["steward","execution","landing","release","done"],x=new Set(["intake","triage","gates","relations","memory","workspace","run","landing","release","incidents"]);function b(e){let t=[],n=Date.parse(e.createdAt),r=e.sections.find(e=>"intake:reply:0"===e.key),a=null;if(r)try{let e=JSON.parse(r.content);if(e&&"object"==typeof e&&!Array.isArray(e)){let{surface:t,address:n}=e;"string"==typeof t&&("string"==typeof n||null===n)&&(a={surface:t,address:n})}}catch(e){}for(let r of e.sections){let a;if(!x.has(r.key))continue;try{let e=JSON.parse(r.content);a=e&&"object"==typeof e&&!Array.isArray(e)?e:{content:r.content}}catch(e){a={content:r.content}}let s=Date.parse(r.createdAt);t.push({taskId:e.id,section:r.key,key:"".concat(r.key,":").concat(r.createdAt,":").concat(t.length),owner:r.owner,ts:Number.isFinite(s)?s:n,data:a,..."string"==typeof a.runId?{runId:a.runId}:{}})}if(0===t.length&&t.push({taskId:e.id,section:"triage",key:"api:title",owner:"task-card API",ts:n,data:{title:e.title}}),"closed"===e.status){let r=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(n,...t.map(e=>e.ts)),data:{...null==r?void 0:r.data,status:"done"}})}return{...function(e){let t,n=e[0];if(!n)return null;let r={},a=[],s=new Set,l=n.ts,o=-1/0;for(let i of e)if(!(i.taskId!==n.taskId||s.has(i.key)))if(s.add(i.key),l=Math.max(l,i.ts),i.runId&&i.ts>=o&&(t=i.runId,o=i.ts),"incidents"===i.section)a.push(i);else{let e=r[i.section];(!e||i.ts>=e.ts)&&(r[i.section]=i)}return{taskId:n.taskId,sections:r,incidents:a,updatedAt:l,...t?{runId:t}:{}}}(t),apiTitle:e.title,...e.goalId.startsWith("wish:")?{wishReply:a}:{}}}function y(e){let{cards:t,selectedId:n,onSelect:a,selectedCard:s,detailError:l,placements:o}=e,c=(null==s?void 0:s.taskId)===n?s:null;return(0,r.jsxs)("div",{className:"space-y-4 p-4",children:[(0,r.jsx)("h1",{className:"text-xl font-semibold",children:"보드"}),(0,r.jsx)("div",{className:"grid gap-3 md:grid-cols-2 xl:grid-cols-5",children:g.map(e=>(0,r.jsxs)("section",{"aria-label":"".concat(e," column"),className:"min-w-0 space-y-2 rounded-xl border border-border p-3",children:[(0,r.jsx)("h2",{className:"text-sm font-semibold capitalize",children:e}),t.filter(t=>(function(e){var t;let n=null==(t=e.sections.release)?void 0:t.data;return(null==n?void 0:n.status)==="done"||(null==n?void 0:n.status)==="completed"?"done":n?"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,s;return(0,r.jsxs)("button",{type:"button",onClick:()=>a(e.taskId),"aria-pressed":n===e.taskId,className:"w-full rounded-lg border border-border bg-card p-3 text-left text-sm hover:bg-accent/40",children:[(0,r.jsx)("span",{className:"block font-medium",children:i(e)}),(0,r.jsx)("span",{className:"block text-xs text-muted-foreground",children:(0,r.jsx)("time",{dateTime:new Date(e.updatedAt).toISOString(),title:new Date(e.updatedAt).toLocaleString(),children:(t=function(e){let t=new Map;for(let r of e.incidents){var n;let e=null!=(n=r.data.incidentId)?n:r.data.id,a="string"==typeof e&&e.trim()?e:r.key,s=t.get(a);(!s||r.ts>=s.ts)&&t.set(a,r)}return Array.from(t.values()).filter(e=>"closed"!==e.data.status&&"resolved"!==e.data.status).length}(e),s=Date.now(),[...t>0?["사고 ".concat(t)]:[],...e.runId?["런 ".concat(e.runId.replace(/^run-/,"").slice(0,8))]:[],function(e,t,n){let r=Math.floor((t-e)/6e4);if(!Number.isFinite(r)||r<1)return"방금";if(r<60)return"".concat(r,"분 전");if(r<1440)return"".concat(Math.floor(r/60),"시간 전");let a=new Intl.DateTimeFormat("ko-KR",{month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit",hour12:!1,...n?{timeZone:n}:{}}).formatToParts(new Date(e)),s=e=>{var t,n;return null!=(n=null==(t=a.find(t=>t.type===e))?void 0:t.value)?n:""};return"".concat(s("month"),"/").concat(s("day")," ").concat(s("hour"),":").concat(s("minute"))}(e.updatedAt,s,void 0)]).join(" \xb7 ")})})]},e.taskId)})]},e))}),n&&(0,r.jsxs)("aside",{className:"max-w-3xl space-y-2","aria-label":"Selected card",children:[(0,r.jsx)("button",{type:"button",onClick:()=>a(null),"aria-label":"Close card detail",className:"text-sm text-muted-foreground",children:"Close"}),c?(0,r.jsx)(h,{card:c,placements:o}):(0,r.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]),[n,i]=(0,l.useState)([]),[d,u]=(0,l.useState)(null),[m,p]=(0,l.useState)(null),[f,h]=(0,l.useState)(void 0),[g,x]=(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 I=(0,l.useMemo)(()=>v?s(n):n,[n,v]),N=v&&m?s([m])[0]:m,S=v&&f?(0,a.cj)(f,[]):f;return(0,l.useEffect)(()=>{let e=!1;if(i([]),u(null),p(null),h(void 0),x(null),!t)return void k("Connect to NEXUS to load task cards.");k(null);let n=()=>t.getTaskCards().then(t=>{let{cards:n}=t;e||(i(n.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))});n();let r=setInterval(()=>{n()},1e4);return()=>{e=!0,clearInterval(r)}},[t]),(0,l.useEffect)(()=>{if(!t||!d)return;let e=!1;return p(null),h(void 0),x(null),t.getTaskCard(d).then(t=>{let{card:n,placements:r}=t;e||(h(r),p(b(n)))}).catch(t=>{e||x(t instanceof Error?t.message:String(t))}),()=>{e=!0}},[t,d]),(0,r.jsxs)(r.Fragment,{children:[w&&(0,r.jsx)("p",{role:"status",className:"p-4 text-sm text-muted-foreground",children:w}),(0,r.jsx)(y,{cards:I,selectedId:d,selectedCard:N,detailError:g,placements:S,onSelect:e=>{(null===e||d!==e)&&(p(null),h(void 0),x(null),u(e))}})]})}function k(){return(0,r.jsx)(w,{})}}},e=>{e.O(0,[8060,9247,2463,2196,7358],()=>e(e.s=39399)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7955],{58099:(e,t,s)=>{Promise.resolve().then(s.bind(s,66307))},66307:(e,t,s)=>{"use strict";s.d(t,{BotlabPageContent:()=>h});var r,l=s(55539),a=s(46124);let o=(null!=(r=s(11041).env.NEXT_PUBLIC_ELANOUS_BOTLAB_HOST)?r:"").trim(),n="elanous.botlab.wallHost",d=/^[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;function i(e){return e.length>0&&e.length<=253&&d.test(e)}function c(e){var t;let{search:s,remembered:r=null}=e,d=(0,a.useMemo)(()=>(function(e){var t,s;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,l=null;try{l=new URLSearchParams(e).get("host")}catch(e){l=null}let a=null!=(t=null==l?void 0:l.trim())?t:"";if(""!==a&&i(a))return{host:a,source:"query",rejected:null};let n=""===a?null:a,d=null!=(s=null==r?void 0:r.trim())?s:"";return""!==d&&i(d)?{host:d,source:"remembered",rejected:n}:""!==o&&i(o)?{host:o,source:"default",rejected:n}:{host:"",source:"unset",rejected:n}})(s,r),[s,r]),c="unset"===d.source?null:(t=d.host,"https://".concat(t).concat("/bot3/bot-wall.html"));return(0,a.useEffect)(()=>{if("query"===d.source)try{window.localStorage.setItem(n,d.host)}catch(e){}},[d.source,d.host]),(0,l.jsxs)("main",{className:"mx-auto flex w-full max-w-6xl flex-col gap-6 px-6 py-10 sm:px-10","data-testid":"botlab-panel",children:[(0,l.jsxs)("header",{children:[(0,l.jsx)("p",{className:"text-xs font-semibold uppercase tracking-[0.18em] text-muted-foreground",children:"Bot screens"}),(0,l.jsx)("h1",{className:"mt-2 text-3xl font-bold",children:"Botlab"}),(0,l.jsxs)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:["Live noVNC screens for the bots, served through Tailscale. One document holds all four sessions, so the VNC password is asked ",(0,l.jsx)("strong",{children:"once"}),", not four times."]}),(0,l.jsx)("p",{className:"mt-2 max-w-3xl text-sm text-muted-foreground",children:"View-only by default. This surface cannot send commands or control the bots."})]}),(0,l.jsxs)("section",{className:"rounded-xl border border-border bg-card p-4","aria-label":"Wall address",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:"Wall address"}),(0,l.jsx)("p",{className:"mt-1 break-all font-mono text-xs text-muted-foreground","data-testid":"botlab-wall-url",children:null!=c?c:"(no host configured)"}),(0,l.jsx)("p",{className:"mt-2 text-xs text-muted-foreground","data-testid":"botlab-host-source",children:"query"===d.source?"Host came from the ?host= query parameter (remembered on this device).":"remembered"===d.source?"Host is the one remembered on this device; override it with ?host=<tailnet-name>.":"default"===d.source?"Host is the build default (NEXT_PUBLIC_ELANOUS_BOTLAB_HOST); override it with ?host=<tailnet-name>.":"No wall host is configured. Open this page once with ?host=<the VM tailnet name> — it is remembered on this device."}),null!==d.rejected&&(0,l.jsxs)("p",{role:"alert",className:"mt-2 text-xs text-destructive","data-testid":"botlab-host-rejected",children:["Ignored ?host=",d.rejected," — not a valid hostname."]}),null!==c&&(0,l.jsxs)("p",{className:"mt-3 text-xs text-muted-foreground",children:[(0,l.jsx)("a",{className:"underline",href:c,target:"_blank",rel:"noreferrer","data-testid":"botlab-open-tab",children:"Open the wall in a new tab"})," — ","use this if the embedded frame stays blank."]})]}),null!==c&&(0,l.jsx)("section",{"aria-label":"Bot screen wall",children:(0,l.jsx)("iframe",{src:c,title:"Bot screen wall","data-testid":"botlab-wall-frame",className:"h-[70vh] w-full rounded-xl border border-border bg-background"})}),(0,l.jsxs)("section",{className:"rounded-xl border border-border bg-card p-5","aria-label":"If the wall is blank",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:"If the wall stays blank"}),(0,l.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"A blank frame is not necessarily a broken bot. There are three separate reasons, with different fixes:"}),(0,l.jsxs)("ol",{className:"mt-3 list-decimal space-y-2 pl-5 text-sm text-muted-foreground",children:[(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"This device is outside the tailnet."})," The address simply does not exist here. Join the tailnet, or view the screens from a device that is on it."]}),(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"Tailscale serve is not published."})," Re-run"," ",(0,l.jsx)("code",{className:"font-mono text-xs",children:"bash scripts/botlab/deploy-bot-wall.sh"}),", which re-publishes the paths and then verifies each one returns 200."]}),(0,l.jsxs)("li",{children:[(0,l.jsx)("strong",{children:"The wall loaded but did not connect."})," That is a VNC-level failure, not a page failure — the wall itself reports connected/failed counts once you enter the password."]})]}),(0,l.jsx)("p",{className:"mt-3 text-xs text-muted-foreground",children:"The VNC password is deliberately not carried in this page or in the URL: any page a bot browser opens could otherwise reach the local websocket, and websockets have no CORS."})]}),(0,l.jsxs)("section",{className:"rounded-xl border border-dashed border-border p-5","aria-label":"Not wired yet",children:[(0,l.jsx)("h2",{className:"text-sm font-semibold",children:"Not wired yet"}),(0,l.jsxs)("ul",{className:"mt-2 list-disc space-y-1 pl-5 text-sm text-muted-foreground",children:[(0,l.jsxs)("li",{children:["Per-bot cell headers (name \xb7 last round verdict \xb7 whether CDP is alive) need"," ",(0,l.jsx)("code",{className:"font-mono text-xs",children:"browserPort"})," and round results on the daemon's persona route. That route is owned by another track and is not published today."]}),(0,l.jsx)("li",{children:"Running a command from this surface needs a POST route that does not exist yet."})]})]})]})}function h(){let e=window.location.search,t=null;try{t=window.localStorage.getItem(n)}catch(e){t=null}return(0,l.jsx)(c,{search:e,remembered:t})}}},e=>{e.O(0,[2463,2196,7358],()=>e(e.s=58099)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[3933],{5997:(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}},8015:(e,t,s)=>{Promise.resolve().then(s.bind(s,29744))},15151:(e,t,s)=>{"use strict";s.d(t,{C:()=>i,DaemonProvider:()=>d,Q:()=>m});var a=s(55539),n=s(46124),r=s(8101),l=s(5997),o=s(18060),c=s(72215);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}},29744:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>c});var a=s(55539),n=s(46124),r=s(15151);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?"보내는 중…":"보내기"})]})]})}}},e=>{e.O(0,[8060,2463,2196,7358],()=>e(e.s=8015)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2580],{5997:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>o,f6:()=>n,oD:()=>s});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 s(){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 o(){let e=n();return localStorage.setItem(a,e),e}},9734:(e,t,r)=>{"use strict";r.d(t,{$:()=>l});var a=r(55539),n=r(89545),s=r(17154),o=r(44373);let i=(0,s.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function l(e){let{className:t,variant:r="default",size:s="default",...l}=e;return(0,a.jsx)(n.$,{"data-slot":"button",className:(0,o.cn)(i({variant:r,size:s,className:t})),...l})}},15151:(e,t,r)=>{"use strict";r.d(t,{C:()=>d,DaemonProvider:()=>c,Q:()=>u});var a=r(55539),n=r(46124),s=r(8101),o=r(5997),i=r(18060),l=r(72215);let d=(0,n.createContext)(null);function c(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[c,u]=(0,n.useState)(r),[p,m]=(0,n.useState)(""),[g]=(0,n.useState)(()=>new i.ki(r));(0,n.useEffect)(()=>{let e=(0,s.Fp)();u(e),g.updateConfig(e),m((0,o.oD)()),(0,l.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[g]),(0,n.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();g.updateConfig(t),u(t),(0,l.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,l.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[g]);let x=e=>{u(t=>{let r={...t,...e};return(0,s.Qc)(e),g.updateConfig(r),(0,l.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},v=e=>{m(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,l.cY)("webterm.provider.daemon.session-set",{sessionId:e})},f=(0,n.useMemo)(()=>({config:c,setConfig:x,client:g,sessionId:p,setSessionId:v}),[c,g,p]);return(0,a.jsx)(d.Provider,{value:f,children:t})}function u(){let e=(0,n.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},30158:(e,t,r)=>{"use strict";r.d(t,{p:()=>o});var a=r(55539);r(46124);var n=r(8085),s=r(44373);function o(e){let{className:t,type:r,...o}=e;return(0,a.jsx)(n.p,{type:r,"data-slot":"input",className:(0,s.cn)("h-8 w-full min-w-0 rounded-lg border border-input bg-transparent px-2.5 py-1 text-base transition-colors outline-none file:inline-flex file:h-6 file:border-0 file:bg-transparent file:text-sm file:font-medium file:text-foreground placeholder:text-muted-foreground focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 disabled:pointer-events-none disabled:cursor-not-allowed disabled:bg-input/50 disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 md:text-sm dark:bg-input/30 dark:disabled:bg-input/80 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40",t),...o})}},38012:(e,t,r)=>{Promise.resolve().then(r.bind(r,65137))},44373:(e,t,r)=>{"use strict";r.d(t,{cn:()=>s});var a=r(20852),n=r(30984);function s(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,n.QP)((0,a.$)(t))}},65137:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>s});var a=r(55539),n=r(93521);function s(){return(0,a.jsx)(n.U,{})}},93521:(e,t,r)=>{"use strict";r.d(t,{U:()=>m});var a=r(55539),n=r(46124),s=r(15151),o=r(9734),i=r(30158);function l(e){let{items:t}=e;return 0===t.length?(0,a.jsx)("div",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:"No control signals matched the current filter."}):(0,a.jsx)("ul",{className:"space-y-2",children:t.map((e,t)=>{var r,n,s,o,i;let l=[(null==(r=e.scope)?void 0:r.surface)&&"surface=".concat(e.scope.surface),(null==(n=e.scope)?void 0:n.channel)&&"channel=".concat(e.scope.channel),(null==(s=e.scope)?void 0:s.sessionId)&&"session=".concat(e.scope.sessionId)].filter(Boolean).join(" \xb7 ")||"unscoped";return(0,a.jsxs)("li",{className:"rounded-lg border border-border bg-card p-3 shadow-sm",children:[(0,a.jsxs)("div",{className:"text-sm font-medium",children:[e.kind," \xb7 ",e.urgency]}),(0,a.jsxs)("div",{className:"mt-0.5 font-mono text-[10px] text-muted-foreground",children:[function(e){let t=Date.now()-new Date(e).getTime();return t<6e4?"just now":t<36e5?"".concat(Math.floor(t/6e4),"m ago"):t<864e5?"".concat(Math.floor(t/36e5),"h ago"):"".concat(Math.floor(t/864e5),"d ago")}(e.createdAt)," \xb7 ",null!=(o=e.source)?o:"unknown"," \xb7 ",l]}),(0,a.jsx)("pre",{className:"mt-2 overflow-x-auto rounded-md bg-muted p-2 text-[11px]",children:JSON.stringify(null!=(i=e.payload)?i:{},null,2)})]},t)})})}let d=["background","quick-pass","normal","priority","critical"];class c{async list(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=new URLSearchParams;Object.entries(e).forEach(e=>{let[r,a]=e;a&&t.set(r,a)});let r=t.toString();return this.client.fetchJson("/v1/control-signals".concat(r?"?".concat(r):""))}emit(e){return this.client.fetchJson("/v1/control-signals",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(e)})}constructor(e){this.client=e}}var u=r(67327),p=r(72215);function m(){var e,t,r,m;let{client:g}=(0,s.Q)(),x=(0,n.useMemo)(()=>new c(g),[g]),[v,f]=(0,n.useState)({items:[]}),[b,h]=(0,n.useState)(!1),[y,w]=(0,n.useState)(""),[k,j]=(0,n.useState)(""),[N,S]=(0,n.useState)(""),[C,z]=(0,n.useState)(""),[I,E]=(0,n.useState)(""),[U,D]=(0,n.useState)(""),[_,O]=(0,n.useState)("normal"),[P,J]=(0,n.useState)("operator"),[R,Y]=(0,n.useState)(""),[M,V]=(0,n.useState)(""),[$,F]=(0,n.useState)(""),[L,Q]=(0,n.useState)(""),[T,q]=(0,n.useState)(!1),A=(0,n.useCallback)(async()=>{(0,p.cY)("webterm.control.list.refresh",{kind:y,surface:k,minUrgency:N,sessionId:C,limit:I}),h(!0);try{let e=await x.list({kind:y||void 0,surface:k||void 0,minUrgency:N||void 0,sessionId:C||void 0,limit:I||void 0});f(e)}catch(e){u.oR.error("signals list failed: ".concat(e instanceof Error?e.message:e))}finally{h(!1)}},[x,y,k,N,C,I]);(0,n.useEffect)(()=>{A()},[A]);let B=async e=>{if(e.preventDefault(),!U.trim())return void u.oR.error("kind required");let t={};if(L.trim())try{t=JSON.parse(L)}catch(e){u.oR.error("payload must be valid JSON");return}let r={kind:U.trim(),urgency:_,source:P.trim()||"operator",mayPreempt:T,payload:t,scope:{...R?{surface:R}:{},...M?{channel:M}:{},...$?{sessionId:$}:{}}};(0,p.cY)("webterm.control.emit",{kind:r.kind,urgency:r.urgency});try{h(!0),await x.emit(r),u.oR.success("signal emitted"),Q(""),await A()}catch(e){u.oR.error("emit failed: ".concat(e instanceof Error?e.message:e))}finally{h(!1)}},K=null!=(e=v.countsByKind)?e:{};return(0,a.jsxs)("div",{className:"mx-auto max-w-5xl space-y-4 p-4",children:[(0,a.jsxs)("header",{className:"space-y-2",children:[(0,a.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Control signals"}),(0,a.jsxs)("div",{className:"flex flex-wrap gap-2 text-[11px] text-muted-foreground",children:[(0,a.jsxs)("span",{className:"rounded-full border border-border px-2 py-0.5",children:["total ",null!=(t=v.total)?t:0]}),(0,a.jsxs)("span",{className:"rounded-full border border-border px-2 py-0.5",children:["latest ",null!=(r=v.latest)?r:"-"]}),Object.entries(K).map(e=>{let[t,r]=e;return(0,a.jsxs)("span",{className:"rounded-full border border-border px-2 py-0.5",children:[t," ",r]},t)})]})]}),(0,a.jsxs)("form",{onSubmit:e=>{e.preventDefault(),A()},className:"flex flex-wrap items-center gap-2 rounded-lg border border-border bg-card p-3 shadow-sm",children:[(0,a.jsx)(i.p,{value:y,onChange:e=>w(e.target.value),placeholder:"kind",className:"flex-1 min-w-[140px]"}),(0,a.jsx)(i.p,{value:k,onChange:e=>j(e.target.value),placeholder:"surface",className:"flex-1 min-w-[140px]"}),(0,a.jsxs)("select",{value:N,onChange:e=>S(e.target.value),className:"h-9 flex-1 min-w-[170px] rounded-md border border-input bg-background px-2 text-sm",children:[(0,a.jsx)("option",{value:"",children:"min urgency (any)"}),d.map(e=>(0,a.jsx)("option",{value:e,children:e},e))]}),(0,a.jsx)(i.p,{value:C,onChange:e=>z(e.target.value),placeholder:"session id",className:"flex-1 min-w-[140px]"}),(0,a.jsx)(i.p,{value:I,onChange:e=>E(e.target.value),placeholder:"limit",type:"number",className:"w-[100px]"}),(0,a.jsx)(o.$,{type:"submit",size:"sm",disabled:b,children:"Filter"})]}),(0,a.jsxs)("form",{onSubmit:B,className:"space-y-2 rounded-lg border border-border bg-card p-3 shadow-sm",children:[(0,a.jsx)("h2",{className:"text-sm font-semibold",children:"Emit a signal"}),(0,a.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,a.jsx)(i.p,{value:U,onChange:e=>D(e.target.value),placeholder:"kind (required)",className:"flex-1 min-w-[140px]"}),(0,a.jsx)("select",{value:_,onChange:e=>{let t=e.target.value;"string"==typeof t&&d.includes(t)&&O(t)},className:"h-9 rounded-md border border-input bg-background px-2 text-sm",children:d.map(e=>(0,a.jsx)("option",{value:e,children:e},e))}),(0,a.jsx)(i.p,{value:P,onChange:e=>J(e.target.value),placeholder:"source",className:"flex-1 min-w-[120px]"}),(0,a.jsx)(i.p,{value:R,onChange:e=>Y(e.target.value),placeholder:"scope.surface",className:"flex-1 min-w-[120px]"}),(0,a.jsx)(i.p,{value:M,onChange:e=>V(e.target.value),placeholder:"scope.channel",className:"flex-1 min-w-[120px]"}),(0,a.jsx)(i.p,{value:$,onChange:e=>F(e.target.value),placeholder:"scope.session",className:"flex-1 min-w-[120px]"}),(0,a.jsxs)("label",{className:"flex items-center gap-1.5 text-xs",children:[(0,a.jsx)("input",{type:"checkbox",checked:T,onChange:e=>q(e.target.checked)}),"mayPreempt"]})]}),(0,a.jsx)("textarea",{value:L,onChange:e=>Q(e.target.value),placeholder:'payload JSON (optional, e.g. {"reason":"manual"})',rows:3,className:"w-full resize-y rounded-md border border-input bg-background px-3 py-2 font-mono text-xs"}),(0,a.jsx)(o.$,{type:"submit",size:"sm",disabled:b,children:"Emit"})]}),(0,a.jsx)(l,{items:null!=(m=v.items)?m:[]})]})}}},e=>{e.O(0,[211,8682,7327,8085,8060,2463,2196,7358],()=>e(e.s=38012)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[9902],{1736:(e,t,r)=>{"use strict";r.d(t,{r:()=>o});var s=r(55539),l=r(3558),a=r.n(l);let n=[{key:"autopilot",href:"/autopilot",num:"①",label:"미션",sub:"Autopilot"},{key:"tasks",href:"/tasks",num:"②",label:"작업",sub:"Tasks"},{key:"scheduler",href:"/scheduler",num:"③",label:"스케줄",sub:"Schedules"}];function o(e){let{active:t}=e;return(0,s.jsxs)("nav",{"aria-label":"Mission Fabric 파이프라인","data-testid":"fabric-stage-header",className:"flex flex-wrap items-center gap-1 text-xs",children:[(0,s.jsx)("span",{className:"mr-1 text-muted-foreground",children:"Missions"}),n.map((e,r)=>(0,s.jsxs)("span",{className:"flex items-center gap-1",children:[(0,s.jsxs)(a(),{href:e.href,"aria-current":e.key===t?"page":void 0,className:["rounded px-2 py-1 ring-1 transition-colors",e.key===t?"bg-primary/15 font-medium text-foreground ring-primary/40":"text-muted-foreground ring-border hover:bg-muted hover:text-foreground"].join(" "),children:[(0,s.jsx)("span",{className:"mr-1",children:e.num}),e.label,(0,s.jsx)("span",{className:"ml-1 text-[10px] opacity-70",children:e.sub})]}),r<n.length-1&&(0,s.jsx)("span",{className:"text-muted-foreground/50","aria-hidden":!0,children:"→"})]},e.key))]})}},5997:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>n,f6:()=>l,oD:()=>a});let s="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 a(){let e=function(){let e=new URLSearchParams(window.location.search).get("session");return e?(localStorage.setItem(s,e),e):localStorage.getItem(s)}();if(e)return e;let t=l();return localStorage.setItem(s,t),t}function n(){let e=l();return localStorage.setItem(s,e),e}},15151:(e,t,r)=>{"use strict";r.d(t,{C:()=>d,DaemonProvider:()=>u,Q:()=>c});var s=r(55539),l=r(46124),a=r(8101),n=r(5997),o=r(18060),i=r(72215);let d=(0,l.createContext)(null);function u(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[u,c]=(0,l.useState)(r),[m,x]=(0,l.useState)(""),[p]=(0,l.useState)(()=>new o.ki(r));(0,l.useEffect)(()=>{let e=(0,a.Fp)();c(e),p.updateConfig(e),x((0,n.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[p]),(0,l.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();p.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)},[p]);let f=e=>{c(t=>{let r={...t,...e};return(0,a.Qc)(e),p.updateConfig(r),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},h=e=>{x(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},b=(0,l.useMemo)(()=>({config:u,setConfig:f,client:p,sessionId:m,setSessionId:h}),[u,p,m]);return(0,s.jsx)(d.Provider,{value:b,children:t})}function c(){let e=(0,l.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},29325:(e,t,r)=>{"use strict";function s(e,t){if(!e.enabled||"off"===e.scheduleState)return"off";if("failed"===e.lastStatus||"error"===e.lastStatus||"failure"===e.lastStatus||"abandoned"===e.lastStatus||"expired"===e.lastStatus)return"failed";if("stale"===e.scheduleState)return"late";let r=null===e.lastRunAt?NaN:Date.parse(e.lastRunAt);if(void 0!==e.secondDueAt){let s=null===e.secondDueAt?NaN:Date.parse(e.secondDueAt);return Number.isFinite(r)&&Number.isFinite(t)&&Number.isFinite(s)&&s>r&&t>s?"late":"alive"}return Number.isFinite(t)&&Number.isFinite(r)&&null!==e.intervalMs&&Number.isFinite(e.intervalMs)&&e.intervalMs>0&&t-r>2*e.intervalMs?"late":"alive"}r.d(t,{u:()=>s})},42006:(e,t,r)=>{"use strict";r.d(t,{QK:()=>n,i6:()=>a,Pz:()=>i,Em:()=>o,Yy:()=>d});var s=r(29325);let l={alive:"살아 있음",late:"늦음",failed:"실패",off:"꺼짐"},a="/v1/schedules?includeOff=1",n="/v1/dashboard/loops";async function o(e,t){var r,o,i,u,c,m,x,p;let[f,h]=await Promise.allSettled([e(a),e(n)]),b="fulfilled"===f.status?null==(r=f.value)?void 0:r.schedules:null,v="fulfilled"===h.status?null==(i=h.value)||null==(o=i.loops)?void 0:o.loops:null;if(!Array.isArray(b)&&!Array.isArray(v))throw Error("loop registries unavailable");if(!Array.isArray(b))throw Error("스케줄 레지스트리 조회 실패");if(!Array.isArray(v))throw Error("루프 레지스트리 조회 실패");let g=d(b,t).map(e=>({...e,id:"schedule:".concat(e.id)}));for(let e of v){let r=e.last?Date.parse(e.last.at):NaN,a=(0,s.u)({enabled:!1!==e.armed,lastRunAt:null!=(m=null==(u=e.last)?void 0:u.at)?m:null,lastStatus:null!=(x=null==(c=e.last)?void 0:c.status.toLowerCase())?x:null,intervalMs:null},t);g.push({id:"loop:".concat(e.name),name:e.label,layer:null!=(p=e.category)?p:"루프",owner:"미지정",mode:null===e.armed?"관측":e.armed?"armed":"off",lastRun:Number.isFinite(r)?e.last.at:null,verdict:"alive"===a?"판정 불가":l[a]})}return g}function i(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:Date.now,s=0,l=!0;return{async refresh(){let a=++s;try{let n=await o(e,r());l&&a===s&&t({rows:n,state:"ready"})}catch(e){l&&a===s&&t({rows:[],state:"error"})}},dispose(){l=!1}}}function d(e,t){return e.map(e=>{var r,a,n,o,i,d,u;let c=e.lastRun?Date.parse(e.lastRun.at):NaN,m=(0,s.u)({enabled:"off"!==e.state,lastRunAt:null!=(d=null==(r=e.lastRun)?void 0:r.at)?d:null,lastStatus:(null==(a=e.lastRun)?void 0:a.exit)!=null&&0!==e.lastRun.exit?"failed":(null==(n=e.lastRun)?void 0:n.status)==null||["ok","success","completed"].includes(e.lastRun.status.toLowerCase())?null!=(u=null==(i=e.lastRun)||null==(o=i.status)?void 0:o.toLowerCase())?u:null:"failed",intervalMs:e.cron?null:e.intervalMs,...e.cron?{scheduleState:e.state}:{}},t),x=!e.cron&&!(e.intervalMs&&e.intervalMs>0),p="alive"===m&&(!Number.isFinite(c)||x)?"판정 불가":l[m];return{id:e.id,name:e.name,layer:e.domain||e.category||e.source,owner:"미지정",mode:e.runVia||e.source,lastRun:Number.isFinite(c)?e.lastRun.at:null,verdict:p}})}},68233:(e,t,r)=>{"use strict";r.d(t,{LoopStatusPanel:()=>x});var s=r(55539),l=r(46124),a=r(3558),n=r.n(a),o=r(15151),i=r(1736),d=r(42006);let u={"살아 있음":"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30",늦음:"bg-red-500/15 text-red-300 ring-red-500/30",실패:"bg-red-500/15 text-red-300 ring-red-500/30",꺼짐:"bg-muted text-muted-foreground ring-border","판정 불가":"bg-muted text-muted-foreground ring-border"};function c(e){let{value:t}=e;return(0,s.jsx)("span",{"data-loop-verdict":t,className:"inline-flex shrink-0 rounded-full px-2 py-0.5 text-xs font-semibold ring-1 ".concat(u[t]),children:t})}function m(e){let{rows:t,state:r}=e;return"loading"===r?(0,s.jsx)("p",{role:"status",className:"text-sm text-muted-foreground",children:"루프 현황을 읽는 중…"}):"error"===r?(0,s.jsx)("p",{role:"alert",className:"text-sm text-red-300",children:"루프 현황을 읽지 못했습니다. 일부 레지스트리 조회가 실패했습니다. 데몬 연결을 확인하세요."}):t.length?(0,s.jsxs)("div",{className:"rounded-xl border border-border bg-card",children:[(0,s.jsxs)("table",{className:"hidden w-full table-fixed text-left text-sm md:table",children:[(0,s.jsx)("thead",{className:"border-b border-border text-muted-foreground",children:(0,s.jsxs)("tr",{children:[(0,s.jsx)("th",{scope:"col",className:"w-1/4 px-4 py-3",children:"루프 \xb7 층"}),(0,s.jsx)("th",{scope:"col",className:"px-4 py-3",children:"주인(자리)"}),(0,s.jsx)("th",{scope:"col",className:"px-4 py-3",children:"모드"}),(0,s.jsx)("th",{scope:"col",className:"px-4 py-3",children:"마지막 실행 시각"}),(0,s.jsx)("th",{scope:"col",className:"px-4 py-3",children:"판정"})]})}),(0,s.jsx)("tbody",{children:t.map(e=>{var t;return(0,s.jsxs)("tr",{className:"border-b border-border/60 last:border-0","data-loop-id":e.id,children:[(0,s.jsxs)("th",{scope:"row",className:"break-words px-4 py-3 font-medium",children:[e.name,(0,s.jsx)("span",{className:"block text-xs font-normal text-muted-foreground",children:e.layer})]}),(0,s.jsx)("td",{className:"px-4 py-3",children:e.owner}),(0,s.jsx)("td",{className:"px-4 py-3",children:e.mode}),(0,s.jsx)("td",{className:"px-4 py-3",children:(0,s.jsx)("time",{dateTime:null!=(t=e.lastRun)?t:void 0,children:e.lastRun?new Date(e.lastRun).toLocaleString("ko-KR"):"기록 없음"})}),(0,s.jsx)("td",{className:"px-4 py-3",children:(0,s.jsx)(c,{value:e.verdict})})]},e.id)})})]}),(0,s.jsx)("ul",{className:"divide-y divide-border/60 md:hidden",children:t.map(e=>{var t;return(0,s.jsxs)("li",{className:"min-w-0 px-3 py-3","data-loop-id":e.id,children:[(0,s.jsxs)("div",{className:"flex items-center justify-between gap-2",children:[(0,s.jsx)("strong",{className:"min-w-0 truncate text-sm",title:e.name,children:e.name}),(0,s.jsx)(c,{value:e.verdict})]}),(0,s.jsxs)("div",{className:"mt-1 flex flex-wrap gap-x-2 text-xs text-muted-foreground",children:[(0,s.jsx)("span",{children:e.layer}),(0,s.jsxs)("span",{children:["\xb7 ",e.owner]}),(0,s.jsxs)("span",{children:["\xb7 ",e.mode]}),(0,s.jsxs)("time",{dateTime:null!=(t=e.lastRun)?t:void 0,children:["\xb7 ",e.lastRun?new Date(e.lastRun).toLocaleString("ko-KR"):"기록 없음"]})]})]},e.id)})})]}):(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"등록된 루프\xb7크론이 없습니다."})}function x(){var e,t;let{client:r}=(0,o.Q)(),[a,u]=(0,l.useState)(null);(0,l.useEffect)(()=>{let e=(0,d.Pz)(e=>r.fetchJson(e),e=>{let{rows:t,state:s}=e;return u({client:r,rows:t,state:s})});e.refresh();let t=window.setInterval(()=>void e.refresh(),3e4);return()=>{e.dispose(),window.clearInterval(t)}},[r]);let c=(null==a?void 0:a.client)===r?a:null;return(0,s.jsxs)("main",{className:"mx-auto max-w-[1200px] space-y-5 p-4",children:[(0,s.jsx)(i.r,{active:"scheduler"}),(0,s.jsxs)("header",{className:"flex flex-wrap items-start justify-between gap-3",children:[(0,s.jsxs)("div",{children:[(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)("h1",{className:"text-xl font-semibold",children:"루프 현황"}),(0,s.jsx)("span",{className:"rounded-full border border-border px-2 py-0.5 text-xs text-muted-foreground",children:"beta \xb7 운영용"})]}),(0,s.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"데몬의 루프\xb7크론 레지스트리 \xb7 늦음은 마지막 실행 후 주기의 2배 초과"})]}),(0,s.jsx)(n(),{href:"/scheduler",className:"rounded-lg border border-border px-3 py-2 text-sm hover:bg-accent",children:"전체 스케줄 →"})]}),(0,s.jsx)(m,{rows:null!=(e=null==c?void 0:c.rows)?e:[],state:null!=(t=null==c?void 0:c.state)?t:"loading"})]})}},97276:(e,t,r)=>{Promise.resolve().then(r.bind(r,68233))}},e=>{e.O(0,[3558,8060,2463,2196,7358],()=>e(e.s=97276)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[2967],{18068:(e,t,n)=>{"use strict";n.d(t,{Qb:()=>r,SI:()=>c,dJ:()=>a});let s="elanous:auth-required",l=null,i=!1;function r(e){null===l&&(l=e,window.dispatchEvent(new CustomEvent(s,{detail:{path:e}})))}function a(e){let t=window,n=t=>e(t.detail);return t.addEventListener(s,n),null===l||i||e({path:l}),()=>t.removeEventListener(s,n)}function c(){i=!0}},28417:(e,t,n)=>{Promise.resolve().then(n.bind(n,54593))},54593:(e,t,n)=>{"use strict";n.d(t,{MarketPanel:()=>h});var s=n(55539),l=n(46124),i=n(94306);let r={resolve:"받는 중",verify:"서명 확인",consent:"권한 동의",credentials:"자격 필요",registered:"등록",done:"완료",failed:"실패"},a={signature:"서명을 확인하지 못했습니다.",scan:"플러그인 파일을 확인하지 못했습니다.","consent-denied":"필요한 권한에 동의하지 않았습니다.",credentials:"연결 정보가 필요합니다.",conflict:"이미 설치된 플러그인입니다.",io:"설치 중 오류가 발생했습니다."};var c=n(79247);function o(e){return e.fields.map(e=>{let{name:t,env:n,set:s}=e;return{name:t,env:n,set:s}})}function u(e){if(e instanceof c.Iu){if(404===e.status)return"설치된 플러그인을 찾을 수 없습니다.";if(401===e.status)return"연결 정보를 관리할 권한이 없습니다.";if(400===e.status)return"선언되지 않은 연결 정보 항목입니다."}return"연결 정보를 불러오거나 저장하지 못했습니다."}function d(e){let{client:t,name:n}=e,[i,r]=(0,l.useState)(null),[a,c]=(0,l.useState)({}),[d,h]=(0,l.useState)([]),[p,m]=(0,l.useState)(null),[f,g]=(0,l.useState)(!1);async function x(e){if(e.preventDefault(),f||!i)return;let{fields:s}=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n={};for(let[t,s]of Object.entries(e))s.trim()&&(n[t]=s);for(let e of t)n[e]=null;return{fields:n}}(a,d);if(0!==Object.keys(s).length){g(!0),m(null);try{await t.putPluginCredentials(n,s),c({}),h([]),r(null),r(await t.getPluginCredentials(n))}catch(e){m(u(e))}finally{g(!1)}}}return(0,l.useEffect)(()=>{let e=!0;return r(null),c({}),h([]),m(null),t.getPluginCredentials(n).then(t=>{e&&r(t)}).catch(t=>{e&&m(u(t))}),()=>{e=!1}},[t,n]),(0,s.jsxs)("form",{className:"space-y-3 rounded-lg border border-border p-4",onSubmit:e=>void x(e),children:[(0,s.jsx)("h3",{className:"font-medium",children:"연결 정보"}),p&&(0,s.jsx)("p",{role:"alert",className:"text-sm",children:p}),!i&&!p&&(0,s.jsx)("p",{role:"status",children:"연결 정보를 불러오는 중…"}),i&&0===o(i).length&&(0,s.jsx)("p",{className:"text-sm",children:"입력할 연결 정보가 없습니다."}),i&&o(i).map(e=>{var t;return(0,s.jsxs)("div",{className:"space-y-1",children:[(0,s.jsx)("label",{className:"block text-sm font-medium",htmlFor:"credential-".concat(n,"-").concat(e.name),children:e.name}),(0,s.jsxs)("small",{className:"block text-muted-foreground",children:["환경 변수: ",(0,s.jsx)("code",{children:e.env})]}),(0,s.jsx)("p",{className:"text-sm",role:"status",children:e.set?"✓ 저장됨":"비어 있음"}),(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)("input",{id:"credential-".concat(n,"-").concat(e.name),type:"password",autoComplete:"new-password",className:"min-w-0 flex-1 rounded border border-border bg-background px-2 py-1",value:null!=(t=a[e.name])?t:"",disabled:f,onChange:t=>{c(n=>({...n,[e.name]:t.target.value})),h(t=>t.filter(t=>t!==e.name))}}),e.set&&(0,s.jsx)("button",{type:"button",className:"rounded border px-2 py-1 text-sm",disabled:f,onClick:()=>{c(t=>({...t,[e.name]:""})),h(t=>t.includes(e.name)?t:[...t,e.name])},children:d.includes(e.name)?"삭제 예정":"지우기"})]})]},e.name)}),i&&i.fields.length>0&&(0,s.jsx)("button",{type:"submit",disabled:f||0===d.length&&!Object.values(a).some(e=>e.trim()),className:"rounded border px-3 py-1 text-sm",children:f?"저장 중…":"저장"})]})}function h(){var e;let t=(0,i.Qj)(),[n,c]=(0,l.useState)("browse"),[o,u]=(0,l.useState)(null),[h,p]=(0,l.useState)([]),[m,f]=(0,l.useState)(null),[g,x]=(0,l.useState)(!1),[b,y]=(0,l.useState)(!1),[j,v]=(0,l.useState)(!1),[w,k]=(0,l.useState)(!1),[N,S]=(0,l.useState)(null),[C,O]=(0,l.useState)(!1),[F,q]=(0,l.useState)([]),[B,P]=(0,l.useState)(null);async function A(){if(t){k(!0),S(null);try{if(!(await t.refreshPluginMarket("elanous")).ok)throw Error("공식 마켓을 받지 못했습니다.");u(await t.getPluginsIndex()),x(!1)}catch(e){S("공식 마켓을 받지 못했습니다.")}finally{k(!1)}}}async function I(){if(!t||!m)return;k(!0),q([]),S(null);let e=null;try{await t.installMarketPlugin("".concat(m.plugin.name,"@").concat(m.market.name),m.plugin.capabilities,t=>{let n=function(e){let t;try{t=JSON.parse(e)}catch(e){return null}if(!t||"object"!=typeof t)return null;let n=t.event;if("string"!=typeof n||!Object.hasOwn(r,n))return null;if("failed"===n){var s;let e=t.reason,n=t.detail,l="string"==typeof e&&null!=(s=a[e])?s:a.io;return{step:"실패",reason:"string"==typeof n&&n.trim()?"".concat(l," — ").concat(n.trim()):l}}return"credentials"===n?!0===t.required?{step:"자격 필요",credentialsRequired:!0}:null:{step:r[n]}}(t);n&&(("완료"===n.step||"실패"===n.step)&&(e=n.step),q(e=>[...e,n]))}),e||q(e=>[...e,{step:"실패",reason:"설치가 끝나지 않았습니다."}])}catch(t){e||q(e=>[...e,{step:"실패",reason:"설치 중 오류가 발생했습니다."}])}if("완료"===e)try{p(await t.getInstalledPlugins()),v(!0),y(!1)}catch(e){y(!0),S("설치는 완료됐지만 설치 목록을 불러오지 못했습니다.")}k(!1)}async function E(e){if(t){k(!0),S(null);try{await t.removeMarketPlugin(e)}catch(e){S("플러그인을 제거하지 못했습니다."),k(!1);return}P(null),p(t=>t.filter(t=>t.name!==e));try{p(await t.getInstalledPlugins()),v(!0),y(!1)}catch(e){y(!0),S("플러그인은 제거됐지만 설치 목록을 불러오지 못했습니다.")}finally{k(!1)}}}(0,l.useEffect)(()=>{if(!t)return;let e=!0;return u(null),p([]),f(null),x(!1),y(!1),v(!1),q([]),O(!1),P(null),S(null),t.getPluginsIndex().then(t=>{e&&u(t)}).catch(()=>{e&&x(!0)}),t.getInstalledPlugins().then(t=>{e&&(p(t),v(!0))}).catch(()=>{e&&(y(!0),v(!0))}),()=>{e=!1}},[t]);let M=o?o.markets.flatMap(e=>e.plugins.map(t=>({market:e,plugin:t,price:function(e){var t;if("free"===e.model)return"무료";let n=void 0===e.amount?"가격 미정":"".concat(e.amount.toLocaleString("ko-KR")," ").concat(null!=(t=e.currency)?t:"").trim();return"subscription"===e.model&&e.period?"".concat(n," / ").concat(e.period):n}(t.pricing),badge:function(e){switch(e){case"ok":return"✅ 서명 확인";case"missing":return"⚠️ 서명 없음";case"unknown-key":return"⚠️ 알 수 없는 서명 키";case"malformed":return"⚠️ 잘못된 서명";case"stale":return"⚠️ 유효하지 않은 서명"}}(e.signature)}))).sort((e,t)=>("ok"!==e.market.signature)-("ok"!==t.market.signature)||e.plugin.name.localeCompare(t.plugin.name)||e.market.name.localeCompare(t.market.name)):[];return(0,s.jsxs)("main",{className:"mx-auto max-w-5xl space-y-6 p-5 text-foreground","aria-label":"마켓",children:[(0,s.jsxs)("header",{children:[(0,s.jsx)("h1",{className:"text-2xl font-semibold",children:"마켓"}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"확인된 플러그인을 살펴보고 설치할 수 있습니다."})]}),(0,s.jsx)("nav",{"aria-label":"마켓 탭",className:"flex flex-wrap gap-2",children:[["browse","찾아보기"],["detail","상세"],["installed","설치됨"]].map(e=>{let[t,l]=e;return(0,s.jsx)("button",{type:"button","aria-current":n===t?"page":void 0,className:"rounded-lg border px-4 py-2 text-sm ".concat(n===t?"border-blue-500 font-semibold":"border-border"),onClick:()=>c(t),children:l},t)})}),!t&&(0,s.jsx)("p",{role:"status",children:"서버 연결이 설정되지 않았습니다. 설정에서 서버 주소를 입력하세요."}),N&&(0,s.jsx)("p",{role:"alert",children:N}),"installed"!==n&&g&&(0,s.jsx)("p",{role:"alert",children:"마켓을 불러오지 못했습니다."}),"installed"!==n&&t&&!g&&!o&&(0,s.jsx)("p",{role:"status",children:"마켓을 불러오는 중…"}),"installed"===n&&b&&(0,s.jsx)("p",{role:"alert",children:"설치 목록을 불러오지 못했습니다."}),"installed"===n&&t&&!j&&(0,s.jsx)("p",{role:"status",children:"설치 목록을 불러오는 중…"}),"browse"===n&&o&&(0===o.markets.length?(0,s.jsxs)("div",{className:"space-y-3",children:[(0,s.jsx)("p",{children:"아직 받아 둔 마켓이 없습니다."}),(0,s.jsx)("button",{type:"button",disabled:w||!t,className:"rounded border px-3 py-2",onClick:()=>void A(),children:"공식 마켓 받기"})]}):0===M.length?(0,s.jsxs)("div",{className:"space-y-3",children:[(0,s.jsx)("p",{children:"등록된 플러그인이 없습니다."}),(0,s.jsx)("button",{type:"button",disabled:w||!t,className:"rounded border px-3 py-2",onClick:()=>void A(),children:"공식 마켓 받기"})]}):(0,s.jsx)("div",{className:"grid gap-4 sm:grid-cols-2 lg:grid-cols-3",children:M.map(e=>{var t;return(0,s.jsxs)("article",{className:"rounded-xl border border-border p-4 space-y-2",children:[(0,s.jsxs)("h2",{className:"font-semibold",children:[e.plugin.name," ",(0,s.jsxs)("span",{className:"text-xs font-normal",children:["v",e.plugin.version]})]}),(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:null!=(t=e.plugin.description)?t:"설명이 없습니다."}),(0,s.jsxs)("p",{className:"text-sm",children:[e.price," \xb7 ",(0,s.jsx)("span",{title:e.market.detail,children:e.badge})]}),(0,s.jsx)("button",{type:"button",className:"rounded border px-3 py-1 text-sm",onClick:()=>{f(e),O(!1),q([]),c("detail")},children:"상세 보기"})]},"".concat(e.market.name,"/").concat(e.plugin.name,"/").concat(e.plugin.version))})})),"detail"===n&&!g&&(m?(0,s.jsxs)("section",{className:"space-y-4 rounded-xl border border-border p-5","aria-label":"플러그인 상세",children:[(0,s.jsxs)("h2",{className:"text-xl font-semibold",children:[m.plugin.name," ",(0,s.jsxs)("small",{children:["v",m.plugin.version]})]}),(0,s.jsx)("p",{children:m.plugin.description}),(0,s.jsxs)("p",{children:[m.price," \xb7 ",m.badge]}),(0,s.jsxs)("section",{children:[(0,s.jsx)("h3",{className:"font-medium",children:"권한"}),(0,s.jsx)("ul",{children:m.plugin.capabilities.map(e=>(0,s.jsx)("li",{children:e},e))})]}),(0,s.jsxs)("section",{children:[(0,s.jsx)("h3",{className:"font-medium",children:"연결 정보 항목"}),m.plugin.connectors.map(e=>(0,s.jsxs)("div",{children:[(0,s.jsx)("p",{children:"연결 정보"}),(0,s.jsx)("ul",{children:e.userConfig.map(e=>(0,s.jsxs)("li",{children:[e.label,e.secret?" \xb7 비공개 정보":""]},e.key))})]},e.id))]}),(0,s.jsxs)("section",{children:[(0,s.jsx)("h3",{className:"font-medium",children:"포함된 기능"}),(0,s.jsx)("ul",{children:null==(e=m.plugin.graphs)?void 0:e.map(e=>(0,s.jsx)("li",{children:e},e))})]}),(0,s.jsxs)("p",{children:["파일 확인값: ",(0,s.jsx)("code",{children:m.plugin.sha256.slice(0,12)})]}),C?(0,s.jsxs)("div",{className:"space-y-2",children:[(0,s.jsx)("p",{children:"이 플러그인이 요청하는 권한을 확인하세요."}),(0,s.jsx)("ul",{children:m.plugin.capabilities.map(e=>(0,s.jsx)("li",{children:e},e))}),(0,s.jsx)("button",{type:"button",disabled:w,className:"rounded border px-3 py-1",onClick:()=>void I(),children:"동의하고 설치"}),(0,s.jsx)("button",{type:"button",disabled:w,className:"rounded border px-3 py-1",onClick:()=>O(!1),children:"취소"})]}):(0,s.jsx)("button",{type:"button",disabled:w||"ok"!==m.market.signature,className:"rounded border px-3 py-1",onClick:()=>O(!0),children:"설치"}),F.length>0&&(0,s.jsx)("ol",{"aria-label":"설치 진행",className:"space-y-1",children:F.map((e,t)=>(0,s.jsxs)("li",{role:"실패"===e.step?"alert":void 0,children:[e.step,e.reason?": ".concat(e.reason):"",e.credentialsRequired?" — 이 플러그인은 연결 정보가 필요합니다.":""]},t))}),t&&F.some(e=>e.credentialsRequired)&&(0,s.jsx)(d,{client:t,name:m.plugin.name},"".concat(m.plugin.name,"-").concat(F.some(e=>"완료"===e.step||"등록"===e.step)))]}):(0,s.jsx)("p",{children:"찾아보기에서 플러그인을 선택하세요."})),"installed"===n&&j&&!b&&(0===h.length?(0,s.jsx)("p",{children:"설치된 플러그인이 없습니다."}):(0,s.jsx)("ul",{className:"space-y-2",children:h.map(e=>(0,s.jsxs)("li",{className:"rounded-lg border border-border p-3",children:[e.name," \xb7 v",e.version," \xb7 설치 시각: ",e.installedAt&&Number.isFinite(Date.parse(e.installedAt))?(0,s.jsx)("time",{dateTime:e.installedAt,children:new Date(e.installedAt).toLocaleString("ko-KR")}):"알 수 없음",B===e.name?(0,s.jsxs)("span",{className:"ml-3",children:["제거할까요? ",(0,s.jsx)("button",{type:"button",disabled:w,onClick:()=>void E(e.name),children:"제거 확인"})," ",(0,s.jsx)("button",{type:"button",onClick:()=>P(null),children:"취소"})]}):(0,s.jsx)("button",{type:"button",disabled:w,className:"ml-3 rounded border px-3 py-1",onClick:()=>P(e.name),children:"제거"}),t&&(0,s.jsxs)("details",{className:"mt-3",children:[(0,s.jsx)("summary",{className:"cursor-pointer",children:"연결 정보"}),(0,s.jsx)("div",{className:"mt-2",children:(0,s.jsx)(d,{client:t,name:e.name})})]})]},"".concat(e.market,"/").concat(e.name,"/").concat(e.version)))}))]})}},72215:(e,t,n)=>{"use strict";let s;n.d(t,{cY:()=>u,x8:()=>a});let l={debug:0,info:1,warn:2,error:3},i="/v1/debug-logs/batch",r=null;function a(e){r=e}class c{health(){return{pending:this.queue.length,consecutiveFailures:this.consecutiveFailures,lastOkAt:this.lastOkAt,droppedByCap:this.droppedByCap,fallbackBatches:this.fallbackBatches}}push(e){if(!(l[function(e){let t=e.slice(e.lastIndexOf(".")+1).toLowerCase();return/^(error|exception|crash|fail|failed)$/.test(t)?"error":/^(warn|degraded|timeout)$/.test(t)?"warn":/^(boot|ready|start|begin|open|ok|done|resolve|end|stop|close)$/.test(t)?"info":"debug"}(e.category)]<l[this.minLevel])){if(this.queue.push(e),this.queue.length>500){let e=this.queue.length-500;this.droppedByCap+=e,this.queue.splice(0,e)}if(this.queue.length>=100&&!this.inFlight){null!==this.timer&&(clearTimeout(this.timer),this.timer=null),this.flush();return}null===this.timer&&(this.timer=setTimeout(()=>{this.flush()},this.flushMs))}}async flush(){if(this.timer&&(clearTimeout(this.timer),this.timer=null),this.inFlight||0===this.queue.length)return;let e=this.queue.slice(0,100);this.inFlight=!0;let t=!1,n=JSON.stringify({records:e});try{var s,l;t=await (s=this.fetchFn(n),l=this.postTimeoutMs,new Promise((e,t)=>{let n=setTimeout(()=>t(Error("debug-forward timeout after ".concat(l,"ms"))),l);s.then(t=>{clearTimeout(n),e(t)},e=>{clearTimeout(n),t(e)})}))}catch(e){t=!1}finally{this.inFlight=!1}if(!t){if(this.consecutiveFailures+=1,this.consecutiveFailures>=2&&r)try{await r(JSON.stringify({records:[...e,this.blockedNotice()]}))&&(this.fallbackBatches+=1)}catch(e){}this.wasFailing=!0,this.scheduleRetry();return}let i=this.lastOkAt;this.lastOkAt=Date.now();let a=this.consecutiveFailures;this.consecutiveFailures=0,this.queue.splice(0,e.length),this.wasFailing&&(this.wasFailing=!1,this.queue.push({ts:new Date().toISOString(),category:"pwa.debug-forwarder.recovered",event:"recovered",data:{consecutiveFailures:a,droppedByCap:this.droppedByCap,fallbackBatches:this.fallbackBatches,pending:this.queue.length,previousOkAt:i},source:{platform:"pwa"}})),this.queue.length>0&&null===this.timer&&(this.timer=setTimeout(()=>{this.flush()},this.flushMs))}scheduleRetry(){if(null!==this.timer||0===this.queue.length)return;let e=Math.min(this.flushMs*2**this.consecutiveFailures,3e4);this.timer=setTimeout(()=>{this.flush()},e)}blockedNotice(){return{ts:new Date().toISOString(),category:"pwa.debug-forwarder.http-blocked",event:"http-blocked",data:{consecutiveFailures:this.consecutiveFailures,pending:this.queue.length,droppedByCap:this.droppedByCap,lastOkAt:this.lastOkAt,via:"acp-fallback"},source:{platform:"pwa"}}}beaconFlush(){if(0!==this.queue.length)try{if("undefined"!=typeof navigator&&"function"==typeof navigator.sendBeacon){let e=this.queue.slice(0,100),t=new Blob([JSON.stringify({records:e})],{type:"application/json"});navigator.sendBeacon(i,t)&&this.queue.splice(0,e.length)}}catch(e){}}get pending(){return this.queue.length}constructor(e=o,t="debug",n=1e4,s=100){this.fetchFn=e,this.minLevel=t,this.postTimeoutMs=n,this.flushMs=s,this.queue=[],this.timer=null,this.inFlight=!1,this.consecutiveFailures=0,this.lastOkAt=null,this.droppedByCap=0,this.fallbackBatches=0,this.wasFailing=!1}}async function o(e){return(await fetch(i,{method:"POST",headers:{"content-type":"application/json"},body:e,keepalive:!0,..."undefined"!=typeof AbortSignal&&"function"==typeof AbortSignal.timeout?{signal:AbortSignal.timeout(1e4)}:{}})).ok}function u(e,t){if("undefined"==typeof console)return;let n=new Date().toISOString();if(void 0!==t){let s="";try{let e=new WeakSet;s=JSON.stringify(t,(t,n)=>{if("bigint"==typeof n)return"".concat(n.toString(),"n");if("function"==typeof n)return"[fn ".concat(n.name||"anon","]");if(n&&"object"==typeof n){if(e.has(n))return"[circular]";e.add(n)}return n})}catch(e){s="[unserializable: ".concat(String(e),"]")}s&&s.length>800&&(s=s.slice(0,797)+"..."),console.debug("[".concat(n,"] ").concat(e," ").concat(s),t),d(n,e,s)}else console.debug("[".concat(n,"] ").concat(e)),d(n,e,void 0)}function d(e,t,n){let l,i=function(){if(void 0!==s)return s;let e=function(){try{let e="off"!==window.localStorage.getItem("elanous.pwa.debug.forward"),t=window.localStorage.getItem("elanous.pwa.debug.forwardLevel");return{forward:e,level:"info"===t||"warn"===t||"error"===t?t:"debug"}}catch(e){return{forward:!0,level:"debug"}}}();if(!e.forward)return s=null,null;let t=new c(o,e.level,1e4,1500);try{window.addEventListener("visibilitychange",()=>{"hidden"===document.visibilityState&&t.beaconFlush()})}catch(e){}return s=t,t}();if(!i)return;let r=t.slice(t.lastIndexOf(".")+1)||t;if(void 0!==n&&""!==n)try{l=JSON.parse(n)}catch(e){l=n}i.push({ts:e,category:t,event:r,...void 0!==l?{data:l}:{},source:{platform:"pwa"}})}},94306:(e,t,n)=>{"use strict";n.d(t,{M1:()=>o,Qj:()=>u,tI:()=>c});var s=n(55539),l=n(46124),i=n(76642),r=n(50363);let a=(0,l.createContext)(null);function c(e){let{client:t,queryClient:n,defaultStaleTimeMs:c,children:o}=e,u=(0,l.useMemo)(()=>null!=n?n:new i.E({defaultOptions:{queries:{staleTime:null!=c?c:2e3,refetchOnWindowFocus:!1}}}),[n,c]);return(0,s.jsx)(a.Provider,{value:t,children:(0,s.jsx)(r.Ht,{client:u,children:o})})}function o(){let e=(0,l.useContext)(a);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function u(){return(0,l.useContext)(a)}}},e=>{e.O(0,[3324,9247,2463,2196,7358],()=>e(e.s=28417)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7398],{26600:(e,t,s)=>{Promise.resolve().then(s.bind(s,47276))},47276:(e,t,s)=>{"use strict";s.d(t,{default:()=>d});var a=s(55539),i=s(46124),n=s(58603);class r extends Error{constructor(e,t,s){super("mission-room ".concat(e," on ").concat(t)),this.status=e,this.path=t,this.body=s,this.name="MissionRoomApiError"}}function o(e){var t;let[s,n]=(0,i.useState)({loading:!0,error:null,state:null}),[r,o]=(0,i.useState)(""),[d,u]=(0,i.useState)(""),[m,h]=(0,i.useState)(!1),[x,p]=(0,i.useState)(null),[f,b]=(0,i.useState)(!1),y=(0,i.useRef)(!0);(0,i.useEffect)(()=>()=>{y.current=!1},[]);let g=(0,i.useCallback)(async()=>{n(e=>({...e,loading:!0,error:null}));try{let{state:t}=await e.api.spawn(e.missionId);if(!y.current)return;n({loading:!1,error:null,state:t})}catch(e){if(!y.current)return;n({loading:!1,error:c(e),state:null})}},[e.api,e.missionId]);(0,i.useEffect)(()=>{g()},[g]);let j=(0,i.useCallback)(async()=>{if(r.trim()&&!m){h(!0);try{let t=await e.api.deliberate(e.missionId,r.trim(),d.trim()||void 0);if(!y.current)return;n(e=>e.state?{...e,state:{...e.state,decisions:[...e.state.decisions,t]}}:e),o("")}catch(e){if(!y.current)return;n(t=>({...t,error:c(e)}))}finally{y.current&&h(!1)}}},[e.api,e.missionId,r,d,m]),v=(0,i.useCallback)(async t=>{if(t.trim()&&!x){p(t);try{let s=await e.api.decide(e.missionId,t);if(!y.current)return;n(e=>{if(!e.state)return e;let t=e.state.decisions.slice(),a=t.findIndex(e=>e.ts===s.ts);return a>=0&&(t[a]=s),{...e,state:{...e.state,decisions:t}}})}catch(e){if(!y.current)return;n(t=>({...t,error:c(e)}))}finally{y.current&&p(null)}}},[e.api,e.missionId,x]),N=(0,i.useCallback)(async()=>{if(!f){b(!0);try{var t;let s=await e.api.archive(e.missionId);if(!y.current)return;n(e=>({...e,state:s})),null==(t=e.onArchived)||t.call(e)}catch(e){if(!y.current)return;n(t=>({...t,error:c(e)}))}finally{y.current&&b(!1)}}},[e.api,e.missionId,f,e.onArchived]),w=(null==(t=s.state)?void 0:t.status)==="archived",S=(0,i.useMemo)(()=>s.state?[...s.state.decisions].sort((e,t)=>t.ts-e.ts):[],[s.state]);return s.loading&&!s.state?(0,a.jsx)("div",{className:"p-4 text-sm opacity-70",children:"Loading mission room…"}):(0,a.jsxs)("section",{className:"mission-room-panel flex flex-col gap-4 p-4","data-mission-id":e.missionId,children:[(0,a.jsxs)("header",{className:"flex items-baseline justify-between gap-3",children:[(0,a.jsxs)("div",{children:[(0,a.jsx)("h2",{className:"text-lg font-semibold",children:e.missionTitle?"".concat(e.missionTitle," \xb7 deliberation"):"Mission Deliberation Room"}),s.state&&(0,a.jsxs)("p",{className:"text-xs opacity-70",children:["tag: ",(0,a.jsx)("code",{children:s.state.missionTag})," \xb7 status:"," ",(0,a.jsx)("span",{className:w?"text-amber-600":"text-emerald-600",children:s.state.status})," \xb7 ","decisions: ",s.state.decisions.length]})]}),!w&&s.state&&(0,a.jsx)("button",{type:"button",className:"text-xs underline opacity-70 hover:opacity-100",disabled:f,onClick:()=>void N(),children:f?"archiving…":"archive room"})]}),s.error&&(0,a.jsx)("div",{role:"alert",className:"rounded border border-rose-400/50 bg-rose-50 px-3 py-2 text-sm text-rose-900",children:s.error}),!w&&(0,a.jsxs)("form",{className:"flex flex-col gap-2 rounded border border-zinc-200 p-3",onSubmit:e=>{e.preventDefault(),j()},children:[(0,a.jsx)("label",{className:"text-xs uppercase tracking-wide opacity-70",children:"New deliberation"}),(0,a.jsx)("textarea",{className:"min-h-[80px] w-full rounded border border-zinc-300 bg-white p-2 text-sm",placeholder:"Describe the branch you're stuck on…",value:r,onChange:e=>o(e.target.value),disabled:m}),(0,a.jsx)("textarea",{className:"min-h-[40px] w-full rounded border border-zinc-200 bg-zinc-50 p-2 text-xs",placeholder:"Optional mission context (task list digest, etc.)",value:d,onChange:e=>u(e.target.value),disabled:m}),(0,a.jsx)("div",{className:"flex justify-end",children:(0,a.jsx)("button",{type:"submit",className:"rounded bg-zinc-900 px-3 py-1 text-sm text-white disabled:opacity-50",disabled:!r.trim()||m,children:m?"asking lanes…":"ask the lanes"})})]}),(0,a.jsxs)("div",{className:"flex flex-col gap-3",children:[0===S.length&&(0,a.jsx)("p",{className:"text-sm opacity-70",children:"No deliberations yet."}),S.map(e=>(0,a.jsx)(l,{decision:e,onDecide:w?void 0:v,decidingChoice:x},e.ts))]})]})}function l(e){let{decision:t,onDecide:s,decidingChoice:n}=e,[r,o]=(0,i.useState)(""),l=t.resolution.status,c="decided"===t.resolution.status?t.resolution.chosen:null;return(0,a.jsxs)("article",{className:"rounded border border-zinc-200 bg-white p-3",children:[(0,a.jsxs)("header",{className:"flex items-baseline justify-between gap-2",children:[(0,a.jsx)("p",{className:"text-sm font-medium",children:t.question}),(0,a.jsx)("time",{className:"shrink-0 text-xs opacity-60",dateTime:new Date(t.ts).toISOString(),children:new Date(t.ts).toLocaleString()})]}),(0,a.jsx)("ul",{className:"mt-2 flex flex-col gap-2",children:t.opinions.map((e,t)=>(0,a.jsxs)("li",{className:"rounded bg-zinc-50 p-2 text-xs",children:[(0,a.jsxs)("div",{className:"font-medium",children:[e.role,e.modelId?(0,a.jsxs)("span",{className:"opacity-60",children:[" \xb7 ",e.modelId]}):null]}),(0,a.jsx)("pre",{className:"mt-1 whitespace-pre-wrap text-xs leading-snug",children:e.text})]},"".concat(e.role,"-").concat(t)))}),(0,a.jsxs)("footer",{className:"mt-3 flex items-center justify-between gap-2",children:[(0,a.jsxs)("span",{className:"text-xs opacity-70",children:["resolution:"," ","decided"===l?(0,a.jsxs)("span",{className:"font-medium text-emerald-700",children:["decided → ",c]}):(0,a.jsx)("span",{className:"text-amber-700",children:"open"})]}),s&&"open"===l&&(0,a.jsxs)("form",{className:"flex items-center gap-1",onSubmit:e=>{e.preventDefault(),r.trim()&&s(r.trim())},children:[(0,a.jsx)("input",{className:"w-32 rounded border border-zinc-300 px-2 py-0.5 text-xs",placeholder:"chosen…",value:r,onChange:e=>o(e.target.value),disabled:null!==n}),(0,a.jsx)("button",{type:"submit",className:"rounded bg-emerald-700 px-2 py-0.5 text-xs text-white disabled:opacity-50",disabled:!r.trim()||null!==n,children:n===r?"…":"apply"})]})]})]})}function c(e){if(e instanceof r){let t="object"==typeof e.body&&e.body&&"detail"in e.body?e.body.detail:null;return 404===e.status?"Mission room not found.":409===e.status?t?"Conflict: ".concat(t):"Conflict — room may be archived or no open decision.":401===e.status?"Authentication required.":"Mission room error (".concat(e.status,").")}return e instanceof Error?e.message:String(e)}function d(){var e;let t=(0,n.useParams)(),s=decodeURIComponent(null!=(e=null==t?void 0:t.id)?e:""),l=(0,i.useMemo)(()=>(function(e){var t;let s=e.baseUrl.replace(/\/+$/,""),a=null!=(t=e.fetchImpl)?t:fetch,i=e.authHeader;async function n(e,t){let n={"content-type":"application/json"};i&&(n.authorization=i),(null==t?void 0:t.headers)&&Object.assign(n,t.headers);let o=await a("".concat(s).concat(e),{...t,headers:n}),l=await o.json().catch(()=>null);if(!o.ok)throw new r(o.status,e,l);return l}function o(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";return"/v1/missions/".concat(encodeURIComponent(e),"/showroom").concat(t)}return{spawn:async e=>await n(o(e)),deliberate:async(e,t,s)=>(await n(o(e,"/deliberate"),{method:"POST",body:JSON.stringify({question:t,...void 0!==s?{missionContext:s}:{}})})).decision,decide:async(e,t)=>(await n(o(e,"/decision"),{method:"POST",body:JSON.stringify({chosen:t})})).decision,archive:async e=>(await n(o(e,"/archive"),{method:"POST"})).state}})({baseUrl:window.location.origin}),[]);return s?(0,a.jsx)(o,{missionId:s,api:l}):(0,a.jsx)("div",{className:"p-4 text-sm",children:"Mission id missing in URL."})}},58603:(e,t,s)=>{"use strict";var a=s(99027);s.o(a,"useParams")&&s.d(t,{useParams:function(){return a.useParams}}),s.o(a,"usePathname")&&s.d(t,{usePathname:function(){return a.usePathname}}),s.o(a,"useRouter")&&s.d(t,{useRouter:function(){return a.useRouter}}),s.o(a,"useSearchParams")&&s.d(t,{useSearchParams:function(){return a.useSearchParams}})}},e=>{e.O(0,[2463,2196,7358],()=>e(e.s=26600)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[6997],{3704:(e,t,s)=>{"use strict";s.d(t,{A:()=>d});var n=s(46124);let r=function(){for(var e=arguments.length,t=Array(e),s=0;s<e;s++)t[s]=arguments[s];return t.filter((e,t,s)=>!!e&&""!==e.trim()&&s.indexOf(e)===t).join(" ").trim()},a=e=>{let t=e.replace(/^([A-Z])|[\s-_]+(\w)/g,(e,t,s)=>s?s.toUpperCase():t.toLowerCase());return t.charAt(0).toUpperCase()+t.slice(1)};var l={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 s,a,o;let{color:d,size:c,strokeWidth:u,absoluteStrokeWidth:m,className:p="",children:x,iconNode:h,...f}=e,{size:g=24,strokeWidth:b=2,absoluteStrokeWidth:k=!1,color:v="currentColor",className:j=""}=null!=(s=(0,n.useContext)(i))?s:{},y=(null!=m?m:k)?24*Number(null!=u?u:b)/Number(null!=c?c:g):null!=u?u:b;return(0,n.createElement)("svg",{ref:t,...l,width:null!=(a=null!=c?c:g)?a:l.width,height:null!=(o=null!=c?c:g)?o:l.height,stroke:null!=d?d:v,strokeWidth:y,className:r("lucide",j,p),...!x&&!(e=>{for(let t in e)if(t.startsWith("aria-")||"role"===t||"title"===t)return!0;return!1})(f)&&{"aria-hidden":"true"},...f},[...h.map(e=>{let[t,s]=e;return(0,n.createElement)(t,s)}),...Array.isArray(x)?x:[x]])}),d=(e,t)=>{let s=(0,n.forwardRef)((s,l)=>{let{className:i,...d}=s;return(0,n.createElement)(o,{ref:l,iconNode:t,className:r("lucide-".concat(a(e).replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase()),"lucide-".concat(e),i),...d})});return s.displayName=a(e),s}},4563:(e,t,s)=>{Promise.resolve().then(s.bind(s,18705))},5997:(e,t,s)=>{"use strict";s.d(t,{Zr:()=>l,f6:()=>r,oD:()=>a});let n="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 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=r();return localStorage.setItem(n,t),t}function l(){let e=r();return localStorage.setItem(n,e),e}},15151:(e,t,s)=>{"use strict";s.d(t,{C:()=>d,DaemonProvider:()=>c,Q:()=>u});var n=s(55539),r=s(46124),a=s(8101),l=s(5997),i=s(18060),o=s(72215);let d=(0,r.createContext)(null);function c(e){let{children:t}=e,s={baseUrl:"",token:"",provider:""},[c,u]=(0,r.useState)(s),[m,p]=(0,r.useState)(""),[x]=(0,r.useState)(()=>new i.ki(s));(0,r.useEffect)(()=>{let e=(0,a.Fp)();u(e),x.updateConfig(e),p((0,l.oD)()),(0,o.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[x]),(0,r.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 s={...t,...e};return(0,a.Qc)(e),x.updateConfig(s),(0,o.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),s})},f=e=>{p(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,o.cY)("webterm.provider.daemon.session-set",{sessionId:e})},g=(0,r.useMemo)(()=>({config:c,setConfig:h,client:x,sessionId:m,setSessionId:f}),[c,x,m]);return(0,n.jsx)(d.Provider,{value:g,children:t})}function u(){let e=(0,r.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},18705:(e,t,s)=>{"use strict";s.r(t),s.d(t,{default:()=>x});var n=s(55539),r=s(46124),a=s(43691);let l={live:"live",unknown:"unknown",inactive:"inactive"},i={running:"running","probable-running":"probably running","ended-unclosed":"ended, not closed",unknown:"run state unknown"};function o(e){let{label:t,present:s}=e;return(0,n.jsxs)("span",{className:"rounded-full px-2 py-0.5 text-[10px] ".concat(s?"bg-primary/10 text-primary":"bg-muted text-muted-foreground"),children:[t,": ",s?"present":"absent"]})}function d(e){var t,s,l;let{ptyIds:i,onRefresh:o}=e,[d,c]=(0,r.useState)(null!=(t=i[0])?t:""),[u,m]=(0,r.useState)({kind:"loading",ptyId:null!=(s=i[0])?s:""}),[p,x]=(0,r.useState)(0),[h,f]=(0,r.useState)({kind:"idle"}),g=(0,r.useRef)(null),b=i.includes(d)?d:null!=(l=i[0])?l:"",k=u.ptyId===b?u:{kind:"loading",ptyId:b},v="pending"===h.kind,j="idle"===h.kind||h.ptyId===b?h:{kind:"idle"},y="pending"===j.kind;return(0,r.useEffect)(()=>{c(e=>{var t;return i.includes(e)?e:null!=(t=i[0])?t:""})},[i]),(0,r.useEffect)(()=>{if(!b)return;let e=new AbortController;return m({kind:"loading",ptyId:b}),fetch((0,a.xV)(b),{signal:e.signal}).then(async t=>{if(!t.ok)throw Error("GET ".concat((0,a.xV)(b)," failed (").concat(t.status,")"));let s=await t.json();if("string"!=typeof s.frame)throw Error("Terminal frame response did not contain text.");e.signal.aborted||m({kind:"success",ptyId:b,frame:s.frame})}).catch(t=>{e.signal.aborted||m({kind:"error",ptyId:b,message:t instanceof Error?t.message:"Terminal frame request failed."})}),()=>e.abort()},[b,p]),(0,r.useEffect)(()=>(f(e=>"pending"===e.kind&&e.ptyId!==b?{kind:"idle"}:e),()=>{var e;null==(e=g.current)||e.abort(),g.current=null}),[b]),(0,n.jsxs)("div",{className:"space-y-2 rounded-md bg-surface-elevated p-3","data-testid":"terminal-frame-panel",children:[i.length>1&&(0,n.jsxs)("label",{className:"flex w-fit items-center gap-2 text-xs",children:["PTY",(0,n.jsx)("select",{value:b,onChange:e=>c(e.target.value),"aria-label":"Select terminal PTY",disabled:v,children:i.map(e=>(0,n.jsx)("option",{value:e,children:e},e))})]}),b&&(0,n.jsxs)("div",{className:"space-y-1","data-testid":"terminal-takeover",children:[(0,n.jsx)("button",{type:"button",className:"text-xs underline","aria-label":"Take over PTY ownership","data-testid":"terminal-takeover-button",disabled:y,onClick:()=>{var e;if(!b||v)return;null==(e=g.current)||e.abort();let t=new AbortController;g.current=t,f({kind:"pending",ptyId:b}),(0,a.HS)(b,globalThis.fetch,{signal:t.signal}).then(e=>{if(!t.signal.aborted){if(e.ok){f({kind:"success",ptyId:e.ptyId}),x(e=>e+1),null==o||o();return}f({kind:"error",ptyId:e.ptyId,failureKind:e.kind,message:e.message})}})},children:y?"Taking over ownership…":"Take over ownership"}),"pending"===j.kind&&(0,n.jsx)("p",{className:"text-xs text-muted-foreground",role:"status","data-testid":"terminal-takeover-pending",children:"Taking over ownership…"}),"success"===j.kind&&(0,n.jsx)("p",{className:"text-xs text-muted-foreground",role:"status","data-testid":"terminal-takeover-success",children:"Ownership transferred. Observation refreshed."}),"error"===j.kind&&(0,n.jsx)("p",{className:"text-xs text-destructive",role:"alert","data-testid":"terminal-takeover-error","data-takeover-kind":j.failureKind,children:j.message})]}),"loading"===k.kind&&(0,n.jsx)("p",{className:"text-xs text-muted-foreground",role:"status",children:"Loading terminal frame…"}),"error"===k.kind&&(0,n.jsxs)("p",{className:"text-xs text-destructive",role:"alert",children:["Unable to load terminal frame: ",k.message]}),"success"===k.kind&&(0,n.jsx)("pre",{className:"max-h-80 overflow-auto whitespace-pre-wrap break-words rounded bg-background p-3 font-mono text-xs","data-testid":"terminal-frame",children:k.frame||"(Terminal frame is empty.)"})]})}function c(e){let{subject:t,onRefresh:s}=e,[l,i]=(0,r.useState)(!1),o="terminal-frame-".concat(encodeURIComponent(t.id)),c=t.screen.ptyIds;return(0,n.jsxs)("div",{className:"space-y-2",children:[(0,n.jsxs)("p",{className:"text-xs text-muted-foreground",children:["screen: ",c.length," PTY \xb7 ",t.screen.liveCount," live"]}),(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsx)("button",{type:"button",className:"text-xs underline","aria-expanded":l,"aria-controls":o,onClick:()=>i(e=>!e),children:l?"Hide terminal frame":"Show terminal frame"}),(0,n.jsx)("a",{className:"text-xs underline",href:(0,a.GG)(),children:"Open terminal inspector"})]}),l&&(0,n.jsx)("div",{id:o,children:(0,n.jsx)(d,{ptyIds:c,onRefresh:s})})]})}function u(e){let{subjects:t,runningRuns:s,scope:d,includeIsolatedInstances:u=!1,onIncludeIsolatedInstancesChange:m,progressBySubject:p=new Map,onRefresh:x}=e,[h,f]=(0,r.useState)(!1),g=(0,a.U$)(t,h);return(0,n.jsxs)("section",{className:"space-y-3","aria-label":"Observatory subjects",children:[s&&(0,n.jsxs)("p",{className:"text-sm text-muted-foreground","data-testid":"running-runs-summary",children:["Server run count: ",s.running," running, ",s["probable-running"]," probable-running"," ","(counted statuses: ",s.countedStatuses.join(", "),")"]}),(0,n.jsxs)("div",{className:"space-y-1",children:[(0,n.jsxs)("label",{className:"flex w-fit cursor-pointer items-center gap-2 text-sm",children:[(0,n.jsx)("input",{type:"checkbox",checked:u,onChange:e=>null==m?void 0:m(e.target.checked),"aria-label":"Include isolated instances"}),"Include isolated instances: ",u?"included":"local only"]}),d&&(0,n.jsxs)("p",{className:"text-xs text-muted-foreground","data-testid":"observatory-scope",children:["Observation scope: ",d.domain,"; ",d.roots," root",1===d.roots?"":"s","; ",d.federated?"federated":"local only","; ",d.hiddenDead," dead hidden",void 0===d.hiddenSubAgentRuns?"":"; ".concat(d.hiddenSubAgentRuns," sub-agent runs hidden")]})]}),(0,n.jsxs)("label",{className:"flex w-fit cursor-pointer items-center gap-2 text-sm",children:[(0,n.jsx)("input",{type:"checkbox",checked:h,onChange:e=>f(e.target.checked)}),"Show all subjects"]}),0===g.length?(0,n.jsx)("p",{className:"rounded-md border border-border p-4 text-sm text-muted-foreground","data-testid":"subject-list-empty",children:0===t.length?"No observation subjects reported.":"No live or unknown subjects. Turn on Show all subjects to include inactive subjects."}):(0,n.jsx)("ul",{className:"space-y-2","data-testid":"subject-list",children:g.map(e=>{let t=(0,a.XG)(e),s=(0,a.t_)(e),r=p.get(e.id);return(0,n.jsxs)("li",{className:"space-y-2 rounded-md border border-border p-3","data-status":s,children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("p",{className:"font-mono text-sm",children:e.runId||e.id}),(0,n.jsxs)("p",{className:"text-xs text-muted-foreground",children:["origin: ",e.origin]})]}),(0,n.jsx)("span",{className:"rounded-full bg-surface-elevated px-2 py-0.5 text-[10px] font-medium uppercase",children:l[s]})]}),(0,n.jsxs)("div",{className:"flex flex-wrap gap-1","aria-label":"Subject surfaces",children:[(0,n.jsx)(o,{label:"\uD83D\uDDE3️ talk",present:t.talk}),(0,n.jsx)(o,{label:"\uD83D\uDDA5️ screen",present:t.screen}),(0,n.jsx)(o,{label:"\uD83E\uDD16 agent",present:t.agent})]}),e.run&&(0,n.jsxs)("p",{className:"text-xs text-muted-foreground","data-testid":"subject-run-assessment","data-run-status":e.run.status,children:["run: ",i[e.run.status]," — reason: ",e.run.reason," (presence: ",e.run.presence,")"]}),(null==r?void 0:r.kind)==="no-screen"&&(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"progress: no screen"}),(null==r?void 0:r.kind)==="no-progress"&&(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"progress: no progress reported"}),(null==r?void 0:r.kind)==="progress"&&(0,n.jsxs)("p",{className:"text-xs text-muted-foreground",children:["progress (",r.ptyId,"): ",r.status," — ",r.line,r.hasMissingFrames?" (missing frames)":""]}),t.screen&&(0,n.jsx)(c,{subject:e,onRefresh:x})]},e.id)})})]})}var m=s(2699);let p=new(s(18060)).ki({baseUrl:"",token:"",provider:""});function x(){let[e,t]=(0,r.useState)(null),[s,l]=(0,r.useState)(),[i,o]=(0,r.useState)(),[d,c]=(0,r.useState)(!1),[x,h]=(0,r.useState)(new Map),[f,g]=(0,r.useState)(null),[b,k]=(0,r.useState)(0);return(0,r.useEffect)(()=>{let e=!1;return(async()=>{try{var s,n;let[r,i]=await Promise.all([fetch((0,a.h7)(d)).then(async e=>{if(!e.ok)throw Error("GET ".concat((0,a.h7)(d)," failed (").concat(e.status,")"));return e.json()}),p.listProgressFrames().catch(()=>null)]);if(e)return;let c=null!=(s=r.subjects)?s:[];g(null),t(c),l(r.runningRuns),o(r.scope),h((0,a.vq)(c,i?(0,m.gA)(null!=(n=i.logs)?n:[]):new Map))}catch(t){e||g(t instanceof Error?t.message:"Failed to load observation subjects")}})(),()=>{e=!0}},[d,b]),(0,n.jsxs)("main",{className:"mx-auto max-w-4xl space-y-4 p-6",children:[(0,n.jsxs)("header",{className:"space-y-1",children:[(0,n.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Observatory"}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"Subject-level view of talk, screen, and agent observation surfaces."}),(0,n.jsx)("button",{type:"button",className:"text-sm underline",onClick:()=>{(0,a.L4)()},children:"Open new terminal"})]}),f?(0,n.jsxs)("div",{className:"space-y-1",children:[(0,n.jsx)("p",{role:"alert",className:"rounded-md border border-error/40 bg-error/5 p-3 text-sm text-error",children:f}),(0,n.jsxs)("label",{className:"flex w-fit cursor-pointer items-center gap-2 text-sm",children:[(0,n.jsx)("input",{type:"checkbox",checked:d,onChange:e=>c(e.target.checked),"aria-label":"Include isolated instances"}),"Include isolated instances: ",d?"included":"local only"]})]}):null===e?(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"Loading observation subjects…"}):(0,n.jsx)(u,{subjects:e,runningRuns:s,scope:i,includeIsolatedInstances:d,onIncludeIsolatedInstancesChange:c,progressBySubject:x,onRefresh:()=>k(e=>e+1)})]})}},27143:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});let n=(0,s(3704).A)("messages-square",[["path",{d:"M16 10a2 2 0 0 1-2 2H6.828a2 2 0 0 0-1.414.586l-2.202 2.202A.71.71 0 0 1 2 14.286V4a2 2 0 0 1 2-2h10a2 2 0 0 1 2 2z",key:"1n2ejm"}],["path",{d:"M20 9a2 2 0 0 1 2 2v10.286a.71.71 0 0 1-1.212.502l-2.202-2.202A2 2 0 0 0 17.172 19H10a2 2 0 0 1-2-2v-1",key:"1qfcsi"}]])},51748:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});let n=(0,s(3704).A)("maximize-2",[["path",{d:"M15 3h6v6",key:"1q9fwt"}],["path",{d:"m21 3-7 7",key:"1l2asr"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M9 21H3v-6",key:"wtvkvv"}]])},53987:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});let n=(0,s(3704).A)("users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["path",{d:"M16 3.128a4 4 0 0 1 0 7.744",key:"16gr8j"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}]])},82142:(e,t,s)=>{"use strict";s.d(t,{A:()=>n});let n=(0,s(3704).A)("minimize-2",[["path",{d:"m14 10 7-7",key:"oa77jy"}],["path",{d:"M20 10h-6V4",key:"mjg0md"}],["path",{d:"m3 21 7-7",key:"tjx5ai"}],["path",{d:"M4 14h6v6",key:"rmj7iw"}]])}},e=>{e.O(0,[8060,2699,2463,2196,7358],()=>e(e.s=4563)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[4635],{1387:(e,t,r)=>{Promise.resolve().then(r.bind(r,66485))},5997:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>a,f6:()=>s,oD:()=>o});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 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=s();return localStorage.setItem(n,t),t}function a(){let e=s();return localStorage.setItem(n,e),e}},15151:(e,t,r)=>{"use strict";r.d(t,{C:()=>c,DaemonProvider:()=>d,Q:()=>u});var n=r(55539),s=r(46124),o=r(8101),a=r(5997),l=r(18060),i=r(72215);let c=(0,s.createContext)(null);function d(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[d,u]=(0,s.useState)(r),[m,f]=(0,s.useState)(""),[p]=(0,s.useState)(()=>new l.ki(r));(0,s.useEffect)(()=>{let e=(0,o.Fp)();u(e),p.updateConfig(e),f((0,a.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[p]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,o.Fp)();p.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&&f(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)},[p]);let x=e=>{u(t=>{let r={...t,...e};return(0,o.Qc)(e),p.updateConfig(r),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},g=e=>{f(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},h=(0,s.useMemo)(()=>({config:d,setConfig:x,client:p,sessionId:m,setSessionId:g}),[d,p,m]);return(0,n.jsx)(c.Provider,{value:h,children:t})}function u(){let e=(0,s.useContext)(c);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},66485:(e,t,r)=>{"use strict";r.d(t,{OutputsList:()=>i});var n=r(55539),s=r(46124),o=r(15151);let a={OP:"COO",MK:"CMO",TC:"CTO",UX:"CXO"},l=new Intl.DateTimeFormat("ko-KR",{timeZone:"Asia/Seoul",month:"numeric",day:"numeric",hour:"2-digit",minute:"2-digit",hourCycle:"h23"});function i(){let{client:e}=(0,o.Q)(),[t,r]=(0,s.useState)([]),[a,l]=(0,s.useState)("all"),[i,d]=(0,s.useState)("loading");return(0,s.useEffect)(()=>{let t=!0;return(function(e){let{limit:t,source:r}=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=new URLSearchParams;void 0!==t&&n.set("limit",String(t)),void 0!==r&&n.set("source",r);let s=n.toString();return e.fetchJson("/v1/outputs".concat(s?"?".concat(s):""))})(e).then(e=>{let{outputs:n}=e;t&&(r(n),d("ready"))}).catch(()=>{t&&d("error")}),()=>{t=!1}},[e]),(0,n.jsx)(c,{outputs:t,selected:a,onSelect:l,status:i})}function c(e){let{outputs:t,selected:r,onSelect:s,status:o}=e,i=Array.from(new Map(t.map(e=>[e.kind,e.kindLabel])).entries()),c="all"===r?t:t.filter(e=>e.kind===r);return(0,n.jsxs)("main",{className:"mx-auto w-full max-w-3xl space-y-8 px-5 py-10 sm:py-16",children:[(0,n.jsxs)("header",{className:"space-y-2",children:[(0,n.jsx)("h1",{className:"text-2xl font-semibold tracking-tight",children:"산출물"}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"엘라누스가 만든 문서\xb7슬라이드\xb7보고서\xb7영상을 한곳에서 봅니다."})]}),"loading"===o&&(0,n.jsx)("p",{role:"status",className:"text-sm text-muted-foreground",children:"산출물을 불러오는 중…"}),"error"===o&&(0,n.jsx)("p",{role:"alert",className:"text-sm text-destructive",children:"산출물 목록을 읽지 못했습니다"}),"ready"===o&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{role:"group","aria-label":"종류 고르기",className:"flex flex-wrap gap-2",children:[["all","전부"],...i].map(e=>{let[o,a]=e;return(0,n.jsxs)("button",{type:"button",onClick:()=>s(o),"aria-pressed":r===o,className:"rounded-full border px-3 py-1.5 text-sm transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ".concat(r===o?"border-primary bg-primary text-primary-foreground":"border-border bg-card text-foreground hover:bg-muted"),children:[a," ","all"===o?t.length:t.filter(e=>e.kind===o).length]},o)})}),0===t.length?(0,n.jsx)("p",{className:"rounded-xl border border-dashed border-border px-5 py-10 text-center text-sm text-muted-foreground",children:"아직 만든 산출물이 없습니다 — 일을 맡기면 여기에 쌓입니다"}):(0,n.jsx)("ul",{className:"space-y-3","aria-label":"산출물 목록",children:c.map((e,t)=>{var r;return(0,n.jsxs)("li",{className:"rounded-xl border border-border bg-card p-5 shadow-sm",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2 text-xs text-muted-foreground",children:[(0,n.jsx)("span",{className:"rounded-md bg-muted px-2 py-1 font-medium text-foreground",children:e.kindLabel}),e.seat&&(0,n.jsx)("span",{children:null!=(r=a[e.seat])?r:e.seat}),(0,n.jsx)("time",{dateTime:e.at,children:function(e){let t=Object.fromEntries(l.formatToParts(new Date(e)).map(e=>{let{type:t,value:r}=e;return[t,r]}));return"".concat(t.month,"월 ").concat(t.day,"일 ").concat(t.hour,":").concat(t.minute)}(e.at)}),(0,n.jsx)("span",{children:"exec"===e.source?"맡긴 일":"현장"})]}),(0,n.jsx)("h2",{className:"mt-3 font-semibold leading-snug",children:e.title}),e.url?(0,n.jsx)("a",{href:e.url,target:"_blank",rel:"noopener",className:"mt-3 inline-block text-sm font-medium text-primary underline-offset-4 hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:"열기"}):e.fileName&&(0,n.jsx)("p",{className:"mt-3 text-sm text-muted-foreground",children:e.fileName})]},"".concat(e.at,"-").concat(e.kind,"-").concat(t))})})]})]})}}},e=>{e.O(0,[8060,2463,2196,7358],()=>e(e.s=1387)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8974],{95735:(e,s,_)=>{Promise.resolve().then(_.bind(_,1369))}},e=>{e.O(0,[211,3324,3558,5994,5977,224,2463,2196,7358],()=>e(e.s=95735)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7480],{1736:(e,t,r)=>{"use strict";r.d(t,{r:()=>o});var n=r(55539),a=r(3558),s=r.n(a);let l=[{key:"autopilot",href:"/autopilot",num:"①",label:"미션",sub:"Autopilot"},{key:"tasks",href:"/tasks",num:"②",label:"작업",sub:"Tasks"},{key:"scheduler",href:"/scheduler",num:"③",label:"스케줄",sub:"Schedules"}];function o(e){let{active:t}=e;return(0,n.jsxs)("nav",{"aria-label":"Mission Fabric 파이프라인","data-testid":"fabric-stage-header",className:"flex flex-wrap items-center gap-1 text-xs",children:[(0,n.jsx)("span",{className:"mr-1 text-muted-foreground",children:"Missions"}),l.map((e,r)=>(0,n.jsxs)("span",{className:"flex items-center gap-1",children:[(0,n.jsxs)(s(),{href:e.href,"aria-current":e.key===t?"page":void 0,className:["rounded px-2 py-1 ring-1 transition-colors",e.key===t?"bg-primary/15 font-medium text-foreground ring-primary/40":"text-muted-foreground ring-border hover:bg-muted hover:text-foreground"].join(" "),children:[(0,n.jsx)("span",{className:"mr-1",children:e.num}),e.label,(0,n.jsx)("span",{className:"ml-1 text-[10px] opacity-70",children:e.sub})]}),r<l.length-1&&(0,n.jsx)("span",{className:"text-muted-foreground/50","aria-hidden":!0,children:"→"})]},e.key))]})}},5997:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>l,f6:()=>a,oD:()=>s});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 s(){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 l(){let e=a();return localStorage.setItem(n,e),e}},9734:(e,t,r)=>{"use strict";r.d(t,{$:()=>i});var n=r(55539),a=r(89545),s=r(17154),l=r(44373);let o=(0,s.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function i(e){let{className:t,variant:r="default",size:s="default",...i}=e;return(0,n.jsx)(a.$,{"data-slot":"button",className:(0,l.cn)(o({variant:r,size:s,className:t})),...i})}},15151:(e,t,r)=>{"use strict";r.d(t,{C:()=>d,DaemonProvider:()=>u,Q:()=>c});var n=r(55539),a=r(46124),s=r(8101),l=r(5997),o=r(18060),i=r(72215);let d=(0,a.createContext)(null);function u(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[u,c]=(0,a.useState)(r),[m,x]=(0,a.useState)(""),[g]=(0,a.useState)(()=>new o.ki(r));(0,a.useEffect)(()=>{let e=(0,s.Fp)();c(e),g.updateConfig(e),x((0,l.oD)()),(0,i.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[g]),(0,a.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,s.Fp)();g.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)},[g]);let p=e=>{c(t=>{let r={...t,...e};return(0,s.Qc)(e),g.updateConfig(r),(0,i.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},f=e=>{x(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,i.cY)("webterm.provider.daemon.session-set",{sessionId:e})},b=(0,a.useMemo)(()=>({config:u,setConfig:p,client:g,sessionId:m,setSessionId:f}),[u,g,m]);return(0,n.jsx)(d.Provider,{value:b,children:t})}function c(){let e=(0,a.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},35002:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>y});var n=r(55539),a=r(46124),s=r(15151),l=r(9734),o=r(67327),i=r(1736),d=r(3558),u=r.n(d);function c(e){var t,r,n,a,s,l,o,i,d,u,c,m,x,g,p,f;return{id:e.id,name:e.name,cron:e.cron,intervalMs:e.intervalMs,category:null!=(l=e.category)?l:e.source,domain:null!=(o=e.domain)?o:null,source:e.source,enabled:"off"!==e.state,runVia:null!=(i=e.runVia)?i:e.source,lastRun:null!=(d=null==(t=e.lastRun)?void 0:t.at)?d:null,lastStatus:null!=(u=null==(r=e.lastRun)?void 0:r.status)?u:null,lastExit:null!=(m=null!=(c=null==(n=e.lastRun)?void 0:n.exit)?c:e.lastExit)?m:null,lastDurationMs:null!=(x=null==(a=e.lastRun)?void 0:a.durationMs)?x:null,lastVia:null!=(g=null==(s=e.lastRun)?void 0:s.via)?g:null,stale:"stale"===e.state,command:null!=(p=e.command)?p:"",note:null!=(f=e.note)?f:null,state:e.state,next:e.next,flags:e.flags}}async function m(e){let t="Unknown error";for(let r of["/v1/schedules?includeOff=1","/v1/dashboard/schedules"])try{let n=function(e){if(!e||"object"!=typeof e)return null;if(Array.isArray(e.schedules))return function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:new Date().toISOString(),r=e.map(c),n={},a={},s={};for(let e of r){var l,o,i;n[e.category]=(null!=(l=n[e.category])?l:0)+1,a[e.source]=(null!=(o=a[e.source])?o:0)+1,e.state&&(s[e.state]=(null!=(i=s[e.state])?i:0)+1)}return{total:r.length,adopted:r.filter(e=>"elanous"===e.runVia).length,byCategory:n,bySource:a,byState:s,jobs:r,generatedAt:t}}(e.schedules);let t=e.schedules;return t&&Array.isArray(t.jobs)?t:null}(await e(r));if(n)return{kind:"ready",data:n};t="unexpected response from ".concat(r)}catch(e){t=e instanceof Error&&e.message?e.message:"string"==typeof e&&e?e:"Unknown error"}return{kind:"error",reason:t}}let x={live:{label:"켜짐",tone:"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30",tip:"실제 발화 경로(crontab\xb7launchd\xb7trigger)에 올라 있다"},firing:{label:"발화 중",tone:"bg-sky-500/15 text-sky-200 ring-sky-500/30",tip:"발화 경로에 올라 있고 최근 실행 기록이 있다"},stale:{label:"유실 의심",tone:"bg-amber-500/15 text-amber-300 ring-amber-500/30",tip:"예정 시각이 지났는데 실행 기록이 없다"},off:{label:"꺼짐",tone:"bg-muted text-muted-foreground ring-border",tip:"어느 발화 경로에도 없다(레지스트리에만 있다)"}},g={elanous:"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30",daemon:"bg-sky-500/15 text-sky-200 ring-sky-500/30",crontab:"bg-muted text-muted-foreground ring-border"},p={finance:"Finance",elanous:"elanous (core)",general:"General"};function f(e){let{label:t,onClick:r,disabled:a,danger:s}=e;return(0,n.jsx)("button",{type:"button",onClick:r,disabled:a,className:["rounded-md px-1.5 py-0.5 text-[10px] ring-1 transition-colors disabled:opacity-40",s?"text-red-300 ring-red-500/30 hover:bg-red-500/15":"text-muted-foreground ring-border hover:bg-accent/40 hover:text-foreground"].join(" "),children:t})}function b(e){var t,r,a,s,l,o,i;let{job:d,onAction:u,acting:c}=e,m="daemon"===d.runVia||d.id.includes(":"),p=d.state?x[d.state]:null,b=function(e){if(!e)return null;let t=Date.parse(e);if(Number.isNaN(t))return null;let r=Math.round((t-Date.now())/6e4);if(r<1)return"next <1m";if(r<60)return"next ".concat(r,"m");let n=Math.floor(r/60);return n<24?"next ".concat(n,"h"):"next ".concat(Math.floor(n/24),"d")}(null==(t=d.next)?void 0:t[0]),h=d.note||function(e){if(!e)return"—";let t=e.split(/\s*>>?\s*/)[0].trim(),r=t.match(/(\S+\.(?:ts|py|sh|js|mjs))\b/);if(r){let e=r[1],t=e.indexOf("/scripts/");if(t>=0)return e.slice(t+1);let n=e.lastIndexOf("/");return n>=0?e.slice(n+1):e}return t.replace(/^cd\s+\S+\s*&&\s*/,"").trim().slice(0,60)||"—"}(d.command),v=d.note?"".concat(d.note,"\n\n").concat(d.command):d.command;return(0,n.jsxs)("div",{className:["flex flex-col gap-1 rounded-xl border border-border bg-card p-3 sm:flex-row sm:items-center sm:justify-between",d.enabled?"":"opacity-50"].join(" "),title:v,children:[(0,n.jsxs)("div",{className:"min-w-0",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("span",{className:"truncate text-sm font-medium",children:d.name}),p?(0,n.jsx)("span",{className:"shrink-0 whitespace-nowrap rounded-full px-1.5 py-0.5 text-[10px] ring-1 ".concat(p.tone),title:p.tip,"data-schedule-state":d.state,children:p.label}):!d.enabled&&(0,n.jsx)("span",{className:"rounded-full bg-muted px-1.5 py-0.5 text-[10px] text-muted-foreground",children:"disabled"}),(null==(r=d.flags)?void 0:r.includes("duplicate"))&&(0,n.jsx)("span",{className:"rounded-full bg-red-500/15 px-1.5 py-0.5 text-[10px] text-red-300 ring-1 ring-red-500/30",title:"같은 명령이 두 번 발화한다",children:"duplicate"})]}),(0,n.jsx)("div",{className:"mt-0.5 truncate text-[11px] ".concat(d.note?"text-muted-foreground":"font-mono text-muted-foreground/70"),children:h})]}),(0,n.jsxs)("div",{className:"flex shrink-0 flex-wrap items-center gap-1.5 text-[11px]",children:[(0,n.jsx)("span",{className:"rounded-full bg-muted px-2 py-0.5 font-mono text-muted-foreground",children:d.cron?d.cron:d.intervalMs?"every ".concat(Math.round(d.intervalMs/1e3),"s"):"—"}),b&&d.enabled&&(0,n.jsx)("span",{className:"text-muted-foreground",title:null==(a=d.next)?void 0:a.join("\n"),children:b}),(0,n.jsx)("span",{className:"rounded-full bg-muted px-2 py-0.5 text-muted-foreground",children:d.category}),(0,n.jsx)("span",{className:"rounded-full px-2 py-0.5 ring-1 ".concat(null!=(s=g[d.runVia])?s:g.crontab),children:d.runVia}),d.lastStatus&&(0,n.jsxs)("span",{className:"rounded-full px-2 py-0.5 ring-1 ".concat("ok"===d.lastStatus?"bg-emerald-500/15 text-emerald-300 ring-emerald-500/30":"bg-red-500/15 text-red-300 ring-red-500/30"),title:null!=(o=d.lastError)?o:"ok"===d.lastStatus?"마지막 실행 성공":"exit ".concat(null!=(l=d.lastExit)?l:"?"),children:["ok"===d.lastStatus?"✓":"✗",null!=d.lastDurationMs?" ".concat(Math.round(d.lastDurationMs),"ms"):"",d.lastVia&&"crontab"!==d.lastVia?" ".concat(d.lastVia):""]}),d.stale&&!p&&(0,n.jsx)("span",{className:"rounded-full bg-amber-500/15 px-2 py-0.5 text-amber-300 ring-1 ring-amber-500/30",title:"예정 시각이 지났는데 미실행(유실 의심)",children:"stale"}),(0,n.jsx)("span",{className:"text-muted-foreground",title:null!=(i=d.lastRun)?i:"never run",children:function(e){if(!e)return"never";let t=Date.parse(e);if(Number.isNaN(t))return e;let r=Math.max(0,Math.floor((Date.now()-t)/1e3));if(r<60)return"".concat(r,"s ago");let n=Math.floor(r/60);if(n<60)return"".concat(n,"m ago");let a=Math.floor(n/60);return a<24?"".concat(a,"h ago"):"".concat(Math.floor(a/24),"d ago")}(d.lastRun)}),!m&&(0,n.jsxs)("span",{className:"ml-1 flex items-center gap-1",children:["crontab"===d.runVia&&(0,n.jsx)(f,{label:"adopt",onClick:()=>u("adopt",d),disabled:c}),"elanous"===d.runVia&&(0,n.jsx)(f,{label:"release",onClick:()=>u("release",d),disabled:c}),(0,n.jsx)(f,{label:d.enabled?"disable":"enable",onClick:()=>u(d.enabled?"disable":"enable",d),disabled:c}),(0,n.jsx)(f,{label:"✕",onClick:()=>u("delete",d),disabled:c,danger:!0})]})]})]})}function h(e){let{load:t,groups:r,onRefresh:a,onAction:s,busy:o,acting:i}=e;return"loading"===t.kind?(0,n.jsx)("div",{className:"text-sm text-muted-foreground",children:"Loading schedules…"}):"error"===t.kind?(0,n.jsxs)("div",{className:"rounded-xl border border-destructive/40 bg-destructive/10 px-3 py-10 text-center text-sm text-destructive",children:[(0,n.jsx)("p",{children:"Failed to load schedules"}),(0,n.jsx)("p",{className:"mt-1 text-muted-foreground",children:t.reason}),(0,n.jsx)(l.$,{className:"mt-3",size:"sm",variant:"outline",onClick:a,disabled:o,children:"Retry"})]}):0===t.data.jobs.length?(0,n.jsx)("div",{className:"rounded-xl border border-dashed border-border px-3 py-10 text-center text-sm text-muted-foreground",children:"no schedules"}):(0,n.jsx)("div",{className:"space-y-6",children:r.map(e=>{var t;return(0,n.jsxs)("section",{className:"space-y-2",children:[(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)("h2",{className:"text-sm font-semibold",children:null!=(t=p[e.domain])?t:e.domain}),(0,n.jsx)("span",{className:"rounded-full bg-background px-2 py-0.5 text-[11px] text-muted-foreground",children:e.jobs.length})]}),(0,n.jsx)("div",{className:"space-y-2",children:e.jobs.map(e=>(0,n.jsx)(b,{job:e,onAction:s,acting:i},e.id))})]},e.domain)})})}function v(){let{client:e}=(0,s.Q)(),[t,r]=(0,a.useState)({kind:"loading"}),[d,c]=(0,a.useState)(!1),[g,p]=(0,a.useState)(!1),f=(0,a.useRef)(0),b=(0,a.useRef)(null),v="ready"===t.kind?t.data:null,[y,j]=(0,a.useState)(null);(0,a.useEffect)(()=>{j(function(e){let t=new URLSearchParams(e).get("ids");if(!t)return null;let r=t.split(",").map(e=>e.trim()).filter(Boolean);return r.length?r:null}(window.location.search))},[]);let k=(0,a.useCallback)(async()=>{var t,n,a,s,l;if(b.current===e)return;b.current=e;let i=++f.current;c(!0),r({kind:"loading"});try{let s=await m(t=>e.fetchJson(t));t=f.current,n=b.current,i===t&&n===e&&(r(s),"error"===s.kind&&(a=s.reason,(0,o.oR.error)("scheduler load failed: ".concat(a))))}finally{s=f.current,l=b.current,i===s&&l===e&&(b.current=null,c(!1))}},[e]),N=(0,a.useCallback)(async(t,r,n)=>{if("delete"!==t||window.confirm("삭제: ".concat(r.name,"?\n(자동 백업되어 복구 가능)"))){p(!0);try{let a=await e.fetchJson("/v1/schedules/action",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({action:t,id:r.id,...void 0!==n?{note:n}:{}})});a&&"object"==typeof a&&"error"in a&&a.error?o.oR.error("".concat(t," 실패: ").concat(a.error)):(o.oR.success("note"===t?"설명 저장: ".concat(r.name):"".concat(t,": ").concat(r.name)),await k())}catch(e){o.oR.error("".concat(t," 실패: ").concat(e instanceof Error?e.message:e))}finally{p(!1)}}},[e,k]);(0,a.useEffect)(()=>{k();let e=window.setInterval(()=>void k(),3e4);return()=>window.clearInterval(e)},[k]);let w=(0,a.useMemo)(()=>{if(!v)return[];let e=new Map;for(let n of v.jobs){var t,r;if(y&&!y.includes(n.id))continue;let a=(r=n.domain)&&r.trim()?r:"general",s=null!=(t=e.get(a))?t:[];s.push(n),e.set(a,s)}let n=["finance","elanous","general"];return[...e.entries()].sort((e,t)=>{let r=n.indexOf(e[0]),a=n.indexOf(t[0]);return(r<0?99:r)-(a<0?99:a)}).map(e=>{let[t,r]=e;return{domain:t,jobs:r.sort((e,t)=>{var r,n;return(Date.parse(null!=(r=t.lastRun)?r:"0")||0)-(Date.parse(null!=(n=e.lastRun)?n:"0")||0)})}})},[v,y]);return(0,n.jsxs)("div",{className:"mx-auto max-w-[1200px] space-y-4 p-4",children:[(0,n.jsx)(i.r,{active:"scheduler"}),(0,n.jsxs)("header",{className:"flex flex-col gap-3 lg:flex-row lg:items-end lg:justify-between",children:[(0,n.jsxs)("div",{children:[(0,n.jsx)("h1",{className:"text-xl font-semibold tracking-tight",children:"Schedules"}),(0,n.jsx)("p",{className:"text-sm text-muted-foreground",children:"예약된 모든 잡 한 곳 (crontab \xb7 launchd \xb7 데몬 내부 \xb7 workflow trigger). \xab켜짐\xbb = 실제 발화 경로에 올라 있다."})]}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsx)(u(),{href:"/loops",className:"rounded-lg border border-border px-3 py-2 text-sm hover:bg-accent",children:"루프 현황 →"}),v&&(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs",children:[(0,n.jsx)("div",{className:"text-muted-foreground",children:"total"}),(0,n.jsx)("div",{className:"text-sm font-semibold",children:v.total})]}),v.byState?["live","firing","stale","off"].map(e=>{var t,r,a;return(0,n.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs","data-schedule-count":e,children:[(0,n.jsx)("div",{className:"text-muted-foreground",children:x[e].label}),(0,n.jsx)("div",{className:"text-sm font-semibold ".concat("stale"===e&&(null==(t=v.byState)?void 0:t[e])?"text-amber-300":""),children:null!=(a=null==(r=v.byState)?void 0:r[e])?a:0})]},e)}):(0,n.jsxs)("div",{className:"rounded-lg border border-border bg-card px-3 py-2 text-xs",children:[(0,n.jsx)("div",{className:"text-muted-foreground",children:"adopted (elanous)"}),(0,n.jsx)("div",{className:"text-sm font-semibold",children:v.adopted})]})]}),(0,n.jsx)(l.$,{size:"sm",variant:"outline",onClick:()=>void k(),disabled:d,children:"Refresh"})]})]}),y&&(0,n.jsxs)("div",{className:"flex items-center gap-2 rounded-lg border border-primary/40 bg-primary/10 px-3 py-2 text-xs","data-schedule-ids-filter":!0,children:[(0,n.jsxs)("span",{children:["미션이 부르는 스케줄만 \xb7 ",y.length]}),v&&w.reduce((e,t)=>e+t.jobs.length,0)<y.length&&(0,n.jsxs)("span",{className:"text-amber-300",children:["— ",y.length-w.reduce((e,t)=>e+t.jobs.length,0),"개는 지금 목록에 없다(지워졌거나 다른 우주)"]}),(0,n.jsx)("button",{type:"button",className:"ml-auto underline",onClick:()=>{j(null),window.history.replaceState(null,"",window.location.pathname)},children:"모두 보기"})]}),(0,n.jsx)(h,{load:t,groups:w,onRefresh:()=>void k(),onAction:N,busy:d,acting:g})]})}function y(){return(0,n.jsx)(v,{})}},44373:(e,t,r)=>{"use strict";r.d(t,{cn:()=>s});var n=r(20852),a=r(30984);function s(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,a.QP)((0,n.$)(t))}},86168:(e,t,r)=>{Promise.resolve().then(r.bind(r,35002))}},e=>{e.O(0,[211,8682,3558,7327,8060,2463,2196,7358],()=>e(e.s=86168)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[8898],{5997:(e,t,r)=>{"use strict";r.d(t,{Zr:()=>o,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 o(){let e=s();return localStorage.setItem(n,e),e}},9372:(e,t,r)=>{Promise.resolve().then(r.bind(r,40640))},9734:(e,t,r)=>{"use strict";r.d(t,{$:()=>l});var n=r(55539),s=r(89545),a=r(17154),o=r(44373);let i=(0,a.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function l(e){let{className:t,variant:r="default",size:a="default",...l}=e;return(0,n.jsx)(s.$,{"data-slot":"button",className:(0,o.cn)(i({variant:r,size:a,className:t})),...l})}},15151:(e,t,r)=>{"use strict";r.d(t,{C:()=>d,DaemonProvider:()=>c,Q:()=>u});var n=r(55539),s=r(46124),a=r(8101),o=r(5997),i=r(18060),l=r(72215);let d=(0,s.createContext)(null);function c(e){let{children:t}=e,r={baseUrl:"",token:"",provider:""},[c,u]=(0,s.useState)(r),[m,g]=(0,s.useState)(""),[p]=(0,s.useState)(()=>new i.ki(r));(0,s.useEffect)(()=>{let e=(0,a.Fp)();u(e),p.updateConfig(e),g((0,o.oD)()),(0,l.cY)("webterm.provider.daemon.init",{baseUrl:e.baseUrl,hasToken:!!e.token})},[p]),(0,s.useEffect)(()=>{let e=e=>{if("elanous.daemon.token"===e.key||"elanous.nexus.baseUrl"===e.key){let t=(0,a.Fp)();p.updateConfig(t),u(t),(0,l.cY)("webterm.provider.daemon.config-cross-tab",{key:e.key,hasToken:!!t.token});return}"elanous.daemon.sessionId"===e.key&&e.newValue&&g(t=>t===e.newValue?t:((0,l.cY)("webterm.provider.daemon.session-cross-tab",{previous:t||"(empty)",next:e.newValue}),e.newValue))};return window.addEventListener("storage",e),()=>window.removeEventListener("storage",e)},[p]);let x=e=>{u(t=>{let r={...t,...e};return(0,a.Qc)(e),p.updateConfig(r),(0,l.cY)("webterm.provider.daemon.config-update",{keys:Object.keys(e)}),r})},f=e=>{g(e),localStorage.setItem("elanous.daemon.sessionId",e),(0,l.cY)("webterm.provider.daemon.session-set",{sessionId:e})},h=(0,s.useMemo)(()=>({config:c,setConfig:x,client:p,sessionId:m,setSessionId:f}),[c,p,m]);return(0,n.jsx)(d.Provider,{value:h,children:t})}function u(){let e=(0,s.useContext)(d);if(!e)throw Error("useDaemon must be used inside <DaemonProvider>");return e}},23660:(e,t,r)=>{"use strict";r.d(t,{KW:()=>a,jU:()=>n,nj:()=>s});class n{async list(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];return this.client.fetchJson("/v1/sessions/store".concat(e?"?includeEmpty=1":""))}async transcript(e){return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e)))}async fork(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e),"/fork"),{method:"POST",...void 0!==t.beforeUser?{headers:{"content-type":"application/json"},body:JSON.stringify({beforeUser:t.beforeUser})}:{}})}async delete(e){return this.client.fetchJson("/v1/sessions/store/".concat(encodeURIComponent(e)),{method:"DELETE"})}constructor(e){this.client=e}}function s(e,t){let r=t.trim().toLowerCase();if(!r)return{kind:"none"};let n=e.filter(e=>e.id.toLowerCase().startsWith(r));return 1===n.length?{kind:"one",id:n[0].id}:0===n.length?{kind:"none"}:{kind:"ambiguous",count:n.length}}function a(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Date.now(),r=Date.parse(e);if(!Number.isFinite(r))return"";let n=Math.max(0,Math.floor((t-r)/1e3));return n<30?"방금":n<3600?"".concat(Math.floor(n/60),"분 전"):n<86400?"".concat(Math.floor(n/3600),"시간 전"):"".concat(Math.floor(n/86400),"일 전")}},40640:(e,t,r)=>{"use strict";r.d(t,{SessionsListPanel:()=>p});var n=r(55539),s=r(46124),a=r(58603),o=r(67327),i=r(15151),l=r(9734),d=r(23660);function c(e){return"pwa"===e.origin?"pwa":"telegram"===e.source||"tg"===e.origin?"telegram":"cli"}function u(e){let{source:t,origin:r}=e,s=c({source:t,origin:r}),a="telegram"===s?{label:"텔레그램",tone:"bg-sky-500/15 text-sky-300 ring-sky-500/30"}:"pwa"===s?{label:"PWA 챗",tone:"bg-fuchsia-500/15 text-fuchsia-300 ring-fuchsia-500/30"}:{label:"CLI",tone:"bg-slate-500/15 text-slate-300 ring-slate-500/30"};return(0,n.jsx)("span",{className:["rounded px-1.5 py-0.5 text-[11px] ring-1",a.tone].join(" "),children:a.label})}function m(e){let{messages:t,onTimeTravel:r,busy:s}=e,a=t.filter(e=>"user"===e.role||"assistant"===e.role);if(0===a.length)return(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"메시지 없음."});let o=0,i=a.map(e=>({m:e,userIndex:"user"===e.role?++o:0}));return(0,n.jsx)("div",{className:"max-h-[360px] space-y-2 overflow-y-auto rounded-md border border-border bg-background/50 p-2.5",children:i.map((e,t)=>{let{m:a,userIndex:o}=e;return(0,n.jsxs)("div",{className:["group/msg text-sm","user"===a.role?"text-foreground/90":"text-muted-foreground"].join(" "),children:[(0,n.jsx)("span",{className:["mr-1.5 rounded px-1 py-0.5 text-[10px] ring-1","user"===a.role?"bg-primary/15 text-primary ring-primary/30":"bg-muted text-muted-foreground ring-border"].join(" "),children:"user"===a.role?"나":"elanous"}),"user"===a.role&&r&&(0,n.jsx)("button",{type:"button",disabled:s,onClick:()=>r(o),title:"이 발화 직전으로 갈라치기 — u".concat(o," 부터는 미포함 (원본 불변)"),className:"mr-1.5 rounded px-1 py-0.5 text-[10px] text-violet-300 ring-1 ring-violet-500/30 transition-opacity hover:bg-violet-500/15 disabled:opacity-30 md:opacity-0 md:focus:opacity-100 md:group-hover/msg:opacity-100",children:"⑂ 여기서 갈라치기"}),(0,n.jsx)("span",{className:"whitespace-pre-wrap",children:a.content.slice(0,2e3)})]},t)})})}function g(e){let{api:t,s:r,onForked:c,onDeleted:g}=e,p=(0,a.useRouter)(),{setSessionId:x}=(0,i.Q)(),[f,h]=(0,s.useState)(!1),[v,b]=(0,s.useState)(null),[y,k]=(0,s.useState)(null),j=(0,s.useCallback)(async()=>{if(v)return v;k("load");try{let e=await t.transcript(r.id);return b(e.messages),e.messages}catch(e){return o.oR.error("불러오기 실패: ".concat(e instanceof Error?e.message:String(e))),null}finally{k(null)}},[t,r.id,v]),w=(0,s.useCallback)(async()=>{let e=!f;h(e),e&&!v&&await j()},[f,v,j]),N=(0,s.useCallback)(async()=>{k("copy");try{let e=await j();if(!e)return;let t=e.filter(e=>"user"===e.role||"assistant"===e.role).map(e=>"[".concat("user"===e.role?"나":"elanous","] ").concat(e.content)).join("\n\n");await navigator.clipboard.writeText(t),o.oR.success("복사 완료 (".concat(e.length," 메시지)"))}catch(e){o.oR.error("복사 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[j]),C=(0,s.useCallback)((e,t)=>{x(e),o.oR.success(t),p.push("/chat")},[x,p]),S=(0,s.useCallback)(async()=>{k("fork");try{var e;let n=await t.fork(r.id);n.ok&&n.id?(c(),C(n.id,"Fork 생성 — 이어갑니다 (".concat(n.id.slice(0,8),"…)"))):o.oR.error("Fork 실패: ".concat(null!=(e=n.error)?e:"알 수 없음"))}catch(e){o.oR.error("Fork 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[t,r.id,c,C]),E=(0,s.useCallback)(async e=>{k("fork");try{var n;let s=await t.fork(r.id,{beforeUser:e});s.ok&&s.id?(c(),C(s.id,"⑂ u".concat(e," 직전으로 갈라치기 — 이어갑니다 (").concat(s.id.slice(0,8),"…)"))):o.oR.error("갈라치기 실패: ".concat(null!=(n=s.error)?n:"알 수 없음"))}catch(e){o.oR.error("갈라치기 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}},[t,r.id,c,C]),I=(0,s.useCallback)(()=>C(r.id,"이 대화로 이어갑니다"),[C,r.id]),z=(0,s.useCallback)(async()=>{if(window.confirm('이 대화를 지울까요? 복구할 수 없습니다.\n\n"'.concat(r.title||r.id.slice(0,8),'"'))){k("delete");try{var e;let n=await t.delete(r.id);n.ok?(o.oR.success("대화를 지웠습니다"),g()):o.oR.error("삭제 실패: ".concat(null!=(e=n.error)?e:"알 수 없음"))}catch(e){o.oR.error("삭제 실패: ".concat(e instanceof Error?e.message:String(e)))}finally{k(null)}}},[t,r.id,r.title,g]);return(0,n.jsxs)("div",{className:"rounded-lg border border-border bg-card/50",children:[(0,n.jsxs)("div",{className:"flex items-start gap-3 p-3",children:[(0,n.jsx)("button",{type:"button",onClick:()=>void w(),className:"mt-0.5 text-muted-foreground",children:f?"▾":"▸"}),(0,n.jsxs)("div",{className:"min-w-0 flex-1 space-y-1",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsx)(u,{source:r.source,origin:r.origin}),r.active&&(0,n.jsx)("span",{className:"rounded bg-emerald-500/15 px-1.5 py-0.5 text-[11px] font-medium text-emerald-300 ring-1 ring-emerald-500/30",children:"대화중"}),r.forkedFromId&&(0,n.jsx)("span",{className:"rounded bg-violet-500/15 px-1.5 py-0.5 text-[11px] text-violet-300 ring-1 ring-violet-500/30",children:"↳ fork"}),(0,n.jsxs)("span",{className:"text-[11px] text-muted-foreground",children:[r.messageCount," 메시지 \xb7 ",(0,d.KW)(r.updatedAt)]})]}),(0,n.jsx)("p",{className:"truncate text-sm font-medium text-foreground/90",children:r.title||"(제목 없음)"}),r.preview&&(0,n.jsx)("p",{className:"truncate text-xs text-muted-foreground",children:r.preview})]}),(0,n.jsxs)("div",{className:"flex shrink-0 items-center gap-1",children:[(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void w(),children:f?"닫기":"보기"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void N(),children:"copy"===y?"…":"복사"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>I(),children:"이어가기"}),(0,n.jsx)(l.$,{size:"sm",variant:"outline",disabled:!!y,onClick:()=>void S(),children:"fork"===y?"…":"Fork"}),(0,n.jsx)(l.$,{size:"sm",variant:"ghost",disabled:!!y,onClick:()=>void z(),className:"text-rose-400 hover:text-rose-300",title:"대화 지우기(복구 불가)",children:"delete"===y?"…":"삭제"})]})]}),f&&(0,n.jsxs)("div",{className:"border-t border-border px-4 py-3",children:["load"===y&&(0,n.jsx)("p",{className:"text-xs text-muted-foreground",children:"불러오는 중…"}),v&&(0,n.jsx)(m,{messages:v,busy:!!y,onTimeTravel:e=>void E(e)}),(0,n.jsx)("p",{className:"mt-1.5 font-mono text-[10px] text-muted-foreground",children:r.id})]})]})}function p(){var e;let{client:t}=(0,i.Q)(),r=(0,s.useMemo)(()=>new d.jU(t),[t]),[a,o]=(0,s.useState)(null),[u,m]=(0,s.useState)(!1),[p,x]=(0,s.useState)(""),[f,h]=(0,s.useState)("all"),[v,b]=(0,s.useState)(!1),[y,k]=(0,s.useState)(null),[j,w]=(0,s.useState)(""),N=(0,s.useRef)(""),C=(0,s.useCallback)(async function(){let e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e||b(!0),k(null);try{var t,n,s,a;let i=await r.list(u),l="".concat(i.total,":").concat(null!=(s=null==(t=i.sessions[0])?void 0:t.id)?s:"",":").concat(null!=(a=null==(n=i.sessions[0])?void 0:n.updatedAt)?a:"");l===N.current&&e||(N.current=l,o(i.sessions)),w(new Date().toLocaleTimeString())}catch(t){e||k(t instanceof Error?t.message:String(t))}finally{e||b(!1)}},[r,u]);(0,s.useEffect)(()=>{C()},[C]),(0,s.useEffect)(()=>{let e=setInterval(()=>{C(!0)},1e4),r=null,n=null;{let e=t.sessionStoreEventsUrl();if(e)try{r=new EventSource(e);let t=()=>{n&&clearTimeout(n),n=setTimeout(()=>{C(!0)},500)};r.addEventListener("session.created",t),r.addEventListener("session.updated",t),r.onmessage=t}catch(e){r=null}}return()=>{clearInterval(e),n&&clearTimeout(n),null==r||r.close()}},[C,t]);let S=(0,s.useMemo)(()=>{if(!a)return null;let e=p.trim().toLowerCase();return a.filter(t=>{var r,n;return("all"===f||c(t)===f)&&(!e||(null!=(r=t.title)?r:"").toLowerCase().includes(e)||(null!=(n=t.preview)?n:"").toLowerCase().includes(e)||t.id.toLowerCase().includes(e))})},[a,p,f]),E=null!=(e=null==a?void 0:a.filter(e=>e.active).length)?e:0,I=(0,s.useMemo)(()=>{var e;let t={all:null!=(e=null==a?void 0:a.length)?e:0,cli:0,telegram:0,pwa:0};for(let e of null!=a?a:[])t[c(e)]+=1;return t},[a]);return(0,n.jsxs)("div",{className:"mx-auto max-w-3xl space-y-3 p-4",children:[(0,n.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-2",children:[(0,n.jsxs)("div",{children:[(0,n.jsxs)("h1",{className:"text-lg font-semibold",children:["대화 목록 ",(0,n.jsx)("span",{className:"text-sm font-normal text-muted-foreground",children:"CLI \xb7 텔레그램"})]}),(0,n.jsxs)("p",{className:"text-xs text-muted-foreground",children:[a?S&&S.length!==a.length?"".concat(S.length,"/").concat(a.length,"개 \xb7 대화중 ").concat(E):"".concat(a.length,"개 \xb7 대화중 ").concat(E):"불러오는 중…",j&&(0,n.jsxs)("span",{className:"ml-2",children:["\xb7 자동 갱신 ",j]})]})]}),(0,n.jsxs)("div",{className:"flex items-center gap-2",children:[(0,n.jsxs)("label",{className:"flex items-center gap-1 text-xs text-muted-foreground",children:[(0,n.jsx)("input",{type:"checkbox",checked:u,onChange:e=>m(e.target.checked)}),"빈 대화"]}),(0,n.jsx)(l.$,{size:"sm",variant:"outline",disabled:v,onClick:()=>void C(),children:v?"…":"새로고침"})]})]}),(0,n.jsxs)("div",{className:"flex flex-wrap items-center gap-2",children:[(0,n.jsx)("input",{type:"search",value:p,onChange:e=>x(e.target.value),placeholder:"대화 검색 (제목\xb7내용\xb7id)","aria-label":"대화 검색",className:"min-w-[180px] flex-1 rounded-md border border-border bg-background/60 px-2.5 py-1.5 text-sm outline-none ring-primary/30 focus:ring-2"}),(0,n.jsx)("div",{className:"flex items-center gap-1",children:[{key:"all",label:"전체"},{key:"cli",label:"CLI"},{key:"telegram",label:"텔레그램"},{key:"pwa",label:"PWA"}].map(e=>(0,n.jsxs)("button",{type:"button",onClick:()=>h(e.key),className:["rounded-full px-2.5 py-1 text-[11px] ring-1 transition-colors",f===e.key?"bg-primary/20 text-primary ring-primary/40":"bg-muted/40 text-muted-foreground ring-border hover:bg-muted"].join(" "),children:[e.label,"all"===e.key||I[e.key]>0?" ".concat(I[e.key]):""]},e.key))})]}),y&&(0,n.jsx)("p",{className:"text-xs text-rose-400",children:y}),a&&0===a.length&&(0,n.jsx)("p",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:"대화가 없습니다. 텔레그램이나 CLI에서 대화를 시작하면 여기에 나타납니다."}),S&&a&&a.length>0&&0===S.length&&(0,n.jsx)("p",{className:"rounded-lg border border-dashed border-border p-6 text-center text-sm text-muted-foreground",children:p||"all"!==f?"검색\xb7필터 결과가 없습니다.":"대화가 없습니다."}),S&&S.length>0&&(0,n.jsx)("div",{className:"space-y-2",children:S.map(e=>(0,n.jsx)(g,{api:r,s:e,onForked:()=>void C(),onDeleted:()=>void C()},e.id))})]})}},44373:(e,t,r)=>{"use strict";r.d(t,{cn:()=>a});var n=r(20852),s=r(30984);function a(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,s.QP)((0,n.$)(t))}},58603:(e,t,r)=>{"use strict";var n=r(99027);r.o(n,"useParams")&&r.d(t,{useParams:function(){return n.useParams}}),r.o(n,"usePathname")&&r.d(t,{usePathname:function(){return n.usePathname}}),r.o(n,"useRouter")&&r.d(t,{useRouter:function(){return n.useRouter}}),r.o(n,"useSearchParams")&&r.d(t,{useSearchParams:function(){return n.useSearchParams}})}},e=>{e.O(0,[211,8682,7327,8060,2463,2196,7358],()=>e(e.s=9372)),_N_E=e.O()}]);
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[620],{4780:(e,t,r)=>{Promise.resolve().then(r.bind(r,75649))},9734:(e,t,r)=>{"use strict";r.d(t,{$:()=>o});var s=r(55539),a=r(89545),n=r(17154),i=r(44373);let l=(0,n.F)("group/button inline-flex shrink-0 items-center justify-center rounded-lg border border-transparent bg-clip-padding text-sm font-medium whitespace-nowrap transition-all outline-none select-none focus-visible:border-ring focus-visible:ring-3 focus-visible:ring-ring/50 active:not-aria-[haspopup]:translate-y-px disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-3 aria-invalid:ring-destructive/20 dark:aria-invalid:border-destructive/50 dark:aria-invalid:ring-destructive/40 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",{variants:{variant:{default:"bg-primary text-primary-foreground [a]:hover:bg-primary/80",outline:"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",secondary:"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",ghost:"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",destructive:"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",link:"text-primary underline-offset-4 hover:underline"},size:{default:"h-8 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",xs:"h-6 gap-1 rounded-[min(var(--radius-md),10px)] px-2 text-xs in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3",sm:"h-7 gap-1 rounded-[min(var(--radius-md),12px)] px-2.5 text-[0.8rem] in-data-[slot=button-group]:rounded-lg has-data-[icon=inline-end]:pr-1.5 has-data-[icon=inline-start]:pl-1.5 [&_svg:not([class*='size-'])]:size-3.5",lg:"h-9 gap-1.5 px-2.5 has-data-[icon=inline-end]:pr-2 has-data-[icon=inline-start]:pl-2",icon:"size-8","icon-xs":"size-6 rounded-[min(var(--radius-md),10px)] in-data-[slot=button-group]:rounded-lg [&_svg:not([class*='size-'])]:size-3","icon-sm":"size-7 rounded-[min(var(--radius-md),12px)] in-data-[slot=button-group]:rounded-lg","icon-lg":"size-9"}},defaultVariants:{variant:"default",size:"default"}});function o(e){let{className:t,variant:r="default",size:n="default",...o}=e;return(0,s.jsx)(a.$,{"data-slot":"button",className:(0,i.cn)(l({variant:r,size:n,className:t})),...o})}},14786:(e,t,r)=>{"use strict";r.d(t,{N:()=>l});var s=r(55539),a=r(97479),n=r(52982);let i=[{role:"owner",label:"오너",description:"모든 화면과 운영 화면을 봅니다."},{role:"contributor",label:"기여자",description:"베타 화면과 개발 도구를 함께 봅니다."},{role:"general",label:"일반",description:"사용할 준비가 된 화면을 봅니다."}];function l(){let e=(0,a.In)(),{showBeta:t,setShowBeta:r}=(0,n.hj)();return(0,s.jsxs)("section",{"aria-label":"화면 역할",className:"rounded-lg border border-border bg-card p-4",children:[(0,s.jsx)("h2",{className:"text-base font-semibold",children:"화면 역할"}),(0,s.jsx)("p",{className:"mt-1 text-sm text-muted-foreground",children:"이 기기에서 메뉴에 표시할 화면을 선택하세요. 주소를 직접 입력하면 다른 화면도 열 수 있습니다."}),(0,s.jsx)("div",{className:"mt-3 grid gap-2 sm:grid-cols-3",children:i.map(t=>{let{role:r,label:n,description:i}=t;return(0,s.jsxs)("button",{type:"button","aria-pressed":e===r,onClick:()=>(0,a.OG)(r),className:"rounded-lg border p-3 text-left transition-colors hover:border-primary focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring ".concat(e===r?"border-primary bg-primary/10":"border-border"),children:[(0,s.jsx)("span",{className:"block font-medium",children:n}),(0,s.jsx)("span",{className:"mt-1 block text-xs text-muted-foreground",children:i})]},r)})}),"general"===e&&(0,s.jsxs)("label",{className:"mt-4 flex items-center justify-between gap-3 border-t border-border pt-4 text-sm",children:[(0,s.jsx)("span",{children:"실험 기능 켜기"}),(0,s.jsx)("input",{type:"checkbox",role:"switch",checked:t,onChange:e=>r(e.currentTarget.checked),className:"h-5 w-5 accent-primary"})]})]})}},44373:(e,t,r)=>{"use strict";r.d(t,{cn:()=>n});var s=r(20852),a=r(30984);function n(){for(var e=arguments.length,t=Array(e),r=0;r<e;r++)t[r]=arguments[r];return(0,a.QP)((0,s.$)(t))}},52982:(e,t,r)=>{"use strict";r.d(t,{hj:()=>l});var s=r(46124);let a="elanous.pwa.showBeta",n="elanous:show-beta";function i(){try{return"1"===window.localStorage.getItem(a)}catch(e){return!1}}function l(){let[e,t]=(0,s.useState)(!1);return(0,s.useEffect)(()=>{t(i());let e=e=>{let r=e.detail;t("boolean"==typeof r?r:i())},r=e=>{(e.key===a||null===e.key)&&t(i())};return window.addEventListener(n,e),window.addEventListener("storage",r),()=>{window.removeEventListener(n,e),window.removeEventListener("storage",r)}},[]),{showBeta:e,setShowBeta:(0,s.useCallback)(e=>{t(e);try{e?window.localStorage.setItem(a,"1"):window.localStorage.removeItem(a)}catch(e){}window.dispatchEvent(new CustomEvent(n,{detail:e}))},[])}}},58603:(e,t,r)=>{"use strict";var s=r(99027);r.o(s,"useParams")&&r.d(t,{useParams:function(){return s.useParams}}),r.o(s,"usePathname")&&r.d(t,{usePathname:function(){return s.usePathname}}),r.o(s,"useRouter")&&r.d(t,{useRouter:function(){return s.useRouter}}),r.o(s,"useSearchParams")&&r.d(t,{useSearchParams:function(){return s.useSearchParams}})},75649:(e,t,r)=>{"use strict";r.r(t),r.d(t,{default:()=>w});var s=r(55539),a=r(58603),n=r(46124),i=r(96375),l=r(14786),o=r(98136),d=r(9734),c=r(30158),u=r(44373);function p(e){var t;let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},s=e.trim();if(0===s.length)return{ok:!1,message:"required"};let a=null!=(t=r.minLength)?t:8;return s.length<a?{ok:!1,message:"at least ".concat(a," characters")}:r.prefix&&r.prefix.length>0&&!s.startsWith(r.prefix)?{ok:!1,message:'must start with "'.concat(r.prefix,'"')}:{ok:!0}}function x(e){let{label:t,value:r,onChange:a,validation:i,disabled:l,placeholder:o,id:x}=e,[m,g]=(0,n.useState)(!1),v=null!=x?x:"api-key-".concat(t.toLowerCase().replace(/\s+/g,"-")),f=(0,n.useMemo)(()=>p(r,i),[r,i]),h=r.length>0&&!f.ok,b=(0,n.useCallback)(e=>{a(e.target.value.replace(/^\s+|\s+$/g,""))},[a]),w=(0,n.useCallback)(()=>g(e=>!e),[]);return(0,s.jsxs)("div",{className:"flex flex-col gap-1.5",children:[(0,s.jsx)("label",{htmlFor:v,className:"text-xs font-medium text-foreground/80",children:t}),(0,s.jsxs)("div",{className:"flex items-center gap-2",children:[(0,s.jsx)(c.p,{id:v,type:m?"text":"password",value:r,onChange:b,disabled:l,placeholder:null!=o?o:"Paste your ".concat(t),autoComplete:"off",autoCorrect:"off",spellCheck:!1,"aria-invalid":h,"aria-describedby":h?"".concat(v,"-error"):void 0,className:(0,u.cn)("font-mono text-xs",h&&"border-destructive"),"data-testid":"api-key-input"}),(0,s.jsx)(d.$,{type:"button",variant:"outline",size:"sm",onClick:w,disabled:l,"aria-label":m?"Hide API key":"Show API key","data-testid":"api-key-toggle",children:m?"Hide":"Show"})]}),h&&f.message?(0,s.jsx)("p",{id:"".concat(v,"-error"),className:"text-xs text-destructive","data-testid":"api-key-error",children:f.message}):null]})}var m=r(94306),g=r(18060),v=r(8101);let f={anthropic:"sk-ant-",gemini:"AIza",openai:"sk-"};function h(e){let t=f[e];return t?{prefix:t,minLength:16}:{minLength:16}}let b={timeout:"5분 안에 로그인이 끝나지 않았습니다. 다시 시도해 주세요.","authorization-denied":"로그인이 거절되었습니다. 다시 시도해 주세요.","browser-unavailable":"브라우저 로그인을 시작하지 못했습니다. 기기 코드로 해 보세요.","port-unavailable":"로그인 응답을 받을 자리(포트 1455)가 이미 쓰이고 있습니다. 기기 코드로 해 보세요.","token-exchange":"로그인은 됐지만 토큰을 받지 못했습니다. 다시 시도해 주세요.","device-code-failed":"기기 코드를 받지 못했습니다. 네트워크를 확인하고 다시 시도해 주세요.","device-poll-failed":"로그인 확인 중 연결이 끊겼습니다. 다시 시도해 주세요.","config-save-failed":"로그인은 됐지만 설정을 저장하지 못했습니다. 다시 시도해 주세요."};function w(){var e,t;let r=(0,a.useRouter)(),c=(0,m.Qj)(),[u,x]=(0,n.useState)(!1),[f,w]=(0,n.useState)({status:"idle"}),[y,k]=(0,n.useState)(()=>Date.now()),[C,S]=(0,n.useState)(0),[E,P]=(0,n.useState)(null),[z,L]=(0,n.useState)(""),[I,_]=(0,n.useState)({status:"idle"}),[$,A]=(0,n.useState)({state:"idle"}),[K,M]=(0,n.useState)("device"),[T,U]=(0,n.useState)(!1),[G,O]=(0,n.useState)(""),[F,Q]=(0,n.useState)(""),[R,q]=(0,n.useState)(!1),B=(0,n.useMemo)(()=>u?new g.ki((0,v.Fp)()):null,[u]);(0,n.useEffect)(()=>{if(!u)return;let e=["127.0.0.1","localhost"].includes(window.location.hostname);U(e),M(e?"browser":"device")},[u]),(0,n.useEffect)(()=>{if(!B)return;let e=!0,t=!1,s=async()=>{if(!t){t=!0;try{let t=await B.getCodexLogin();if(!e)return;A(t),"idle"!==t.state&&P(e=>null!=e?e:"openai-codex"),"ok"===t.state&&r.push("/setup/done"),"error"===t.state?O(t.error):O("")}catch(t){e&&O(t instanceof Error?t.message:String(t))}finally{t=!1}}};s();let a=window.setInterval(()=>{s()},2e3);return()=>{e=!1,window.clearInterval(a)}},[B,r]);let D=(0,n.useCallback)(async e=>{try{var t;if(!(null==(t=navigator.clipboard)?void 0:t.writeText))throw Error("clipboard unavailable");await navigator.clipboard.writeText(e),Q("코드를 복사했습니다.")}catch(e){Q("복사할 수 없습니다. 위 코드를 직접 선택해 복사해주세요.")}},[]),H=(0,n.useCallback)(async e=>{let t=null!=e?e:K;if(!B||R)return;e&&M(e),q(!0),O(""),Q("");let s="browser"===t?window.open("","_blank"):null;try{let e=await B.startCodexLogin(t);A(e),"pending"===e.state&&"browser"===e.mode&&e.authorizeUrl?s?s.location.href=e.authorizeUrl:O("새 탭이 차단되었습니다. 아래 로그인 링크를 직접 열어 계속해주세요."):null==s||s.close(),"ok"===e.state&&r.push("/setup/done"),"error"===e.state&&O(e.error)}catch(e){null==s||s.close(),O(e instanceof Error?e.message:String(e))}finally{q(!1)}},[B,R,K,r]);(0,n.useEffect)(()=>{x(!0)},[]);let W=(0,n.useCallback)(async()=>{if(c){S(0),k(Date.now()),w({status:"loading"});try{let e=await c.getLlmProviders();w({status:"ok",snapshot:e})}catch(e){w({status:"error",message:e.message})}}},[c]);(0,n.useEffect)(()=>{u&&c&&W()},[u,c,W]),(0,n.useEffect)(()=>{if("loading"!==f.status)return;let e=window.setInterval(()=>S(Math.floor((Date.now()-y)/1e3)),1e3);return()=>window.clearInterval(e)},[f.status,y]);let V="ok"===f.status?f.snapshot.providers:[],J=V.find(e=>"codex"===e.flow),X=(0,n.useMemo)(()=>{var e;return null!=(e=V.find(e=>e.provider===E))?e:null},[V,E]),Y=(0,n.useMemo)(()=>!!X&&"mutating"!==I.status&&("auto"===X.flow||"apiKey"===X.flow&&p(z,h(X.provider)).ok),[X,z,I.status]),Z=(0,n.useCallback)(async()=>{if(!c||!X)return;let e={provider:X.provider};"apiKey"===X.flow&&(e.apiKey=z),_({status:"mutating"});try{await c.setLlmProvider(e),r.push("/setup/done")}catch(e){_({status:"error",message:e instanceof Error?e.message:String(e)})}},[c,X,z,r]);return u&&c?"loading"===f.status||"idle"===f.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),(0,s.jsxs)("section",{role:"status","aria-live":"polite",className:"flex flex-col gap-4",children:[(0,s.jsxs)("p",{className:"text-sm text-muted-foreground",children:["공급자 확인 중 \xb7 ",C,"초"]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2","aria-hidden":"true",children:[0,1,2].map(e=>(0,s.jsxs)("div",{className:"h-24 animate-pulse rounded border border-border bg-card p-3",children:[(0,s.jsx)("div",{className:"mb-3 h-4 w-1/2 rounded bg-muted"}),(0,s.jsx)("div",{className:"h-3 w-3/4 rounded bg-muted"})]},e))})]})]}):"error"===f.status?(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),(0,s.jsxs)("div",{className:"flex flex-col gap-3 rounded border border-destructive/40 bg-destructive/5 p-4",children:[(0,s.jsxs)("p",{className:"text-sm text-destructive",children:["Provider 카탈로그 로드 실패: ",f.message]}),(0,s.jsx)(d.$,{variant:"outline",size:"sm",onClick:W,children:"다시 시도"})]})]}):(0,s.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,s.jsx)(l.N,{}),J?(0,s.jsxs)("div",{className:"flex flex-wrap items-center justify-between gap-3 rounded border border-primary/30 bg-primary/5 p-4",children:[(0,s.jsx)("p",{className:"text-sm font-medium",children:"구독이 있으면 추가 비용 없이"}),(0,s.jsxs)(d.$,{type:"button",variant:"outline",onClick:()=>{P(J.provider),L(""),_({status:"idle"}),window.requestAnimationFrame(()=>{var e;null==(e=document.getElementById("selected-provider"))||e.scrollIntoView({behavior:"smooth"})})},children:[J.label," 구독 로그인 보기"]})]}):null,(0,s.jsx)(j,{providers:V,selected:E,onSelect:e=>{P(e),L(""),_({status:"idle"})},activeProvider:f.snapshot.activeProvider}),X?"codex"===X.flow?(0,s.jsxs)("section",{id:"selected-provider",className:"flex flex-col gap-4 rounded border border-border bg-card p-4",children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:X.label}),"ok"===$.state?(0,s.jsx)("p",{role:"status",children:"연결됨"}):null,"pending"===$.state?"browser"===$.mode?(0,s.jsxs)("div",{role:"status",className:"flex flex-col gap-2",children:[(0,s.jsx)("p",{children:"로그인을 마치면 이 화면이 다음으로 넘어갑니다."}),$.authorizeUrl?(0,s.jsx)("a",{href:$.authorizeUrl,target:"_blank",rel:"noopener noreferrer",className:"underline",children:"ChatGPT 로그인 링크 열기"}):null,(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"새 탭이 열리지 않았다면 위 링크를 직접 여세요."}),(0,s.jsx)(d.$,{type:"button",variant:"outline",disabled:R,onClick:()=>{H("device")},children:"기기 코드로 바꾸기"})]}):(0,s.jsxs)("div",{role:"status",className:"flex flex-col gap-3",children:[(0,s.jsx)("p",{children:"아래 코드를 입력해 ChatGPT 에 로그인해주세요."}),(0,s.jsx)("strong",{className:"text-3xl tracking-widest","data-testid":"codex-user-code",children:null!=(e=$.userCode)?e:"코드 준비 중…"}),$.userCode?(0,s.jsx)(d.$,{type:"button",variant:"outline",onClick:()=>{D($.userCode)},children:"복사"}):null,F?(0,s.jsx)("p",{role:"status","aria-live":"polite",children:F}):null,$.verificationUrl?(0,s.jsx)("a",{href:$.verificationUrl,target:"_blank",rel:"noopener noreferrer",className:"underline",children:$.verificationUrl}):null]}):null,G?(0,s.jsx)("p",{role:"alert",className:"text-sm text-destructive",children:null!=(t=b[G])?t:G}):null,"pending"!==$.state&&"ok"!==$.state?(0,s.jsxs)("div",{className:"flex flex-wrap gap-2",children:[(0,s.jsx)(d.$,{type:"button",disabled:R,onClick:()=>{H()},children:"error"===$.state?"다시 시도":"ChatGPT 로 로그인"}),T&&("error"===$.state||G)?(0,s.jsxs)(d.$,{type:"button",variant:"outline",onClick:()=>{M("browser"===K?"device":"browser"),O("")},children:["다른 방식으로 (","browser"===K?"기기 코드":"브라우저",")"]}):null]}):null]}):(0,s.jsx)(N,{provider:X,apiKey:z,onApiKeyChange:L,submitState:I,canSubmit:Y,onSubmit:Z}):(0,s.jsx)("p",{className:"text-sm text-muted-foreground",children:"위에서 provider 를 선택해주세요."}),(0,s.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,s.jsx)("summary",{className:"cursor-pointer p-4 text-sm font-medium focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",children:"고급 \xb7 자식 LLM 선호"}),(0,s.jsx)("div",{className:"p-4 pt-0",children:(0,s.jsx)(i.lN,{})})]}),(0,s.jsx)(o.Q,{})]}):(0,s.jsx)(l.N,{})}function j(e){let{providers:t,selected:r,onSelect:a,activeProvider:n}=e,i=t.filter(e=>e.recommended),l=t.filter(e=>!e.recommended);return(0,s.jsxs)("div",{className:"flex flex-col gap-4",children:[(0,s.jsxs)("section",{className:"flex flex-col gap-2",children:[(0,s.jsx)("h2",{className:"text-xs font-semibold uppercase tracking-wider text-muted-foreground",children:"주요 provider"}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 sm:grid-cols-2",children:i.map(e=>(0,s.jsx)(y,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:a},e.provider))})]}),l.length>0?(0,s.jsxs)("details",{className:"rounded border border-border bg-card",children:[(0,s.jsxs)("summary",{className:"cursor-pointer px-3 py-2 text-xs font-medium uppercase tracking-wider text-muted-foreground",children:["기타 provider (",l.length,")"]}),(0,s.jsx)("div",{className:"grid grid-cols-1 gap-2 border-t border-border p-2 sm:grid-cols-2",children:l.map(e=>(0,s.jsx)(y,{provider:e,selected:r===e.provider,active:n===e.provider,onSelect:a},e.provider))})]}):null]})}function y(e){let{provider:t,selected:r,active:a,onSelect:n}=e;return(0,s.jsxs)("button",{type:"button",onClick:()=>n(t.provider),"data-testid":"provider-card-".concat(t.provider),"aria-pressed":r,className:(0,u.cn)("flex flex-col items-start gap-1 rounded border bg-card p-3 text-left transition-colors","hover:border-primary/40 focus-visible:border-primary focus-visible:outline-none",r?"border-primary bg-primary/5":"border-border"),children:[(0,s.jsxs)("div",{className:"flex w-full items-center justify-between gap-2",children:[(0,s.jsx)("span",{className:"text-sm font-medium",children:t.label}),(0,s.jsxs)("div",{className:"flex gap-1",children:[a?(0,s.jsx)("span",{className:"rounded bg-primary/10 px-1.5 py-0.5 text-[10px] font-medium text-primary",children:"현재"}):null,t.hasSavedKey?(0,s.jsx)("span",{className:"rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium text-muted-foreground",children:"key 저장됨"}):null]})]}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:t.description})]})}function N(e){let{provider:t,apiKey:r,onApiKeyChange:a,submitState:n,canSubmit:i,onSubmit:l}=e,o="apiKey"===t.flow,c="auto"===t.flow,u="local"===t.flow;return(0,s.jsxs)("section",{id:"selected-provider",className:"flex flex-col gap-4 rounded border border-border bg-card p-4",children:[(0,s.jsxs)("header",{className:"flex flex-col gap-1",children:[(0,s.jsx)("h3",{className:"text-base font-semibold",children:t.label}),(0,s.jsx)("p",{className:"text-xs text-muted-foreground",children:t.description})]}),o?(0,s.jsx)(x,{label:t.apiKeyLabel,value:r,onChange:a,validation:h(t.provider),disabled:"mutating"===n.status}):null,c?(0,s.jsx)("p",{className:"rounded bg-muted/50 px-3 py-2 text-xs text-muted-foreground",children:"Auto 모드는 매 호출마다 env 에서 첫 번째 사용 가능한 provider 를 선택합니다. 사용자가 export 한 env 변수에 의존하니, 실패 시 provider 를 명시 선택해주세요."}):null,u?(0,s.jsxs)("p",{className:"rounded bg-yellow-500/10 px-3 py-2 text-xs text-yellow-700 dark:text-yellow-400",children:["Local runtime probe 흐름은 PWA 에서 직접 처리할 수 없어요. 터미널에서"," ",(0,s.jsx)("span",{className:"font-mono",children:"elanous setup llm"})," 을 실행해주세요."]}):null,"error"===n.status?(0,s.jsx)("p",{className:"rounded border border-destructive/40 bg-destructive/5 px-3 py-2 text-xs text-destructive",children:n.message}):null,(0,s.jsx)("div",{className:"flex justify-end",children:(0,s.jsx)(d.$,{type:"button",onClick:l,disabled:!i,"data-testid":"setup-submit",children:"mutating"===n.status?"저장중…":"저장 & chat 으로"})})]})}},94306:(e,t,r)=>{"use strict";r.d(t,{M1:()=>d,Qj:()=>c,tI:()=>o});var s=r(55539),a=r(46124),n=r(76642),i=r(50363);let l=(0,a.createContext)(null);function o(e){let{client:t,queryClient:r,defaultStaleTimeMs:o,children:d}=e,c=(0,a.useMemo)(()=>null!=r?r:new n.E({defaultOptions:{queries:{staleTime:null!=o?o:2e3,refetchOnWindowFocus:!1}}}),[r,o]);return(0,s.jsx)(l.Provider,{value:t,children:(0,s.jsx)(i.Ht,{client:c,children:d})})}function d(){let e=(0,a.useContext)(l);if(!e)throw Error("useNexusClient must be used within <NexusProvider>");return e}function c(){return(0,a.useContext)(l)}},97479:(e,t,r)=>{"use strict";r.d(t,{GC:()=>a,In:()=>d,OG:()=>l});var s=r(46124);let a="elanous.pwa.role",n="elanous:pwa-role";function i(){try{let e=window.localStorage.getItem(a);if("owner"===e||"contributor"===e||"general"===e)return e}catch(e){}return"general"}function l(e){try{window.localStorage.setItem(a,e)}catch(e){}"function"==typeof window.dispatchEvent&&window.dispatchEvent(new Event(n))}function o(e){if("function"!=typeof window.addEventListener)return()=>{};window.addEventListener(n,e);let t=t=>{(t.key===a||null===t.key)&&e()};return window.addEventListener("storage",t),()=>{window.removeEventListener(n,e),window.removeEventListener("storage",t)}}function d(){return(0,s.useSyncExternalStore)(o,i,()=>"general")}}},e=>{e.O(0,[211,3324,8682,8085,8060,9247,3194,2463,2196,7358],()=>e(e.s=4780)),_N_E=e.O()}]);
|