{
  "format": "lachesis-explorer-bundle",
  "schema_version": "2.0",
  "meta": {
    "repository": "demo/atlas-commerce",
    "language": "typescript",
    "revision": "main",
    "description": "Request and value paths through the search flow.",
    "lines": 28416,
    "indexed_nodes": 20,
    "fixture": true
  },
  "graph": {
    "capabilities": ["calls", "imports", "data-flow", "source-snippets"],
    "coverage": {
      "scope": "repository",
      "included_nodes": 8,
      "indexed_nodes": 20,
      "limitations": ["Generated files are omitted from this working projection."]
    },
    "files": [
      {"id": "file.search", "path": "src/routes/search.ts", "module": "search", "language": "typescript", "lines": 142},
      {"id": "file.service", "path": "src/search/search-service.ts", "module": "search", "language": "typescript", "lines": 188},
      {"id": "file.query", "path": "src/search/query.ts", "module": "search", "language": "typescript", "lines": 76}
    ],
    "modules": [
      {"id": "module.search", "name": "Search", "path": "src/search", "node_ids": ["route.search", "parse.query", "normalize.query", "search.service", "search.query"]}
    ],
    "nodes": [
      {"id": "route.search", "kind": "route", "file": "src/routes/search.ts", "line": 24, "label": "POST /api/search", "qualified_name": "routes.search.post", "module": "search", "scope": {"repository": "atlas-commerce", "service": "web-api", "package": "search", "label": "Web API"}, "signature": "async function post(request)", "snippet": "export async function POST(request: Request)"},
      {"id": "parse.query", "kind": "function", "file": "src/routes/search.ts", "line": 31, "label": "parseSearchRequest", "qualified_name": "routes.search.parseSearchRequest", "module": "search", "scope": {"repository": "atlas-commerce", "service": "web-api", "package": "search", "label": "Web API"}, "signature": "parseSearchRequest(request)", "snippet": "const input = await parseSearchRequest(request)"},
      {"id": "normalize.query", "kind": "function", "file": "src/search/query.ts", "line": 18, "label": "normalizeQuery", "qualified_name": "search.query.normalizeQuery", "module": "search", "scope": {"repository": "atlas-commerce", "service": "search-service", "package": "search", "label": "Search service"}, "signature": "normalizeQuery(input)", "snippet": "return normalizeQuery(input.query)"},
      {"id": "search.service", "kind": "method", "file": "src/search/search-service.ts", "line": 42, "label": "SearchService.find", "qualified_name": "SearchService.find", "module": "search", "scope": {"repository": "atlas-commerce", "service": "search-service", "package": "search", "label": "Search service"}, "signature": "find(query, options)", "snippet": "return this.searchService.find(query, options)"},
      {"id": "search.query", "kind": "query", "file": "src/search/search-service.ts", "line": 86, "label": "buildProductQuery", "qualified_name": "search.buildProductQuery", "module": "search", "scope": {"repository": "atlas-commerce", "service": "search-service", "package": "search", "label": "Search service"}, "signature": "buildProductQuery(query)", "snippet": "return products.where(buildProductQuery(query))"},
      {"id": "search.result", "kind": "function", "file": "src/routes/search.ts", "line": 45, "label": "toSearchResponse", "qualified_name": "routes.search.toSearchResponse", "module": "search", "signature": "toSearchResponse(rows)", "snippet": "return Response.json(toSearchResponse(rows))"},
      {"id": "catalog.client", "kind": "class", "file": "src/catalog/client.ts", "line": 12, "label": "CatalogClient", "qualified_name": "catalog.CatalogClient", "module": "catalog", "scope": {"repository": "atlas-catalog", "service": "catalog-service", "package": "catalog", "kind": "external", "label": "Catalog service · external repo"}, "snippet": "class CatalogClient {"},
      {"id": "db.products", "kind": "effect", "file": "src/catalog/client.ts", "line": 64, "label": "products.query", "qualified_name": "CatalogClient.products.query", "module": "catalog", "scope": {"repository": "atlas-catalog", "service": "catalog-service", "package": "catalog", "kind": "external", "label": "Catalog service · external repo"}, "snippet": "return db.products.query(statement)"}
    ],
    "edges": [
      {"id": "edge.route-parse", "source": "route.search", "target": "parse.query", "relation": "calls"},
      {"id": "edge.parse-normalize", "source": "parse.query", "target": "normalize.query", "relation": "calls"},
      {"id": "edge.normalize-service", "source": "normalize.query", "target": "search.service", "relation": "calls"},
      {"id": "edge.service-query", "source": "search.service", "target": "search.query", "relation": "calls", "confidence": "medium", "limitations": ["The query builder is represented as a bounded projection."]},
      {"id": "edge.service-catalog", "source": "search.service", "target": "catalog.client", "relation": "uses"},
      {"id": "edge.catalog-products", "source": "catalog.client", "target": "db.products", "relation": "queries"},
      {"id": "edge.service-result", "source": "search.service", "target": "search.result", "relation": "returns"}
    ],
    "entrypoints": [
      {"id": "entry.search", "label": "POST /api/search", "kind": "http", "node_id": "route.search", "file": "src/routes/search.ts"}
    ]
  },
  "paths": {
    "requests": [
      {"id": "request.search", "entry": "POST /api/search", "kind": "http", "description": "Follow the incoming search request from its route handler to the catalog query.", "entry_node": "route.search", "hops": [
        {"id": "request.search.hop.01", "node_id": "route.search", "edge_label": "calls", "caption": "receives request"},
        {"id": "request.search.hop.02", "node_id": "parse.query", "edge_label": "calls", "caption": "parses input"},
        {"id": "request.search.hop.03", "node_id": "normalize.query", "edge_label": "calls", "caption": "normalizes query"},
        {"id": "request.search.hop.04", "node_id": "search.service", "edge_label": "calls", "caption": "runs search"},
        {"id": "request.search.hop.05", "node_id": "db.products", "edge_label": "queries", "caption": "reads catalog"}
      ]}
    ],
    "values": [
      {"id": "value.search-query", "kind": "value-flow", "name": "search query", "description": "See how request input is normalized before it reaches the catalog query boundary.", "source_node": "parse.query", "sink_node": "db.products", "confidence": "medium", "limitations": ["The fixture shows a bounded value projection, not runtime values."], "steps": [
        {"id": "value.search-query.step.01", "node_id": "parse.query", "role": "source"},
        {"id": "value.search-query.step.02", "node_id": "normalize.query", "role": "transforms"},
        {"id": "value.search-query.step.03", "node_id": "search.query", "role": "used by"},
        {"id": "value.search-query.step.04", "node_id": "db.products", "role": "sink", "note": "reaches the catalog query boundary"}
      ]}
    ]
  },
  "security": {"findings": []}
}
