@winspan/claude-forge 8.35.0 → 8.36.0

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 (80) hide show
  1. package/dist/core/ai/provider.d.ts +23 -1
  2. package/dist/core/ai/provider.d.ts.map +1 -1
  3. package/dist/core/ai/provider.js +67 -1
  4. package/dist/core/ai/provider.js.map +1 -1
  5. package/dist/core/ai/types.d.ts +28 -0
  6. package/dist/core/ai/types.d.ts.map +1 -1
  7. package/dist/daemon/handlers/user-prompt.d.ts.map +1 -1
  8. package/dist/daemon/handlers/user-prompt.js +25 -3
  9. package/dist/daemon/handlers/user-prompt.js.map +1 -1
  10. package/dist/daemon/index.d.ts.map +1 -1
  11. package/dist/daemon/index.js +6 -2
  12. package/dist/daemon/index.js.map +1 -1
  13. package/dist/engine/agent-router.d.ts +37 -0
  14. package/dist/engine/agent-router.d.ts.map +1 -1
  15. package/dist/engine/agent-router.js +58 -0
  16. package/dist/engine/agent-router.js.map +1 -1
  17. package/dist/engine/conventions/routing.yaml +31 -2
  18. package/dist/intelligence/classifier.d.ts +63 -43
  19. package/dist/intelligence/classifier.d.ts.map +1 -1
  20. package/dist/intelligence/classifier.js +256 -191
  21. package/dist/intelligence/classifier.js.map +1 -1
  22. package/dist/intelligence/context-gatherer.d.ts +101 -0
  23. package/dist/intelligence/context-gatherer.d.ts.map +1 -0
  24. package/dist/intelligence/context-gatherer.js +417 -0
  25. package/dist/intelligence/context-gatherer.js.map +1 -0
  26. package/dist/intelligence/cot-classifier.d.ts +95 -0
  27. package/dist/intelligence/cot-classifier.d.ts.map +1 -0
  28. package/dist/intelligence/cot-classifier.js +391 -0
  29. package/dist/intelligence/cot-classifier.js.map +1 -0
  30. package/dist/intelligence/execution-doc-builder.d.ts +90 -0
  31. package/dist/intelligence/execution-doc-builder.d.ts.map +1 -1
  32. package/dist/intelligence/execution-doc-builder.js +459 -42
  33. package/dist/intelligence/execution-doc-builder.js.map +1 -1
  34. package/dist/intelligence/intent-types.d.ts +13 -0
  35. package/dist/intelligence/intent-types.d.ts.map +1 -0
  36. package/dist/intelligence/intent-types.js +19 -0
  37. package/dist/intelligence/intent-types.js.map +1 -0
  38. package/dist/intelligence/multimodal-parser.d.ts +105 -0
  39. package/dist/intelligence/multimodal-parser.d.ts.map +1 -0
  40. package/dist/intelligence/multimodal-parser.js +425 -0
  41. package/dist/intelligence/multimodal-parser.js.map +1 -0
  42. package/dist/web/static/assets/{AIConfig-DiUFET_Q.js → AIConfig-D4VglzCl.js} +2 -2
  43. package/dist/web/static/assets/{AIConfig-DiUFET_Q.js.map → AIConfig-D4VglzCl.js.map} +1 -1
  44. package/dist/web/static/assets/{Agents-bNNGbQnL.js → Agents-ne5lXc7V.js} +2 -2
  45. package/dist/web/static/assets/{Agents-bNNGbQnL.js.map → Agents-ne5lXc7V.js.map} +1 -1
  46. package/dist/web/static/assets/Dashboard-D4j0Zmek.js +2 -0
  47. package/dist/web/static/assets/Dashboard-D4j0Zmek.js.map +1 -0
  48. package/dist/web/static/assets/{Drawer-DOUcx6m1.js → Drawer-Lo5ihVP-.js} +2 -2
  49. package/dist/web/static/assets/{Drawer-DOUcx6m1.js.map → Drawer-Lo5ihVP-.js.map} +1 -1
  50. package/dist/web/static/assets/{Events-DQHP6Uaq.js → Events-DBJ1B7OW.js} +2 -2
  51. package/dist/web/static/assets/{Events-DQHP6Uaq.js.map → Events-DBJ1B7OW.js.map} +1 -1
  52. package/dist/web/static/assets/{ExecutionTrace-Co8ARdg-.js → ExecutionTrace-Du9XADc1.js} +2 -2
  53. package/dist/web/static/assets/{ExecutionTrace-Co8ARdg-.js.map → ExecutionTrace-Du9XADc1.js.map} +1 -1
  54. package/dist/web/static/assets/{Routing-BW3eGD-8.js → Routing-BNQ09OlH.js} +2 -2
  55. package/dist/web/static/assets/{Routing-BW3eGD-8.js.map → Routing-BNQ09OlH.js.map} +1 -1
  56. package/dist/web/static/assets/{SessionDetail-Cbd7Jwox.js → SessionDetail-BPrPyMNa.js} +2 -2
  57. package/dist/web/static/assets/{SessionDetail-Cbd7Jwox.js.map → SessionDetail-BPrPyMNa.js.map} +1 -1
  58. package/dist/web/static/assets/{Sessions-ZQSCgXyy.js → Sessions-o3EXsXz9.js} +2 -2
  59. package/dist/web/static/assets/{Sessions-ZQSCgXyy.js.map → Sessions-o3EXsXz9.js.map} +1 -1
  60. package/dist/web/static/assets/{Skills-C5-5zOSH.js → Skills-Czt5mkyc.js} +2 -2
  61. package/dist/web/static/assets/{Skills-C5-5zOSH.js.map → Skills-Czt5mkyc.js.map} +1 -1
  62. package/dist/web/static/assets/{export-CbQTOt71.js → export-C0mlC4AT.js} +2 -2
  63. package/dist/web/static/assets/{export-CbQTOt71.js.map → export-C0mlC4AT.js.map} +1 -1
  64. package/dist/web/static/assets/index-B1J7nBu0.js +3 -0
  65. package/dist/web/static/assets/index-B1J7nBu0.js.map +1 -0
  66. package/dist/web/static/assets/index-BVqk4bSO.css +1 -0
  67. package/dist/web/static/assets/{lucide-BanPULT1.js → lucide-Bu44HVAM.js} +33 -73
  68. package/dist/web/static/assets/lucide-Bu44HVAM.js.map +1 -0
  69. package/dist/web/static/index.html +3 -3
  70. package/package.json +1 -1
  71. package/dist/web/static/assets/Dashboard-Ciyyw6ph.js +0 -2
  72. package/dist/web/static/assets/Dashboard-Ciyyw6ph.js.map +0 -1
  73. package/dist/web/static/assets/Methodologies-CXNrDXwG.js +0 -5
  74. package/dist/web/static/assets/Methodologies-CXNrDXwG.js.map +0 -1
  75. package/dist/web/static/assets/MethodologyDetail-rV3W1utf.js +0 -2
  76. package/dist/web/static/assets/MethodologyDetail-rV3W1utf.js.map +0 -1
  77. package/dist/web/static/assets/index-DJK5beK6.js +0 -3
  78. package/dist/web/static/assets/index-DJK5beK6.js.map +0 -1
  79. package/dist/web/static/assets/index-phpuytMI.css +0 -1
  80. package/dist/web/static/assets/lucide-BanPULT1.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"Methodologies-CXNrDXwG.js","sources":["../../src/pages/Methodologies.tsx"],"sourcesContent":["import { useQuery, useMutation, useQueryClient } from '@tanstack/react-query'\nimport { Link, useNavigate } from 'react-router-dom'\nimport { useState } from 'react'\nimport { formatDistanceToNow } from 'date-fns'\nimport { zhCN } from 'date-fns/locale'\nimport { GitBranch, Clock, CheckCircle, AlertCircle, XCircle, Trash2, StopCircle, Plus, Monitor, Cpu, AlertTriangle } from 'lucide-react'\nimport clsx from 'clsx'\nimport { useToast } from '../components/Toast'\nimport { useConfirm } from '../components/Confirm'\nimport { authFetch } from '../utils/auth'\n\ninterface MethodologyExecution {\n id: number\n session_id: string\n methodology_id: string\n plan_json: string\n current_phase_index: number\n status: 'running' | 'completed' | 'failed' | 'cancelled'\n mode?: 'foreground' | 'background'\n worker_pid?: number | null\n worker_session_id?: string | null\n started_at: number\n completed_at: number | null\n}\n\ninterface MethodologyMeta {\n id: string\n name: string\n description?: string\n}\n\ninterface WorkerAuthStatus {\n available: boolean\n method: 'api-key-env' | 'oauth-token' | 'keychain' | 'unknown' | 'none'\n message: string\n}\n\nasync function fetchMethodologyExecutions(): Promise<MethodologyExecution[]> {\n const res = await fetch('/api/methodology-executions?limit=50')\n if (!res.ok) throw new Error('Failed to fetch')\n return res.json()\n}\n\nasync function fetchMethodologies(): Promise<MethodologyMeta[]> {\n const res = await fetch('/api/methodologies')\n if (!res.ok) throw new Error('Failed to fetch methodologies')\n return res.json()\n}\n\nasync function fetchWorkerAuthStatus(): Promise<WorkerAuthStatus> {\n const res = await fetch('/api/worker-auth-status')\n if (!res.ok) throw new Error('Failed to fetch worker auth status')\n return res.json()\n}\n\nasync function cancelExecution(id: number): Promise<void> {\n const res = await authFetch(`/api/methodology-executions/${id}/cancel`, { method: 'POST' })\n if (!res.ok) {\n const data = await res.json().catch(() => ({}))\n throw new Error(data.error || 'Cancel failed')\n }\n}\n\nasync function deleteExecution(id: number): Promise<void> {\n const res = await authFetch(`/api/methodology-executions/${id}`, { method: 'DELETE' })\n if (!res.ok) throw new Error('Delete failed')\n}\n\nasync function startExecution(payload: {\n session_id: string\n methodology_id: string\n mode: 'foreground' | 'background'\n}): Promise<{ id: number }> {\n const res = await authFetch('/api/methodology-executions', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n if (!res.ok) {\n const data = await res.json().catch(() => ({}))\n const err = new Error(data.error || `Start failed (HTTP ${res.status})`) as Error & { code?: string }\n if (typeof data.code === 'string') err.code = data.code\n throw err\n }\n return res.json()\n}\n\nconst methodologyNames: Record<string, string> = {\n 'harness-engineering': 'Harness Engineering',\n 'bmad': 'BMad (敏捷开发)',\n}\n\nexport default function Methodologies() {\n const queryClient = useQueryClient()\n const toast = useToast()\n const confirm = useConfirm()\n const navigate = useNavigate()\n const [showStart, setShowStart] = useState(false)\n\n const { data: executions, isLoading, error } = useQuery({\n queryKey: ['methodology-executions'],\n queryFn: fetchMethodologyExecutions,\n refetchInterval: 5000,\n })\n\n const { data: methodologies } = useQuery({\n queryKey: ['methodologies'],\n queryFn: fetchMethodologies,\n })\n\n const { data: authStatus } = useQuery({\n queryKey: ['worker-auth-status'],\n queryFn: fetchWorkerAuthStatus,\n // 只在打开 Modal 时或进入页面时查一次;后续可手动刷新\n staleTime: 30_000,\n })\n\n const cancelMutation = useMutation({\n mutationFn: cancelExecution,\n onSuccess: () => {\n toast.success('方法论执行已取消')\n queryClient.invalidateQueries({ queryKey: ['methodology-executions'] })\n },\n onError: (e: Error) => toast.error(`取消失败: ${e.message}`),\n })\n\n const deleteMutation = useMutation({\n mutationFn: deleteExecution,\n onSuccess: () => {\n toast.success('记录已删除')\n queryClient.invalidateQueries({ queryKey: ['methodology-executions'] })\n },\n onError: (e: Error) => toast.error(`删除失败: ${e.message}`),\n })\n\n const startMutation = useMutation({\n mutationFn: startExecution,\n onSuccess: (data) => {\n toast.success(`已启动执行 #${data.id}`)\n setShowStart(false)\n queryClient.invalidateQueries({ queryKey: ['methodology-executions'] })\n // 成功启动后顺手刷新 auth 状态(虽然理论上没变,但保持一致)\n queryClient.invalidateQueries({ queryKey: ['worker-auth-status'] })\n },\n onError: async (e: Error & { code?: string }) => {\n const msg = e.message || ''\n const isAuthError =\n e.code === 'AUTH_REQUIRED' ||\n msg.includes('Background mode requires') ||\n msg.includes('AUTH_REQUIRED')\n if (isAuthError) {\n // 提前刷一下认证状态,确保 Modal 下次打开时 banner 即时更新\n queryClient.invalidateQueries({ queryKey: ['worker-auth-status'] })\n const go = await confirm({\n title: '需要配置 Claude API',\n message:\n '后台模式需要 Claude API 认证(ANTHROPIC_API_KEY 或 OAuth)。\\n' +\n '请先在 AI 配置页设置后再启动执行。\\n\\n' +\n `详细信息:${msg}`,\n confirmText: '去 AI 配置',\n cancelText: '留在此页',\n variant: 'warning',\n })\n if (go) {\n setShowStart(false)\n navigate('/ai-config')\n }\n return\n }\n toast.error(`启动失败: ${msg}`)\n },\n })\n\n const handleCancel = async (id: number) => {\n const ok = await confirm({\n title: '取消方法论执行',\n message: '确定要取消这个运行中的方法论吗?已完成的阶段不会受影响,但当前进行中的阶段将停止。',\n confirmText: '确认取消',\n variant: 'warning',\n })\n if (ok) cancelMutation.mutate(id)\n }\n\n const handleDelete = async (id: number) => {\n const ok = await confirm({\n title: '删除执行记录',\n message: '确定要删除这条方法论执行记录吗?此操作不可恢复。',\n confirmText: '删除',\n variant: 'danger',\n })\n if (ok) deleteMutation.mutate(id)\n }\n\n if (isLoading) {\n return (\n <div>\n <h1 className=\"text-2xl font-bold text-gray-900 mb-6\">方法论执行</h1>\n <div className=\"bg-white rounded-lg shadow p-6\">\n <p className=\"text-gray-600\">加载中...</p>\n </div>\n </div>\n )\n }\n\n if (error) {\n return (\n <div>\n <h1 className=\"text-2xl font-bold text-gray-900 mb-6\">方法论执行</h1>\n <div className=\"bg-white rounded-lg shadow p-6\">\n <p className=\"text-red-600\">加载失败: {(error as Error).message}</p>\n </div>\n </div>\n )\n }\n\n const runningCount = executions?.filter(e => e.status === 'running').length || 0\n const completedCount = executions?.filter(e => e.status === 'completed').length || 0\n\n return (\n <div>\n <div className=\"flex items-center justify-between mb-6\">\n <h1 className=\"text-2xl font-bold text-gray-900\">方法论执行</h1>\n <div className=\"flex items-center gap-4 text-sm\">\n <span className=\"text-gray-500\">共 {executions?.length || 0} 个实例</span>\n {runningCount > 0 && <span className=\"text-blue-600\">· 运行中 {runningCount}</span>}\n {completedCount > 0 && <span className=\"text-green-600\">· 已完成 {completedCount}</span>}\n <button\n onClick={() => setShowStart(true)}\n className=\"ml-3 inline-flex items-center gap-1 px-3 py-1.5 text-sm bg-indigo-600 text-white rounded-md hover:bg-indigo-700\"\n >\n <Plus className=\"h-4 w-4\" /> 新建执行\n </button>\n </div>\n </div>\n\n {showStart && (\n <StartExecutionModal\n methodologies={methodologies ?? []}\n authStatus={authStatus ?? null}\n onCancel={() => setShowStart(false)}\n onSubmit={(payload) => startMutation.mutate(payload)}\n onGoToAIConfig={() => {\n setShowStart(false)\n navigate('/ai-config')\n }}\n submitting={startMutation.isPending}\n />\n )}\n\n <div className=\"space-y-4\">\n {executions?.map((execution) => {\n const plan = JSON.parse(execution.plan_json)\n const currentPhase = plan.phases[execution.current_phase_index]\n const progress = execution.status === 'completed'\n ? 100\n : Math.round((execution.current_phase_index / plan.phases.length) * 100)\n\n return (\n <div key={execution.id} className=\"bg-white rounded-lg shadow\">\n <div className=\"p-6 flex items-start justify-between gap-4\">\n <Link to={`/methodologies/${execution.id}`} className=\"flex-1 min-w-0\">\n <div className=\"flex items-center gap-3 mb-2\">\n <GitBranch className=\"h-5 w-5 text-indigo-600 flex-shrink-0\" />\n <h3 className=\"text-lg font-semibold text-gray-900\">\n {methodologyNames[execution.methodology_id] || execution.methodology_id}\n </h3>\n <span className={clsx(\n 'px-2 py-1 text-xs font-medium rounded-full',\n execution.status === 'running' && 'bg-blue-100 text-blue-700',\n execution.status === 'completed' && 'bg-green-100 text-green-700',\n execution.status === 'failed' && 'bg-red-100 text-red-700',\n execution.status === 'cancelled' && 'bg-gray-100 text-gray-600'\n )}>\n {execution.status === 'running' && '运行中'}\n {execution.status === 'completed' && '已完成'}\n {execution.status === 'failed' && '失败'}\n {execution.status === 'cancelled' && '已取消'}\n </span>\n {execution.mode && (\n <span\n className={clsx(\n 'inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-full',\n execution.mode === 'background'\n ? 'bg-purple-100 text-purple-700'\n : 'bg-sky-100 text-sky-700'\n )}\n title={execution.mode === 'background' ? '独立 claude -p 子进程' : '主会话内执行'}\n >\n {execution.mode === 'background' ? <Cpu className=\"h-3 w-3\" /> : <Monitor className=\"h-3 w-3\" />}\n {execution.mode === 'background' ? '后台' : '前台'}\n </span>\n )}\n </div>\n\n <p className=\"text-sm text-gray-600 mb-3 font-mono\">\n Session: {execution.session_id.slice(0, 12)}...\n </p>\n\n {/* Progress bar */}\n <div className=\"w-full bg-gray-200 rounded-full h-1.5 mb-3\">\n <div\n className={clsx(\n 'h-1.5 rounded-full transition-all',\n execution.status === 'completed' ? 'bg-green-500' :\n execution.status === 'cancelled' ? 'bg-gray-400' : 'bg-indigo-600'\n )}\n style={{ width: `${progress}%` }}\n />\n </div>\n\n <div className=\"flex items-center gap-4 text-sm text-gray-500\">\n <div className=\"flex items-center gap-1\">\n <Clock className=\"h-4 w-4\" />\n {formatDistanceToNow(execution.started_at, { addSuffix: true, locale: zhCN })}\n </div>\n {execution.status === 'running' && currentPhase && (\n <div className=\"flex items-center gap-1\">\n <AlertCircle className=\"h-4 w-4\" />\n Phase {execution.current_phase_index + 1}/{plan.phases.length}: {currentPhase.id}\n </div>\n )}\n {execution.status === 'completed' && (\n <div className=\"flex items-center gap-1 text-green-600\">\n <CheckCircle className=\"h-4 w-4\" />\n 完成 {plan.phases.length} 个阶段\n </div>\n )}\n {execution.status === 'cancelled' && (\n <div className=\"flex items-center gap-1 text-gray-500\">\n <XCircle className=\"h-4 w-4\" />\n 已取消于 Phase {execution.current_phase_index + 1}\n </div>\n )}\n </div>\n </Link>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1 flex-shrink-0\">\n {execution.status === 'running' && (\n <button\n onClick={(e) => {\n e.preventDefault()\n handleCancel(execution.id)\n }}\n className=\"p-2 text-orange-600 hover:bg-orange-50 rounded-md\"\n title=\"取消执行\"\n >\n <StopCircle className=\"h-4 w-4\" />\n </button>\n )}\n {execution.status !== 'running' && (\n <button\n onClick={(e) => { e.preventDefault(); handleDelete(execution.id) }}\n className=\"p-2 text-gray-500 hover:bg-red-50 hover:text-red-600 rounded-md\"\n title=\"删除记录\"\n >\n <Trash2 className=\"h-4 w-4\" />\n </button>\n )}\n </div>\n </div>\n </div>\n )\n })}\n\n {(!executions || executions.length === 0) && (\n <div className=\"bg-white rounded-lg shadow p-12 text-center\">\n <GitBranch className=\"h-12 w-12 text-gray-400 mx-auto mb-4\" />\n <p className=\"text-gray-600\">暂无方法论执行记录</p>\n <p className=\"text-xs text-gray-500 mt-2\">\n 当你输入复杂任务(如\"重构 XXX 模块\")时,系统会自动匹配方法论并生成执行计划\n </p>\n </div>\n )}\n </div>\n </div>\n )\n}\n\ninterface StartExecutionModalProps {\n methodologies: MethodologyMeta[]\n authStatus: WorkerAuthStatus | null\n submitting: boolean\n onSubmit: (payload: { session_id: string; methodology_id: string; mode: 'foreground' | 'background' }) => void\n onCancel: () => void\n onGoToAIConfig: () => void\n}\n\nfunction StartExecutionModal({ methodologies, authStatus, submitting, onSubmit, onCancel, onGoToAIConfig }: StartExecutionModalProps) {\n const defaultSession = `manual-${Date.now().toString(36)}`\n const [sessionId, setSessionId] = useState(defaultSession)\n const [methodologyId, setMethodologyId] = useState(methodologies[0]?.id ?? '')\n const [mode, setMode] = useState<'foreground' | 'background'>('background')\n\n const authMissing = authStatus !== null && authStatus.available === false\n const blockedByAuth = authMissing && mode === 'background'\n\n const submit = (e: React.FormEvent) => {\n e.preventDefault()\n if (!sessionId.trim() || !methodologyId) return\n if (blockedByAuth) return\n onSubmit({ session_id: sessionId.trim(), methodology_id: methodologyId, mode })\n }\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4\">\n <form\n onSubmit={submit}\n className=\"w-full max-w-md bg-white rounded-lg shadow-xl border border-gray-200\"\n >\n <div className=\"px-5 py-4 border-b border-gray-100\">\n <h2 className=\"text-lg font-semibold text-gray-900\">新建方法论执行</h2>\n <p className=\"text-xs text-gray-500 mt-0.5\">选择方法论模板和执行模式</p>\n </div>\n\n <div className=\"px-5 py-4 space-y-4 text-sm\">\n <label className=\"block\">\n <span className=\"text-gray-700\">方法论</span>\n <select\n className=\"mt-1 w-full border border-gray-300 rounded-md px-2 py-1.5\"\n value={methodologyId}\n onChange={(e) => setMethodologyId(e.target.value)}\n required\n >\n {methodologies.length === 0 && <option value=\"\">(未发现方法论)</option>}\n {methodologies.map(m => (\n <option key={m.id} value={m.id}>{m.name || m.id}</option>\n ))}\n </select>\n </label>\n\n <label className=\"block\">\n <span className=\"text-gray-700\">Session ID</span>\n <input\n type=\"text\"\n className=\"mt-1 w-full border border-gray-300 rounded-md px-2 py-1.5 font-mono text-xs\"\n value={sessionId}\n onChange={(e) => setSessionId(e.target.value)}\n required\n />\n <span className=\"mt-1 block text-xs text-gray-500\">\n 后台模式下用于追踪;建议保留默认或自定义一个可识别值\n </span>\n </label>\n\n <div>\n <span className=\"text-gray-700\">执行模式</span>\n <div className=\"mt-2 grid grid-cols-2 gap-2\">\n <button\n type=\"button\"\n onClick={() => setMode('background')}\n className={clsx(\n 'rounded-md border px-3 py-2 text-left',\n mode === 'background'\n ? 'border-indigo-500 bg-indigo-50'\n : 'border-gray-200 hover:border-gray-300',\n authMissing && 'ring-1 ring-amber-200'\n )}\n >\n <div className=\"flex items-center gap-2 font-medium text-gray-900\">\n <Cpu className=\"h-4 w-4 text-purple-600\" /> 后台\n {authMissing && (\n <span className=\"ml-auto text-[10px] font-normal text-amber-700 bg-amber-100 px-1.5 py-0.5 rounded\">\n 需先配置 API\n </span>\n )}\n </div>\n <p className=\"text-xs text-gray-500 mt-1\">\n 独立 claude -p 子进程,无需用户在主会话输入\n </p>\n </button>\n <button\n type=\"button\"\n onClick={() => setMode('foreground')}\n className={clsx(\n 'rounded-md border px-3 py-2 text-left',\n mode === 'foreground'\n ? 'border-indigo-500 bg-indigo-50'\n : 'border-gray-200 hover:border-gray-300'\n )}\n >\n <div className=\"flex items-center gap-2 font-medium text-gray-900\">\n <Monitor className=\"h-4 w-4 text-sky-600\" /> 前台\n </div>\n <p className=\"text-xs text-amber-700 mt-1 flex items-start gap-1\">\n <AlertTriangle className=\"h-3.5 w-3.5 mt-0.5 shrink-0\" />\n <span>需要你在主会话里输入任意内容才会推进;期间可用 <code className=\"px-1 rounded bg-amber-50\">/forge methodology status</code> 查看</span>\n </p>\n </button>\n </div>\n </div>\n\n {blockedByAuth && (\n <div className=\"rounded-md border border-amber-300 bg-amber-50 px-3 py-2 text-xs text-amber-800\">\n <div className=\"flex items-start gap-2\">\n <AlertTriangle className=\"h-4 w-4 mt-0.5 shrink-0 text-amber-600\" />\n <div className=\"flex-1 space-y-1\">\n <div className=\"font-medium\">后台模式需要 Claude API 认证</div>\n <div className=\"text-amber-700\">\n 未检测到 <code className=\"px-1 rounded bg-amber-100\">ANTHROPIC_API_KEY</code> 或 OAuth 凭据\n {authStatus?.message ? `(${authStatus.message})` : ''}。\n 请先在 AI 配置页完成设置,或切换到前台模式。\n </div>\n <button\n type=\"button\"\n onClick={onGoToAIConfig}\n className=\"mt-1 inline-flex items-center gap-1 px-2 py-1 text-xs font-medium text-white bg-amber-600 rounded hover:bg-amber-700\"\n >\n 去 AI 配置\n </button>\n </div>\n </div>\n </div>\n )}\n </div>\n\n <div className=\"px-5 py-3 border-t border-gray-100 flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={onCancel}\n className=\"px-3 py-1.5 text-sm text-gray-700 hover:bg-gray-100 rounded-md\"\n >\n 取消\n </button>\n <button\n type=\"submit\"\n disabled={submitting || !methodologyId || blockedByAuth}\n title={blockedByAuth ? '后台模式需要先配置 Claude API' : undefined}\n className=\"inline-flex items-center gap-1 px-3 py-1.5 text-sm bg-indigo-600 text-white rounded-md hover:bg-indigo-700 disabled:opacity-50 disabled:cursor-not-allowed\"\n >\n {submitting ? '启动中...' : '启动'}\n </button>\n </div>\n </form>\n </div>\n )\n}\n"],"names":["fetchMethodologyExecutions","res","fetchMethodologies","fetchWorkerAuthStatus","cancelExecution","id","authFetch","data","deleteExecution","startExecution","payload","err","methodologyNames","Methodologies","queryClient","useQueryClient","toast","useToast","confirm","useConfirm","navigate","useNavigate","showStart","setShowStart","useState","executions","isLoading","error","useQuery","methodologies","authStatus","cancelMutation","useMutation","e","deleteMutation","startMutation","msg","handleCancel","handleDelete","jsx","jsxs","runningCount","completedCount","Plus","StartExecutionModal","execution","plan","currentPhase","progress","Link","GitBranch","clsx","Cpu","Monitor","Clock","formatDistanceToNow","zhCN","AlertCircle","CheckCircle","XCircle","StopCircle","Trash2","submitting","onSubmit","onCancel","onGoToAIConfig","defaultSession","sessionId","setSessionId","methodologyId","setMethodologyId","_a","mode","setMode","authMissing","blockedByAuth","submit","m","AlertTriangle"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- import{j as e,r as N}from"./react-vendor-CSp-GLFF.js";import{c as M,L as b}from"./react-router-I-HqunH7.js";import{u as S}from"./query-C99w429o.js";import{d as x}from"./vendor-CMMjVdZs.js";import{p as w,j as v,C as H,m as A,A as L,c as _,e as q,q as D,g as F,U as P,r as k}from"./lucide-BanPULT1.js";import{f as y,a as R,z as $}from"./date-fns-CZ_bHujz.js";async function z(l){const s=await fetch(`/api/methodology-executions/${l}`);if(!s.ok)throw new Error("Failed to fetch");return s.json()}const B={"harness-engineering":"Harness Engineering",bmad:"BMad (敏捷开发)"};function Q(){const{id:l}=M(),{data:s,isLoading:u,error:m}=S({queryKey:["methodology-execution",l],queryFn:()=>z(l),enabled:!!l,refetchInterval:t=>{const n=t.state.data;return(n==null?void 0:n.status)==="running"?3e3:!1}}),i=J(l,(s==null?void 0:s.status)==="running");if(u)return e.jsx("div",{className:"flex items-center justify-center py-12",children:e.jsx(w,{className:"h-8 w-8 animate-spin text-indigo-600"})});if(m||!s)return e.jsxs("div",{className:"bg-white rounded-lg shadow p-6",children:[e.jsxs("p",{className:"text-red-600",children:["加载失败: ",(m==null?void 0:m.message)||"未知错误"]}),e.jsxs(b,{to:"/methodologies",className:"mt-4 inline-flex items-center text-indigo-600 hover:text-indigo-700",children:[e.jsx(v,{className:"h-4 w-4 mr-1"}),"返回列表"]})]});const{plan:d,phases:j,current_phase_index:c,status:r}=s,g=r==="completed"?100:Math.round(c/d.phases.length*100);return e.jsxs("div",{children:[e.jsxs("div",{className:"mb-6",children:[e.jsxs(b,{to:"/methodologies",className:"inline-flex items-center text-sm text-gray-500 hover:text-gray-700 mb-4",children:[e.jsx(v,{className:"h-4 w-4 mr-1"}),"返回列表"]}),e.jsxs("div",{className:"flex items-start justify-between",children:[e.jsxs("div",{children:[e.jsx("h1",{className:"text-2xl font-bold text-gray-900",children:B[s.methodology_id]||s.methodology_id}),e.jsxs("p",{className:"text-sm text-gray-500 mt-1",children:["Session: ",s.session_id]})]}),e.jsxs("span",{className:x("px-3 py-1 text-sm font-medium rounded-full",r==="running"&&"bg-blue-100 text-blue-700",r==="completed"&&"bg-green-100 text-green-700",r==="failed"&&"bg-red-100 text-red-700"),children:[r==="running"&&"运行中",r==="completed"&&"已完成",r==="failed"&&"失败"]})]})]}),e.jsxs("div",{className:"bg-white rounded-lg shadow p-6 mb-6",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsx("h3",{className:"text-sm font-medium text-gray-700",children:"执行进度"}),e.jsxs("div",{className:"flex items-center gap-2 text-sm text-gray-500",children:[s.mode&&e.jsxs("span",{className:x("inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs",s.mode==="background"?"bg-purple-100 text-purple-700":"bg-sky-100 text-sky-700"),children:[s.mode==="background"?e.jsx(H,{className:"h-3 w-3"}):e.jsx(A,{className:"h-3 w-3"}),s.mode==="background"?"后台":"前台"]}),e.jsxs("span",{children:[g,"%"]})]})]}),e.jsx("div",{className:"w-full bg-gray-200 rounded-full h-2",children:e.jsx("div",{className:x("h-2 rounded-full transition-all duration-500",r==="completed"?"bg-green-500":"bg-indigo-600"),style:{width:`${g}%`}})}),e.jsxs("div",{className:"grid grid-cols-3 gap-4 mt-4 pt-4 border-t",children:[e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-gray-500",children:"开始时间"}),e.jsx("div",{className:"text-sm font-medium",children:y(s.started_at,"MM-dd HH:mm:ss")})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-gray-500",children:"阶段"}),e.jsxs("div",{className:"text-sm font-medium",children:[c+(r==="completed"?0:1)," / ",d.phases.length]})]}),e.jsxs("div",{children:[e.jsx("div",{className:"text-xs text-gray-500",children:r==="completed"?"完成时间":"已运行"}),e.jsx("div",{className:"text-sm font-medium",children:r==="completed"&&s.completed_at?y(s.completed_at,"MM-dd HH:mm:ss"):R(s.started_at,{addSuffix:!1,locale:$})})]})]}),(s.worker_pid||s.worker_session_id)&&e.jsxs("div",{className:"mt-3 pt-3 border-t text-xs text-gray-500 flex gap-4",children:[s.worker_pid?e.jsxs("span",{children:["worker PID: ",e.jsx("span",{className:"font-mono",children:s.worker_pid})]}):null,s.worker_session_id?e.jsxs("span",{children:["worker session: ",e.jsxs("span",{className:"font-mono",children:[String(s.worker_session_id).slice(0,18),"…"]})]}):null]})]}),(r==="running"||i.length>0)&&e.jsxs("div",{className:"bg-white rounded-lg shadow p-6 mb-6",children:[e.jsxs("h3",{className:"flex items-center text-sm font-medium text-gray-700 mb-3",children:[e.jsx(L,{className:"h-4 w-4 mr-2 text-indigo-600"}),"实时事件流",e.jsxs("span",{className:"ml-2 text-xs text-gray-400",children:["(最近 ",i.length," 条)"]})]}),i.length===0?e.jsx("p",{className:"text-xs text-gray-500",children:r==="running"?"等待 worker 输出…":"暂无事件"}):e.jsx("ol",{className:"space-y-1 text-xs font-mono max-h-64 overflow-auto",children:i.map((t,n)=>e.jsxs("li",{className:"flex items-start gap-2",children:[e.jsx("span",{className:"text-gray-400 flex-shrink-0 w-16",children:y(t.timestamp,"HH:mm:ss")}),e.jsx("span",{className:x("px-1.5 rounded text-[10px] font-medium flex-shrink-0",t.type==="phase-start"&&"bg-indigo-100 text-indigo-700",t.type==="phase-finish"&&"bg-green-100 text-green-700",t.type==="phase-log"&&"bg-gray-100 text-gray-700",t.type==="error"&&"bg-red-100 text-red-700",t.type==="done"&&"bg-gray-200 text-gray-700"),children:t.type}),e.jsxs("span",{className:"text-gray-700 truncate",children:[t.phase_id?`phase=${t.phase_id} `:"",t.payload?JSON.stringify(t.payload).slice(0,180):""]})]},n))})]}),e.jsxs("div",{className:"bg-white rounded-lg shadow p-6 mb-6",children:[e.jsxs("h3",{className:"flex items-center text-sm font-medium text-gray-700 mb-3",children:[e.jsx(_,{className:"h-4 w-4 mr-2 text-indigo-600"}),"执行计划 (AI 生成)"]}),e.jsx("p",{className:"text-sm text-gray-600 leading-relaxed",children:d.rationale})]}),e.jsxs("div",{className:"bg-white rounded-lg shadow p-6",children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-4",children:"执行阶段"}),e.jsx("div",{className:"space-y-4",children:d.phases.map((t,n)=>{const a=j.find(o=>o.phase_index===n),h=n<c||n===c&&r==="completed"||(a==null?void 0:a.status)==="completed",p=n===c&&r==="running"&&(a==null?void 0:a.status)==="running",f=n>c&&!p;return e.jsxs("div",{className:"relative",children:[n<d.phases.length-1&&e.jsx("div",{className:x("absolute left-4 top-10 w-0.5 h-full -z-10",h?"bg-green-300":"bg-gray-200")}),e.jsxs("div",{className:"flex gap-4",children:[e.jsx("div",{className:"flex-shrink-0",children:h?e.jsx("div",{className:"w-8 h-8 rounded-full bg-green-100 flex items-center justify-center",children:e.jsx(q,{className:"h-5 w-5 text-green-600"})}):p?e.jsx("div",{className:"w-8 h-8 rounded-full bg-blue-100 flex items-center justify-center",children:e.jsx(w,{className:"h-5 w-5 text-blue-600 animate-spin"})}):e.jsx("div",{className:"w-8 h-8 rounded-full bg-gray-100 flex items-center justify-center",children:e.jsx(D,{className:"h-5 w-5 text-gray-400"})})}),e.jsx("div",{className:x("flex-1 pb-4",f&&"opacity-50"),children:e.jsxs("div",{className:"bg-gray-50 rounded-lg p-4 border border-gray-200",children:[e.jsxs("div",{className:"flex items-center justify-between mb-2",children:[e.jsxs("div",{className:"flex items-center gap-3",children:[e.jsxs("span",{className:"text-sm font-semibold text-gray-900",children:["阶段 ",n+1,": ",t.id]}),e.jsxs("span",{className:x("px-2 py-0.5 text-xs font-medium rounded",h&&"bg-green-100 text-green-700",p&&"bg-blue-100 text-blue-700",f&&"bg-gray-100 text-gray-600"),children:[h&&"已完成",p&&"运行中",f&&"待执行"]})]}),(a==null?void 0:a.duration_ms)&&e.jsxs("span",{className:"text-xs text-gray-500",children:[e.jsx(F,{className:"inline h-3 w-3 mr-1"}),(a.duration_ms/1e3).toFixed(1),"s"]})]}),e.jsxs("div",{className:"flex items-center gap-2 mb-3 text-xs text-gray-600",children:[e.jsx(P,{className:"h-3 w-3"}),e.jsxs("span",{children:["Agent: ",e.jsx("strong",{children:t.agent})]})]}),e.jsx("p",{className:"text-xs text-gray-500 italic mb-3",children:t.rationale}),e.jsxs("div",{className:"bg-white rounded p-3 border border-gray-200",children:[e.jsxs("div",{className:"flex items-center gap-1 text-xs text-gray-500 mb-1",children:[e.jsx(k,{className:"h-3 w-3"}),"Prompt"]}),e.jsx("p",{className:"text-xs text-gray-700 leading-relaxed",children:t.prompt})]}),t.artifacts&&t.artifacts.length>0&&e.jsxs("div",{className:"mt-3",children:[e.jsx("div",{className:"text-xs text-gray-500 mb-1",children:"预期产物"}),e.jsx("div",{className:"flex flex-wrap gap-1",children:t.artifacts.map((o,C)=>e.jsxs("span",{className:"px-2 py-0.5 text-xs bg-indigo-50 text-indigo-700 rounded",children:[o.pattern||o.type,o.required&&" *"]},C))})]}),(a==null?void 0:a.output_text)&&e.jsxs("details",{className:"mt-3 bg-white rounded border border-gray-200",children:[e.jsxs("summary",{className:"px-3 py-1.5 cursor-pointer text-xs text-gray-600 hover:bg-gray-50",children:[e.jsx(k,{className:"inline h-3 w-3 mr-1"})," 输出(",a.output_text.length," 字符)"]}),e.jsx("pre",{className:"px-3 py-2 text-xs text-gray-800 whitespace-pre-wrap break-words max-h-64 overflow-auto",children:a.output_text})]}),(a==null?void 0:a.error_message)&&e.jsxs("div",{className:"mt-3 bg-red-50 border border-red-200 rounded p-2",children:[e.jsxs("div",{className:"flex items-center gap-1 text-xs font-medium text-red-700 mb-1",children:[e.jsx(_,{className:"h-3 w-3"})," 错误"]}),e.jsx("pre",{className:"text-xs text-red-800 whitespace-pre-wrap break-words",children:a.error_message})]}),(a==null?void 0:a.stream_log_path)&&e.jsxs("div",{className:"mt-2 text-[11px] text-gray-400",children:["日志: ",e.jsx("span",{className:"font-mono",children:a.stream_log_path})]})]})})]})]},n)})})]})]})}function J(l,s){const[u,m]=N.useState([]),i=N.useRef(null);return N.useEffect(()=>{var c;if(!l||!s){(c=i.current)==null||c.close(),i.current=null;return}const d=new EventSource(`/api/methodology-executions/events?execution_id=${l}`);i.current=d;const j=r=>{try{const g=JSON.parse(r.data);m(t=>{const n=[...t,g];return n.length>100&&n.splice(0,n.length-100),n})}catch{}};return["phase-start","phase-log","phase-finish","done","error"].forEach(r=>{d.addEventListener(r,j)}),()=>{d.close(),i.current=null}},[l,s]),u}export{Q as default};
2
- //# sourceMappingURL=MethodologyDetail-rV3W1utf.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"MethodologyDetail-rV3W1utf.js","sources":["../../src/pages/MethodologyDetail.tsx"],"sourcesContent":["import { useParams, Link } from 'react-router-dom'\nimport { useQuery } from '@tanstack/react-query'\nimport { useEffect, useRef, useState } from 'react'\nimport { formatDistanceToNow, format } from 'date-fns'\nimport { zhCN } from 'date-fns/locale'\nimport {\n ArrowLeft,\n CheckCircle,\n Clock,\n Circle,\n Loader2,\n User,\n FileText,\n AlertCircle,\n Activity,\n Cpu,\n Monitor,\n} from 'lucide-react'\nimport clsx from 'clsx'\n\ninterface PlannedPhase {\n id: string\n agent: string\n prompt: string\n rationale: string\n artifacts?: Array<{ type: string; pattern?: string; required?: boolean; min?: number }>\n}\n\ninterface ExecutionPlan {\n phases: PlannedPhase[]\n rationale: string\n methodology_id: string\n}\n\ninterface PhaseExecution {\n id: number\n methodology_execution_id: number\n phase_id: string\n phase_index: number\n agent_name: string\n prompt: string\n status: 'pending' | 'running' | 'completed' | 'failed'\n started_at: number | null\n completed_at: number | null\n duration_ms: number | null\n artifacts_json: string | null\n output_text?: string | null\n error_message?: string | null\n stream_log_path?: string | null\n}\n\ninterface MethodologyDetail {\n id: number\n session_id: string\n methodology_id: string\n plan_json: string\n plan: ExecutionPlan\n current_phase_index: number\n status: 'running' | 'completed' | 'failed' | 'cancelled'\n mode?: 'foreground' | 'background'\n worker_pid?: number | null\n worker_session_id?: string | null\n started_at: number\n completed_at: number | null\n phases: PhaseExecution[]\n}\n\nasync function fetchMethodologyDetail(id: string): Promise<MethodologyDetail> {\n const res = await fetch(`/api/methodology-executions/${id}`)\n if (!res.ok) throw new Error('Failed to fetch')\n return res.json()\n}\n\nconst methodologyNames: Record<string, string> = {\n 'harness-engineering': 'Harness Engineering',\n 'bmad': 'BMad (敏捷开发)',\n}\n\nexport default function MethodologyDetail() {\n const { id } = useParams<{ id: string }>()\n const { data, isLoading, error } = useQuery({\n queryKey: ['methodology-execution', id],\n queryFn: () => fetchMethodologyDetail(id!),\n enabled: !!id,\n refetchInterval: (query) => {\n const data = query.state.data\n return data?.status === 'running' ? 3000 : false\n },\n })\n\n const liveEvents = useExecutorSSE(id, data?.status === 'running')\n\n if (isLoading) {\n return (\n <div className=\"flex items-center justify-center py-12\">\n <Loader2 className=\"h-8 w-8 animate-spin text-indigo-600\" />\n </div>\n )\n }\n\n if (error || !data) {\n return (\n <div className=\"bg-white rounded-lg shadow p-6\">\n <p className=\"text-red-600\">加载失败: {(error as Error)?.message || '未知错误'}</p>\n <Link to=\"/methodologies\" className=\"mt-4 inline-flex items-center text-indigo-600 hover:text-indigo-700\">\n <ArrowLeft className=\"h-4 w-4 mr-1\" />\n 返回列表\n </Link>\n </div>\n )\n }\n\n const { plan, phases, current_phase_index, status } = data\n const progress = status === 'completed' ? 100 : Math.round((current_phase_index / plan.phases.length) * 100)\n\n return (\n <div>\n {/* Header */}\n <div className=\"mb-6\">\n <Link\n to=\"/methodologies\"\n className=\"inline-flex items-center text-sm text-gray-500 hover:text-gray-700 mb-4\"\n >\n <ArrowLeft className=\"h-4 w-4 mr-1\" />\n 返回列表\n </Link>\n <div className=\"flex items-start justify-between\">\n <div>\n <h1 className=\"text-2xl font-bold text-gray-900\">\n {methodologyNames[data.methodology_id] || data.methodology_id}\n </h1>\n <p className=\"text-sm text-gray-500 mt-1\">\n Session: {data.session_id}\n </p>\n </div>\n <span className={clsx(\n 'px-3 py-1 text-sm font-medium rounded-full',\n status === 'running' && 'bg-blue-100 text-blue-700',\n status === 'completed' && 'bg-green-100 text-green-700',\n status === 'failed' && 'bg-red-100 text-red-700'\n )}>\n {status === 'running' && '运行中'}\n {status === 'completed' && '已完成'}\n {status === 'failed' && '失败'}\n </span>\n </div>\n </div>\n\n {/* Progress */}\n <div className=\"bg-white rounded-lg shadow p-6 mb-6\">\n <div className=\"flex items-center justify-between mb-2\">\n <h3 className=\"text-sm font-medium text-gray-700\">执行进度</h3>\n <div className=\"flex items-center gap-2 text-sm text-gray-500\">\n {data.mode && (\n <span\n className={clsx(\n 'inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs',\n data.mode === 'background' ? 'bg-purple-100 text-purple-700' : 'bg-sky-100 text-sky-700',\n )}\n >\n {data.mode === 'background' ? <Cpu className=\"h-3 w-3\" /> : <Monitor className=\"h-3 w-3\" />}\n {data.mode === 'background' ? '后台' : '前台'}\n </span>\n )}\n <span>{progress}%</span>\n </div>\n </div>\n <div className=\"w-full bg-gray-200 rounded-full h-2\">\n <div\n className={clsx(\n 'h-2 rounded-full transition-all duration-500',\n status === 'completed' ? 'bg-green-500' : 'bg-indigo-600'\n )}\n style={{ width: `${progress}%` }}\n />\n </div>\n <div className=\"grid grid-cols-3 gap-4 mt-4 pt-4 border-t\">\n <div>\n <div className=\"text-xs text-gray-500\">开始时间</div>\n <div className=\"text-sm font-medium\">\n {format(data.started_at, 'MM-dd HH:mm:ss')}\n </div>\n </div>\n <div>\n <div className=\"text-xs text-gray-500\">阶段</div>\n <div className=\"text-sm font-medium\">\n {current_phase_index + (status === 'completed' ? 0 : 1)} / {plan.phases.length}\n </div>\n </div>\n <div>\n <div className=\"text-xs text-gray-500\">\n {status === 'completed' ? '完成时间' : '已运行'}\n </div>\n <div className=\"text-sm font-medium\">\n {status === 'completed' && data.completed_at\n ? format(data.completed_at, 'MM-dd HH:mm:ss')\n : formatDistanceToNow(data.started_at, { addSuffix: false, locale: zhCN })}\n </div>\n </div>\n </div>\n {(data.worker_pid || data.worker_session_id) && (\n <div className=\"mt-3 pt-3 border-t text-xs text-gray-500 flex gap-4\">\n {data.worker_pid ? <span>worker PID: <span className=\"font-mono\">{data.worker_pid}</span></span> : null}\n {data.worker_session_id ? (\n <span>worker session: <span className=\"font-mono\">{String(data.worker_session_id).slice(0, 18)}…</span></span>\n ) : null}\n </div>\n )}\n </div>\n\n {/* Live executor events (SSE) */}\n {(status === 'running' || liveEvents.length > 0) && (\n <div className=\"bg-white rounded-lg shadow p-6 mb-6\">\n <h3 className=\"flex items-center text-sm font-medium text-gray-700 mb-3\">\n <Activity className=\"h-4 w-4 mr-2 text-indigo-600\" />\n 实时事件流\n <span className=\"ml-2 text-xs text-gray-400\">(最近 {liveEvents.length} 条)</span>\n </h3>\n {liveEvents.length === 0 ? (\n <p className=\"text-xs text-gray-500\">\n {status === 'running' ? '等待 worker 输出…' : '暂无事件'}\n </p>\n ) : (\n <ol className=\"space-y-1 text-xs font-mono max-h-64 overflow-auto\">\n {liveEvents.map((ev, i) => (\n <li key={i} className=\"flex items-start gap-2\">\n <span className=\"text-gray-400 flex-shrink-0 w-16\">\n {format(ev.timestamp, 'HH:mm:ss')}\n </span>\n <span className={clsx(\n 'px-1.5 rounded text-[10px] font-medium flex-shrink-0',\n ev.type === 'phase-start' && 'bg-indigo-100 text-indigo-700',\n ev.type === 'phase-finish' && 'bg-green-100 text-green-700',\n ev.type === 'phase-log' && 'bg-gray-100 text-gray-700',\n ev.type === 'error' && 'bg-red-100 text-red-700',\n ev.type === 'done' && 'bg-gray-200 text-gray-700',\n )}>\n {ev.type}\n </span>\n <span className=\"text-gray-700 truncate\">\n {ev.phase_id ? `phase=${ev.phase_id} ` : ''}\n {ev.payload ? JSON.stringify(ev.payload).slice(0, 180) : ''}\n </span>\n </li>\n ))}\n </ol>\n )}\n </div>\n )}\n\n {/* Plan Rationale */}\n <div className=\"bg-white rounded-lg shadow p-6 mb-6\">\n <h3 className=\"flex items-center text-sm font-medium text-gray-700 mb-3\">\n <AlertCircle className=\"h-4 w-4 mr-2 text-indigo-600\" />\n 执行计划 (AI 生成)\n </h3>\n <p className=\"text-sm text-gray-600 leading-relaxed\">\n {plan.rationale}\n </p>\n </div>\n\n {/* Phase Timeline */}\n <div className=\"bg-white rounded-lg shadow p-6\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-4\">执行阶段</h3>\n\n <div className=\"space-y-4\">\n {plan.phases.map((phase, index) => {\n const phaseExec = phases.find((p) => p.phase_index === index)\n const isCompleted = index < current_phase_index ||\n (index === current_phase_index && status === 'completed') ||\n phaseExec?.status === 'completed'\n const isRunning = index === current_phase_index && status === 'running' && phaseExec?.status === 'running'\n const isPending = index > current_phase_index && !isRunning\n\n return (\n <div key={index} className=\"relative\">\n {/* Timeline line */}\n {index < plan.phases.length - 1 && (\n <div\n className={clsx(\n 'absolute left-4 top-10 w-0.5 h-full -z-10',\n isCompleted ? 'bg-green-300' : 'bg-gray-200'\n )}\n />\n )}\n\n <div className=\"flex gap-4\">\n {/* Status icon */}\n <div className=\"flex-shrink-0\">\n {isCompleted ? (\n <div className=\"w-8 h-8 rounded-full bg-green-100 flex items-center justify-center\">\n <CheckCircle className=\"h-5 w-5 text-green-600\" />\n </div>\n ) : isRunning ? (\n <div className=\"w-8 h-8 rounded-full bg-blue-100 flex items-center justify-center\">\n <Loader2 className=\"h-5 w-5 text-blue-600 animate-spin\" />\n </div>\n ) : (\n <div className=\"w-8 h-8 rounded-full bg-gray-100 flex items-center justify-center\">\n <Circle className=\"h-5 w-5 text-gray-400\" />\n </div>\n )}\n </div>\n\n {/* Phase content */}\n <div className={clsx(\n 'flex-1 pb-4',\n isPending && 'opacity-50'\n )}>\n <div className=\"bg-gray-50 rounded-lg p-4 border border-gray-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"flex items-center gap-3\">\n <span className=\"text-sm font-semibold text-gray-900\">\n 阶段 {index + 1}: {phase.id}\n </span>\n <span className={clsx(\n 'px-2 py-0.5 text-xs font-medium rounded',\n isCompleted && 'bg-green-100 text-green-700',\n isRunning && 'bg-blue-100 text-blue-700',\n isPending && 'bg-gray-100 text-gray-600'\n )}>\n {isCompleted && '已完成'}\n {isRunning && '运行中'}\n {isPending && '待执行'}\n </span>\n </div>\n {phaseExec?.duration_ms && (\n <span className=\"text-xs text-gray-500\">\n <Clock className=\"inline h-3 w-3 mr-1\" />\n {(phaseExec.duration_ms / 1000).toFixed(1)}s\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-2 mb-3 text-xs text-gray-600\">\n <User className=\"h-3 w-3\" />\n <span>Agent: <strong>{phase.agent}</strong></span>\n </div>\n\n <p className=\"text-xs text-gray-500 italic mb-3\">\n {phase.rationale}\n </p>\n\n <div className=\"bg-white rounded p-3 border border-gray-200\">\n <div className=\"flex items-center gap-1 text-xs text-gray-500 mb-1\">\n <FileText className=\"h-3 w-3\" />\n Prompt\n </div>\n <p className=\"text-xs text-gray-700 leading-relaxed\">\n {phase.prompt}\n </p>\n </div>\n\n {phase.artifacts && phase.artifacts.length > 0 && (\n <div className=\"mt-3\">\n <div className=\"text-xs text-gray-500 mb-1\">预期产物</div>\n <div className=\"flex flex-wrap gap-1\">\n {phase.artifacts.map((artifact, i) => (\n <span\n key={i}\n className=\"px-2 py-0.5 text-xs bg-indigo-50 text-indigo-700 rounded\"\n >\n {artifact.pattern || artifact.type}\n {artifact.required && ' *'}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {phaseExec?.output_text && (\n <details className=\"mt-3 bg-white rounded border border-gray-200\">\n <summary className=\"px-3 py-1.5 cursor-pointer text-xs text-gray-600 hover:bg-gray-50\">\n <FileText className=\"inline h-3 w-3 mr-1\" /> 输出({phaseExec.output_text.length} 字符)\n </summary>\n <pre className=\"px-3 py-2 text-xs text-gray-800 whitespace-pre-wrap break-words max-h-64 overflow-auto\">\n{phaseExec.output_text}\n </pre>\n </details>\n )}\n\n {phaseExec?.error_message && (\n <div className=\"mt-3 bg-red-50 border border-red-200 rounded p-2\">\n <div className=\"flex items-center gap-1 text-xs font-medium text-red-700 mb-1\">\n <AlertCircle className=\"h-3 w-3\" /> 错误\n </div>\n <pre className=\"text-xs text-red-800 whitespace-pre-wrap break-words\">\n{phaseExec.error_message}\n </pre>\n </div>\n )}\n\n {phaseExec?.stream_log_path && (\n <div className=\"mt-2 text-[11px] text-gray-400\">\n 日志: <span className=\"font-mono\">{phaseExec.stream_log_path}</span>\n </div>\n )}\n </div>\n </div>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n </div>\n )\n}\n\ninterface ExecutorEventPayload {\n type: 'phase-start' | 'phase-log' | 'phase-finish' | 'done' | 'error'\n execution_id: number\n phase_index?: number\n phase_id?: string\n payload?: unknown\n timestamp: number\n}\n\nfunction useExecutorSSE(executionId: string | undefined, enabled: boolean) {\n const [events, setEvents] = useState<ExecutorEventPayload[]>([])\n const esRef = useRef<EventSource | null>(null)\n\n useEffect(() => {\n if (!executionId || !enabled) {\n esRef.current?.close()\n esRef.current = null\n return\n }\n const es = new EventSource(`/api/methodology-executions/events?execution_id=${executionId}`)\n esRef.current = es\n const handler = (e: MessageEvent) => {\n try {\n const data = JSON.parse(e.data) as ExecutorEventPayload\n setEvents(prev => {\n const next = [...prev, data]\n if (next.length > 100) next.splice(0, next.length - 100)\n return next\n })\n } catch { /* ignore malformed */ }\n }\n ;(['phase-start', 'phase-log', 'phase-finish', 'done', 'error'] as const).forEach(t => {\n es.addEventListener(t, handler as EventListener)\n })\n return () => {\n es.close()\n esRef.current = null\n }\n }, [executionId, enabled])\n\n return events\n}\n"],"names":["fetchMethodologyDetail","id","res","methodologyNames","MethodologyDetail","useParams","data","isLoading","error","useQuery","query","liveEvents","useExecutorSSE","jsx","Loader2","jsxs","Link","ArrowLeft","plan","phases","current_phase_index","status","progress","clsx","Cpu","Monitor","format","formatDistanceToNow","zhCN","Activity","ev","i","AlertCircle","phase","index","phaseExec","p","isCompleted","isRunning","isPending","CheckCircle","Circle","Clock","User","FileText","artifact","executionId","enabled","events","setEvents","useState","esRef","useRef","useEffect","_a","es","handler","e","prev","next","t"],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/Dashboard-Ciyyw6ph.js","assets/react-vendor-CSp-GLFF.js","assets/query-C99w429o.js","assets/react-router-I-HqunH7.js","assets/vendor-CMMjVdZs.js","assets/lucide-BanPULT1.js","assets/charts-CLrM0_uM.js","assets/Sessions-ZQSCgXyy.js","assets/Drawer-DOUcx6m1.js","assets/date-fns-CZ_bHujz.js","assets/export-CbQTOt71.js","assets/syntax-highlighter-44FakypI.js","assets/SessionDetail-Cbd7Jwox.js","assets/Events-DQHP6Uaq.js","assets/CodeBlock--H53gk46.js","assets/ExecutionTrace-Co8ARdg-.js","assets/Methodologies-CXNrDXwG.js","assets/auth-Bnf8ZcqN.js","assets/MethodologyDetail-rV3W1utf.js","assets/Agents-bNNGbQnL.js","assets/MarkdownRenderer-CCIz1MOz.js","assets/Skills-C5-5zOSH.js","assets/Routing-BW3eGD-8.js","assets/AIConfig-DiUFET_Q.js"])))=>i.map(i=>d[i]);
2
- import{r as s,j as e,e as y,d as v}from"./react-vendor-CSp-GLFF.js";import{u as N,O as w,L as _,R as C,a as c,N as k,B as E}from"./react-router-I-HqunH7.js";import{Q as P,a as T}from"./query-C99w429o.js";import{_ as x}from"./syntax-highlighter-44FakypI.js";import{d as f}from"./vendor-CMMjVdZs.js";import{X as p,M as O,L as A,a as S,A as L,T as I,G as R,B as z,b as D,N as V,C as F,I as B,c as M,d as q,e as Q,f as G}from"./lucide-BanPULT1.js";(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))l(r);new MutationObserver(r=>{for(const n of r)if(n.type==="childList")for(const t of n.addedNodes)t.tagName==="LINK"&&t.rel==="modulepreload"&&l(t)}).observe(document,{childList:!0,subtree:!0});function a(r){const n={};return r.integrity&&(n.integrity=r.integrity),r.referrerPolicy&&(n.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?n.credentials="include":r.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function l(r){if(r.ep)return;r.ep=!0;const n=a(r);fetch(r.href,n)}})();const W=[{title:"总览",items:[{name:"仪表盘",href:"/dashboard",icon:A}]},{title:"活动",items:[{name:"会话",href:"/sessions",icon:S},{name:"事件",href:"/events",icon:L},{name:"执行追踪",href:"/execution-trace",icon:I},{name:"方法论执行",href:"/methodologies",icon:R}]},{title:"配置",items:[{name:"Agent 管理",href:"/agents",icon:z},{name:"Skill 管理",href:"/skills",icon:D},{name:"Agent 路由",href:"/routing",icon:V},{name:"AI 配置",href:"/ai-config",icon:F}]}];function X(){const o=N(),[i,a]=s.useState(!1),l=r=>e.jsx(e.Fragment,{children:W.map(n=>e.jsxs("div",{className:"mb-4",children:[e.jsx("div",{className:"px-3 py-2 text-xs font-semibold text-gray-400 uppercase tracking-wider",children:n.title}),n.items.map(t=>{const u=t.icon,m=o.pathname===t.href||o.pathname.startsWith(t.href+"/");return e.jsxs(_,{to:t.href,onClick:r,className:f("group flex items-center px-3 py-2 text-sm font-medium rounded-md mb-0.5",m?"bg-indigo-50 text-indigo-600":"text-gray-700 hover:bg-gray-50"),children:[e.jsx(u,{className:f("mr-3 h-4 w-4",m?"text-indigo-600":"text-gray-400")}),t.name]},t.name)})]},n.title))});return e.jsxs("div",{className:"min-h-screen bg-gray-50",children:[e.jsxs("div",{className:f("fixed inset-0 z-40 lg:hidden",i?"block":"hidden"),children:[e.jsx("div",{className:"fixed inset-0 bg-gray-600 bg-opacity-75",onClick:()=>a(!1)}),e.jsxs("div",{className:"fixed inset-y-0 left-0 flex w-64 flex-col bg-white",children:[e.jsxs("div",{className:"flex items-center justify-between px-4 py-4 border-b",children:[e.jsxs("div",{className:"flex items-center gap-2",children:[e.jsx("div",{className:"w-8 h-8 rounded-lg bg-gradient-to-br from-indigo-500 to-purple-600 flex items-center justify-center text-white font-bold text-sm",children:"CF"}),e.jsx("h1",{className:"text-base font-bold text-gray-900",children:"Claude Forge"})]}),e.jsx("button",{onClick:()=>a(!1),className:"text-gray-500",children:e.jsx(p,{className:"h-5 w-5"})})]}),e.jsx("nav",{className:"flex-1 overflow-y-auto px-2 py-4",children:l(()=>a(!1))})]})]}),e.jsx("div",{className:"hidden lg:fixed lg:inset-y-0 lg:flex lg:w-64 lg:flex-col",children:e.jsxs("div",{className:"flex flex-col flex-grow border-r border-gray-200 bg-white",children:[e.jsxs("div",{className:"flex items-center gap-2 px-4 py-4 border-b",children:[e.jsx("div",{className:"w-8 h-8 rounded-lg bg-gradient-to-br from-indigo-500 to-purple-600 flex items-center justify-center text-white font-bold text-sm",children:"CF"}),e.jsx("h1",{className:"text-base font-bold text-gray-900",children:"Claude Forge"})]}),e.jsx("nav",{className:"flex-1 overflow-y-auto px-2 py-4",children:l()})]})}),e.jsxs("div",{className:"lg:pl-64",children:[e.jsxs("div",{className:"sticky top-0 z-10 flex h-14 flex-shrink-0 bg-white border-b border-gray-200 lg:hidden",children:[e.jsx("button",{onClick:()=>a(!0),className:"px-4 text-gray-500 focus:outline-none",children:e.jsx(O,{className:"h-5 w-5"})}),e.jsx("div",{className:"flex flex-1 items-center px-4",children:e.jsx("h1",{className:"text-base font-semibold text-gray-900",children:"Claude Forge"})})]}),e.jsx("main",{className:"py-6",children:e.jsx("div",{className:"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8",children:e.jsx(w,{})})})]})]})}const $=s.lazy(()=>x(()=>import("./Dashboard-Ciyyw6ph.js"),__vite__mapDeps([0,1,2,3,4,5,6]))),K=s.lazy(()=>x(()=>import("./Sessions-ZQSCgXyy.js"),__vite__mapDeps([7,1,2,8,4,5,9,10,3,11]))),U=s.lazy(()=>x(()=>import("./SessionDetail-Cbd7Jwox.js"),__vite__mapDeps([12,1,3,4,2,5,9]))),H=s.lazy(()=>x(()=>import("./Events-DQHP6Uaq.js"),__vite__mapDeps([13,1,2,4,8,5,14,11,10,9,3]))),J=s.lazy(()=>x(()=>import("./ExecutionTrace-Co8ARdg-.js"),__vite__mapDeps([15,1,2,4,8,5,14,11,10,9,3]))),Y=s.lazy(()=>x(()=>import("./Methodologies-CXNrDXwG.js"),__vite__mapDeps([16,1,2,3,4,17,5,9,11]))),Z=s.lazy(()=>x(()=>import("./MethodologyDetail-rV3W1utf.js"),__vite__mapDeps([18,1,3,4,2,5,9]))),ee=s.lazy(()=>x(()=>import("./Agents-bNNGbQnL.js"),__vite__mapDeps([19,1,2,8,4,5,20,11,17,3]))),se=s.lazy(()=>x(()=>import("./Skills-C5-5zOSH.js"),__vite__mapDeps([21,1,2,8,4,5,20,11,17,3]))),te=s.lazy(()=>x(()=>import("./Routing-BW3eGD-8.js"),__vite__mapDeps([22,1,2,3,4,5]))),re=s.lazy(()=>x(()=>import("./AIConfig-DiUFET_Q.js"),__vite__mapDeps([23,1,2,17,5,3,4,11])));function d(){return e.jsx("div",{className:"flex items-center justify-center h-full py-16",children:e.jsxs("div",{className:"flex items-center gap-3 text-sm text-gray-500",children:[e.jsx("div",{className:"w-4 h-4 border-2 border-gray-300 border-t-blue-500 rounded-full animate-spin"}),"加载中..."]})})}function ne(){return e.jsx(C,{children:e.jsxs(c,{path:"/",element:e.jsx(X,{}),children:[e.jsx(c,{index:!0,element:e.jsx(k,{to:"/dashboard",replace:!0})}),e.jsx(c,{path:"dashboard",element:e.jsx(s.Suspense,{fallback:e.jsx(d,{}),children:e.jsx($,{})})}),e.jsx(c,{path:"sessions",element:e.jsx(s.Suspense,{fallback:e.jsx(d,{}),children:e.jsx(K,{})})}),e.jsx(c,{path:"sessions/:id",element:e.jsx(s.Suspense,{fallback:e.jsx(d,{}),children:e.jsx(U,{})})}),e.jsx(c,{path:"events",element:e.jsx(s.Suspense,{fallback:e.jsx(d,{}),children:e.jsx(H,{})})}),e.jsx(c,{path:"execution-trace",element:e.jsx(s.Suspense,{fallback:e.jsx(d,{}),children:e.jsx(J,{})})}),e.jsx(c,{path:"methodologies",element:e.jsx(s.Suspense,{fallback:e.jsx(d,{}),children:e.jsx(Y,{})})}),e.jsx(c,{path:"methodologies/:id",element:e.jsx(s.Suspense,{fallback:e.jsx(d,{}),children:e.jsx(Z,{})})}),e.jsx(c,{path:"agents",element:e.jsx(s.Suspense,{fallback:e.jsx(d,{}),children:e.jsx(ee,{})})}),e.jsx(c,{path:"skills",element:e.jsx(s.Suspense,{fallback:e.jsx(d,{}),children:e.jsx(se,{})})}),e.jsx(c,{path:"routing",element:e.jsx(s.Suspense,{fallback:e.jsx(d,{}),children:e.jsx(te,{})})}),e.jsx(c,{path:"ai-config",element:e.jsx(s.Suspense,{fallback:e.jsx(d,{}),children:e.jsx(re,{})})})]})})}const g=s.createContext(null);function pe(){const o=s.useContext(g);if(!o)throw new Error("useToast must be used within ToastProvider");return o}let ie=1;function oe({children:o}){const[i,a]=s.useState([]),l=s.useCallback(t=>{a(u=>u.filter(m=>m.id!==t))},[]),r=s.useCallback((t,u)=>{const m=ie++;a(h=>[...h,{id:m,type:t,message:u}]),setTimeout(()=>l(m),4e3)},[l]),n={show:r,success:t=>r("success",t),error:t=>r("error",t),warning:t=>r("warning",t),info:t=>r("info",t)};return e.jsxs(g.Provider,{value:n,children:[o,e.jsx("div",{className:"fixed top-4 right-4 z-[9999] space-y-2 max-w-md",children:i.map(t=>e.jsx(ae,{toast:t,onClose:()=>l(t.id)},t.id))})]})}function ae({toast:o,onClose:i}){const a={success:e.jsx(Q,{className:"h-5 w-5 text-green-500"}),error:e.jsx(q,{className:"h-5 w-5 text-red-500"}),warning:e.jsx(M,{className:"h-5 w-5 text-yellow-500"}),info:e.jsx(B,{className:"h-5 w-5 text-blue-500"})},l={success:"border-green-200",error:"border-red-200",warning:"border-yellow-200",info:"border-blue-200"};return e.jsxs("div",{className:f("bg-white shadow-lg rounded-lg border px-4 py-3 flex items-start gap-3 animate-in slide-in-from-right",l[o.type]),children:[a[o.type],e.jsx("div",{className:"flex-1 text-sm text-gray-800",children:o.message}),e.jsx("button",{onClick:i,className:"text-gray-400 hover:text-gray-600",children:e.jsx(p,{className:"h-4 w-4"})})]})}const j=s.createContext(null);function ge(){const o=s.useContext(j);if(!o)throw new Error("useConfirm must be used within ConfirmProvider");return o.confirm}function le({children:o}){var m;const[i,a]=s.useState({open:!1,options:null,resolve:null}),l=s.useCallback(h=>new Promise(b=>{a({open:!0,options:h,resolve:b})}),[]),r=h=>{i.resolve&&i.resolve(h),a({open:!1,options:null,resolve:null})},n=((m=i.options)==null?void 0:m.variant)||"danger",t={danger:"text-red-600",warning:"text-yellow-600",info:"text-blue-600"}[n],u={danger:"bg-red-600 hover:bg-red-700",warning:"bg-yellow-600 hover:bg-yellow-700",info:"bg-indigo-600 hover:bg-indigo-700"}[n];return e.jsxs(j.Provider,{value:{confirm:l},children:[o,i.open&&i.options&&e.jsxs("div",{className:"fixed inset-0 z-[9999] flex items-center justify-center",children:[e.jsx("div",{className:"absolute inset-0 bg-black bg-opacity-50",onClick:()=>r(!1)}),e.jsxs("div",{className:"relative bg-white rounded-lg shadow-xl max-w-md w-full mx-4 p-6",children:[e.jsxs("div",{className:"flex items-start gap-4",children:[e.jsx("div",{className:`flex-shrink-0 ${t}`,children:e.jsx(G,{className:"h-6 w-6"})}),e.jsxs("div",{className:"flex-1",children:[e.jsx("h3",{className:"text-lg font-semibold text-gray-900 mb-2",children:i.options.title}),e.jsx("p",{className:"text-sm text-gray-600 whitespace-pre-wrap",children:i.options.message})]})]}),e.jsxs("div",{className:"flex justify-end gap-2 mt-6",children:[e.jsx("button",{onClick:()=>r(!1),className:"px-4 py-2 text-sm text-gray-700 bg-white border border-gray-300 rounded hover:bg-gray-50",children:i.options.cancelText||"取消"}),e.jsx("button",{onClick:()=>r(!0),className:`px-4 py-2 text-sm text-white rounded ${u}`,children:i.options.confirmText||"确定"})]})]})]})]})}const ce=new P({defaultOptions:{queries:{refetchOnWindowFocus:!1,retry:1}}});y.createRoot(document.getElementById("root")).render(e.jsx(v.StrictMode,{children:e.jsx(T,{client:ce,children:e.jsx(oe,{children:e.jsx(le,{children:e.jsx(E,{children:e.jsx(ne,{})})})})})}));export{ge as a,pe as u};
3
- //# sourceMappingURL=index-DJK5beK6.js.map
@@ -1 +0,0 @@
1
- {"version":3,"mappings":"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","names":["sections","LayoutDashboard","MessageSquare","Activity","TrendingUp","GitBranch","Bot","BookOpen","Network","Cpu","Layout","location","useLocation","sidebarOpen","setSidebarOpen","useState","renderNav","onClick","jsx","Fragment","section","jsxs","item","Icon","isActive","Link","clsx","X","Menu","Outlet","Dashboard","lazy","Sessions","SessionDetail","Events","ExecutionTrace","Methodologies","MethodologyDetail","Agents","Skills","Routing","AIConfig","PageFallback","App","Routes","Route","Navigate","Suspense","ToastContext","createContext","useToast","ctx","useContext","nextId","ToastProvider","children","toasts","setToasts","remove","useCallback","id","prev","t","show","type","message","value","msg","ToastItem","toast","onClose","icons","CheckCircle","XCircle","AlertCircle","Info","borderColors","ConfirmContext","useConfirm","ConfirmProvider","state","setState","confirm","options","resolve","handleClose","result","variant","_a","iconColor","btnColor","AlertTriangle","queryClient","QueryClient","ReactDOM","React","QueryClientProvider","BrowserRouter"],"ignoreList":[],"sources":["../../src/components/Layout.tsx","../../src/App.tsx","../../src/components/Toast.tsx","../../src/components/Confirm.tsx","../../src/main.tsx"],"sourcesContent":["import { Outlet, Link, useLocation } from 'react-router-dom'\nimport {\n LayoutDashboard,\n MessageSquare,\n Activity,\n GitBranch,\n Menu,\n X,\n Bot,\n BookOpen,\n Network,\n Cpu,\n TrendingUp,\n} from 'lucide-react'\nimport { useState } from 'react'\nimport clsx from 'clsx'\n\ninterface NavItem {\n name: string\n href: string\n icon: any\n}\n\ninterface NavSection {\n title: string\n items: NavItem[]\n}\n\nconst sections: NavSection[] = [\n {\n title: '总览',\n items: [\n { name: '仪表盘', href: '/dashboard', icon: LayoutDashboard },\n ],\n },\n {\n title: '活动',\n items: [\n { name: '会话', href: '/sessions', icon: MessageSquare },\n { name: '事件', href: '/events', icon: Activity },\n { name: '执行追踪', href: '/execution-trace', icon: TrendingUp },\n { name: '方法论执行', href: '/methodologies', icon: GitBranch },\n ],\n },\n {\n title: '配置',\n items: [\n { name: 'Agent 管理', href: '/agents', icon: Bot },\n { name: 'Skill 管理', href: '/skills', icon: BookOpen },\n { name: 'Agent 路由', href: '/routing', icon: Network },\n { name: 'AI 配置', href: '/ai-config', icon: Cpu },\n ],\n },\n]\n\nexport default function Layout() {\n const location = useLocation()\n const [sidebarOpen, setSidebarOpen] = useState(false)\n\n const renderNav = (onClick?: () => void) => (\n <>\n {sections.map((section) => (\n <div key={section.title} className=\"mb-4\">\n <div className=\"px-3 py-2 text-xs font-semibold text-gray-400 uppercase tracking-wider\">\n {section.title}\n </div>\n {section.items.map((item) => {\n const Icon = item.icon\n const isActive = location.pathname === item.href || location.pathname.startsWith(item.href + '/')\n return (\n <Link\n key={item.name}\n to={item.href}\n onClick={onClick}\n className={clsx(\n 'group flex items-center px-3 py-2 text-sm font-medium rounded-md mb-0.5',\n isActive\n ? 'bg-indigo-50 text-indigo-600'\n : 'text-gray-700 hover:bg-gray-50'\n )}\n >\n <Icon className={clsx('mr-3 h-4 w-4', isActive ? 'text-indigo-600' : 'text-gray-400')} />\n {item.name}\n </Link>\n )\n })}\n </div>\n ))}\n </>\n )\n\n return (\n <div className=\"min-h-screen bg-gray-50\">\n {/* Mobile sidebar */}\n <div className={clsx('fixed inset-0 z-40 lg:hidden', sidebarOpen ? 'block' : 'hidden')}>\n <div className=\"fixed inset-0 bg-gray-600 bg-opacity-75\" onClick={() => setSidebarOpen(false)} />\n <div className=\"fixed inset-y-0 left-0 flex w-64 flex-col bg-white\">\n <div className=\"flex items-center justify-between px-4 py-4 border-b\">\n <div className=\"flex items-center gap-2\">\n <div className=\"w-8 h-8 rounded-lg bg-gradient-to-br from-indigo-500 to-purple-600 flex items-center justify-center text-white font-bold text-sm\">\n CF\n </div>\n <h1 className=\"text-base font-bold text-gray-900\">Claude Forge</h1>\n </div>\n <button onClick={() => setSidebarOpen(false)} className=\"text-gray-500\">\n <X className=\"h-5 w-5\" />\n </button>\n </div>\n <nav className=\"flex-1 overflow-y-auto px-2 py-4\">\n {renderNav(() => setSidebarOpen(false))}\n </nav>\n </div>\n </div>\n\n {/* Desktop sidebar */}\n <div className=\"hidden lg:fixed lg:inset-y-0 lg:flex lg:w-64 lg:flex-col\">\n <div className=\"flex flex-col flex-grow border-r border-gray-200 bg-white\">\n <div className=\"flex items-center gap-2 px-4 py-4 border-b\">\n <div className=\"w-8 h-8 rounded-lg bg-gradient-to-br from-indigo-500 to-purple-600 flex items-center justify-center text-white font-bold text-sm\">\n CF\n </div>\n <h1 className=\"text-base font-bold text-gray-900\">Claude Forge</h1>\n </div>\n <nav className=\"flex-1 overflow-y-auto px-2 py-4\">{renderNav()}</nav>\n </div>\n </div>\n\n {/* Main content */}\n <div className=\"lg:pl-64\">\n <div className=\"sticky top-0 z-10 flex h-14 flex-shrink-0 bg-white border-b border-gray-200 lg:hidden\">\n <button\n onClick={() => setSidebarOpen(true)}\n className=\"px-4 text-gray-500 focus:outline-none\"\n >\n <Menu className=\"h-5 w-5\" />\n </button>\n <div className=\"flex flex-1 items-center px-4\">\n <h1 className=\"text-base font-semibold text-gray-900\">Claude Forge</h1>\n </div>\n </div>\n <main className=\"py-6\">\n <div className=\"mx-auto max-w-7xl px-4 sm:px-6 lg:px-8\">\n <Outlet />\n </div>\n </main>\n </div>\n </div>\n )\n}\n","import { lazy, Suspense } from 'react'\nimport { Routes, Route, Navigate } from 'react-router-dom'\nimport Layout from './components/Layout'\n\n// 路由级代码分割:按需加载 page 组件,缩小主 bundle\nconst Dashboard = lazy(() => import('./pages/Dashboard'))\nconst Sessions = lazy(() => import('./pages/Sessions'))\nconst SessionDetail = lazy(() => import('./pages/SessionDetail'))\nconst Events = lazy(() => import('./pages/Events'))\nconst ExecutionTrace = lazy(() => import('./pages/ExecutionTrace'))\nconst Methodologies = lazy(() => import('./pages/Methodologies'))\nconst MethodologyDetail = lazy(() => import('./pages/MethodologyDetail'))\nconst Agents = lazy(() => import('./pages/Agents'))\nconst Skills = lazy(() => import('./pages/Skills'))\nconst Routing = lazy(() => import('./pages/Routing'))\nconst AIConfig = lazy(() => import('./pages/AIConfig'))\n\nfunction PageFallback() {\n return (\n <div className=\"flex items-center justify-center h-full py-16\">\n <div className=\"flex items-center gap-3 text-sm text-gray-500\">\n <div className=\"w-4 h-4 border-2 border-gray-300 border-t-blue-500 rounded-full animate-spin\" />\n 加载中...\n </div>\n </div>\n )\n}\n\nexport default function App() {\n return (\n <Routes>\n <Route path=\"/\" element={<Layout />}>\n <Route\n index\n element={<Navigate to=\"/dashboard\" replace />}\n />\n <Route\n path=\"dashboard\"\n element={\n <Suspense fallback={<PageFallback />}>\n <Dashboard />\n </Suspense>\n }\n />\n <Route\n path=\"sessions\"\n element={\n <Suspense fallback={<PageFallback />}>\n <Sessions />\n </Suspense>\n }\n />\n <Route\n path=\"sessions/:id\"\n element={\n <Suspense fallback={<PageFallback />}>\n <SessionDetail />\n </Suspense>\n }\n />\n <Route\n path=\"events\"\n element={\n <Suspense fallback={<PageFallback />}>\n <Events />\n </Suspense>\n }\n />\n <Route\n path=\"execution-trace\"\n element={\n <Suspense fallback={<PageFallback />}>\n <ExecutionTrace />\n </Suspense>\n }\n />\n <Route\n path=\"methodologies\"\n element={\n <Suspense fallback={<PageFallback />}>\n <Methodologies />\n </Suspense>\n }\n />\n <Route\n path=\"methodologies/:id\"\n element={\n <Suspense fallback={<PageFallback />}>\n <MethodologyDetail />\n </Suspense>\n }\n />\n <Route\n path=\"agents\"\n element={\n <Suspense fallback={<PageFallback />}>\n <Agents />\n </Suspense>\n }\n />\n <Route\n path=\"skills\"\n element={\n <Suspense fallback={<PageFallback />}>\n <Skills />\n </Suspense>\n }\n />\n <Route\n path=\"routing\"\n element={\n <Suspense fallback={<PageFallback />}>\n <Routing />\n </Suspense>\n }\n />\n <Route\n path=\"ai-config\"\n element={\n <Suspense fallback={<PageFallback />}>\n <AIConfig />\n </Suspense>\n }\n />\n </Route>\n </Routes>\n )\n}\n","import { createContext, useContext, useState, useCallback, ReactNode } from 'react'\nimport { CheckCircle, XCircle, AlertCircle, Info, X } from 'lucide-react'\nimport clsx from 'clsx'\n\ntype ToastType = 'success' | 'error' | 'warning' | 'info'\n\ninterface Toast {\n id: number\n type: ToastType\n message: string\n}\n\ninterface ToastContextValue {\n show: (type: ToastType, message: string) => void\n success: (message: string) => void\n error: (message: string) => void\n warning: (message: string) => void\n info: (message: string) => void\n}\n\nconst ToastContext = createContext<ToastContextValue | null>(null)\n\nexport function useToast() {\n const ctx = useContext(ToastContext)\n if (!ctx) throw new Error('useToast must be used within ToastProvider')\n return ctx\n}\n\nlet nextId = 1\n\nexport function ToastProvider({ children }: { children: ReactNode }) {\n const [toasts, setToasts] = useState<Toast[]>([])\n\n const remove = useCallback((id: number) => {\n setToasts(prev => prev.filter(t => t.id !== id))\n }, [])\n\n const show = useCallback((type: ToastType, message: string) => {\n const id = nextId++\n setToasts(prev => [...prev, { id, type, message }])\n setTimeout(() => remove(id), 4000)\n }, [remove])\n\n const value: ToastContextValue = {\n show,\n success: (msg) => show('success', msg),\n error: (msg) => show('error', msg),\n warning: (msg) => show('warning', msg),\n info: (msg) => show('info', msg),\n }\n\n return (\n <ToastContext.Provider value={value}>\n {children}\n <div className=\"fixed top-4 right-4 z-[9999] space-y-2 max-w-md\">\n {toasts.map(t => (\n <ToastItem key={t.id} toast={t} onClose={() => remove(t.id)} />\n ))}\n </div>\n </ToastContext.Provider>\n )\n}\n\nfunction ToastItem({ toast, onClose }: { toast: Toast; onClose: () => void }) {\n const icons = {\n success: <CheckCircle className=\"h-5 w-5 text-green-500\" />,\n error: <XCircle className=\"h-5 w-5 text-red-500\" />,\n warning: <AlertCircle className=\"h-5 w-5 text-yellow-500\" />,\n info: <Info className=\"h-5 w-5 text-blue-500\" />,\n }\n const borderColors = {\n success: 'border-green-200',\n error: 'border-red-200',\n warning: 'border-yellow-200',\n info: 'border-blue-200',\n }\n\n return (\n <div\n className={clsx(\n 'bg-white shadow-lg rounded-lg border px-4 py-3 flex items-start gap-3 animate-in slide-in-from-right',\n borderColors[toast.type]\n )}\n >\n {icons[toast.type]}\n <div className=\"flex-1 text-sm text-gray-800\">{toast.message}</div>\n <button onClick={onClose} className=\"text-gray-400 hover:text-gray-600\">\n <X className=\"h-4 w-4\" />\n </button>\n </div>\n )\n}\n","import { createContext, useContext, useState, useCallback, ReactNode } from 'react'\nimport { AlertTriangle } from 'lucide-react'\n\ninterface ConfirmOptions {\n title: string\n message: string\n confirmText?: string\n cancelText?: string\n variant?: 'danger' | 'warning' | 'info'\n}\n\ninterface ConfirmContextValue {\n confirm: (options: ConfirmOptions) => Promise<boolean>\n}\n\nconst ConfirmContext = createContext<ConfirmContextValue | null>(null)\n\nexport function useConfirm() {\n const ctx = useContext(ConfirmContext)\n if (!ctx) throw new Error('useConfirm must be used within ConfirmProvider')\n return ctx.confirm\n}\n\nexport function ConfirmProvider({ children }: { children: ReactNode }) {\n const [state, setState] = useState<{\n open: boolean\n options: ConfirmOptions | null\n resolve: ((value: boolean) => void) | null\n }>({ open: false, options: null, resolve: null })\n\n const confirm = useCallback((options: ConfirmOptions): Promise<boolean> => {\n return new Promise((resolve) => {\n setState({ open: true, options, resolve })\n })\n }, [])\n\n const handleClose = (result: boolean) => {\n if (state.resolve) state.resolve(result)\n setState({ open: false, options: null, resolve: null })\n }\n\n const variant = state.options?.variant || 'danger'\n const iconColor = {\n danger: 'text-red-600',\n warning: 'text-yellow-600',\n info: 'text-blue-600',\n }[variant]\n const btnColor = {\n danger: 'bg-red-600 hover:bg-red-700',\n warning: 'bg-yellow-600 hover:bg-yellow-700',\n info: 'bg-indigo-600 hover:bg-indigo-700',\n }[variant]\n\n return (\n <ConfirmContext.Provider value={{ confirm }}>\n {children}\n {state.open && state.options && (\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center\">\n <div\n className=\"absolute inset-0 bg-black bg-opacity-50\"\n onClick={() => handleClose(false)}\n />\n <div className=\"relative bg-white rounded-lg shadow-xl max-w-md w-full mx-4 p-6\">\n <div className=\"flex items-start gap-4\">\n <div className={`flex-shrink-0 ${iconColor}`}>\n <AlertTriangle className=\"h-6 w-6\" />\n </div>\n <div className=\"flex-1\">\n <h3 className=\"text-lg font-semibold text-gray-900 mb-2\">\n {state.options.title}\n </h3>\n <p className=\"text-sm text-gray-600 whitespace-pre-wrap\">\n {state.options.message}\n </p>\n </div>\n </div>\n <div className=\"flex justify-end gap-2 mt-6\">\n <button\n onClick={() => handleClose(false)}\n className=\"px-4 py-2 text-sm text-gray-700 bg-white border border-gray-300 rounded hover:bg-gray-50\"\n >\n {state.options.cancelText || '取消'}\n </button>\n <button\n onClick={() => handleClose(true)}\n className={`px-4 py-2 text-sm text-white rounded ${btnColor}`}\n >\n {state.options.confirmText || '确定'}\n </button>\n </div>\n </div>\n </div>\n )}\n </ConfirmContext.Provider>\n )\n}\n","import React from 'react'\nimport ReactDOM from 'react-dom/client'\nimport { BrowserRouter } from 'react-router-dom'\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query'\nimport App from './App'\nimport { ToastProvider } from './components/Toast'\nimport { ConfirmProvider } from './components/Confirm'\nimport './index.css'\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n refetchOnWindowFocus: false,\n retry: 1,\n },\n },\n})\n\nReactDOM.createRoot(document.getElementById('root')!).render(\n <React.StrictMode>\n <QueryClientProvider client={queryClient}>\n <ToastProvider>\n <ConfirmProvider>\n <BrowserRouter>\n <App />\n </BrowserRouter>\n </ConfirmProvider>\n </ToastProvider>\n </QueryClientProvider>\n </React.StrictMode>,\n)\n"],"file":"assets/index-DJK5beK6.js"}
@@ -1 +0,0 @@
1
- *,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.pointer-events-none{pointer-events:none}.visible{visibility:visible}.invisible{visibility:hidden}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:sticky}.inset-0{top:0;right:0;bottom:0;left:0}.inset-y-0{top:0;bottom:0}.left-0{left:0}.left-2\.5{left:.625rem}.left-4{left:1rem}.right-0{right:0}.right-2{right:.5rem}.right-4{right:1rem}.top-0{top:0}.top-1\/2{top:50%}.top-10{top:2.5rem}.top-4{top:1rem}.-z-10{z-index:-10}.z-10{z-index:10}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.z-\[9999\]{z-index:9999}.mx-1{margin-left:.25rem;margin-right:.25rem}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mb-0\.5{margin-bottom:.125rem}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-2{margin-left:.5rem}.ml-3{margin-left:.75rem}.ml-4{margin-left:1rem}.ml-8{margin-left:2rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-2{margin-top:.5rem}.mt-3{margin-top:.75rem}.mt-4{margin-top:1rem}.mt-6{margin-top:1.5rem}.line-clamp-2{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2}.line-clamp-3{overflow:hidden;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3}.block{display:block}.\!inline{display:inline!important}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-14{height:3.5rem}.h-2{height:.5rem}.h-3{height:.75rem}.h-3\.5{height:.875rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-60{height:15rem}.h-8{height:2rem}.h-full{height:100%}.max-h-64{max-height:16rem}.max-h-\[500px\]{max-height:500px}.min-h-screen{min-height:100vh}.w-0\.5{width:.125rem}.w-10{width:2.5rem}.w-12{width:3rem}.w-16{width:4rem}.w-3{width:.75rem}.w-3\.5{width:.875rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-64{width:16rem}.w-8{width:2rem}.w-\[600px\]{width:600px}.w-\[800px\]{width:800px}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-full{min-width:100%}.max-w-2xl{max-width:42rem}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.max-w-md{max-width:28rem}.max-w-none{max-width:none}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.flex-shrink-0,.shrink-0{flex-shrink:0}.flex-grow{flex-grow:1}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-0{--tw-translate-x: 0px;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.translate-x-full{--tw-translate-x: 100%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-pointer{cursor:pointer}.list-inside{list-style-position:inside}.list-decimal{list-style-type:decimal}.list-disc{list-style-type:disc}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-1{gap:.25rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-1\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.375rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.375rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.divide-y>:not([hidden])~:not([hidden]){--tw-divide-y-reverse: 0;border-top-width:calc(1px * calc(1 - var(--tw-divide-y-reverse)));border-bottom-width:calc(1px * var(--tw-divide-y-reverse))}.divide-gray-200>:not([hidden])~:not([hidden]){--tw-divide-opacity: 1;border-color:rgb(229 231 235 / var(--tw-divide-opacity, 1))}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.whitespace-pre-wrap{white-space:pre-wrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-md{border-radius:.375rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-l-2{border-left-width:2px}.border-l-4{border-left-width:4px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-amber-300{--tw-border-opacity: 1;border-color:rgb(252 211 77 / var(--tw-border-opacity, 1))}.border-blue-200{--tw-border-opacity: 1;border-color:rgb(191 219 254 / var(--tw-border-opacity, 1))}.border-gray-100{--tw-border-opacity: 1;border-color:rgb(243 244 246 / var(--tw-border-opacity, 1))}.border-gray-200{--tw-border-opacity: 1;border-color:rgb(229 231 235 / var(--tw-border-opacity, 1))}.border-gray-300{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.border-green-200{--tw-border-opacity: 1;border-color:rgb(187 247 208 / var(--tw-border-opacity, 1))}.border-indigo-200{--tw-border-opacity: 1;border-color:rgb(199 210 254 / var(--tw-border-opacity, 1))}.border-indigo-500{--tw-border-opacity: 1;border-color:rgb(99 102 241 / var(--tw-border-opacity, 1))}.border-orange-200{--tw-border-opacity: 1;border-color:rgb(254 215 170 / var(--tw-border-opacity, 1))}.border-red-200{--tw-border-opacity: 1;border-color:rgb(254 202 202 / var(--tw-border-opacity, 1))}.border-yellow-200{--tw-border-opacity: 1;border-color:rgb(254 240 138 / var(--tw-border-opacity, 1))}.border-t-blue-500{--tw-border-opacity: 1;border-top-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.bg-amber-100{--tw-bg-opacity: 1;background-color:rgb(254 243 199 / var(--tw-bg-opacity, 1))}.bg-amber-50{--tw-bg-opacity: 1;background-color:rgb(255 251 235 / var(--tw-bg-opacity, 1))}.bg-amber-600{--tw-bg-opacity: 1;background-color:rgb(217 119 6 / var(--tw-bg-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-black\/40{background-color:#0006}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-gray-100{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.bg-gray-200{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.bg-gray-400{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.bg-gray-50{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.bg-gray-600{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-300{--tw-bg-opacity: 1;background-color:rgb(134 239 172 / var(--tw-bg-opacity, 1))}.bg-green-50{--tw-bg-opacity: 1;background-color:rgb(240 253 244 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-indigo-100{--tw-bg-opacity: 1;background-color:rgb(224 231 255 / var(--tw-bg-opacity, 1))}.bg-indigo-50{--tw-bg-opacity: 1;background-color:rgb(238 242 255 / var(--tw-bg-opacity, 1))}.bg-indigo-600{--tw-bg-opacity: 1;background-color:rgb(79 70 229 / var(--tw-bg-opacity, 1))}.bg-orange-100{--tw-bg-opacity: 1;background-color:rgb(255 237 213 / var(--tw-bg-opacity, 1))}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-purple-50{--tw-bg-opacity: 1;background-color:rgb(250 245 255 / var(--tw-bg-opacity, 1))}.bg-red-100{--tw-bg-opacity: 1;background-color:rgb(254 226 226 / var(--tw-bg-opacity, 1))}.bg-red-50{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-sky-100{--tw-bg-opacity: 1;background-color:rgb(224 242 254 / var(--tw-bg-opacity, 1))}.bg-white{--tw-bg-opacity: 1;background-color:rgb(255 255 255 / var(--tw-bg-opacity, 1))}.bg-yellow-100{--tw-bg-opacity: 1;background-color:rgb(254 249 195 / var(--tw-bg-opacity, 1))}.bg-yellow-600{--tw-bg-opacity: 1;background-color:rgb(202 138 4 / var(--tw-bg-opacity, 1))}.bg-opacity-0{--tw-bg-opacity: 0}.bg-opacity-50{--tw-bg-opacity: .5}.bg-opacity-75{--tw-bg-opacity: .75}.bg-gradient-to-br{background-image:linear-gradient(to bottom right,var(--tw-gradient-stops))}.from-indigo-500{--tw-gradient-from: #6366f1 var(--tw-gradient-from-position);--tw-gradient-to: rgb(99 102 241 / 0) var(--tw-gradient-to-position);--tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to)}.to-purple-600{--tw-gradient-to: #9333ea var(--tw-gradient-to-position)}.p-1{padding:.25rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-6{padding-top:1.5rem;padding-bottom:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-2{padding-bottom:.5rem}.pb-4{padding-bottom:1rem}.pl-3{padding-left:.75rem}.pl-4{padding-left:1rem}.pl-8{padding-left:2rem}.pr-10{padding-right:2.5rem}.pr-8{padding-right:2rem}.pt-3{padding-top:.75rem}.pt-4{padding-top:1rem}.text-left{text-align:left}.text-center{text-align:center}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-\[10px\]{font-size:10px}.text-\[11px\]{font-size:11px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-normal{font-weight:400}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.italic{font-style:italic}.leading-relaxed{line-height:1.625}.tracking-wider{letter-spacing:.05em}.text-amber-600{--tw-text-opacity: 1;color:rgb(217 119 6 / var(--tw-text-opacity, 1))}.text-amber-700{--tw-text-opacity: 1;color:rgb(180 83 9 / var(--tw-text-opacity, 1))}.text-amber-800{--tw-text-opacity: 1;color:rgb(146 64 14 / var(--tw-text-opacity, 1))}.text-blue-500{--tw-text-opacity: 1;color:rgb(59 130 246 / var(--tw-text-opacity, 1))}.text-blue-600{--tw-text-opacity: 1;color:rgb(37 99 235 / var(--tw-text-opacity, 1))}.text-blue-700{--tw-text-opacity: 1;color:rgb(29 78 216 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-gray-800{--tw-text-opacity: 1;color:rgb(31 41 55 / var(--tw-text-opacity, 1))}.text-gray-900{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-green-600{--tw-text-opacity: 1;color:rgb(22 163 74 / var(--tw-text-opacity, 1))}.text-green-700{--tw-text-opacity: 1;color:rgb(21 128 61 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-indigo-600{--tw-text-opacity: 1;color:rgb(79 70 229 / var(--tw-text-opacity, 1))}.text-indigo-700{--tw-text-opacity: 1;color:rgb(67 56 202 / var(--tw-text-opacity, 1))}.text-orange-600{--tw-text-opacity: 1;color:rgb(234 88 12 / var(--tw-text-opacity, 1))}.text-orange-800{--tw-text-opacity: 1;color:rgb(154 52 18 / var(--tw-text-opacity, 1))}.text-purple-600{--tw-text-opacity: 1;color:rgb(147 51 234 / var(--tw-text-opacity, 1))}.text-purple-700{--tw-text-opacity: 1;color:rgb(126 34 206 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-red-600{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.text-red-700{--tw-text-opacity: 1;color:rgb(185 28 28 / var(--tw-text-opacity, 1))}.text-red-800{--tw-text-opacity: 1;color:rgb(153 27 27 / var(--tw-text-opacity, 1))}.text-sky-600{--tw-text-opacity: 1;color:rgb(2 132 199 / var(--tw-text-opacity, 1))}.text-sky-700{--tw-text-opacity: 1;color:rgb(3 105 161 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.text-yellow-600{--tw-text-opacity: 1;color:rgb(202 138 4 / var(--tw-text-opacity, 1))}.text-yellow-700{--tw-text-opacity: 1;color:rgb(161 98 7 / var(--tw-text-opacity, 1))}.underline{text-decoration-line:underline}.opacity-50{opacity:.5}.shadow{--tw-shadow: 0 1px 3px 0 rgb(0 0 0 / .1), 0 1px 2px -1px rgb(0 0 0 / .1);--tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.ring-1{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.ring-amber-200{--tw-ring-opacity: 1;--tw-ring-color: rgb(253 230 138 / var(--tw-ring-opacity, 1))}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-shadow{transition-property:box-shadow;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-transform{transition-property:transform;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-500{transition-duration:.5s}:root{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,PingFang SC,sans-serif;line-height:1.5;font-weight:400;color-scheme:light;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{margin:0;min-height:100vh}.hover\:border-gray-300:hover{--tw-border-opacity: 1;border-color:rgb(209 213 219 / var(--tw-border-opacity, 1))}.hover\:bg-amber-700:hover{--tw-bg-opacity: 1;background-color:rgb(180 83 9 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-100:hover{--tw-bg-opacity: 1;background-color:rgb(243 244 246 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-200:hover{--tw-bg-opacity: 1;background-color:rgb(229 231 235 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-50:hover{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.hover\:bg-indigo-700:hover{--tw-bg-opacity: 1;background-color:rgb(67 56 202 / var(--tw-bg-opacity, 1))}.hover\:bg-orange-50:hover{--tw-bg-opacity: 1;background-color:rgb(255 247 237 / var(--tw-bg-opacity, 1))}.hover\:bg-red-50:hover{--tw-bg-opacity: 1;background-color:rgb(254 242 242 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-yellow-700:hover{--tw-bg-opacity: 1;background-color:rgb(161 98 7 / var(--tw-bg-opacity, 1))}.hover\:text-gray-600:hover{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.hover\:text-gray-700:hover{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.hover\:text-gray-900:hover{--tw-text-opacity: 1;color:rgb(17 24 39 / var(--tw-text-opacity, 1))}.hover\:text-indigo-700:hover{--tw-text-opacity: 1;color:rgb(67 56 202 / var(--tw-text-opacity, 1))}.hover\:text-red-600:hover{--tw-text-opacity: 1;color:rgb(220 38 38 / var(--tw-text-opacity, 1))}.hover\:shadow-md:hover{--tw-shadow: 0 4px 6px -1px rgb(0 0 0 / .1), 0 2px 4px -2px rgb(0 0 0 / .1);--tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.focus\:border-indigo-500:focus{--tw-border-opacity: 1;border-color:rgb(99 102 241 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-1:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-indigo-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-gray-400:disabled{--tw-bg-opacity: 1;background-color:rgb(156 163 175 / var(--tw-bg-opacity, 1))}.disabled\:bg-gray-50:disabled{--tw-bg-opacity: 1;background-color:rgb(249 250 251 / var(--tw-bg-opacity, 1))}.disabled\:text-gray-400:disabled{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.disabled\:opacity-50:disabled{opacity:.5}@media (min-width: 640px){.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}}@media (min-width: 768px){.md\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.md\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}}@media (min-width: 1024px){.lg\:fixed{position:fixed}.lg\:inset-y-0{top:0;bottom:0}.lg\:flex{display:flex}.lg\:hidden{display:none}.lg\:w-64{width:16rem}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:flex-col{flex-direction:column}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pl-64{padding-left:16rem}}
@@ -1 +0,0 @@
1
- {"version":3,"file":"lucide-BanPULT1.js","sources":["../../node_modules/lucide-react/dist/esm/shared/src/utils.js","../../node_modules/lucide-react/dist/esm/defaultAttributes.js","../../node_modules/lucide-react/dist/esm/Icon.js","../../node_modules/lucide-react/dist/esm/createLucideIcon.js","../../node_modules/lucide-react/dist/esm/icons/activity.js","../../node_modules/lucide-react/dist/esm/icons/arrow-left.js","../../node_modules/lucide-react/dist/esm/icons/book-open.js","../../node_modules/lucide-react/dist/esm/icons/bot.js","../../node_modules/lucide-react/dist/esm/icons/circle-alert.js","../../node_modules/lucide-react/dist/esm/icons/circle-check-big.js","../../node_modules/lucide-react/dist/esm/icons/circle-stop.js","../../node_modules/lucide-react/dist/esm/icons/circle-x.js","../../node_modules/lucide-react/dist/esm/icons/circle.js","../../node_modules/lucide-react/dist/esm/icons/clock.js","../../node_modules/lucide-react/dist/esm/icons/cpu.js","../../node_modules/lucide-react/dist/esm/icons/download.js","../../node_modules/lucide-react/dist/esm/icons/eye-off.js","../../node_modules/lucide-react/dist/esm/icons/eye.js","../../node_modules/lucide-react/dist/esm/icons/file-code.js","../../node_modules/lucide-react/dist/esm/icons/file-pen.js","../../node_modules/lucide-react/dist/esm/icons/file-text.js","../../node_modules/lucide-react/dist/esm/icons/filter.js","../../node_modules/lucide-react/dist/esm/icons/git-branch.js","../../node_modules/lucide-react/dist/esm/icons/git-commit-horizontal.js","../../node_modules/lucide-react/dist/esm/icons/info.js","../../node_modules/lucide-react/dist/esm/icons/layout-dashboard.js","../../node_modules/lucide-react/dist/esm/icons/loader-circle.js","../../node_modules/lucide-react/dist/esm/icons/menu.js","../../node_modules/lucide-react/dist/esm/icons/message-square.js","../../node_modules/lucide-react/dist/esm/icons/monitor.js","../../node_modules/lucide-react/dist/esm/icons/network.js","../../node_modules/lucide-react/dist/esm/icons/pen.js","../../node_modules/lucide-react/dist/esm/icons/plus.js","../../node_modules/lucide-react/dist/esm/icons/save.js","../../node_modules/lucide-react/dist/esm/icons/search.js","../../node_modules/lucide-react/dist/esm/icons/terminal.js","../../node_modules/lucide-react/dist/esm/icons/trash-2.js","../../node_modules/lucide-react/dist/esm/icons/trending-up.js","../../node_modules/lucide-react/dist/esm/icons/triangle-alert.js","../../node_modules/lucide-react/dist/esm/icons/user.js","../../node_modules/lucide-react/dist/esm/icons/wifi-off.js","../../node_modules/lucide-react/dist/esm/icons/wifi.js","../../node_modules/lucide-react/dist/esm/icons/x.js","../../node_modules/lucide-react/dist/esm/icons/zap.js"],"sourcesContent":["/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nconst toKebabCase = (string) => string.replace(/([a-z0-9])([A-Z])/g, \"$1-$2\").toLowerCase();\nconst mergeClasses = (...classes) => classes.filter((className, index, array) => {\n return Boolean(className) && array.indexOf(className) === index;\n}).join(\" \");\n\nexport { mergeClasses, toKebabCase };\n//# sourceMappingURL=utils.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nvar defaultAttributes = {\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 24,\n height: 24,\n viewBox: \"0 0 24 24\",\n fill: \"none\",\n stroke: \"currentColor\",\n strokeWidth: 2,\n strokeLinecap: \"round\",\n strokeLinejoin: \"round\"\n};\n\nexport { defaultAttributes as default };\n//# sourceMappingURL=defaultAttributes.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport defaultAttributes from './defaultAttributes.js';\nimport { mergeClasses } from './shared/src/utils.js';\n\nconst Icon = forwardRef(\n ({\n color = \"currentColor\",\n size = 24,\n strokeWidth = 2,\n absoluteStrokeWidth,\n className = \"\",\n children,\n iconNode,\n ...rest\n }, ref) => {\n return createElement(\n \"svg\",\n {\n ref,\n ...defaultAttributes,\n width: size,\n height: size,\n stroke: color,\n strokeWidth: absoluteStrokeWidth ? Number(strokeWidth) * 24 / Number(size) : strokeWidth,\n className: mergeClasses(\"lucide\", className),\n ...rest\n },\n [\n ...iconNode.map(([tag, attrs]) => createElement(tag, attrs)),\n ...Array.isArray(children) ? children : [children]\n ]\n );\n }\n);\n\nexport { Icon as default };\n//# sourceMappingURL=Icon.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport { forwardRef, createElement } from 'react';\nimport { mergeClasses, toKebabCase } from './shared/src/utils.js';\nimport Icon from './Icon.js';\n\nconst createLucideIcon = (iconName, iconNode) => {\n const Component = forwardRef(\n ({ className, ...props }, ref) => createElement(Icon, {\n ref,\n iconNode,\n className: mergeClasses(`lucide-${toKebabCase(iconName)}`, className),\n ...props\n })\n );\n Component.displayName = `${iconName}`;\n return Component;\n};\n\nexport { createLucideIcon as default };\n//# sourceMappingURL=createLucideIcon.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Activity = createLucideIcon(\"Activity\", [\n [\n \"path\",\n {\n d: \"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2\",\n key: \"169zse\"\n }\n ]\n]);\n\nexport { Activity as default };\n//# sourceMappingURL=activity.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst ArrowLeft = createLucideIcon(\"ArrowLeft\", [\n [\"path\", { d: \"m12 19-7-7 7-7\", key: \"1l729n\" }],\n [\"path\", { d: \"M19 12H5\", key: \"x3x0zl\" }]\n]);\n\nexport { ArrowLeft as default };\n//# sourceMappingURL=arrow-left.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst BookOpen = createLucideIcon(\"BookOpen\", [\n [\"path\", { d: \"M2 3h6a4 4 0 0 1 4 4v14a3 3 0 0 0-3-3H2z\", key: \"vv98re\" }],\n [\"path\", { d: \"M22 3h-6a4 4 0 0 0-4 4v14a3 3 0 0 1 3-3h7z\", key: \"1cyq3y\" }]\n]);\n\nexport { BookOpen as default };\n//# sourceMappingURL=book-open.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Bot = createLucideIcon(\"Bot\", [\n [\"path\", { d: \"M12 8V4H8\", key: \"hb8ula\" }],\n [\"rect\", { width: \"16\", height: \"12\", x: \"4\", y: \"8\", rx: \"2\", key: \"enze0r\" }],\n [\"path\", { d: \"M2 14h2\", key: \"vft8re\" }],\n [\"path\", { d: \"M20 14h2\", key: \"4cs60a\" }],\n [\"path\", { d: \"M15 13v2\", key: \"1xurst\" }],\n [\"path\", { d: \"M9 13v2\", key: \"rq6x2g\" }]\n]);\n\nexport { Bot as default };\n//# sourceMappingURL=bot.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleAlert = createLucideIcon(\"CircleAlert\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"8\", y2: \"12\", key: \"1pkeuh\" }],\n [\"line\", { x1: \"12\", x2: \"12.01\", y1: \"16\", y2: \"16\", key: \"4dfq90\" }]\n]);\n\nexport { CircleAlert as default };\n//# sourceMappingURL=circle-alert.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleCheckBig = createLucideIcon(\"CircleCheckBig\", [\n [\"path\", { d: \"M22 11.08V12a10 10 0 1 1-5.93-9.14\", key: \"g774vq\" }],\n [\"path\", { d: \"m9 11 3 3L22 4\", key: \"1pflzl\" }]\n]);\n\nexport { CircleCheckBig as default };\n//# sourceMappingURL=circle-check-big.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleStop = createLucideIcon(\"CircleStop\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"rect\", { width: \"6\", height: \"6\", x: \"9\", y: \"9\", key: \"1wrtvo\" }]\n]);\n\nexport { CircleStop as default };\n//# sourceMappingURL=circle-stop.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst CircleX = createLucideIcon(\"CircleX\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"m15 9-6 6\", key: \"1uzhvr\" }],\n [\"path\", { d: \"m9 9 6 6\", key: \"z0biqf\" }]\n]);\n\nexport { CircleX as default };\n//# sourceMappingURL=circle-x.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Circle = createLucideIcon(\"Circle\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }]\n]);\n\nexport { Circle as default };\n//# sourceMappingURL=circle.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Clock = createLucideIcon(\"Clock\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"polyline\", { points: \"12 6 12 12 16 14\", key: \"68esgv\" }]\n]);\n\nexport { Clock as default };\n//# sourceMappingURL=clock.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Cpu = createLucideIcon(\"Cpu\", [\n [\"rect\", { width: \"16\", height: \"16\", x: \"4\", y: \"4\", rx: \"2\", key: \"14l7u7\" }],\n [\"rect\", { width: \"6\", height: \"6\", x: \"9\", y: \"9\", rx: \"1\", key: \"5aljv4\" }],\n [\"path\", { d: \"M15 2v2\", key: \"13l42r\" }],\n [\"path\", { d: \"M15 20v2\", key: \"15mkzm\" }],\n [\"path\", { d: \"M2 15h2\", key: \"1gxd5l\" }],\n [\"path\", { d: \"M2 9h2\", key: \"1bbxkp\" }],\n [\"path\", { d: \"M20 15h2\", key: \"19e6y8\" }],\n [\"path\", { d: \"M20 9h2\", key: \"19tzq7\" }],\n [\"path\", { d: \"M9 2v2\", key: \"165o2o\" }],\n [\"path\", { d: \"M9 20v2\", key: \"i2bqo8\" }]\n]);\n\nexport { Cpu as default };\n//# sourceMappingURL=cpu.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Download = createLucideIcon(\"Download\", [\n [\"path\", { d: \"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\", key: \"ih7n3h\" }],\n [\"polyline\", { points: \"7 10 12 15 17 10\", key: \"2ggqvy\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"15\", y2: \"3\", key: \"1vk2je\" }]\n]);\n\nexport { Download as default };\n//# sourceMappingURL=download.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst EyeOff = createLucideIcon(\"EyeOff\", [\n [\"path\", { d: \"M9.88 9.88a3 3 0 1 0 4.24 4.24\", key: \"1jxqfv\" }],\n [\n \"path\",\n {\n d: \"M10.73 5.08A10.43 10.43 0 0 1 12 5c7 0 10 7 10 7a13.16 13.16 0 0 1-1.67 2.68\",\n key: \"9wicm4\"\n }\n ],\n [\n \"path\",\n { d: \"M6.61 6.61A13.526 13.526 0 0 0 2 12s3 7 10 7a9.74 9.74 0 0 0 5.39-1.61\", key: \"1jreej\" }\n ],\n [\"line\", { x1: \"2\", x2: \"22\", y1: \"2\", y2: \"22\", key: \"a6p6uj\" }]\n]);\n\nexport { EyeOff as default };\n//# sourceMappingURL=eye-off.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Eye = createLucideIcon(\"Eye\", [\n [\"path\", { d: \"M2 12s3-7 10-7 10 7 10 7-3 7-10 7-10-7-10-7Z\", key: \"rwhkz3\" }],\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }]\n]);\n\nexport { Eye as default };\n//# sourceMappingURL=eye.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FileCode = createLucideIcon(\"FileCode\", [\n [\"path\", { d: \"M10 12.5 8 15l2 2.5\", key: \"1tg20x\" }],\n [\"path\", { d: \"m14 12.5 2 2.5-2 2.5\", key: \"yinavb\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7z\", key: \"1mlx9k\" }]\n]);\n\nexport { FileCode as default };\n//# sourceMappingURL=file-code.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FilePen = createLucideIcon(\"FilePen\", [\n [\"path\", { d: \"M12 22h6a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v10\", key: \"x7tsz2\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M10.4 12.6a2 2 0 1 1 3 3L8 21l-4 1 1-4Z\", key: \"o3xyfb\" }]\n]);\n\nexport { FilePen as default };\n//# sourceMappingURL=file-pen.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst FileText = createLucideIcon(\"FileText\", [\n [\"path\", { d: \"M15 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V7Z\", key: \"1rqfz7\" }],\n [\"path\", { d: \"M14 2v4a2 2 0 0 0 2 2h4\", key: \"tnqrlb\" }],\n [\"path\", { d: \"M10 9H8\", key: \"b1mrlr\" }],\n [\"path\", { d: \"M16 13H8\", key: \"t4e002\" }],\n [\"path\", { d: \"M16 17H8\", key: \"z1uh3a\" }]\n]);\n\nexport { FileText as default };\n//# sourceMappingURL=file-text.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Filter = createLucideIcon(\"Filter\", [\n [\"polygon\", { points: \"22 3 2 3 10 12.46 10 19 14 21 14 12.46 22 3\", key: \"1yg77f\" }]\n]);\n\nexport { Filter as default };\n//# sourceMappingURL=filter.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst GitBranch = createLucideIcon(\"GitBranch\", [\n [\"line\", { x1: \"6\", x2: \"6\", y1: \"3\", y2: \"15\", key: \"17qcm7\" }],\n [\"circle\", { cx: \"18\", cy: \"6\", r: \"3\", key: \"1h7g24\" }],\n [\"circle\", { cx: \"6\", cy: \"18\", r: \"3\", key: \"fqmcym\" }],\n [\"path\", { d: \"M18 9a9 9 0 0 1-9 9\", key: \"n2h4wq\" }]\n]);\n\nexport { GitBranch as default };\n//# sourceMappingURL=git-branch.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst GitCommitHorizontal = createLucideIcon(\"GitCommitHorizontal\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"3\", key: \"1v7zrd\" }],\n [\"line\", { x1: \"3\", x2: \"9\", y1: \"12\", y2: \"12\", key: \"1dyftd\" }],\n [\"line\", { x1: \"15\", x2: \"21\", y1: \"12\", y2: \"12\", key: \"oup4p8\" }]\n]);\n\nexport { GitCommitHorizontal as default };\n//# sourceMappingURL=git-commit-horizontal.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Info = createLucideIcon(\"Info\", [\n [\"circle\", { cx: \"12\", cy: \"12\", r: \"10\", key: \"1mglay\" }],\n [\"path\", { d: \"M12 16v-4\", key: \"1dtifu\" }],\n [\"path\", { d: \"M12 8h.01\", key: \"e9boi3\" }]\n]);\n\nexport { Info as default };\n//# sourceMappingURL=info.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst LayoutDashboard = createLucideIcon(\"LayoutDashboard\", [\n [\"rect\", { width: \"7\", height: \"9\", x: \"3\", y: \"3\", rx: \"1\", key: \"10lvy0\" }],\n [\"rect\", { width: \"7\", height: \"5\", x: \"14\", y: \"3\", rx: \"1\", key: \"16une8\" }],\n [\"rect\", { width: \"7\", height: \"9\", x: \"14\", y: \"12\", rx: \"1\", key: \"1hutg5\" }],\n [\"rect\", { width: \"7\", height: \"5\", x: \"3\", y: \"16\", rx: \"1\", key: \"ldoo1y\" }]\n]);\n\nexport { LayoutDashboard as default };\n//# sourceMappingURL=layout-dashboard.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst LoaderCircle = createLucideIcon(\"LoaderCircle\", [\n [\"path\", { d: \"M21 12a9 9 0 1 1-6.219-8.56\", key: \"13zald\" }]\n]);\n\nexport { LoaderCircle as default };\n//# sourceMappingURL=loader-circle.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Menu = createLucideIcon(\"Menu\", [\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"12\", y2: \"12\", key: \"1e0a9i\" }],\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"6\", y2: \"6\", key: \"1owob3\" }],\n [\"line\", { x1: \"4\", x2: \"20\", y1: \"18\", y2: \"18\", key: \"yk5zj1\" }]\n]);\n\nexport { Menu as default };\n//# sourceMappingURL=menu.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst MessageSquare = createLucideIcon(\"MessageSquare\", [\n [\"path\", { d: \"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z\", key: \"1lielz\" }]\n]);\n\nexport { MessageSquare as default };\n//# sourceMappingURL=message-square.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Monitor = createLucideIcon(\"Monitor\", [\n [\"rect\", { width: \"20\", height: \"14\", x: \"2\", y: \"3\", rx: \"2\", key: \"48i651\" }],\n [\"line\", { x1: \"8\", x2: \"16\", y1: \"21\", y2: \"21\", key: \"1svkeh\" }],\n [\"line\", { x1: \"12\", x2: \"12\", y1: \"17\", y2: \"21\", key: \"vw1qmm\" }]\n]);\n\nexport { Monitor as default };\n//# sourceMappingURL=monitor.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Network = createLucideIcon(\"Network\", [\n [\"rect\", { x: \"16\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"4q2zg0\" }],\n [\"rect\", { x: \"2\", y: \"16\", width: \"6\", height: \"6\", rx: \"1\", key: \"8cvhb9\" }],\n [\"rect\", { x: \"9\", y: \"2\", width: \"6\", height: \"6\", rx: \"1\", key: \"1egb70\" }],\n [\"path\", { d: \"M5 16v-3a1 1 0 0 1 1-1h12a1 1 0 0 1 1 1v3\", key: \"1jsf9p\" }],\n [\"path\", { d: \"M12 12V8\", key: \"2874zd\" }]\n]);\n\nexport { Network as default };\n//# sourceMappingURL=network.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Pen = createLucideIcon(\"Pen\", [\n [\"path\", { d: \"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z\", key: \"5qss01\" }]\n]);\n\nexport { Pen as default };\n//# sourceMappingURL=pen.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Plus = createLucideIcon(\"Plus\", [\n [\"path\", { d: \"M5 12h14\", key: \"1ays0h\" }],\n [\"path\", { d: \"M12 5v14\", key: \"s699le\" }]\n]);\n\nexport { Plus as default };\n//# sourceMappingURL=plus.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Save = createLucideIcon(\"Save\", [\n [\n \"path\",\n {\n d: \"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\",\n key: \"1c8476\"\n }\n ],\n [\"path\", { d: \"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7\", key: \"1ydtos\" }],\n [\"path\", { d: \"M7 3v4a1 1 0 0 0 1 1h7\", key: \"t51u73\" }]\n]);\n\nexport { Save as default };\n//# sourceMappingURL=save.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Search = createLucideIcon(\"Search\", [\n [\"circle\", { cx: \"11\", cy: \"11\", r: \"8\", key: \"4ej97u\" }],\n [\"path\", { d: \"m21 21-4.3-4.3\", key: \"1qie3q\" }]\n]);\n\nexport { Search as default };\n//# sourceMappingURL=search.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Terminal = createLucideIcon(\"Terminal\", [\n [\"polyline\", { points: \"4 17 10 11 4 5\", key: \"akl6gq\" }],\n [\"line\", { x1: \"12\", x2: \"20\", y1: \"19\", y2: \"19\", key: \"q2wloq\" }]\n]);\n\nexport { Terminal as default };\n//# sourceMappingURL=terminal.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Trash2 = createLucideIcon(\"Trash2\", [\n [\"path\", { d: \"M3 6h18\", key: \"d0wm0j\" }],\n [\"path\", { d: \"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6\", key: \"4alrt4\" }],\n [\"path\", { d: \"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2\", key: \"v07s0e\" }],\n [\"line\", { x1: \"10\", x2: \"10\", y1: \"11\", y2: \"17\", key: \"1uufr5\" }],\n [\"line\", { x1: \"14\", x2: \"14\", y1: \"11\", y2: \"17\", key: \"xtxkd\" }]\n]);\n\nexport { Trash2 as default };\n//# sourceMappingURL=trash-2.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst TrendingUp = createLucideIcon(\"TrendingUp\", [\n [\"polyline\", { points: \"22 7 13.5 15.5 8.5 10.5 2 17\", key: \"126l90\" }],\n [\"polyline\", { points: \"16 7 22 7 22 13\", key: \"kwv8wd\" }]\n]);\n\nexport { TrendingUp as default };\n//# sourceMappingURL=trending-up.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst TriangleAlert = createLucideIcon(\"TriangleAlert\", [\n [\n \"path\",\n {\n d: \"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\",\n key: \"wmoenq\"\n }\n ],\n [\"path\", { d: \"M12 9v4\", key: \"juzpu7\" }],\n [\"path\", { d: \"M12 17h.01\", key: \"p32p05\" }]\n]);\n\nexport { TriangleAlert as default };\n//# sourceMappingURL=triangle-alert.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst User = createLucideIcon(\"User\", [\n [\"path\", { d: \"M19 21v-2a4 4 0 0 0-4-4H9a4 4 0 0 0-4 4v2\", key: \"975kel\" }],\n [\"circle\", { cx: \"12\", cy: \"7\", r: \"4\", key: \"17ys0d\" }]\n]);\n\nexport { User as default };\n//# sourceMappingURL=user.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst WifiOff = createLucideIcon(\"WifiOff\", [\n [\"path\", { d: \"M12 20h.01\", key: \"zekei9\" }],\n [\"path\", { d: \"M8.5 16.429a5 5 0 0 1 7 0\", key: \"1bycff\" }],\n [\"path\", { d: \"M5 12.859a10 10 0 0 1 5.17-2.69\", key: \"1dl1wf\" }],\n [\"path\", { d: \"M19 12.859a10 10 0 0 0-2.007-1.523\", key: \"4k23kn\" }],\n [\"path\", { d: \"M2 8.82a15 15 0 0 1 4.177-2.643\", key: \"1grhjp\" }],\n [\"path\", { d: \"M22 8.82a15 15 0 0 0-11.288-3.764\", key: \"z3jwby\" }],\n [\"path\", { d: \"m2 2 20 20\", key: \"1ooewy\" }]\n]);\n\nexport { WifiOff as default };\n//# sourceMappingURL=wifi-off.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Wifi = createLucideIcon(\"Wifi\", [\n [\"path\", { d: \"M12 20h.01\", key: \"zekei9\" }],\n [\"path\", { d: \"M2 8.82a15 15 0 0 1 20 0\", key: \"dnpr2z\" }],\n [\"path\", { d: \"M5 12.859a10 10 0 0 1 14 0\", key: \"1x1e6c\" }],\n [\"path\", { d: \"M8.5 16.429a5 5 0 0 1 7 0\", key: \"1bycff\" }]\n]);\n\nexport { Wifi as default };\n//# sourceMappingURL=wifi.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst X = createLucideIcon(\"X\", [\n [\"path\", { d: \"M18 6 6 18\", key: \"1bl5f8\" }],\n [\"path\", { d: \"m6 6 12 12\", key: \"d8bk6v\" }]\n]);\n\nexport { X as default };\n//# sourceMappingURL=x.js.map\n","/**\n * @license lucide-react v0.379.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */\n\nimport createLucideIcon from '../createLucideIcon.js';\n\nconst Zap = createLucideIcon(\"Zap\", [\n [\n \"path\",\n {\n d: \"M4 14a1 1 0 0 1-.78-1.63l9.9-10.2a.5.5 0 0 1 .86.46l-1.92 6.02A1 1 0 0 0 13 10h7a1 1 0 0 1 .78 1.63l-9.9 10.2a.5.5 0 0 1-.86-.46l1.92-6.02A1 1 0 0 0 11 14z\",\n key: \"1xq2db\"\n }\n ]\n]);\n\nexport { Zap as default };\n//# sourceMappingURL=zap.js.map\n"],"names":["toKebabCase","string","mergeClasses","classes","className","index","array","defaultAttributes","Icon","forwardRef","color","size","strokeWidth","absoluteStrokeWidth","children","iconNode","rest","ref","createElement","tag","attrs","createLucideIcon","iconName","Component","props","Activity","ArrowLeft","BookOpen","Bot","CircleAlert","CircleCheckBig","CircleStop","CircleX","Circle","Clock","Cpu","Download","EyeOff","Eye","FileCode","FilePen","FileText","Filter","GitBranch","GitCommitHorizontal","Info","LayoutDashboard","LoaderCircle","Menu","MessageSquare","Monitor","Network","Pen","Plus","Save","Search","Terminal","Trash2","TrendingUp","TriangleAlert","User","WifiOff","Wifi","X","Zap"],"mappings":"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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43]}