Intent-routed planner
emem_intentResolve places, summarize locations, compare cells, detect changes, find similar cells, verify claims, or ask questions with one typed intent that executes the plan and returns the answer immediately.
Instructions
Say what you want in one typed object and get the answer, without choosing a primitive. type is a tagged union: it selects the intent AND decides which other fields are read, so send only the fields its row needs. The plan is EXECUTED in the same call, so you receive the result (the resolved cell64, the similarity, the delta, the verdict), not a list of calls to make yourself.
type | needs | optional | answers where_is | description | | cell64 for a named place what_is_here | cell OR place | description | what is attested at a location is_like | a, b | | cosine similarity of two cells did_change | cell, band, window | | delta for one band over [start,end] tslots find_like | key | k, filter | nearest cells by embedding confirm | claim, cell | | verdict plus the signed facts behind it ask | description | place/cell/lat+lng | free-text question, packaged answer
An unknown or missing type returns a structured needs_intent_type envelope naming the seven values rather than a hard error, so you can correct it on the next turn.
When to use: Call when the user's question maps cleanly onto one of the seven rows above and you would rather state the goal than pick a primitive. Reach past it for anything else: a specific band at a cell is emem_recall, a region is emem_recall_polygon, and a free-text place question with no obvious primitive is emem_ask directly (type:"ask" here just forwards to it). window takes tslots, not dates: get valid ones from emem_trajectory first. A tool this router names but tools/list does not show is NOT a dead end: every one of the 107 dispatches by name at /mcp and /mcp/full, so call emem_trajectory or emem_recall_polygon directly. The core list is 16 to keep the per-request catalog small, not to fence the rest off; emem_tools enumerates them.
Example arguments: {"type":"did_change","cell":"damO.zb000.xUti.zde78","band":"indices.ndvi","window":[20245,20620]}
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| a | No | is_like only: cell64 of the first place in the pair. | |
| b | No | is_like only: cell64 of the second place. The answer is a cosine similarity in [-1,1] over the two cells' embeddings. | |
| k | No | find_like only: how many neighbours to return. Defaults to the primitive's own default when omitted. | |
| key | No | find_like only: cell64 to search from. Neighbours are ranked by embedding cosine against this cell. | |
| lat | No | ask only: latitude, paired with `lng`, when you want to pin the location by coordinate rather than by name or cell64. | |
| lng | No | ask only: longitude, paired with `lat`. | |
| band | No | did_change only: which band to test, e.g. "indices.ndvi". One band per call; the answer is a delta over `window`, not a whole-cell diff. | |
| cell | No | cell64 address, e.g. "damO.zb000.xUti.zde78". Required by did_change and confirm. Optional for what_is_here and ask: supply it to skip geocoding, omit it and give `place` instead. | |
| type | Yes | Which question you are asking, and therefore which other fields apply. where_is: name a place, get its cell64 (needs `description`). what_is_here: summarise a location (needs `cell`, OR `place`/`description` to resolve it first). is_like: pairwise similarity (needs `a` and `b`). did_change: did one band move over a time window (needs `cell`, `band`, `window`). find_like: nearest neighbours to a known cell (needs `key`; optional `k`, `filter`). confirm: is a claim true at a cell (needs `claim` and `cell`). ask: free-text question about a place, runs locate + topic-route + recall server-side (needs `description`; optional `place`/`cell`/`lat`+`lng` to pin the location). | |
| claim | No | confirm only: the claim to test at `cell`, e.g. {"band":"indices.ndvi","op":"gt","value":0.4}. The answer is a verdict plus the signed facts it rests on. | |
| place | No | Free-text place name for what_is_here and ask when you have a name but no cell64, e.g. "Ashok Nagar, Ranchi". The responder geocodes it. Ignored when `cell` is present. | |
| filter | No | find_like only: optional claim constraining which cells may be returned. Same object as `claim` below, same ops, same required fields. | |
| window | No | did_change only: exactly two tslots, [start, end], band-tempo-relative integers from the emem epoch (NOT unix seconds or a date string). Get valid tslots for a cell from emem_trajectory. | |
| description | No | where_is: the place to resolve, e.g. "Mount Everest". ask: the user's question, forwarded verbatim. what_is_here: optional free text used as the question and, if `place` is absent, as the place. Ignored by the other intents. |