Documentation Index
Fetch the complete documentation index at: https://docs.getcore.me/llms.txt
Use this file to discover all available pages before exploring further.
How classification works
The CORE search router (apps/webapp/app/services/search-v2/router.ts) classifies every incoming query into one of 6 query types and dispatches it to a dedicated handler. Classification uses vector search on the LABEL namespace to find matched labels, plus LLM aspect extraction to identify aspect intent. The router also returns shouldSearch: boolean to skip search entirely when appropriate. See how-core-searches for the full pipeline.
The 6 query types
aspect_query
Trigger: the user wants facts of a specific aspect type (preferences, decisions, directives, goals, and similar). Example queries:- “What are my coding preferences?”
- “Show my decisions about auth”
- “What directives have I set for code review?”
aspects: string[] with the matched aspect enum values. Handler handleAspectQuery runs graph traversal scoped by matched labels and aspects, plus entity-hint resolution and vector fallback. Returns statements grouped by aspect.
entity_lookup
Trigger: the user wants information about a specific named entity. Router setslookupMode to one of two values:
attribute: the query asks for a specific field of the entity. Router setsattributeHint(for example"phone","email","team"). Examples: “What is John’s phone number?”, “Sarah’s email?”. Handler returns the entity node with that attribute.broad: the query asks generally about the entity. Examples: “Who is Sarah?”, “Tell me about X”, “anything about airbnb email”. Handler returns episodes where the entity appears.
- “What is John’s phone number?” (
attribute,attributeHint: "phone") - “Who is Sarah?” (
broad) - “Anything about the airbnb email?” (
broad)
ENTITY namespace before traversal.
temporal
Trigger: the query is bounded by time. Example queries:- “What happened last week?”
- “What did we decide yesterday?”
- “Show my work from January”
temporal: { type: "recent" | "range" | "before" | "after" | "all", days, startDate, endDate }. Handler handleTemporal runs label-plus-time graph traversal, the entity-hint path, and vector fallback in parallel. Returns episodes within the time bound.
temporal_facets
Trigger: the user wants aggregates over a time range, not specific episodes. Example queries:- “What topics did I speak about last week?”
- “Who are the people I spoke about this month?”
- “What decisions and goals came up last month?”
facets: ("topics" | "entities" | "aspects")[] along with the temporal bounds. Handler returns counts grouped by facet, not episodes.
exploratory
Trigger: broad topic queries with no specific entity, aspect, or time anchor. Example queries:- “Search implementation in CORE”
- “Authentication architecture”
- “Catch me up on recent work”
relationship
Trigger: a connection between 2 or more entities. Requires at least 2 entity hints. Example queries:- “How do I know Sarah?”
- “How is the payment service related to Stripe?”
- “What is the connection between TypeScript and CORE?”
ENTITY namespace, then performs graph traversal for statements connecting them. Returns the connecting statements.
When no search runs
The router can decideshouldSearch: false for greetings or unrelated chat (for example “Hello!” or “What’s the weather?”). When this happens, the search pipeline short-circuits and returns empty without dispatching to any handler.
Related
how-core-searches: the full search pipeline that wraps this router.aspects: the aspect enum values used byaspect_queryandtemporal_facets.entity_types: the entity kinds resolved duringentity_lookupandrelationship.labels: theLABELnamespace used during classification.
