@lelu-auth/lelu 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{client-DL75VVER.d.mts → client-DauLJ9a4.d.mts} +140 -1
- package/dist/{client-DL75VVER.d.ts → client-DauLJ9a4.d.ts} +140 -1
- package/dist/express/index.d.mts +1 -1
- package/dist/express/index.d.ts +1 -1
- package/dist/express/index.js +122 -0
- package/dist/express/index.js.map +1 -1
- package/dist/express/index.mjs +122 -0
- package/dist/express/index.mjs.map +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +122 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +122 -0
- package/dist/index.mjs.map +1 -1
- package/dist/langchain/index.d.mts +1 -1
- package/dist/langchain/index.d.ts +1 -1
- package/dist/react/index.js +122 -0
- package/dist/react/index.js.map +1 -1
- package/dist/react/index.mjs +122 -0
- package/dist/react/index.mjs.map +1 -1
- package/package.json +1 -1
- package/scripts/audit-log.js +97 -0
- package/scripts/lelu.js +39 -44
- package/scripts/policies.js +241 -0
package/dist/react/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/types.ts","../../src/client.ts","../../src/react/LeluApprovalUI.tsx","../../src/react/AgentReputationDashboard.tsx","../../src/react/index.ts"],"names":["z","jsxs","jsx","useState","useEffect","useMemo","SearchIcon"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\r\n\r\n// ─── Request / Response schemas ───────────────────────────────────────────────\r\n\r\nexport const AuthRequestSchema = z.object({\r\n userId: z.string().min(1, \"userId is required\"),\r\n action: z.string().min(1, \"action is required\"),\r\n resource: z.record(z.string()).optional(),\r\n});\r\n\r\nexport const AgentContextSchema = z.object({\r\n /** LLM confidence score — 0.0 to 1.0 */\r\n confidence: z.number().min(0).max(1),\r\n /** User the agent is acting on behalf of */\r\n actingFor: z.string().optional(),\r\n /** Requested agent scope */\r\n scope: z.string().optional(),\r\n});\r\n\r\nexport const AgentAuthRequestSchema = z.object({\r\n actor: z.string().min(1, \"actor is required\"),\r\n action: z.string().min(1, \"action is required\"),\r\n resource: z.record(z.string()).optional(),\r\n context: AgentContextSchema,\r\n});\r\n\r\nexport const MintTokenRequestSchema = z.object({\r\n scope: z.string().min(1),\r\n actingFor: z.string().optional(),\r\n ttlSeconds: z.number().int().positive().optional(),\r\n});\r\n\r\nexport const DelegateScopeRequestSchema = z.object({\r\n delegator: z.string().min(1, \"delegator is required\"),\r\n delegatee: z.string().min(1, \"delegatee is required\"),\r\n scopedTo: z.array(z.string().min(1)).optional(),\r\n ttlSeconds: z.number().int().positive().optional(),\r\n confidence: z.number().min(0).max(1).optional(),\r\n actingFor: z.string().optional(),\r\n tenantId: z.string().optional(),\r\n});\r\n\r\n// ─── Decision types ───────────────────────────────────────────────────────────\r\n\r\nexport interface AuthDecision {\r\n allowed: boolean;\r\n reason: string;\r\n traceId: string;\r\n}\r\n\r\nexport interface AgentAuthDecision {\r\n allowed: boolean;\r\n reason: string;\r\n traceId: string;\r\n downgradedScope: string | undefined;\r\n requiresHumanReview: boolean;\r\n confidenceUsed: number;\r\n}\r\n\r\nexport interface MintTokenResult {\r\n token: string;\r\n tokenId: string;\r\n expiresAt: Date;\r\n}\r\n\r\nexport interface DelegateScopeRequest {\r\n /** Agent delegating the scope */\r\n delegator: string;\r\n /** Agent receiving the constrained sub-scope */\r\n delegatee: string;\r\n /** Actions to grant (must be subset of policy's can_delegate.scoped_to) */\r\n scopedTo?: string[];\r\n /** Token TTL in seconds — capped by the policy's max_ttl_seconds */\r\n ttlSeconds?: number;\r\n /** Delegator's confidence score — checked against require_confidence_above */\r\n confidence?: number;\r\n /** User the delegated agent acts on behalf of */\r\n actingFor?: string;\r\n tenantId?: string;\r\n}\r\n\r\nexport interface DelegateScopeResult {\r\n token: string;\r\n tokenId: string;\r\n expiresAt: Date;\r\n delegator: string;\r\n delegatee: string;\r\n grantedScopes: string[];\r\n traceId: string;\r\n}\r\n\r\nexport interface RevokeTokenResult {\r\n success: boolean;\r\n}\r\n\r\n// ─── Typed Input types ───────────────────────────────────────────────────────\r\n\r\nexport type AuthRequest = z.infer<typeof AuthRequestSchema>;\r\nexport type AgentAuthRequest = z.infer<typeof AgentAuthRequestSchema>;\r\nexport type AgentContext = z.infer<typeof AgentContextSchema>;\r\nexport type MintTokenRequest = z.infer<typeof MintTokenRequestSchema>;\r\n\r\n// ─── Client config ────────────────────────────────────────────────────────────\r\n\r\nexport interface ClientConfig {\r\n /** Base URL of the Auth Permission Engine (defaults to LELU_BASE_URL env var, else http://localhost:8080) */\r\n baseUrl?: string;\r\n /** Request timeout in milliseconds (default: 5000) */\r\n timeoutMs?: number;\r\n /** Optional bearer token for authenticating with the engine */\r\n apiKey?: string;\r\n}\r\n\r\n// ─── Error type ───────────────────────────────────────────────────────────────\r\n\r\nexport class AuthEngineError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly status?: number,\r\n public readonly details?: unknown\r\n ) {\r\n super(message);\r\n this.name = \"AuthEngineError\";\r\n }\r\n}\r\n","import {\r\n AuthEngineError,\r\n AuthRequestSchema,\r\n AgentAuthRequestSchema,\r\n MintTokenRequestSchema,\r\n DelegateScopeRequestSchema,\r\n type AuthDecision,\r\n type AgentAuthDecision,\r\n type MintTokenResult,\r\n type DelegateScopeResult,\r\n type DelegateScopeRequest,\r\n type RevokeTokenResult,\r\n type AuthRequest,\r\n type AgentAuthRequest,\r\n type MintTokenRequest,\r\n type ClientConfig,\r\n} from \"./types.js\";\r\n\r\n// ─── Client ───────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * LeluClient is the core SDK entry-point. It communicates with the local\r\n * Auth Permission Engine sidecar over HTTP/JSON.\r\n *\r\n * @example\r\n * ```ts\r\n * const lelu = new LeluClient({ baseUrl: \"http://localhost:8080\" });\r\n *\r\n * const decision = await lelu.agentAuthorize({\r\n * actor: \"invoice_bot\",\r\n * action: \"approve_refunds\",\r\n * context: { confidence: 0.92, actingFor: \"user_123\" },\r\n * });\r\n *\r\n * if (!decision.allowed) {\r\n * console.log(decision.reason);\r\n * }\r\n * ```\r\n */\r\nexport class LeluClient {\r\n private readonly baseUrl: string;\r\n private readonly timeoutMs: number;\r\n private readonly apiKey: string | undefined;\r\n\r\n constructor(cfg: ClientConfig = {}) {\r\n const envBaseUrl =\r\n typeof process !== \"undefined\" && process.env\r\n ? process.env[\"LELU_BASE_URL\"]\r\n : undefined;\r\n this.baseUrl = (cfg.baseUrl ?? envBaseUrl ?? \"http://localhost:8080\").replace(/\\/$/, \"\");\r\n this.timeoutMs = cfg.timeoutMs ?? 5_000;\r\n this.apiKey = cfg.apiKey;\r\n }\r\n\r\n // ── Human authorization ────────────────────────────────────────────────────\r\n\r\n /**\r\n * Checks whether a human user is permitted to perform an action.\r\n */\r\n async authorize(req: AuthRequest): Promise<AuthDecision> {\r\n const validated = AuthRequestSchema.parse(req);\r\n const body = {\r\n user_id: validated.userId,\r\n action: validated.action,\r\n resource: validated.resource,\r\n };\r\n const data = await this.post<{\r\n allowed: boolean;\r\n reason: string;\r\n trace_id: string;\r\n }>(\"/v1/authorize\", body);\r\n\r\n return {\r\n allowed: data.allowed,\r\n reason: data.reason,\r\n traceId: data.trace_id,\r\n };\r\n }\r\n\r\n // ── Agent authorization ────────────────────────────────────────────────────\r\n\r\n /**\r\n * Checks whether an AI agent is permitted to perform an action, taking the\r\n * confidence score into account (Confidence-Aware Auth ★).\r\n */\r\n async agentAuthorize(req: AgentAuthRequest): Promise<AgentAuthDecision> {\r\n const validated = AgentAuthRequestSchema.parse(req);\r\n const body = {\r\n actor: validated.actor,\r\n action: validated.action,\r\n resource: validated.resource,\r\n confidence: validated.context.confidence,\r\n acting_for: validated.context.actingFor,\r\n scope: validated.context.scope,\r\n };\r\n const data = await this.post<{\r\n allowed: boolean;\r\n reason: string;\r\n trace_id: string;\r\n downgraded_scope?: string;\r\n requires_human_review: boolean;\r\n confidence_used: number;\r\n }>(\"/v1/agent/authorize\", body);\r\n\r\n return {\r\n allowed: data.allowed,\r\n reason: data.reason,\r\n traceId: data.trace_id,\r\n downgradedScope: data.downgraded_scope,\r\n requiresHumanReview: data.requires_human_review,\r\n confidenceUsed: data.confidence_used,\r\n };\r\n }\r\n\r\n // ── JIT Token minting ──────────────────────────────────────────────────────\r\n\r\n /**\r\n * Mints a scoped JWT for an agent with an optional TTL.\r\n * Default TTL is 60 seconds.\r\n */\r\n async mintToken(req: MintTokenRequest): Promise<MintTokenResult> {\r\n const validated = MintTokenRequestSchema.parse(req);\r\n const body = {\r\n scope: validated.scope,\r\n acting_for: validated.actingFor,\r\n ttl_seconds: validated.ttlSeconds ?? 60,\r\n };\r\n const data = await this.post<{\r\n token: string;\r\n token_id: string;\r\n expires_at: number;\r\n }>(\"/v1/tokens/mint\", body);\r\n\r\n return {\r\n token: data.token,\r\n tokenId: data.token_id,\r\n expiresAt: new Date(data.expires_at * 1000),\r\n };\r\n }\r\n\r\n // ── Token revocation ───────────────────────────────────────────────────────\r\n\r\n /**\r\n * Immediately revokes a JIT token by its ID.\r\n */\r\n async revokeToken(tokenId: string): Promise<RevokeTokenResult> {\r\n const data = await this.delete<{ success: boolean }>(\r\n `/v1/tokens/${encodeURIComponent(tokenId)}`\r\n );\r\n return { success: data.success };\r\n }\r\n\r\n // ── Multi-agent delegation ─────────────────────────────────────────────────\r\n\r\n /**\r\n * Delegates a constrained sub-scope from one agent to another.\r\n *\r\n * Validates the delegation rule in the loaded policy, caps the TTL to the\r\n * policy maximum, and mints a child JIT token scoped to the granted actions.\r\n *\r\n * The delegator's `confidence` score is checked against the policy's\r\n * `require_confidence_above` before delegation is granted.\r\n */\r\n async delegateScope(req: DelegateScopeRequest): Promise<DelegateScopeResult> {\r\n const validated = DelegateScopeRequestSchema.parse(req);\r\n const body = {\r\n delegator: validated.delegator,\r\n delegatee: validated.delegatee,\r\n scoped_to: validated.scopedTo ?? [],\r\n ttl_seconds: validated.ttlSeconds ?? 60,\r\n confidence: validated.confidence ?? 1.0,\r\n acting_for: validated.actingFor ?? \"\",\r\n tenant_id: validated.tenantId ?? \"\",\r\n };\r\n const data = await this.post<{\r\n token: string;\r\n token_id: string;\r\n expires_at: number;\r\n delegator: string;\r\n delegatee: string;\r\n granted_scopes: string[];\r\n trace_id: string;\r\n }>(\"/v1/agent/delegate\", body);\r\n\r\n return {\r\n token: data.token,\r\n tokenId: data.token_id,\r\n expiresAt: new Date(data.expires_at * 1000),\r\n delegator: data.delegator,\r\n delegatee: data.delegatee,\r\n grantedScopes: data.granted_scopes,\r\n traceId: data.trace_id,\r\n };\r\n }\r\n\r\n // ── Health check ───────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Returns true if the engine is reachable and healthy.\r\n */\r\n async isHealthy(): Promise<boolean> {\r\n try {\r\n const data = await this.get<{ status: string }>(\"/healthz\");\r\n return data.status === \"ok\";\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n // ── HTTP helpers ───────────────────────────────────────────────────────────\r\n\r\n private headers(): Record<string, string> {\r\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\r\n if (this.apiKey) {\r\n h[\"Authorization\"] = `Bearer ${this.apiKey}`;\r\n }\r\n return h;\r\n }\r\n\r\n private async post<T>(path: string, body: unknown): Promise<T> {\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\r\n try {\r\n const res = await fetch(`${this.baseUrl}${path}`, {\r\n method: \"POST\",\r\n headers: this.headers(),\r\n body: JSON.stringify(body),\r\n signal: ctrl.signal,\r\n });\r\n return this.parseResponse<T>(res);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n private async delete<T>(path: string): Promise<T> {\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\r\n try {\r\n const res = await fetch(`${this.baseUrl}${path}`, {\r\n method: \"DELETE\",\r\n headers: this.headers(),\r\n signal: ctrl.signal,\r\n });\r\n return this.parseResponse<T>(res);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n private async get<T>(path: string): Promise<T> {\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\r\n try {\r\n const res = await fetch(`${this.baseUrl}${path}`, {\r\n method: \"GET\",\r\n headers: this.headers(),\r\n signal: ctrl.signal,\r\n });\r\n return this.parseResponse<T>(res);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n private async parseResponse<T>(res: Response): Promise<T> {\r\n const json = (await res.json()) as Record<string, unknown>;\r\n if (!res.ok) {\r\n throw new AuthEngineError(\r\n (json[\"error\"] as string) ?? \"engine error\",\r\n res.status,\r\n json\r\n );\r\n }\r\n return json as T;\r\n }\r\n}\r\n","import React, { useState, useEffect, useMemo } from 'react';\r\n\r\ninterface ApprovalRequest {\r\n id: string;\r\n agentId: string;\r\n action: string;\r\n resource: Record<string, any>;\r\n confidence: number;\r\n reason: string;\r\n timestamp: string;\r\n}\r\n\r\ninterface LeluApprovalUIProps {\r\n apiBaseUrl?: string;\r\n onApprove?: (request: ApprovalRequest) => void;\r\n onDeny?: (request: ApprovalRequest) => void;\r\n pollIntervalMs?: number;\r\n}\r\n\r\n// Simple SVG Icons to avoid external dependencies\r\nconst SearchIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line></svg>\r\n);\r\n\r\nconst CheckIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n);\r\n\r\nconst XIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\r\n);\r\n\r\nconst ChevronDownIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n);\r\n\r\nconst ChevronUpIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"18 15 12 9 6 15\"></polyline></svg>\r\n);\r\n\r\nexport const LeluApprovalUI: React.FC<LeluApprovalUIProps> = ({\r\n apiBaseUrl = 'http://localhost:8080',\r\n onApprove,\r\n onDeny,\r\n pollIntervalMs = 5000,\r\n}) => {\r\n const [requests, setRequests] = useState<ApprovalRequest[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [expandedId, setExpandedId] = useState<string | null>(null);\r\n const [processingId, setProcessingId] = useState<string | null>(null);\r\n\r\n const fetchRequests = async () => {\r\n try {\r\n const response = await fetch(`${apiBaseUrl}/v1/reviews/pending`);\r\n if (!response.ok) throw new Error('Failed to fetch pending reviews');\r\n const data = await response.json();\r\n setRequests(data.requests || []);\r\n setError(null);\r\n } catch (err: any) {\r\n setError(err.message);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n fetchRequests();\r\n const interval = setInterval(fetchRequests, pollIntervalMs);\r\n return () => clearInterval(interval);\r\n }, [apiBaseUrl, pollIntervalMs]);\r\n\r\n const handleAction = async (request: ApprovalRequest, approved: boolean) => {\r\n setProcessingId(request.id);\r\n try {\r\n const response = await fetch(`${apiBaseUrl}/v1/reviews/${request.id}/resolve`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ approved }),\r\n });\r\n \r\n if (!response.ok) throw new Error('Failed to resolve review');\r\n \r\n setRequests(prev => prev.filter(r => r.id !== request.id));\r\n if (approved && onApprove) onApprove(request);\r\n if (!approved && onDeny) onDeny(request);\r\n \r\n } catch (err: any) {\r\n setError(err.message);\r\n } finally {\r\n setProcessingId(null);\r\n }\r\n };\r\n\r\n const filteredRequests = useMemo(() => {\r\n if (!searchQuery) return requests;\r\n const lowerQuery = searchQuery.toLowerCase();\r\n return requests.filter(req => \r\n req.agentId.toLowerCase().includes(lowerQuery) || \r\n req.action.toLowerCase().includes(lowerQuery)\r\n );\r\n }, [requests, searchQuery]);\r\n\r\n if (loading && requests.length === 0) {\r\n return (\r\n <div className=\"animate-pulse space-y-4 p-6 bg-white rounded-xl shadow-sm border border-gray-200\">\r\n <div className=\"h-8 bg-gray-200 rounded w-1/3 mb-6\"></div>\r\n <div className=\"h-32 bg-gray-100 rounded-lg border border-gray-200\"></div>\r\n <div className=\"h-32 bg-gray-100 rounded-lg border border-gray-200\"></div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden flex flex-col max-h-[800px] font-sans\">\r\n {/* Header */}\r\n <div className=\"px-6 py-5 border-b border-gray-200 bg-gray-50/50 flex flex-col sm:flex-row sm:items-center justify-between gap-4\">\r\n <div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 flex items-center gap-2\">\r\n Human-in-the-Loop Review\r\n {requests.length > 0 && (\r\n <span className=\"bg-blue-100 text-blue-700 text-xs font-bold px-2.5 py-0.5 rounded-full\">\r\n {requests.length} Pending\r\n </span>\r\n )}\r\n </h2>\r\n <p className=\"text-sm text-gray-500 mt-1\">\r\n Review and authorize agent actions that fell below confidence thresholds.\r\n </p>\r\n </div>\r\n \r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none text-gray-400\">\r\n <SearchIcon />\r\n </div>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search agents or actions...\"\r\n className=\"pl-10 pr-4 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 w-full sm:w-64 transition-shadow\"\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n />\r\n </div>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mx-6 mt-4 p-3 bg-red-50 border border-red-200 text-red-700 rounded-lg text-sm flex items-center gap-2\">\r\n <XIcon /> {error}\r\n </div>\r\n )}\r\n\r\n {/* Content */}\r\n <div className=\"p-6 overflow-y-auto flex-1 bg-gray-50/30\">\r\n {filteredRequests.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <div className=\"w-16 h-16 bg-green-50 rounded-full flex items-center justify-center mb-4 text-green-600\">\r\n <CheckIcon />\r\n </div>\r\n <h3 className=\"text-lg font-medium text-gray-900\">All caught up!</h3>\r\n <p className=\"text-gray-500 mt-1 max-w-sm\">\r\n {searchQuery \r\n ? \"No requests match your search criteria.\" \r\n : \"There are no pending agent actions requiring human approval at this time.\"}\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-4\">\r\n {filteredRequests.map((req) => {\r\n const isExpanded = expandedId === req.id;\r\n const isProcessing = processingId === req.id;\r\n const confidenceColor = req.confidence < 0.5 ? 'text-red-700 bg-red-50 border-red-200' : \r\n req.confidence < 0.8 ? 'text-yellow-700 bg-yellow-50 border-yellow-200' : \r\n 'text-green-700 bg-green-50 border-green-200';\r\n\r\n return (\r\n <div \r\n key={req.id} \r\n className={`bg-white border rounded-xl shadow-sm transition-all duration-200 ${isProcessing ? 'opacity-50 pointer-events-none' : 'hover:shadow-md border-gray-200'}`}\r\n >\r\n <div className=\"p-5\">\r\n <div className=\"flex flex-col md:flex-row md:items-start justify-between gap-4\">\r\n \r\n {/* Left side: Info */}\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2 flex-wrap mb-2\">\r\n <span className=\"font-semibold text-gray-900 text-base\">{req.agentId}</span>\r\n <span className=\"text-gray-400 text-sm\">requested</span>\r\n <span className=\"px-2.5 py-1 bg-gray-100 text-gray-800 text-xs font-mono font-medium rounded-md border border-gray-200\">\r\n {req.action}\r\n </span>\r\n </div>\r\n \r\n <p className=\"text-sm text-gray-600 leading-relaxed\">\r\n <span className=\"font-medium text-gray-700\">Reason:</span> {req.reason}\r\n </p>\r\n \r\n <div className=\"mt-3 flex items-center gap-4 text-xs text-gray-500\">\r\n <span className=\"flex items-center gap-1\">\r\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"></path></svg>\r\n {new Date(req.timestamp).toLocaleString()}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Right side: Confidence & Actions */}\r\n <div className=\"flex flex-col items-end gap-3 min-w-[140px]\">\r\n <div className={`px-3 py-1.5 rounded-full border text-xs font-bold flex items-center gap-1.5 ${confidenceColor}`}>\r\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M13 10V3L4 14h7v7l9-11h-7z\"></path></svg>\r\n {(req.confidence * 100).toFixed(1)}% Confidence\r\n </div>\r\n \r\n <div className=\"flex gap-2 w-full\">\r\n <button\r\n onClick={() => handleAction(req, false)}\r\n disabled={isProcessing}\r\n className=\"flex-1 flex justify-center items-center gap-1 bg-white border border-gray-300 hover:bg-red-50 hover:text-red-700 hover:border-red-200 text-gray-700 px-3 py-2 rounded-lg text-sm font-medium transition-colors\"\r\n >\r\n <XIcon /> Deny\r\n </button>\r\n <button\r\n onClick={() => handleAction(req, true)}\r\n disabled={isProcessing}\r\n className=\"flex-1 flex justify-center items-center gap-1 bg-blue-600 hover:bg-blue-700 text-white px-3 py-2 rounded-lg text-sm font-medium transition-colors shadow-sm\"\r\n >\r\n <CheckIcon /> Approve\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Expandable Payload Section */}\r\n <div className=\"border-t border-gray-100 bg-gray-50/50 rounded-b-xl\">\r\n <button \r\n onClick={() => setExpandedId(isExpanded ? null : req.id)}\r\n className=\"w-full px-5 py-2.5 flex items-center justify-between text-xs font-medium text-gray-500 hover:text-gray-700 transition-colors\"\r\n >\r\n <span>View Resource Payload</span>\r\n {isExpanded ? <ChevronUpIcon /> : <ChevronDownIcon />}\r\n </button>\r\n \r\n {isExpanded && (\r\n <div className=\"px-5 pb-5 pt-1\">\r\n <div className=\"bg-gray-900 rounded-lg p-4 overflow-x-auto shadow-inner\">\r\n <pre className=\"text-xs text-green-400 font-mono leading-relaxed\">\r\n {JSON.stringify(req.resource, null, 2)}\r\n </pre>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useState, useEffect, useMemo } from 'react';\r\n\r\ninterface AgentStats {\r\n agentId: string;\r\n totalActions: number;\r\n allowedActions: number;\r\n deniedActions: number;\r\n humanReviews: number;\r\n averageConfidence: number;\r\n hallucinationScore: number; // 0-100, higher means more denied actions\r\n lastActive: string;\r\n}\r\n\r\ninterface AgentReputationDashboardProps {\r\n apiBaseUrl?: string;\r\n refreshIntervalMs?: number;\r\n}\r\n\r\n// Simple SVG Icons\r\nconst RefreshIcon = ({ className = \"\" }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}><path d=\"M21.5 2v6h-6M21.34 15.57a10 10 0 1 1-.59-9.21l5.25 4.24\"/></svg>\r\n);\r\n\r\nconst ShieldIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/></svg>\r\n);\r\n\r\nconst AlertTriangleIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/></svg>\r\n);\r\n\r\nconst SearchIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line></svg>\r\n);\r\n\r\nexport const AgentReputationDashboard: React.FC<AgentReputationDashboardProps> = ({\r\n apiBaseUrl = 'http://localhost:8080',\r\n refreshIntervalMs = 10000,\r\n}) => {\r\n const [stats, setStats] = useState<AgentStats[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [isRefreshing, setIsRefreshing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [sortConfig, setSortConfig] = useState<{ key: keyof AgentStats; direction: 'asc' | 'desc' }>({\r\n key: 'hallucinationScore',\r\n direction: 'desc'\r\n });\r\n\r\n const fetchStats = async (showRefreshState = false) => {\r\n if (showRefreshState) setIsRefreshing(true);\r\n try {\r\n const response = await fetch(`${apiBaseUrl}/v1/analytics/agents`);\r\n if (!response.ok) throw new Error('Failed to fetch agent analytics');\r\n const data = await response.json() as { stats: AgentStats[] };\r\n setStats(data.stats || []);\r\n setError(null);\r\n } catch (err: any) {\r\n setError(err.message);\r\n } finally {\r\n setLoading(false);\r\n setIsRefreshing(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n fetchStats();\r\n const interval = setInterval(() => fetchStats(false), refreshIntervalMs);\r\n return () => clearInterval(interval);\r\n }, [apiBaseUrl, refreshIntervalMs]);\r\n\r\n const handleSort = (key: keyof AgentStats) => {\r\n setSortConfig(prev => ({\r\n key,\r\n direction: prev.key === key && prev.direction === 'desc' ? 'asc' : 'desc'\r\n }));\r\n };\r\n\r\n const processedStats = useMemo(() => {\r\n let result = [...stats];\r\n\r\n // Filter\r\n if (searchQuery) {\r\n const lowerQuery = searchQuery.toLowerCase();\r\n result = result.filter(agent => agent.agentId.toLowerCase().includes(lowerQuery));\r\n }\r\n\r\n // Sort\r\n result.sort((a, b) => {\r\n if (a[sortConfig.key] < b[sortConfig.key]) return sortConfig.direction === 'asc' ? -1 : 1;\r\n if (a[sortConfig.key] > b[sortConfig.key]) return sortConfig.direction === 'asc' ? 1 : -1;\r\n return 0;\r\n });\r\n\r\n return result;\r\n }, [stats, searchQuery, sortConfig]);\r\n\r\n // Calculate aggregates\r\n const totalAgents = stats.length;\r\n const totalActions = stats.reduce((sum, a) => sum + a.totalActions, 0);\r\n const avgHallucination = stats.length ? stats.reduce((sum, a) => sum + a.hallucinationScore, 0) / stats.length : 0;\r\n const highRiskAgents = stats.filter(a => a.hallucinationScore > 50).length;\r\n\r\n if (loading && stats.length === 0) {\r\n return (\r\n <div className=\"animate-pulse space-y-4 p-6 bg-white rounded-xl shadow-sm border border-gray-200\">\r\n <div className=\"h-8 bg-gray-200 rounded w-1/4 mb-6\"></div>\r\n <div className=\"grid grid-cols-4 gap-4 mb-6\">\r\n {[1, 2, 3, 4].map(i => <div key={i} className=\"h-24 bg-gray-100 rounded-lg\"></div>)}\r\n </div>\r\n <div className=\"h-64 bg-gray-100 rounded-lg\"></div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden font-sans\">\r\n {/* Header */}\r\n <div className=\"px-6 py-5 border-b border-gray-200 bg-gray-50/50 flex flex-col sm:flex-row sm:items-center justify-between gap-4\">\r\n <div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 flex items-center gap-2\">\r\n <span className=\"text-blue-600\"><ShieldIcon /></span>\r\n Agent Reputation & Hallucination Index\r\n </h2>\r\n <p className=\"text-sm text-gray-500 mt-1\">\r\n Real-time monitoring of autonomous agent behavior and policy compliance.\r\n </p>\r\n </div>\r\n \r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none text-gray-400\">\r\n <SearchIcon />\r\n </div>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search agents...\"\r\n className=\"pl-10 pr-4 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 w-full sm:w-48 transition-shadow\"\r\n value={searchQuery}\r\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearchQuery(e.target.value)}\r\n />\r\n </div>\r\n <button \r\n onClick={() => fetchStats(true)}\r\n className=\"p-2 text-gray-500 hover:text-gray-700 hover:bg-gray-100 rounded-lg transition-colors border border-gray-200 bg-white\"\r\n title=\"Refresh data\"\r\n >\r\n <RefreshIcon className={isRefreshing ? \"animate-spin\" : \"\"} />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mx-6 mt-4 p-3 bg-red-50 border border-red-200 text-red-700 rounded-lg text-sm flex items-center gap-2\">\r\n <AlertTriangleIcon /> {error}\r\n </div>\r\n )}\r\n\r\n {/* KPI Cards */}\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 p-6 bg-gray-50/30 border-b border-gray-200\">\r\n <div className=\"bg-white p-4 rounded-xl border border-gray-200 shadow-sm\">\r\n <div className=\"text-sm font-medium text-gray-500 mb-1\">Active Agents</div>\r\n <div className=\"text-2xl font-bold text-gray-900\">{totalAgents}</div>\r\n </div>\r\n <div className=\"bg-white p-4 rounded-xl border border-gray-200 shadow-sm\">\r\n <div className=\"text-sm font-medium text-gray-500 mb-1\">Total Actions Evaluated</div>\r\n <div className=\"text-2xl font-bold text-gray-900\">{totalActions.toLocaleString()}</div>\r\n </div>\r\n <div className=\"bg-white p-4 rounded-xl border border-gray-200 shadow-sm\">\r\n <div className=\"text-sm font-medium text-gray-500 mb-1\">Avg Hallucination Score</div>\r\n <div className=\"text-2xl font-bold text-gray-900 flex items-baseline gap-2\">\r\n {avgHallucination.toFixed(1)}\r\n <span className=\"text-xs font-normal text-gray-500\">/ 100</span>\r\n </div>\r\n </div>\r\n <div className=\"bg-white p-4 rounded-xl border border-gray-200 shadow-sm\">\r\n <div className=\"text-sm font-medium text-gray-500 mb-1\">High Risk Agents</div>\r\n <div className=\"text-2xl font-bold text-red-600 flex items-center gap-2\">\r\n {highRiskAgents}\r\n {highRiskAgents > 0 && <AlertTriangleIcon />}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Table */}\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"min-w-full divide-y divide-gray-200\">\r\n <thead className=\"bg-gray-50\">\r\n <tr>\r\n {[\r\n { key: 'agentId', label: 'Agent ID' },\r\n { key: 'totalActions', label: 'Total Actions' },\r\n { key: 'allowedActions', label: 'Allowed' },\r\n { key: 'deniedActions', label: 'Denied' },\r\n { key: 'averageConfidence', label: 'Avg Confidence' },\r\n { key: 'hallucinationScore', label: 'Hallucination Risk' }\r\n ].map((col) => (\r\n <th \r\n key={col.key}\r\n onClick={() => handleSort(col.key as keyof AgentStats)}\r\n className=\"px-6 py-3 text-left text-xs font-semibold text-gray-600 uppercase tracking-wider cursor-pointer hover:bg-gray-100 select-none group\"\r\n >\r\n <div className=\"flex items-center gap-1\">\r\n {col.label}\r\n <span className={`text-gray-400 opacity-0 group-hover:opacity-100 transition-opacity ${sortConfig.key === col.key ? 'opacity-100 text-blue-600' : ''}`}>\r\n {sortConfig.key === col.key ? (sortConfig.direction === 'asc' ? '↑' : '↓') : '↕'}\r\n </span>\r\n </div>\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n <tbody className=\"bg-white divide-y divide-gray-200\">\r\n {processedStats.length === 0 ? (\r\n <tr>\r\n <td colSpan={6} className=\"px-6 py-12 text-center\">\r\n <div className=\"inline-flex items-center justify-center w-12 h-12 rounded-full bg-gray-100 mb-3\">\r\n <ShieldIcon />\r\n </div>\r\n <h3 className=\"text-sm font-medium text-gray-900\">No agents found</h3>\r\n <p className=\"text-sm text-gray-500 mt-1\">\r\n {searchQuery ? \"Try adjusting your search query.\" : \"No agent activity has been recorded yet.\"}\r\n </p>\r\n </td>\r\n </tr>\r\n ) : (\r\n processedStats.map((agent) => (\r\n <tr key={agent.agentId} className=\"hover:bg-gray-50/80 transition-colors\">\r\n <td className=\"px-6 py-4 whitespace-nowrap\">\r\n <div className=\"flex items-center\">\r\n <div className=\"h-8 w-8 rounded-full bg-blue-100 text-blue-700 flex items-center justify-center font-bold text-xs mr-3\">\r\n {agent.agentId.substring(0, 2).toUpperCase()}\r\n </div>\r\n <div>\r\n <div className=\"text-sm font-semibold text-gray-900\">{agent.agentId}</div>\r\n <div className=\"text-xs text-gray-500\">Last active: {new Date(agent.lastActive || Date.now()).toLocaleTimeString()}</div>\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-600 font-medium\">\r\n {agent.totalActions.toLocaleString()}\r\n </td>\r\n <td className=\"px-6 py-4 whitespace-nowrap\">\r\n <span className=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800\">\r\n {agent.allowedActions.toLocaleString()}\r\n </span>\r\n </td>\r\n <td className=\"px-6 py-4 whitespace-nowrap\">\r\n <span className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${agent.deniedActions > 0 ? 'bg-red-100 text-red-800' : 'bg-gray-100 text-gray-800'}`}>\r\n {agent.deniedActions.toLocaleString()}\r\n </span>\r\n </td>\r\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-600\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"w-16 bg-gray-200 rounded-full h-1.5\">\r\n <div \r\n className=\"bg-blue-500 h-1.5 rounded-full\" \r\n style={{ width: `${agent.averageConfidence * 100}%` }}\r\n ></div>\r\n </div>\r\n {(agent.averageConfidence * 100).toFixed(1)}%\r\n </div>\r\n </td>\r\n <td className=\"px-6 py-4 whitespace-nowrap\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-24 bg-gray-200 rounded-full h-2.5 overflow-hidden\">\r\n <div \r\n className={`h-full transition-all duration-500 ${\r\n agent.hallucinationScore > 50 ? 'bg-red-500' : \r\n agent.hallucinationScore > 20 ? 'bg-yellow-400' : 'bg-green-500'\r\n }`}\r\n style={{ width: `${agent.hallucinationScore}%` }}\r\n ></div>\r\n </div>\r\n <span className={`text-sm font-bold ${\r\n agent.hallucinationScore > 50 ? 'text-red-600' : \r\n agent.hallucinationScore > 20 ? 'text-yellow-600' : 'text-green-600'\r\n }`}>\r\n {agent.hallucinationScore.toFixed(0)}\r\n </span>\r\n </div>\r\n </td>\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","\"use client\";\r\n\r\nimport { useEffect, useState } from \"react\";\r\nimport { LeluClient } from \"../client\";\r\n\r\nexport * from './LeluApprovalUI';\r\nexport * from './AgentReputationDashboard';\r\n\r\nexport interface UseAgentPermissionOptions {\r\n /** Base URL of the Lelu engine. Defaults to http://localhost:8080 */\r\n baseUrl?: string;\r\n /** API key forwarded to the engine */\r\n apiKey?: string;\r\n /** Scope override passed in the request */\r\n scope?: string;\r\n}\r\n\r\nexport interface AgentPermissionState {\r\n canExecute: boolean;\r\n loading: boolean;\r\n reason: string;\r\n decision: \"allowed\" | \"denied\" | \"human_review\" | \"\";\r\n}\r\n\r\n/**\r\n * React hook that checks whether an agent actor may perform an action.\r\n *\r\n * ```tsx\r\n * const { canExecute, loading, reason } = useAgentPermission(\r\n * \"agent-007\", \"files.read\", 0.95,\r\n * { baseUrl: \"http://localhost:8080\", apiKey: process.env.NEXT_PUBLIC_LELU_KEY }\r\n * );\r\n * ```\r\n */\r\nexport function useAgentPermission(\r\n actor: string,\r\n action: string,\r\n confidence = 1.0,\r\n opts: UseAgentPermissionOptions = {}\r\n): AgentPermissionState {\r\n const [state, setState] = useState<AgentPermissionState>({\r\n canExecute: false,\r\n loading: true,\r\n reason: \"\",\r\n decision: \"\",\r\n });\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n setState({ canExecute: false, loading: true, reason: \"\", decision: \"\" });\r\n\r\n const clientConfig: any = {\r\n baseUrl: opts.baseUrl ?? \"http://localhost:8080\",\r\n };\r\n if (opts.apiKey !== undefined) {\r\n clientConfig.apiKey = opts.apiKey;\r\n }\r\n const client = new LeluClient(clientConfig);\r\n\r\n client\r\n .agentAuthorize({ actor, action, context: { confidence, scope: opts.scope } })\r\n .then((res) => {\r\n if (cancelled) return;\r\n setState({\r\n canExecute: res.allowed,\r\n loading: false,\r\n reason: res.reason ?? (res.allowed ? \"allowed\" : \"denied\"),\r\n decision: res.allowed ? \"allowed\" : (res.requiresHumanReview ? \"human_review\" : \"denied\"),\r\n });\r\n })\r\n .catch((err: unknown) => {\r\n if (cancelled) return;\r\n const msg = err instanceof Error ? err.message : String(err);\r\n setState({ canExecute: false, loading: false, reason: msg, decision: \"denied\" });\r\n });\r\n\r\n return () => { cancelled = true; };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [actor, action, confidence, opts.baseUrl, opts.apiKey, opts.scope]);\r\n\r\n return state;\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/types.ts","../../src/client.ts","../../src/react/LeluApprovalUI.tsx","../../src/react/AgentReputationDashboard.tsx","../../src/react/index.ts"],"names":["z","jsxs","jsx","useState","useEffect","useMemo","SearchIcon"],"mappings":"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","file":"index.js","sourcesContent":["import { z } from \"zod\";\r\n\r\n// ─── Request / Response schemas ───────────────────────────────────────────────\r\n\r\nexport const AuthRequestSchema = z.object({\r\n userId: z.string().min(1, \"userId is required\"),\r\n action: z.string().min(1, \"action is required\"),\r\n resource: z.record(z.string()).optional(),\r\n});\r\n\r\nexport const AgentContextSchema = z.object({\r\n /** LLM confidence score — 0.0 to 1.0 */\r\n confidence: z.number().min(0).max(1),\r\n /** User the agent is acting on behalf of */\r\n actingFor: z.string().optional(),\r\n /** Requested agent scope */\r\n scope: z.string().optional(),\r\n});\r\n\r\nexport const AgentAuthRequestSchema = z.object({\r\n actor: z.string().min(1, \"actor is required\"),\r\n action: z.string().min(1, \"action is required\"),\r\n resource: z.record(z.string()).optional(),\r\n context: AgentContextSchema,\r\n});\r\n\r\nexport const MintTokenRequestSchema = z.object({\r\n scope: z.string().min(1),\r\n actingFor: z.string().optional(),\r\n ttlSeconds: z.number().int().positive().optional(),\r\n});\r\n\r\nexport const DelegateScopeRequestSchema = z.object({\r\n delegator: z.string().min(1, \"delegator is required\"),\r\n delegatee: z.string().min(1, \"delegatee is required\"),\r\n scopedTo: z.array(z.string().min(1)).optional(),\r\n ttlSeconds: z.number().int().positive().optional(),\r\n confidence: z.number().min(0).max(1).optional(),\r\n actingFor: z.string().optional(),\r\n tenantId: z.string().optional(),\r\n});\r\n\r\n// ─── Decision types ───────────────────────────────────────────────────────────\r\n\r\nexport interface AuthDecision {\r\n allowed: boolean;\r\n reason: string;\r\n traceId: string;\r\n}\r\n\r\nexport interface AgentAuthDecision {\r\n allowed: boolean;\r\n reason: string;\r\n traceId: string;\r\n downgradedScope: string | undefined;\r\n requiresHumanReview: boolean;\r\n confidenceUsed: number;\r\n}\r\n\r\nexport interface MintTokenResult {\r\n token: string;\r\n tokenId: string;\r\n expiresAt: Date;\r\n}\r\n\r\nexport interface DelegateScopeRequest {\r\n /** Agent delegating the scope */\r\n delegator: string;\r\n /** Agent receiving the constrained sub-scope */\r\n delegatee: string;\r\n /** Actions to grant (must be subset of policy's can_delegate.scoped_to) */\r\n scopedTo?: string[];\r\n /** Token TTL in seconds — capped by the policy's max_ttl_seconds */\r\n ttlSeconds?: number;\r\n /** Delegator's confidence score — checked against require_confidence_above */\r\n confidence?: number;\r\n /** User the delegated agent acts on behalf of */\r\n actingFor?: string;\r\n tenantId?: string;\r\n}\r\n\r\nexport interface DelegateScopeResult {\r\n token: string;\r\n tokenId: string;\r\n expiresAt: Date;\r\n delegator: string;\r\n delegatee: string;\r\n grantedScopes: string[];\r\n traceId: string;\r\n}\r\n\r\nexport interface RevokeTokenResult {\r\n success: boolean;\r\n}\r\n\r\n// ─── Audit types ──────────────────────────────────────────────────────────────\r\n\r\nexport interface AuditEvent {\r\n id: number;\r\n tenantId: string;\r\n traceId: string;\r\n timestamp: string;\r\n actor: string;\r\n action: string;\r\n resource?: Record<string, string>;\r\n confidenceScore?: number;\r\n decision: string; // \"allowed\" | \"denied\" | \"human_review\"\r\n reason?: string;\r\n downgradedScope?: string;\r\n latencyMs: number;\r\n engineVersion?: string;\r\n policyVersion?: string;\r\n createdAt: string;\r\n}\r\n\r\nexport interface ListAuditEventsRequest {\r\n /** Maximum number of events to return (default: 20, max: 500) */\r\n limit?: number;\r\n /** Pagination cursor (offset) */\r\n cursor?: number;\r\n /** Filter by actor */\r\n actor?: string;\r\n /** Filter by action */\r\n action?: string;\r\n /** Filter by decision */\r\n decision?: string;\r\n /** Filter by trace ID */\r\n traceId?: string;\r\n /** Filter events from this timestamp (ISO 8601) */\r\n from?: string;\r\n /** Filter events to this timestamp (ISO 8601) */\r\n to?: string;\r\n /** Tenant ID (defaults to \"default\") */\r\n tenantId?: string;\r\n}\r\n\r\nexport interface ListAuditEventsResult {\r\n events: AuditEvent[];\r\n count: number;\r\n limit: number;\r\n cursor: number;\r\n nextCursor: number;\r\n}\r\n\r\n// ─── Typed Input types ───────────────────────────────────────────────────────\r\n\r\nexport type AuthRequest = z.infer<typeof AuthRequestSchema>;\r\nexport type AgentAuthRequest = z.infer<typeof AgentAuthRequestSchema>;\r\nexport type AgentContext = z.infer<typeof AgentContextSchema>;\r\nexport type MintTokenRequest = z.infer<typeof MintTokenRequestSchema>;\r\n\r\n// ─── Client config ────────────────────────────────────────────────────────────\r\n\r\nexport interface ClientConfig {\r\n /** Base URL of the Auth Permission Engine (defaults to LELU_BASE_URL env var, else http://localhost:8080) */\r\n baseUrl?: string;\r\n /** Request timeout in milliseconds (default: 5000) */\r\n timeoutMs?: number;\r\n /** Optional bearer token for authenticating with the engine */\r\n apiKey?: string;\r\n}\r\n\r\n// ─── Error type ───────────────────────────────────────────────────────────────\r\n\r\n// ─── Policy types ─────────────────────────────────────────────────────────────\r\n\r\nexport interface Policy {\r\n id: string;\r\n tenantId: string;\r\n name: string;\r\n content: string;\r\n version: string;\r\n hmacSha256: string;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface ListPoliciesRequest {\r\n /** Tenant ID (defaults to \"default\") */\r\n tenantId?: string;\r\n}\r\n\r\nexport interface ListPoliciesResult {\r\n policies: Policy[];\r\n count: number;\r\n}\r\n\r\nexport interface GetPolicyRequest {\r\n /** Policy name */\r\n name: string;\r\n /** Tenant ID (defaults to \"default\") */\r\n tenantId?: string;\r\n}\r\n\r\nexport interface UpsertPolicyRequest {\r\n /** Policy name */\r\n name: string;\r\n /** Policy content (Rego code) */\r\n content: string;\r\n /** Policy version (defaults to \"1.0\") */\r\n version?: string;\r\n /** Tenant ID (defaults to \"default\") */\r\n tenantId?: string;\r\n}\r\n\r\nexport interface DeletePolicyRequest {\r\n /** Policy name */\r\n name: string;\r\n /** Tenant ID (defaults to \"default\") */\r\n tenantId?: string;\r\n}\r\n\r\nexport interface DeletePolicyResult {\r\n deleted: boolean;\r\n}\r\n\r\n// ─── Error type ───────────────────────────────────────────────────────────────\r\n\r\nexport class AuthEngineError extends Error {\r\n constructor(\r\n message: string,\r\n public readonly status?: number,\r\n public readonly details?: unknown\r\n ) {\r\n super(message);\r\n this.name = \"AuthEngineError\";\r\n }\r\n}\r\n// ─── Policy types ─────────────────────────────────────────────────────────────\r\n\r\nexport interface Policy {\r\n id: string;\r\n tenantId: string;\r\n name: string;\r\n content: string;\r\n version: string;\r\n hmacSha256: string;\r\n createdAt: string;\r\n updatedAt: string;\r\n}\r\n\r\nexport interface ListPoliciesRequest {\r\n /** Tenant ID (defaults to \"default\") */\r\n tenantId?: string;\r\n}\r\n\r\nexport interface ListPoliciesResult {\r\n policies: Policy[];\r\n count: number;\r\n}\r\n\r\nexport interface GetPolicyRequest {\r\n /** Policy name */\r\n name: string;\r\n /** Tenant ID (defaults to \"default\") */\r\n tenantId?: string;\r\n}\r\n\r\nexport interface UpsertPolicyRequest {\r\n /** Policy name */\r\n name: string;\r\n /** Policy content (Rego code) */\r\n content: string;\r\n /** Policy version (defaults to \"1.0\") */\r\n version?: string;\r\n /** Tenant ID (defaults to \"default\") */\r\n tenantId?: string;\r\n}\r\n\r\nexport interface DeletePolicyRequest {\r\n /** Policy name */\r\n name: string;\r\n /** Tenant ID (defaults to \"default\") */\r\n tenantId?: string;\r\n}\r\n\r\nexport interface DeletePolicyResult {\r\n deleted: boolean;\r\n}\r\n","import {\r\n AuthEngineError,\r\n AuthRequestSchema,\r\n AgentAuthRequestSchema,\r\n MintTokenRequestSchema,\r\n DelegateScopeRequestSchema,\r\n type AuthDecision,\r\n type AgentAuthDecision,\r\n type MintTokenResult,\r\n type DelegateScopeResult,\r\n type DelegateScopeRequest,\r\n type RevokeTokenResult,\r\n type AuthRequest,\r\n type AgentAuthRequest,\r\n type MintTokenRequest,\r\n type ClientConfig,\r\n type AuditEvent,\r\n type ListAuditEventsRequest,\r\n type ListAuditEventsResult,\r\n type Policy,\r\n type ListPoliciesRequest,\r\n type ListPoliciesResult,\r\n type GetPolicyRequest,\r\n type UpsertPolicyRequest,\r\n type DeletePolicyRequest,\r\n type DeletePolicyResult,\r\n} from \"./types.js\";\r\n\r\n// ─── Client ───────────────────────────────────────────────────────────────────\r\n\r\n/**\r\n * LeluClient is the core SDK entry-point. It communicates with the local\r\n * Auth Permission Engine sidecar over HTTP/JSON.\r\n *\r\n * @example\r\n * ```ts\r\n * const lelu = new LeluClient({ baseUrl: \"http://localhost:8080\" });\r\n *\r\n * const decision = await lelu.agentAuthorize({\r\n * actor: \"invoice_bot\",\r\n * action: \"approve_refunds\",\r\n * context: { confidence: 0.92, actingFor: \"user_123\" },\r\n * });\r\n *\r\n * if (!decision.allowed) {\r\n * console.log(decision.reason);\r\n * }\r\n * ```\r\n */\r\nexport class LeluClient {\r\n private readonly baseUrl: string;\r\n private readonly timeoutMs: number;\r\n private readonly apiKey: string | undefined;\r\n\r\n constructor(cfg: ClientConfig = {}) {\r\n const envBaseUrl =\r\n typeof process !== \"undefined\" && process.env\r\n ? process.env[\"LELU_BASE_URL\"]\r\n : undefined;\r\n this.baseUrl = (cfg.baseUrl ?? envBaseUrl ?? \"http://localhost:8080\").replace(/\\/$/, \"\");\r\n this.timeoutMs = cfg.timeoutMs ?? 5_000;\r\n this.apiKey = cfg.apiKey;\r\n }\r\n\r\n // ── Human authorization ────────────────────────────────────────────────────\r\n\r\n /**\r\n * Checks whether a human user is permitted to perform an action.\r\n */\r\n async authorize(req: AuthRequest): Promise<AuthDecision> {\r\n const validated = AuthRequestSchema.parse(req);\r\n const body = {\r\n user_id: validated.userId,\r\n action: validated.action,\r\n resource: validated.resource,\r\n };\r\n const data = await this.post<{\r\n allowed: boolean;\r\n reason: string;\r\n trace_id: string;\r\n }>(\"/v1/authorize\", body);\r\n\r\n return {\r\n allowed: data.allowed,\r\n reason: data.reason,\r\n traceId: data.trace_id,\r\n };\r\n }\r\n\r\n // ── Agent authorization ────────────────────────────────────────────────────\r\n\r\n /**\r\n * Checks whether an AI agent is permitted to perform an action, taking the\r\n * confidence score into account (Confidence-Aware Auth ★).\r\n */\r\n async agentAuthorize(req: AgentAuthRequest): Promise<AgentAuthDecision> {\r\n const validated = AgentAuthRequestSchema.parse(req);\r\n const body = {\r\n actor: validated.actor,\r\n action: validated.action,\r\n resource: validated.resource,\r\n confidence: validated.context.confidence,\r\n acting_for: validated.context.actingFor,\r\n scope: validated.context.scope,\r\n };\r\n const data = await this.post<{\r\n allowed: boolean;\r\n reason: string;\r\n trace_id: string;\r\n downgraded_scope?: string;\r\n requires_human_review: boolean;\r\n confidence_used: number;\r\n }>(\"/v1/agent/authorize\", body);\r\n\r\n return {\r\n allowed: data.allowed,\r\n reason: data.reason,\r\n traceId: data.trace_id,\r\n downgradedScope: data.downgraded_scope,\r\n requiresHumanReview: data.requires_human_review,\r\n confidenceUsed: data.confidence_used,\r\n };\r\n }\r\n\r\n // ── JIT Token minting ──────────────────────────────────────────────────────\r\n\r\n /**\r\n * Mints a scoped JWT for an agent with an optional TTL.\r\n * Default TTL is 60 seconds.\r\n */\r\n async mintToken(req: MintTokenRequest): Promise<MintTokenResult> {\r\n const validated = MintTokenRequestSchema.parse(req);\r\n const body = {\r\n scope: validated.scope,\r\n acting_for: validated.actingFor,\r\n ttl_seconds: validated.ttlSeconds ?? 60,\r\n };\r\n const data = await this.post<{\r\n token: string;\r\n token_id: string;\r\n expires_at: number;\r\n }>(\"/v1/tokens/mint\", body);\r\n\r\n return {\r\n token: data.token,\r\n tokenId: data.token_id,\r\n expiresAt: new Date(data.expires_at * 1000),\r\n };\r\n }\r\n\r\n // ── Token revocation ───────────────────────────────────────────────────────\r\n\r\n /**\r\n * Immediately revokes a JIT token by its ID.\r\n */\r\n async revokeToken(tokenId: string): Promise<RevokeTokenResult> {\r\n const data = await this.delete<{ success: boolean }>(\r\n `/v1/tokens/${encodeURIComponent(tokenId)}`\r\n );\r\n return { success: data.success };\r\n }\r\n\r\n // ── Multi-agent delegation ─────────────────────────────────────────────────\r\n\r\n /**\r\n * Delegates a constrained sub-scope from one agent to another.\r\n *\r\n * Validates the delegation rule in the loaded policy, caps the TTL to the\r\n * policy maximum, and mints a child JIT token scoped to the granted actions.\r\n *\r\n * The delegator's `confidence` score is checked against the policy's\r\n * `require_confidence_above` before delegation is granted.\r\n */\r\n async delegateScope(req: DelegateScopeRequest): Promise<DelegateScopeResult> {\r\n const validated = DelegateScopeRequestSchema.parse(req);\r\n const body = {\r\n delegator: validated.delegator,\r\n delegatee: validated.delegatee,\r\n scoped_to: validated.scopedTo ?? [],\r\n ttl_seconds: validated.ttlSeconds ?? 60,\r\n confidence: validated.confidence ?? 1.0,\r\n acting_for: validated.actingFor ?? \"\",\r\n tenant_id: validated.tenantId ?? \"\",\r\n };\r\n const data = await this.post<{\r\n token: string;\r\n token_id: string;\r\n expires_at: number;\r\n delegator: string;\r\n delegatee: string;\r\n granted_scopes: string[];\r\n trace_id: string;\r\n }>(\"/v1/agent/delegate\", body);\r\n\r\n return {\r\n token: data.token,\r\n tokenId: data.token_id,\r\n expiresAt: new Date(data.expires_at * 1000),\r\n delegator: data.delegator,\r\n delegatee: data.delegatee,\r\n grantedScopes: data.granted_scopes,\r\n traceId: data.trace_id,\r\n };\r\n }\r\n\r\n // ── Health check ───────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Returns true if the engine is reachable and healthy.\r\n */\r\n async isHealthy(): Promise<boolean> {\r\n try {\r\n const data = await this.get<{ status: string }>(\"/healthz\");\r\n return data.status === \"ok\";\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n // ── Audit log ──────────────────────────────────────────────────────────────\r\n\r\n /**\r\n * Lists audit events from the platform API.\r\n * Requires the platform service to be running (not just the engine).\r\n */\r\n async listAuditEvents(req: ListAuditEventsRequest = {}): Promise<ListAuditEventsResult> {\r\n const params = new URLSearchParams();\r\n \r\n if (req.limit !== undefined) params.set(\"limit\", req.limit.toString());\r\n if (req.cursor !== undefined) params.set(\"cursor\", req.cursor.toString());\r\n if (req.actor) params.set(\"actor\", req.actor);\r\n if (req.action) params.set(\"action\", req.action);\r\n if (req.decision) params.set(\"decision\", req.decision);\r\n if (req.traceId) params.set(\"trace_id\", req.traceId);\r\n if (req.from) params.set(\"from\", req.from);\r\n if (req.to) params.set(\"to\", req.to);\r\n\r\n const headers = this.headers();\r\n if (req.tenantId) {\r\n headers[\"X-Tenant-ID\"] = req.tenantId;\r\n }\r\n\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\r\n try {\r\n const url = `${this.baseUrl}/api/v1/audit${params.toString() ? `?${params.toString()}` : \"\"}`;\r\n const res = await fetch(url, {\r\n method: \"GET\",\r\n headers,\r\n signal: ctrl.signal,\r\n });\r\n \r\n const data = await this.parseResponse<{\r\n events: AuditEvent[];\r\n count: number;\r\n limit: number;\r\n cursor: number;\r\n next_cursor: number;\r\n }>(res);\r\n\r\n return {\r\n events: data.events || [],\r\n count: data.count,\r\n limit: data.limit,\r\n cursor: data.cursor,\r\n nextCursor: data.next_cursor,\r\n };\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n // ─── Policy Management ────────────────────────────────────────────────────────\r\n\r\n async listPolicies(req: ListPoliciesRequest = {}): Promise<ListPoliciesResult> {\r\n const headers = this.headers();\r\n if (req.tenantId) {\r\n headers[\"X-Tenant-ID\"] = req.tenantId;\r\n }\r\n\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\r\n try {\r\n const res = await fetch(`${this.baseUrl}/api/v1/policies`, {\r\n method: \"GET\",\r\n headers,\r\n signal: ctrl.signal,\r\n });\r\n \r\n const data = await this.parseResponse<{\r\n policies: Policy[];\r\n count: number;\r\n }>(res);\r\n\r\n return {\r\n policies: data.policies || [],\r\n count: data.count,\r\n };\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n async getPolicy(req: GetPolicyRequest): Promise<Policy> {\r\n const headers = this.headers();\r\n if (req.tenantId) {\r\n headers[\"X-Tenant-ID\"] = req.tenantId;\r\n }\r\n\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\r\n try {\r\n const res = await fetch(`${this.baseUrl}/api/v1/policies/${encodeURIComponent(req.name)}`, {\r\n method: \"GET\",\r\n headers,\r\n signal: ctrl.signal,\r\n });\r\n \r\n return await this.parseResponse<Policy>(res);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n async upsertPolicy(req: UpsertPolicyRequest): Promise<Policy> {\r\n const headers = this.headers();\r\n if (req.tenantId) {\r\n headers[\"X-Tenant-ID\"] = req.tenantId;\r\n }\r\n\r\n const body = {\r\n content: req.content,\r\n version: req.version || \"1.0\"\r\n };\r\n\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\r\n try {\r\n const res = await fetch(`${this.baseUrl}/api/v1/policies/${encodeURIComponent(req.name)}`, {\r\n method: \"PUT\",\r\n headers,\r\n body: JSON.stringify(body),\r\n signal: ctrl.signal,\r\n });\r\n \r\n return await this.parseResponse<Policy>(res);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n async deletePolicy(req: DeletePolicyRequest): Promise<DeletePolicyResult> {\r\n const headers = this.headers();\r\n if (req.tenantId) {\r\n headers[\"X-Tenant-ID\"] = req.tenantId;\r\n }\r\n\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\r\n try {\r\n const res = await fetch(`${this.baseUrl}/api/v1/policies/${encodeURIComponent(req.name)}`, {\r\n method: \"DELETE\",\r\n headers,\r\n signal: ctrl.signal,\r\n });\r\n \r\n return await this.parseResponse<DeletePolicyResult>(res);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n // ── HTTP helpers ───────────────────────────────────────────────────────────\r\n\r\n private headers(): Record<string, string> {\r\n const h: Record<string, string> = { \"Content-Type\": \"application/json\" };\r\n if (this.apiKey) {\r\n h[\"Authorization\"] = `Bearer ${this.apiKey}`;\r\n }\r\n return h;\r\n }\r\n\r\n private async post<T>(path: string, body: unknown): Promise<T> {\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\r\n try {\r\n const res = await fetch(`${this.baseUrl}${path}`, {\r\n method: \"POST\",\r\n headers: this.headers(),\r\n body: JSON.stringify(body),\r\n signal: ctrl.signal,\r\n });\r\n return this.parseResponse<T>(res);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n private async delete<T>(path: string): Promise<T> {\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\r\n try {\r\n const res = await fetch(`${this.baseUrl}${path}`, {\r\n method: \"DELETE\",\r\n headers: this.headers(),\r\n signal: ctrl.signal,\r\n });\r\n return this.parseResponse<T>(res);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n private async get<T>(path: string): Promise<T> {\r\n const ctrl = new AbortController();\r\n const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);\r\n try {\r\n const res = await fetch(`${this.baseUrl}${path}`, {\r\n method: \"GET\",\r\n headers: this.headers(),\r\n signal: ctrl.signal,\r\n });\r\n return this.parseResponse<T>(res);\r\n } finally {\r\n clearTimeout(timer);\r\n }\r\n }\r\n\r\n private async parseResponse<T>(res: Response): Promise<T> {\r\n const json = (await res.json()) as Record<string, unknown>;\r\n if (!res.ok) {\r\n throw new AuthEngineError(\r\n (json[\"error\"] as string) ?? \"engine error\",\r\n res.status,\r\n json\r\n );\r\n }\r\n return json as T;\r\n }\r\n}\r\n","import React, { useState, useEffect, useMemo } from 'react';\r\n\r\ninterface ApprovalRequest {\r\n id: string;\r\n agentId: string;\r\n action: string;\r\n resource: Record<string, any>;\r\n confidence: number;\r\n reason: string;\r\n timestamp: string;\r\n}\r\n\r\ninterface LeluApprovalUIProps {\r\n apiBaseUrl?: string;\r\n onApprove?: (request: ApprovalRequest) => void;\r\n onDeny?: (request: ApprovalRequest) => void;\r\n pollIntervalMs?: number;\r\n}\r\n\r\n// Simple SVG Icons to avoid external dependencies\r\nconst SearchIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line></svg>\r\n);\r\n\r\nconst CheckIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"20 6 9 17 4 12\"></polyline></svg>\r\n);\r\n\r\nconst XIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\"></line><line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\"></line></svg>\r\n);\r\n\r\nconst ChevronDownIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"6 9 12 15 18 9\"></polyline></svg>\r\n);\r\n\r\nconst ChevronUpIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><polyline points=\"18 15 12 9 6 15\"></polyline></svg>\r\n);\r\n\r\nexport const LeluApprovalUI: React.FC<LeluApprovalUIProps> = ({\r\n apiBaseUrl = 'http://localhost:8080',\r\n onApprove,\r\n onDeny,\r\n pollIntervalMs = 5000,\r\n}) => {\r\n const [requests, setRequests] = useState<ApprovalRequest[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [expandedId, setExpandedId] = useState<string | null>(null);\r\n const [processingId, setProcessingId] = useState<string | null>(null);\r\n\r\n const fetchRequests = async () => {\r\n try {\r\n const response = await fetch(`${apiBaseUrl}/v1/reviews/pending`);\r\n if (!response.ok) throw new Error('Failed to fetch pending reviews');\r\n const data = await response.json();\r\n setRequests(data.requests || []);\r\n setError(null);\r\n } catch (err: any) {\r\n setError(err.message);\r\n } finally {\r\n setLoading(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n fetchRequests();\r\n const interval = setInterval(fetchRequests, pollIntervalMs);\r\n return () => clearInterval(interval);\r\n }, [apiBaseUrl, pollIntervalMs]);\r\n\r\n const handleAction = async (request: ApprovalRequest, approved: boolean) => {\r\n setProcessingId(request.id);\r\n try {\r\n const response = await fetch(`${apiBaseUrl}/v1/reviews/${request.id}/resolve`, {\r\n method: 'POST',\r\n headers: { 'Content-Type': 'application/json' },\r\n body: JSON.stringify({ approved }),\r\n });\r\n \r\n if (!response.ok) throw new Error('Failed to resolve review');\r\n \r\n setRequests(prev => prev.filter(r => r.id !== request.id));\r\n if (approved && onApprove) onApprove(request);\r\n if (!approved && onDeny) onDeny(request);\r\n \r\n } catch (err: any) {\r\n setError(err.message);\r\n } finally {\r\n setProcessingId(null);\r\n }\r\n };\r\n\r\n const filteredRequests = useMemo(() => {\r\n if (!searchQuery) return requests;\r\n const lowerQuery = searchQuery.toLowerCase();\r\n return requests.filter(req => \r\n req.agentId.toLowerCase().includes(lowerQuery) || \r\n req.action.toLowerCase().includes(lowerQuery)\r\n );\r\n }, [requests, searchQuery]);\r\n\r\n if (loading && requests.length === 0) {\r\n return (\r\n <div className=\"animate-pulse space-y-4 p-6 bg-white rounded-xl shadow-sm border border-gray-200\">\r\n <div className=\"h-8 bg-gray-200 rounded w-1/3 mb-6\"></div>\r\n <div className=\"h-32 bg-gray-100 rounded-lg border border-gray-200\"></div>\r\n <div className=\"h-32 bg-gray-100 rounded-lg border border-gray-200\"></div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden flex flex-col max-h-[800px] font-sans\">\r\n {/* Header */}\r\n <div className=\"px-6 py-5 border-b border-gray-200 bg-gray-50/50 flex flex-col sm:flex-row sm:items-center justify-between gap-4\">\r\n <div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 flex items-center gap-2\">\r\n Human-in-the-Loop Review\r\n {requests.length > 0 && (\r\n <span className=\"bg-blue-100 text-blue-700 text-xs font-bold px-2.5 py-0.5 rounded-full\">\r\n {requests.length} Pending\r\n </span>\r\n )}\r\n </h2>\r\n <p className=\"text-sm text-gray-500 mt-1\">\r\n Review and authorize agent actions that fell below confidence thresholds.\r\n </p>\r\n </div>\r\n \r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none text-gray-400\">\r\n <SearchIcon />\r\n </div>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search agents or actions...\"\r\n className=\"pl-10 pr-4 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 w-full sm:w-64 transition-shadow\"\r\n value={searchQuery}\r\n onChange={(e) => setSearchQuery(e.target.value)}\r\n />\r\n </div>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mx-6 mt-4 p-3 bg-red-50 border border-red-200 text-red-700 rounded-lg text-sm flex items-center gap-2\">\r\n <XIcon /> {error}\r\n </div>\r\n )}\r\n\r\n {/* Content */}\r\n <div className=\"p-6 overflow-y-auto flex-1 bg-gray-50/30\">\r\n {filteredRequests.length === 0 ? (\r\n <div className=\"flex flex-col items-center justify-center py-12 text-center\">\r\n <div className=\"w-16 h-16 bg-green-50 rounded-full flex items-center justify-center mb-4 text-green-600\">\r\n <CheckIcon />\r\n </div>\r\n <h3 className=\"text-lg font-medium text-gray-900\">All caught up!</h3>\r\n <p className=\"text-gray-500 mt-1 max-w-sm\">\r\n {searchQuery \r\n ? \"No requests match your search criteria.\" \r\n : \"There are no pending agent actions requiring human approval at this time.\"}\r\n </p>\r\n </div>\r\n ) : (\r\n <div className=\"space-y-4\">\r\n {filteredRequests.map((req) => {\r\n const isExpanded = expandedId === req.id;\r\n const isProcessing = processingId === req.id;\r\n const confidenceColor = req.confidence < 0.5 ? 'text-red-700 bg-red-50 border-red-200' : \r\n req.confidence < 0.8 ? 'text-yellow-700 bg-yellow-50 border-yellow-200' : \r\n 'text-green-700 bg-green-50 border-green-200';\r\n\r\n return (\r\n <div \r\n key={req.id} \r\n className={`bg-white border rounded-xl shadow-sm transition-all duration-200 ${isProcessing ? 'opacity-50 pointer-events-none' : 'hover:shadow-md border-gray-200'}`}\r\n >\r\n <div className=\"p-5\">\r\n <div className=\"flex flex-col md:flex-row md:items-start justify-between gap-4\">\r\n \r\n {/* Left side: Info */}\r\n <div className=\"flex-1\">\r\n <div className=\"flex items-center gap-2 flex-wrap mb-2\">\r\n <span className=\"font-semibold text-gray-900 text-base\">{req.agentId}</span>\r\n <span className=\"text-gray-400 text-sm\">requested</span>\r\n <span className=\"px-2.5 py-1 bg-gray-100 text-gray-800 text-xs font-mono font-medium rounded-md border border-gray-200\">\r\n {req.action}\r\n </span>\r\n </div>\r\n \r\n <p className=\"text-sm text-gray-600 leading-relaxed\">\r\n <span className=\"font-medium text-gray-700\">Reason:</span> {req.reason}\r\n </p>\r\n \r\n <div className=\"mt-3 flex items-center gap-4 text-xs text-gray-500\">\r\n <span className=\"flex items-center gap-1\">\r\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z\"></path></svg>\r\n {new Date(req.timestamp).toLocaleString()}\r\n </span>\r\n </div>\r\n </div>\r\n\r\n {/* Right side: Confidence & Actions */}\r\n <div className=\"flex flex-col items-end gap-3 min-w-[140px]\">\r\n <div className={`px-3 py-1.5 rounded-full border text-xs font-bold flex items-center gap-1.5 ${confidenceColor}`}>\r\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" stroke=\"currentColor\" viewBox=\"0 0 24 24\"><path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth=\"2\" d=\"M13 10V3L4 14h7v7l9-11h-7z\"></path></svg>\r\n {(req.confidence * 100).toFixed(1)}% Confidence\r\n </div>\r\n \r\n <div className=\"flex gap-2 w-full\">\r\n <button\r\n onClick={() => handleAction(req, false)}\r\n disabled={isProcessing}\r\n className=\"flex-1 flex justify-center items-center gap-1 bg-white border border-gray-300 hover:bg-red-50 hover:text-red-700 hover:border-red-200 text-gray-700 px-3 py-2 rounded-lg text-sm font-medium transition-colors\"\r\n >\r\n <XIcon /> Deny\r\n </button>\r\n <button\r\n onClick={() => handleAction(req, true)}\r\n disabled={isProcessing}\r\n className=\"flex-1 flex justify-center items-center gap-1 bg-blue-600 hover:bg-blue-700 text-white px-3 py-2 rounded-lg text-sm font-medium transition-colors shadow-sm\"\r\n >\r\n <CheckIcon /> Approve\r\n </button>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Expandable Payload Section */}\r\n <div className=\"border-t border-gray-100 bg-gray-50/50 rounded-b-xl\">\r\n <button \r\n onClick={() => setExpandedId(isExpanded ? null : req.id)}\r\n className=\"w-full px-5 py-2.5 flex items-center justify-between text-xs font-medium text-gray-500 hover:text-gray-700 transition-colors\"\r\n >\r\n <span>View Resource Payload</span>\r\n {isExpanded ? <ChevronUpIcon /> : <ChevronDownIcon />}\r\n </button>\r\n \r\n {isExpanded && (\r\n <div className=\"px-5 pb-5 pt-1\">\r\n <div className=\"bg-gray-900 rounded-lg p-4 overflow-x-auto shadow-inner\">\r\n <pre className=\"text-xs text-green-400 font-mono leading-relaxed\">\r\n {JSON.stringify(req.resource, null, 2)}\r\n </pre>\r\n </div>\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n );\r\n};\r\n","import React, { useState, useEffect, useMemo } from 'react';\r\n\r\ninterface AgentStats {\r\n agentId: string;\r\n totalActions: number;\r\n allowedActions: number;\r\n deniedActions: number;\r\n humanReviews: number;\r\n averageConfidence: number;\r\n hallucinationScore: number; // 0-100, higher means more denied actions\r\n lastActive: string;\r\n}\r\n\r\ninterface AgentReputationDashboardProps {\r\n apiBaseUrl?: string;\r\n refreshIntervalMs?: number;\r\n}\r\n\r\n// Simple SVG Icons\r\nconst RefreshIcon = ({ className = \"\" }: { className?: string }) => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" className={className}><path d=\"M21.5 2v6h-6M21.34 15.57a10 10 0 1 1-.59-9.21l5.25 4.24\"/></svg>\r\n);\r\n\r\nconst ShieldIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z\"/></svg>\r\n);\r\n\r\nconst AlertTriangleIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/><line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/><line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/></svg>\r\n);\r\n\r\nconst SearchIcon = () => (\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\"><circle cx=\"11\" cy=\"11\" r=\"8\"></circle><line x1=\"21\" y1=\"21\" x2=\"16.65\" y2=\"16.65\"></line></svg>\r\n);\r\n\r\nexport const AgentReputationDashboard: React.FC<AgentReputationDashboardProps> = ({\r\n apiBaseUrl = 'http://localhost:8080',\r\n refreshIntervalMs = 10000,\r\n}) => {\r\n const [stats, setStats] = useState<AgentStats[]>([]);\r\n const [loading, setLoading] = useState(true);\r\n const [isRefreshing, setIsRefreshing] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n const [searchQuery, setSearchQuery] = useState('');\r\n const [sortConfig, setSortConfig] = useState<{ key: keyof AgentStats; direction: 'asc' | 'desc' }>({\r\n key: 'hallucinationScore',\r\n direction: 'desc'\r\n });\r\n\r\n const fetchStats = async (showRefreshState = false) => {\r\n if (showRefreshState) setIsRefreshing(true);\r\n try {\r\n const response = await fetch(`${apiBaseUrl}/v1/analytics/agents`);\r\n if (!response.ok) throw new Error('Failed to fetch agent analytics');\r\n const data = await response.json() as { stats: AgentStats[] };\r\n setStats(data.stats || []);\r\n setError(null);\r\n } catch (err: any) {\r\n setError(err.message);\r\n } finally {\r\n setLoading(false);\r\n setIsRefreshing(false);\r\n }\r\n };\r\n\r\n useEffect(() => {\r\n fetchStats();\r\n const interval = setInterval(() => fetchStats(false), refreshIntervalMs);\r\n return () => clearInterval(interval);\r\n }, [apiBaseUrl, refreshIntervalMs]);\r\n\r\n const handleSort = (key: keyof AgentStats) => {\r\n setSortConfig(prev => ({\r\n key,\r\n direction: prev.key === key && prev.direction === 'desc' ? 'asc' : 'desc'\r\n }));\r\n };\r\n\r\n const processedStats = useMemo(() => {\r\n let result = [...stats];\r\n\r\n // Filter\r\n if (searchQuery) {\r\n const lowerQuery = searchQuery.toLowerCase();\r\n result = result.filter(agent => agent.agentId.toLowerCase().includes(lowerQuery));\r\n }\r\n\r\n // Sort\r\n result.sort((a, b) => {\r\n if (a[sortConfig.key] < b[sortConfig.key]) return sortConfig.direction === 'asc' ? -1 : 1;\r\n if (a[sortConfig.key] > b[sortConfig.key]) return sortConfig.direction === 'asc' ? 1 : -1;\r\n return 0;\r\n });\r\n\r\n return result;\r\n }, [stats, searchQuery, sortConfig]);\r\n\r\n // Calculate aggregates\r\n const totalAgents = stats.length;\r\n const totalActions = stats.reduce((sum, a) => sum + a.totalActions, 0);\r\n const avgHallucination = stats.length ? stats.reduce((sum, a) => sum + a.hallucinationScore, 0) / stats.length : 0;\r\n const highRiskAgents = stats.filter(a => a.hallucinationScore > 50).length;\r\n\r\n if (loading && stats.length === 0) {\r\n return (\r\n <div className=\"animate-pulse space-y-4 p-6 bg-white rounded-xl shadow-sm border border-gray-200\">\r\n <div className=\"h-8 bg-gray-200 rounded w-1/4 mb-6\"></div>\r\n <div className=\"grid grid-cols-4 gap-4 mb-6\">\r\n {[1, 2, 3, 4].map(i => <div key={i} className=\"h-24 bg-gray-100 rounded-lg\"></div>)}\r\n </div>\r\n <div className=\"h-64 bg-gray-100 rounded-lg\"></div>\r\n </div>\r\n );\r\n }\r\n\r\n return (\r\n <div className=\"bg-white rounded-xl shadow-sm border border-gray-200 overflow-hidden font-sans\">\r\n {/* Header */}\r\n <div className=\"px-6 py-5 border-b border-gray-200 bg-gray-50/50 flex flex-col sm:flex-row sm:items-center justify-between gap-4\">\r\n <div>\r\n <h2 className=\"text-xl font-semibold text-gray-900 flex items-center gap-2\">\r\n <span className=\"text-blue-600\"><ShieldIcon /></span>\r\n Agent Reputation & Hallucination Index\r\n </h2>\r\n <p className=\"text-sm text-gray-500 mt-1\">\r\n Real-time monitoring of autonomous agent behavior and policy compliance.\r\n </p>\r\n </div>\r\n \r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"relative\">\r\n <div className=\"absolute inset-y-0 left-0 pl-3 flex items-center pointer-events-none text-gray-400\">\r\n <SearchIcon />\r\n </div>\r\n <input\r\n type=\"text\"\r\n placeholder=\"Search agents...\"\r\n className=\"pl-10 pr-4 py-2 border border-gray-300 rounded-lg text-sm focus:ring-2 focus:ring-blue-500 focus:border-blue-500 w-full sm:w-48 transition-shadow\"\r\n value={searchQuery}\r\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => setSearchQuery(e.target.value)}\r\n />\r\n </div>\r\n <button \r\n onClick={() => fetchStats(true)}\r\n className=\"p-2 text-gray-500 hover:text-gray-700 hover:bg-gray-100 rounded-lg transition-colors border border-gray-200 bg-white\"\r\n title=\"Refresh data\"\r\n >\r\n <RefreshIcon className={isRefreshing ? \"animate-spin\" : \"\"} />\r\n </button>\r\n </div>\r\n </div>\r\n\r\n {error && (\r\n <div className=\"mx-6 mt-4 p-3 bg-red-50 border border-red-200 text-red-700 rounded-lg text-sm flex items-center gap-2\">\r\n <AlertTriangleIcon /> {error}\r\n </div>\r\n )}\r\n\r\n {/* KPI Cards */}\r\n <div className=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4 p-6 bg-gray-50/30 border-b border-gray-200\">\r\n <div className=\"bg-white p-4 rounded-xl border border-gray-200 shadow-sm\">\r\n <div className=\"text-sm font-medium text-gray-500 mb-1\">Active Agents</div>\r\n <div className=\"text-2xl font-bold text-gray-900\">{totalAgents}</div>\r\n </div>\r\n <div className=\"bg-white p-4 rounded-xl border border-gray-200 shadow-sm\">\r\n <div className=\"text-sm font-medium text-gray-500 mb-1\">Total Actions Evaluated</div>\r\n <div className=\"text-2xl font-bold text-gray-900\">{totalActions.toLocaleString()}</div>\r\n </div>\r\n <div className=\"bg-white p-4 rounded-xl border border-gray-200 shadow-sm\">\r\n <div className=\"text-sm font-medium text-gray-500 mb-1\">Avg Hallucination Score</div>\r\n <div className=\"text-2xl font-bold text-gray-900 flex items-baseline gap-2\">\r\n {avgHallucination.toFixed(1)}\r\n <span className=\"text-xs font-normal text-gray-500\">/ 100</span>\r\n </div>\r\n </div>\r\n <div className=\"bg-white p-4 rounded-xl border border-gray-200 shadow-sm\">\r\n <div className=\"text-sm font-medium text-gray-500 mb-1\">High Risk Agents</div>\r\n <div className=\"text-2xl font-bold text-red-600 flex items-center gap-2\">\r\n {highRiskAgents}\r\n {highRiskAgents > 0 && <AlertTriangleIcon />}\r\n </div>\r\n </div>\r\n </div>\r\n\r\n {/* Table */}\r\n <div className=\"overflow-x-auto\">\r\n <table className=\"min-w-full divide-y divide-gray-200\">\r\n <thead className=\"bg-gray-50\">\r\n <tr>\r\n {[\r\n { key: 'agentId', label: 'Agent ID' },\r\n { key: 'totalActions', label: 'Total Actions' },\r\n { key: 'allowedActions', label: 'Allowed' },\r\n { key: 'deniedActions', label: 'Denied' },\r\n { key: 'averageConfidence', label: 'Avg Confidence' },\r\n { key: 'hallucinationScore', label: 'Hallucination Risk' }\r\n ].map((col) => (\r\n <th \r\n key={col.key}\r\n onClick={() => handleSort(col.key as keyof AgentStats)}\r\n className=\"px-6 py-3 text-left text-xs font-semibold text-gray-600 uppercase tracking-wider cursor-pointer hover:bg-gray-100 select-none group\"\r\n >\r\n <div className=\"flex items-center gap-1\">\r\n {col.label}\r\n <span className={`text-gray-400 opacity-0 group-hover:opacity-100 transition-opacity ${sortConfig.key === col.key ? 'opacity-100 text-blue-600' : ''}`}>\r\n {sortConfig.key === col.key ? (sortConfig.direction === 'asc' ? '↑' : '↓') : '↕'}\r\n </span>\r\n </div>\r\n </th>\r\n ))}\r\n </tr>\r\n </thead>\r\n <tbody className=\"bg-white divide-y divide-gray-200\">\r\n {processedStats.length === 0 ? (\r\n <tr>\r\n <td colSpan={6} className=\"px-6 py-12 text-center\">\r\n <div className=\"inline-flex items-center justify-center w-12 h-12 rounded-full bg-gray-100 mb-3\">\r\n <ShieldIcon />\r\n </div>\r\n <h3 className=\"text-sm font-medium text-gray-900\">No agents found</h3>\r\n <p className=\"text-sm text-gray-500 mt-1\">\r\n {searchQuery ? \"Try adjusting your search query.\" : \"No agent activity has been recorded yet.\"}\r\n </p>\r\n </td>\r\n </tr>\r\n ) : (\r\n processedStats.map((agent) => (\r\n <tr key={agent.agentId} className=\"hover:bg-gray-50/80 transition-colors\">\r\n <td className=\"px-6 py-4 whitespace-nowrap\">\r\n <div className=\"flex items-center\">\r\n <div className=\"h-8 w-8 rounded-full bg-blue-100 text-blue-700 flex items-center justify-center font-bold text-xs mr-3\">\r\n {agent.agentId.substring(0, 2).toUpperCase()}\r\n </div>\r\n <div>\r\n <div className=\"text-sm font-semibold text-gray-900\">{agent.agentId}</div>\r\n <div className=\"text-xs text-gray-500\">Last active: {new Date(agent.lastActive || Date.now()).toLocaleTimeString()}</div>\r\n </div>\r\n </div>\r\n </td>\r\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-600 font-medium\">\r\n {agent.totalActions.toLocaleString()}\r\n </td>\r\n <td className=\"px-6 py-4 whitespace-nowrap\">\r\n <span className=\"inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium bg-green-100 text-green-800\">\r\n {agent.allowedActions.toLocaleString()}\r\n </span>\r\n </td>\r\n <td className=\"px-6 py-4 whitespace-nowrap\">\r\n <span className={`inline-flex items-center px-2.5 py-0.5 rounded-full text-xs font-medium ${agent.deniedActions > 0 ? 'bg-red-100 text-red-800' : 'bg-gray-100 text-gray-800'}`}>\r\n {agent.deniedActions.toLocaleString()}\r\n </span>\r\n </td>\r\n <td className=\"px-6 py-4 whitespace-nowrap text-sm text-gray-600\">\r\n <div className=\"flex items-center gap-2\">\r\n <div className=\"w-16 bg-gray-200 rounded-full h-1.5\">\r\n <div \r\n className=\"bg-blue-500 h-1.5 rounded-full\" \r\n style={{ width: `${agent.averageConfidence * 100}%` }}\r\n ></div>\r\n </div>\r\n {(agent.averageConfidence * 100).toFixed(1)}%\r\n </div>\r\n </td>\r\n <td className=\"px-6 py-4 whitespace-nowrap\">\r\n <div className=\"flex items-center gap-3\">\r\n <div className=\"w-24 bg-gray-200 rounded-full h-2.5 overflow-hidden\">\r\n <div \r\n className={`h-full transition-all duration-500 ${\r\n agent.hallucinationScore > 50 ? 'bg-red-500' : \r\n agent.hallucinationScore > 20 ? 'bg-yellow-400' : 'bg-green-500'\r\n }`}\r\n style={{ width: `${agent.hallucinationScore}%` }}\r\n ></div>\r\n </div>\r\n <span className={`text-sm font-bold ${\r\n agent.hallucinationScore > 50 ? 'text-red-600' : \r\n agent.hallucinationScore > 20 ? 'text-yellow-600' : 'text-green-600'\r\n }`}>\r\n {agent.hallucinationScore.toFixed(0)}\r\n </span>\r\n </div>\r\n </td>\r\n </tr>\r\n ))\r\n )}\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n );\r\n};\r\n","\"use client\";\r\n\r\nimport { useEffect, useState } from \"react\";\r\nimport { LeluClient } from \"../client\";\r\n\r\nexport * from './LeluApprovalUI';\r\nexport * from './AgentReputationDashboard';\r\n\r\nexport interface UseAgentPermissionOptions {\r\n /** Base URL of the Lelu engine. Defaults to http://localhost:8080 */\r\n baseUrl?: string;\r\n /** API key forwarded to the engine */\r\n apiKey?: string;\r\n /** Scope override passed in the request */\r\n scope?: string;\r\n}\r\n\r\nexport interface AgentPermissionState {\r\n canExecute: boolean;\r\n loading: boolean;\r\n reason: string;\r\n decision: \"allowed\" | \"denied\" | \"human_review\" | \"\";\r\n}\r\n\r\n/**\r\n * React hook that checks whether an agent actor may perform an action.\r\n *\r\n * ```tsx\r\n * const { canExecute, loading, reason } = useAgentPermission(\r\n * \"agent-007\", \"files.read\", 0.95,\r\n * { baseUrl: \"http://localhost:8080\", apiKey: process.env.NEXT_PUBLIC_LELU_KEY }\r\n * );\r\n * ```\r\n */\r\nexport function useAgentPermission(\r\n actor: string,\r\n action: string,\r\n confidence = 1.0,\r\n opts: UseAgentPermissionOptions = {}\r\n): AgentPermissionState {\r\n const [state, setState] = useState<AgentPermissionState>({\r\n canExecute: false,\r\n loading: true,\r\n reason: \"\",\r\n decision: \"\",\r\n });\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n setState({ canExecute: false, loading: true, reason: \"\", decision: \"\" });\r\n\r\n const clientConfig: any = {\r\n baseUrl: opts.baseUrl ?? \"http://localhost:8080\",\r\n };\r\n if (opts.apiKey !== undefined) {\r\n clientConfig.apiKey = opts.apiKey;\r\n }\r\n const client = new LeluClient(clientConfig);\r\n\r\n client\r\n .agentAuthorize({ actor, action, context: { confidence, scope: opts.scope } })\r\n .then((res) => {\r\n if (cancelled) return;\r\n setState({\r\n canExecute: res.allowed,\r\n loading: false,\r\n reason: res.reason ?? (res.allowed ? \"allowed\" : \"denied\"),\r\n decision: res.allowed ? \"allowed\" : (res.requiresHumanReview ? \"human_review\" : \"denied\"),\r\n });\r\n })\r\n .catch((err: unknown) => {\r\n if (cancelled) return;\r\n const msg = err instanceof Error ? err.message : String(err);\r\n setState({ canExecute: false, loading: false, reason: msg, decision: \"denied\" });\r\n });\r\n\r\n return () => { cancelled = true; };\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, [actor, action, confidence, opts.baseUrl, opts.apiKey, opts.scope]);\r\n\r\n return state;\r\n}\r\n"]}
|
package/dist/react/index.mjs
CHANGED
|
@@ -171,6 +171,128 @@ var LeluClient = class {
|
|
|
171
171
|
return false;
|
|
172
172
|
}
|
|
173
173
|
}
|
|
174
|
+
// ── Audit log ──────────────────────────────────────────────────────────────
|
|
175
|
+
/**
|
|
176
|
+
* Lists audit events from the platform API.
|
|
177
|
+
* Requires the platform service to be running (not just the engine).
|
|
178
|
+
*/
|
|
179
|
+
async listAuditEvents(req = {}) {
|
|
180
|
+
const params = new URLSearchParams();
|
|
181
|
+
if (req.limit !== void 0) params.set("limit", req.limit.toString());
|
|
182
|
+
if (req.cursor !== void 0) params.set("cursor", req.cursor.toString());
|
|
183
|
+
if (req.actor) params.set("actor", req.actor);
|
|
184
|
+
if (req.action) params.set("action", req.action);
|
|
185
|
+
if (req.decision) params.set("decision", req.decision);
|
|
186
|
+
if (req.traceId) params.set("trace_id", req.traceId);
|
|
187
|
+
if (req.from) params.set("from", req.from);
|
|
188
|
+
if (req.to) params.set("to", req.to);
|
|
189
|
+
const headers = this.headers();
|
|
190
|
+
if (req.tenantId) {
|
|
191
|
+
headers["X-Tenant-ID"] = req.tenantId;
|
|
192
|
+
}
|
|
193
|
+
const ctrl = new AbortController();
|
|
194
|
+
const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);
|
|
195
|
+
try {
|
|
196
|
+
const url = `${this.baseUrl}/api/v1/audit${params.toString() ? `?${params.toString()}` : ""}`;
|
|
197
|
+
const res = await fetch(url, {
|
|
198
|
+
method: "GET",
|
|
199
|
+
headers,
|
|
200
|
+
signal: ctrl.signal
|
|
201
|
+
});
|
|
202
|
+
const data = await this.parseResponse(res);
|
|
203
|
+
return {
|
|
204
|
+
events: data.events || [],
|
|
205
|
+
count: data.count,
|
|
206
|
+
limit: data.limit,
|
|
207
|
+
cursor: data.cursor,
|
|
208
|
+
nextCursor: data.next_cursor
|
|
209
|
+
};
|
|
210
|
+
} finally {
|
|
211
|
+
clearTimeout(timer);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// ─── Policy Management ────────────────────────────────────────────────────────
|
|
215
|
+
async listPolicies(req = {}) {
|
|
216
|
+
const headers = this.headers();
|
|
217
|
+
if (req.tenantId) {
|
|
218
|
+
headers["X-Tenant-ID"] = req.tenantId;
|
|
219
|
+
}
|
|
220
|
+
const ctrl = new AbortController();
|
|
221
|
+
const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);
|
|
222
|
+
try {
|
|
223
|
+
const res = await fetch(`${this.baseUrl}/api/v1/policies`, {
|
|
224
|
+
method: "GET",
|
|
225
|
+
headers,
|
|
226
|
+
signal: ctrl.signal
|
|
227
|
+
});
|
|
228
|
+
const data = await this.parseResponse(res);
|
|
229
|
+
return {
|
|
230
|
+
policies: data.policies || [],
|
|
231
|
+
count: data.count
|
|
232
|
+
};
|
|
233
|
+
} finally {
|
|
234
|
+
clearTimeout(timer);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
async getPolicy(req) {
|
|
238
|
+
const headers = this.headers();
|
|
239
|
+
if (req.tenantId) {
|
|
240
|
+
headers["X-Tenant-ID"] = req.tenantId;
|
|
241
|
+
}
|
|
242
|
+
const ctrl = new AbortController();
|
|
243
|
+
const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);
|
|
244
|
+
try {
|
|
245
|
+
const res = await fetch(`${this.baseUrl}/api/v1/policies/${encodeURIComponent(req.name)}`, {
|
|
246
|
+
method: "GET",
|
|
247
|
+
headers,
|
|
248
|
+
signal: ctrl.signal
|
|
249
|
+
});
|
|
250
|
+
return await this.parseResponse(res);
|
|
251
|
+
} finally {
|
|
252
|
+
clearTimeout(timer);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
async upsertPolicy(req) {
|
|
256
|
+
const headers = this.headers();
|
|
257
|
+
if (req.tenantId) {
|
|
258
|
+
headers["X-Tenant-ID"] = req.tenantId;
|
|
259
|
+
}
|
|
260
|
+
const body = {
|
|
261
|
+
content: req.content,
|
|
262
|
+
version: req.version || "1.0"
|
|
263
|
+
};
|
|
264
|
+
const ctrl = new AbortController();
|
|
265
|
+
const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);
|
|
266
|
+
try {
|
|
267
|
+
const res = await fetch(`${this.baseUrl}/api/v1/policies/${encodeURIComponent(req.name)}`, {
|
|
268
|
+
method: "PUT",
|
|
269
|
+
headers,
|
|
270
|
+
body: JSON.stringify(body),
|
|
271
|
+
signal: ctrl.signal
|
|
272
|
+
});
|
|
273
|
+
return await this.parseResponse(res);
|
|
274
|
+
} finally {
|
|
275
|
+
clearTimeout(timer);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
async deletePolicy(req) {
|
|
279
|
+
const headers = this.headers();
|
|
280
|
+
if (req.tenantId) {
|
|
281
|
+
headers["X-Tenant-ID"] = req.tenantId;
|
|
282
|
+
}
|
|
283
|
+
const ctrl = new AbortController();
|
|
284
|
+
const timer = setTimeout(() => ctrl.abort(), this.timeoutMs);
|
|
285
|
+
try {
|
|
286
|
+
const res = await fetch(`${this.baseUrl}/api/v1/policies/${encodeURIComponent(req.name)}`, {
|
|
287
|
+
method: "DELETE",
|
|
288
|
+
headers,
|
|
289
|
+
signal: ctrl.signal
|
|
290
|
+
});
|
|
291
|
+
return await this.parseResponse(res);
|
|
292
|
+
} finally {
|
|
293
|
+
clearTimeout(timer);
|
|
294
|
+
}
|
|
295
|
+
}
|
|
174
296
|
// ── HTTP helpers ───────────────────────────────────────────────────────────
|
|
175
297
|
headers() {
|
|
176
298
|
const h = { "Content-Type": "application/json" };
|