You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
"search": { "enabled": false, "status": "unavailable", "message": "No implementation ships for the 'search' slot — register a service under it to enable" },
57
55
"ai": { "enabled": false, "status": "unavailable", "message": "Provided by @objectstack/service-ai in ObjectStack Cloud/Enterprise — no implementation ships in the open framework" }
"search": { "enabled": false, "status": "unavailable", "handlerReady": false, "message": "No implementation ships for the 'search' slot — register a service under it to enable" }
136
+
},
137
+
"locale": {
138
+
"default": "en-US",
139
+
"supported": ["en-US", "zh-CN"],
140
+
"timezone": "UTC"
141
+
}
63
142
}
64
143
}
65
144
```
66
145
146
+
`name` and `version` are the dispatcher's own build identity, not your app's name — they
147
+
are fixed strings, so do not display them as the deployment's title. `environment` is the
148
+
process `NODE_ENV`. `locale` is derived from the registered i18n service (`getDefaultLocale()`
149
+
/ `getLocales()`); with no i18n service it degrades to `{"default": "en", "supported":
150
+
["en"], "timezone": "UTC"}`. The body also repeats `routes` under an `endpoints` key as a
151
+
backward-compatibility alias, and carries **no**`capabilities` map — that one exists only
152
+
on the REST-served response above.
153
+
154
+
<Callouttype="warn">
155
+
**"Both paths return the same document" holds only in a REST-less composition.** There, the
156
+
dispatcher owns `/api/v1/discovery` as the fallback registrant, so that path and
157
+
`/.well-known/objectstack` both answer with the dispatcher payload above (the bare
158
+
`/api/v1` is registered by `@objectstack/rest` alone and is not served at all). As soon as
159
+
`@objectstack/rest` is mounted it takes `/api/v1/discovery` under the single-owner rule
160
+
(ADR-0076 D11) and the two paths answer different shapes. Never write a client that reads
161
+
`locale` or `environment` off `/api/v1/discovery`.
162
+
</Callout>
163
+
67
164
**Why discovery matters:**
68
165
-**Environment agnostic:** Works across dev, staging, production without hardcoding URLs
69
166
-**Version tolerance:** API routes can change without breaking clients
0 commit comments