@apteva/apteva-darwin-x64 0.4.41 → 0.4.51
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/apteva +0 -0
- package/dist/ActivityPage.9v5ha2p7.js +3 -0
- package/dist/{ActivityPage.7907h64p.js.map → ActivityPage.9v5ha2p7.js.map} +3 -3
- package/dist/ApiDocsPage.qsehxvkb.js +4 -0
- package/dist/ApiDocsPage.qsehxvkb.js.map +10 -0
- package/dist/App.168av39e.js +221 -0
- package/dist/{App.qcknavjz.js.map → App.168av39e.js.map} +15 -15
- package/dist/App.2j20h2gt.js +8 -0
- package/dist/App.2j20h2gt.js.map +12 -0
- package/dist/App.7gj4jht5.js +53 -0
- package/dist/{App.apjrmctz.js.map → App.7gj4jht5.js.map} +50 -52
- package/dist/App.aexwv4rk.js +4 -0
- package/dist/App.aexwv4rk.js.map +10 -0
- package/dist/App.anvw0hjc.js +61 -0
- package/dist/App.anvw0hjc.js.map +13 -0
- package/dist/App.cjcyr5aj.js +4 -0
- package/dist/App.cjcyr5aj.js.map +10 -0
- package/dist/App.dmvykj97.js +4 -0
- package/dist/App.dmvykj97.js.map +10 -0
- package/dist/App.e2kkda2a.js +4 -0
- package/dist/App.e2kkda2a.js.map +10 -0
- package/dist/App.j4ec9k18.js +13 -0
- package/dist/App.j4ec9k18.js.map +10 -0
- package/dist/{App.7fb3e7mp.js → App.jdkx6eqd.js} +1 -1
- package/dist/App.kz3qyyre.js +4 -0
- package/dist/{App.myxqcj9x.js.map → App.kz3qyyre.js.map} +3 -3
- package/dist/App.sd685nt9.js +4 -0
- package/dist/App.sd685nt9.js.map +10 -0
- package/dist/App.shfd8tp9.js +20 -0
- package/dist/{App.3qw8nben.js.map → App.shfd8tp9.js.map} +6 -4
- package/dist/App.wghtdzsk.js +1 -0
- package/dist/App.x6x8s16g.js +4 -0
- package/dist/App.x6x8s16g.js.map +14 -0
- package/dist/App.y2vn8m06.js +4 -0
- package/dist/App.y2vn8m06.js.map +10 -0
- package/dist/ConnectionsPage.1dyyfqbk.js +3 -0
- package/dist/McpPage.xvr8hk05.js +3 -0
- package/dist/SettingsPage.5jmnefwe.js +3 -0
- package/dist/SkillsPage.jw7carjq.js +3 -0
- package/dist/TasksPage.r8txe0e9.js +3 -0
- package/dist/TasksPage.r8txe0e9.js.map +9 -0
- package/dist/TelemetryPage.pcafk41x.js +3 -0
- package/dist/TelemetryPage.pcafk41x.js.map +9 -0
- package/dist/TestsPage.pkymr7yt.js +3 -0
- package/dist/ThreadsPage.49tgq4fq.js +3 -0
- package/dist/apteva-kit.css +1 -1
- package/dist/index.html +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/ActivityPage.7907h64p.js +0 -3
- package/dist/ApiDocsPage.k3jjenpq.js +0 -4
- package/dist/ApiDocsPage.k3jjenpq.js.map +0 -10
- package/dist/App.01nq20st.js +0 -4
- package/dist/App.01nq20st.js.map +0 -10
- package/dist/App.1maqvamf.js +0 -4
- package/dist/App.1maqvamf.js.map +0 -14
- package/dist/App.2yjrh32f.js +0 -4
- package/dist/App.2yjrh32f.js.map +0 -10
- package/dist/App.3qw8nben.js +0 -20
- package/dist/App.7sy3wq8c.js +0 -4
- package/dist/App.7sy3wq8c.js.map +0 -10
- package/dist/App.apjrmctz.js +0 -57
- package/dist/App.av6t2yhe.js +0 -4
- package/dist/App.av6t2yhe.js.map +0 -10
- package/dist/App.jqj5a094.js +0 -46
- package/dist/App.jqj5a094.js.map +0 -13
- package/dist/App.mc7xf85h.js +0 -4
- package/dist/App.mc7xf85h.js.map +0 -10
- package/dist/App.myxqcj9x.js +0 -4
- package/dist/App.nm91r1mp.js +0 -13
- package/dist/App.nm91r1mp.js.map +0 -10
- package/dist/App.p02f4ret.js +0 -1
- package/dist/App.qcknavjz.js +0 -221
- package/dist/App.vc7vfhg4.js +0 -4
- package/dist/App.vc7vfhg4.js.map +0 -10
- package/dist/App.z4s9zkw5.js +0 -4
- package/dist/App.z4s9zkw5.js.map +0 -10
- package/dist/ConnectionsPage.z1pw5xe2.js +0 -3
- package/dist/McpPage.8vc97z0b.js +0 -3
- package/dist/SettingsPage.p61bz8kd.js +0 -3
- package/dist/SkillsPage.r9x43g3g.js +0 -3
- package/dist/TasksPage.1e0zkye4.js +0 -3
- package/dist/TasksPage.1e0zkye4.js.map +0 -9
- package/dist/TelemetryPage.p9vbe4gf.js +0 -3
- package/dist/TelemetryPage.p9vbe4gf.js.map +0 -9
- package/dist/TestsPage.d4xy504e.js +0 -3
- package/dist/ThreadsPage.m016am3x.js +0 -3
- /package/dist/{App.7fb3e7mp.js.map → App.jdkx6eqd.js.map} +0 -0
- /package/dist/{ConnectionsPage.z1pw5xe2.js.map → ConnectionsPage.1dyyfqbk.js.map} +0 -0
- /package/dist/{McpPage.8vc97z0b.js.map → McpPage.xvr8hk05.js.map} +0 -0
- /package/dist/{SettingsPage.p61bz8kd.js.map → SettingsPage.5jmnefwe.js.map} +0 -0
- /package/dist/{SkillsPage.r9x43g3g.js.map → SkillsPage.jw7carjq.js.map} +0 -0
- /package/dist/{TestsPage.d4xy504e.js.map → TestsPage.pkymr7yt.js.map} +0 -0
- /package/dist/{ThreadsPage.m016am3x.js.map → ThreadsPage.49tgq4fq.js.map} +0 -0
package/apteva
CHANGED
|
Binary file
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{U as A}from"./App.sd685nt9.js";import{$ as V,X as C,aa as L,ca as P,ja as S,ma as b}from"./App.shfd8tp9.js";var W=C(V(),1);var q=C(L(),1),x=new Set(["thread_activity","agent_started","agent_stopped","agent_error","task_created","task_updated","task_deleted","task_executed","llm_request","tool_invocation","mcp_request","mcp_tool_execution"]),j={CHAT:"bg-green-400",LLM:"bg-purple-400",TOOL:"bg-blue-400",TASK:"bg-yellow-400",MEMORY:"bg-cyan-400",MCP:"bg-orange-400",SYSTEM:"bg-gray-400",ERROR:"bg-red-400"};function m($,G){let U=$.data||{};switch($.type){case"thread_activity":return U.activity||"Working...";case"agent_started":return"Agent started";case"agent_stopped":return U.reason?`Agent stopped (${U.reason})`:"Agent stopped";case"agent_error":return $.error||"Agent error";case"llm_request":return"Thinking...";case"tool_invocation":{let Q=U.tool_name||"";if(!Q)return"Using tools";return`Tool: ${Q.replace(/[-_]/g," ").replace(/\b\w/g,(Z)=>Z.toUpperCase())}`}case"task_created":return U.title?`Task created: ${U.title}`:"Task created";case"task_updated":{let{status:Q,title:X}=U,Z=Q?Q.charAt(0).toUpperCase()+Q.slice(1):null;if(X&&Z)return`Task ${Z}: ${X}`;if(Z)return`Task ${Z}`;if(X)return`Task updated: ${X}`;return"Task updated"}case"task_deleted":return"Task deleted";case"task_executed":{let Q=U.title;return Q?`Task started: ${Q}`:"Task started"}case"memory_stored":return"Memory stored";case"memory_retrieved":return"Memory retrieved";case"mcp_request":return U.server?`MCP request to ${U.server}`:"MCP request";case"mcp_tool_execution":{let Q=U.tool_name||U.tool||"";if(!Q)return"MCP tool call";return`MCP: ${(Q.includes("__")?Q.split("__").slice(1).join("__"):Q).replace(/[-_]/g," ").replace(/\b\w/g,(H)=>H.toUpperCase())}`}default:return $.type.replace(/_/g," ")}}function l({agents:$,loading:G,onNavigate:U}){let{authFetch:Q}=S(),{currentProjectId:X}=b(),{events:Z,statusChangeCounter:H}=P(),[_,p]=W.useState([]),[R,I]=W.useState(""),[O]=W.useState(()=>new Set),y=W.useRef(!1),Y=W.useMemo(()=>{if(X===null)return $;if(X==="unassigned")return $.filter((z)=>!z.projectId);return $.filter((z)=>z.projectId===X)},[$,X]),N=W.useMemo(()=>new Set(Y.map((z)=>z.id)),[Y]),h=W.useMemo(()=>{let z=new Map;return Y.forEach((J)=>z.set(J.id,J.name)),z},[Y]),w=W.useCallback(async()=>{let z=X?`&project_id=${encodeURIComponent(X)}`:"";try{let J=await Q(`/api/telemetry/events?limit=200${z}`);if(J.ok){let B=await J.json();p(B.events||[])}}catch{}},[Q,X]);W.useEffect(()=>{w()},[w,H]),W.useEffect(()=>{if(_.length>0&&!y.current){for(let z of _)O.add(z.id);for(let z of Z)O.add(z.id);y.current=!0}},[_,Z,O]);let M=W.useMemo(()=>{let z=new Set,J=[],B=(K)=>{if(!x.has(K.type)||!N.has(K.agent_id)||K.data?.parent_id)return!1;if(K.type==="mcp_tool_execution"&&!K.duration_ms)return!1;return!0};for(let K of Z)if(!z.has(K.id)&&B(K))J.push(K),z.add(K.id);for(let K of _)if(!z.has(K.id)&&B(K))J.push(K),z.add(K.id);let k=J;if(R)k=k.filter((K)=>K.agent_id===R);return k.sort((K,F)=>new Date(F.timestamp).getTime()-new Date(K.timestamp).getTime()),k.slice(0,200)},[Z,_,N,R]),f=W.useMemo(()=>{let z=[],J="",B=new Date().toDateString(),k=new Date(Date.now()-86400000).toDateString();for(let K of M){let F=new Date(K.timestamp).toDateString(),T=F===B?"Today":F===k?"Yesterday":F;if(T!==J)J=T,z.push({label:T,events:[]});z[z.length-1].events.push(K)}return z},[M]);if(G)return q.jsxDEV("div",{className:"flex-1 flex items-center justify-center text-[var(--color-text-muted)]",children:"Loading..."},void 0,!1,void 0,this);let D=Y.filter((z)=>z.status==="running").length;return q.jsxDEV("div",{className:"flex-1 flex flex-col overflow-hidden",children:[q.jsxDEV("div",{className:"px-6 pt-6 pb-4 shrink-0",children:q.jsxDEV("div",{className:"flex items-center justify-between gap-4",children:[q.jsxDEV("div",{children:[q.jsxDEV("h1",{className:"text-xl font-semibold",children:"Activity"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm text-[var(--color-text-muted)] mt-0.5",children:[D," of ",Y.length," agents running"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("div",{className:"w-48",children:q.jsxDEV(A,{value:R,onChange:I,placeholder:"All agents",options:[{value:"",label:"All agents"},...Y.map((z)=>({value:z.id,label:z.name}))]},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex-1 overflow-auto px-6 pb-6",children:M.length===0?q.jsxDEV("div",{className:"flex flex-col items-center justify-center py-20 text-[var(--color-text-faint)]",children:[q.jsxDEV("p",{className:"text-lg mb-2",children:"No activity yet"},void 0,!1,void 0,this),q.jsxDEV("p",{className:"text-sm",children:"Agent activity will appear here in real-time."},void 0,!1,void 0,this)]},void 0,!0,void 0,this):q.jsxDEV("div",{className:"max-w-2xl",children:f.map((z)=>q.jsxDEV("div",{children:[q.jsxDEV("div",{className:"sticky top-0 z-10 bg-[var(--color-bg)] backdrop-blur-sm py-2 mb-1",children:q.jsxDEV("span",{className:"text-xs font-semibold text-[var(--color-text-muted)] uppercase tracking-wider",children:z.label},void 0,!1,void 0,this)},void 0,!1,void 0,this),q.jsxDEV("div",{className:"relative ml-3 border-l border-[var(--color-border)]",children:z.events.map((J)=>{let B=!O.has(J.id);if(B)O.add(J.id);let k=h.get(J.agent_id)||J.agent_id.slice(0,8),K=J.level==="error"?"bg-red-400":j[J.category]||"bg-[var(--color-text-faint)]";return q.jsxDEV("div",{className:`relative pl-6 pr-3 py-2.5 hover:bg-[var(--color-surface-hover)] transition-colors ${B?"animate-slideIn":""}`,children:[q.jsxDEV("span",{className:`absolute left-[-4.5px] top-[14px] w-[9px] h-[9px] rounded-full ${K} ring-2 ring-[#0a0a0a]`},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex items-start justify-between gap-3",children:[q.jsxDEV("div",{className:"flex-1 min-w-0",children:[q.jsxDEV("p",{className:`text-sm ${J.level==="error"?"text-red-400":""}`,children:m(J,k)},void 0,!1,void 0,this),q.jsxDEV("div",{className:"flex items-center gap-2 text-[11px] text-[var(--color-text-faint)] mt-0.5",children:[q.jsxDEV("span",{className:"text-[var(--color-text-secondary)] font-medium",children:k},void 0,!1,void 0,this),q.jsxDEV("span",{className:"text-[var(--color-border-light)]",children:"·"},void 0,!1,void 0,this),q.jsxDEV("span",{className:"text-[var(--color-text-faint)]",children:J.category},void 0,!1,void 0,this),J.duration_ms!=null&&J.duration_ms>0&&q.jsxDEV(q.Fragment,{children:[q.jsxDEV("span",{className:"text-[var(--color-border-light)]",children:"·"},void 0,!1,void 0,this),q.jsxDEV("span",{children:J.duration_ms<1000?`${J.duration_ms}ms`:`${(J.duration_ms/1000).toFixed(1)}s`},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),q.jsxDEV("span",{className:"text-[11px] text-[var(--color-text-faint)] shrink-0 pt-0.5",children:g(J.timestamp)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},J.id,!0,void 0,this)})},void 0,!1,void 0,this)]},z.label,!0,void 0,this))},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)}function g($){let G=Math.floor((Date.now()-new Date($).getTime())/1000);if(G<5)return"just now";if(G<60)return`${G}s ago`;let U=Math.floor(G/60);if(U<60)return`${U}m ago`;let Q=Math.floor(U/60);if(Q<24)return`${Q}h ago`;return`${Math.floor(Q/24)}d ago`}export{l as ActivityPage};
|
|
2
|
+
|
|
3
|
+
//# debugId=D584AFE9ED97069764756E2164756E21
|
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/web/components/activity/ActivityPage.tsx"],
|
|
4
4
|
"sourcesContent": [
|
|
5
|
-
"import React, { useState, useMemo, useEffect, useCallback, useRef } from \"react\";\nimport { useAuth, useProjects, useTelemetryContext } from \"../../context\";\nimport type { TelemetryEvent } from \"../../context\";\nimport type { Agent, Route } from \"../../types\";\nimport { Select } from \"../common/Select\";\n\ninterface ActivityPageProps {\n agents: Agent[];\n loading: boolean;\n onNavigate?: (route: Route) => void;\n}\n\n// Event types we show in the timeline (skip noisy internal ones)\nconst VISIBLE_TYPES = new Set([\n \"thread_activity\",\n \"agent_started\",\n \"agent_stopped\",\n \"agent_error\",\n \"task_created\",\n \"task_updated\",\n \"task_deleted\",\n \"task_executed\",\n \"llm_request\",\n \"tool_invocation\",\n \"mcp_request\",\n \"mcp_tool_execution\",\n]);\n\n// Category colors for the timeline dot\nconst CATEGORY_COLORS: Record<string, string> = {\n CHAT: \"bg-green-400\",\n LLM: \"bg-purple-400\",\n TOOL: \"bg-blue-400\",\n TASK: \"bg-yellow-400\",\n MEMORY: \"bg-cyan-400\",\n MCP: \"bg-orange-400\",\n SYSTEM: \"bg-gray-400\",\n ERROR: \"bg-red-400\",\n};\n\nfunction describeEvent(evt: TelemetryEvent, agentName: string): string {\n const data = evt.data || {};\n switch (evt.type) {\n case \"thread_activity\":\n return (data.activity as string) || \"Working...\";\n case \"agent_started\":\n return \"Agent started\";\n case \"agent_stopped\":\n return data.reason ? `Agent stopped (${data.reason})` : \"Agent stopped\";\n case \"agent_error\":\n return evt.error || \"Agent error\";\n case \"llm_request\":\n return \"Thinking...\";\n case \"tool_invocation\": {\n const toolRaw = (data.tool_name || \"\") as string;\n if (!toolRaw) return \"Using tools\";\n const toolFormatted = toolRaw.replace(/[-_]/g, \" \").replace(/\\b\\w/g, c => c.toUpperCase());\n return `Tool: ${toolFormatted}`;\n }\n case \"task_created\":\n return data.title ? `Task created: ${data.title}` : \"Task created\";\n case \"task_updated\": {\n const status = data.status as string | undefined;\n const title = data.title as string | undefined;\n const statusLabel = status ? status.charAt(0).toUpperCase() + status.slice(1) : null;\n if (title && statusLabel) return `Task ${statusLabel}: ${title}`;\n if (statusLabel) return `Task ${statusLabel}`;\n if (title) return `Task updated: ${title}`;\n return \"Task updated\";\n }\n case \"task_deleted\":\n return \"Task deleted\";\n case \"task_executed\": {\n const title = data.title as string | undefined;\n return title ? `Task started: ${title}` : \"Task started\";\n }\n case \"memory_stored\":\n return \"Memory stored\";\n case \"memory_retrieved\":\n return \"Memory retrieved\";\n case \"mcp_request\":\n return data.server ? `MCP request to ${data.server}` : \"MCP request\";\n case \"mcp_tool_execution\": {\n const rawName = (data.tool_name || data.tool || \"\") as string;\n if (!rawName) return \"MCP tool call\";\n // \"Server__tool-name-here\" -> take part after __, format dashes/underscores to spaces, title case\n const toolPart = rawName.includes(\"__\") ? rawName.split(\"__\").slice(1).join(\"__\") : rawName;\n const formatted = toolPart.replace(/[-_]/g, \" \").replace(/\\b\\w/g, c => c.toUpperCase());\n return `MCP: ${formatted}`;\n }\n default:\n return evt.type.replace(/_/g, \" \");\n }\n}\n\nexport function ActivityPage({ agents, loading, onNavigate }: ActivityPageProps) {\n const { authFetch } = useAuth();\n const { currentProjectId } = useProjects();\n const { events: realtimeEvents, statusChangeCounter } = useTelemetryContext();\n const [historicalEvents, setHistoricalEvents] = useState<TelemetryEvent[]>([]);\n const [filterAgentId, setFilterAgentId] = useState<string>(\"\");\n const [seenIds] = useState(() => new Set<string>());\n const hasLoadedHistory = useRef(false);\n\n const filteredAgents = useMemo(() => {\n if (currentProjectId === null) return agents;\n if (currentProjectId === \"unassigned\") return agents.filter(a => !a.projectId);\n return agents.filter(a => a.projectId === currentProjectId);\n }, [agents, currentProjectId]);\n\n const agentIds = useMemo(() => new Set(filteredAgents.map(a => a.id)), [filteredAgents]);\n const agentNameMap = useMemo(() => {\n const map = new Map<string, string>();\n filteredAgents.forEach(a => map.set(a.id, a.name));\n return map;\n }, [filteredAgents]);\n\n // Fetch historical events\n const fetchHistory = useCallback(async () => {\n const projectParam = currentProjectId ? `&project_id=${encodeURIComponent(currentProjectId)}` : \"\";\n try {\n const res = await authFetch(`/api/telemetry/events?limit=200${projectParam}`);\n if (res.ok) {\n const data = await res.json();\n setHistoricalEvents(data.events || []);\n }\n } catch {}\n }, [authFetch, currentProjectId]);\n\n useEffect(() => {\n fetchHistory();\n }, [fetchHistory, statusChangeCounter]);\n\n // Mark historical events as seen so they don't animate\n useEffect(() => {\n if (historicalEvents.length > 0 && !hasLoadedHistory.current) {\n for (const evt of historicalEvents) {\n seenIds.add(evt.id);\n }\n // Also mark any realtime events already present at mount\n for (const evt of realtimeEvents) {\n seenIds.add(evt.id);\n }\n hasLoadedHistory.current = true;\n }\n }, [historicalEvents, realtimeEvents, seenIds]);\n\n // Merge realtime + historical, filter, sort\n const timeline = useMemo(() => {\n const seen = new Set<string>();\n const merged: TelemetryEvent[] = [];\n\n const shouldShow = (evt: TelemetryEvent) => {\n if (!VISIBLE_TYPES.has(evt.type) || !agentIds.has(evt.agent_id) || evt.data?.parent_id) return false;\n // MCP tool: only show completed calls (with duration), skip the start event\n if (evt.type === \"mcp_tool_execution\" && !evt.duration_ms) return false;\n return true;\n };\n\n for (const evt of realtimeEvents) {\n if (!seen.has(evt.id) && shouldShow(evt)) {\n merged.push(evt);\n seen.add(evt.id);\n }\n }\n for (const evt of historicalEvents) {\n if (!seen.has(evt.id) && shouldShow(evt)) {\n merged.push(evt);\n seen.add(evt.id);\n }\n }\n\n let filtered = merged;\n if (filterAgentId) {\n filtered = filtered.filter(e => e.agent_id === filterAgentId);\n }\n\n filtered.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());\n return filtered.slice(0, 200);\n }, [realtimeEvents, historicalEvents, agentIds, filterAgentId]);\n\n // Group by date for section headers\n const groupedTimeline = useMemo(() => {\n const groups: { label: string; events: TelemetryEvent[] }[] = [];\n let currentLabel = \"\";\n const today = new Date().toDateString();\n const yesterday = new Date(Date.now() - 86400000).toDateString();\n\n for (const evt of timeline) {\n const dateStr = new Date(evt.timestamp).toDateString();\n const label = dateStr === today ? \"Today\" : dateStr === yesterday ? \"Yesterday\" : dateStr;\n if (label !== currentLabel) {\n currentLabel = label;\n groups.push({ label, events: [] });\n }\n groups[groups.length - 1].events.push(evt);\n }\n return groups;\n }, [timeline]);\n\n if (loading) {\n return <div className=\"flex-1 flex items-center justify-center text-[#666]\">Loading...</div>;\n }\n\n const runningCount = filteredAgents.filter(a => a.status === \"running\").length;\n\n return (\n <div className=\"flex-1 flex flex-col overflow-hidden\">\n {/* Header */}\n <div className=\"px-6 pt-6 pb-4 shrink-0\">\n <div className=\"flex items-center justify-between gap-4\">\n <div>\n <h1 className=\"text-xl font-semibold\">Activity</h1>\n <p className=\"text-sm text-[#666] mt-0.5\">\n {runningCount} of {filteredAgents.length} agents running\n </p>\n </div>\n <div className=\"w-48\">\n <Select\n value={filterAgentId}\n onChange={setFilterAgentId}\n placeholder=\"All agents\"\n options={[\n { value: \"\", label: \"All agents\" },\n ...filteredAgents.map(a => ({ value: a.id, label: a.name })),\n ]}\n />\n </div>\n </div>\n </div>\n\n {/* Timeline */}\n <div className=\"flex-1 overflow-auto px-6 pb-6\">\n {timeline.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-20 text-[#555]\">\n <p className=\"text-lg mb-2\">No activity yet</p>\n <p className=\"text-sm\">Agent activity will appear here in real-time.</p>\n </div>\n ) : (\n <div className=\"max-w-2xl\">\n {groupedTimeline.map(group => (\n <div key={group.label}>\n {/* Date header */}\n <div className=\"sticky top-0 z-10 bg-[#0a0a0a]/95 backdrop-blur-sm py-2 mb-1\">\n <span className=\"text-xs font-semibold text-[#666] uppercase tracking-wider\">\n {group.label}\n </span>\n </div>\n\n {/* Events */}\n <div className=\"relative ml-3 border-l border-[#1a1a1a]\">\n {group.events.map(evt => {\n const isNew = !seenIds.has(evt.id);\n if (isNew) seenIds.add(evt.id); // mark seen after first render\n const agentName = agentNameMap.get(evt.agent_id) || evt.agent_id.slice(0, 8);\n const dotColor = evt.level === \"error\"\n ? \"bg-red-400\"\n : CATEGORY_COLORS[evt.category] || \"bg-[#555]\";\n\n return (\n <div\n key={evt.id}\n className={`relative pl-6 pr-3 py-2.5 hover:bg-[#111]/50 transition-colors ${\n isNew ? \"animate-slideIn\" : \"\"\n }`}\n >\n {/* Timeline dot */}\n <span className={`absolute left-[-4.5px] top-[14px] w-[9px] h-[9px] rounded-full ${dotColor} ring-2 ring-[#0a0a0a]`} />\n\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex-1 min-w-0\">\n <p className={`text-sm ${evt.level === \"error\" ? \"text-red-400\" : \"\"}`}>\n {describeEvent(evt, agentName)}\n </p>\n <div className=\"flex items-center gap-2 text-[11px] text-[#555] mt-0.5\">\n <span className=\"text-[#888] font-medium\">{agentName}</span>\n <span className=\"text-[#333]\">·</span>\n <span className=\"text-[#555]\">{evt.category}</span>\n {evt.duration_ms != null && evt.duration_ms > 0 && (\n <>\n <span className=\"text-[#333]\">·</span>\n <span>{evt.duration_ms < 1000 ? `${evt.duration_ms}ms` : `${(evt.duration_ms / 1000).toFixed(1)}s`}</span>\n </>\n )}\n </div>\n </div>\n <span className=\"text-[11px] text-[#555] shrink-0 pt-0.5\">\n {timeAgo(evt.timestamp)}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction timeAgo(timestamp: string): string {\n const seconds = Math.floor((Date.now() - new Date(timestamp).getTime()) / 1000);\n if (seconds < 5) return \"just now\";\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n"
|
|
5
|
+
"import React, { useState, useMemo, useEffect, useCallback, useRef } from \"react\";\nimport { useAuth, useProjects, useTelemetryContext } from \"../../context\";\nimport type { TelemetryEvent } from \"../../context\";\nimport type { Agent, Route } from \"../../types\";\nimport { Select } from \"../common/Select\";\n\ninterface ActivityPageProps {\n agents: Agent[];\n loading: boolean;\n onNavigate?: (route: Route) => void;\n}\n\n// Event types we show in the timeline (skip noisy internal ones)\nconst VISIBLE_TYPES = new Set([\n \"thread_activity\",\n \"agent_started\",\n \"agent_stopped\",\n \"agent_error\",\n \"task_created\",\n \"task_updated\",\n \"task_deleted\",\n \"task_executed\",\n \"llm_request\",\n \"tool_invocation\",\n \"mcp_request\",\n \"mcp_tool_execution\",\n]);\n\n// Category colors for the timeline dot\nconst CATEGORY_COLORS: Record<string, string> = {\n CHAT: \"bg-green-400\",\n LLM: \"bg-purple-400\",\n TOOL: \"bg-blue-400\",\n TASK: \"bg-yellow-400\",\n MEMORY: \"bg-cyan-400\",\n MCP: \"bg-orange-400\",\n SYSTEM: \"bg-gray-400\",\n ERROR: \"bg-red-400\",\n};\n\nfunction describeEvent(evt: TelemetryEvent, agentName: string): string {\n const data = evt.data || {};\n switch (evt.type) {\n case \"thread_activity\":\n return (data.activity as string) || \"Working...\";\n case \"agent_started\":\n return \"Agent started\";\n case \"agent_stopped\":\n return data.reason ? `Agent stopped (${data.reason})` : \"Agent stopped\";\n case \"agent_error\":\n return evt.error || \"Agent error\";\n case \"llm_request\":\n return \"Thinking...\";\n case \"tool_invocation\": {\n const toolRaw = (data.tool_name || \"\") as string;\n if (!toolRaw) return \"Using tools\";\n const toolFormatted = toolRaw.replace(/[-_]/g, \" \").replace(/\\b\\w/g, c => c.toUpperCase());\n return `Tool: ${toolFormatted}`;\n }\n case \"task_created\":\n return data.title ? `Task created: ${data.title}` : \"Task created\";\n case \"task_updated\": {\n const status = data.status as string | undefined;\n const title = data.title as string | undefined;\n const statusLabel = status ? status.charAt(0).toUpperCase() + status.slice(1) : null;\n if (title && statusLabel) return `Task ${statusLabel}: ${title}`;\n if (statusLabel) return `Task ${statusLabel}`;\n if (title) return `Task updated: ${title}`;\n return \"Task updated\";\n }\n case \"task_deleted\":\n return \"Task deleted\";\n case \"task_executed\": {\n const title = data.title as string | undefined;\n return title ? `Task started: ${title}` : \"Task started\";\n }\n case \"memory_stored\":\n return \"Memory stored\";\n case \"memory_retrieved\":\n return \"Memory retrieved\";\n case \"mcp_request\":\n return data.server ? `MCP request to ${data.server}` : \"MCP request\";\n case \"mcp_tool_execution\": {\n const rawName = (data.tool_name || data.tool || \"\") as string;\n if (!rawName) return \"MCP tool call\";\n // \"Server__tool-name-here\" -> take part after __, format dashes/underscores to spaces, title case\n const toolPart = rawName.includes(\"__\") ? rawName.split(\"__\").slice(1).join(\"__\") : rawName;\n const formatted = toolPart.replace(/[-_]/g, \" \").replace(/\\b\\w/g, c => c.toUpperCase());\n return `MCP: ${formatted}`;\n }\n default:\n return evt.type.replace(/_/g, \" \");\n }\n}\n\nexport function ActivityPage({ agents, loading, onNavigate }: ActivityPageProps) {\n const { authFetch } = useAuth();\n const { currentProjectId } = useProjects();\n const { events: realtimeEvents, statusChangeCounter } = useTelemetryContext();\n const [historicalEvents, setHistoricalEvents] = useState<TelemetryEvent[]>([]);\n const [filterAgentId, setFilterAgentId] = useState<string>(\"\");\n const [seenIds] = useState(() => new Set<string>());\n const hasLoadedHistory = useRef(false);\n\n const filteredAgents = useMemo(() => {\n if (currentProjectId === null) return agents;\n if (currentProjectId === \"unassigned\") return agents.filter(a => !a.projectId);\n return agents.filter(a => a.projectId === currentProjectId);\n }, [agents, currentProjectId]);\n\n const agentIds = useMemo(() => new Set(filteredAgents.map(a => a.id)), [filteredAgents]);\n const agentNameMap = useMemo(() => {\n const map = new Map<string, string>();\n filteredAgents.forEach(a => map.set(a.id, a.name));\n return map;\n }, [filteredAgents]);\n\n // Fetch historical events\n const fetchHistory = useCallback(async () => {\n const projectParam = currentProjectId ? `&project_id=${encodeURIComponent(currentProjectId)}` : \"\";\n try {\n const res = await authFetch(`/api/telemetry/events?limit=200${projectParam}`);\n if (res.ok) {\n const data = await res.json();\n setHistoricalEvents(data.events || []);\n }\n } catch {}\n }, [authFetch, currentProjectId]);\n\n useEffect(() => {\n fetchHistory();\n }, [fetchHistory, statusChangeCounter]);\n\n // Mark historical events as seen so they don't animate\n useEffect(() => {\n if (historicalEvents.length > 0 && !hasLoadedHistory.current) {\n for (const evt of historicalEvents) {\n seenIds.add(evt.id);\n }\n // Also mark any realtime events already present at mount\n for (const evt of realtimeEvents) {\n seenIds.add(evt.id);\n }\n hasLoadedHistory.current = true;\n }\n }, [historicalEvents, realtimeEvents, seenIds]);\n\n // Merge realtime + historical, filter, sort\n const timeline = useMemo(() => {\n const seen = new Set<string>();\n const merged: TelemetryEvent[] = [];\n\n const shouldShow = (evt: TelemetryEvent) => {\n if (!VISIBLE_TYPES.has(evt.type) || !agentIds.has(evt.agent_id) || evt.data?.parent_id) return false;\n // MCP tool: only show completed calls (with duration), skip the start event\n if (evt.type === \"mcp_tool_execution\" && !evt.duration_ms) return false;\n return true;\n };\n\n for (const evt of realtimeEvents) {\n if (!seen.has(evt.id) && shouldShow(evt)) {\n merged.push(evt);\n seen.add(evt.id);\n }\n }\n for (const evt of historicalEvents) {\n if (!seen.has(evt.id) && shouldShow(evt)) {\n merged.push(evt);\n seen.add(evt.id);\n }\n }\n\n let filtered = merged;\n if (filterAgentId) {\n filtered = filtered.filter(e => e.agent_id === filterAgentId);\n }\n\n filtered.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());\n return filtered.slice(0, 200);\n }, [realtimeEvents, historicalEvents, agentIds, filterAgentId]);\n\n // Group by date for section headers\n const groupedTimeline = useMemo(() => {\n const groups: { label: string; events: TelemetryEvent[] }[] = [];\n let currentLabel = \"\";\n const today = new Date().toDateString();\n const yesterday = new Date(Date.now() - 86400000).toDateString();\n\n for (const evt of timeline) {\n const dateStr = new Date(evt.timestamp).toDateString();\n const label = dateStr === today ? \"Today\" : dateStr === yesterday ? \"Yesterday\" : dateStr;\n if (label !== currentLabel) {\n currentLabel = label;\n groups.push({ label, events: [] });\n }\n groups[groups.length - 1].events.push(evt);\n }\n return groups;\n }, [timeline]);\n\n if (loading) {\n return <div className=\"flex-1 flex items-center justify-center text-[var(--color-text-muted)]\">Loading...</div>;\n }\n\n const runningCount = filteredAgents.filter(a => a.status === \"running\").length;\n\n return (\n <div className=\"flex-1 flex flex-col overflow-hidden\">\n {/* Header */}\n <div className=\"px-6 pt-6 pb-4 shrink-0\">\n <div className=\"flex items-center justify-between gap-4\">\n <div>\n <h1 className=\"text-xl font-semibold\">Activity</h1>\n <p className=\"text-sm text-[var(--color-text-muted)] mt-0.5\">\n {runningCount} of {filteredAgents.length} agents running\n </p>\n </div>\n <div className=\"w-48\">\n <Select\n value={filterAgentId}\n onChange={setFilterAgentId}\n placeholder=\"All agents\"\n options={[\n { value: \"\", label: \"All agents\" },\n ...filteredAgents.map(a => ({ value: a.id, label: a.name })),\n ]}\n />\n </div>\n </div>\n </div>\n\n {/* Timeline */}\n <div className=\"flex-1 overflow-auto px-6 pb-6\">\n {timeline.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center py-20 text-[var(--color-text-faint)]\">\n <p className=\"text-lg mb-2\">No activity yet</p>\n <p className=\"text-sm\">Agent activity will appear here in real-time.</p>\n </div>\n ) : (\n <div className=\"max-w-2xl\">\n {groupedTimeline.map(group => (\n <div key={group.label}>\n {/* Date header */}\n <div className=\"sticky top-0 z-10 bg-[var(--color-bg)] backdrop-blur-sm py-2 mb-1\">\n <span className=\"text-xs font-semibold text-[var(--color-text-muted)] uppercase tracking-wider\">\n {group.label}\n </span>\n </div>\n\n {/* Events */}\n <div className=\"relative ml-3 border-l border-[var(--color-border)]\">\n {group.events.map(evt => {\n const isNew = !seenIds.has(evt.id);\n if (isNew) seenIds.add(evt.id); // mark seen after first render\n const agentName = agentNameMap.get(evt.agent_id) || evt.agent_id.slice(0, 8);\n const dotColor = evt.level === \"error\"\n ? \"bg-red-400\"\n : CATEGORY_COLORS[evt.category] || \"bg-[var(--color-text-faint)]\";\n\n return (\n <div\n key={evt.id}\n className={`relative pl-6 pr-3 py-2.5 hover:bg-[var(--color-surface-hover)] transition-colors ${\n isNew ? \"animate-slideIn\" : \"\"\n }`}\n >\n {/* Timeline dot */}\n <span className={`absolute left-[-4.5px] top-[14px] w-[9px] h-[9px] rounded-full ${dotColor} ring-2 ring-[#0a0a0a]`} />\n\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"flex-1 min-w-0\">\n <p className={`text-sm ${evt.level === \"error\" ? \"text-red-400\" : \"\"}`}>\n {describeEvent(evt, agentName)}\n </p>\n <div className=\"flex items-center gap-2 text-[11px] text-[var(--color-text-faint)] mt-0.5\">\n <span className=\"text-[var(--color-text-secondary)] font-medium\">{agentName}</span>\n <span className=\"text-[var(--color-border-light)]\">·</span>\n <span className=\"text-[var(--color-text-faint)]\">{evt.category}</span>\n {evt.duration_ms != null && evt.duration_ms > 0 && (\n <>\n <span className=\"text-[var(--color-border-light)]\">·</span>\n <span>{evt.duration_ms < 1000 ? `${evt.duration_ms}ms` : `${(evt.duration_ms / 1000).toFixed(1)}s`}</span>\n </>\n )}\n </div>\n </div>\n <span className=\"text-[11px] text-[var(--color-text-faint)] shrink-0 pt-0.5\">\n {timeAgo(evt.timestamp)}\n </span>\n </div>\n </div>\n );\n })}\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n}\n\nfunction timeAgo(timestamp: string): string {\n const seconds = Math.floor((Date.now() - new Date(timestamp).getTime()) / 1000);\n if (seconds < 5) return \"just now\";\n if (seconds < 60) return `${seconds}s ago`;\n const minutes = Math.floor(seconds / 60);\n if (minutes < 60) return `${minutes}m ago`;\n const hours = Math.floor(minutes / 60);\n if (hours < 24) return `${hours}h ago`;\n const days = Math.floor(hours / 24);\n return `${days}d ago`;\n}\n"
|
|
6
6
|
],
|
|
7
|
-
"mappings": "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
|
|
8
|
-
"debugId": "
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "D584AFE9ED97069764756E2164756E21",
|
|
9
9
|
"names": []
|
|
10
10
|
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import{$ as E,X as y,aa as D,ja as l}from"./App.shfd8tp9.js";var M=y(E(),1);var z=y(D(),1),V={get:"#61affe",post:"#49cc90",put:"#fca130",delete:"#f93e3e",patch:"#50e3c2"};function c({method:I,path:A,parameters:F,requestBody:L,authFetch:T}){let[U,R]=M.useState({}),[G,O]=M.useState(""),[_,k]=M.useState(null),[w,q]=M.useState(!1),[B,f]=M.useState(null);M.useEffect(()=>{if(L?.content?.["application/json"]?.schema){let W=L.content["application/json"].schema;if(W.example)O(JSON.stringify(W.example,null,2));else if(W.properties){let $={};for(let[N,Q]of Object.entries(W.properties))if(Q.example!==void 0)$[N]=Q.example;else if(Q.type==="string")$[N]="";else if(Q.type==="number"||Q.type==="integer")$[N]=0;else if(Q.type==="boolean")$[N]=!1;else if(Q.type==="array")$[N]=[];else if(Q.type==="object")$[N]={};O(JSON.stringify($,null,2))}}},[L]);let C=async()=>{q(!0),f(null),k(null);try{let W=A,$=[];for(let Z of F||[]){let H=U[Z.name]||"";if(Z.in==="path")W=W.replace(`{${Z.name}}`,encodeURIComponent(H));else if(Z.in==="query"&&H)$.push(`${Z.name}=${encodeURIComponent(H)}`)}if($.length>0)W+=`?${$.join("&")}`;let N={method:I.toUpperCase()};if(G&&["post","put","patch"].includes(I))N.headers={"Content-Type":"application/json"},N.body=G;let Q=await T(`/api${W}`,N),X;if(Q.headers.get("content-type")?.includes("application/json"))X=await Q.json();else X=await Q.text();k({status:Q.status,data:X})}catch(W){f(W.message||"Request failed")}finally{q(!1)}},b=F?.filter((W)=>W.in==="path")||[],K=F?.filter((W)=>W.in==="query")||[],S=["post","put","patch"].includes(I)&&L;return z.jsxDEV("div",{style:{marginTop:16,padding:16,background:"var(--color-bg)",borderRadius:6,border:"1px solid var(--color-border-light)"},children:[z.jsxDEV("h4",{style:{fontSize:13,color:"var(--color-accent)",marginBottom:12,fontWeight:600},children:"Try it out"},void 0,!1,void 0,this),b.length>0&&z.jsxDEV("div",{style:{marginBottom:12},children:[z.jsxDEV("div",{style:{fontSize:11,color:"var(--color-text-muted)",marginBottom:6},children:"Path Parameters"},void 0,!1,void 0,this),b.map((W)=>z.jsxDEV("div",{style:{marginBottom:8},children:[z.jsxDEV("label",{style:{fontSize:12,color:"var(--color-text-secondary)",display:"block",marginBottom:4},children:[W.name," ",W.required&&z.jsxDEV("span",{style:{color:"#f66"},children:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("input",{type:"text",value:U[W.name]||"",onChange:($)=>R({...U,[W.name]:$.target.value}),placeholder:W.schema?.type||"string",style:{width:"100%",padding:"8px 12px",background:"var(--color-surface)",border:"1px solid var(--color-border-light)",borderRadius:4,color:"var(--color-text)",fontSize:13,fontFamily:"monospace"}},void 0,!1,void 0,this)]},W.name,!0,void 0,this))]},void 0,!0,void 0,this),K.length>0&&z.jsxDEV("div",{style:{marginBottom:12},children:[z.jsxDEV("div",{style:{fontSize:11,color:"var(--color-text-muted)",marginBottom:6},children:"Query Parameters"},void 0,!1,void 0,this),K.map((W)=>z.jsxDEV("div",{style:{marginBottom:8},children:[z.jsxDEV("label",{style:{fontSize:12,color:"var(--color-text-secondary)",display:"block",marginBottom:4},children:[W.name," ",W.required&&z.jsxDEV("span",{style:{color:"#f66"},children:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("input",{type:"text",value:U[W.name]||"",onChange:($)=>R({...U,[W.name]:$.target.value}),placeholder:W.schema?.type||"string",style:{width:"100%",padding:"8px 12px",background:"var(--color-surface)",border:"1px solid var(--color-border-light)",borderRadius:4,color:"var(--color-text)",fontSize:13,fontFamily:"monospace"}},void 0,!1,void 0,this)]},W.name,!0,void 0,this))]},void 0,!0,void 0,this),S&&z.jsxDEV("div",{style:{marginBottom:12},children:[z.jsxDEV("div",{style:{fontSize:11,color:"var(--color-text-muted)",marginBottom:6},children:"Request Body (JSON)"},void 0,!1,void 0,this),z.jsxDEV("textarea",{value:G,onChange:(W)=>O(W.target.value),rows:6,style:{width:"100%",padding:"8px 12px",background:"var(--color-surface)",border:"1px solid var(--color-border-light)",borderRadius:4,color:"var(--color-text)",fontSize:12,fontFamily:"monospace",resize:"vertical"}},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("button",{onClick:C,disabled:w,style:{padding:"10px 20px",background:w?"var(--color-border-light)":"var(--color-accent)",color:w?"var(--color-text-muted)":"#000",border:"none",borderRadius:4,cursor:w?"not-allowed":"pointer",fontSize:13,fontWeight:600},children:w?"Executing...":"Execute"},void 0,!1,void 0,this),B&&z.jsxDEV("div",{style:{marginTop:12,padding:12,background:"#2a1515",borderRadius:4,color:"#f66",fontSize:12},children:B},void 0,!1,void 0,this),_&&z.jsxDEV("div",{style:{marginTop:12},children:[z.jsxDEV("div",{style:{fontSize:11,color:"var(--color-text-muted)",marginBottom:6},children:["Response"," ",z.jsxDEV("span",{style:{color:_.status>=200&&_.status<300?"#49cc90":"#f66"},children:_.status},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("pre",{style:{padding:12,background:"var(--color-surface)",borderRadius:4,color:"var(--color-text-secondary)",fontSize:11,fontFamily:"monospace",overflow:"auto",maxHeight:300,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:typeof _.data==="string"?_.data:JSON.stringify(_.data,null,2)},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}function h(){let{authFetch:I}=l(),[A,F]=M.useState(null),[L,T]=M.useState(!0),[U,R]=M.useState(new Set),[G,O]=M.useState(null),[_,k]=M.useState(!1);M.useEffect(()=>{B()},[]);async function w(){if(!A)return;try{await navigator.clipboard.writeText(JSON.stringify(A,null,2)),k(!0),setTimeout(()=>k(!1),2000)}catch(N){console.error("Failed to copy:",N)}}function q(){if(!A)return;let N=new Blob([JSON.stringify(A,null,2)],{type:"application/json"}),Q=URL.createObjectURL(N),X=document.createElement("a");X.href=Q,X.download="apteva-openapi.json",X.click(),URL.revokeObjectURL(Q)}async function B(){try{let N=await I("/api/openapi");if(N.ok){let Q=await N.json();F(Q)}}catch(N){console.error("Failed to load OpenAPI spec:",N)}finally{T(!1)}}function f(N){R((Q)=>{let X=new Set(Q);if(X.has(N))X.delete(N);else X.add(N);return X})}function C(N,Q=0){if(!N)return"{}";if(Q>2)return"...";if(N.$ref)return N.$ref.split("/").pop()||"Object";if(N.type==="array")return`${C(N.items,Q+1)}[]`;if(N.type==="object"&&N.properties){let X=Object.entries(N.properties).slice(0,3).map(([Z,H])=>`${Z}: ${H.type||"any"}`).join(", "),Y=Object.keys(N.properties).length>3?", ...":"";return`{ ${X}${Y} }`}return N.type||"any"}if(L)return z.jsxDEV("div",{style:{padding:24},children:z.jsxDEV("p",{style:{color:"var(--color-text-secondary)"},children:"Loading API documentation..."},void 0,!1,void 0,this)},void 0,!1,void 0,this);if(!A)return z.jsxDEV("div",{style:{padding:24},children:z.jsxDEV("p",{style:{color:"#f66"},children:"Failed to load API documentation"},void 0,!1,void 0,this)},void 0,!1,void 0,this);let b=A.tags||[],K=Object.entries(A.paths);function S(N){let Q=new Set;function X(Y){if(!Y)return;if(typeof Y==="object"){if(Y.$ref){let Z=Y.$ref.split("/").pop();if(Z)Q.add(Z)}for(let Z of Object.values(Y))X(Z)}}return X(N.requestBody),X(N.responses),Q}function W(){if(!G||!A.components?.schemas)return Object.keys(A.components?.schemas||{});let N=new Set;for(let[Q,X]of $)for(let[Y,Z]of Object.entries(X)){if(!["get","post","put","delete","patch"].includes(Y))continue;if(Z.tags?.includes(G))S(Z).forEach((g)=>N.add(g))}return Array.from(N)}let $=G?K.filter(([N,Q])=>Object.values(Q).some((X)=>X.tags?.includes(G))):K;return z.jsxDEV("div",{style:{padding:24,maxWidth:1000,height:"100%",overflowY:"auto"},children:[z.jsxDEV("div",{style:{marginBottom:24},children:[z.jsxDEV("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"flex-start",marginBottom:8},children:[z.jsxDEV("h1",{style:{fontSize:24,fontWeight:600},children:A.info.title},void 0,!1,void 0,this),z.jsxDEV("div",{style:{display:"flex",gap:8},children:[z.jsxDEV("button",{onClick:w,style:{padding:"8px 16px",borderRadius:4,border:"1px solid var(--color-border-light)",background:_?"#49cc90":"var(--color-surface-raised)",color:_?"#000":"var(--color-text)",cursor:"pointer",fontSize:12,fontFamily:"inherit"},children:_?"Copied!":"Copy JSON"},void 0,!1,void 0,this),z.jsxDEV("button",{onClick:q,style:{padding:"8px 16px",borderRadius:4,border:"1px solid var(--color-border-light)",background:"var(--color-surface-raised)",color:"var(--color-text)",cursor:"pointer",fontSize:12,fontFamily:"inherit"},children:"Download"},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("p",{style:{color:"var(--color-text-secondary)",marginBottom:8},children:A.info.description.split(`
|
|
2
|
+
`)[0]},void 0,!1,void 0,this),z.jsxDEV("p",{style:{color:"var(--color-text-muted)",fontSize:12},children:["Version: ",A.info.version]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("div",{style:{background:"var(--color-surface-raised)",padding:12,borderRadius:6,marginBottom:24,fontFamily:"monospace"},children:[z.jsxDEV("span",{style:{color:"var(--color-text-secondary)"},children:"Base URL: "},void 0,!1,void 0,this),z.jsxDEV("span",{style:{color:"#61affe"},children:[window.location.origin,"/api"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("div",{style:{marginBottom:24,display:"flex",flexWrap:"wrap",gap:8},children:[z.jsxDEV("button",{onClick:()=>O(null),style:{padding:"6px 12px",borderRadius:4,border:"1px solid var(--color-border-light)",background:G===null?"var(--color-border-light)":"transparent",color:G===null?"var(--color-text)":"var(--color-text-secondary)",cursor:"pointer",fontSize:12},children:"All"},void 0,!1,void 0,this),b.map((N)=>z.jsxDEV("button",{onClick:()=>O(N.name),style:{padding:"6px 12px",borderRadius:4,border:"1px solid var(--color-border-light)",background:G===N.name?"var(--color-border-light)":"transparent",color:G===N.name?"var(--color-text)":"var(--color-text-secondary)",cursor:"pointer",fontSize:12},title:N.description,children:N.name},N.name,!1,void 0,this))]},void 0,!0,void 0,this),z.jsxDEV("div",{style:{display:"flex",flexDirection:"column",gap:8},children:$.map(([N,Q])=>Object.entries(Q).filter(([X])=>["get","post","put","delete","patch"].includes(X)).map(([X,Y])=>{let Z=`${X}:${N}`,H=U.has(Z),g=X.toUpperCase(),j=V[X]||"var(--color-text-secondary)";return z.jsxDEV("div",{style:{border:"1px solid var(--color-border-light)",borderRadius:6,overflow:"hidden"},children:[z.jsxDEV("div",{onClick:()=>f(Z),style:{display:"flex",alignItems:"center",gap:12,padding:"12px 16px",background:H?"var(--color-surface-raised)":"transparent",cursor:"pointer"},children:[z.jsxDEV("span",{style:{background:j,color:"#000",padding:"4px 8px",borderRadius:4,fontSize:11,fontWeight:600,minWidth:60,textAlign:"center"},children:g},void 0,!1,void 0,this),z.jsxDEV("span",{style:{fontFamily:"monospace",color:"var(--color-text)"},children:N},void 0,!1,void 0,this),z.jsxDEV("span",{style:{color:"var(--color-text-secondary)",flex:1,fontSize:13},children:Y.summary},void 0,!1,void 0,this),z.jsxDEV("span",{style:{color:"var(--color-text-muted)",fontSize:12},children:H?"[-]":"[+]"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),H&&z.jsxDEV("div",{style:{padding:16,background:"var(--color-bg)",borderTop:"1px solid var(--color-border-light)"},children:[Y.description&&z.jsxDEV("p",{style:{color:"var(--color-text-secondary)",marginBottom:16,fontSize:13},children:Y.description},void 0,!1,void 0,this),Y.parameters&&Y.parameters.length>0&&z.jsxDEV("div",{style:{marginBottom:16},children:[z.jsxDEV("h4",{style:{fontSize:13,color:"var(--color-text-secondary)",marginBottom:8},children:"Parameters"},void 0,!1,void 0,this),z.jsxDEV("div",{style:{background:"var(--color-surface-raised)",borderRadius:4,padding:12},children:Y.parameters.map((J)=>z.jsxDEV("div",{style:{display:"flex",gap:12,marginBottom:8,fontSize:12},children:[z.jsxDEV("span",{style:{color:"#61affe",minWidth:100},children:[J.name,J.required&&z.jsxDEV("span",{style:{color:"#f66"},children:"*"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("span",{style:{color:"var(--color-text-muted)"},children:["(",J.in,")"]},void 0,!0,void 0,this),z.jsxDEV("span",{style:{color:"var(--color-text-secondary)"},children:J.schema?.type||"string"},void 0,!1,void 0,this),J.description&&z.jsxDEV("span",{style:{color:"var(--color-text-muted)"},children:["- ",J.description]},void 0,!0,void 0,this)]},J.name,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y.requestBody&&z.jsxDEV("div",{style:{marginBottom:16},children:[z.jsxDEV("h4",{style:{fontSize:13,color:"var(--color-text-secondary)",marginBottom:8},children:["Request Body",Y.requestBody.required&&z.jsxDEV("span",{style:{color:"#f66"},children:" (required)"},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("div",{style:{background:"var(--color-surface-raised)",borderRadius:4,padding:12,fontFamily:"monospace",fontSize:12,color:"#49cc90"},children:Object.entries(Y.requestBody.content||{}).map(([J,P])=>z.jsxDEV("div",{children:[z.jsxDEV("span",{style:{color:"var(--color-text-muted)"},children:[J,": "]},void 0,!0,void 0,this),C(P.schema)]},J,!0,void 0,this))},void 0,!1,void 0,this)]},void 0,!0,void 0,this),Y.responses&&z.jsxDEV("div",{children:[z.jsxDEV("h4",{style:{fontSize:13,color:"var(--color-text-secondary)",marginBottom:8},children:"Responses"},void 0,!1,void 0,this),z.jsxDEV("div",{style:{background:"var(--color-surface-raised)",borderRadius:4,padding:12},children:Object.entries(Y.responses).map(([J,P])=>{let v=P.content?.["application/json"]?.schema,u=v?.$ref?.split("/").pop(),n=v?.type,i=v?.items?.$ref?.split("/").pop();return z.jsxDEV("div",{style:{marginBottom:12,fontSize:12},children:[z.jsxDEV("div",{style:{display:"flex",gap:12,marginBottom:4},children:[z.jsxDEV("span",{style:{color:J.startsWith("2")?"#49cc90":"#f66",minWidth:40},children:J},void 0,!1,void 0,this),z.jsxDEV("span",{style:{color:"var(--color-text-secondary)"},children:P.description},void 0,!1,void 0,this)]},void 0,!0,void 0,this),v&&z.jsxDEV("div",{style:{marginLeft:52,padding:"8px 12px",background:"var(--color-bg)",borderRadius:4,fontFamily:"monospace"},children:u?z.jsxDEV("span",{style:{color:"#61affe"},children:u},void 0,!1,void 0,this):n==="array"&&i?z.jsxDEV("span",{style:{color:"#61affe"},children:[i,"[]"]},void 0,!0,void 0,this):n==="array"?z.jsxDEV("span",{style:{color:"var(--color-text-secondary)"},children:"array"},void 0,!1,void 0,this):z.jsxDEV("span",{style:{color:"var(--color-text-secondary)"},children:C(v)},void 0,!1,void 0,this)},void 0,!1,void 0,this)]},J,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV(c,{method:X,path:N,parameters:Y.parameters,requestBody:Y.requestBody,authFetch:I},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},Z,!0,void 0,this)}))},void 0,!1,void 0,this),A.components?.schemas&&W().length>0&&z.jsxDEV("div",{style:{marginTop:32},children:[z.jsxDEV("h2",{style:{fontSize:18,fontWeight:600,marginBottom:16},children:["Schemas ",G&&z.jsxDEV("span",{style:{color:"var(--color-text-muted)",fontSize:14},children:["(",G,")"]},void 0,!0,void 0,this)]},void 0,!0,void 0,this),z.jsxDEV("div",{style:{display:"flex",flexDirection:"column",gap:8},children:W().map((N)=>{let Q=A.components.schemas[N];if(!Q)return null;return z.jsxDEV("div",{style:{border:"1px solid var(--color-border-light)",borderRadius:6,padding:12},children:[z.jsxDEV("h3",{style:{fontSize:14,color:"#61affe",marginBottom:8},children:N},void 0,!1,void 0,this),Q.properties&&z.jsxDEV("div",{style:{fontSize:12},children:Object.entries(Q.properties).map(([X,Y])=>z.jsxDEV("div",{style:{display:"flex",gap:8,marginBottom:4,fontFamily:"monospace"},children:[z.jsxDEV("span",{style:{color:"var(--color-text)",minWidth:120},children:X},void 0,!1,void 0,this),z.jsxDEV("span",{style:{color:"var(--color-text-secondary)"},children:[Y.type||(Y.$ref?Y.$ref.split("/").pop():"any"),Y.nullable&&" | null"]},void 0,!0,void 0,this),Y.enum&&z.jsxDEV("span",{style:{color:"var(--color-text-muted)"},children:["[",Y.enum.join(" | "),"]"]},void 0,!0,void 0,this)]},X,!0,void 0,this))},void 0,!1,void 0,this)]},N,!0,void 0,this)})},void 0,!1,void 0,this)]},void 0,!0,void 0,this)]},void 0,!0,void 0,this)}export{h as ApiDocsPage};
|
|
3
|
+
|
|
4
|
+
//# debugId=59EEC8715E10AB6E64756E2164756E21
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/web/components/api/ApiDocsPage.tsx"],
|
|
4
|
+
"sourcesContent": [
|
|
5
|
+
"import { useState, useEffect } from \"react\";\nimport { useAuth } from \"../../context\";\n\ninterface OpenApiPath {\n [method: string]: {\n tags?: string[];\n summary?: string;\n description?: string;\n parameters?: Array<{\n name: string;\n in: string;\n required?: boolean;\n schema?: { type: string };\n description?: string;\n }>;\n requestBody?: {\n required?: boolean;\n content?: {\n [mediaType: string]: {\n schema?: any;\n };\n };\n };\n responses?: {\n [code: string]: {\n description?: string;\n content?: any;\n };\n };\n };\n}\n\ninterface OpenApiSpec {\n info: {\n title: string;\n description: string;\n version: string;\n };\n tags?: Array<{ name: string; description: string }>;\n paths: { [path: string]: OpenApiPath };\n components?: {\n schemas?: { [name: string]: any };\n };\n}\n\nconst METHOD_COLORS: Record<string, string> = {\n get: \"#61affe\",\n post: \"#49cc90\",\n put: \"#fca130\",\n delete: \"#f93e3e\",\n patch: \"#50e3c2\",\n};\n\n// Try It Out component\nfunction TryItOut({\n method,\n path,\n parameters,\n requestBody,\n authFetch,\n}: {\n method: string;\n path: string;\n parameters?: Array<{\n name: string;\n in: string;\n required?: boolean;\n schema?: { type: string };\n }>;\n requestBody?: any;\n authFetch: (url: string, options?: RequestInit) => Promise<Response>;\n}) {\n const [paramValues, setParamValues] = useState<Record<string, string>>({});\n const [bodyValue, setBodyValue] = useState(\"\");\n const [response, setResponse] = useState<{ status: number; data: any } | null>(null);\n const [loading, setLoading] = useState(false);\n const [error, setError] = useState<string | null>(null);\n\n // Initialize body with example if available\n useEffect(() => {\n if (requestBody?.content?.[\"application/json\"]?.schema) {\n const schema = requestBody.content[\"application/json\"].schema;\n if (schema.example) {\n setBodyValue(JSON.stringify(schema.example, null, 2));\n } else if (schema.properties) {\n // Generate example from properties\n const example: Record<string, any> = {};\n for (const [key, prop] of Object.entries(schema.properties) as [string, any][]) {\n if (prop.example !== undefined) {\n example[key] = prop.example;\n } else if (prop.type === \"string\") {\n example[key] = \"\";\n } else if (prop.type === \"number\" || prop.type === \"integer\") {\n example[key] = 0;\n } else if (prop.type === \"boolean\") {\n example[key] = false;\n } else if (prop.type === \"array\") {\n example[key] = [];\n } else if (prop.type === \"object\") {\n example[key] = {};\n }\n }\n setBodyValue(JSON.stringify(example, null, 2));\n }\n }\n }, [requestBody]);\n\n const execute = async () => {\n setLoading(true);\n setError(null);\n setResponse(null);\n\n try {\n // Build URL with path parameters\n let url = path;\n const queryParams: string[] = [];\n\n for (const param of parameters || []) {\n const value = paramValues[param.name] || \"\";\n if (param.in === \"path\") {\n url = url.replace(`{${param.name}}`, encodeURIComponent(value));\n } else if (param.in === \"query\" && value) {\n queryParams.push(`${param.name}=${encodeURIComponent(value)}`);\n }\n }\n\n if (queryParams.length > 0) {\n url += `?${queryParams.join(\"&\")}`;\n }\n\n const options: RequestInit = {\n method: method.toUpperCase(),\n };\n\n if (bodyValue && [\"post\", \"put\", \"patch\"].includes(method)) {\n options.headers = { \"Content-Type\": \"application/json\" };\n options.body = bodyValue;\n }\n\n const res = await authFetch(`/api${url}`, options);\n let data;\n const contentType = res.headers.get(\"content-type\");\n if (contentType?.includes(\"application/json\")) {\n data = await res.json();\n } else {\n data = await res.text();\n }\n\n setResponse({ status: res.status, data });\n } catch (err: any) {\n setError(err.message || \"Request failed\");\n } finally {\n setLoading(false);\n }\n };\n\n const pathParams = parameters?.filter((p) => p.in === \"path\") || [];\n const queryParams = parameters?.filter((p) => p.in === \"query\") || [];\n const hasBody = [\"post\", \"put\", \"patch\"].includes(method) && requestBody;\n\n return (\n <div style={{ marginTop: 16, padding: 16, background: \"var(--color-bg)\", borderRadius: 6, border: \"1px solid var(--color-border-light)\" }}>\n <h4 style={{ fontSize: 13, color: \"var(--color-accent)\", marginBottom: 12, fontWeight: 600 }}>Try it out</h4>\n\n {/* Path Parameters */}\n {pathParams.length > 0 && (\n <div style={{ marginBottom: 12 }}>\n <div style={{ fontSize: 11, color: \"var(--color-text-muted)\", marginBottom: 6 }}>Path Parameters</div>\n {pathParams.map((param) => (\n <div key={param.name} style={{ marginBottom: 8 }}>\n <label style={{ fontSize: 12, color: \"var(--color-text-secondary)\", display: \"block\", marginBottom: 4 }}>\n {param.name} {param.required && <span style={{ color: \"#f66\" }}>*</span>}\n </label>\n <input\n type=\"text\"\n value={paramValues[param.name] || \"\"}\n onChange={(e) => setParamValues({ ...paramValues, [param.name]: e.target.value })}\n placeholder={param.schema?.type || \"string\"}\n style={{\n width: \"100%\",\n padding: \"8px 12px\",\n background: \"var(--color-surface)\",\n border: \"1px solid var(--color-border-light)\",\n borderRadius: 4,\n color: \"var(--color-text)\",\n fontSize: 13,\n fontFamily: \"monospace\",\n }}\n />\n </div>\n ))}\n </div>\n )}\n\n {/* Query Parameters */}\n {queryParams.length > 0 && (\n <div style={{ marginBottom: 12 }}>\n <div style={{ fontSize: 11, color: \"var(--color-text-muted)\", marginBottom: 6 }}>Query Parameters</div>\n {queryParams.map((param) => (\n <div key={param.name} style={{ marginBottom: 8 }}>\n <label style={{ fontSize: 12, color: \"var(--color-text-secondary)\", display: \"block\", marginBottom: 4 }}>\n {param.name} {param.required && <span style={{ color: \"#f66\" }}>*</span>}\n </label>\n <input\n type=\"text\"\n value={paramValues[param.name] || \"\"}\n onChange={(e) => setParamValues({ ...paramValues, [param.name]: e.target.value })}\n placeholder={param.schema?.type || \"string\"}\n style={{\n width: \"100%\",\n padding: \"8px 12px\",\n background: \"var(--color-surface)\",\n border: \"1px solid var(--color-border-light)\",\n borderRadius: 4,\n color: \"var(--color-text)\",\n fontSize: 13,\n fontFamily: \"monospace\",\n }}\n />\n </div>\n ))}\n </div>\n )}\n\n {/* Request Body */}\n {hasBody && (\n <div style={{ marginBottom: 12 }}>\n <div style={{ fontSize: 11, color: \"var(--color-text-muted)\", marginBottom: 6 }}>Request Body (JSON)</div>\n <textarea\n value={bodyValue}\n onChange={(e) => setBodyValue(e.target.value)}\n rows={6}\n style={{\n width: \"100%\",\n padding: \"8px 12px\",\n background: \"var(--color-surface)\",\n border: \"1px solid var(--color-border-light)\",\n borderRadius: 4,\n color: \"var(--color-text)\",\n fontSize: 12,\n fontFamily: \"monospace\",\n resize: \"vertical\",\n }}\n />\n </div>\n )}\n\n {/* Execute Button */}\n <button\n onClick={execute}\n disabled={loading}\n style={{\n padding: \"10px 20px\",\n background: loading ? \"var(--color-border-light)\" : \"var(--color-accent)\",\n color: loading ? \"var(--color-text-muted)\" : \"#000\",\n border: \"none\",\n borderRadius: 4,\n cursor: loading ? \"not-allowed\" : \"pointer\",\n fontSize: 13,\n fontWeight: 600,\n }}\n >\n {loading ? \"Executing...\" : \"Execute\"}\n </button>\n\n {/* Error */}\n {error && (\n <div style={{ marginTop: 12, padding: 12, background: \"#2a1515\", borderRadius: 4, color: \"#f66\", fontSize: 12 }}>\n {error}\n </div>\n )}\n\n {/* Response */}\n {response && (\n <div style={{ marginTop: 12 }}>\n <div style={{ fontSize: 11, color: \"var(--color-text-muted)\", marginBottom: 6 }}>\n Response{\" \"}\n <span style={{ color: response.status >= 200 && response.status < 300 ? \"#49cc90\" : \"#f66\" }}>\n {response.status}\n </span>\n </div>\n <pre\n style={{\n padding: 12,\n background: \"var(--color-surface)\",\n borderRadius: 4,\n color: \"var(--color-text-secondary)\",\n fontSize: 11,\n fontFamily: \"monospace\",\n overflow: \"auto\",\n maxHeight: 300,\n whiteSpace: \"pre-wrap\",\n wordBreak: \"break-word\",\n }}\n >\n {typeof response.data === \"string\" ? response.data : JSON.stringify(response.data, null, 2)}\n </pre>\n </div>\n )}\n </div>\n );\n}\n\nexport function ApiDocsPage() {\n const { authFetch } = useAuth();\n const [spec, setSpec] = useState<OpenApiSpec | null>(null);\n const [loading, setLoading] = useState(true);\n const [expandedPaths, setExpandedPaths] = useState<Set<string>>(new Set());\n const [selectedTag, setSelectedTag] = useState<string | null>(null);\n const [copied, setCopied] = useState(false);\n\n useEffect(() => {\n loadSpec();\n }, []);\n\n async function copyToClipboard() {\n if (!spec) return;\n try {\n await navigator.clipboard.writeText(JSON.stringify(spec, null, 2));\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch (err) {\n console.error(\"Failed to copy:\", err);\n }\n }\n\n function downloadJson() {\n if (!spec) return;\n const blob = new Blob([JSON.stringify(spec, null, 2)], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = \"apteva-openapi.json\";\n a.click();\n URL.revokeObjectURL(url);\n }\n\n async function loadSpec() {\n try {\n const res = await authFetch(\"/api/openapi\");\n if (res.ok) {\n const data = await res.json();\n setSpec(data);\n }\n } catch (err) {\n console.error(\"Failed to load OpenAPI spec:\", err);\n } finally {\n setLoading(false);\n }\n }\n\n function togglePath(pathKey: string) {\n setExpandedPaths((prev) => {\n const next = new Set(prev);\n if (next.has(pathKey)) {\n next.delete(pathKey);\n } else {\n next.add(pathKey);\n }\n return next;\n });\n }\n\n function getSchemaPreview(schema: any, depth = 0): string {\n if (!schema) return \"{}\";\n if (depth > 2) return \"...\";\n\n if (schema.$ref) {\n const refName = schema.$ref.split(\"/\").pop();\n return refName || \"Object\";\n }\n\n if (schema.type === \"array\") {\n const itemType = getSchemaPreview(schema.items, depth + 1);\n return `${itemType}[]`;\n }\n\n if (schema.type === \"object\" && schema.properties) {\n const props = Object.entries(schema.properties)\n .slice(0, 3)\n .map(([k, v]: [string, any]) => `${k}: ${v.type || \"any\"}`)\n .join(\", \");\n const more = Object.keys(schema.properties).length > 3 ? \", ...\" : \"\";\n return `{ ${props}${more} }`;\n }\n\n return schema.type || \"any\";\n }\n\n if (loading) {\n return (\n <div style={{ padding: 24 }}>\n <p style={{ color: \"var(--color-text-secondary)\" }}>Loading API documentation...</p>\n </div>\n );\n }\n\n if (!spec) {\n return (\n <div style={{ padding: 24 }}>\n <p style={{ color: \"#f66\" }}>Failed to load API documentation</p>\n </div>\n );\n }\n\n const tags = spec.tags || [];\n const paths = Object.entries(spec.paths);\n\n // Extract schema names referenced by a method\n function getReferencedSchemas(method: any): Set<string> {\n const refs = new Set<string>();\n\n function extractRefs(obj: any) {\n if (!obj) return;\n if (typeof obj === \"object\") {\n if (obj.$ref) {\n const name = obj.$ref.split(\"/\").pop();\n if (name) refs.add(name);\n }\n for (const value of Object.values(obj)) {\n extractRefs(value);\n }\n }\n }\n\n extractRefs(method.requestBody);\n extractRefs(method.responses);\n return refs;\n }\n\n // Get all schemas referenced by filtered endpoints\n function getFilteredSchemas(): string[] {\n if (!selectedTag || !spec.components?.schemas) {\n return Object.keys(spec.components?.schemas || {});\n }\n\n const usedSchemas = new Set<string>();\n\n for (const [_, methods] of filteredPaths) {\n for (const [method, details] of Object.entries(methods)) {\n if (![\"get\", \"post\", \"put\", \"delete\", \"patch\"].includes(method)) continue;\n if (details.tags?.includes(selectedTag)) {\n const refs = getReferencedSchemas(details);\n refs.forEach(r => usedSchemas.add(r));\n }\n }\n }\n\n return Array.from(usedSchemas);\n }\n\n // Filter paths by selected tag\n const filteredPaths = selectedTag\n ? paths.filter(([_, methods]) =>\n Object.values(methods).some((m) => m.tags?.includes(selectedTag))\n )\n : paths;\n\n return (\n <div style={{ padding: 24, maxWidth: 1000, height: \"100%\", overflowY: \"auto\" }}>\n <div style={{ marginBottom: 24 }}>\n <div style={{ display: \"flex\", justifyContent: \"space-between\", alignItems: \"flex-start\", marginBottom: 8 }}>\n <h1 style={{ fontSize: 24, fontWeight: 600 }}>\n {spec.info.title}\n </h1>\n <div style={{ display: \"flex\", gap: 8 }}>\n <button\n onClick={copyToClipboard}\n style={{\n padding: \"8px 16px\",\n borderRadius: 4,\n border: \"1px solid var(--color-border-light)\",\n background: copied ? \"#49cc90\" : \"var(--color-surface-raised)\",\n color: copied ? \"#000\" : \"var(--color-text)\",\n cursor: \"pointer\",\n fontSize: 12,\n fontFamily: \"inherit\",\n }}\n >\n {copied ? \"Copied!\" : \"Copy JSON\"}\n </button>\n <button\n onClick={downloadJson}\n style={{\n padding: \"8px 16px\",\n borderRadius: 4,\n border: \"1px solid var(--color-border-light)\",\n background: \"var(--color-surface-raised)\",\n color: \"var(--color-text)\",\n cursor: \"pointer\",\n fontSize: 12,\n fontFamily: \"inherit\",\n }}\n >\n Download\n </button>\n </div>\n </div>\n <p style={{ color: \"var(--color-text-secondary)\", marginBottom: 8 }}>\n {spec.info.description.split(\"\\n\")[0]}\n </p>\n <p style={{ color: \"var(--color-text-muted)\", fontSize: 12 }}>Version: {spec.info.version}</p>\n </div>\n\n {/* Base URL */}\n <div\n style={{\n background: \"var(--color-surface-raised)\",\n padding: 12,\n borderRadius: 6,\n marginBottom: 24,\n fontFamily: \"monospace\",\n }}\n >\n <span style={{ color: \"var(--color-text-secondary)\" }}>Base URL: </span>\n <span style={{ color: \"#61affe\" }}>\n {window.location.origin}/api\n </span>\n </div>\n\n {/* Tag filters */}\n <div style={{ marginBottom: 24, display: \"flex\", flexWrap: \"wrap\", gap: 8 }}>\n <button\n onClick={() => setSelectedTag(null)}\n style={{\n padding: \"6px 12px\",\n borderRadius: 4,\n border: \"1px solid var(--color-border-light)\",\n background: selectedTag === null ? \"var(--color-border-light)\" : \"transparent\",\n color: selectedTag === null ? \"var(--color-text)\" : \"var(--color-text-secondary)\",\n cursor: \"pointer\",\n fontSize: 12,\n }}\n >\n All\n </button>\n {tags.map((tag) => (\n <button\n key={tag.name}\n onClick={() => setSelectedTag(tag.name)}\n style={{\n padding: \"6px 12px\",\n borderRadius: 4,\n border: \"1px solid var(--color-border-light)\",\n background: selectedTag === tag.name ? \"var(--color-border-light)\" : \"transparent\",\n color: selectedTag === tag.name ? \"var(--color-text)\" : \"var(--color-text-secondary)\",\n cursor: \"pointer\",\n fontSize: 12,\n }}\n title={tag.description}\n >\n {tag.name}\n </button>\n ))}\n </div>\n\n {/* Endpoints */}\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n {filteredPaths.map(([path, methods]) =>\n Object.entries(methods)\n .filter(([method]) => [\"get\", \"post\", \"put\", \"delete\", \"patch\"].includes(method))\n .map(([method, details]) => {\n const pathKey = `${method}:${path}`;\n const isExpanded = expandedPaths.has(pathKey);\n const methodUpper = method.toUpperCase();\n const color = METHOD_COLORS[method] || \"var(--color-text-secondary)\";\n\n return (\n <div\n key={pathKey}\n style={{\n border: \"1px solid var(--color-border-light)\",\n borderRadius: 6,\n overflow: \"hidden\",\n }}\n >\n {/* Header */}\n <div\n onClick={() => togglePath(pathKey)}\n style={{\n display: \"flex\",\n alignItems: \"center\",\n gap: 12,\n padding: \"12px 16px\",\n background: isExpanded ? \"var(--color-surface-raised)\" : \"transparent\",\n cursor: \"pointer\",\n }}\n >\n <span\n style={{\n background: color,\n color: \"#000\",\n padding: \"4px 8px\",\n borderRadius: 4,\n fontSize: 11,\n fontWeight: 600,\n minWidth: 60,\n textAlign: \"center\",\n }}\n >\n {methodUpper}\n </span>\n <span style={{ fontFamily: \"monospace\", color: \"var(--color-text)\" }}>\n {path}\n </span>\n <span style={{ color: \"var(--color-text-secondary)\", flex: 1, fontSize: 13 }}>\n {details.summary}\n </span>\n <span style={{ color: \"var(--color-text-muted)\", fontSize: 12 }}>\n {isExpanded ? \"[-]\" : \"[+]\"}\n </span>\n </div>\n\n {/* Expanded details */}\n {isExpanded && (\n <div\n style={{\n padding: 16,\n background: \"var(--color-bg)\",\n borderTop: \"1px solid var(--color-border-light)\",\n }}\n >\n {details.description && (\n <p style={{ color: \"var(--color-text-secondary)\", marginBottom: 16, fontSize: 13 }}>\n {details.description}\n </p>\n )}\n\n {/* Parameters */}\n {details.parameters && details.parameters.length > 0 && (\n <div style={{ marginBottom: 16 }}>\n <h4 style={{ fontSize: 13, color: \"var(--color-text-secondary)\", marginBottom: 8 }}>\n Parameters\n </h4>\n <div\n style={{\n background: \"var(--color-surface-raised)\",\n borderRadius: 4,\n padding: 12,\n }}\n >\n {details.parameters.map((param) => (\n <div\n key={param.name}\n style={{\n display: \"flex\",\n gap: 12,\n marginBottom: 8,\n fontSize: 12,\n }}\n >\n <span style={{ color: \"#61affe\", minWidth: 100 }}>\n {param.name}\n {param.required && (\n <span style={{ color: \"#f66\" }}>*</span>\n )}\n </span>\n <span style={{ color: \"var(--color-text-muted)\" }}>({param.in})</span>\n <span style={{ color: \"var(--color-text-secondary)\" }}>\n {param.schema?.type || \"string\"}\n </span>\n {param.description && (\n <span style={{ color: \"var(--color-text-muted)\" }}>\n - {param.description}\n </span>\n )}\n </div>\n ))}\n </div>\n </div>\n )}\n\n {/* Request Body */}\n {details.requestBody && (\n <div style={{ marginBottom: 16 }}>\n <h4 style={{ fontSize: 13, color: \"var(--color-text-secondary)\", marginBottom: 8 }}>\n Request Body\n {details.requestBody.required && (\n <span style={{ color: \"#f66\" }}> (required)</span>\n )}\n </h4>\n <div\n style={{\n background: \"var(--color-surface-raised)\",\n borderRadius: 4,\n padding: 12,\n fontFamily: \"monospace\",\n fontSize: 12,\n color: \"#49cc90\",\n }}\n >\n {Object.entries(details.requestBody.content || {}).map(\n ([mediaType, content]) => (\n <div key={mediaType}>\n <span style={{ color: \"var(--color-text-muted)\" }}>{mediaType}: </span>\n {getSchemaPreview(content.schema)}\n </div>\n )\n )}\n </div>\n </div>\n )}\n\n {/* Responses */}\n {details.responses && (\n <div>\n <h4 style={{ fontSize: 13, color: \"var(--color-text-secondary)\", marginBottom: 8 }}>\n Responses\n </h4>\n <div\n style={{\n background: \"var(--color-surface-raised)\",\n borderRadius: 4,\n padding: 12,\n }}\n >\n {Object.entries(details.responses).map(([code, resp]) => {\n const respContent = resp.content?.[\"application/json\"]?.schema;\n const schemaRef = respContent?.$ref?.split(\"/\").pop();\n const schemaType = respContent?.type;\n const schemaItems = respContent?.items?.$ref?.split(\"/\").pop();\n\n return (\n <div\n key={code}\n style={{\n marginBottom: 12,\n fontSize: 12,\n }}\n >\n <div style={{ display: \"flex\", gap: 12, marginBottom: 4 }}>\n <span\n style={{\n color: code.startsWith(\"2\") ? \"#49cc90\" : \"#f66\",\n minWidth: 40,\n }}\n >\n {code}\n </span>\n <span style={{ color: \"var(--color-text-secondary)\" }}>{resp.description}</span>\n </div>\n {respContent && (\n <div\n style={{\n marginLeft: 52,\n padding: \"8px 12px\",\n background: \"var(--color-bg)\",\n borderRadius: 4,\n fontFamily: \"monospace\",\n }}\n >\n {schemaRef ? (\n <span style={{ color: \"#61affe\" }}>{schemaRef}</span>\n ) : schemaType === \"array\" && schemaItems ? (\n <span style={{ color: \"#61affe\" }}>{schemaItems}[]</span>\n ) : schemaType === \"array\" ? (\n <span style={{ color: \"var(--color-text-secondary)\" }}>array</span>\n ) : (\n <span style={{ color: \"var(--color-text-secondary)\" }}>{getSchemaPreview(respContent)}</span>\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n {/* Try It Out */}\n <TryItOut\n method={method}\n path={path}\n parameters={details.parameters}\n requestBody={details.requestBody}\n authFetch={authFetch}\n />\n </div>\n )}\n </div>\n );\n })\n )}\n </div>\n\n {/* Schemas section */}\n {spec.components?.schemas && getFilteredSchemas().length > 0 && (\n <div style={{ marginTop: 32 }}>\n <h2 style={{ fontSize: 18, fontWeight: 600, marginBottom: 16 }}>\n Schemas {selectedTag && <span style={{ color: \"var(--color-text-muted)\", fontSize: 14 }}>({selectedTag})</span>}\n </h2>\n <div style={{ display: \"flex\", flexDirection: \"column\", gap: 8 }}>\n {getFilteredSchemas().map((name) => {\n const schema = spec.components!.schemas![name];\n if (!schema) return null;\n return (\n <div\n key={name}\n style={{\n border: \"1px solid var(--color-border-light)\",\n borderRadius: 6,\n padding: 12,\n }}\n >\n <h3 style={{ fontSize: 14, color: \"#61affe\", marginBottom: 8 }}>\n {name}\n </h3>\n {schema.properties && (\n <div style={{ fontSize: 12 }}>\n {Object.entries(schema.properties).map(([prop, propSchema]: [string, any]) => (\n <div\n key={prop}\n style={{\n display: \"flex\",\n gap: 8,\n marginBottom: 4,\n fontFamily: \"monospace\",\n }}\n >\n <span style={{ color: \"var(--color-text)\", minWidth: 120 }}>{prop}</span>\n <span style={{ color: \"var(--color-text-secondary)\" }}>\n {propSchema.type || (propSchema.$ref ? propSchema.$ref.split(\"/\").pop() : \"any\")}\n {propSchema.nullable && \" | null\"}\n </span>\n {propSchema.enum && (\n <span style={{ color: \"var(--color-text-muted)\" }}>\n [{propSchema.enum.join(\" | \")}]\n </span>\n )}\n </div>\n ))}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n )}\n </div>\n );\n}\n"
|
|
6
|
+
],
|
|
7
|
+
"mappings": "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",
|
|
8
|
+
"debugId": "59EEC8715E10AB6E64756E2164756E21",
|
|
9
|
+
"names": []
|
|
10
|
+
}
|