@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.
Files changed (94) hide show
  1. package/apteva +0 -0
  2. package/dist/ActivityPage.9v5ha2p7.js +3 -0
  3. package/dist/{ActivityPage.7907h64p.js.map → ActivityPage.9v5ha2p7.js.map} +3 -3
  4. package/dist/ApiDocsPage.qsehxvkb.js +4 -0
  5. package/dist/ApiDocsPage.qsehxvkb.js.map +10 -0
  6. package/dist/App.168av39e.js +221 -0
  7. package/dist/{App.qcknavjz.js.map → App.168av39e.js.map} +15 -15
  8. package/dist/App.2j20h2gt.js +8 -0
  9. package/dist/App.2j20h2gt.js.map +12 -0
  10. package/dist/App.7gj4jht5.js +53 -0
  11. package/dist/{App.apjrmctz.js.map → App.7gj4jht5.js.map} +50 -52
  12. package/dist/App.aexwv4rk.js +4 -0
  13. package/dist/App.aexwv4rk.js.map +10 -0
  14. package/dist/App.anvw0hjc.js +61 -0
  15. package/dist/App.anvw0hjc.js.map +13 -0
  16. package/dist/App.cjcyr5aj.js +4 -0
  17. package/dist/App.cjcyr5aj.js.map +10 -0
  18. package/dist/App.dmvykj97.js +4 -0
  19. package/dist/App.dmvykj97.js.map +10 -0
  20. package/dist/App.e2kkda2a.js +4 -0
  21. package/dist/App.e2kkda2a.js.map +10 -0
  22. package/dist/App.j4ec9k18.js +13 -0
  23. package/dist/App.j4ec9k18.js.map +10 -0
  24. package/dist/{App.7fb3e7mp.js → App.jdkx6eqd.js} +1 -1
  25. package/dist/App.kz3qyyre.js +4 -0
  26. package/dist/{App.myxqcj9x.js.map → App.kz3qyyre.js.map} +3 -3
  27. package/dist/App.sd685nt9.js +4 -0
  28. package/dist/App.sd685nt9.js.map +10 -0
  29. package/dist/App.shfd8tp9.js +20 -0
  30. package/dist/{App.3qw8nben.js.map → App.shfd8tp9.js.map} +6 -4
  31. package/dist/App.wghtdzsk.js +1 -0
  32. package/dist/App.x6x8s16g.js +4 -0
  33. package/dist/App.x6x8s16g.js.map +14 -0
  34. package/dist/App.y2vn8m06.js +4 -0
  35. package/dist/App.y2vn8m06.js.map +10 -0
  36. package/dist/ConnectionsPage.1dyyfqbk.js +3 -0
  37. package/dist/McpPage.xvr8hk05.js +3 -0
  38. package/dist/SettingsPage.5jmnefwe.js +3 -0
  39. package/dist/SkillsPage.jw7carjq.js +3 -0
  40. package/dist/TasksPage.r8txe0e9.js +3 -0
  41. package/dist/TasksPage.r8txe0e9.js.map +9 -0
  42. package/dist/TelemetryPage.pcafk41x.js +3 -0
  43. package/dist/TelemetryPage.pcafk41x.js.map +9 -0
  44. package/dist/TestsPage.pkymr7yt.js +3 -0
  45. package/dist/ThreadsPage.49tgq4fq.js +3 -0
  46. package/dist/apteva-kit.css +1 -1
  47. package/dist/index.html +1 -1
  48. package/dist/styles.css +1 -1
  49. package/package.json +1 -1
  50. package/dist/ActivityPage.7907h64p.js +0 -3
  51. package/dist/ApiDocsPage.k3jjenpq.js +0 -4
  52. package/dist/ApiDocsPage.k3jjenpq.js.map +0 -10
  53. package/dist/App.01nq20st.js +0 -4
  54. package/dist/App.01nq20st.js.map +0 -10
  55. package/dist/App.1maqvamf.js +0 -4
  56. package/dist/App.1maqvamf.js.map +0 -14
  57. package/dist/App.2yjrh32f.js +0 -4
  58. package/dist/App.2yjrh32f.js.map +0 -10
  59. package/dist/App.3qw8nben.js +0 -20
  60. package/dist/App.7sy3wq8c.js +0 -4
  61. package/dist/App.7sy3wq8c.js.map +0 -10
  62. package/dist/App.apjrmctz.js +0 -57
  63. package/dist/App.av6t2yhe.js +0 -4
  64. package/dist/App.av6t2yhe.js.map +0 -10
  65. package/dist/App.jqj5a094.js +0 -46
  66. package/dist/App.jqj5a094.js.map +0 -13
  67. package/dist/App.mc7xf85h.js +0 -4
  68. package/dist/App.mc7xf85h.js.map +0 -10
  69. package/dist/App.myxqcj9x.js +0 -4
  70. package/dist/App.nm91r1mp.js +0 -13
  71. package/dist/App.nm91r1mp.js.map +0 -10
  72. package/dist/App.p02f4ret.js +0 -1
  73. package/dist/App.qcknavjz.js +0 -221
  74. package/dist/App.vc7vfhg4.js +0 -4
  75. package/dist/App.vc7vfhg4.js.map +0 -10
  76. package/dist/App.z4s9zkw5.js +0 -4
  77. package/dist/App.z4s9zkw5.js.map +0 -10
  78. package/dist/ConnectionsPage.z1pw5xe2.js +0 -3
  79. package/dist/McpPage.8vc97z0b.js +0 -3
  80. package/dist/SettingsPage.p61bz8kd.js +0 -3
  81. package/dist/SkillsPage.r9x43g3g.js +0 -3
  82. package/dist/TasksPage.1e0zkye4.js +0 -3
  83. package/dist/TasksPage.1e0zkye4.js.map +0 -9
  84. package/dist/TelemetryPage.p9vbe4gf.js +0 -3
  85. package/dist/TelemetryPage.p9vbe4gf.js.map +0 -9
  86. package/dist/TestsPage.d4xy504e.js +0 -3
  87. package/dist/ThreadsPage.m016am3x.js +0 -3
  88. /package/dist/{App.7fb3e7mp.js.map → App.jdkx6eqd.js.map} +0 -0
  89. /package/dist/{ConnectionsPage.z1pw5xe2.js.map → ConnectionsPage.1dyyfqbk.js.map} +0 -0
  90. /package/dist/{McpPage.8vc97z0b.js.map → McpPage.xvr8hk05.js.map} +0 -0
  91. /package/dist/{SettingsPage.p61bz8kd.js.map → SettingsPage.5jmnefwe.js.map} +0 -0
  92. /package/dist/{SkillsPage.r9x43g3g.js.map → SkillsPage.jw7carjq.js.map} +0 -0
  93. /package/dist/{TestsPage.d4xy504e.js.map → TestsPage.pkymr7yt.js.map} +0 -0
  94. /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]\">&middot;</span>\n <span className=\"text-[#555]\">{evt.category}</span>\n {evt.duration_ms != null && evt.duration_ms > 0 && (\n <>\n <span className=\"text-[#333]\">&middot;</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)]\">&middot;</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)]\">&middot;</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": "7FD9FF2C4015E95064756E2164756E21",
7
+ "mappings": "2HAAA,sBAaM,EAAgB,IAAI,IAAI,CAC5B,kBACA,gBACA,gBACA,cACA,eACA,eACA,eACA,gBACA,cACA,kBACA,cACA,oBACF,CAAC,EAGK,EAA0C,CAC9C,KAAM,eACN,IAAK,gBACL,KAAM,cACN,KAAM,gBACN,OAAQ,cACR,IAAK,gBACL,OAAQ,cACR,MAAO,YACT,EAEA,SAAS,CAAa,CAAC,EAAqB,EAA2B,CACrE,IAAM,EAAO,EAAI,MAAQ,CAAC,EAC1B,OAAQ,EAAI,UACL,kBACH,OAAQ,EAAK,UAAuB,iBACjC,gBACH,MAAO,oBACJ,gBACH,OAAO,EAAK,OAAS,kBAAkB,EAAK,UAAY,oBACrD,cACH,OAAO,EAAI,OAAS,kBACjB,cACH,MAAO,kBACJ,kBAAmB,CACtB,IAAM,EAAW,EAAK,WAAa,GACnC,GAAI,CAAC,EAAS,MAAO,cAErB,MAAO,SADe,EAAQ,QAAQ,QAAS,GAAG,EAAE,QAAQ,QAAS,KAAK,EAAE,YAAY,CAAC,GAE3F,KACK,eACH,OAAO,EAAK,MAAQ,iBAAiB,EAAK,QAAU,mBACjD,eAAgB,CACnB,IAAoB,OAAd,EACa,MAAb,GAAQ,EACR,EAAc,EAAS,EAAO,OAAO,CAAC,EAAE,YAAY,EAAI,EAAO,MAAM,CAAC,EAAI,KAChF,GAAI,GAAS,EAAa,MAAO,QAAQ,MAAgB,IACzD,GAAI,EAAa,MAAO,QAAQ,IAChC,GAAI,EAAO,MAAO,iBAAiB,IACnC,MAAO,cACT,KACK,eACH,MAAO,mBACJ,gBAAiB,CACpB,IAAM,EAAQ,EAAK,MACnB,OAAO,EAAQ,iBAAiB,IAAU,cAC5C,KACK,gBACH,MAAO,oBACJ,mBACH,MAAO,uBACJ,cACH,OAAO,EAAK,OAAS,kBAAkB,EAAK,SAAW,kBACpD,qBAAsB,CACzB,IAAM,EAAW,EAAK,WAAa,EAAK,MAAQ,GAChD,GAAI,CAAC,EAAS,MAAO,gBAIrB,MAAO,SAFU,EAAQ,SAAS,IAAI,EAAI,EAAQ,MAAM,IAAI,EAAE,MAAM,CAAC,EAAE,KAAK,IAAI,EAAI,GACzD,QAAQ,QAAS,GAAG,EAAE,QAAQ,QAAS,KAAK,EAAE,YAAY,CAAC,GAExF,SAEE,OAAO,EAAI,KAAK,QAAQ,KAAM,GAAG,GAIhC,SAAS,CAAY,EAAG,SAAQ,UAAS,cAAiC,CAC/E,IAAQ,aAAc,EAAQ,GACtB,oBAAqB,EAAY,GACjC,OAAQ,EAAgB,uBAAwB,EAAoB,GACrE,EAAkB,GAAuB,WAA2B,CAAC,CAAC,GACtE,EAAe,GAAoB,WAAiB,EAAE,GACtD,GAAW,WAAS,IAAM,IAAI,GAAa,EAC5C,EAAmB,SAAO,EAAK,EAE/B,EAAiB,UAAQ,IAAM,CACnC,GAAI,IAAqB,KAAM,OAAO,EACtC,GAAI,IAAqB,aAAc,OAAO,EAAO,OAAO,KAAK,CAAC,EAAE,SAAS,EAC7E,OAAO,EAAO,OAAO,KAAK,EAAE,YAAc,CAAgB,GACzD,CAAC,EAAQ,CAAgB,CAAC,EAEvB,EAAW,UAAQ,IAAM,IAAI,IAAI,EAAe,IAAI,KAAK,EAAE,EAAE,CAAC,EAAG,CAAC,CAAc,CAAC,EACjF,EAAe,UAAQ,IAAM,CACjC,IAAM,EAAM,IAAI,IAEhB,OADA,EAAe,QAAQ,KAAK,EAAI,IAAI,EAAE,GAAI,EAAE,IAAI,CAAC,EAC1C,GACN,CAAC,CAAc,CAAC,EAGb,EAAe,cAAY,SAAY,CAC3C,IAAM,EAAe,EAAmB,eAAe,mBAAmB,CAAgB,IAAM,GAChG,GAAI,CACF,IAAM,EAAM,MAAM,EAAU,kCAAkC,GAAc,EAC5E,GAAI,EAAI,GAAI,CACV,IAAM,EAAO,MAAM,EAAI,KAAK,EAC5B,EAAoB,EAAK,QAAU,CAAC,CAAC,GAEvC,KAAM,IACP,CAAC,EAAW,CAAgB,CAAC,EAEhC,YAAU,IAAM,CACd,EAAa,GACZ,CAAC,EAAc,CAAmB,CAAC,EAGtC,YAAU,IAAM,CACd,GAAI,EAAiB,OAAS,GAAK,CAAC,EAAiB,QAAS,CAC5D,QAAW,KAAO,EAChB,EAAQ,IAAI,EAAI,EAAE,EAGpB,QAAW,KAAO,EAChB,EAAQ,IAAI,EAAI,EAAE,EAEpB,EAAiB,QAAU,KAE5B,CAAC,EAAkB,EAAgB,CAAO,CAAC,EAG9C,IAAM,EAAW,UAAQ,IAAM,CAC7B,IAAM,EAAO,IAAI,IACX,EAA2B,CAAC,EAE5B,EAAa,CAAC,IAAwB,CAC1C,GAAI,CAAC,EAAc,IAAI,EAAI,IAAI,GAAK,CAAC,EAAS,IAAI,EAAI,QAAQ,GAAK,EAAI,MAAM,UAAW,MAAO,GAE/F,GAAI,EAAI,OAAS,sBAAwB,CAAC,EAAI,YAAa,MAAO,GAClE,MAAO,IAGT,QAAW,KAAO,EAChB,GAAI,CAAC,EAAK,IAAI,EAAI,EAAE,GAAK,EAAW,CAAG,EACrC,EAAO,KAAK,CAAG,EACf,EAAK,IAAI,EAAI,EAAE,EAGnB,QAAW,KAAO,EAChB,GAAI,CAAC,EAAK,IAAI,EAAI,EAAE,GAAK,EAAW,CAAG,EACrC,EAAO,KAAK,CAAG,EACf,EAAK,IAAI,EAAI,EAAE,EAInB,IAAI,EAAW,EACf,GAAI,EACF,EAAW,EAAS,OAAO,KAAK,EAAE,WAAa,CAAa,EAI9D,OADA,EAAS,KAAK,CAAC,EAAG,IAAM,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,EAAI,IAAI,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,EAClF,EAAS,MAAM,EAAG,GAAG,GAC3B,CAAC,EAAgB,EAAkB,EAAU,CAAa,CAAC,EAGxD,EAAkB,UAAQ,IAAM,CACpC,IAAM,EAAwD,CAAC,EAC3D,EAAe,GACb,EAAQ,IAAI,KAAK,EAAE,aAAa,EAChC,EAAY,IAAI,KAAK,KAAK,IAAI,EAAI,QAAQ,EAAE,aAAa,EAE/D,QAAW,KAAO,EAAU,CAC1B,IAAM,EAAU,IAAI,KAAK,EAAI,SAAS,EAAE,aAAa,EAC/C,EAAQ,IAAY,EAAQ,QAAU,IAAY,EAAY,YAAc,EAClF,GAAI,IAAU,EACZ,EAAe,EACf,EAAO,KAAK,CAAE,QAAO,OAAQ,CAAC,CAAE,CAAC,EAEnC,EAAO,EAAO,OAAS,GAAG,OAAO,KAAK,CAAG,EAE3C,OAAO,GACN,CAAC,CAAQ,CAAC,EAEb,GAAI,EACF,OAAO,SAAoG,MAApG,CAAK,UAAU,yEAAf,4CAAoG,EAG7G,IAAM,EAAe,EAAe,OAAO,KAAK,EAAE,SAAW,SAAS,EAAE,OAExE,OACE,SA4FE,MA5FF,CAAK,UAAU,uCAAf,SA4FE,CA1FA,SAoBE,MApBF,CAAK,UAAU,0BAAf,SACE,SAkBE,MAlBF,CAAK,UAAU,0CAAf,SAkBE,CAjBA,SAKE,MALF,UAKE,CAJA,SAAgD,KAAhD,CAAI,UAAU,wBAAd,0CAAgD,EAChD,SAEE,IAFF,CAAG,UAAU,gDAAb,SAEE,CADC,EADH,OACqB,EAAe,OADpC,yCAEE,IAJJ,qBAKE,EACF,SAUE,MAVF,CAAK,UAAU,OAAf,SACE,SAAC,EAAD,CACE,MAAO,EACP,SAAU,EACV,YAAY,aACZ,QAAS,CACP,CAAE,MAAO,GAAI,MAAO,YAAa,EACjC,GAAG,EAAe,IAAI,MAAM,CAAE,MAAO,EAAE,GAAI,MAAO,EAAE,IAAK,EAAE,CAC7D,GAPF,qBAQA,GATF,qBAUE,IAjBJ,qBAkBE,GAnBJ,qBAoBE,EAGF,SAkEE,MAlEF,CAAK,UAAU,iCAAf,SACG,EAAS,SAAW,EACnB,SAGE,MAHF,CAAK,UAAU,iFAAf,SAGE,CAFA,SAA6C,IAA7C,CAAG,UAAU,eAAb,iDAA6C,EAC7C,SAAsE,IAAtE,CAAG,UAAU,UAAb,+EAAsE,IAFxE,qBAGE,EAEF,SAyDE,MAzDF,CAAK,UAAU,YAAf,SACG,EAAgB,IAAI,KACnB,SAqDE,MArDF,UAqDE,CAnDA,SAIE,MAJF,CAAK,UAAU,oEAAf,SACE,SAEE,OAFF,CAAM,UAAU,gFAAhB,SACG,EAAM,OADT,qBAEE,GAHJ,qBAIE,EAGF,SA2CE,MA3CF,CAAK,UAAU,sDAAf,SACG,EAAM,OAAO,IAAI,KAAO,CACvB,IAAM,EAAQ,CAAC,EAAQ,IAAI,EAAI,EAAE,EACjC,GAAI,EAAO,EAAQ,IAAI,EAAI,EAAE,EAC7B,IAAM,EAAY,EAAa,IAAI,EAAI,QAAQ,GAAK,EAAI,SAAS,MAAM,EAAG,CAAC,EACrE,EAAW,EAAI,QAAU,QAC3B,aACA,EAAgB,EAAI,WAAa,+BAErC,OACE,SA8BE,MA9BF,CAEE,UAAW,qFACT,EAAQ,kBAAoB,KAHhC,SA8BE,CAvBA,SAAC,OAAD,CAAM,UAAW,kEAAkE,2BAAnF,qBAAqH,EAErH,SAoBE,MApBF,CAAK,UAAU,yCAAf,SAoBE,CAnBA,SAeE,MAfF,CAAK,UAAU,iBAAf,SAeE,CAdA,SAEE,IAFF,CAAG,UAAW,WAAW,EAAI,QAAU,QAAU,eAAiB,KAAlE,SACG,EAAc,EAAK,CAAS,GAD/B,qBAEE,EACF,SAUE,MAVF,CAAK,UAAU,4EAAf,SAUE,CATA,SAA8E,OAA9E,CAAM,UAAU,iDAAhB,SAAkE,GAAlE,qBAA8E,EAC9E,SAA6D,OAA7D,CAAM,UAAU,mCAAhB,mCAA6D,EAC7D,SAAiE,OAAjE,CAAM,UAAU,iCAAhB,SAAkD,EAAI,UAAtD,qBAAiE,EAChE,EAAI,aAAe,MAAQ,EAAI,YAAc,GAC5C,8BAGE,CAFA,SAA6D,OAA7D,CAAM,UAAU,mCAAhB,mCAA6D,EAC7D,SAAqG,OAArG,UAAO,EAAI,YAAc,KAAO,GAAG,EAAI,gBAAkB,IAAI,EAAI,YAAc,MAAM,QAAQ,CAAC,MAA9F,qBAAqG,IAFvG,qBAGE,IARN,qBAUE,IAdJ,qBAeE,EACF,SAEE,OAFF,CAAM,UAAU,6DAAhB,SACG,EAAQ,EAAI,SAAS,GADxB,qBAEE,IAnBJ,qBAoBE,IA5BG,EAAI,GADX,cA8BE,EAEL,GA1CH,qBA2CE,IApDM,EAAM,MAAhB,cAqDE,CACH,GAxDH,qBAyDE,GAhEN,qBAkEE,IA3FJ,qBA4FE,EAIN,SAAS,CAAO,CAAC,EAA2B,CAC1C,IAAM,EAAU,KAAK,OAAO,KAAK,IAAI,EAAI,IAAI,KAAK,CAAS,EAAE,QAAQ,GAAK,IAAI,EAC9E,GAAI,EAAU,EAAG,MAAO,WACxB,GAAI,EAAU,GAAI,MAAO,GAAG,SAC5B,IAAM,EAAU,KAAK,MAAM,EAAU,EAAE,EACvC,GAAI,EAAU,GAAI,MAAO,GAAG,SAC5B,IAAM,EAAQ,KAAK,MAAM,EAAU,EAAE,EACrC,GAAI,EAAQ,GAAI,MAAO,GAAG,SAE1B,MAAO,GADM,KAAK,MAAM,EAAQ,EAAE",
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
+ }