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
fix(spec): keep `lazySchema` proxies identity-compatible with `z.toJSONSchema` (objectui#2561)
6
+
7
+
zod's `toJSONSchema` keys its `seen` map on the node object it traverses — the `lazySchema` Proxy wherever a schema is referenced lazily (`z.lazy(() => X)` recursion getters, direct conversion roots) — while its wrapper-type processors (pipe/lazy/optional/default/…) look themselves up via the REAL instance captured at construction (`inst._zod.processJSONSchema = (ctx, …) => pipeProcessor(inst, …)`). The identity mismatch crashed conversion with `Cannot set properties of undefined (setting 'ref')`.
8
+
9
+
This stayed latent while lazy-referenced schemas were plain objects (the object processor never looks itself up); ADR-0089 D3a turned `PageComponentSchema` / `FormFieldSchema` into `.strict().transform(…)`**pipes**, which broke ObjectUI Studio's spec-derived Page/View inspector JSONSchema derivation under spec 15.
10
+
11
+
Fix: the proxy now serves a memoised `_zod` facade that prototype-delegates to the real internals and wraps only `processJSONSchema` to alias the proxy's `seen` entry onto the real instance before delegating. Parse behavior is unchanged; `OS_EAGER_SCHEMAS=1` remains the bypass. Regression tests cover the D3a pipe shape, recursion through `z.lazy(() => proxy)`, mixed proxy+real traversal, and the full `PageSchema` / `ViewSchema` Studio derivation paths.
Copy file name to clipboardExpand all lines: content/docs/deployment/environment-variables.mdx
+20Lines changed: 20 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -235,6 +235,26 @@ OS_MCP_SERVER_ENABLED=true os start # additionally auto-start the stdio tran
235
235
236
236
---
237
237
238
+
## Search
239
+
240
+
Pinyin recall for `$search` (ADR-0097): with the switch on, every object's
241
+
display/name field gets a hidden, platform-maintained companion column storing
242
+
full pinyin + initials ("张伟" → "zhangwei zw"), so lookup pickers, list
243
+
quick-search and ⌘K match `zhangwei` / `zw` against CJK names — transparently,
244
+
with no client or object changes.
245
+
246
+
```bash
247
+
os start # auto-on when the stack's i18n config lists any zh-* locale
248
+
OS_SEARCH_PINYIN_ENABLED=true os start # force on regardless of locales
249
+
OS_SEARCH_PINYIN_ENABLED=false os start # force off (e.g. a zh-locale stack that doesn't want the extra column)
250
+
```
251
+
252
+
| Variable | Type | Default | Description |
253
+
|:---|:---|:---|:---|
254
+
|`OS_SEARCH_PINYIN_ENABLED`| boolean | locale-derived | Pinyin search recall. When unset, the default derives from the stack's configured locales (`i18n.defaultLocale` / `supportedLocales` / `fallbackLocale`): any `zh-*` locale turns it on; an explicit value always wins. Gates both the compile-time `__search` companion column and the `plugin-pinyin-search` populate hooks, so there is no half-state. Off ⇒ no extra column, and `pinyin-pro` is never loaded. |
|**buttons**|`Object`| optional |[EXPERIMENTAL — NOT ENFORCED, #2998] Form action-button visibility & labels. Renderer wiring pending in ObjectUI (objectui#2545). |
191
+
|**defaults**|`Record<string, any>`| optional |[EXPERIMENTAL — NOT ENFORCED, #2998] Initial field values for create-mode forms (spec home for ObjectUI `initialValues`). Renderer wiring pending (objectui#2545). |
178
192
|**aria**|`Object`| optional | ARIA accessibility attributes for the form view |
Copy file name to clipboardExpand all lines: docs/adr/0093-tenancy-mode-and-membership-lifecycle.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# ADR-0093: Tenancy mode as a first-class capability, and a single owner for the user→membership lifecycle
2
2
3
-
-**Status:**Proposed (implementation in progress)
3
+
-**Status:**Accepted (2026-07-13) — implemented: `tenancy` kernel service (`plugin-auth/src/tenancy-service.ts`), membership reconciler (`reconcile-membership.ts`), locked by `dogfood/test/membership-reconciler.dogfood.test.ts`
4
4
-**Date:** 2026-07-13
5
5
-**Deciders:** ObjectStack Protocol Architects
6
6
-**Implementation:**#2882 (Phase 0 — tactical create-user bind, merged) → this PR (Phases 1–3 — `tenancy` service, fail-fast boot guard, membership reconciler, consumer migration, backfill, docs). One revision from the original plan, ratified in D2: the endpoint-level create-user bind **delegates to the shared reconciler** (one implementation, two call sites) instead of being deleted. Runtime verification confirmed the hook fires for `admin.createUser`, but better-auth *defers*`user.create.after` post-commit (#1881), so the endpoint keeps its delegated call to report `organizationId` / `membershipCreated` deterministically in its response. Cloud-host semantics (personal-org hook precedence, multi-org non-binding, D5 blast radius) verified against `objectstack-ai/cloud` — see D2/D3/D5.
0 commit comments