{"version":3,"sources":["../src/core/schema.ts","../src/core/errors.ts","../src/core/cursor.ts","../src/core/executor.ts","../src/core/validation.ts","../src/core/security.ts","../src/core/engine.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\n * GQP Schema Manager\n * Manages the virtual schema representing all data sources\n */\n\nimport type {\n    GQPNode,\n    GQPEdge,\n    GQPCapability,\n    GQPSchema as IGQPSchema,\n} from \"./types.js\";\n\nexport class GQPSchema implements IGQPSchema {\n    private nodes: Map<string, GQPNode> = new Map();\n    private rootNodeNames: Set<string> = new Set();\n    private edgeIndex: Map<string, Set<string>> = new Map();\n\n    /**\n     * Add a node to the schema\n     */\n    addNode(node: GQPNode, isRoot = true): void {\n        this.nodes.set(node.name, node);\n\n        if (isRoot) {\n            this.rootNodeNames.add(node.name);\n        }\n\n        // Index edges for fast neighbor lookup\n        for (const edge of node.edges) {\n            if (!this.edgeIndex.has(node.name)) {\n                this.edgeIndex.set(node.name, new Set());\n            }\n            this.edgeIndex.get(node.name)!.add(edge.to);\n        }\n    }\n\n    /**\n     * Get a node by name\n     */\n    getNode(name: string): GQPNode | undefined {\n        return this.nodes.get(name);\n    }\n\n    /**\n     * Get all root nodes (entry points for exploration)\n     */\n    getRootNodes(): GQPNode[] {\n        const roots: GQPNode[] = [];\n        for (const name of this.rootNodeNames) {\n            const node = this.nodes.get(name);\n            if (node) {\n                roots.push(node);\n            }\n        }\n        return roots;\n    }\n\n    /**\n     * Get neighboring nodes (connected via edges)\n     */\n    getNeighbors(nodeName: string, limit = 5): GQPNode[] {\n        const node = this.nodes.get(nodeName);\n        if (!node) return [];\n\n        const neighbors: GQPNode[] = [];\n        const edgeTargets = this.edgeIndex.get(nodeName) || new Set();\n\n        for (const targetName of edgeTargets) {\n            if (neighbors.length >= limit) break;\n            const targetNode = this.nodes.get(targetName);\n            if (targetNode) {\n                neighbors.push(targetNode);\n            }\n        }\n\n        // Also include nodes that point TO this node (reverse edges)\n        for (const [sourceNodeName, targets] of this.edgeIndex.entries()) {\n            if (neighbors.length >= limit) break;\n            if (targets.has(nodeName) && sourceNodeName !== nodeName) {\n                const sourceNode = this.nodes.get(sourceNodeName);\n                if (sourceNode && !neighbors.includes(sourceNode)) {\n                    neighbors.push(sourceNode);\n                }\n            }\n        }\n\n        return neighbors.slice(0, limit);\n    }\n\n    /**\n     * Get all nodes in the schema\n     */\n    getAllNodes(): GQPNode[] {\n        return Array.from(this.nodes.values());\n    }\n\n    /**\n     * Get total node count\n     */\n    getNodeCount(): number {\n        return this.nodes.size;\n    }\n\n    /**\n     * Get all unique capabilities across the schema\n     */\n    getAllCapabilities(): GQPCapability[] {\n        const caps = new Set<GQPCapability>();\n        for (const node of this.nodes.values()) {\n            for (const cap of node.capabilities) {\n                caps.add(cap);\n            }\n        }\n        return Array.from(caps);\n    }\n\n    /**\n     * Find shortest path between two nodes\n     */\n    findPath(from: string, to: string, maxDepth = 4): string[] | null {\n        if (from === to) return [from];\n        if (!this.nodes.has(from) || !this.nodes.has(to)) return null;\n\n        const visited = new Set<string>();\n        const queue: Array<{ node: string; path: string[] }> = [\n            { node: from, path: [from] },\n        ];\n\n        while (queue.length > 0) {\n            const current = queue.shift()!;\n\n            if (current.path.length > maxDepth) continue;\n            if (visited.has(current.node)) continue;\n\n            visited.add(current.node);\n\n            const neighbors = this.edgeIndex.get(current.node) || new Set();\n            for (const neighbor of neighbors) {\n                const newPath = [...current.path, neighbor];\n                if (neighbor === to) {\n                    return newPath;\n                }\n                queue.push({ node: neighbor, path: newPath });\n            }\n        }\n\n        return null;\n    }\n\n    /**\n     * Get edge information between two nodes\n     */\n    getEdge(from: string, to: string): GQPEdge | undefined {\n        const node = this.nodes.get(from);\n        if (!node) return undefined;\n        return node.edges.find((e) => e.to === to);\n    }\n\n    /**\n     * Search nodes by name or description\n     */\n    searchNodes(query: string, limit = 10): GQPNode[] {\n        const lowerQuery = query.toLowerCase();\n        const results: GQPNode[] = [];\n\n        for (const node of this.nodes.values()) {\n            if (results.length >= limit) break;\n\n            const nameMatch = node.name.toLowerCase().includes(lowerQuery);\n            const descMatch = node.description?.toLowerCase().includes(lowerQuery);\n\n            if (nameMatch || descMatch) {\n                results.push(node);\n            }\n        }\n\n        return results;\n    }\n\n    /**\n     * Clear all nodes\n     */\n    clear(): void {\n        this.nodes.clear();\n        this.rootNodeNames.clear();\n        this.edgeIndex.clear();\n    }\n\n    /**\n     * Export schema as JSON-serializable object\n     */\n    toJSON(): {\n        nodes: GQPNode[];\n        rootNodes: string[];\n        capabilities: GQPCapability[];\n    } {\n        return {\n            nodes: this.getAllNodes(),\n            rootNodes: Array.from(this.rootNodeNames),\n            capabilities: this.getAllCapabilities(),\n        };\n    }\n\n    /**\n     * Create schema from JSON\n     */\n    static fromJSON(data: { nodes: GQPNode[]; rootNodes: string[] }): GQPSchema {\n        const schema = new GQPSchema();\n        const rootSet = new Set(data.rootNodes);\n\n        for (const node of data.nodes) {\n            schema.addNode(node, rootSet.has(node.name));\n        }\n\n        return schema;\n    }\n}\n","/**\r\n * GQP Error Classes\r\n * Environment-aware error handling with safe production messages\r\n */\r\n\r\n/**\r\n * Error codes for GQP errors\r\n */\r\nexport const GQPErrorCode = {\r\n  INVALID_ACTION: \"INVALID_ACTION\",\r\n  INVALID_NODE: \"INVALID_NODE\",\r\n  NODE_NOT_FOUND: \"NODE_NOT_FOUND\",\r\n  NODE_REQUIRED: \"NODE_REQUIRED\",\r\n  ADAPTER_NOT_FOUND: \"ADAPTER_NOT_FOUND\",\r\n  VALIDATION_ERROR: \"VALIDATION_ERROR\",\r\n  AUTHORIZATION_ERROR: \"AUTHORIZATION_ERROR\",\r\n  ACCESS_DENIED: \"ACCESS_DENIED\",\r\n  INTROSPECTION_DISABLED: \"INTROSPECTION_DISABLED\",\r\n  QUERY_ERROR: \"QUERY_ERROR\",\r\n  TIMEOUT_ERROR: \"TIMEOUT_ERROR\",\r\n  CONFIGURATION_ERROR: \"CONFIGURATION_ERROR\",\r\n  CURSOR_NOT_FOUND: \"CURSOR_NOT_FOUND\",\r\n  CURSOR_EXPIRED: \"CURSOR_EXPIRED\",\r\n  RATE_LIMIT_ERROR: \"RATE_LIMIT_ERROR\",\r\n  PARSE_ERROR: \"PARSE_ERROR\",\r\n  INTERNAL_ERROR: \"INTERNAL_ERROR\",\r\n} as const;\r\n\r\nexport type GQPErrorCodeType = (typeof GQPErrorCode)[keyof typeof GQPErrorCode];\r\n\r\n/**\r\n * Safe production messages that don't leak internal details\r\n */\r\nconst SAFE_MESSAGES: Record<GQPErrorCodeType, string> = {\r\n  [GQPErrorCode.INVALID_ACTION]: \"Invalid action specified\",\r\n  [GQPErrorCode.INVALID_NODE]: \"Invalid node name format\",\r\n  [GQPErrorCode.NODE_NOT_FOUND]: \"Resource not found\",\r\n  [GQPErrorCode.NODE_REQUIRED]: \"Node name is required for this action\",\r\n  [GQPErrorCode.ADAPTER_NOT_FOUND]: \"Data source not available\",\r\n  [GQPErrorCode.VALIDATION_ERROR]: \"Invalid input provided\",\r\n  [GQPErrorCode.AUTHORIZATION_ERROR]: \"Authentication required\",\r\n  [GQPErrorCode.ACCESS_DENIED]: \"Access denied\",\r\n  [GQPErrorCode.INTROSPECTION_DISABLED]: \"Schema introspection is disabled\",\r\n  [GQPErrorCode.QUERY_ERROR]: \"Query failed\",\r\n  [GQPErrorCode.TIMEOUT_ERROR]: \"Request timed out\",\r\n  [GQPErrorCode.CONFIGURATION_ERROR]: \"Configuration error\",\r\n  [GQPErrorCode.CURSOR_NOT_FOUND]: \"Session not found\",\r\n  [GQPErrorCode.CURSOR_EXPIRED]: \"Session expired\",\r\n  [GQPErrorCode.RATE_LIMIT_ERROR]: \"Rate limit exceeded\",\r\n  [GQPErrorCode.PARSE_ERROR]: \"Failed to parse input\",\r\n  [GQPErrorCode.INTERNAL_ERROR]: \"An internal error occurred\",\r\n};\r\n\r\n/**\r\n * GQP Error class with environment-aware message exposure\r\n */\r\nexport class GQPError extends Error {\r\n  public readonly code: GQPErrorCodeType;\r\n  public readonly details?: unknown;\r\n  public readonly statusCode: number;\r\n\r\n  constructor(\r\n    code: GQPErrorCodeType,\r\n    devMessage: string,\r\n    details?: unknown,\r\n    statusCode = 400,\r\n  ) {\r\n    const isProduction =\r\n      typeof process !== \"undefined\" && process.env?.NODE_ENV === \"production\";\r\n    const message = isProduction ? SAFE_MESSAGES[code] : devMessage;\r\n\r\n    super(message);\r\n    this.name = \"GQPError\";\r\n    this.code = code;\r\n    this.statusCode = statusCode;\r\n\r\n    if (!isProduction) {\r\n      this.details = details;\r\n    }\r\n\r\n    if (Error.captureStackTrace) {\r\n      Error.captureStackTrace(this, GQPError);\r\n    }\r\n  }\r\n\r\n  toJSON(): { code: GQPErrorCodeType; message: string; details?: unknown } {\r\n    return {\r\n      code: this.code,\r\n      message: this.message,\r\n      ...(this.details !== undefined && { details: this.details }),\r\n    };\r\n  }\r\n}\r\n\r\n/**\r\n * Create a GQP error with common patterns\r\n */\r\nexport const createError = {\r\n  invalidAction: (action: string) =>\r\n    new GQPError(\r\n      GQPErrorCode.INVALID_ACTION,\r\n      `Invalid action: \"${action}\". Valid actions are: explore, navigate, query, introspect`,\r\n      { action, validActions: [\"explore\", \"navigate\", \"query\", \"introspect\"] },\r\n    ),\r\n\r\n  invalidNode: (node: string, pattern?: string) =>\r\n    new GQPError(\r\n      GQPErrorCode.INVALID_NODE,\r\n      `Invalid node name: \"${node}\". ${pattern ? `Must match pattern: ${pattern}` : \"Must be alphanumeric with underscores\"}`,\r\n      { node, pattern },\r\n    ),\r\n\r\n  nodeNotFound: (node: string, suggestions?: string[]) =>\r\n    new GQPError(\r\n      GQPErrorCode.NODE_NOT_FOUND,\r\n      suggestions?.length\r\n        ? `Node \"${node}\" not found. Did you mean: ${suggestions.join(\", \")}?`\r\n        : `Node \"${node}\" not found in schema`,\r\n      { node, suggestions },\r\n      404,\r\n    ),\r\n\r\n  nodeRequired: (action: string) =>\r\n    new GQPError(\r\n      GQPErrorCode.NODE_REQUIRED,\r\n      `Node name is required for action \"${action}\"`,\r\n      { action },\r\n    ),\r\n\r\n  adapterNotFound: (node: string) =>\r\n    new GQPError(\r\n      GQPErrorCode.ADAPTER_NOT_FOUND,\r\n      `No adapter found for node \"${node}\"`,\r\n      { node },\r\n    ),\r\n\r\n  validation: (field: string, message: string, value?: unknown) =>\r\n    new GQPError(\r\n      GQPErrorCode.VALIDATION_ERROR,\r\n      `Validation error for \"${field}\": ${message}`,\r\n      { field, message, value },\r\n    ),\r\n\r\n  accessDenied: (node: string, action?: string) =>\r\n    new GQPError(\r\n      GQPErrorCode.ACCESS_DENIED,\r\n      `Access denied to node \"${node}\"${action ? ` for action \"${action}\"` : \"\"}`,\r\n      { node, action },\r\n      403,\r\n    ),\r\n\r\n  introspectionDisabled: () =>\r\n    new GQPError(\r\n      GQPErrorCode.INTROSPECTION_DISABLED,\r\n      \"Schema introspection is disabled in production\",\r\n      undefined,\r\n      403,\r\n    ),\r\n\r\n  timeout: (operation: string, timeoutMs: number) =>\r\n    new GQPError(\r\n      GQPErrorCode.TIMEOUT_ERROR,\r\n      `Operation \"${operation}\" timed out after ${timeoutMs}ms`,\r\n      { operation, timeoutMs },\r\n      504,\r\n    ),\r\n\r\n  cursorNotFound: (cursorId: string) =>\r\n    new GQPError(\r\n      GQPErrorCode.CURSOR_NOT_FOUND,\r\n      `Cursor \"${cursorId}\" not found. It may have been evicted or never existed.`,\r\n      { cursorId },\r\n      404,\r\n    ),\r\n\r\n  cursorExpired: (cursorId: string) =>\r\n    new GQPError(\r\n      GQPErrorCode.CURSOR_EXPIRED,\r\n      `Cursor \"${cursorId}\" has expired. Please create a new cursor.`,\r\n      { cursorId },\r\n      410,\r\n    ),\r\n\r\n  parseError: (input: string, error?: string) =>\r\n    new GQPError(\r\n      GQPErrorCode.PARSE_ERROR,\r\n      `Failed to parse input: ${error || \"malformed data\"}`,\r\n      { input: input.substring(0, 100), error },\r\n    ),\r\n\r\n  rateLimit: (limit: number, windowMs: number) =>\r\n    new GQPError(\r\n      GQPErrorCode.RATE_LIMIT_ERROR,\r\n      `Rate limit exceeded: ${limit} requests per ${windowMs}ms`,\r\n      { limit, windowMs },\r\n      429,\r\n    ),\r\n\r\n  internal: (cause?: unknown) =>\r\n    new GQPError(\r\n      GQPErrorCode.INTERNAL_ERROR,\r\n      cause instanceof Error ? cause.message : \"An internal error occurred\",\r\n      { cause: cause instanceof Error ? cause.message : cause },\r\n      500,\r\n    ),\r\n};\r\n\r\n/**\r\n * Check if an error is a GQP error\r\n */\r\nexport function isGQPError(error: unknown): error is GQPError {\r\n  return error instanceof GQPError;\r\n}\r\n\r\n/**\r\n * Wrap any error as a GQP error\r\n */\r\nexport function wrapError(error: unknown): GQPError {\r\n  if (isGQPError(error)) {\r\n    return error;\r\n  }\r\n  if (error instanceof Error) {\r\n    return new GQPError(\r\n      GQPErrorCode.INTERNAL_ERROR,\r\n      error.message,\r\n      { stack: error.stack },\r\n      500,\r\n    );\r\n  }\r\n  return createError.internal(error);\r\n}\r\n","/**\n * GQP Graph Cursor\n * Manages navigation state through the data graph\n */\n\nimport type {\n  GQPCursor,\n  NeighborhoodView,\n  GQPAction,\n  RelationType,\n} from \"./types.js\";\nimport type { GQPSchema } from \"./schema.js\";\nimport { createError } from \"./errors.js\";\n\n/**\n * Generate a unique cursor ID\n */\nfunction generateCursorId(): string {\n  return `cursor_${Date.now()}_${Math.random().toString(36).slice(2, 11)}`;\n}\n\nexport class GQPGraphCursor {\n  private schema: GQPSchema;\n  private cursor: GQPCursor;\n  private maxPathLength: number;\n\n  constructor(schema: GQPSchema, startNode?: string, maxPathLength = 100) {\n    this.schema = schema;\n    this.maxPathLength = maxPathLength;\n\n    this.cursor = {\n      id: generateCursorId(),\n      currentNode: startNode || null,\n      neighbors: [],\n      path: startNode ? [startNode] : [],\n      depth: startNode ? 0 : -1,\n      createdAt: Date.now(),\n      metadata: {\n        totalNodes: schema.getNodeCount(),\n        exploredNodes: startNode ? 1 : 0,\n      },\n    };\n\n    if (startNode) {\n      this.updateNeighbors();\n    }\n  }\n\n  /**\n   * Get the cursor ID\n   */\n  getId(): string {\n    return this.cursor.id;\n  }\n\n  /**\n   * Get the current cursor state\n   */\n  getState(): GQPCursor {\n    return { ...this.cursor };\n  }\n\n  /**\n   * Get current node name\n   */\n  getCurrentNode(): string | null {\n    return this.cursor.currentNode;\n  }\n\n  /**\n   * Get cursor creation time\n   */\n  getCreatedAt(): number {\n    return this.cursor.createdAt;\n  }\n\n  /**\n   * Navigate to a specific node\n   */\n  navigateTo(nodeName: string): NeighborhoodView {\n    const node = this.schema.getNode(nodeName);\n    if (!node) {\n      throw createError.nodeNotFound(nodeName);\n    }\n\n    this.cursor.currentNode = nodeName;\n    this.cursor.depth = this.cursor.path.length;\n\n    if (this.cursor.path.length >= this.maxPathLength) {\n      this.cursor.path.shift();\n    }\n    this.cursor.path.push(nodeName);\n\n    this.cursor.metadata.exploredNodes = new Set(this.cursor.path).size;\n\n    this.updateNeighbors();\n\n    return this.getNeighborhood();\n  }\n\n  /**\n   * Go back to previous node\n   */\n  goBack(): NeighborhoodView | null {\n    if (this.cursor.path.length <= 1) {\n      return null;\n    }\n\n    this.cursor.path.pop();\n    const previousNode = this.cursor.path[this.cursor.path.length - 1];\n    this.cursor.currentNode = previousNode || null;\n    this.cursor.depth = Math.max(0, this.cursor.depth - 1);\n\n    this.updateNeighbors();\n\n    return this.getNeighborhood();\n  }\n\n  /**\n   * Reset cursor to initial state\n   */\n  reset(): void {\n    this.cursor.currentNode = null;\n    this.cursor.neighbors = [];\n    this.cursor.path = [];\n    this.cursor.depth = -1;\n    this.cursor.metadata.exploredNodes = 0;\n  }\n\n  /**\n   * Get current neighborhood view (limited context for agents)\n   */\n  getNeighborhood(size = 5): NeighborhoodView {\n    const currentNodeName = this.cursor.currentNode;\n    const currentNode = currentNodeName\n      ? this.schema.getNode(currentNodeName)\n      : null;\n\n    if (!currentNode) {\n      const rootNodes = this.schema.getRootNodes().slice(0, size);\n      return {\n        currentNode: null,\n        neighbors: rootNodes.map((n) => ({\n          name: n.name,\n          description: n.description,\n          relation: \"hasMany\" as RelationType,\n          distance: 1,\n        })),\n        path: [],\n        depth: -1,\n        availableActions: [\"explore\", \"navigate\", \"introspect\"],\n      };\n    }\n\n    const neighbors = this.schema.getNeighbors(currentNodeName!, size);\n    const neighborViews = neighbors.map((n) => {\n      const edge = this.schema.getEdge(currentNodeName!, n.name);\n      return {\n        name: n.name,\n        description: n.description,\n        relation: edge?.relation || (\"hasMany\" as RelationType),\n        distance: 1,\n      };\n    });\n\n    const availableActions: GQPAction[] = [\"navigate\", \"query\"];\n    if (this.cursor.path.length > 1) {\n      availableActions.push(\"explore\");\n    }\n\n    return {\n      currentNode,\n      neighbors: neighborViews,\n      path: [...this.cursor.path],\n      depth: this.cursor.depth,\n      availableActions,\n    };\n  }\n\n  /**\n   * Check if a node is reachable from current position\n   */\n  canReach(nodeName: string, maxDepth = 4): boolean {\n    if (!this.cursor.currentNode) return true;\n    const path = this.schema.findPath(\n      this.cursor.currentNode,\n      nodeName,\n      maxDepth,\n    );\n    return path !== null;\n  }\n\n  /**\n   * Get suggested next nodes based on traversal patterns\n   */\n  getSuggestedNodes(limit = 3): string[] {\n    if (!this.cursor.currentNode) {\n      return this.schema\n        .getRootNodes()\n        .slice(0, limit)\n        .map((n) => n.name);\n    }\n\n    const visited = new Set(this.cursor.path);\n    const neighbors = this.schema.getNeighbors(this.cursor.currentNode, 10);\n\n    const unvisited = neighbors\n      .filter((n) => !visited.has(n.name))\n      .slice(0, limit);\n\n    return unvisited.map((n) => n.name);\n  }\n\n  /**\n   * Update neighbors list based on current position\n   */\n  private updateNeighbors(): void {\n    if (!this.cursor.currentNode) {\n      this.cursor.neighbors = this.schema.getRootNodes().map((n) => n.name);\n    } else {\n      const neighbors = this.schema.getNeighbors(this.cursor.currentNode);\n      this.cursor.neighbors = neighbors.map((n) => n.name);\n    }\n  }\n\n  /**\n   * Serialize cursor for storage/transport\n   */\n  toJSON(): GQPCursor {\n    return this.getState();\n  }\n\n  /**\n   * Restore cursor from serialized state\n   */\n  static fromJSON(\n    schema: GQPSchema,\n    state: GQPCursor,\n    maxPathLength = 100,\n  ): GQPGraphCursor {\n    const cursor = new GQPGraphCursor(schema, undefined, maxPathLength);\n    cursor.cursor = { ...state };\n    return cursor;\n  }\n}\n\n/**\n * Cursor manager for handling multiple cursors (multi-session support)\n */\nexport class CursorManager {\n  private cursors: Map<string, GQPGraphCursor> = new Map();\n  private schema: GQPSchema;\n  private maxCursors: number;\n  private cursorTTL: number;\n  private maxPathLength: number;\n\n  constructor(\n    schema: GQPSchema,\n    maxCursors = 100,\n    cursorTTL = 30 * 60 * 1000,\n    maxPathLength = 100,\n  ) {\n    this.schema = schema;\n    this.maxCursors = maxCursors;\n    this.cursorTTL = cursorTTL;\n    this.maxPathLength = maxPathLength;\n  }\n\n  /**\n   * Create a new cursor\n   */\n  create(startNode?: string): GQPGraphCursor {\n    this.evictExpired();\n\n    if (this.cursors.size >= this.maxCursors) {\n      this.evictOldest();\n    }\n\n    const cursor = new GQPGraphCursor(\n      this.schema,\n      startNode,\n      this.maxPathLength,\n    );\n    this.cursors.set(cursor.getId(), cursor);\n    return cursor;\n  }\n\n  /**\n   * Get cursor by ID\n   */\n  get(id: string): GQPGraphCursor | undefined {\n    const cursor = this.cursors.get(id);\n\n    if (cursor && this.isExpired(cursor)) {\n      this.cursors.delete(id);\n      return undefined;\n    }\n\n    return cursor;\n  }\n\n  /**\n   * Delete a cursor\n   */\n  delete(id: string): boolean {\n    return this.cursors.delete(id);\n  }\n\n  /**\n   * Get or create cursor\n   */\n  getOrCreate(id?: string, startNode?: string): GQPGraphCursor {\n    if (id) {\n      const existing = this.get(id);\n      if (existing) return existing;\n    }\n    return this.create(startNode);\n  }\n\n  /**\n   * Clear all cursors\n   */\n  clear(): void {\n    this.cursors.clear();\n  }\n\n  /**\n   * Get cursor count\n   */\n  size(): number {\n    return this.cursors.size;\n  }\n\n  /**\n   * Check if cursor is expired\n   */\n  private isExpired(cursor: GQPGraphCursor): boolean {\n    return Date.now() - cursor.getCreatedAt() > this.cursorTTL;\n  }\n\n  /**\n   * Evict expired cursors\n   */\n  private evictExpired(): void {\n    const now = Date.now();\n    for (const [id, cursor] of this.cursors.entries()) {\n      if (now - cursor.getCreatedAt() > this.cursorTTL) {\n        this.cursors.delete(id);\n      }\n    }\n  }\n\n  /**\n   * Evict oldest cursor\n   */\n  private evictOldest(): void {\n    let oldestId: string | null = null;\n    let oldestTime = Infinity;\n\n    for (const [id, cursor] of this.cursors.entries()) {\n      const createdAt = cursor.getCreatedAt();\n      if (createdAt < oldestTime) {\n        oldestTime = createdAt;\n        oldestId = id;\n      }\n    }\n\n    if (oldestId) {\n      this.cursors.delete(oldestId);\n    }\n  }\n}\n","/**\n * GQP Query Executor\n * Orchestrates query execution across adapters and plugins\n */\n\nimport type {\n  GQPAdapter,\n  GQPPlugin,\n  GQPNode,\n  QueryFilters,\n  QueryOptions,\n  QueryResult,\n  PluginContext,\n} from \"./types.js\";\nimport type { GQPSchema } from \"./schema.js\";\nimport { createError } from \"./errors.js\";\n\nexport interface ExecutorConfig {\n  defaultLimit: number;\n  maxLimit: number;\n  timeout: number;\n  maxIncludeDepth?: number;\n}\n\nconst DEFAULT_CONFIG: ExecutorConfig = {\n  defaultLimit: 10,\n  maxLimit: 100,\n  timeout: 30000,\n  maxIncludeDepth: 3,\n};\n\nexport class QueryExecutor {\n  private adapters: Map<string, GQPAdapter>;\n  private plugins: GQPPlugin[];\n  private schema: GQPSchema;\n  private config: ExecutorConfig;\n\n  constructor(\n    schema: GQPSchema,\n    adapters: Map<string, GQPAdapter>,\n    plugins: GQPPlugin[],\n    config: Partial<ExecutorConfig> = {},\n  ) {\n    this.schema = schema;\n    this.adapters = adapters;\n    this.plugins = plugins;\n    this.config = { ...DEFAULT_CONFIG, ...config };\n  }\n\n  /**\n   * Execute a query against a node\n   */\n  async execute(\n    nodeName: string,\n    filters: QueryFilters = {},\n    options: QueryOptions = {},\n  ): Promise<QueryResult> {\n    const startTime = Date.now();\n\n    const node = this.schema.getNode(nodeName);\n    if (!node) {\n      throw createError.nodeNotFound(nodeName);\n    }\n\n    const adapter = this.adapters.get(node.source);\n    if (!adapter) {\n      throw createError.adapterNotFound(nodeName);\n    }\n\n    const normalizedOptions = this.normalizeOptions(options);\n\n    const context: PluginContext = {\n      query: undefined,\n      filters,\n      options: normalizedOptions,\n    };\n\n    let processedFilters = { ...filters };\n    for (const plugin of this.plugins) {\n      if (plugin.onPreQuery) {\n        processedFilters = await plugin.onPreQuery(\n          node,\n          processedFilters,\n          context,\n        );\n      }\n\n      if (plugin.translateFilter) {\n        processedFilters = await this.translateFilters(\n          node,\n          processedFilters,\n          plugin,\n          context,\n        );\n      }\n    }\n\n    let results = await this.executeWithTimeout(\n      adapter.execute(nodeName, processedFilters, normalizedOptions),\n      this.config.timeout,\n    );\n\n    for (const plugin of this.plugins) {\n      if (plugin.onPostQuery) {\n        results = await plugin.onPostQuery(node, results, context);\n      }\n    }\n\n    let total: number | undefined;\n    if (adapter.count) {\n      try {\n        total = await adapter.count(nodeName, processedFilters);\n      } catch {}\n    }\n\n    const executionTimeMs = Date.now() - startTime;\n\n    return {\n      data: results,\n      meta: {\n        total,\n        hasMore: results.length === normalizedOptions.limit,\n        executionTimeMs,\n      },\n      nextActions: this.suggestNextActions(node, results),\n    };\n  }\n\n  /**\n   * Normalize and validate query options\n   */\n  private normalizeOptions(options: QueryOptions): QueryOptions {\n    let limit = this.config.defaultLimit;\n    if (options.limit !== undefined) {\n      const parsedLimit = Number(options.limit);\n      if (Number.isFinite(parsedLimit) && parsedLimit > 0) {\n        limit = Math.min(parsedLimit, this.config.maxLimit);\n      }\n    }\n\n    let offset = 0;\n    if (options.offset !== undefined) {\n      const parsedOffset = Number(options.offset);\n      if (Number.isFinite(parsedOffset) && parsedOffset >= 0) {\n        offset = parsedOffset;\n      }\n    }\n\n    let include = options.include;\n    if (include && Array.isArray(include) && this.config.maxIncludeDepth) {\n      include = include.map((inc) => {\n        const parts = inc.split(\".\");\n        if (parts.length > this.config.maxIncludeDepth!) {\n          return parts.slice(0, this.config.maxIncludeDepth).join(\".\");\n        }\n        return inc;\n      });\n    }\n\n    return {\n      limit,\n      offset,\n      orderBy: options.orderBy,\n      include: include || [],\n    };\n  }\n\n  /**\n   * Execute query with semantic search\n   */\n  async executeWithSearch(\n    nodeName: string,\n    query: string,\n    filters: QueryFilters = {},\n    options: QueryOptions = {},\n  ): Promise<QueryResult> {\n    const node = this.schema.getNode(nodeName);\n    if (!node) {\n      throw createError.nodeNotFound(nodeName);\n    }\n\n    const context: PluginContext = {\n      query,\n      filters,\n      options,\n    };\n\n    let enhancedFilters = { ...filters };\n    for (const plugin of this.plugins) {\n      if (plugin.onPreQuery) {\n        enhancedFilters = await plugin.onPreQuery(\n          node,\n          enhancedFilters,\n          context,\n        );\n      }\n    }\n\n    return this.execute(nodeName, enhancedFilters, options);\n  }\n\n  /**\n   * Translate filter values using plugins\n   */\n  private async translateFilters(\n    node: GQPNode,\n    filters: QueryFilters,\n    plugin: GQPPlugin,\n    context: PluginContext,\n  ): Promise<QueryFilters> {\n    const translated: QueryFilters = {};\n\n    for (const [fieldName, value] of Object.entries(filters)) {\n      const field = node.fields.find((f) => f.name === fieldName);\n\n      if (field && plugin.translateFilter) {\n        const translatedValue = plugin.translateFilter(field, value, context);\n        if (translatedValue !== null) {\n          translated[fieldName] = translatedValue;\n          continue;\n        }\n      }\n\n      translated[fieldName] = value;\n    }\n\n    return translated;\n  }\n\n  /**\n   * Execute with timeout\n   */\n  private async executeWithTimeout<T>(\n    promise: Promise<T>,\n    timeoutMs: number,\n  ): Promise<T> {\n    return new Promise((resolve, reject) => {\n      const timer = setTimeout(() => {\n        reject(createError.timeout(\"query\", timeoutMs));\n      }, timeoutMs);\n\n      promise\n        .then((result) => {\n          clearTimeout(timer);\n          resolve(result);\n        })\n        .catch((error) => {\n          clearTimeout(timer);\n          reject(error);\n        });\n    });\n  }\n\n  /**\n   * Suggest next actions based on results\n   */\n  private suggestNextActions(node: GQPNode, results: unknown[]): string[] {\n    const actions: string[] = [];\n\n    if (results.length === 0) {\n      actions.push(\"Try a different query or filter\");\n      actions.push(\"Navigate to a related node\");\n    } else {\n      for (const edge of node.edges.slice(0, 2)) {\n        actions.push(`Navigate to ${edge.to} to see related data`);\n      }\n\n      if (results.length >= this.config.defaultLimit) {\n        actions.push(\"Add filters to narrow down results\");\n      }\n    }\n\n    return actions;\n  }\n}\n","/**\r\n * GQP Input Validation\r\n * Configurable validation with secure defaults\r\n */\r\n\r\nimport { createError } from \"./errors.js\";\r\nimport type { ToolCallParams, QueryFilters, QueryOptions } from \"./types.js\";\r\n\r\n/**\r\n * Validation configuration\r\n */\r\nexport interface ValidationConfig {\r\n  /** Enforce strict node name format (default: true) */\r\n  strictNodeNames?: boolean;\r\n  /** Custom node name pattern (default: /^[a-zA-Z_][a-zA-Z0-9_]*$/) */\r\n  nodeNamePattern?: RegExp;\r\n  /** Allowed filter operators */\r\n  allowedFilterOperators?: string[];\r\n  /** Max array size in filters */\r\n  maxArrayInFilter?: number;\r\n  /** Max filter depth */\r\n  maxFilterDepth?: number;\r\n  /** Max query string length */\r\n  maxQueryLength?: number;\r\n}\r\n\r\n/**\r\n * Limits configuration\r\n */\r\nexport interface LimitsConfig {\r\n  /** Maximum limit for query results (default: 100) */\r\n  maxLimit?: number;\r\n  /** Default limit for query results (default: 10) */\r\n  defaultLimit?: number;\r\n  /** Maximum offset for pagination (default: 10000) */\r\n  maxOffset?: number;\r\n  /** Maximum include depth for relationships (default: 3) */\r\n  maxIncludeDepth?: number;\r\n  /** Maximum cursors to maintain (default: 100) */\r\n  maxCursors?: number;\r\n  /** Cursor TTL in milliseconds (default: 30 minutes) */\r\n  cursorTTL?: number;\r\n  /** Maximum cursor path length (default: 100) */\r\n  maxCursorPathLength?: number;\r\n  /** Query timeout in milliseconds (default: 30000) */\r\n  timeout?: number;\r\n}\r\n\r\n/**\r\n * Default validation config\r\n */\r\nexport const DEFAULT_VALIDATION: Required<ValidationConfig> = {\r\n  strictNodeNames: true,\r\n  nodeNamePattern: /^[a-zA-Z_][a-zA-Z0-9_]*$/,\r\n  allowedFilterOperators: [\r\n    \"equals\",\r\n    \"not\",\r\n    \"in\",\r\n    \"notIn\",\r\n    \"lt\",\r\n    \"lte\",\r\n    \"gt\",\r\n    \"gte\",\r\n    \"contains\",\r\n    \"startsWith\",\r\n    \"endsWith\",\r\n    \"mode\",\r\n    \"search\",\r\n  ],\r\n  maxArrayInFilter: 100,\r\n  maxFilterDepth: 5,\r\n  maxQueryLength: 1000,\r\n};\r\n\r\n/**\r\n * Default limits config\r\n */\r\nexport const DEFAULT_LIMITS: Required<LimitsConfig> = {\r\n  maxLimit: 100,\r\n  defaultLimit: 10,\r\n  maxOffset: 10000,\r\n  maxIncludeDepth: 3,\r\n  maxCursors: 100,\r\n  cursorTTL: 30 * 60 * 1000,\r\n  maxCursorPathLength: 100,\r\n  timeout: 30000,\r\n};\r\n\r\n/**\r\n * Validation utilities\r\n */\r\nexport class Validator {\r\n  private config: Required<ValidationConfig>;\r\n  private limits: Required<LimitsConfig>;\r\n\r\n  constructor(\r\n    validationConfig?: ValidationConfig,\r\n    limitsConfig?: LimitsConfig,\r\n  ) {\r\n    this.config = { ...DEFAULT_VALIDATION, ...validationConfig };\r\n    this.limits = { ...DEFAULT_LIMITS, ...limitsConfig };\r\n  }\r\n\r\n  /**\r\n   * Validate a node name\r\n   */\r\n  validateNodeName(node: unknown): string {\r\n    if (node === undefined || node === null) {\r\n      throw createError.nodeRequired(\"navigate/query\");\r\n    }\r\n\r\n    if (typeof node !== \"string\") {\r\n      throw createError.validation(\"node\", \"must be a string\", node);\r\n    }\r\n\r\n    const trimmed = node.trim();\r\n    if (trimmed === \"\") {\r\n      throw createError.nodeRequired(\"navigate/query\");\r\n    }\r\n\r\n    if (\r\n      this.config.strictNodeNames &&\r\n      !this.config.nodeNamePattern.test(trimmed)\r\n    ) {\r\n      throw createError.invalidNode(\r\n        trimmed,\r\n        this.config.nodeNamePattern.source,\r\n      );\r\n    }\r\n\r\n    return trimmed;\r\n  }\r\n\r\n  /**\r\n   * Validate action parameter\r\n   */\r\n  validateAction(\r\n    action: unknown,\r\n  ): \"explore\" | \"navigate\" | \"query\" | \"introspect\" {\r\n    const validActions = [\"explore\", \"navigate\", \"query\", \"introspect\"];\r\n\r\n    if (!action || typeof action !== \"string\") {\r\n      throw createError.validation(\r\n        \"action\",\r\n        \"is required and must be a string\",\r\n        action,\r\n      );\r\n    }\r\n\r\n    if (!validActions.includes(action)) {\r\n      throw createError.invalidAction(action);\r\n    }\r\n\r\n    return action as \"explore\" | \"navigate\" | \"query\" | \"introspect\";\r\n  }\r\n\r\n  /**\r\n   * Validate and normalize query options\r\n   */\r\n  validateOptions(options: QueryOptions = {}): QueryOptions {\r\n    const normalized: QueryOptions = {};\r\n\r\n    // Validate limit\r\n    if (options.limit !== undefined) {\r\n      const limit = Number(options.limit);\r\n      if (!Number.isFinite(limit) || limit < 1) {\r\n        normalized.limit = this.limits.defaultLimit;\r\n      } else {\r\n        normalized.limit = Math.min(limit, this.limits.maxLimit);\r\n      }\r\n    } else {\r\n      normalized.limit = this.limits.defaultLimit;\r\n    }\r\n\r\n    // Validate offset\r\n    if (options.offset !== undefined) {\r\n      const offset = Number(options.offset);\r\n      if (!Number.isFinite(offset) || offset < 0) {\r\n        normalized.offset = 0;\r\n      } else {\r\n        normalized.offset = Math.min(offset, this.limits.maxOffset);\r\n      }\r\n    } else {\r\n      normalized.offset = 0;\r\n    }\r\n\r\n    // Validate include depth\r\n    if (options.include && Array.isArray(options.include)) {\r\n      normalized.include = options.include\r\n        .filter((inc): inc is string => typeof inc === \"string\")\r\n        .map((inc) => {\r\n          const parts = inc.split(\".\");\r\n          if (parts.length > this.limits.maxIncludeDepth) {\r\n            return parts.slice(0, this.limits.maxIncludeDepth).join(\".\");\r\n          }\r\n          return inc;\r\n        });\r\n    }\r\n\r\n    // Copy orderBy if valid\r\n    if (options.orderBy && typeof options.orderBy === \"object\") {\r\n      const { field, direction } = options.orderBy as {\r\n        field?: string;\r\n        direction?: string;\r\n      };\r\n      if (\r\n        typeof field === \"string\" &&\r\n        [\"asc\", \"desc\"].includes(direction || \"\")\r\n      ) {\r\n        normalized.orderBy = { field, direction: direction as \"asc\" | \"desc\" };\r\n      }\r\n    }\r\n\r\n    return normalized;\r\n  }\r\n\r\n  /**\r\n   * Validate query string\r\n   */\r\n  validateQuery(query: unknown): string | undefined {\r\n    if (query === undefined || query === null) {\r\n      return undefined;\r\n    }\r\n\r\n    if (typeof query !== \"string\") {\r\n      throw createError.validation(\"query\", \"must be a string\", query);\r\n    }\r\n\r\n    if (query.length > this.config.maxQueryLength) {\r\n      throw createError.validation(\r\n        \"query\",\r\n        `exceeds maximum length of ${this.config.maxQueryLength}`,\r\n        { length: query.length },\r\n      );\r\n    }\r\n\r\n    return query;\r\n  }\r\n\r\n  /**\r\n   * Validate filters object\r\n   */\r\n  validateFilters(filters: unknown, depth = 0): QueryFilters {\r\n    if (filters === undefined || filters === null) {\r\n      return {};\r\n    }\r\n\r\n    if (typeof filters !== \"object\" || Array.isArray(filters)) {\r\n      throw createError.validation(\"filters\", \"must be an object\", filters);\r\n    }\r\n\r\n    if (depth > this.config.maxFilterDepth) {\r\n      throw createError.validation(\r\n        \"filters\",\r\n        `exceeds maximum depth of ${this.config.maxFilterDepth}`,\r\n        { depth },\r\n      );\r\n    }\r\n\r\n    const validated: QueryFilters = {};\r\n    const filterObj = filters as Record<string, unknown>;\r\n\r\n    for (const [key, value] of Object.entries(filterObj)) {\r\n      // Validate key format\r\n      if (\r\n        this.config.strictNodeNames &&\r\n        !/^[a-zA-Z_][a-zA-Z0-9_]*$/.test(key)\r\n      ) {\r\n        if (![\"AND\", \"OR\", \"NOT\"].includes(key)) {\r\n          continue;\r\n        }\r\n      }\r\n\r\n      // Handle arrays (e.g., { in: [...] })\r\n      if (Array.isArray(value)) {\r\n        if (value.length > this.config.maxArrayInFilter) {\r\n          throw createError.validation(\r\n            `filters.${key}`,\r\n            `array exceeds maximum length of ${this.config.maxArrayInFilter}`,\r\n            { length: value.length },\r\n          );\r\n        }\r\n        validated[key] = value;\r\n      }\r\n      // Handle nested objects (operators or nested filters)\r\n      else if (value !== null && typeof value === \"object\") {\r\n        validated[key] = this.validateNestedFilter(\r\n          key,\r\n          value as Record<string, unknown>,\r\n          depth,\r\n        );\r\n      }\r\n      // Handle primitive values\r\n      else {\r\n        validated[key] = value;\r\n      }\r\n    }\r\n\r\n    return validated;\r\n  }\r\n\r\n  /**\r\n   * Validate nested filter (operator object)\r\n   */\r\n  private validateNestedFilter(\r\n    parentKey: string,\r\n    filter: Record<string, unknown>,\r\n    depth: number,\r\n  ): Record<string, unknown> {\r\n    const validated: Record<string, unknown> = {};\r\n\r\n    for (const [op, value] of Object.entries(filter)) {\r\n      // Check if it's an operator\r\n      if (this.config.allowedFilterOperators.includes(op)) {\r\n        // Validate array values\r\n        if (\r\n          Array.isArray(value) &&\r\n          value.length > this.config.maxArrayInFilter\r\n        ) {\r\n          throw createError.validation(\r\n            `filters.${parentKey}.${op}`,\r\n            `array exceeds maximum length of ${this.config.maxArrayInFilter}`,\r\n            { length: value.length },\r\n          );\r\n        }\r\n        validated[op] = value;\r\n      }\r\n      // Allow nested logical operators (AND, OR, NOT)\r\n      else if ([\"AND\", \"OR\", \"NOT\"].includes(op)) {\r\n        if (Array.isArray(value)) {\r\n          validated[op] = value.map((v) => this.validateFilters(v, depth + 1));\r\n        } else {\r\n          validated[op] = this.validateFilters(value, depth + 1);\r\n        }\r\n      }\r\n      // Allow nested field access (for relations)\r\n      else if (typeof value === \"object\" && value !== null) {\r\n        validated[op] = this.validateNestedFilter(\r\n          `${parentKey}.${op}`,\r\n          value as Record<string, unknown>,\r\n          depth + 1,\r\n        );\r\n      }\r\n      // Primitive values (equals shorthand)\r\n      else {\r\n        validated[op] = value;\r\n      }\r\n    }\r\n\r\n    return validated;\r\n  }\r\n\r\n  /**\r\n   * Validate cursor ID format\r\n   */\r\n  validateCursorId(cursorId: unknown): string | undefined {\r\n    if (cursorId === undefined || cursorId === null) {\r\n      return undefined;\r\n    }\r\n\r\n    if (typeof cursorId !== \"string\") {\r\n      throw createError.validation(\"cursorId\", \"must be a string\", cursorId);\r\n    }\r\n\r\n    return cursorId;\r\n  }\r\n\r\n  /**\r\n   * Validate complete tool call params\r\n   */\r\n  validateToolCallParams(params: unknown): ToolCallParams {\r\n    if (!params || typeof params !== \"object\") {\r\n      throw createError.validation(\"params\", \"must be an object\", params);\r\n    }\r\n\r\n    const p = params as Record<string, unknown>;\r\n\r\n    const action = this.validateAction(p.action);\r\n    const result: ToolCallParams = { action };\r\n\r\n    // Validate node for actions that require it\r\n    if (action === \"navigate\" || action === \"query\") {\r\n      result.node = this.validateNodeName(p.node);\r\n    } else if (p.node !== undefined) {\r\n      result.node = this.validateNodeName(p.node);\r\n    }\r\n\r\n    // Validate optional fields\r\n    if (p.query !== undefined) {\r\n      result.query = this.validateQuery(p.query);\r\n    }\r\n\r\n    if (p.filters !== undefined) {\r\n      result.filters = this.validateFilters(p.filters);\r\n    }\r\n\r\n    if (p.options !== undefined) {\r\n      result.options = this.validateOptions(p.options as QueryOptions);\r\n    }\r\n\r\n    if (p.cursorId !== undefined) {\r\n      result.cursorId = this.validateCursorId(p.cursorId);\r\n    }\r\n\r\n    return result;\r\n  }\r\n\r\n  /**\r\n   * Get current limits\r\n   */\r\n  getLimits(): Required<LimitsConfig> {\r\n    return { ...this.limits };\r\n  }\r\n\r\n  /**\r\n   * Get current validation config\r\n   */\r\n  getConfig(): Required<ValidationConfig> {\r\n    return { ...this.config };\r\n  }\r\n}\r\n\r\n/**\r\n * Create a validator instance\r\n */\r\nexport function createValidator(\r\n  validationConfig?: ValidationConfig,\r\n  limitsConfig?: LimitsConfig,\r\n): Validator {\r\n  return new Validator(validationConfig, limitsConfig);\r\n}\r\n\r\n/**\r\n * Safe JSON parse with error handling\r\n */\r\nexport function safeJsonParse<T>(json: string, fallback?: T): T {\r\n  try {\r\n    return JSON.parse(json) as T;\r\n  } catch (e) {\r\n    if (fallback !== undefined) {\r\n      return fallback;\r\n    }\r\n    throw createError.parseError(\r\n      json,\r\n      e instanceof Error ? e.message : \"Invalid JSON\",\r\n    );\r\n  }\r\n}\r\n\r\n/**\r\n * Circular-safe JSON stringify\r\n */\r\nexport function safeJsonStringify(obj: unknown, maxDepth = 10): string {\r\n  const seen = new WeakSet();\r\n  let depth = 0;\r\n\r\n  return JSON.stringify(obj, (_, value) => {\r\n    if (depth > maxDepth) {\r\n      return \"[max depth exceeded]\";\r\n    }\r\n\r\n    if (typeof value === \"object\" && value !== null) {\r\n      if (seen.has(value)) {\r\n        return \"[circular reference]\";\r\n      }\r\n      seen.add(value);\r\n      depth++;\r\n    }\r\n\r\n    return value;\r\n  });\r\n}\r\n","/**\r\n * GQP Security Layer\r\n * Optional authorization and row-level security\r\n */\r\n\r\nimport { createError, GQPError } from \"./errors.js\";\r\nimport type { QueryFilters, GQPNode } from \"./types.js\";\r\n\r\n/**\r\n * Security context provided by the application\r\n */\r\nexport interface SecurityContext {\r\n  /** User identifier */\r\n  userId?: string;\r\n  /** Organization/tenant identifier */\r\n  orgId?: string;\r\n  /** User roles */\r\n  roles?: string[];\r\n  /** Custom claims/attributes */\r\n  claims?: Record<string, unknown>;\r\n}\r\n\r\n/**\r\n * Access rule for a node\r\n */\r\nexport interface NodeAccessRule {\r\n  /** Roles that can access this node (empty = all roles) */\r\n  roles?: string[];\r\n  /** Specific actions allowed (empty = all actions) */\r\n  actions?: (\"explore\" | \"navigate\" | \"query\")[];\r\n  /** Custom access check function */\r\n  check?: (ctx: SecurityContext) => boolean | Promise<boolean>;\r\n}\r\n\r\n/**\r\n * Row-level security function\r\n * Returns filters to apply to queries on this node\r\n */\r\nexport type RLSFunction = (\r\n  ctx: SecurityContext,\r\n) => QueryFilters | Promise<QueryFilters>;\r\n\r\n/**\r\n * Introspection access mode\r\n */\r\nexport type IntrospectionMode =\r\n  | \"public\"\r\n  | \"authenticated\"\r\n  | \"disabled\"\r\n  | ((ctx: SecurityContext) => boolean);\r\n\r\n/**\r\n * Security configuration\r\n */\r\nexport interface SecurityConfig {\r\n  /**\r\n   * Context provider function\r\n   * Called before each operation to get current security context\r\n   */\r\n  context?: () => SecurityContext | Promise<SecurityContext>;\r\n\r\n  /**\r\n   * Node-level access rules\r\n   * Key is node name or '*' for default\r\n   */\r\n  nodeAccess?: Record<string, NodeAccessRule>;\r\n\r\n  /**\r\n   * Row-level security rules\r\n   * Key is node name or '*' for default\r\n   * Returns additional filters to apply to all queries\r\n   */\r\n  rowLevelSecurity?: Record<string, RLSFunction>;\r\n\r\n  /**\r\n   * Schema introspection access\r\n   * - 'public': anyone can introspect\r\n   * - 'authenticated': requires context.userId\r\n   * - 'disabled': introspection throws error\r\n   * - function: custom check\r\n   */\r\n  introspection?: IntrospectionMode;\r\n\r\n  /**\r\n   * Fields to hide from schema introspection\r\n   * Supports wildcards: ['password', '*Token', 'secret*']\r\n   */\r\n  hiddenFields?: string[];\r\n\r\n  /**\r\n   * Nodes to hide from exploration\r\n   * Still accessible if you know the name (use nodeAccess to fully block)\r\n   */\r\n  hiddenNodes?: string[];\r\n}\r\n\r\n/**\r\n * Security manager\r\n */\r\nexport class SecurityManager {\r\n  private config: SecurityConfig;\r\n  private defaultContext: SecurityContext = {};\r\n\r\n  constructor(config?: SecurityConfig) {\r\n    this.config = config || {};\r\n  }\r\n\r\n  /**\r\n   * Check if security is enabled\r\n   */\r\n  isEnabled(): boolean {\r\n    return !!(\r\n      this.config.context ||\r\n      this.config.nodeAccess ||\r\n      this.config.rowLevelSecurity ||\r\n      this.config.introspection\r\n    );\r\n  }\r\n\r\n  /**\r\n   * Get current security context\r\n   */\r\n  async getContext(): Promise<SecurityContext> {\r\n    if (!this.config.context) {\r\n      return this.defaultContext;\r\n    }\r\n\r\n    try {\r\n      return await this.config.context();\r\n    } catch (error) {\r\n      throw new GQPError(\r\n        \"AUTHORIZATION_ERROR\",\r\n        \"Failed to resolve security context\",\r\n        { error: error instanceof Error ? error.message : error },\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check if current context can access a node\r\n   */\r\n  async checkNodeAccess(\r\n    node: string,\r\n    action: \"explore\" | \"navigate\" | \"query\",\r\n    ctx?: SecurityContext,\r\n  ): Promise<void> {\r\n    const context = ctx || (await this.getContext());\r\n\r\n    // Check specific node rule first, then default rule\r\n    const rule =\r\n      this.config.nodeAccess?.[node] || this.config.nodeAccess?.[\"*\"];\r\n\r\n    if (!rule) {\r\n      return;\r\n    }\r\n\r\n    // Check roles\r\n    if (rule.roles && rule.roles.length > 0) {\r\n      const userRoles = context.roles || [];\r\n      const hasRole = rule.roles.some((role) => userRoles.includes(role));\r\n      if (!hasRole) {\r\n        throw createError.accessDenied(node, action);\r\n      }\r\n    }\r\n\r\n    // Check allowed actions\r\n    if (rule.actions && rule.actions.length > 0) {\r\n      if (!rule.actions.includes(action)) {\r\n        throw createError.accessDenied(node, action);\r\n      }\r\n    }\r\n\r\n    // Custom check\r\n    if (rule.check) {\r\n      const allowed = await rule.check(context);\r\n      if (!allowed) {\r\n        throw createError.accessDenied(node, action);\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get row-level security filters for a node\r\n   */\r\n  async getRLSFilters(\r\n    node: string,\r\n    ctx?: SecurityContext,\r\n  ): Promise<QueryFilters> {\r\n    const context = ctx || (await this.getContext());\r\n\r\n    // Get specific node RLS or default\r\n    const rlsFn =\r\n      this.config.rowLevelSecurity?.[node] ||\r\n      this.config.rowLevelSecurity?.[\"*\"];\r\n\r\n    if (!rlsFn) {\r\n      return {};\r\n    }\r\n\r\n    try {\r\n      return await rlsFn(context);\r\n    } catch (error) {\r\n      throw new GQPError(\r\n        \"AUTHORIZATION_ERROR\",\r\n        `Failed to compute row-level security for ${node}`,\r\n        { error: error instanceof Error ? error.message : error },\r\n      );\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Apply RLS filters to existing filters\r\n   */\r\n  async applyRLS(\r\n    node: string,\r\n    filters: QueryFilters,\r\n    ctx?: SecurityContext,\r\n  ): Promise<QueryFilters> {\r\n    const rlsFilters = await this.getRLSFilters(node, ctx);\r\n\r\n    if (Object.keys(rlsFilters).length === 0) {\r\n      return filters;\r\n    }\r\n\r\n    if (Object.keys(filters).length === 0) {\r\n      return rlsFilters;\r\n    }\r\n\r\n    return {\r\n      AND: [filters, rlsFilters],\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Check introspection access\r\n   */\r\n  async checkIntrospectionAccess(ctx?: SecurityContext): Promise<void> {\r\n    const mode = this.config.introspection || \"public\";\r\n\r\n    if (mode === \"public\") {\r\n      return;\r\n    }\r\n\r\n    const context = ctx || (await this.getContext());\r\n\r\n    if (mode === \"disabled\") {\r\n      throw createError.introspectionDisabled();\r\n    }\r\n\r\n    if (mode === \"authenticated\") {\r\n      if (!context.userId) {\r\n        throw new GQPError(\r\n          \"AUTHORIZATION_ERROR\",\r\n          \"Authentication required for schema introspection\",\r\n          undefined,\r\n          401,\r\n        );\r\n      }\r\n      return;\r\n    }\r\n\r\n    if (typeof mode === \"function\") {\r\n      const allowed = mode(context);\r\n      if (!allowed) {\r\n        throw createError.introspectionDisabled();\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Check if a field should be hidden from introspection\r\n   */\r\n  isFieldHidden(fieldName: string): boolean {\r\n    const patterns = this.config.hiddenFields || [];\r\n\r\n    for (const pattern of patterns) {\r\n      if (this.matchPattern(fieldName, pattern)) {\r\n        return true;\r\n      }\r\n    }\r\n\r\n    return false;\r\n  }\r\n\r\n  /**\r\n   * Check if a node should be hidden from exploration\r\n   */\r\n  isNodeHidden(nodeName: string): boolean {\r\n    const hiddenNodes = this.config.hiddenNodes || [];\r\n    return hiddenNodes.includes(nodeName);\r\n  }\r\n\r\n  /**\r\n   * Filter hidden fields from a node\r\n   */\r\n  filterHiddenFields(node: GQPNode): GQPNode {\r\n    if (!this.config.hiddenFields?.length) {\r\n      return node;\r\n    }\r\n\r\n    return {\r\n      ...node,\r\n      fields: node.fields.filter((field) => !this.isFieldHidden(field.name)),\r\n    };\r\n  }\r\n\r\n  /**\r\n   * Match a field name against a pattern (supports * wildcard)\r\n   */\r\n  private matchPattern(name: string, pattern: string): boolean {\r\n    if (pattern === name) {\r\n      return true;\r\n    }\r\n\r\n    if (!pattern.includes(\"*\")) {\r\n      return false;\r\n    }\r\n\r\n    const regex = new RegExp(\r\n      \"^\" +\r\n        pattern\r\n          .split(\"*\")\r\n          .map((s) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"))\r\n          .join(\".*\") +\r\n        \"$\",\r\n      \"i\",\r\n    );\r\n    return regex.test(name);\r\n  }\r\n\r\n  /**\r\n   * Get security config\r\n   */\r\n  getConfig(): SecurityConfig {\r\n    return { ...this.config };\r\n  }\r\n}\r\n\r\n/**\r\n * Create a security manager instance\r\n */\r\nexport function createSecurityManager(\r\n  config?: SecurityConfig,\r\n): SecurityManager {\r\n  return new SecurityManager(config);\r\n}\r\n\r\n/**\r\n * No-op security manager (for when security is disabled)\r\n */\r\nexport const noopSecurityManager = new SecurityManager();\r\n","/**\n * GQP Engine\n * The main GQP class - consolidates 50+ tools into ONE dynamic navigable tool\n */\n\nimport type {\n  GQPConfig,\n  GQPAdapter,\n  GQPPlugin,\n  GQPEngine as IGQPEngine,\n  ToolCallResult,\n  ExploreResult,\n  NavigateResult,\n  QueryResult,\n  IntrospectionResult,\n  QueryFilters,\n  QueryOptions,\n  GQPSchema as IGQPSchema,\n} from \"./types.js\";\nimport { GQPSchema } from \"./schema.js\";\nimport { GQPGraphCursor, CursorManager } from \"./cursor.js\";\nimport { QueryExecutor } from \"./executor.js\";\nimport { Validator, DEFAULT_LIMITS } from \"./validation.js\";\nimport { SecurityManager } from \"./security.js\";\nimport { createError, isGQPError, wrapError } from \"./errors.js\";\n\n/**\n * GQP - The Universal Agent Data Layer\n *\n * Transforms messy databases and APIs into an intelligent, traversable graph\n * optimized for LLM agents.\n *\n * @example\n * ```typescript\n * import { GQP } from '@mzhub/gqp';\n * import { fromPrisma } from '@mzhub/gqp/prisma';\n *\n * const graph = new GQP({\n *   sources: {\n *     database: fromPrisma(prisma)\n *   }\n * });\n *\n * // Agent calls this ONE tool instead of 50+ separate tools\n * const result = await graph.handleToolCall({\n *   action: 'explore'\n * });\n * ```\n */\nexport class GQP implements IGQPEngine {\n  private schema: GQPSchema;\n  private adapters: Map<string, GQPAdapter>;\n  private plugins: GQPPlugin[];\n  private cursorManager: CursorManager;\n  private executor: QueryExecutor;\n  private validator: Validator;\n  private security: SecurityManager;\n  private config: GQPConfig;\n  private initialized = false;\n  private schemaRefreshTimer?: ReturnType<typeof setInterval>;\n\n  constructor(config: GQPConfig) {\n    this.config = config;\n    this.schema = new GQPSchema();\n    this.adapters = new Map();\n    this.plugins = config.plugins || [];\n\n    const limits = { ...DEFAULT_LIMITS, ...config.limits };\n\n    this.validator = new Validator(config.validation, config.limits);\n    this.security = new SecurityManager({\n      ...config.security,\n      hiddenFields:\n        config.schema?.hiddenFields || config.security?.hiddenFields,\n      hiddenNodes: config.schema?.hiddenNodes || config.security?.hiddenNodes,\n    });\n\n    this.cursorManager = new CursorManager(\n      this.schema,\n      limits.maxCursors,\n      limits.cursorTTL,\n      limits.maxCursorPathLength,\n    );\n\n    this.executor = new QueryExecutor(\n      this.schema,\n      this.adapters,\n      this.plugins,\n      {\n        defaultLimit: limits.defaultLimit,\n        maxLimit: limits.maxLimit,\n        timeout: limits.timeout,\n        maxIncludeDepth: limits.maxIncludeDepth,\n      },\n    );\n\n    for (const [name, adapter] of Object.entries(config.sources)) {\n      this.adapters.set(name, adapter);\n    }\n  }\n\n  /**\n   * Initialize the engine - introspects all sources and builds schema\n   */\n  async initialize(): Promise<void> {\n    if (this.initialized) return;\n\n    for (const [_name, adapter] of this.adapters.entries()) {\n      const nodes = await adapter.introspect();\n      for (const node of nodes) {\n        this.schema.addNode(node, true);\n      }\n    }\n\n    for (const plugin of this.plugins) {\n      if (plugin.onInit) {\n        await plugin.onInit(this);\n      }\n    }\n\n    if (\n      this.config.schema?.refreshInterval &&\n      this.config.schema.refreshInterval > 0\n    ) {\n      this.schemaRefreshTimer = setInterval(\n        () => this.refreshSchema(),\n        this.config.schema.refreshInterval,\n      );\n    }\n\n    this.initialized = true;\n  }\n\n  /**\n   * Refresh the schema (useful for detecting database changes)\n   */\n  async refreshSchema(): Promise<void> {\n    this.schema.clear();\n\n    for (const [_name, adapter] of this.adapters.entries()) {\n      const nodes = await adapter.introspect();\n      for (const node of nodes) {\n        this.schema.addNode(node, true);\n      }\n    }\n  }\n\n  /**\n   * Cleanup and destroy the engine\n   */\n  async destroy(): Promise<void> {\n    if (this.schemaRefreshTimer) {\n      clearInterval(this.schemaRefreshTimer);\n    }\n\n    for (const plugin of this.plugins) {\n      if (plugin.onDestroy) {\n        await plugin.onDestroy();\n      }\n    }\n\n    this.cursorManager.clear();\n    this.initialized = false;\n  }\n\n  /**\n   * Ensure engine is initialized before operations\n   */\n  private async ensureInitialized(): Promise<void> {\n    if (!this.initialized) {\n      await this.initialize();\n    }\n  }\n\n  // ============================================================================\n  // Primary Tool Interface - THE ONE TOOL\n  // ============================================================================\n\n  /**\n   * Handle a tool call from an agent\n   * This is the SINGLE entry point that replaces 50+ individual tools\n   */\n  async handleToolCall(params: unknown): Promise<ToolCallResult> {\n    try {\n      await this.ensureInitialized();\n\n      const validated = this.validator.validateToolCallParams(params);\n      const ctx = this.security.isEnabled()\n        ? await this.security.getContext()\n        : undefined;\n\n      switch (validated.action) {\n        case \"explore\":\n          return this.explore();\n\n        case \"navigate\": {\n          const node = validated.node!;\n          await this.security.checkNodeAccess(node, \"navigate\", ctx);\n          return this.navigate(node, validated.cursorId);\n        }\n\n        case \"query\": {\n          const node = validated.node!;\n          await this.security.checkNodeAccess(node, \"query\", ctx);\n\n          let filters = validated.filters || {};\n          filters = await this.security.applyRLS(node, filters, ctx);\n\n          return this.query(\n            node,\n            validated.query,\n            filters,\n            validated.options,\n            validated.cursorId,\n          );\n        }\n\n        case \"introspect\":\n          await this.security.checkIntrospectionAccess(ctx);\n          return this.introspect();\n\n        default:\n          throw createError.invalidAction(\n            String((validated as { action: string }).action),\n          );\n      }\n    } catch (error) {\n      if (isGQPError(error)) {\n        throw error;\n      }\n      throw wrapError(error);\n    }\n  }\n\n  // ============================================================================\n  // Action Implementations\n  // ============================================================================\n\n  /**\n   * Explore - discover available data nodes\n   * This is the entry point for agents to understand what data is available\n   */\n  private explore(): ExploreResult {\n    let rootNodes = this.schema.getRootNodes();\n    const neighborhoodSize = this.config.features?.neighborhoodSize || 5;\n\n    rootNodes = rootNodes.filter(\n      (node) => !this.security.isNodeHidden(node.name),\n    );\n\n    return {\n      availableNodes: rootNodes.slice(0, neighborhoodSize).map((node) => ({\n        name: node.name,\n        description: node.description,\n        operations: this.getNodeOperations(node),\n      })),\n      message:\n        'Start by navigating to one of these nodes using action: \"navigate\"',\n      totalNodes: rootNodes.length,\n    };\n  }\n\n  /**\n   * Navigate - focus on a specific node to see its fields and relations\n   */\n  private navigate(nodeName: string, cursorId?: string): NavigateResult {\n    const schemaNode = this.schema.getNode(nodeName);\n    if (!schemaNode) {\n      const allNodes = this.schema.getAllNodes().map((n) => n.name);\n      const suggestions = this.findSimilar(nodeName, allNodes, 3);\n      throw createError.nodeNotFound(nodeName, suggestions);\n    }\n\n    const cursor = this.cursorManager.getOrCreate(cursorId);\n    const neighborhood = cursor.navigateTo(nodeName);\n\n    if (!neighborhood.currentNode) {\n      throw createError.nodeNotFound(nodeName);\n    }\n\n    const node = this.security.filterHiddenFields(neighborhood.currentNode);\n\n    return {\n      currentNode: node.name,\n      fields: node.fields.map((field) => ({\n        name: field.name,\n        type: field.type,\n        description: field.description,\n        capabilities: this.getFieldCapabilities(field),\n      })),\n      relatedNodes: node.edges.map((edge) => ({\n        name: edge.to,\n        relation: edge.relation,\n        description: edge.description,\n      })),\n      capabilities: node.capabilities,\n      path: neighborhood.path,\n    };\n  }\n\n  /**\n   * Query - execute filtered search on a node\n   */\n  private async query(\n    nodeName: string,\n    query?: string,\n    filters?: QueryFilters,\n    options?: QueryOptions,\n    cursorId?: string,\n  ): Promise<QueryResult> {\n    const schemaNode = this.schema.getNode(nodeName);\n    if (!schemaNode) {\n      const allNodes = this.schema.getAllNodes().map((n) => n.name);\n      const suggestions = this.findSimilar(nodeName, allNodes, 3);\n      throw createError.nodeNotFound(nodeName, suggestions);\n    }\n\n    if (cursorId) {\n      const cursor = this.cursorManager.get(cursorId);\n      if (cursor && cursor.getCurrentNode() !== nodeName) {\n        cursor.navigateTo(nodeName);\n      }\n    }\n\n    if (query) {\n      return this.executor.executeWithSearch(\n        nodeName,\n        query,\n        filters || {},\n        options || {},\n      );\n    }\n\n    return this.executor.execute(nodeName, filters || {}, options || {});\n  }\n\n  /**\n   * Introspect - get full schema information\n   */\n  private introspect(): IntrospectionResult {\n    let nodes = this.schema.getAllNodes();\n\n    nodes = nodes\n      .filter((node) => !this.security.isNodeHidden(node.name))\n      .map((node) => this.security.filterHiddenFields(node));\n\n    return {\n      nodes,\n      capabilities: this.schema.getAllCapabilities(),\n      version: \"1.0.0\",\n    };\n  }\n\n  // ============================================================================\n  // Helper Methods\n  // ============================================================================\n\n  /**\n   * Find similar strings (for \"did you mean\" suggestions)\n   */\n  private findSimilar(\n    input: string,\n    candidates: string[],\n    max: number,\n  ): string[] {\n    const lower = input.toLowerCase();\n    return candidates\n      .map((c) => ({ name: c, score: this.similarity(lower, c.toLowerCase()) }))\n      .filter((x) => x.score > 0.3)\n      .sort((a, b) => b.score - a.score)\n      .slice(0, max)\n      .map((x) => x.name);\n  }\n\n  /**\n   * Simple string similarity (Dice coefficient)\n   */\n  private similarity(a: string, b: string): number {\n    if (a === b) return 1;\n    if (a.length < 2 || b.length < 2) return 0;\n\n    const bigrams = new Map<string, number>();\n    for (let i = 0; i < a.length - 1; i++) {\n      const bigram = a.substring(i, i + 2);\n      bigrams.set(bigram, (bigrams.get(bigram) || 0) + 1);\n    }\n\n    let matches = 0;\n    for (let i = 0; i < b.length - 1; i++) {\n      const bigram = b.substring(i, i + 2);\n      const count = bigrams.get(bigram) || 0;\n      if (count > 0) {\n        matches++;\n        bigrams.set(bigram, count - 1);\n      }\n    }\n\n    return (2 * matches) / (a.length + b.length - 2);\n  }\n\n  /**\n   * Get available operations for a node\n   */\n  private getNodeOperations(node: { capabilities: string[] }): string[] {\n    const ops = [\"query\", \"filter\", \"get_by_id\"];\n\n    if (node.capabilities.includes(\"fuzzy_search\")) {\n      ops.push(\"semantic_search\");\n    }\n    if (node.capabilities.includes(\"temporal_filter\")) {\n      ops.push(\"date_filter\");\n    }\n\n    return ops;\n  }\n\n  /**\n   * Get capabilities for a field\n   */\n  private getFieldCapabilities(field: {\n    type: string;\n    directives: Array<{ name: string }>;\n  }): string[] {\n    const caps: string[] = [];\n\n    for (const directive of field.directives) {\n      if (directive.name === \"@search\") {\n        caps.push(\"searchable\");\n      }\n      if (directive.name === \"@reasoning\") {\n        caps.push(\"temporal\");\n      }\n    }\n\n    return caps;\n  }\n\n  // ============================================================================\n  // Engine Interface Implementation\n  // ============================================================================\n\n  getSchema(): IGQPSchema {\n    return this.schema;\n  }\n\n  getAdapter(name: string): GQPAdapter | undefined {\n    return this.adapters.get(name);\n  }\n\n  getPlugins(): GQPPlugin[] {\n    return this.plugins;\n  }\n\n  // ============================================================================\n  // Utility Methods\n  // ============================================================================\n\n  /**\n   * Create a new cursor\n   */\n  createCursor(startNode?: string): GQPGraphCursor {\n    return this.cursorManager.create(startNode);\n  }\n\n  /**\n   * Get cursor by ID\n   */\n  getCursor(id: string): GQPGraphCursor | undefined {\n    return this.cursorManager.get(id);\n  }\n\n  /**\n   * Get validator for external use\n   */\n  getValidator(): Validator {\n    return this.validator;\n  }\n\n  /**\n   * Get security manager for external use\n   */\n  getSecurityManager(): SecurityManager {\n    return this.security;\n  }\n\n  /**\n   * Generate tool definition for MCP/OpenAI/LangChain\n   * This is the single tool that replaces 50+ tools\n   */\n  getToolDefinition(): {\n    name: string;\n    description: string;\n    inputSchema: object;\n  } {\n    const limits = this.validator.getLimits();\n\n    return {\n      name: \"navigate_data_graph\",\n      description: `Navigate and query data using a graph interface.\n\nActions:\n- explore: Discover available data nodes\n- navigate: Focus on a specific node to see its fields and relations\n- query: Search and filter data within a node\n- introspect: Get full schema information\n\nStart with 'explore' to see what data is available, then 'navigate' to a node, then 'query' to get data.`,\n      inputSchema: {\n        type: \"object\",\n        properties: {\n          action: {\n            type: \"string\",\n            enum: [\"explore\", \"navigate\", \"query\", \"introspect\"],\n            description: \"The action to perform\",\n          },\n          node: {\n            type: \"string\",\n            description: \"Node name (required for navigate/query)\",\n          },\n          query: {\n            type: \"string\",\n            description: \"Semantic search query (optional for query)\",\n          },\n          filters: {\n            type: \"object\",\n            description: 'Field filters (e.g., { \"status\": \"pending\" })',\n            additionalProperties: true,\n          },\n          options: {\n            type: \"object\",\n            properties: {\n              limit: {\n                type: \"number\",\n                description: `Max results (1-${limits.maxLimit})`,\n                default: limits.defaultLimit,\n                maximum: limits.maxLimit,\n              },\n              offset: {\n                type: \"number\",\n                description: \"Skip results\",\n                default: 0,\n                maximum: limits.maxOffset,\n              },\n              include: {\n                type: \"array\",\n                items: { type: \"string\" },\n                description: \"Related nodes to include\",\n              },\n            },\n          },\n          cursorId: {\n            type: \"string\",\n            description: \"Cursor ID for session continuity\",\n          },\n        },\n        required: [\"action\"],\n      },\n    };\n  }\n}\n"]}