Intent-routed planner
emem_intentState what you want in one typed object and get the answer. You do not choose a primitive. type selects the intent AND the other fields that the tool reads. Send only the fields in its row. The plan runs in the same call: you get results, not a list of calls.
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 and the signed facts behind it ask | description | place/cell/lat+lng | free-text question, packaged answer area_over_time | geometry, bbox OR areas; start_date, end_date | index, max_scenes | index of an area for each overpass, with spread and anomaly
An unknown or missing type returns a needs_intent_type envelope with the valid values. It is not a hard error.
When to use: Call this when the question matches one of the eight rows and you prefer to state the goal. Otherwise call the primitive. A band at a cell is emem_recall. A region is emem_recall_polygon. A free-text question about a place is emem_ask (type:"ask" sends it there). window takes tslots, not dates: get them from emem_trajectory. areas puts up to 6 areas on one chart. You can call a tool that this text names but your list does not show, by name, through tools/call.
Example arguments: {"type":"did_change","cell":"defi.zb64a.cAzU.zfa27","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. | |
| key | No | find_like only: cell64 to search from, ranked by embedding cosine. | |
| 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. | |
| bbox | No | ||
| cell | No | cell64 address, e.g. "defi.zb64a.cAzU.zfa27". 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 intent; the table in the description gives each row's fields. | |
| areas | No | area_over_time: up to 6 {id,geometry|bbox} on one chart | |
| 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. | |
| index | No | ||
| 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. | |
| end_date | No | YYYY-MM-DD | |
| geometry | No | area_over_time: GeoJSON Polygon; or bbox {min_lat,min_lng,max_lat,max_lng}. | |
| max_scenes | No | ||
| start_date | No | YYYY-MM-DD | |
| 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. |