import { GraphCatalogService } from "../services/graph.catalog.service"; import { EntityServiceRegistry } from "../../../common/registries/entity.service.registry"; import { CatalogEntity } from "../interfaces/graph.catalog.interface"; export interface UserContext { companyId: string; userId: string; userModuleIds: string[]; /** Id of the scope-root node the whole run is confined to. Absent = unscoped. */ scopeId?: string; /** JSON:API type of the scope root, e.g. "campaigns". Present iff scopeId is. */ scopeType?: string; /** * Neo4j label of the scope root, e.g. "Campaign". Carried alongside * `scopeType` (the catalog resolves both at build time) so cost attribution * does not have to re-derive it through the model registry. */ scopeLabel?: string; } export interface ToolCallRecord { tool: string; input: Record; durationMs: number; error?: string; /** When set, the tool result included one or more bridge fanouts. */ materialised?: Array<{ relName: string; count: number; }>; } export declare class ToolFactory { private readonly catalog; private readonly registry; private readonly logger; constructor(catalog: GraphCatalogService, registry: EntityServiceRegistry); resolveEntity(type: string, ctx: UserContext): CatalogEntity | { error: string; suggestion?: string; }; private findClosest; resolveService(type: string): import("../../..").AbstractService; capture(record: { tool: string; input: Record; }, fn: () => Promise, recorder: ToolCallRecord[]): Promise; } //# sourceMappingURL=tool.factory.d.ts.map