@objectstack/types 17.0.0-rc.0 → 17.0.0-rc.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,2813 @@
1
+ # @objectstack/types
2
+
3
+ ## 17.0.0-rc.2
4
+
5
+ ### Minor Changes
6
+
7
+ - b25a116: fix(verify): resolve the enterprise organizations package from the HOST APP (#4700)
8
+
9
+ `bootStack(app, { multiTenant: true })` — and therefore `objectstack verify
10
+ --multi-tenant` — could never load `@objectstack/organizations`. Node ESM
11
+ resolves a bare `import()` against the **importer's own realpath**, which for
12
+ `packages/verify` is inside the framework workspace, while the enterprise
13
+ package is cloud-private and only ever lives in the verified app's
14
+ `node_modules`. Every real host app fell into the catch and was told to
15
+ "Install/link it in this workspace" — about a package it had already installed.
16
+ Same defect class as cloud#1013, which fixed `objectstack serve`; #4699 fixed
17
+ that one call site and this issue tracked the two the sweep left behind.
18
+
19
+ **New: `@objectstack/types/node`.** The host-app resolver (`createHostRequire` /
20
+ `createHostImporter`) moved out of `packages/cli/src/utils/import-from-host.ts`
21
+ — where `@objectstack/verify` and the dogfood suite could not import it without
22
+ inverting the dependency direction — into a **node-only subpath export** of
23
+ `@objectstack/types`. One behaviour, one source; the CLI now consumes it and its
24
+ private copy is deleted.
25
+
26
+ It is a subpath and **not** the root export because `@objectstack/types` is a
27
+ dependency of `@objectstack/hono` ("edge-compatible REST API server for
28
+ Cloudflare Workers, Deno, Bun, and Node") and of the plugin layer a `LiteKernel`
29
+ boots on Workers. The root entry reaches zero `node:` builtins, and a Workers
30
+ bundle breaks on `node:module` even when nothing calls it. `tsup` emits the two
31
+ entries as separate self-contained bundles (`splitting: false`), and a test
32
+ walks the root's import graph and fails on the first reachable `node:`
33
+ specifier, so the isolation is enforced rather than merely intended. Same
34
+ arrangement `@objectstack/metadata` already ships for its `./node` subpath.
35
+
36
+ **New: `BootOptions.hostRoot`** (optional, defaults to `process.cwd()`) names
37
+ the app whose `node_modules` supplies those optional packages — for a harness
38
+ booting an app that is not the working directory.
39
+
40
+ **The dogfood multi-org gates had never run.** Two suites probed availability
41
+ with the same bare `import()` and so were **constant-false** — not "false
42
+ because absent" but false by construction, in every environment including the
43
+ cloud CI whose comment claimed it ran them. The #1994 cross-tenant RLS proof and
44
+ the attachments cross-tenant isolation block had therefore never executed while
45
+ the suite reported green (Prime Directive #10, test-suite edition). They now
46
+ resolve like the runtime does, and `OS_TEST_MULTI_ORG_ENABLED=1` declares that a
47
+ run is expected to ship the package — turning a silent skip into a loud failure,
48
+ so a run can no longer pass by quietly not running the gates it exists for.
49
+
50
+ ### Patch Changes
51
+
52
+ - Updated dependencies [430dcc2]
53
+ - Updated dependencies [e6ac4bd]
54
+ - Updated dependencies [80334c7]
55
+ - Updated dependencies [ce5242c]
56
+ - Updated dependencies [a7163ea]
57
+ - Updated dependencies [e6e9379]
58
+ - Updated dependencies [98877c9]
59
+ - Updated dependencies [98877c9]
60
+ - Updated dependencies [e6b1b69]
61
+ - Updated dependencies [ad047d2]
62
+ - Updated dependencies [2826d1e]
63
+ - Updated dependencies [5a84d41]
64
+ - Updated dependencies [20b1a9e]
65
+ - Updated dependencies [203a449]
66
+ - Updated dependencies [ac37fc6]
67
+ - Updated dependencies [4820f55]
68
+ - Updated dependencies [462d9c4]
69
+ - Updated dependencies [7d21581]
70
+ - Updated dependencies [f2445c9]
71
+ - Updated dependencies [23338c3]
72
+ - Updated dependencies [5b843fb]
73
+ - Updated dependencies [b4487aa]
74
+ - Updated dependencies [65ca83a]
75
+ - Updated dependencies [67bf2e2]
76
+ - Updated dependencies [c6d1cb4]
77
+ - Updated dependencies [36030ff]
78
+ - Updated dependencies [6117f7b]
79
+ - Updated dependencies [e533b0b]
80
+ - Updated dependencies [cdf4d9a]
81
+ - Updated dependencies [aee1806]
82
+ - Updated dependencies [c13350b]
83
+ - Updated dependencies [c13350b]
84
+ - Updated dependencies [9ca2d85]
85
+ - Updated dependencies [c13350b]
86
+ - Updated dependencies [891d345]
87
+ - Updated dependencies [a52e2ef]
88
+ - Updated dependencies [5293114]
89
+ - Updated dependencies [20bc357]
90
+ - Updated dependencies [5966c2a]
91
+ - Updated dependencies [2382580]
92
+ - Updated dependencies [d9fa683]
93
+ - Updated dependencies [3c7bcc0]
94
+ - Updated dependencies [4b6cac7]
95
+ - Updated dependencies [7631964]
96
+ - Updated dependencies [ac471a0]
97
+ - Updated dependencies [60ae58e]
98
+ - Updated dependencies [ce92674]
99
+ - Updated dependencies [9f601e8]
100
+ - Updated dependencies [51c5227]
101
+ - Updated dependencies [a4a85c8]
102
+ - Updated dependencies [07a4e26]
103
+ - Updated dependencies [ec975f1]
104
+ - Updated dependencies [eb4204b]
105
+ - Updated dependencies [4f13be2]
106
+ - Updated dependencies [61cc079]
107
+ - Updated dependencies [0e96e46]
108
+ - Updated dependencies [d52d4fe]
109
+ - Updated dependencies [742cebb]
110
+ - Updated dependencies [ce92674]
111
+ - Updated dependencies [cf2c9b7]
112
+ - Updated dependencies [0f9faa2]
113
+ - Updated dependencies [7cf42fe]
114
+ - Updated dependencies [5966c2a]
115
+ - Updated dependencies [f78dd83]
116
+ - Updated dependencies [a2cd18a]
117
+ - Updated dependencies [4638aaa]
118
+ - Updated dependencies [0222d3c]
119
+ - Updated dependencies [0a936ea]
120
+ - Updated dependencies [023c00b]
121
+ - Updated dependencies [155507e]
122
+ - Updated dependencies [7bba90b]
123
+ - Updated dependencies [7e05d8e]
124
+ - Updated dependencies [061406d]
125
+ - Updated dependencies [c1f344b]
126
+ - Updated dependencies [9c93465]
127
+ - Updated dependencies [ebb209c]
128
+ - Updated dependencies [63b33e6]
129
+ - Updated dependencies [2a44c1d]
130
+ - Updated dependencies [695cfbd]
131
+ - Updated dependencies [7445149]
132
+ - Updated dependencies [071d0dc]
133
+ - Updated dependencies [0848bea]
134
+ - Updated dependencies [d51bed2]
135
+ - Updated dependencies [b8b3c64]
136
+ - Updated dependencies [0c0fbd9]
137
+ - Updated dependencies [f3141d8]
138
+ - Updated dependencies [5a84d41]
139
+ - Updated dependencies [fd3013a]
140
+ - Updated dependencies [21676eb]
141
+ - Updated dependencies [e336549]
142
+ - Updated dependencies [d40f43a]
143
+ - Updated dependencies [e5e7ee0]
144
+ - Updated dependencies [a2ebea2]
145
+ - Updated dependencies [800bdb0]
146
+ - Updated dependencies [04f1182]
147
+ - Updated dependencies [5647006]
148
+ - Updated dependencies [38f7e4f]
149
+ - Updated dependencies [c57f3cf]
150
+ - Updated dependencies [97faca3]
151
+ - Updated dependencies [ad5fe25]
152
+ - Updated dependencies [ea90179]
153
+ - Updated dependencies [ce92674]
154
+ - Updated dependencies [5ef0b5b]
155
+ - Updated dependencies [48fbacb]
156
+ - Updated dependencies [355e951]
157
+ - Updated dependencies [dadb43f]
158
+ - @objectstack/spec@17.0.0-rc.2
159
+
160
+ ## 17.0.0-rc.1
161
+
162
+ ### Minor Changes
163
+
164
+ - 2a37694: fix(plugin-dev,types): the production escape hatch stops being silent (#3900)
165
+
166
+ `DevPlugin.init()` refuses to run under `NODE_ENV=production` (ADR-0115 D6), and
167
+ `OS_ALLOW_DEV_PLUGIN` overrides that refusal. As shipped, the override returned
168
+ early with **no output at all**: the process ran the development assembly while
169
+ every log line and the ready banner read like an ordinary production start.
170
+
171
+ That reproduces, one level up, the defect the guard exists to close. The guard's
172
+ own precedent says so — `OS_ALLOW_DEGRADED_TENANCY` boots degraded _and brands
173
+ it everywhere an operator looks_, and `OS_ALLOW_DRIVER_CONNECT_FAILURE`'s
174
+ contract is "logged loudly at startup". An escape hatch that says nothing leaves
175
+ the operator's only evidence of a degraded state in an env var they may not have
176
+ set themselves.
177
+
178
+ **The override now brands itself, twice.** A warning at `init()` — emitted
179
+ before any assembly work, so it survives an assembly step that later throws —
180
+ and a repeat on the ready banner, which is the surface an operator actually
181
+ reads:
182
+
183
+ ```
184
+ ⚠ DEV ASSEMBLY UNDER NODE_ENV=production (OS_ALLOW_DEV_PLUGIN is set) — the boot
185
+ guard was explicitly overridden. This process is running the DEVELOPMENT
186
+ assembly, which is not hardened for production traffic (ADR-0115 D6).
187
+ • Auth secret is the default published inside @objectstack/plugin-dev. It is
188
+ public, so anyone can mint a session this stack accepts. Pass `authSecret`
189
+ explicitly.
190
+ • Data goes to the in-memory driver with persistence disabled — every record
191
+ is lost when this process exits.
192
+ ```
193
+
194
+ Only hazards that are live for _that_ configuration are named: the secret line
195
+ is suppressed when the operator passed their own `authSecret`, and the driver
196
+ line when the `driver` toggle is off. The dev-admin seed is deliberately absent
197
+ — `plugin-auth`'s `maybeSeedDevAdmin` is hard-gated to
198
+ `NODE_ENV === 'development'` and cannot fire on this path, so warning about it
199
+ would spend the attention the real hazards need.
200
+
201
+ **New export — `resolveAllowDevPlugin()` (`@objectstack/types`).** The flag moves
202
+ off a bare `process.env['OS_ALLOW_DEV_PLUGIN'] === '1'` and joins the
203
+ `OS_ALLOW_*` family's shared truthy vocabulary, next to
204
+ `resolveAllowDegradedTenancy` / `resolveAllowDriverConnectFailure`.
205
+
206
+ FROM → TO for operators: `OS_ALLOW_DEV_PLUGIN=1` keeps working unchanged.
207
+ `OS_ALLOW_DEV_PLUGIN=true` (and `on` / `yes`, case-insensitive, surrounding
208
+ whitespace ignored) **now takes effect** where the strict comparison previously
209
+ ignored it and failed the boot. That is a widening, in the direction an operator
210
+ setting the flag already intended; falsy and unrecognised values still refuse to
211
+ boot, and unset still means "fail fast". If you were relying on
212
+ `OS_ALLOW_DEV_PLUGIN=true` being inert as a way to keep the guard armed, unset
213
+ the variable instead.
214
+
215
+ No change to the refusal path, which this issue re-verified end to end:
216
+ `kernel.use()` only registers, `initPluginWithTimeout` does not catch,
217
+ `bootstrap()` rethrows, and `os serve`'s outer handler prints the message and
218
+ exits `1`. The `throw` is genuinely fatal here, so it needs none of the
219
+ `process.exit(1)` the tenancy guard required for sitting inside a broad `catch`.
220
+
221
+ - d5749d7: refactor(types,rest,services,plugin-sharing): one shared writer for the response envelope, and `error.code` is enforced at compile time (#3973)
222
+
223
+ `BaseResponseSchema` declares one envelope for every REST body the platform
224
+ emits. It declared it once; the code that _wrote_ it was copied per route
225
+ module. After #3843 and #3983 converted the last drifting one, seven modules
226
+ each carried their own two-line `sendOk` / `sendError` pair — so the envelope's
227
+ shape lived in fourteen places rather than one.
228
+
229
+ `pnpm check:route-envelope` proved those seven copies agreed, which is why this
230
+ is a cleanup rather than a bug fix. But a guard proves agreement; it does not
231
+ create it. An eighth module starts by copying the pair again — not
232
+ hypothetically: `share-link-routes.ts` was found already drifting by the
233
+ repo-wide scan, and its drift had broken `client.shareLinks.create()` and
234
+ `.list()` through `unwrapResponse` (#3983).
235
+
236
+ ## What moved
237
+
238
+ `sendOk` / `sendError` now live once, in `@objectstack/types`
239
+ (`response-envelope.ts`), and all seven modules import them:
240
+
241
+ | Module |
242
+ | ------------------------------------- |
243
+ | `service-storage/storage-routes.ts` |
244
+ | `service-settings/settings-routes.ts` |
245
+ | `service-datasource/admin-routes.ts` |
246
+ | `rest/external-datasource-routes.ts` |
247
+ | `rest/package-routes.ts` |
248
+ | `service-i18n/i18n-service-plugin.ts` |
249
+ | `plugin-sharing/share-link-routes.ts` |
250
+
251
+ Placement was the open question in #3973, not design. `packages/spec` is
252
+ schemas-only (Prime Directive #2), and the callers span `rest`, four
253
+ `services/*` and one `plugins/*`, which rules out anything depending on them.
254
+ `@objectstack/types` depends on nothing but `@objectstack/spec`, so every caller
255
+ can reach it, and it is already where the repo puts a helper the HTTP boundaries
256
+ share — `looksLikeInternalErrorLeak` (#3867) sits one file over and made the
257
+ same argument first.
258
+
259
+ The builders take a structural `{ status(n), json(body) }`, so the package
260
+ imports no HTTP contract at all: `IHttpResponse` satisfies it, and so does the
261
+ `any`-typed `res` the older modules carry.
262
+
263
+ ## `error.code` is now checked by the compiler
264
+
265
+ All seven copies typed the parameter `code: string`. ADR-0112 (#3841) closed the
266
+ vocabulary — `ErrorCode` is `StandardErrorCode ∪ ERROR_CODE_LEDGER` — but an
267
+ invented code was still caught only at runtime, by a conformance suite parsing a
268
+ driven body, i.e. only on routes some test happened to drive.
269
+
270
+ The shared `sendError` types `code` as `ErrorCode`, so an unregistered code now
271
+ fails to compile, at every call site at once:
272
+
273
+ ```ts
274
+ sendError(res, 400, "NOT_A_REGISTERED_CODE", "invented");
275
+ // Argument of type '"NOT_A_REGISTERED_CODE"' is not assignable to parameter of type 'ErrorCode'.
276
+ ```
277
+
278
+ This cost no call-site churn: every code the seven modules emit was already
279
+ registered.
280
+
281
+ ## `extra` is closed at the same place
282
+
283
+ `sendError`'s last parameter is `Pick<ApiError, 'category' | 'httpStatus' |
284
+ 'details' | 'requestId'>` — exactly what `ApiErrorSchema` declares beside `code`
285
+ and `message`.
286
+
287
+ It was `Record<string, unknown>` while `settings-routes` still hung `namespace` /
288
+ `key` / `reason` / `fields` beside `code`. Those bodies passed every gate anyway:
289
+ `ApiErrorSchema` is a plain `z.object`, so unknown keys were STRIPPED rather than
290
+ rejected, and `envelopeViolations` inspects only the body's top level —
291
+ conformant _by stripping_ rather than by declaration. #4224 moved that module
292
+ onto `details`, which is what lets the parameter close here. Closing it at the
293
+ shared builder is the part that lasts: an undeclared sibling is now a compile
294
+ error in every module at once, rather than a key that quietly evaporates in
295
+ whichever module reintroduces it.
296
+
297
+ ## Nothing changes on the wire
298
+
299
+ The seven pairs were identical modulo the optional `status` and `extra`
300
+ parameters this one unions, and each module's driven conformance suite still
301
+ parses its real bodies against the real spec schemas. One internal call site was
302
+ rewritten: `package-routes` passed `details` positionally and now passes
303
+ `{ details }`, producing the same `error.details` it always did.
304
+
305
+ ## The guard got stronger
306
+
307
+ `scripts/check-route-envelope.mjs` counts response write sites per module. A
308
+ module that routes everything through the shared pair builds **none** itself, so
309
+ the seven now declare `0 / 0 / 0` where they used to declare `2 / 1 / 1`, and the
310
+ shared pair is pinned separately at `2 / 1 / 1` so the invariant stays total for
311
+ the surface rather than per-module. What the count asserts is no longer "your two
312
+ builders are the enveloped ones" but "you have no builders" — and a new route
313
+ that hand-rolls a body still moves it off zero and fails.
314
+
315
+ ### Patch Changes
316
+
317
+ - 2e836de: chore(packaging): CHANGELOG.md ships in every npm tarball (#4261)
318
+
319
+ The AGENTS.md post-task checklist requires breaking changesets to carry their
320
+ FROM → TO migration because "this text ships to consumers as `CHANGELOG.md`
321
+ inside the npm package and is what an upgrading agent greps after the tombstone
322
+ error." That delivery path was severed for 68 of the 69 publishable packages:
323
+ npm packs `package.json` / `README*` / `LICENSE*` unconditionally but — unlike
324
+ older npm versions — not `CHANGELOG.md`, and the canonical
325
+ `"files": ["dist", "README.md"]` whitelist never named it. Measured on npm
326
+ 10.9.7: `npm pack --dry-run` on `@objectstack/types` shipped 3 files while its
327
+ 70KB `CHANGELOG.md` stayed behind. Only `@objectstack/spec` listed it
328
+ explicitly.
329
+
330
+ The tombstone-error scenario is precisely the one where the repo is out of
331
+ reach — the upgrading agent has `node_modules` and nothing else — so the
332
+ migration text has to ride in the tarball. Every publishable package now
333
+ declares `CHANGELOG.md` in `files`, and the canonical whitelist is
334
+ `["dist", "README.md", "CHANGELOG.md"]`.
335
+
336
+ The other half is the gate: `check:published-files` gains a fifth invariant,
337
+ COMPLETE — a whitelist that fails to cover `CHANGELOG.md` fails the
338
+ always-required lint job, so the next package cannot silently sever the path
339
+ again. `@objectstack/spec`'s per-package EXTRA_ENTRIES exemption dissolves
340
+ into the canonical set.
341
+
342
+ Consumer-visible change: one more file per install (the package's changelog,
343
+ e.g. 70.8KB for `@objectstack/types`), and `grep -r "removed key"
344
+ node_modules/@objectstack/*/CHANGELOG.md` now finds the migration it was
345
+ promised.
346
+
347
+ - c20b875: **Correct the stale premise left behind by #4012: the degraded-boot stderr copy
348
+ survives the operator's LOG LEVEL, not `os serve`'s boot-quiet window.**
349
+
350
+ `emitDegradedBootBanner` writes the `OS_ALLOW_DRIVER_CONNECT_FAILURE` banner to
351
+ stderr in addition to `logger.warn`, and every comment and test name explaining
352
+ why cited the same reason: `os serve` swallowed all of stdout while the kernel
353
+ booted, and `Logger` routes `warn` to stdout. #4012 fixed that — the boot window
354
+ now buffers and replays `warn`-and-above — which retires the _stated_
355
+ justification for a duplicate that is nonetheless still load-bearing:
356
+
357
+ `Logger.write()` returns before touching a stream when the record is below
358
+ `config.level`, so at `--log-level error`, `fatal` or `silent` the banner's
359
+ `logger.warn` reaches **no** stream at all. A production host at `error` is
360
+ exactly the deployment this escape hatch exists for, and exactly where a
361
+ logger-only banner would vanish. Removing the stderr copy on the strength of
362
+ #4012 would therefore have been a regression — so this documents the reason that
363
+ is still true, in the places someone would read before deleting it:
364
+ `degraded-boot.ts`, the engine's emit site, and all three parity tests
365
+ (objectql, runtime, service-datasource), which are renamed off "which `os serve`
366
+ boot-quiet cannot swallow" to "which the operator log level cannot filter away".
367
+
368
+ The objectql parity test now proves the claim instead of asserting around it: it
369
+ drives a **real** `ObjectLogger` at `level: 'error'` and requires the banner on
370
+ stderr _and_ nothing on stdout. Set the level to `warn` and it fails — so the
371
+ test is pinned to the level filter rather than passing for any reason.
372
+
373
+ Also corrected in the same sweep, all comment-only, all previously overstating
374
+ what #4012 had not yet fixed:
375
+
376
+ - the automation wiring summary (`format.ts`, `serve.ts`, its test) claimed the
377
+ boot window swallowed the engine's binding warnings. Its real justification is
378
+ stronger and unchanged: a flow that silently fails to arm emits **no** log line
379
+ at any level, so binding state has to be read off the live engine — absence of
380
+ a warning was never evidence of a bound flow.
381
+ - the seed summary (`seed-summary.ts`, `format.ts`, its test) and `AppPlugin`'s
382
+ seed-outcome note attributed the silence to the boot window; the operative
383
+ gate is that `SeedLoader`'s result logs are `info`, under the default `warn`.
384
+
385
+ No behavior changes.
386
+
387
+ - 9881074: fix(batch): the background walks seek instead of counting, so they stop skipping rows (#4363)
388
+
389
+ #4363 made a single paged read a partition of its result set. It could not make
390
+ a _walk_ one: seven background scans paged with a growing `offset` while writing
391
+ to the very rows they were reading, and an offset counts into a set those writes
392
+ are changing. Rows slide past the cursor and are never visited.
393
+
394
+ That is not a slow page in any of these — it is a wrong answer wearing the shape
395
+ of a clean run:
396
+
397
+ - **`rebuildApproverIndex`** built its desired state by walking
398
+ `sys_approval_request WHERE status = 'pending'` with no `orderBy` at all, then
399
+ **deleted** every index row that state did not explain. A skipped request
400
+ meant an approver silently dropped from someone's queue. (The loop beside it
401
+ ordered by `created_at` — not unique, so its pages were never a partition
402
+ either.)
403
+ - **`verifyFileReferences`** decides which files nothing references. A record it
404
+ never visits is reported as an unreferenced file.
405
+ - **`backfillFileReferences`** and the **pinyin companion backfill** rewrite
406
+ each row they read, so their own writes were shifting the set out from under
407
+ the cursor. Records were left unconverted and unsearchable by a run that
408
+ reported success.
409
+ - **`scanValueShapes`** exists to vouch that no stored value is off-shape, and
410
+ it opens a migration gate on that evidence.
411
+
412
+ All of them now go through `keysetWalk` (`@objectstack/types`): order by a
413
+ unique key, and seek past the last one instead of counting from the start. A
414
+ row's key does not move when the row is updated, and cannot be shifted when
415
+ another is deleted, so the walk is stable under exactly the mutation these
416
+ functions perform. It is also O(n) rather than O(n²/page) — measured on
417
+ Postgres over 2M rows, deep pages cost ~1.1 s by offset against ~0.09 s by seek.
418
+
419
+ One deliberate non-conversion: the REST **export** stream keeps its offset. It
420
+ honors a caller-chosen sort, and a keyset walk would have to re-order the export
421
+ by `id` to seek — changing what the user asked for to fix a cost. Its pages are
422
+ already a partition since #4363; only the depth cost remains.
423
+
424
+ `keysetWalk` merges the cursor with `$and` rather than spreading it into the
425
+ caller's filter, so a walk whose own `where` constrains the key column
426
+ (`{ id: { $in: [...] } }`) keeps that constraint instead of having it silently
427
+ overwritten. When a `max` cap is set it reads one row beyond the cap to tell
428
+ "the cap stopped us" from "the source ended exactly there" — without that, a
429
+ walk that read everything still reports `truncated`, and a caller acting on it
430
+ goes looking for rows that were never withheld.
431
+
432
+ The storage suites' fake engines now **throw** on an `offset` instead of serving
433
+ one, so the conversion is pinned rather than merely passing.
434
+
435
+ - 39eb01b: fix(runtime,cli,types): `os migrate` and the dev runtime now share one `__search` companion schema view (#3955)
436
+
437
+ On a zh-locale deployment the dev runtime provisions the hidden `__search`
438
+ pinyin companion column (ADR-0098) on every eligible object, but the
439
+ `os migrate plan`/`apply` boot went through `createStandaloneStack`, which
440
+ never derived the locale-gated pinyin decision from the compiled artifact.
441
+ Its metadata therefore lacked every companion column, and `migrate plan`
442
+ reported each live `__search` column of a dev-created database as a
443
+ destructive orphan — with `--allow-destructive` as the printed remediation,
444
+ which would have dropped live feature columns.
445
+
446
+ - `@objectstack/types`: new `collectConfiguredLocales(i18n)` and
447
+ `stampSearchPinyinEnabled(i18n)` — the single resolve-and-stamp helper for
448
+ `OS_SEARCH_PINYIN_ENABLED`. An explicit env value still wins; only a
449
+ positive locale-derived decision is stamped.
450
+ - `@objectstack/runtime`: `createStandaloneStack` stamps the decision from
451
+ the artifact's `i18n` before any plugin constructs a `SchemaRegistry`, and
452
+ surfaces `i18n` on its result like `requires`/`objects`/`manifest`.
453
+ - `@objectstack/cli`: the `serve`/`dev` boot now stamps through the same
454
+ shared helper (behaviour unchanged), so create/serve and plan/apply cannot
455
+ compute different schema views of the same source tree.
456
+
457
+ A fresh CLI-created database is now also born with the same `__search`
458
+ columns the dev runtime would provision, instead of acquiring them on the
459
+ next dev boot.
460
+
461
+ - Updated dependencies [6a67d7a]
462
+ - Updated dependencies [0ecc656]
463
+ - Updated dependencies [06772eb]
464
+ - Updated dependencies [270650f]
465
+ - Updated dependencies [3aef718]
466
+ - Updated dependencies [1ea6bce]
467
+ - Updated dependencies [c1dcacd]
468
+ - Updated dependencies [ad303ed]
469
+ - Updated dependencies [32ccb23]
470
+ - Updated dependencies [f5a4ef0]
471
+ - Updated dependencies [2d3e255]
472
+ - Updated dependencies [7d7521f]
473
+ - Updated dependencies [5dc4d02]
474
+ - Updated dependencies [05154a1]
475
+ - Updated dependencies [9b6fe7c]
476
+ - Updated dependencies [8c711fb]
477
+ - Updated dependencies [09e4547]
478
+ - Updated dependencies [91f4c78]
479
+ - Updated dependencies [820eff9]
480
+ - Updated dependencies [8d895ff]
481
+ - Updated dependencies [f6472d7]
482
+ - Updated dependencies [78caf51]
483
+ - Updated dependencies [62a789b]
484
+ - Updated dependencies [789ad63]
485
+ - Updated dependencies [2af1988]
486
+ - Updated dependencies [12a19a8]
487
+ - Updated dependencies [41dcda3]
488
+ - Updated dependencies [c8124e5]
489
+ - Updated dependencies [a1a4140]
490
+ - Updated dependencies [217e2e6]
491
+ - Updated dependencies [86a71d1]
492
+ - Updated dependencies [d5c75e2]
493
+ - Updated dependencies [03d26f7]
494
+ - Updated dependencies [4384921]
495
+ - Updated dependencies [3c628ce]
496
+ - Updated dependencies [7cb922e]
497
+ - Updated dependencies [1d22114]
498
+ - Updated dependencies [b5f9397]
499
+ - Updated dependencies [ed77493]
500
+ - Updated dependencies [58a03d2]
501
+ - Updated dependencies [dc530b4]
502
+ - Updated dependencies [e59786e]
503
+ - Updated dependencies [bcf1112]
504
+ - Updated dependencies [9774b78]
505
+ - Updated dependencies [b07d829]
506
+ - Updated dependencies [a648e96]
507
+ - Updated dependencies [a47ac06]
508
+ - Updated dependencies [e4c61a7]
509
+ - Updated dependencies [cc60165]
510
+ - Updated dependencies [081aa6f]
511
+ - Updated dependencies [91f4c78]
512
+ - Updated dependencies [e8d0c21]
513
+ - Updated dependencies [c1d44f7]
514
+ - Updated dependencies [ab9fb5c]
515
+ - Updated dependencies [f985b3f]
516
+ - Updated dependencies [9a4932a]
517
+ - Updated dependencies [f9fc874]
518
+ - Updated dependencies [011b386]
519
+ - Updated dependencies [7777e8f]
520
+ - Updated dependencies [507b92a]
521
+ - Updated dependencies [7309c81]
522
+ - Updated dependencies [20bc1ec]
523
+ - Updated dependencies [90c2b15]
524
+ - Updated dependencies [42eeb7d]
525
+ - Updated dependencies [01e124d]
526
+ - Updated dependencies [7ce02eb]
527
+ - Updated dependencies [a13827e]
528
+ - Updated dependencies [7733604]
529
+ - Updated dependencies [40e420f]
530
+ - Updated dependencies [d13004a]
531
+ - Updated dependencies [5b47ab5]
532
+ - Updated dependencies [b09d8d9]
533
+ - Updated dependencies [b09d8d9]
534
+ - Updated dependencies [8675db6]
535
+ - Updated dependencies [b09d8d9]
536
+ - Updated dependencies [3eb1b2b]
537
+ - Updated dependencies [59b85c0]
538
+ - Updated dependencies [6e357ed]
539
+ - Updated dependencies [d6938bf]
540
+ - Updated dependencies [31e0be9]
541
+ - Updated dependencies [4bfd455]
542
+ - Updated dependencies [ffd2ce2]
543
+ - Updated dependencies [62f8017]
544
+ - Updated dependencies [a831df1]
545
+ - Updated dependencies [f752ee3]
546
+ - Updated dependencies [a1b61e0]
547
+ - Updated dependencies [cd6b9f2]
548
+ - Updated dependencies [2cb6d3c]
549
+ - Updated dependencies [af2a095]
550
+ - Updated dependencies [ec796d5]
551
+ - Updated dependencies [e87fea1]
552
+ - Updated dependencies [c65e529]
553
+ - Updated dependencies [3ca34c1]
554
+ - Updated dependencies [239c3a3]
555
+ - Updated dependencies [94a0bbc]
556
+ - Updated dependencies [d6bfb3d]
557
+ - Updated dependencies [a2266a6]
558
+ - Updated dependencies [d25a0ec]
559
+ - Updated dependencies [667b83e]
560
+ - Updated dependencies [627b188]
561
+ - Updated dependencies [8d4eae7]
562
+ - Updated dependencies [65a3a84]
563
+ - Updated dependencies [ccd9397]
564
+ - Updated dependencies [bca935b]
565
+ - Updated dependencies [c54c822]
566
+ - Updated dependencies [8dcc0f5]
567
+ - Updated dependencies [75b9e51]
568
+ - Updated dependencies [0a2f233]
569
+ - Updated dependencies [8621cdd]
570
+ - Updated dependencies [6f23667]
571
+ - Updated dependencies [5d21a48]
572
+ - Updated dependencies [19365b7]
573
+ - Updated dependencies [b7ed26d]
574
+ - Updated dependencies [b3a3d83]
575
+ - Updated dependencies [7a55913]
576
+ - Updated dependencies [35accbf]
577
+ - Updated dependencies [6038de7]
578
+ - Updated dependencies [eb95d97]
579
+ - Updated dependencies [e4c2dc8]
580
+ - Updated dependencies [1bd2795]
581
+ - Updated dependencies [8186a70]
582
+ - Updated dependencies [a329cca]
583
+ - Updated dependencies [6eec18c]
584
+ - Updated dependencies [4d7bebf]
585
+ - Updated dependencies [821ac7a]
586
+ - Updated dependencies [8f81731]
587
+ - Updated dependencies [8b50cb3]
588
+ - Updated dependencies [8c2db68]
589
+ - Updated dependencies [22b5e54]
590
+ - Updated dependencies [0166bd5]
591
+ - Updated dependencies [9b702dc]
592
+ - Updated dependencies [ab16331]
593
+ - @objectstack/spec@17.0.0-rc.1
594
+
595
+ ## 17.0.0-rc.0
596
+
597
+ ### Minor Changes
598
+
599
+ - 879ea13: ADR-0105 Phase 0 + Phase 1: group tenancy posture; organization scope as a
600
+ first-class authorization dimension.
601
+
602
+ > This release carries BREAKING spec removals (see "Enforce-or-remove" below)
603
+ > but is recorded as `minor`: every publishable package is in the Changesets
604
+ > lockstep group, so one `major` would promote the whole monorepo. Breaking
605
+ > changes ship as `minor` during the launch window — the migration notes below
606
+ > are what reach consumers in `CHANGELOG.md`.
607
+
608
+ ## Tenancy is now a spectrum (D1)
609
+
610
+ `single | group | isolated`, resolved by the `tenancy` service and selected with
611
+ the new `OS_TENANCY_POSTURE` env var. Existing deployments are unchanged:
612
+ `OS_TENANCY_POSTURE` unset derives the posture from `OS_MULTI_ORG_ENABLED`
613
+ (`true` ⇒ `isolated`, else `single`). An unrecognized value throws at boot
614
+ rather than silently landing in a posture with no organization wall.
615
+
616
+ - `single` — no wall (unchanged).
617
+ - `group` — **new.** Organizations are membership boundaries over one shared
618
+ dataset; Layer 0 becomes `organization_id IN accessible_org_ids` (union / MOAC
619
+ semantics). Enforced by the OPEN engine.
620
+ - `isolated` — today's `multi`, renamed. Behavior, enterprise `org-scoping`
621
+ probe and degraded-boot handling all unchanged.
622
+
623
+ ## Organization scope is a first-class context field (D2)
624
+
625
+ `ExecutionContext.accessible_org_ids` — every organization the caller holds a
626
+ currently-valid membership in (ADR-0091 validity windows) — is resolved once by
627
+ `resolveAuthzContext` and carried by every transport. The `group` wall reads it
628
+ directly; RLS policies may reference it as
629
+ `organization_id IN (current_user.accessible_org_ids)`. An empty or absent set
630
+ fails the wall closed.
631
+
632
+ Only the Layer 0 PREDICATE widens. Composition is untouched: the wall is still
633
+ computed independently of the RLS compiler, AND-composed outermost, and
634
+ crossable only by a true `PLATFORM_ADMIN` on a posture-permitting object — so
635
+ ADR-0095's W1/W2 invariants hold in every posture.
636
+
637
+ ## Two P0 correctness fixes (D3, D4) — behavior changes
638
+
639
+ **D3 — app-authored org-scoped RLS policies are no longer silently dropped**
640
+ (finding F1, framework#3539). `collectRLSPolicies` used to strip any policy whose
641
+ `using` contained the substring `current_user.organization_id` when isolation was
642
+ inactive, which swallowed app-authored policies as well as the platform's own.
643
+ Stripping is now decided by PROVENANCE (identity against the shipped
644
+ declaration). **Upgrade impact:** in a deployment with no organization wall, an
645
+ app-authored policy referencing the active organization is now RETAINED and
646
+ fails closed (zero rows) with a one-time warning, where it previously vanished
647
+ and the object read unscoped. `getReadFilter` shared the defect, so analytics and
648
+ raw-SQL consumers were affected too. If a policy was only ever meant for
649
+ multi-org, delete it or install `@objectstack/organizations`.
650
+
651
+ **D4 — `viewAllRecords`/`modifyAllRecords` never cross an organization
652
+ boundary** (finding F2, framework#3540). Under a wall-less posture nothing
653
+ bounded the wildcard superuser bits `organization_admin` carries, so a
654
+ deployment that accumulated organizations (personal orgs on signup) made every
655
+ owner/admin an environment-wide superuser. `auto-org-admin-grant` now grants a
656
+ de-VAMA'd `organization_admin_no_bypass` variant when no wall is enforced, and
657
+ revokes the superseded variant whenever the posture changes. **Upgrade impact:**
658
+ in `single` posture an org owner/admin keeps full CRUD but loses the blanket
659
+ ownership/sharing/RLS bypass. Deliberate deployment-wide visibility remains
660
+ available through `admin_full_access` or an explicitly authored permission set —
661
+ it just stops being a side effect of a better-auth membership role.
662
+
663
+ ## Engine-owned organization stamping (D5)
664
+
665
+ Under any wall-enforcing posture the engine stamps `organization_id` from the
666
+ caller's active organization on an insert that omits it, and validates every
667
+ supplied value against the wall. Idempotent with the enterprise auto-stamp
668
+ (neither overwrites a supplied value). This also closes a real hole: the
669
+ pre-existing post-image check required a non-array payload, so a BULK insert
670
+ could carry a forged `organization_id` per row. One forged row now denies the
671
+ whole write.
672
+
673
+ ## Group structure, extension fields and red-line lints (D6, D7)
674
+
675
+ - `sys_organization` gains `parent_organization_id` and `sort_order` — a
676
+ **reporting dimension only**.
677
+ - New lint `validateOrgAxisRedLines` (`org-axis-permission-inheritance`,
678
+ `org-axis-cross-org-bu-grant`), wired into `os lint` / `os compile` /
679
+ `os validate`: an RLS policy or sharing rule that walks the org tree is an
680
+ error, as is a business-unit grant on a platform-global object.
681
+ - Extension fields on better-auth-managed objects ride the existing ADR-0092
682
+ whitelist. A new guard derives better-auth's real field surface from
683
+ `getAuthTables()` at the pinned version and fails the build on any name
684
+ collision, so a library upgrade cannot silently take ownership of a column.
685
+
686
+ ## Enforce-or-remove (D11) — BREAKING
687
+
688
+ Both removals are of surface that had **zero runtime consumers**, so no
689
+ behavior changes; authoring them is now a no-op instead of a lint warning.
690
+
691
+ - **`PermissionSet.contextVariables` — REMOVED.** The RLS compiler never read
692
+ it. FROM → TO: a set a policy needs as `field IN (current_user.<key>)` is now
693
+ supplied by a registered membership resolver (below); a constant belongs in
694
+ the policy itself as a literal (`status = 'published'`).
695
+ - **`Territory` / `TerritoryModel` / `TerritoryType` (`security/territory.zod.ts`)
696
+ — REMOVED.** No runtime object, stack field or resolver existed. FROM → TO:
697
+ matrix requirements are served by multi-position × business-unit anchoring; a
698
+ generalized dimension-security module will arrive with its own ADR.
699
+ - **`ExecutionContext.rlsMembership` — PRODUCTIZED.** The bag the compiler has
700
+ merged since ADR-0056 finally has a producer: register an
701
+ `IRlsMembershipResolver` (`@objectstack/spec/contracts`) under the
702
+ `rls-membership-resolver` service, declaring the keys it owns. Fail-closed by
703
+ construction — an unresolved key makes its policies drop out. Kernel-owned
704
+ keys (`accessible_org_ids`, `org_user_ids`, …) are reserved and cannot be
705
+ overwritten from this seam.
706
+
707
+ ## Edition boundary (D12)
708
+
709
+ The `group` posture's enforcement primitives ship OPEN — the union wall,
710
+ `accessible_org_ids` resolution, D5 stamping/validation, the D3/D4 correctness
711
+ fixes and the D6 lints — because the correctness of a wall is never a paid
712
+ feature (cloud ADR-0016 铁律「强制免费、治理收费」). `isolated` keeps its existing
713
+ enterprise `org-scoping` probe, so the current commercial boundary for
714
+ legal-entity isolation is unchanged by this release.
715
+
716
+ - 840ee4b: fix(analytics,runtime,types): gate cube auto-inference on object existence; stop the dispatcher boundary returning raw SQL (#3867)
717
+
718
+ Two independent defects on the `/analytics` surface, found while verifying #3770
719
+ against a real server. On an authenticated CRM dev server, before this change:
720
+
721
+ ```
722
+ POST /api/v1/analytics/query {"cube":"sqlite_master","measures":["count"],"dimensions":["type"]}
723
+ → 200 {"rows":[{"type":"index","count":262},{"type":"table","count":71},{"type":"view","count":1}],
724
+ "sql":"SELECT type AS \"type\", COUNT(*) AS \"count\" FROM \"sqlite_master\" GROUP BY type"}
725
+ ```
726
+
727
+ That is SQLite's internal schema table — never a registered object — read
728
+ successfully through the analytics endpoint. Not merely "the name reaches the
729
+ driver and errors": **any table the connection can see was readable.**
730
+
731
+ **① The cube name reached the driver as a table name.** `AnalyticsService.ensureCube`
732
+ auto-infers a minimal Cube when none is registered, with `cube.sql = <the queried
733
+ name>`. That is the intended "metric over an object" path — an `object-metric` KPI
734
+ widget queries `crm_account` with no authored Cube — but it accepted _any_ string,
735
+ so the endpoint could aggregate over an arbitrary physical table. The
736
+ analytics-side twin of the data-path gap #3770 closed, and it was not covered by
737
+ that fix: #3770 gated the protocol's `analyticsQuery`, which is the _degraded
738
+ fallback_; a deployment with `@objectstack/service-analytics` installed runs the
739
+ real engine instead (`ctx.replaceService`).
740
+
741
+ Inference is now gated on the same schema registry the data path consults, via a
742
+ new optional `AnalyticsServiceConfig.isRegisteredObject` that `plugin.ts` wires
743
+ from the `data` engine's `getObject`. Three-way rule: a registered Cube runs
744
+ untouched (its `sql` is whatever it declares); an unregistered name that IS an
745
+ object still auto-infers exactly as before; neither → `CUBE_NOT_FOUND` / 404
746
+ raised before any SQL exists, naming both ways to make the request valid. With no
747
+ probe configured the gate stands down and warns once — the same tiering #3770
748
+ took for a missing registry. `generateSql` (`/analytics/sql`) is gated too.
749
+
750
+ **② The dispatcher boundary returned `err.message` verbatim.** `errorResponseBase`
751
+ is the single error exit for _every_ route the dispatcher plugin mounts —
752
+ `/analytics`, `/packages`, `/i18n`, `/storage`, `/automation`, `/auth`,
753
+ `/notifications`, `/mcp`. `@objectstack/rest` has guarded its data routes against
754
+ driver dumps forever (`mapDataError`); this boundary guarded nothing, so any
755
+ driver error on any of those routes shipped its SQL to the client. Unlike ①, this
756
+ half is unconditional — it does not depend on the cube being invalid.
757
+
758
+ The leak heuristic moved out of `rest-server.ts` into `@objectstack/types` as
759
+ `looksLikeInternalErrorLeak` (both packages already depend on it) and is now
760
+ applied at both boundaries — one predicate, one place to widen when a new
761
+ dialect's phrasing shows up. `mapDataError`'s behaviour is unchanged. At the
762
+ dispatcher it applies **only to 5xx**: a 4xx message is a deliberate
763
+ business/validation answer and must reach the caller intact. Sanitising costs no
764
+ diagnostics — the untouched error still reaches `errorReporter` through the
765
+ existing `__obsRecordedError` side-channel.
766
+
767
+ **Also fixed in the same function:** `errorResponseBase` read only
768
+ `err.statusCode`, while domain errors across this codebase carry `status` (and
769
+ `HttpDispatcher.errorFromThrown` already reads `status` first). Every deliberate
770
+ 4xx thrown through a dispatcher route — including #3770's `OBJECT_NOT_FOUND` on
771
+ the analytics fallback path — was rendered as a **500**. It now reads `status`
772
+ then `statusCode`.
773
+
774
+ **Behaviour change.** `/analytics/query` and `/analytics/sql` return 404
775
+ `CUBE_NOT_FOUND` for a cube that is neither registered nor a registered object;
776
+ previously the name was passed to the driver. Dashboards and KPI widgets pointed
777
+ at real objects or authored cubes are unaffected. A 5xx on a dispatcher route
778
+ whose message looks like a driver dump now reads `Internal server error` — check
779
+ server logs or your error reporter for the original.
780
+
781
+ - 030125b: feat(objectql)!: `init()` refuses to boot when a data driver fails to connect (#3741)
782
+
783
+ `ObjectQLEngine.init()` wrapped every driver's `connect()` in a try/catch, logged
784
+ one error line, and carried on. A server whose database was unreachable therefore
785
+ "started successfully" — health endpoints could even stay green — and then failed
786
+ every request with an error that reads nothing like _the database is down_. The
787
+ warning it printed (`Operations may recover via lazy reconnection or fail at query
788
+ time`) was half fiction: grep the repo and no reconnection exists in `driver-sql`
789
+ or `driver-mongodb`, so only the "fail at query time" half was ever real. The
790
+ caller made it worse — `ObjectQLPlugin.start()` runs `syncRegisteredSchemas()`
791
+ immediately after `init()`, issuing DDL against a driver that isn't there.
792
+
793
+ The structural half of the bug was worse than the operational one: the catch
794
+ removed a driver's ability to **refuse startup at all**. Any fatal startup check —
795
+ licence, server version, incompatible configuration, missing capability, not just
796
+ an unreachable socket — is expressed by throwing from `connect()`, and every one
797
+ of them was silently downgraded to a runtime error. That is why driver-mongodb's
798
+ multi-tenancy guard (#3724 / #3734) had to be hoisted into its constructor.
799
+
800
+ - `init()` now **throws** `DriverConnectError` (`code: 'ERR_DRIVER_CONNECT'`)
801
+ when any boot-registered driver's `connect()` rejects, aborting kernel
802
+ bootstrap. It still attempts every driver first, so one failed boot names all
803
+ of them. The message is self-contained — each failed driver and its cause —
804
+ because the CLI prints `error.message` alone; the first cause is also attached
805
+ as `error.cause`. Exported from both `@objectstack/objectql` and
806
+ `@objectstack/objectql/core`.
807
+ - `connect()` is now a supported place for a driver to veto boot. Startup
808
+ validation that needs a live connection (server version, capability probes)
809
+ no longer has to be forced into a constructor.
810
+ - The misleading "lazy reconnection" warning is gone.
811
+ - New escape hatch `OS_ALLOW_DRIVER_CONNECT_FAILURE=1`
812
+ (`resolveAllowDriverConnectFailure()` in `@objectstack/types`) restores the old
813
+ lenient boot, but loudly: a `DEGRADED BOOT` banner names the failed drivers and
814
+ states that they are never retried or reconnected and that every query and
815
+ schema sync routed to them will fail for the process lifetime. The banner goes
816
+ to stderr as well as the logger, because `os serve` swallows all of stdout
817
+ during boot and `Logger` routes `warn` there — logger-only, the one message
818
+ that matters would be invisible in exactly the deployment the flag is for.
819
+ Defaults off.
820
+
821
+ **Migration.** No code or config change is needed for a correctly configured
822
+ deployment — a driver that connected before still connects. A deployment that was
823
+ _silently_ booting without its database now fails the boot instead, with the
824
+ driver name and cause in the error; fix the datasource configuration (typically
825
+ `OS_DATABASE_URL`, credentials, or network reachability). To keep booting without
826
+ it — deliberately, and knowing every request that touches it will fail — set
827
+ `OS_ALLOW_DRIVER_CONNECT_FAILURE=1`.
828
+
829
+ ### Patch Changes
830
+
831
+ - 87aca93: fix(datasource)!: a declared datasource that objects bind to must connect, or the boot fails (#3758)
832
+
833
+ `DatasourceConnectionService.handleFailure()` fail-fasted only for an `external`
834
+ datasource with `validation.onMismatch: 'fail'`. Everything else degraded to one
835
+ `warn` line — including the case the D2 auto-connect gate itself flags as having
836
+ **no fallback path**: a datasource that objects bind to explicitly via
837
+ `object.datasource`. Those objects never fall through to the `default` driver;
838
+ `engine.getDriver` throws `Datasource 'x' is not registered` for them.
839
+
840
+ So an app declaring `datasource: 'analytics'` with 20 objects bound to it, booted
841
+ against a wrong `ANALYTICS_URL`, started clean and exited zero — and then failed
842
+ every read and write of those 20 objects with an error that reads nothing like
843
+ _the analytics database is unreachable_. The rest of the app worked, which made it
844
+ **harder** to locate than a total outage: it looks like "some pages are broken",
845
+ not like a misconfigured datasource. This is the same decision #3741/#3751 fixed
846
+ one layer up in `ObjectQLEngine.init()`; the boundary here was still drawn in the
847
+ old place.
848
+
849
+ - **Fail-fast is now keyed on "no fallback path", not on `onMismatch` alone.** At
850
+ the `declared-auto` (boot) trigger, a connect failure aborts the boot when the
851
+ datasource is `external` + `onMismatch: 'fail'` **or** when ≥1 object binds to
852
+ it explicitly. `autoConnect: true` with nothing bound stays lenient — that is
853
+ "connect it if you can", and nothing declares a dependency on it. The
854
+ runtime-admin create/update and boot-rehydration triggers are unchanged and
855
+ still always degrade: a UI action must never brick a running server.
856
+ - **Every failure mode counts**, not just an unreachable socket: an unresolvable
857
+ `external.credentialsRef` (D3) and an unsupported `driver` leave the bound
858
+ objects exactly as dead, so they take the same verdict.
859
+ - **The error names the bound objects** (up to 10, then `+N more`) alongside the
860
+ underlying cause, so the message points at the real problem instead of just the
861
+ datasource name. The service already receives the list for post-connect
862
+ `syncObjectSchema`.
863
+ - **`connectDeclared()` attempts every gated datasource before throwing**, and
864
+ aggregates, so one failed boot reports all the misconfigured ones rather than
865
+ one per restart — the same shape as `ObjectQLEngine.init()`'s
866
+ `DriverConnectError`.
867
+ - **The escape hatch is shared with the engine guard**:
868
+ `OS_ALLOW_DRIVER_CONNECT_FAILURE=1` now also covers this path (and covers
869
+ `onMismatch: 'fail'`, which previously had no opt-out). The operator intent is
870
+ identical — "I know the database is unreachable, boot anyway" — and two flags
871
+ would only guarantee one of them gets missed. When set, boot continues and a
872
+ `DEGRADED BOOT` banner goes to stderr as well as the logger, because `os serve`
873
+ swallows stdout during boot. `emitDegradedBootBanner` moved to
874
+ `@objectstack/types` so both call sites share one implementation;
875
+ `@objectstack/objectql` re-exports it unchanged.
876
+
877
+ ADR-0062 D5 is amended with the new criterion and the shared flag.
878
+
879
+ **Migration.** No change for a correctly configured deployment — a datasource that
880
+ connected before still connects. A deployment that was _silently_ booting with a
881
+ dead, explicitly-bound datasource now fails the boot instead, naming the
882
+ datasource, the cause, and the objects that depend on it; fix the datasource
883
+ configuration. To keep booting without it — deliberately, knowing every request
884
+ touching those objects will fail — set `OS_ALLOW_DRIVER_CONNECT_FAILURE=1`.
885
+
886
+ - 32d3800: fix(driver-sql): bound a connection attempt at 10s, and correct the "no reconnection" claim (#3769, #3759)
887
+
888
+ Two related corrections, both from measuring what #3741/#3751/#3765 had only asserted.
889
+
890
+ **The claim was wrong.** #3751 and #3765 shipped several statements that drivers
891
+ never reconnect — "there is no lazy reconnection", "NOT retried and NOT
892
+ reconnected", "stays disconnected for the process lifetime". Measured, both
893
+ drivers recover on their own:
894
+
895
+ - driver-mongodb: killing a real `mongod` and restarting it on the same port,
896
+ the _same_ driver instance served the next write successfully (13ms), with no
897
+ reconnect call from us — the official driver's topology monitor handles it.
898
+ - driver-sql: a knex/pg pool is not poisoned by an outage. Its error tracks live
899
+ server state (`ECONNREFUSED` while down → a handshake error once a listener is
900
+ back → `ECONNREFUSED` again), i.e. every acquire opens a fresh connection.
901
+ `storage-driver.ts` also configures `pool.min: 0`, so no stale idle
902
+ connections are held.
903
+
904
+ The original reasoning grepped this repo for `reconnect`, found nothing, and
905
+ concluded recovery does not happen — but the recovery lives in the client
906
+ libraries, not in our code. The claims are now corrected in `DriverConnectError`,
907
+ the `DEGRADED BOOT` banner, `resolveAllowDriverConnectFailure`'s docs, and the
908
+ drivers / self-hosting pages.
909
+
910
+ **Fail-fast at boot is unchanged and still correct** — the reason is just
911
+ different. It is not that the connection can never return; it is that the _boot
912
+ sequence_ never re-runs. A driver that missed `init()` also missed
913
+ `syncRegisteredSchemas()`, so its tables can simply not exist even after the
914
+ database comes back. The banner now says that.
915
+
916
+ **The real defect underneath.** `SqlDriver` passed its config to knex untouched,
917
+ so a database endpoint that accepts TCP but never completes the handshake — an
918
+ overloaded instance, a half-open firewall, a load balancer mid-failover — made
919
+ every query wait out tarn's 30s default, then fail with `Timeout acquiring a
920
+ connection. The pool is probably full`, pointing an operator at pool sizing
921
+ instead of the network. With a small `pool.max` a few such queries saturate the
922
+ pool and everything else queues.
923
+
924
+ `SqlDriver` now defaults `pool.createTimeoutMillis` to **10s**, matching
925
+ driver-mongodb's existing `connectTimeoutMS ?? 10_000` so both drivers give up on
926
+ an unreachable server at the same point. A host that sets its own
927
+ `createTimeoutMillis` is left alone.
928
+
929
+ **Migration.** None for a healthy datasource. A deployment that deliberately
930
+ relies on connection establishment taking longer than 10s (a slow cross-region
931
+ replica) should set `pool.createTimeoutMillis` explicitly on its `SqlDriver`
932
+ config.
933
+
934
+ Not fixed here, tracked in #3769: knex still reports the bounded wait as "the
935
+ pool is probably full". An accurate message needs a dialect-specific connect
936
+ timeout (pg's `connectionTimeoutMillis`), which changes the shape of `connection`
937
+ and would regress the startup banner's URL display.
938
+
939
+ - Updated dependencies [50616d9]
940
+ - Updated dependencies [08b5a3d]
941
+ - Updated dependencies [d99aeb3]
942
+ - Updated dependencies [4727eb8]
943
+ - Updated dependencies [f63cd09]
944
+ - Updated dependencies [fa3d0cf]
945
+ - Updated dependencies [af5a224]
946
+ - Updated dependencies [71f76e1]
947
+ - Updated dependencies [37b1346]
948
+ - Updated dependencies [99736a0]
949
+ - Updated dependencies [fe67e34]
950
+ - Updated dependencies [fdb4f50]
951
+ - Updated dependencies [1bd5652]
952
+ - Updated dependencies [14252d3]
953
+ - Updated dependencies [7fb436c]
954
+ - Updated dependencies [879ea13]
955
+ - Updated dependencies [201b31f]
956
+ - Updated dependencies [e2616e0]
957
+ - Updated dependencies [6fdc5c6]
958
+ - Updated dependencies [8b9d71e]
959
+ - Updated dependencies [33f5e23]
960
+ - Updated dependencies [259af21]
961
+ - Updated dependencies [587fc91]
962
+ - Updated dependencies [1986594]
963
+ - Updated dependencies [ad4af62]
964
+ - Updated dependencies [d44dbfa]
965
+ - Updated dependencies [474fe39]
966
+ - Updated dependencies [0bc685a]
967
+ - Updated dependencies [b949059]
968
+ - Updated dependencies [be1c52c]
969
+ - Updated dependencies [c5ff96d]
970
+ - Updated dependencies [84e7be9]
971
+ - Updated dependencies [a6c3f38]
972
+ - Updated dependencies [debc23a]
973
+ - Updated dependencies [0f8ad09]
974
+ - Updated dependencies [8f9689f]
975
+ - Updated dependencies [57a3bb3]
976
+ - Updated dependencies [5f9a987]
977
+ - Updated dependencies [db02d47]
978
+ - Updated dependencies [0bfdf46]
979
+ - Updated dependencies [376a061]
980
+ - Updated dependencies [7c7e246]
981
+ - Updated dependencies [f35cdc5]
982
+ - Updated dependencies [9ea2bc5]
983
+ - Updated dependencies [c2d9098]
984
+ - Updated dependencies [a227ed7]
985
+ - Updated dependencies [9613396]
986
+ - Updated dependencies [e47b342]
987
+ - Updated dependencies [4ed7ed4]
988
+ - Updated dependencies [2fa4ca1]
989
+ - Updated dependencies [f5a2320]
990
+ - Updated dependencies [deb538f]
991
+ - Updated dependencies [5b89711]
992
+ - Updated dependencies [0c8a22f]
993
+ - Updated dependencies [763931e]
994
+ - Updated dependencies [de9af8a]
995
+ - Updated dependencies [c4df271]
996
+ - Updated dependencies [a41ba5c]
997
+ - Updated dependencies [189854c]
998
+ - Updated dependencies [0e3a226]
999
+ - Updated dependencies [1d4756e]
1000
+ - Updated dependencies [720c5ad]
1001
+ - Updated dependencies [a8d1e24]
1002
+ - Updated dependencies [41642b0]
1003
+ - Updated dependencies [4cca74c]
1004
+ - Updated dependencies [88ef03e]
1005
+ - Updated dependencies [9e2caf3]
1006
+ - Updated dependencies [81ce41a]
1007
+ - Updated dependencies [85e1e4e]
1008
+ - Updated dependencies [dac6a08]
1009
+ - Updated dependencies [394b7a1]
1010
+ - Updated dependencies [677b591]
1011
+ - Updated dependencies [d77d1b7]
1012
+ - Updated dependencies [5b79a34]
1013
+ - Updated dependencies [c757854]
1014
+ - Updated dependencies [0045682]
1015
+ - Updated dependencies [2a5f04a]
1016
+ - Updated dependencies [4f740b0]
1017
+ - Updated dependencies [67452d1]
1018
+ - Updated dependencies [0fc6219]
1019
+ - Updated dependencies [605e190]
1020
+ - Updated dependencies [c6c59f1]
1021
+ - Updated dependencies [b0e78a8]
1022
+ - Updated dependencies [f31cc8d]
1023
+ - Updated dependencies [f343dc4]
1024
+ - Updated dependencies [8269e32]
1025
+ - Updated dependencies [74f7339]
1026
+ - Updated dependencies [a6c35a2]
1027
+ - Updated dependencies [c2f1002]
1028
+ - Updated dependencies [f163028]
1029
+ - Updated dependencies [f07808c]
1030
+ - Updated dependencies [7ffc3d3]
1031
+ - Updated dependencies [88346ba]
1032
+ - Updated dependencies [4631592]
1033
+ - Updated dependencies [32ff033]
1034
+ - Updated dependencies [5ac93d4]
1035
+ - Updated dependencies [93f267f]
1036
+ - Updated dependencies [0024abf]
1037
+ - Updated dependencies [acbf364]
1038
+ - Updated dependencies [7687f7b]
1039
+ - Updated dependencies [1659072]
1040
+ - Updated dependencies [abceb0d]
1041
+ - Updated dependencies [0c302a7]
1042
+ - Updated dependencies [6633337]
1043
+ - Updated dependencies [f00d8d4]
1044
+ - Updated dependencies [503be86]
1045
+ - Updated dependencies [cde1975]
1046
+ - Updated dependencies [0bc685a]
1047
+ - Updated dependencies [11949fc]
1048
+ - Updated dependencies [b098b0e]
1049
+ - Updated dependencies [4d00b13]
1050
+ - Updated dependencies [57bab76]
1051
+ - Updated dependencies [b90086a]
1052
+ - Updated dependencies [b95577a]
1053
+ - Updated dependencies [83c161f]
1054
+ - Updated dependencies [d8c4957]
1055
+ - Updated dependencies [f24cb83]
1056
+ - Updated dependencies [5dbbb92]
1057
+ - Updated dependencies [69f1dfd]
1058
+ - @objectstack/spec@17.0.0-rc.0
1059
+
1060
+ ## 16.1.0
1061
+
1062
+ ### Patch Changes
1063
+
1064
+ - Updated dependencies [9e45b63]
1065
+ - @objectstack/spec@16.1.0
1066
+
1067
+ ## 16.0.0
1068
+
1069
+ ### Minor Changes
1070
+
1071
+ - 83e8f7d: feat(mcp): decouple the stdio auto-start switch from the HTTP surface + surface the MCP endpoint on `os dev` boot (#3167)
1072
+
1073
+ The MCP HTTP surface (`/api/v1/mcp`) and the long-lived stdio transport used to
1074
+ share one env var: `OS_MCP_SERVER_ENABLED=true` turned the HTTP surface on **and**
1075
+ silently auto-started the stdio transport — which bridges the raw metadata service
1076
+
1077
+ - data engine with no per-request principal (unscoped). An operator setting it to
1078
+ "make sure MCP is on" got an unscoped transport as a side effect.
1079
+
1080
+ * **`@objectstack/types`** — new `resolveMcpStdioAutoStart()`. Stdio auto-start is
1081
+ now its own switch, `OS_MCP_STDIO_ENABLED` (default off); `OS_MCP_SERVER_ENABLED`
1082
+ governs only the HTTP surface. The legacy `OS_MCP_SERVER_ENABLED=true` trigger
1083
+ still starts stdio for one release, flagged as deprecated. `=false` is unchanged
1084
+ (it only ever gated HTTP).
1085
+ * **`@objectstack/mcp`** — `MCPServerPlugin.start()` gates stdio on the new switch
1086
+ and logs a one-time deprecation warning when started via the legacy alias.
1087
+ * **`@objectstack/cli`** — `os dev` now prints the MCP endpoint, the agent-skill
1088
+ URL, and a ready-to-paste `claude mcp add` command on boot (gated on the HTTP
1089
+ surface being on), so the "an agent operates the app it's building" loop is
1090
+ discoverable at dev time.
1091
+ * **`create-objectstack`** — the blank scaffold README documents that the app is
1092
+ itself an MCP server (the serve side), distinct from the consume-side connector.
1093
+
1094
+ - 92f5f19: feat(runtime): sandbox budget is script CPU-time, not wall clock (ADR-0102 D1, #3295)
1095
+
1096
+ The QuickJS sandbox now meters each hook/action invocation against how much
1097
+ **VM-active (CPU) time** the body burns, not wall clock. Idle host-await time and
1098
+ a nested hook's own execution (which runs host-side while the caller's VM is
1099
+ parked) are no longer charged to the caller — so a slow/loaded host or a deep
1100
+ nested-write chain can't trip the budget while a script is merely waiting (the
1101
+ root cause of the #3259 CI flake). A separate, generous **wall-clock ceiling**
1102
+ (default 30s, `max(ceiling, cpuBudget)`) remains as the backstop for a body stuck
1103
+ on a host call that never settles.
1104
+
1105
+ What changes for consumers (behaviour, not API signatures):
1106
+
1107
+ - **Meaning of the timeout knobs.** `body.timeoutMs`, the `hookTimeoutMs` /
1108
+ `actionTimeoutMs` runner options, and `OS_SANDBOX_HOOK_TIMEOUT_MS` /
1109
+ `OS_SANDBOX_ACTION_TIMEOUT_MS` keep their **names, defaults (250ms / 5000ms),
1110
+ and precedence** — but now bound CPU-time instead of wall-clock. In practice
1111
+ this only _loosens_ legitimate slow/nested work; a runaway synchronous script
1112
+ is still cut at the same budget.
1113
+ - **Error messages.** `exceeded timeout of Nms` → either `exceeded CPU budget of
1114
+ Nms` (script burned its CPU budget) or `exceeded wall-clock ceiling of Nms
1115
+ while awaiting host calls` (stuck on a never-settling host call). Update any
1116
+ code/tests matching the old string.
1117
+
1118
+ New knobs (additive):
1119
+
1120
+ - `QuickJSScriptRunner` option `wallCeilingMs` and env `OS_SANDBOX_WALL_CEILING_MS`
1121
+ — tune the wall ceiling (explicit option › env › 30s).
1122
+ - `resolveSandboxTimeoutMs` (`@objectstack/types`) gains a `'wallCeiling'` kind.
1123
+
1124
+ Also fixes a latent init bug in the new accounting where the interrupt handler
1125
+ could fire during `installCtx` and corrupt ctx marshalling. The nested-write
1126
+ integration suites now run at the stock 250ms budget (previously forced to 10s),
1127
+ which is itself the regression guard for the nested-charging fix.
1128
+
1129
+ - 32899e6: feat(runtime): env-overridable sandbox hook/action timeout default (#3259)
1130
+
1131
+ The QuickJS sandbox enforces a wall-clock deadline on every hook/action
1132
+ invocation (250ms hooks / 5000ms actions). Each invocation compiles a fresh
1133
+ WASM module, and a nested hook compiles ANOTHER one inside the parent's budget,
1134
+ so on a heavily loaded or slow host — an oversubscribed CI runner, constrained
1135
+ production hardware — that fixed VM-creation cost alone can trip the hook
1136
+ default even while the VM is still making progress. On CI this surfaced as an
1137
+ intermittent `hook '…' exceeded timeout of 250ms` flake on PRs that never
1138
+ touched the sandbox path.
1139
+
1140
+ The per-invocation timeout DEFAULT is now resolvable from the environment via
1141
+ `resolveSandboxTimeoutMs` (`@objectstack/types`), which `QuickJSScriptRunner`
1142
+ consults, so an operator can raise the floor once, deployment-wide, instead of
1143
+ re-tuning every call site:
1144
+
1145
+ - `OS_SANDBOX_HOOK_TIMEOUT_MS` — default hook budget (ms)
1146
+ - `OS_SANDBOX_ACTION_TIMEOUT_MS` — default action budget (ms)
1147
+
1148
+ Precedence is unchanged: an explicit `hookTimeoutMs` / `actionTimeoutMs` passed
1149
+ to the runner still wins over the env var, and a body's own declared `timeoutMs`
1150
+ still wins over the resolved default (the smaller of the explicit values). Only
1151
+ a positive integer is honored; unset / empty / non-numeric / non-positive keeps
1152
+ the built-in 250ms / 5000ms defaults, so behaviour is byte-for-byte unchanged
1153
+ when the vars are absent — production is unaffected unless it opts in.
1154
+
1155
+ CI's Test Core now sets `OS_SANDBOX_HOOK_TIMEOUT_MS=10000` so the shared-runner
1156
+ load flake can't recur; genuine hangs stay bounded by each test's own timeout.
1157
+
1158
+ ### Patch Changes
1159
+
1160
+ - Updated dependencies [f972574]
1161
+ - Updated dependencies [6289ec3]
1162
+ - Updated dependencies [22013aa]
1163
+ - Updated dependencies [3ad3dd5]
1164
+ - Updated dependencies [8efa395]
1165
+ - Updated dependencies [3a18b60]
1166
+ - Updated dependencies [a8aa34c]
1167
+ - Updated dependencies [a3823b2]
1168
+ - Updated dependencies [43a3efb]
1169
+ - Updated dependencies [524696a]
1170
+ - Updated dependencies [bfa3c3f]
1171
+ - Updated dependencies [5e3301d]
1172
+ - Updated dependencies [46e876c]
1173
+ - Updated dependencies [158aa14]
1174
+ - Updated dependencies [62a2117]
1175
+ - Updated dependencies [d2723e2]
1176
+ - Updated dependencies [fefcd54]
1177
+ - Updated dependencies [beaf2de]
1178
+ - Updated dependencies [369eb6e]
1179
+ - Updated dependencies [06ff734]
1180
+ - Updated dependencies [b659111]
1181
+ - Updated dependencies [5754a23]
1182
+ - Updated dependencies [6c270a6]
1183
+ - Updated dependencies [668dd17]
1184
+ - Updated dependencies [8abf133]
1185
+ - Updated dependencies [e0859b1]
1186
+ - Updated dependencies [04ecd4e]
1187
+ - Updated dependencies [4d5a892]
1188
+ - Updated dependencies [16cebeb]
1189
+ - Updated dependencies [86d30af]
1190
+ - Updated dependencies [8923843]
1191
+ - Updated dependencies [a2795f6]
1192
+ - Updated dependencies [f16b492]
1193
+ - Updated dependencies [4b6fde8]
1194
+ - Updated dependencies [2018df9]
1195
+ - Updated dependencies [fc5a3a2]
1196
+ - Updated dependencies [8ff9210]
1197
+ - @objectstack/spec@16.0.0
1198
+
1199
+ ## 16.0.0-rc.1
1200
+
1201
+ ### Patch Changes
1202
+
1203
+ - Updated dependencies [6289ec3]
1204
+ - Updated dependencies [8efa395]
1205
+ - Updated dependencies [bfa3c3f]
1206
+ - Updated dependencies [62a2117]
1207
+ - Updated dependencies [06ff734]
1208
+ - @objectstack/spec@16.0.0-rc.1
1209
+
1210
+ ## 16.0.0-rc.0
1211
+
1212
+ ### Minor Changes
1213
+
1214
+ - 83e8f7d: feat(mcp): decouple the stdio auto-start switch from the HTTP surface + surface the MCP endpoint on `os dev` boot (#3167)
1215
+
1216
+ The MCP HTTP surface (`/api/v1/mcp`) and the long-lived stdio transport used to
1217
+ share one env var: `OS_MCP_SERVER_ENABLED=true` turned the HTTP surface on **and**
1218
+ silently auto-started the stdio transport — which bridges the raw metadata service
1219
+
1220
+ - data engine with no per-request principal (unscoped). An operator setting it to
1221
+ "make sure MCP is on" got an unscoped transport as a side effect.
1222
+
1223
+ * **`@objectstack/types`** — new `resolveMcpStdioAutoStart()`. Stdio auto-start is
1224
+ now its own switch, `OS_MCP_STDIO_ENABLED` (default off); `OS_MCP_SERVER_ENABLED`
1225
+ governs only the HTTP surface. The legacy `OS_MCP_SERVER_ENABLED=true` trigger
1226
+ still starts stdio for one release, flagged as deprecated. `=false` is unchanged
1227
+ (it only ever gated HTTP).
1228
+ * **`@objectstack/mcp`** — `MCPServerPlugin.start()` gates stdio on the new switch
1229
+ and logs a one-time deprecation warning when started via the legacy alias.
1230
+ * **`@objectstack/cli`** — `os dev` now prints the MCP endpoint, the agent-skill
1231
+ URL, and a ready-to-paste `claude mcp add` command on boot (gated on the HTTP
1232
+ surface being on), so the "an agent operates the app it's building" loop is
1233
+ discoverable at dev time.
1234
+ * **`create-objectstack`** — the blank scaffold README documents that the app is
1235
+ itself an MCP server (the serve side), distinct from the consume-side connector.
1236
+
1237
+ - 92f5f19: feat(runtime): sandbox budget is script CPU-time, not wall clock (ADR-0102 D1, #3295)
1238
+
1239
+ The QuickJS sandbox now meters each hook/action invocation against how much
1240
+ **VM-active (CPU) time** the body burns, not wall clock. Idle host-await time and
1241
+ a nested hook's own execution (which runs host-side while the caller's VM is
1242
+ parked) are no longer charged to the caller — so a slow/loaded host or a deep
1243
+ nested-write chain can't trip the budget while a script is merely waiting (the
1244
+ root cause of the #3259 CI flake). A separate, generous **wall-clock ceiling**
1245
+ (default 30s, `max(ceiling, cpuBudget)`) remains as the backstop for a body stuck
1246
+ on a host call that never settles.
1247
+
1248
+ What changes for consumers (behaviour, not API signatures):
1249
+
1250
+ - **Meaning of the timeout knobs.** `body.timeoutMs`, the `hookTimeoutMs` /
1251
+ `actionTimeoutMs` runner options, and `OS_SANDBOX_HOOK_TIMEOUT_MS` /
1252
+ `OS_SANDBOX_ACTION_TIMEOUT_MS` keep their **names, defaults (250ms / 5000ms),
1253
+ and precedence** — but now bound CPU-time instead of wall-clock. In practice
1254
+ this only _loosens_ legitimate slow/nested work; a runaway synchronous script
1255
+ is still cut at the same budget.
1256
+ - **Error messages.** `exceeded timeout of Nms` → either `exceeded CPU budget of
1257
+ Nms` (script burned its CPU budget) or `exceeded wall-clock ceiling of Nms
1258
+ while awaiting host calls` (stuck on a never-settling host call). Update any
1259
+ code/tests matching the old string.
1260
+
1261
+ New knobs (additive):
1262
+
1263
+ - `QuickJSScriptRunner` option `wallCeilingMs` and env `OS_SANDBOX_WALL_CEILING_MS`
1264
+ — tune the wall ceiling (explicit option › env › 30s).
1265
+ - `resolveSandboxTimeoutMs` (`@objectstack/types`) gains a `'wallCeiling'` kind.
1266
+
1267
+ Also fixes a latent init bug in the new accounting where the interrupt handler
1268
+ could fire during `installCtx` and corrupt ctx marshalling. The nested-write
1269
+ integration suites now run at the stock 250ms budget (previously forced to 10s),
1270
+ which is itself the regression guard for the nested-charging fix.
1271
+
1272
+ - 32899e6: feat(runtime): env-overridable sandbox hook/action timeout default (#3259)
1273
+
1274
+ The QuickJS sandbox enforces a wall-clock deadline on every hook/action
1275
+ invocation (250ms hooks / 5000ms actions). Each invocation compiles a fresh
1276
+ WASM module, and a nested hook compiles ANOTHER one inside the parent's budget,
1277
+ so on a heavily loaded or slow host — an oversubscribed CI runner, constrained
1278
+ production hardware — that fixed VM-creation cost alone can trip the hook
1279
+ default even while the VM is still making progress. On CI this surfaced as an
1280
+ intermittent `hook '…' exceeded timeout of 250ms` flake on PRs that never
1281
+ touched the sandbox path.
1282
+
1283
+ The per-invocation timeout DEFAULT is now resolvable from the environment via
1284
+ `resolveSandboxTimeoutMs` (`@objectstack/types`), which `QuickJSScriptRunner`
1285
+ consults, so an operator can raise the floor once, deployment-wide, instead of
1286
+ re-tuning every call site:
1287
+
1288
+ - `OS_SANDBOX_HOOK_TIMEOUT_MS` — default hook budget (ms)
1289
+ - `OS_SANDBOX_ACTION_TIMEOUT_MS` — default action budget (ms)
1290
+
1291
+ Precedence is unchanged: an explicit `hookTimeoutMs` / `actionTimeoutMs` passed
1292
+ to the runner still wins over the env var, and a body's own declared `timeoutMs`
1293
+ still wins over the resolved default (the smaller of the explicit values). Only
1294
+ a positive integer is honored; unset / empty / non-numeric / non-positive keeps
1295
+ the built-in 250ms / 5000ms defaults, so behaviour is byte-for-byte unchanged
1296
+ when the vars are absent — production is unaffected unless it opts in.
1297
+
1298
+ CI's Test Core now sets `OS_SANDBOX_HOOK_TIMEOUT_MS=10000` so the shared-runner
1299
+ load flake can't recur; genuine hangs stay bounded by each test's own timeout.
1300
+
1301
+ ### Patch Changes
1302
+
1303
+ - Updated dependencies [f972574]
1304
+ - Updated dependencies [22013aa]
1305
+ - Updated dependencies [3ad3dd5]
1306
+ - Updated dependencies [3a18b60]
1307
+ - Updated dependencies [a8aa34c]
1308
+ - Updated dependencies [a3823b2]
1309
+ - Updated dependencies [43a3efb]
1310
+ - Updated dependencies [524696a]
1311
+ - Updated dependencies [5e3301d]
1312
+ - Updated dependencies [46e876c]
1313
+ - Updated dependencies [158aa14]
1314
+ - Updated dependencies [d2723e2]
1315
+ - Updated dependencies [fefcd54]
1316
+ - Updated dependencies [beaf2de]
1317
+ - Updated dependencies [369eb6e]
1318
+ - Updated dependencies [b659111]
1319
+ - Updated dependencies [5754a23]
1320
+ - Updated dependencies [6c270a6]
1321
+ - Updated dependencies [668dd17]
1322
+ - Updated dependencies [8abf133]
1323
+ - Updated dependencies [e0859b1]
1324
+ - Updated dependencies [04ecd4e]
1325
+ - Updated dependencies [4d5a892]
1326
+ - Updated dependencies [16cebeb]
1327
+ - Updated dependencies [86d30af]
1328
+ - Updated dependencies [8923843]
1329
+ - Updated dependencies [a2795f6]
1330
+ - Updated dependencies [f16b492]
1331
+ - Updated dependencies [4b6fde8]
1332
+ - Updated dependencies [2018df9]
1333
+ - Updated dependencies [fc5a3a2]
1334
+ - @objectstack/spec@16.0.0-rc.0
1335
+
1336
+ ## 15.1.1
1337
+
1338
+ ### Patch Changes
1339
+
1340
+ - @objectstack/spec@15.1.1
1341
+
1342
+ ## 15.1.0
1343
+
1344
+ ### Minor Changes
1345
+
1346
+ - f531a26: Generic pinyin search recall (#2486, ADR-0098): a locale-gated
1347
+ `OS_SEARCH_PINYIN_ENABLED` switch (auto-on when the stack configures any
1348
+ `zh-*` locale) provisions a hidden `__search` companion column for each
1349
+ object's display/name field at compile time, the new
1350
+ `@objectstack/plugin-pinyin-search` fills it with full pinyin + initials
1351
+ ("张伟" → "zhangwei zw") on before-save (plus boot backfill and a
1352
+ `rebuildSearchCompanion` reconcile entry), and `$search` ORs the column in at
1353
+ query time — so lookup pickers, list quick-search and ⌘K transparently match
1354
+ `zhangwei` / `zw` against CJK names. Purely additive: `resolveSearchFields`,
1355
+ `searchableFields`, drivers and non-Chinese deployments are untouched; FLS
1356
+ restricted / secret / PII fields never feed the companion.
1357
+
1358
+ ### Patch Changes
1359
+
1360
+ - Updated dependencies [f531a26]
1361
+ - Updated dependencies [f531a26]
1362
+ - Updated dependencies [f531a26]
1363
+ - Updated dependencies [f531a26]
1364
+ - Updated dependencies [f531a26]
1365
+ - Updated dependencies [f531a26]
1366
+ - Updated dependencies [3fe9df1]
1367
+ - Updated dependencies [f531a26]
1368
+ - Updated dependencies [f531a26]
1369
+ - Updated dependencies [f531a26]
1370
+ - Updated dependencies [f531a26]
1371
+ - Updated dependencies [f531a26]
1372
+ - Updated dependencies [f531a26]
1373
+ - Updated dependencies [f531a26]
1374
+ - Updated dependencies [f531a26]
1375
+ - Updated dependencies [f531a26]
1376
+ - Updated dependencies [f531a26]
1377
+ - Updated dependencies [f531a26]
1378
+ - Updated dependencies [4109153]
1379
+ - Updated dependencies [f531a26]
1380
+ - Updated dependencies [f531a26]
1381
+ - Updated dependencies [f531a26]
1382
+ - Updated dependencies [f531a26]
1383
+ - Updated dependencies [f531a26]
1384
+ - Updated dependencies [f531a26]
1385
+ - Updated dependencies [627f225]
1386
+ - Updated dependencies [f531a26]
1387
+ - Updated dependencies [f531a26]
1388
+ - Updated dependencies [f531a26]
1389
+ - @objectstack/spec@15.1.0
1390
+
1391
+ ## 15.0.0
1392
+
1393
+ ### Patch Changes
1394
+
1395
+ - Updated dependencies [28b7c28]
1396
+ - Updated dependencies [13749ec]
1397
+ - Updated dependencies [e62c233]
1398
+ - Updated dependencies [ed61c9b]
1399
+ - Updated dependencies [31d04d4]
1400
+ - @objectstack/spec@15.0.0
1401
+
1402
+ ## 14.8.0
1403
+
1404
+ ### Patch Changes
1405
+
1406
+ - Updated dependencies [16b4bf6]
1407
+ - Updated dependencies [16b4bf6]
1408
+ - Updated dependencies [10e8983]
1409
+ - Updated dependencies [607aaf4]
1410
+ - Updated dependencies [bb71321]
1411
+ - @objectstack/spec@14.8.0
1412
+
1413
+ ## 14.7.0
1414
+
1415
+ ### Minor Changes
1416
+
1417
+ - 824a395: Tenancy mode as a first-class capability + a single owner for the user→membership
1418
+ lifecycle (ADR-0093, Phases 1–3).
1419
+
1420
+ **Tenancy service (`@objectstack/types`, `@objectstack/plugin-auth`).** plugin-auth
1421
+ registers a `tenancy` service — the single source of truth for tenancy mode
1422
+ (`mode`, `isolationActive`, `requested`, `degraded`, `defaultOrgId()`). It derives
1423
+ `isolationActive` from the presence of the `org-scoping` service, so the
1424
+ enterprise `@objectstack/organizations` package lights it up with no change.
1425
+ SecurityPlugin's RLS-strip gate and `/auth/config` (`features.multiOrgEnabled`,
1426
+ new `features.degradedTenancy`) now consume it instead of re-deriving the fact.
1427
+
1428
+ **Fail-fast on degraded tenancy (`@objectstack/cli`, ADR-0093 D5).**
1429
+ `OS_MULTI_ORG_ENABLED=true` without a working `@objectstack/organizations` now
1430
+ **refuses to boot** — a deployment that requested tenant isolation must not serve
1431
+ traffic without it (tenant RLS would be silently stripped). Escape hatch:
1432
+ `OS_ALLOW_DEGRADED_TENANCY=1` boots in an explicitly branded degraded state
1433
+ (`features.degradedTenancy`). **This may halt upgrades for deployments that were
1434
+ silently degraded — intentionally; install the enterprise package or set the
1435
+ escape hatch.**
1436
+
1437
+ **Membership reconciler (`@objectstack/plugin-auth`, ADR-0093 D1–D3, D6).** A
1438
+ single reconciler composed into better-auth's `user.create.after` hook owns the
1439
+ "every new user gets a membership" invariant across all creation paths (signup,
1440
+ admin create-user, import, SSO JIT). It yields to any existing membership (host
1441
+ hooks win), honors a new `membershipPolicy: 'auto' | 'invite-only'` auth option
1442
+ (default `auto`), and binds only to an unambiguous target org (single-org default;
1443
+ multi-org binds nothing). A bounded, idempotent `kernel:ready` backfill covers
1444
+ pre-existing member-less users in single-org/auto deployments
1445
+ (`OS_SKIP_MEMBERSHIP_BACKFILL=1` to opt out). The endpoint-level create-user bind
1446
+ from #2882 now delegates to this shared reconciler.
1447
+
1448
+ New env vars: `OS_ALLOW_DEGRADED_TENANCY`, `OS_SKIP_MEMBERSHIP_BACKFILL`. New docs:
1449
+ Deployment → Tenancy Modes & Membership.
1450
+
1451
+ ### Patch Changes
1452
+
1453
+ - Updated dependencies [d6a72eb]
1454
+ - @objectstack/spec@14.7.0
1455
+
1456
+ ## 14.6.0
1457
+
1458
+ ### Patch Changes
1459
+
1460
+ - Updated dependencies [609cb13]
1461
+ - Updated dependencies [ce6d151]
1462
+ - @objectstack/spec@14.6.0
1463
+
1464
+ ## 14.5.0
1465
+
1466
+ ### Patch Changes
1467
+
1468
+ - Updated dependencies [526805e]
1469
+ - Updated dependencies [d79ca07]
1470
+ - Updated dependencies [33ebd34]
1471
+ - Updated dependencies [c044f08]
1472
+ - Updated dependencies [01274eb]
1473
+ - @objectstack/spec@14.5.0
1474
+
1475
+ ## 14.4.0
1476
+
1477
+ ### Patch Changes
1478
+
1479
+ - Updated dependencies [7953832]
1480
+ - Updated dependencies [82e745e]
1481
+ - Updated dependencies [f3035bd]
1482
+ - Updated dependencies [82c0d94]
1483
+ - Updated dependencies [7449476]
1484
+ - @objectstack/spec@14.4.0
1485
+
1486
+ ## 14.3.0
1487
+
1488
+ ### Patch Changes
1489
+
1490
+ - Updated dependencies [2a71f48]
1491
+ - Updated dependencies [02f6af4]
1492
+ - Updated dependencies [c1064f1]
1493
+ - @objectstack/spec@14.3.0
1494
+
1495
+ ## 14.2.0
1496
+
1497
+ ### Patch Changes
1498
+
1499
+ - Updated dependencies [ac8f029]
1500
+ - Updated dependencies [4ab9958]
1501
+ - @objectstack/spec@14.2.0
1502
+
1503
+ ## 14.1.0
1504
+
1505
+ ### Patch Changes
1506
+
1507
+ - Updated dependencies [5a8465f]
1508
+ - Updated dependencies [7f8620b]
1509
+ - Updated dependencies [82ba3a6]
1510
+ - @objectstack/spec@14.1.0
1511
+
1512
+ ## 14.0.0
1513
+
1514
+ ### Patch Changes
1515
+
1516
+ - Updated dependencies [0a8e685]
1517
+ - Updated dependencies [afa8115]
1518
+ - Updated dependencies [80f12ca]
1519
+ - Updated dependencies [e2fa074]
1520
+ - Updated dependencies [23c8668]
1521
+ - Updated dependencies [29f017d]
1522
+ - Updated dependencies [216fa9a]
1523
+ - Updated dependencies [6c22b12]
1524
+ - @objectstack/spec@14.0.0
1525
+
1526
+ ## 13.0.0
1527
+
1528
+ ### Minor Changes
1529
+
1530
+ - 57b89b4: feat(mcp): the MCP surface is now **default-on** — a core platform capability (#2698)
1531
+
1532
+ `/api/v1/mcp` is served (and advertised in `/discovery`) out of the box; the
1533
+ OAuth 2.1 authorization track and Dynamic Client Registration follow it, so a
1534
+ fresh deployment is connectable by any MCP client with zero configuration.
1535
+ Operators opt OUT with `OS_MCP_SERVER_ENABLED=false`.
1536
+
1537
+ - New single decision point `isMcpServerEnabled()` in `@objectstack/types`
1538
+ (default on; explicit `false`/`0`/`off`/`no` disables). The runtime
1539
+ dispatcher's `/mcp` route gate, the CLI's MCP plugin auto-load, the REST
1540
+ `/discovery` advertisement, and the auth service's OAuth/DCR follow-defaults
1541
+ all delegate to it — the served route, the advertised route, and the
1542
+ authorization track can never disagree.
1543
+ - The env var is now effectively tri-state: unset → HTTP surface on;
1544
+ explicit `true` → additionally auto-start the long-lived **stdio** transport
1545
+ at boot (unchanged, still opt-in — a default must not claim the process's
1546
+ stdin/stdout); explicit `false` → everything off, fail-closed (404, no
1547
+ metadata, no DCR).
1548
+ - The OAuth 2.1 TLS rule is unaffected: on a plain-HTTP non-loopback origin
1549
+ the OAuth track stays dark and the default-on surface remains API-key-only.
1550
+
1551
+ ### Patch Changes
1552
+
1553
+ - Updated dependencies [6d83431]
1554
+ - Updated dependencies [01917c2]
1555
+ - Updated dependencies [b271691]
1556
+ - Updated dependencies [a5a1e41]
1557
+ - Updated dependencies [466adf6]
1558
+ - Updated dependencies [5be00c3]
1559
+ - Updated dependencies [466adf6]
1560
+ - Updated dependencies [2bee609]
1561
+ - Updated dependencies [fc7e7f7]
1562
+ - @objectstack/spec@13.0.0
1563
+
1564
+ ## 12.6.0
1565
+
1566
+ ### Patch Changes
1567
+
1568
+ - Updated dependencies [6cebf22]
1569
+ - @objectstack/spec@12.6.0
1570
+
1571
+ ## 12.5.0
1572
+
1573
+ ### Patch Changes
1574
+
1575
+ - Updated dependencies [8b3d363]
1576
+ - @objectstack/spec@12.5.0
1577
+
1578
+ ## 12.4.0
1579
+
1580
+ ### Patch Changes
1581
+
1582
+ - Updated dependencies [60dc3ba]
1583
+ - @objectstack/spec@12.4.0
1584
+
1585
+ ## 12.3.0
1586
+
1587
+ ### Patch Changes
1588
+
1589
+ - Updated dependencies [e7eceec]
1590
+ - @objectstack/spec@12.3.0
1591
+
1592
+ ## 12.2.0
1593
+
1594
+ ### Patch Changes
1595
+
1596
+ - Updated dependencies [fce8ff4]
1597
+ - Updated dependencies [3962023]
1598
+ - Updated dependencies [2bb193d]
1599
+ - Updated dependencies [0426d27]
1600
+ - Updated dependencies [da807f7]
1601
+ - @objectstack/spec@12.2.0
1602
+
1603
+ ## 12.1.0
1604
+
1605
+ ### Patch Changes
1606
+
1607
+ - Updated dependencies [93e6d02]
1608
+ - @objectstack/spec@12.1.0
1609
+
1610
+ ## 12.0.0
1611
+
1612
+ ### Patch Changes
1613
+
1614
+ - Updated dependencies [a8df396]
1615
+ - Updated dependencies [e695fe0]
1616
+ - Updated dependencies [7c09621]
1617
+ - Updated dependencies [7709db4]
1618
+ - Updated dependencies [2082109]
1619
+ - Updated dependencies [7c09621]
1620
+ - Updated dependencies [9860de4]
1621
+ - Updated dependencies [069c205]
1622
+ - @objectstack/spec@12.0.0
1623
+
1624
+ ## 11.10.0
1625
+
1626
+ ### Patch Changes
1627
+
1628
+ - Updated dependencies [6a9397e]
1629
+ - Updated dependencies [c0efe5d]
1630
+ - @objectstack/spec@11.10.0
1631
+
1632
+ ## 11.9.0
1633
+
1634
+ ### Patch Changes
1635
+
1636
+ - Updated dependencies [d3595d9]
1637
+ - @objectstack/spec@11.9.0
1638
+
1639
+ ## 11.8.0
1640
+
1641
+ ### Patch Changes
1642
+
1643
+ - @objectstack/spec@11.8.0
1644
+
1645
+ ## 11.7.0
1646
+
1647
+ ### Patch Changes
1648
+
1649
+ - Updated dependencies [5178906]
1650
+ - @objectstack/spec@11.7.0
1651
+
1652
+ ## 11.6.0
1653
+
1654
+ ### Patch Changes
1655
+
1656
+ - @objectstack/spec@11.6.0
1657
+
1658
+ ## 11.5.0
1659
+
1660
+ ### Patch Changes
1661
+
1662
+ - Updated dependencies [6ee4f04]
1663
+ - Updated dependencies [c1e3a65]
1664
+ - @objectstack/spec@11.5.0
1665
+
1666
+ ## 11.4.0
1667
+
1668
+ ### Patch Changes
1669
+
1670
+ - Updated dependencies [5821c51]
1671
+ - Updated dependencies [a0fce3f]
1672
+ - @objectstack/spec@11.4.0
1673
+
1674
+ ## 11.3.0
1675
+
1676
+ ### Patch Changes
1677
+
1678
+ - Updated dependencies [58e8e31]
1679
+ - Updated dependencies [b4a5df0]
1680
+ - @objectstack/spec@11.3.0
1681
+
1682
+ ## 11.2.0
1683
+
1684
+ ### Patch Changes
1685
+
1686
+ - Updated dependencies [d0f4b13]
1687
+ - Updated dependencies [302bdab]
1688
+ - @objectstack/spec@11.2.0
1689
+
1690
+ ## 11.1.0
1691
+
1692
+ ### Minor Changes
1693
+
1694
+ - fdb41c0: Remove ObjectStack's own legacy env-var aliases (11.0); ecosystem-standard names stay.
1695
+
1696
+ The framework's renamed env vars no longer accept their old ObjectStack names —
1697
+ rename them:
1698
+
1699
+ | removed legacy name | use |
1700
+ | ----------------------------------- | ---------------------- |
1701
+ | `OS_MULTI_TENANT` | `OS_MULTI_ORG_ENABLED` |
1702
+ | `OBJECTSTACK_METADATA_WRITABLE` | `OS_METADATA_WRITABLE` |
1703
+ | `OS_AUTH_BASE_URL`, `AUTH_BASE_URL` | `OS_AUTH_URL` |
1704
+
1705
+ **Ecosystem-standard names are NOT removed** — they remain accepted (and no longer
1706
+ emit a deprecation warning, since they are permanent conventions, not legacy):
1707
+ `DATABASE_URL`, `AUTH_SECRET`, `BETTER_AUTH_SECRET`, `BETTER_AUTH_URL`, `PORT`,
1708
+ `CORS_*`, `LOG_LEVEL`, `ROOT_DOMAIN`, `MCP_SERVER_*`. The generic
1709
+ `readEnvWithDeprecation` helper is unchanged.
1710
+
1711
+ ### Patch Changes
1712
+
1713
+ - Updated dependencies [ecf193f]
1714
+ - Updated dependencies [51bec81]
1715
+ - Updated dependencies [3e593a7]
1716
+ - Updated dependencies [63d5403]
1717
+ - @objectstack/spec@11.1.0
1718
+
1719
+ ## 11.0.0
1720
+
1721
+ ### Patch Changes
1722
+
1723
+ - 795b6d1: refactor: single-source the multi-org (`OS_MULTI_ORG_ENABLED`) flag resolution
1724
+
1725
+ "Is this deployment multi-org?" was resolved in 10 places across 8 packages
1726
+ with three subtly different inline expressions:
1727
+
1728
+ - the canonical `String(readEnvWithDeprecation('OS_MULTI_ORG_ENABLED',
1729
+ 'OS_MULTI_TENANT') ?? 'false').toLowerCase() !== 'false'` (objectql registry,
1730
+ plugin-dev, runtime app-plugin, cli serve/verify, cloud-connection),
1731
+ - a redundant `env.OS_MULTI_ORG_ENABLED !== undefined ? … : …` variant in
1732
+ plugin-auth (auth-manager `/auth/config` features + `beforeCreateOrganization`
1733
+ guard),
1734
+ - and a bare `process.env.OS_MULTI_ORG_ENABLED ?? process.env.OS_MULTI_TENANT`
1735
+ read in the SQL driver's `isMultiTenantMode()` — which skipped the
1736
+ `OS_MULTI_TENANT` deprecation warning every other site emits.
1737
+
1738
+ Because the SQL driver computed the mode independently of the auth/security
1739
+ layer, the driver's tenant-audit gate and the rest of the system could in
1740
+ principle disagree about whether tenant isolation is active.
1741
+
1742
+ Introduces `resolveMultiOrgEnabled()` in `@objectstack/types` (next to
1743
+ `readEnvWithDeprecation`, the natural leaf dependency) as the single source of
1744
+ truth, and routes all 10 sites through it. `@objectstack/driver-sql` gains a
1745
+ direct `@objectstack/types` dependency (previously it read `process.env`
1746
+ directly).
1747
+
1748
+ Behaviour is unchanged everywhere except the SQL driver, which now also emits
1749
+ the one-shot `OS_MULTI_TENANT`-is-deprecated warning — consistent with every
1750
+ other site. This mirrors the `resolveAuthzContext` single-source pattern in
1751
+ `@objectstack/core`. Follow-up (not in this change): a lint gate forbidding new
1752
+ inline reads of these env vars outside the helper.
1753
+
1754
+ - Updated dependencies [ab5718a]
1755
+ - Updated dependencies [4845c12]
1756
+ - Updated dependencies [c1a754a]
1757
+ - Updated dependencies [6fbe91f]
1758
+ - Updated dependencies [715d667]
1759
+ - Updated dependencies [5eef4cf]
1760
+ - Updated dependencies [72759e1]
1761
+ - Updated dependencies [6c4fbd9]
1762
+ - Updated dependencies [ef3ed67]
1763
+ - Updated dependencies [cd51229]
1764
+ - Updated dependencies [7697a0e]
1765
+ - Updated dependencies [e7e04f1]
1766
+ - Updated dependencies [cfd5ac4]
1767
+ - Updated dependencies [2be5c1f]
1768
+ - Updated dependencies [ad143ce]
1769
+ - Updated dependencies [5c4a8c8]
1770
+ - Updated dependencies [3afaeed]
1771
+ - Updated dependencies [8801c02]
1772
+ - Updated dependencies [3d04e06]
1773
+ - Updated dependencies [4a84c98]
1774
+ - Updated dependencies [d980f0d]
1775
+ - Updated dependencies [a658523]
1776
+ - Updated dependencies [82ff91c]
1777
+ - Updated dependencies [638f472]
1778
+ - @objectstack/spec@11.0.0
1779
+
1780
+ ## 10.3.0
1781
+
1782
+ ### Patch Changes
1783
+
1784
+ - @objectstack/spec@10.3.0
1785
+
1786
+ ## 10.2.0
1787
+
1788
+ ### Patch Changes
1789
+
1790
+ - Updated dependencies [b496498]
1791
+ - @objectstack/spec@10.2.0
1792
+
1793
+ ## 10.1.0
1794
+
1795
+ ### Patch Changes
1796
+
1797
+ - Updated dependencies [49da36e]
1798
+ - Updated dependencies [ac79f16]
1799
+ - @objectstack/spec@10.1.0
1800
+
1801
+ ## 10.0.0
1802
+
1803
+ ### Patch Changes
1804
+
1805
+ - Updated dependencies [d7ff626]
1806
+ - Updated dependencies [2a1b16b]
1807
+ - Updated dependencies [e16f2a8]
1808
+ - Updated dependencies [e411a82]
1809
+ - Updated dependencies [a581385]
1810
+ - Updated dependencies [220ce5b]
1811
+ - Updated dependencies [3efe334]
1812
+ - Updated dependencies [feead7e]
1813
+ - Updated dependencies [6ca20b3]
1814
+ - Updated dependencies [5f875fe]
1815
+ - Updated dependencies [b469950]
1816
+ - @objectstack/spec@10.0.0
1817
+
1818
+ ## 9.11.0
1819
+
1820
+ ### Patch Changes
1821
+
1822
+ - Updated dependencies [e7f6539]
1823
+ - Updated dependencies [2365d07]
1824
+ - Updated dependencies [6595b53]
1825
+ - Updated dependencies [fa8964d]
1826
+ - Updated dependencies [36138c7]
1827
+ - Updated dependencies [a8e4f3b]
1828
+ - Updated dependencies [4c213c2]
1829
+ - Updated dependencies [2afb612]
1830
+ - @objectstack/spec@9.11.0
1831
+
1832
+ ## 9.10.0
1833
+
1834
+ ### Patch Changes
1835
+
1836
+ - Updated dependencies [db02bd5]
1837
+ - Updated dependencies [641675d]
1838
+ - Updated dependencies [94e9040]
1839
+ - Updated dependencies [1f88fd9]
1840
+ - Updated dependencies [1f88fd9]
1841
+ - @objectstack/spec@9.10.0
1842
+
1843
+ ## 9.9.1
1844
+
1845
+ ### Patch Changes
1846
+
1847
+ - @objectstack/spec@9.9.1
1848
+
1849
+ ## 9.9.0
1850
+
1851
+ ### Patch Changes
1852
+
1853
+ - Updated dependencies [84249a4]
1854
+ - Updated dependencies [11af299]
1855
+ - Updated dependencies [d5774b5]
1856
+ - Updated dependencies [134043a]
1857
+ - Updated dependencies [90108e0]
1858
+ - Updated dependencies [9afeb2d]
1859
+ - Updated dependencies [6bec07e]
1860
+ - Updated dependencies [601cc11]
1861
+ - Updated dependencies [575448d]
1862
+ - @objectstack/spec@9.9.0
1863
+
1864
+ ## 9.8.0
1865
+
1866
+ ### Patch Changes
1867
+
1868
+ - Updated dependencies [97c55b3]
1869
+ - Updated dependencies [1b1f490]
1870
+ - @objectstack/spec@9.8.0
1871
+
1872
+ ## 9.7.0
1873
+
1874
+ ### Patch Changes
1875
+
1876
+ - @objectstack/spec@9.7.0
1877
+
1878
+ ## 9.6.0
1879
+
1880
+ ### Patch Changes
1881
+
1882
+ - Updated dependencies [d1e930a]
1883
+ - Updated dependencies [71578f2]
1884
+ - Updated dependencies [5e3a301]
1885
+ - Updated dependencies [5db2742]
1886
+ - @objectstack/spec@9.6.0
1887
+
1888
+ ## 9.5.1
1889
+
1890
+ ### Patch Changes
1891
+
1892
+ - Updated dependencies [ee72aae]
1893
+ - @objectstack/spec@9.5.1
1894
+
1895
+ ## 9.5.0
1896
+
1897
+ ### Patch Changes
1898
+
1899
+ - Updated dependencies [d08551c]
1900
+ - Updated dependencies [707aeed]
1901
+ - Updated dependencies [7a103d4]
1902
+ - Updated dependencies [4b01250]
1903
+ - @objectstack/spec@9.5.0
1904
+
1905
+ ## 9.4.0
1906
+
1907
+ ### Patch Changes
1908
+
1909
+ - Updated dependencies [060467a]
1910
+ - Updated dependencies [0856476]
1911
+ - Updated dependencies [b678d8c]
1912
+ - Updated dependencies [b678d8c]
1913
+ - Updated dependencies [b678d8c]
1914
+ - @objectstack/spec@9.4.0
1915
+
1916
+ ## 9.3.0
1917
+
1918
+ ### Patch Changes
1919
+
1920
+ - Updated dependencies [1ada658]
1921
+ - Updated dependencies [3219191]
1922
+ - Updated dependencies [290f631]
1923
+ - Updated dependencies [50b7b47]
1924
+ - Updated dependencies [f15d6f6]
1925
+ - Updated dependencies [f8684ea]
1926
+ - Updated dependencies [b4765be]
1927
+ - @objectstack/spec@9.3.0
1928
+
1929
+ ## 9.2.0
1930
+
1931
+ ### Patch Changes
1932
+
1933
+ - Updated dependencies [2f57b75]
1934
+ - Updated dependencies [2f57b75]
1935
+ - @objectstack/spec@9.2.0
1936
+
1937
+ ## 9.1.0
1938
+
1939
+ ### Patch Changes
1940
+
1941
+ - Updated dependencies [b9062c9]
1942
+ - @objectstack/spec@9.1.0
1943
+
1944
+ ## 9.0.1
1945
+
1946
+ ### Patch Changes
1947
+
1948
+ - Updated dependencies [1817845]
1949
+ - @objectstack/spec@9.0.1
1950
+
1951
+ ## 9.0.0
1952
+
1953
+ ### Patch Changes
1954
+
1955
+ - Updated dependencies [4c3f693]
1956
+ - Updated dependencies [0bf39f1]
1957
+ - Updated dependencies [f533f42]
1958
+ - Updated dependencies [1c83ee8]
1959
+ - @objectstack/spec@9.0.0
1960
+
1961
+ ## 8.0.1
1962
+
1963
+ ### Patch Changes
1964
+
1965
+ - @objectstack/spec@8.0.1
1966
+
1967
+ ## 8.0.0
1968
+
1969
+ ### Patch Changes
1970
+
1971
+ - Updated dependencies [a46c017]
1972
+ - Updated dependencies [b990b89]
1973
+ - Updated dependencies [99111ec]
1974
+ - Updated dependencies [d5a8161]
1975
+ - Updated dependencies [5cf1f1b]
1976
+ - Updated dependencies [9ef89d4]
1977
+ - Updated dependencies [3306d2f]
1978
+ - Updated dependencies [bc44195]
1979
+ - Updated dependencies [9e2e229]
1980
+ - @objectstack/spec@8.0.0
1981
+
1982
+ ## 7.9.0
1983
+
1984
+ ### Patch Changes
1985
+
1986
+ - @objectstack/spec@7.9.0
1987
+
1988
+ ## 7.8.0
1989
+
1990
+ ### Patch Changes
1991
+
1992
+ - Updated dependencies [06f2bbb]
1993
+ - Updated dependencies [36719db]
1994
+ - Updated dependencies [424ab26]
1995
+ - @objectstack/spec@7.8.0
1996
+
1997
+ ## 7.7.0
1998
+
1999
+ ### Patch Changes
2000
+
2001
+ - Updated dependencies [b391955]
2002
+ - Updated dependencies [f06b64e]
2003
+ - Updated dependencies [023bf93]
2004
+ - @objectstack/spec@7.7.0
2005
+
2006
+ ## 7.6.0
2007
+
2008
+ ### Patch Changes
2009
+
2010
+ - Updated dependencies [955d4c8]
2011
+ - Updated dependencies [c4a4cbd]
2012
+ - Updated dependencies [b046ec2]
2013
+ - Updated dependencies [2170ad9]
2014
+ - Updated dependencies [02d6359]
2015
+ - Updated dependencies [7648242]
2016
+ - Updated dependencies [8fa1e7f]
2017
+ - Updated dependencies [55866f5]
2018
+ - Updated dependencies [60f9c45]
2019
+ - @objectstack/spec@7.6.0
2020
+
2021
+ ## 7.5.0
2022
+
2023
+ ### Patch Changes
2024
+
2025
+ - @objectstack/spec@7.5.0
2026
+
2027
+ ## 7.4.1
2028
+
2029
+ ### Patch Changes
2030
+
2031
+ - @objectstack/spec@7.4.1
2032
+
2033
+ ## 7.4.0
2034
+
2035
+ ### Patch Changes
2036
+
2037
+ - Updated dependencies [23c7107]
2038
+ - Updated dependencies [c72daad]
2039
+ - Updated dependencies [f115182]
2040
+ - Updated dependencies [2faf9f2]
2041
+ - Updated dependencies [2faf9f2]
2042
+ - Updated dependencies [2faf9f2]
2043
+ - Updated dependencies [58b450b]
2044
+ - Updated dependencies [82eb6cf]
2045
+ - Updated dependencies [13d8653]
2046
+ - Updated dependencies [ff3d006]
2047
+ - Updated dependencies [5e831de]
2048
+ - @objectstack/spec@7.4.0
2049
+
2050
+ ## 7.3.0
2051
+
2052
+ ### Patch Changes
2053
+
2054
+ - Updated dependencies [5e7c554]
2055
+ - @objectstack/spec@7.3.0
2056
+
2057
+ ## 7.2.1
2058
+
2059
+ ### Patch Changes
2060
+
2061
+ - 9096dfe: **`OS_` env-var prefix migration** (issue #1382).
2062
+
2063
+ All ObjectStack-owned environment variables now use the `OS_` prefix. Legacy
2064
+ names still work for one release and emit a one-shot deprecation warning via
2065
+ the new `readEnvWithDeprecation()` helper in `@objectstack/types`.
2066
+
2067
+ **Renamed (with legacy fallback):**
2068
+
2069
+ | New | Legacy (deprecated) |
2070
+ | :------------------------ | :----------------------------------------------------- |
2071
+ | `OS_AUTH_SECRET` | `AUTH_SECRET`, `BETTER_AUTH_SECRET` |
2072
+ | `OS_AUTH_URL` | `AUTH_BASE_URL`, `BETTER_AUTH_URL`, `OS_AUTH_BASE_URL` |
2073
+ | `OS_PORT` | `PORT` |
2074
+ | `OS_DATABASE_URL` | `DATABASE_URL` |
2075
+ | `OS_ROOT_DOMAIN` | `ROOT_DOMAIN` |
2076
+ | `OS_MULTI_ORG_ENABLED` | `OS_MULTI_TENANT` |
2077
+ | `OS_CORS_ENABLED` | `CORS_ENABLED` |
2078
+ | `OS_CORS_ORIGIN` | `CORS_ORIGIN` |
2079
+ | `OS_CORS_CREDENTIALS` | `CORS_CREDENTIALS` |
2080
+ | `OS_CORS_MAX_AGE` | `CORS_MAX_AGE` |
2081
+ | `OS_AI_MODEL` | `AI_MODEL` |
2082
+ | `OS_MCP_SERVER_ENABLED` | `MCP_SERVER_ENABLED` |
2083
+ | `OS_MCP_SERVER_NAME` | `MCP_SERVER_NAME` |
2084
+ | `OS_MCP_SERVER_TRANSPORT` | `MCP_SERVER_TRANSPORT` |
2085
+ | `OS_NODE_ID` | `OBJECTSTACK_NODE_ID` |
2086
+ | `OS_METADATA_WRITABLE` | `OBJECTSTACK_METADATA_WRITABLE` |
2087
+ | `OS_DEV_CRYPTO_KEY` | `OBJECTSTACK_DEV_CRYPTO_KEY` |
2088
+ | `OS_HOME` | `OBJECTSTACK_HOME` |
2089
+
2090
+ **Migration:** rename in your `.env`. Legacy names continue to work this
2091
+ release and will be removed in a future major. Industry-standard names
2092
+ (`NODE_ENV`, `HOME`, `OPENAI_API_KEY`, `TURSO_*`, OAuth
2093
+ `*_CLIENT_ID/SECRET`, `RESEND_API_KEY`, `POSTMARK_TOKEN`,
2094
+ `AI_GATEWAY_*`, `SMTP_*`) are NOT renamed.
2095
+
2096
+ - @objectstack/spec@7.2.1
2097
+
2098
+ ## 7.2.0
2099
+
2100
+ ### Patch Changes
2101
+
2102
+ - @objectstack/spec@7.2.0
2103
+
2104
+ ## 7.1.0
2105
+
2106
+ ### Patch Changes
2107
+
2108
+ - Updated dependencies [47a92f4]
2109
+ - @objectstack/spec@7.1.0
2110
+
2111
+ ## 7.0.0
2112
+
2113
+ ### Patch Changes
2114
+
2115
+ - Updated dependencies [74470ad]
2116
+ - Updated dependencies [d29617e]
2117
+ - Updated dependencies [dc72172]
2118
+ - @objectstack/spec@7.0.0
2119
+
2120
+ ## 6.9.0
2121
+
2122
+ ### Patch Changes
2123
+
2124
+ - @objectstack/spec@6.9.0
2125
+
2126
+ ## 6.8.1
2127
+
2128
+ ### Patch Changes
2129
+
2130
+ - @objectstack/spec@6.8.1
2131
+
2132
+ ## 6.8.0
2133
+
2134
+ ### Patch Changes
2135
+
2136
+ - Updated dependencies [6e88f77]
2137
+ - Updated dependencies [c8b9f57]
2138
+ - @objectstack/spec@6.8.0
2139
+
2140
+ ## 6.7.1
2141
+
2142
+ ### Patch Changes
2143
+
2144
+ - @objectstack/spec@6.7.1
2145
+
2146
+ ## 6.7.0
2147
+
2148
+ ### Patch Changes
2149
+
2150
+ - Updated dependencies [430067b]
2151
+ - Updated dependencies [4f9e9d4]
2152
+ - @objectstack/spec@6.7.0
2153
+
2154
+ ## 6.6.0
2155
+
2156
+ ### Patch Changes
2157
+
2158
+ - Updated dependencies [a49cfc2]
2159
+ - @objectstack/spec@6.6.0
2160
+
2161
+ ## 6.5.1
2162
+
2163
+ ### Patch Changes
2164
+
2165
+ - @objectstack/spec@6.5.1
2166
+
2167
+ ## 6.5.0
2168
+
2169
+ ### Patch Changes
2170
+
2171
+ - @objectstack/spec@6.5.0
2172
+
2173
+ ## 6.4.0
2174
+
2175
+ ### Patch Changes
2176
+
2177
+ - Updated dependencies [f8651cc]
2178
+ - Updated dependencies [f8651cc]
2179
+ - Updated dependencies [0bf6f9a]
2180
+ - @objectstack/spec@6.4.0
2181
+
2182
+ ## 6.3.0
2183
+
2184
+ ### Patch Changes
2185
+
2186
+ - @objectstack/spec@6.3.0
2187
+
2188
+ ## 6.2.0
2189
+
2190
+ ### Patch Changes
2191
+
2192
+ - Updated dependencies [b4c74a9]
2193
+ - @objectstack/spec@6.2.0
2194
+
2195
+ ## 6.1.1
2196
+
2197
+ ### Patch Changes
2198
+
2199
+ - @objectstack/spec@6.1.1
2200
+
2201
+ ## 6.1.0
2202
+
2203
+ ### Patch Changes
2204
+
2205
+ - Updated dependencies [93c0589]
2206
+ - @objectstack/spec@6.1.0
2207
+
2208
+ ## 6.0.0
2209
+
2210
+ ### Patch Changes
2211
+
2212
+ - Updated dependencies [629a716]
2213
+ - Updated dependencies [dbc4f7d]
2214
+ - Updated dependencies [944f187]
2215
+ - @objectstack/spec@6.0.0
2216
+
2217
+ ## 5.2.0
2218
+
2219
+ ### Patch Changes
2220
+
2221
+ - Updated dependencies [bab2b20]
2222
+ - Updated dependencies [fa011d8]
2223
+ - Updated dependencies [b806f58]
2224
+ - @objectstack/spec@5.2.0
2225
+
2226
+ ## 5.1.0
2227
+
2228
+ ### Patch Changes
2229
+
2230
+ - Updated dependencies [75f4ee6]
2231
+ - Updated dependencies [823d559]
2232
+ - @objectstack/spec@5.1.0
2233
+
2234
+ ## 5.0.0
2235
+
2236
+ ### Patch Changes
2237
+
2238
+ - Updated dependencies [2f9073a]
2239
+ - @objectstack/spec@5.0.0
2240
+
2241
+ ## 4.2.0
2242
+
2243
+ ### Patch Changes
2244
+
2245
+ - Updated dependencies [2869891]
2246
+ - @objectstack/spec@4.2.0
2247
+
2248
+ ## 4.1.1
2249
+
2250
+ ### Patch Changes
2251
+
2252
+ - @objectstack/spec@4.1.1
2253
+
2254
+ ## 4.1.0
2255
+
2256
+ ### Patch Changes
2257
+
2258
+ - Updated dependencies [2108c30]
2259
+ - Updated dependencies [23db640]
2260
+ - @objectstack/spec@4.1.0
2261
+
2262
+ ## 4.0.5
2263
+
2264
+ ### Patch Changes
2265
+
2266
+ - 15e0df6: chore: unify all package versions to a single patch release
2267
+ - Updated dependencies [15e0df6]
2268
+ - @objectstack/spec@4.0.5
2269
+
2270
+ ## 4.0.4
2271
+
2272
+ ### Patch Changes
2273
+
2274
+ - Updated dependencies [326b66b]
2275
+ - @objectstack/spec@4.0.4
2276
+
2277
+ ## 4.0.3
2278
+
2279
+ ### Patch Changes
2280
+
2281
+ - @objectstack/spec@4.0.3
2282
+
2283
+ ## 4.0.2
2284
+
2285
+ ### Patch Changes
2286
+
2287
+ - Updated dependencies [5f659e9]
2288
+ - @objectstack/spec@4.0.2
2289
+
2290
+ ## 4.0.0
2291
+
2292
+ ### Patch Changes
2293
+
2294
+ - Updated dependencies [f08ffc3]
2295
+ - Updated dependencies [e0b0a78]
2296
+ - @objectstack/spec@4.0.0
2297
+
2298
+ ## 3.3.1
2299
+
2300
+ ### Patch Changes
2301
+
2302
+ - @objectstack/spec@3.3.1
2303
+
2304
+ ## 3.3.0
2305
+
2306
+ ### Patch Changes
2307
+
2308
+ - @objectstack/spec@3.3.0
2309
+
2310
+ ## 3.2.9
2311
+
2312
+ ### Patch Changes
2313
+
2314
+ - @objectstack/spec@3.2.9
2315
+
2316
+ ## 3.2.8
2317
+
2318
+ ### Patch Changes
2319
+
2320
+ - @objectstack/spec@3.2.8
2321
+
2322
+ ## 3.2.7
2323
+
2324
+ ### Patch Changes
2325
+
2326
+ - @objectstack/spec@3.2.7
2327
+
2328
+ ## 3.2.6
2329
+
2330
+ ### Patch Changes
2331
+
2332
+ - @objectstack/spec@3.2.6
2333
+
2334
+ ## 3.2.5
2335
+
2336
+ ### Patch Changes
2337
+
2338
+ - @objectstack/spec@3.2.5
2339
+
2340
+ ## 3.2.4
2341
+
2342
+ ### Patch Changes
2343
+
2344
+ - @objectstack/spec@3.2.4
2345
+
2346
+ ## 3.2.3
2347
+
2348
+ ### Patch Changes
2349
+
2350
+ - @objectstack/spec@3.2.3
2351
+
2352
+ ## 3.2.2
2353
+
2354
+ ### Patch Changes
2355
+
2356
+ - Updated dependencies [46defbb]
2357
+ - @objectstack/spec@3.2.2
2358
+
2359
+ ## 3.2.1
2360
+
2361
+ ### Patch Changes
2362
+
2363
+ - Updated dependencies [850b546]
2364
+ - @objectstack/spec@3.2.1
2365
+
2366
+ ## 3.2.0
2367
+
2368
+ ### Patch Changes
2369
+
2370
+ - Updated dependencies [5901c29]
2371
+ - @objectstack/spec@3.2.0
2372
+
2373
+ ## 3.1.1
2374
+
2375
+ ### Patch Changes
2376
+
2377
+ - Updated dependencies [953d667]
2378
+ - @objectstack/spec@3.1.1
2379
+
2380
+ ## 3.1.0
2381
+
2382
+ ### Patch Changes
2383
+
2384
+ - Updated dependencies [0088830]
2385
+ - @objectstack/spec@3.1.0
2386
+
2387
+ ## 3.0.11
2388
+
2389
+ ### Patch Changes
2390
+
2391
+ - Updated dependencies [92d9d99]
2392
+ - @objectstack/spec@3.0.11
2393
+
2394
+ ## 3.0.10
2395
+
2396
+ ### Patch Changes
2397
+
2398
+ - Updated dependencies [d1e5d31]
2399
+ - @objectstack/spec@3.0.10
2400
+
2401
+ ## 3.0.9
2402
+
2403
+ ### Patch Changes
2404
+
2405
+ - Updated dependencies [15e0df6]
2406
+ - @objectstack/spec@3.0.9
2407
+
2408
+ ## 3.0.8
2409
+
2410
+ ### Patch Changes
2411
+
2412
+ - Updated dependencies [5a968a2]
2413
+ - @objectstack/spec@3.0.8
2414
+
2415
+ ## 3.0.7
2416
+
2417
+ ### Patch Changes
2418
+
2419
+ - Updated dependencies [0119bd7]
2420
+ - Updated dependencies [5426bdf]
2421
+ - @objectstack/spec@3.0.7
2422
+
2423
+ ## 3.0.6
2424
+
2425
+ ### Patch Changes
2426
+
2427
+ - Updated dependencies [5df254c]
2428
+ - @objectstack/spec@3.0.6
2429
+
2430
+ ## 3.0.5
2431
+
2432
+ ### Patch Changes
2433
+
2434
+ - Updated dependencies [23a4a68]
2435
+ - @objectstack/spec@3.0.5
2436
+
2437
+ ## 3.0.4
2438
+
2439
+ ### Patch Changes
2440
+
2441
+ - Updated dependencies [d738987]
2442
+ - @objectstack/spec@3.0.4
2443
+
2444
+ ## 3.0.3
2445
+
2446
+ ### Patch Changes
2447
+
2448
+ - c7267f6: Patch release for maintenance updates and improvements.
2449
+ - Updated dependencies [c7267f6]
2450
+ - @objectstack/spec@3.0.3
2451
+
2452
+ ## 3.0.2
2453
+
2454
+ ### Patch Changes
2455
+
2456
+ - Updated dependencies [28985f5]
2457
+ - @objectstack/spec@3.0.2
2458
+
2459
+ ## 3.0.1
2460
+
2461
+ ### Patch Changes
2462
+
2463
+ - Updated dependencies [389725a]
2464
+ - @objectstack/spec@3.0.1
2465
+
2466
+ ## 3.0.0
2467
+
2468
+ ### Major Changes
2469
+
2470
+ - Release v3.0.0 — unified version bump for all ObjectStack packages.
2471
+
2472
+ ### Patch Changes
2473
+
2474
+ - Updated dependencies
2475
+ - @objectstack/spec@3.0.0
2476
+
2477
+ ## 2.0.7
2478
+
2479
+ ### Patch Changes
2480
+
2481
+ - Updated dependencies
2482
+ - @objectstack/spec@2.0.7
2483
+
2484
+ ## 2.0.6
2485
+
2486
+ ### Patch Changes
2487
+
2488
+ - Patch release for maintenance and stability improvements
2489
+ - Updated dependencies
2490
+ - @objectstack/spec@2.0.6
2491
+
2492
+ ## 2.0.5
2493
+
2494
+ ### Patch Changes
2495
+
2496
+ - Updated dependencies
2497
+ - @objectstack/spec@2.0.5
2498
+
2499
+ ## 2.0.4
2500
+
2501
+ ### Patch Changes
2502
+
2503
+ - Patch release for maintenance and stability improvements
2504
+ - Updated dependencies
2505
+ - @objectstack/spec@2.0.4
2506
+
2507
+ ## 2.0.3
2508
+
2509
+ ### Patch Changes
2510
+
2511
+ - Patch release for maintenance and stability improvements
2512
+ - Updated dependencies
2513
+ - @objectstack/spec@2.0.3
2514
+
2515
+ ## 2.0.2
2516
+
2517
+ ### Patch Changes
2518
+
2519
+ - Updated dependencies [1db8559]
2520
+ - @objectstack/spec@2.0.2
2521
+
2522
+ ## 2.0.1
2523
+
2524
+ ### Patch Changes
2525
+
2526
+ - Patch release for maintenance and stability improvements
2527
+ - Updated dependencies
2528
+ - @objectstack/spec@2.0.1
2529
+
2530
+ ## 2.0.0
2531
+
2532
+ ### Patch Changes
2533
+
2534
+ - Updated dependencies [38e5dd5]
2535
+ - Updated dependencies [38e5dd5]
2536
+ - @objectstack/spec@2.0.0
2537
+
2538
+ ## 1.0.12
2539
+
2540
+ ### Patch Changes
2541
+
2542
+ - Updated dependencies
2543
+ - @objectstack/spec@1.0.12
2544
+
2545
+ ## 1.0.11
2546
+
2547
+ ### Patch Changes
2548
+
2549
+ - @objectstack/spec@1.0.11
2550
+
2551
+ ## 1.0.10
2552
+
2553
+ ### Patch Changes
2554
+
2555
+ - @objectstack/spec@1.0.10
2556
+
2557
+ ## 1.0.9
2558
+
2559
+ ### Patch Changes
2560
+
2561
+ - @objectstack/spec@1.0.9
2562
+
2563
+ ## 1.0.8
2564
+
2565
+ ### Patch Changes
2566
+
2567
+ - @objectstack/spec@1.0.8
2568
+
2569
+ ## 1.0.7
2570
+
2571
+ ### Patch Changes
2572
+
2573
+ - @objectstack/spec@1.0.7
2574
+
2575
+ ## 1.0.6
2576
+
2577
+ ### Patch Changes
2578
+
2579
+ - Updated dependencies [a7f7b9d]
2580
+ - @objectstack/spec@1.0.6
2581
+
2582
+ ## 1.0.5
2583
+
2584
+ ### Patch Changes
2585
+
2586
+ - b1d24bd: refactor: migrate build system from tsc to tsup for faster builds
2587
+ - Replaced `tsc` with `tsup` (using esbuild) across all packages
2588
+ - Added shared `tsup.config.ts` in workspace root
2589
+ - Added `tsup` as workspace dev dependency
2590
+ - significantly improved build performance
2591
+ - Updated dependencies [b1d24bd]
2592
+ - @objectstack/spec@1.0.5
2593
+
2594
+ ## 1.0.4
2595
+
2596
+ ### Patch Changes
2597
+
2598
+ - @objectstack/spec@1.0.4
2599
+
2600
+ ## 1.0.3
2601
+
2602
+ ### Patch Changes
2603
+
2604
+ - @objectstack/spec@1.0.3
2605
+
2606
+ ## 1.0.2
2607
+
2608
+ ### Patch Changes
2609
+
2610
+ - a0a6c85: Infrastructure and development tooling improvements
2611
+
2612
+ - Add changeset configuration for automated version management
2613
+ - Add comprehensive GitHub Actions workflows (CI, CodeQL, linting, releases)
2614
+ - Add development configuration files (.cursorrules, .github/prompts)
2615
+ - Add documentation files (ARCHITECTURE.md, CONTRIBUTING.md, workflows docs)
2616
+ - Update test script configuration in package.json
2617
+ - Add @objectstack/cli to devDependencies for better development experience
2618
+
2619
+ - 109fc5b: Unified patch release to align all package versions.
2620
+ - Updated dependencies [a0a6c85]
2621
+ - Updated dependencies [109fc5b]
2622
+ - @objectstack/spec@1.0.2
2623
+
2624
+ ## 1.0.1
2625
+
2626
+ ### Patch Changes
2627
+
2628
+ - @objectstack/spec@1.0.1
2629
+
2630
+ ## 1.0.0
2631
+
2632
+ ### Major Changes
2633
+
2634
+ - Major version release for ObjectStack Protocol v1.0.
2635
+ - Stabilized Protocol Definitions
2636
+ - Enhanced Runtime Plugin Support
2637
+ - Fixed Type Compliance across Monorepo
2638
+
2639
+ ### Patch Changes
2640
+
2641
+ - Updated dependencies
2642
+ - @objectstack/spec@1.0.0
2643
+
2644
+ ## 0.9.2
2645
+
2646
+ ### Patch Changes
2647
+
2648
+ - Updated dependencies
2649
+ - @objectstack/spec@0.9.2
2650
+
2651
+ ## 0.9.1
2652
+
2653
+ ### Patch Changes
2654
+
2655
+ - Patch release for maintenance and stability improvements. All packages updated with unified versioning.
2656
+ - Updated dependencies
2657
+ - @objectstack/spec@0.9.1
2658
+
2659
+ ## 0.8.2
2660
+
2661
+ ### Patch Changes
2662
+
2663
+ - Updated dependencies [555e6a7]
2664
+ - @objectstack/spec@0.8.2
2665
+
2666
+ ## 0.8.1
2667
+
2668
+ ### Patch Changes
2669
+
2670
+ - @objectstack/spec@0.8.1
2671
+
2672
+ ## 1.0.0
2673
+
2674
+ ### Minor Changes
2675
+
2676
+ - # Upgrade to Zod v4 and Protocol Improvements
2677
+
2678
+ This release includes a major upgrade to the core validation engine (Zod v4) and aligns all protocol definitions with stricter type safety.
2679
+
2680
+ ### Patch Changes
2681
+
2682
+ - Updated dependencies
2683
+ - @objectstack/spec@1.0.0
2684
+
2685
+ ## 0.7.2
2686
+
2687
+ ### Patch Changes
2688
+
2689
+ - fb41cc0: Patch release: Updated documentation and JSON schemas
2690
+ - Updated dependencies [fb41cc0]
2691
+ - @objectstack/spec@0.7.2
2692
+
2693
+ ## 0.7.1
2694
+
2695
+ ### Patch Changes
2696
+
2697
+ - Patch release for maintenance and stability improvements
2698
+ - Updated dependencies
2699
+ - @objectstack/spec@0.7.1
2700
+
2701
+ ## 0.6.1
2702
+
2703
+ ### Patch Changes
2704
+
2705
+ - Patch release for maintenance and stability improvements
2706
+ - Updated dependencies
2707
+ - @objectstack/spec@0.6.1
2708
+
2709
+ ## 0.6.0
2710
+
2711
+ ### Minor Changes
2712
+
2713
+ - b2df5f7: Unified version bump to 0.5.0
2714
+
2715
+ - Standardized all package versions to 0.5.0 across the monorepo
2716
+ - Fixed driver-memory package.json paths for proper module resolution
2717
+ - Ensured all packages are in sync for the 0.5.0 release
2718
+
2719
+ ### Patch Changes
2720
+
2721
+ - Updated dependencies [b2df5f7]
2722
+ - @objectstack/spec@0.6.0
2723
+
2724
+ ## 0.4.2
2725
+
2726
+ ### Patch Changes
2727
+
2728
+ - Unify all package versions to 0.4.2
2729
+ - Updated dependencies
2730
+ - @objectstack/spec@0.4.2
2731
+
2732
+ ## 0.4.1
2733
+
2734
+ ### Patch Changes
2735
+
2736
+ - Version synchronization and dependency updates
2737
+
2738
+ - Synchronized plugin-msw version to 0.4.1
2739
+ - Updated runtime peer dependency versions to ^0.4.1
2740
+ - Fixed internal dependency version mismatches
2741
+
2742
+ - Updated dependencies
2743
+ - @objectstack/spec@0.4.1
2744
+
2745
+ ## 0.4.0
2746
+
2747
+ ### Minor Changes
2748
+
2749
+ - Release version 0.4.0
2750
+
2751
+ ## 0.3.3
2752
+
2753
+ ### Patch Changes
2754
+
2755
+ - Workflow and configuration improvements
2756
+
2757
+ - Enhanced GitHub workflows for CI, release, and PR automation
2758
+ - Added comprehensive prompt templates for different protocol areas
2759
+ - Improved project documentation and automation guides
2760
+ - Updated changeset configuration
2761
+ - Added cursor rules for better development experience
2762
+
2763
+ - Updated dependencies
2764
+ - @objectstack/spec@0.3.3
2765
+
2766
+ ## 0.3.2
2767
+
2768
+ ### Patch Changes
2769
+
2770
+ - Patch release for maintenance and stability improvements
2771
+ - Updated dependencies
2772
+ - @objectstack/spec@0.3.2
2773
+
2774
+ ## 0.3.1
2775
+
2776
+ ### Patch Changes
2777
+
2778
+ - @objectstack/spec@0.3.1
2779
+
2780
+ ## 0.3.0
2781
+
2782
+ ### Patch Changes
2783
+
2784
+ - Updated dependencies
2785
+ - @objectstack/spec@1.0.0
2786
+
2787
+ ## 0.2.0
2788
+
2789
+ ### Minor Changes
2790
+
2791
+ - Initial release of ObjectStack Protocol & Specification packages
2792
+
2793
+ This is the first public release of the ObjectStack ecosystem, providing:
2794
+
2795
+ - Core protocol definitions and TypeScript types
2796
+ - ObjectQL query language and runtime
2797
+ - Memory driver for in-memory data storage
2798
+ - Client library for interacting with ObjectStack
2799
+ - Hono server plugin for REST API endpoints
2800
+ - Complete JSON schema generation for all specifications
2801
+
2802
+ ### Patch Changes
2803
+
2804
+ - Updated dependencies
2805
+ - @objectstack/spec@0.2.0
2806
+
2807
+ ## 0.1.1
2808
+
2809
+ ### Patch Changes
2810
+
2811
+ - Remove debug logs from registry and protocol modules
2812
+ - Updated dependencies
2813
+ - @objectstack/spec@0.1.2