diff --git a/.changeset/upgrade-objectstack-17-rc2.md b/.changeset/upgrade-objectstack-17-rc2.md new file mode 100644 index 00000000..154eb217 --- /dev/null +++ b/.changeset/upgrade-objectstack-17-rc2.md @@ -0,0 +1,52 @@ +--- +'hotcrm': minor +--- + +Upgrade HotCRM to ObjectStack 17.0.0-rc.2, and migrate the six places where the +rc.1 → rc.2 window changed what the platform does with metadata this app already +had. Four of them were live defects, not tidy-ups — each is verified against a +booted server and a real browser session, not only against the unit harness. + +**`demo_bootstrap` could no longer find its user.** The sweep opened with +`get_record(sys_user)` and an empty filter, which `findOne` used to answer with +an arbitrary row. 17.0.0-rc.2 refuses a `findOne` that names no record (#4419), +so the flow failed on its second node and every seeded record stayed ownerless — +"My Leads", "My Deals" and "My Cases" empty for everyone, and every owner-addressed +`notify` reaching nobody. The read is now an explicit `find` whose first row is +bound by an `assignment` node, which states the arbitrary pick instead of +smuggling it through a call that claimed to name one. FROM `filter: {}` TO +`limit: 2` + `firstUser = {userList.0}`, with `has(vars.firstUser)` guards on the +branch so a zero-user org still completes. + +**`lead_conversion` could no longer convert a lead.** rc.2 holds a screen resume +to the screen's declared field contract (#4477), and `createOpportunity` — a +checkbox with `defaultValue: false` — was marked `required`. A runner that posts +only what the user touched left it out, and the resume was refused outright with +`INVALID_SCREEN_INPUT`. A checkbox has no unanswered state, so the flag is gone; +the default and the `init_defaults` assignment supply the answer, as they always +actually did. + +**Nine `decision` nodes carried an inert copy of their branch predicate.** rc.2 +flags it (`flow-inert-node-condition`, #4414): the engine reads the out-edges, so +a second copy on the node restates the gate without being the gate, and a copy +that drifts is a lie about what the flow does. The copies are deleted and the +totality rationale moved to the edges that decide. Behaviour is unchanged — the +edges always were the live sites. + +**`translation.validationMessages` is removed** from all four locale bundles. +rc.2 retires the key (#4667); the three messages under it matched no rule in this +app and had never been read. + +Two pinned "platform gap" assertions flip because the platform closed the gap, +which is what they were written to detect: a filtered measure that selects nothing +now reports `0` rather than nothing at all, so a lead source that only ever lost +reads **0%** instead of blank (#4708); and a bare-string condition inside a `loop` +body is now CEL-parsed like its envelope twin (#4336). The explicit envelopes stay +— they say which dialect a predicate is in, and they keep these flows correct on a +runtime that still carries the old path. + +Finally, validation predicates now fail **closed** (#4649) — the upstream question +`test/object-validation-predicates.test.ts` filed, answered. An unevaluable +predicate used to be skipped silently; it now rejects the write. HotCRM's +predicates are already total, so nothing changes at runtime, but the house rule in +AGENTS.md and that file now describe the outcome an author actually gets. diff --git a/AGENTS.md b/AGENTS.md index 1d600779..b758f003 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -177,15 +177,19 @@ fills absent fields with `null` **only on insert**. On update, `previous` is whatever the driver returned — and a driver that stores only the columns a row was actually written with (`driver-memory`, `driver-mongodb`) hands back a record with the key **absent**, not null. Strict CEL then aborts the whole -predicate with `No such key`, and the engine's answer to a predicate that -cannot answer is to **skip the rule**: +predicate with `No such key` — and what the engine does next changed under us: ``` -WARN Validation rule 'x' predicate failed to evaluate (type: No such key: y) — skipped +≤ 17.0.0-rc.1 WARN Validation rule 'x' predicate failed to evaluate (…) — skipped +≥ 17.0.0-rc.2 WARN … — write rejected (#4649) + ValidationError: Validation rule 'x' could not be evaluated … — write rejected. ``` -No error, no failed save — just a rule that reads as enforced and requires -nothing. So **every `record.x` read carries a `has(record.x)` guard**: +Through rc.1 a rule that could not answer required nothing at all, silently. +From rc.2 it **fails closed**: the same abort rejects the save. Neither is the +rule the author wrote — one under-enforces, the other blocks an ordinary save on +a record shape nobody considered — and one guard prevents both. So **every +`record.x` read carries a `has(record.x)` guard**: | intent | write this | | --- | --- | diff --git a/CHANGELOG.md b/CHANGELOG.md index 7c8d4ed7..c101aff7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,13 @@ Everything merged after the 2.2.2 tag. Not yet versioned or published. ### Changed +- **ObjectStack platform → 17.0.0-rc.2** across all `@objectstack/*` packages (from 17.0.0-rc.1); `specVersion` and `engines.protocol` follow. Four of the rc.1 → rc.2 changes were live defects in metadata this app already had, and each was verified against a booted server and a real browser session: + - **`demo_bootstrap` could no longer find its user.** The sweep opened with `get_record(sys_user)` on an empty filter, which `findOne` used to answer with an arbitrary row; rc.2 refuses a `findOne` that names no record (upstream #4419), so the flow failed on its second node and every seeded record stayed ownerless — the "My …" views empty for everyone and every owner-addressed `notify` reaching nobody. It now reads a list and binds its first row through an `assignment` node, which states the arbitrary pick rather than smuggling it through a call that claimed to name one. Guarded with `has(vars.firstUser)` so a zero-user org still completes. Re-verified end to end: one manual run claimed 115 records across all eight objects, both ownership columns. + - **`lead_conversion` could no longer convert a lead.** rc.2 holds a screen resume to the screen's declared field contract (#4477), and `createOpportunity` — a checkbox with `defaultValue: false` — was marked `required`, so a runner posting only what the user touched had its resume refused with `INVALID_SCREEN_INPUT`. A checkbox has no unanswered state; the flag is gone and the default (plus the `init_defaults` assignment) supplies the answer, as it always actually did. + - **Nine `decision` nodes carried an inert copy of their branch predicate**, now flagged by rc.2's `flow-inert-node-condition` (#4414). The engine reads the out-edges, so the node copy restated the gate without being the gate. Copies deleted, totality rationale moved to the edges. Behaviour unchanged, and re-verified per flow in the browser: two-tier approval routing (>$500K → `director_signoff`, ≤$500K → approved), `lead_assignment`'s 1-day/3-day SLA partition including the unrated lead, and `quote_generation` advancing `needs_analysis` → `proposal`. + - **`translation.validationMessages` removed** from all four locale bundles — rc.2 retires the key (#4667), and the three messages under it matched no rule in this app. + - Two pinned "platform gap" assertions flip because the platform closed the gap: a filtered measure that selects nothing now reports `0`, so a lead source that only ever lost reads **0%** rather than blank (#4708); and a bare-string condition inside a `loop` body is now CEL-parsed like its envelope twin (#4336). The explicit envelopes stay — they declare the dialect and keep these flows correct on a runtime that still carries the old path. + - Validation predicates now fail **closed** (#4649) — the upstream question `test/object-validation-predicates.test.ts` filed, answered. An unevaluable predicate used to be skipped silently and now rejects the write. HotCRM's predicates are already total, so nothing changes at runtime; AGENTS.md and that file now state the outcome an author actually gets. - **ObjectStack platform → 17.0.0-rc.1** across all `@objectstack/*` packages (from 16.1.0). The manifest protocol handshake and marketplace `specVersion` now declare the 17.0.0-rc.1 compatibility line; API methods, skills and flow notifications use only live metadata keys; pre-17 required fields preserve their database `NOT NULL` constraints explicitly; and the analytics semantic layer now declares the month/day/quarter buckets v17 executes correctly. - **`allowExport` is authored on every profile that needs it (17.0 opt-in export axis, upstream #3544).** Before 17.0 an unset `allowExport` inherited read, so "can list ⇒ can export". 17.0 inverted the default: `resolveUserExportAllowed` demands an explicit `allowExport: true` and neither `viewAllRecords` nor `modifyAllRecords` substitutes, so an unset bit now DENIES — at both bulk-egress doors, the list views' built-in `exportOptions` and `ReportService.assertExportAllowed`. No profile carried the bit, which would have 403'd every CSV/XLSX and report export for every user, `system_admin` included, while `os validate`, `os build` and the whole test suite stayed green. The five objects with a real export surface (`crm_account`, `crm_case`, `crm_contact`, `crm_lead`, `crm_opportunity`) now carry the grant on each profile that already reads them; `guest_portal` deliberately carries none (ADR-0090 D9 forbids binding a high-privilege set to the `guest` anchor). Pinned by `test/authorization-coverage.test.ts`, which fails both on an export surface nobody can reach and on a grant with no surface behind it. - Approval nodes in `opportunity_approval` use the native `onEmptyApprovers: 'admin_rescue'` policy instead of the hand-rolled `org_membership_level: 'owner'` approver. That entry existed only to avoid the empty-position dead-end, and with `behavior: 'first_response'` it overshot — it made an org owner a routine approver on every deal over $100K, not a rescue when the bench is empty. diff --git a/objectstack.manifest.json b/objectstack.manifest.json index b8c72476..5866fd77 100644 --- a/objectstack.manifest.json +++ b/objectstack.manifest.json @@ -1,9 +1,9 @@ { "$schema": "https://schemas.objectstack.dev/template-manifest.json", "name": "hotcrm", - "specVersion": "^17.0.0-rc.1", + "specVersion": "^17.0.0-rc.2", "engines": { - "protocol": "^17.0.0-rc.1" + "protocol": "^17.0.0-rc.2" }, "manifestId": "app.objectstack.hotcrm", "displayName": "HotCRM", diff --git a/package-lock.json b/package-lock.json index dd4edcda..6697b0b5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,21 +9,21 @@ "version": "2.2.2", "license": "Apache-2.0", "dependencies": { - "@objectstack/account": "17.0.0-rc.1", - "@objectstack/cli": "17.0.0-rc.1", - "@objectstack/driver-memory": "17.0.0-rc.1", - "@objectstack/driver-sql": "17.0.0-rc.1", - "@objectstack/driver-sqlite-wasm": "17.0.0-rc.1", - "@objectstack/metadata": "17.0.0-rc.1", - "@objectstack/objectql": "17.0.0-rc.1", - "@objectstack/runtime": "17.0.0-rc.1", - "@objectstack/service-analytics": "17.0.0-rc.1", - "@objectstack/service-automation": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/account": "17.0.0-rc.2", + "@objectstack/cli": "17.0.0-rc.2", + "@objectstack/driver-memory": "17.0.0-rc.2", + "@objectstack/driver-sql": "17.0.0-rc.2", + "@objectstack/driver-sqlite-wasm": "17.0.0-rc.2", + "@objectstack/metadata": "17.0.0-rc.2", + "@objectstack/objectql": "17.0.0-rc.2", + "@objectstack/runtime": "17.0.0-rc.2", + "@objectstack/service-analytics": "17.0.0-rc.2", + "@objectstack/service-automation": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "devDependencies": { "@changesets/cli": "^2.31.1", - "@objectstack/formula": "17.0.0-rc.1", + "@objectstack/formula": "17.0.0-rc.2", "@playwright/test": "^1.61.1", "@vitest/coverage-v8": "^4.1.10", "tsx": "^4.23.1", @@ -506,40 +506,6 @@ "prettier": "^2.7.1" } }, - "node_modules/@emnapi/core": { - "version": "2.0.0-alpha.3", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-2.0.0-alpha.3.tgz", - "integrity": "sha512-AZypUeJ/yByuxyS7BlSNRDOMLMlROYtjYdIAuBmJssVz1UJDSeYxLrdizhXCFYhedC5bqd/ASy8EuNXbVVXp9g==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "2.0.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "2.0.0-alpha.3", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-2.0.0-alpha.3.tgz", - "integrity": "sha512-hFPAhMUjJD9BSyCANEISPOogeXC9Zo9ZQl7L6vKnaVsMkCtzznaW/naYypeyl0Gv5rYfWYsZbpixTMpjDJzQeA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-2.0.1.tgz", - "integrity": "sha512-9DsSk+o5NBX0CCJT8s0EROGSGxjR/tKu6aBTaVyq+SjAEQH4XcdcRxPBRzsBLizTTJ49MJjF+jgu3qnO9GLQcQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", @@ -1241,28 +1207,6 @@ "sparse-bitfield": "^3.0.3" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.2.2.tgz", - "integrity": "sha512-JfB4kuJQjaoHuCTseIINHtHWeJnvgEcxjwA5t/Y00ZgaOO1Crz3fjT/p8kT28zA/Caz7oiUMn3d6H2yOVCVwuw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.3" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=23.5.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1 || ^2.0.0-alpha.3", - "@emnapi/runtime": "^1.7.1 || ^2.0.0-alpha.3" - } - }, "node_modules/@noble/ciphers": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-2.2.0.tgz", @@ -1338,72 +1282,73 @@ } }, "node_modules/@objectstack/account": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/account/-/account-17.0.0-rc.1.tgz", - "integrity": "sha512-n1cI+ZtKdQotXohYjdFUSYWoLas9is4MbVpAbG/RVMra4iSp2EsYWUZnuOfuB9iZGEAcn0QW9IfQNzCRWszvVw==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/account/-/account-17.0.0-rc.2.tgz", + "integrity": "sha512-hUs3DVw9hp5mP2sbqHDeDLb/ffT523/r26/5yfd7+YnvlyUDDucGWvl2x5BQlVQ9PvMYbrNF0WnZeWSCxU2OTg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/cli": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/cli/-/cli-17.0.0-rc.1.tgz", - "integrity": "sha512-eirXq1GxshNwjNIczaud6SINZymo19CQB/zsSuJpV9Cy85oEhlnFSKrJKrDX3JVuZ2hNdhGgGxnFxksarI5wgw==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/cli/-/cli-17.0.0-rc.2.tgz", + "integrity": "sha512-XznKd0y16uPJCq9g1mJNMHlwwHtjd1Zc4DnpQ917/VGjuiE3QY8sYN0oXY9xW4QFeYk6tMvUnKwBqinM71O3bQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/account": "17.0.0-rc.1", - "@objectstack/client": "17.0.0-rc.1", - "@objectstack/cloud-connection": "17.0.0-rc.1", - "@objectstack/console": "17.0.0-rc.1", - "@objectstack/core": "^17.0.0-rc.1", - "@objectstack/driver-memory": "^17.0.0-rc.1", - "@objectstack/driver-mongodb": "^17.0.0-rc.1", - "@objectstack/driver-sql": "^17.0.0-rc.1", - "@objectstack/driver-sqlite-wasm": "^17.0.0-rc.1", - "@objectstack/formula": "17.0.0-rc.1", - "@objectstack/lint": "17.0.0-rc.1", - "@objectstack/mcp": "17.0.0-rc.1", - "@objectstack/metadata": "17.0.0-rc.1", - "@objectstack/objectql": "^17.0.0-rc.1", - "@objectstack/observability": "^17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/plugin-approvals": "17.0.0-rc.1", - "@objectstack/plugin-audit": "17.0.0-rc.1", - "@objectstack/plugin-auth": "17.0.0-rc.1", - "@objectstack/plugin-email": "17.0.0-rc.1", - "@objectstack/plugin-hono-server": "17.0.0-rc.1", - "@objectstack/plugin-pinyin-search": "17.0.0-rc.1", - "@objectstack/plugin-reports": "17.0.0-rc.1", - "@objectstack/plugin-security": "17.0.0-rc.1", - "@objectstack/plugin-sharing": "17.0.0-rc.1", - "@objectstack/plugin-webhooks": "17.0.0-rc.1", - "@objectstack/rest": "17.0.0-rc.1", - "@objectstack/runtime": "^17.0.0-rc.1", - "@objectstack/service-analytics": "17.0.0-rc.1", - "@objectstack/service-automation": "17.0.0-rc.1", - "@objectstack/service-cache": "17.0.0-rc.1", - "@objectstack/service-datasource": "17.0.0-rc.1", - "@objectstack/service-job": "17.0.0-rc.1", - "@objectstack/service-messaging": "17.0.0-rc.1", - "@objectstack/service-package": "17.0.0-rc.1", - "@objectstack/service-queue": "17.0.0-rc.1", - "@objectstack/service-realtime": "17.0.0-rc.1", - "@objectstack/service-settings": "17.0.0-rc.1", - "@objectstack/service-sms": "17.0.0-rc.1", - "@objectstack/service-storage": "17.0.0-rc.1", - "@objectstack/setup": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/trigger-api": "17.0.0-rc.1", - "@objectstack/trigger-record-change": "17.0.0-rc.1", - "@objectstack/trigger-schedule": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1", - "@objectstack/verify": "17.0.0-rc.1", - "@oclif/core": "^4.13.0", + "@objectstack/account": "17.0.0-rc.2", + "@objectstack/client": "17.0.0-rc.2", + "@objectstack/cloud-connection": "17.0.0-rc.2", + "@objectstack/console": "17.0.0-rc.2", + "@objectstack/core": "^17.0.0-rc.2", + "@objectstack/driver-memory": "^17.0.0-rc.2", + "@objectstack/driver-mongodb": "^17.0.0-rc.2", + "@objectstack/driver-sql": "^17.0.0-rc.2", + "@objectstack/driver-sqlite-wasm": "^17.0.0-rc.2", + "@objectstack/formula": "17.0.0-rc.2", + "@objectstack/lint": "17.0.0-rc.2", + "@objectstack/mcp": "17.0.0-rc.2", + "@objectstack/metadata": "17.0.0-rc.2", + "@objectstack/metadata-protocol": "17.0.0-rc.2", + "@objectstack/objectql": "^17.0.0-rc.2", + "@objectstack/observability": "^17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/plugin-approvals": "17.0.0-rc.2", + "@objectstack/plugin-audit": "17.0.0-rc.2", + "@objectstack/plugin-auth": "17.0.0-rc.2", + "@objectstack/plugin-email": "17.0.0-rc.2", + "@objectstack/plugin-hono-server": "17.0.0-rc.2", + "@objectstack/plugin-pinyin-search": "17.0.0-rc.2", + "@objectstack/plugin-reports": "17.0.0-rc.2", + "@objectstack/plugin-security": "17.0.0-rc.2", + "@objectstack/plugin-sharing": "17.0.0-rc.2", + "@objectstack/plugin-webhooks": "17.0.0-rc.2", + "@objectstack/rest": "17.0.0-rc.2", + "@objectstack/runtime": "^17.0.0-rc.2", + "@objectstack/service-analytics": "17.0.0-rc.2", + "@objectstack/service-automation": "17.0.0-rc.2", + "@objectstack/service-cache": "17.0.0-rc.2", + "@objectstack/service-datasource": "17.0.0-rc.2", + "@objectstack/service-job": "17.0.0-rc.2", + "@objectstack/service-messaging": "17.0.0-rc.2", + "@objectstack/service-package": "17.0.0-rc.2", + "@objectstack/service-queue": "17.0.0-rc.2", + "@objectstack/service-realtime": "17.0.0-rc.2", + "@objectstack/service-settings": "17.0.0-rc.2", + "@objectstack/service-sms": "17.0.0-rc.2", + "@objectstack/service-storage": "17.0.0-rc.2", + "@objectstack/setup": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/trigger-api": "17.0.0-rc.2", + "@objectstack/trigger-record-change": "17.0.0-rc.2", + "@objectstack/trigger-schedule": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2", + "@objectstack/verify": "17.0.0-rc.2", + "@oclif/core": "^4.13.2", "bundle-require": "^5.1.0", "chalk": "^6.0.0", "chokidar": "^5.0.0", @@ -1422,7 +1367,7 @@ "node": ">=22.0.0" }, "optionalDependencies": { - "better-sqlite3": "^13.0.1" + "better-sqlite3": "^13.0.2" } }, "node_modules/@objectstack/cli/node_modules/better-sqlite3": { @@ -1439,46 +1384,46 @@ } }, "node_modules/@objectstack/client": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/client/-/client-17.0.0-rc.1.tgz", - "integrity": "sha512-3ZRNyx+lOx8C+LBBChhXZc22rWcMa5wufVRrGHc5Dfd42OZqn5AsbKjjhSZrHEfyoCvmeeENo9JGlej0R8RJ9Q==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/client/-/client-17.0.0-rc.2.tgz", + "integrity": "sha512-tM4jm2R6UnR2+ymA94BSefco9DbrgeZFytL6b/mTVaUv7uy/joSZKWWrcEG5FiBzcyxJCevDvQixRHuiYzcHHg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/cloud-connection": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/cloud-connection/-/cloud-connection-17.0.0-rc.1.tgz", - "integrity": "sha512-tKUJk966/hprzRoOmZRvJowXToNwG+ECtx7wq79bOxMYBVf4V9BHfIfCMw3adngyYSLn+YHYziL8RppkdzH79w==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/cloud-connection/-/cloud-connection-17.0.0-rc.2.tgz", + "integrity": "sha512-Fc2ySjnC33b3/oJd4lHagUW3BhEyU161x/UHQS7lBfYA6JzcL3c85TdbKI/nAp8uyq7JmbJ7Dz3hiz9m8c7Dxw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/runtime": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/runtime": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/console": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/console/-/console-17.0.0-rc.1.tgz", - "integrity": "sha512-oSp9PM7QAjEwgNDK+Kq8CpT6835PeFOrRbARLbRE+fMr9WmofYxWJYuk/ShN4+HGo+b+0lNk2vkrX/o7gDg5zg==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/console/-/console-17.0.0-rc.2.tgz", + "integrity": "sha512-kaNdZsAp7Bdw9Zx9puwgq6dZcNCMyU8LeEvG9PbqF6KWssT1GQMqeiRtq5HNc25tt9KOXR/U+ule8V6sGOmGYw==", "license": "Apache-2.0" }, "node_modules/@objectstack/core": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/core/-/core-17.0.0-rc.1.tgz", - "integrity": "sha512-3snd0dJhd+MPEDek+YRapZ02siBnbxYNNl8GoyfnlSeEuKXdcY6bDBf/zueAwoTqyV32zNG5epA85cZh1zLQPw==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/core/-/core-17.0.0-rc.2.tgz", + "integrity": "sha512-5hAtKmjBbzEWA7qWXCN8WB12+BhGZ8jZYg7Y5r8PHYH+jOf5ZLX4KkD3bQw6oTUBpBhWclLVREKSlah9truGRA==", "license": "Apache-2.0", "dependencies": { - "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.2", "zod": "^4.4.3" }, "engines": { @@ -1486,13 +1431,13 @@ } }, "node_modules/@objectstack/driver-memory": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/driver-memory/-/driver-memory-17.0.0-rc.1.tgz", - "integrity": "sha512-OxQAuNjCZVASpys5DVNVo/kcFUhsXtytAjVqCWVqCZPPmCaZ925RFqbCfDbnDh+1JCEQ0HTFzj+t8AYCViS2oA==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/driver-memory/-/driver-memory-17.0.0-rc.2.tgz", + "integrity": "sha512-zpfVQv1FcH4xRkDuvQwFuwBjtPiEa7jJcooBfIEpnirmgKtXC//93bFuQh62wwBTzaUSSvh33s+2oI+9QW4KQA==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", "mingo": "^7.2.2" }, "engines": { @@ -1500,14 +1445,14 @@ } }, "node_modules/@objectstack/driver-mongodb": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/driver-mongodb/-/driver-mongodb-17.0.0-rc.1.tgz", - "integrity": "sha512-zPzNcTPZ8LSsCvqF8q73iVMhtSxIRlW5gij3F+p9w1Lbr8/PuOkFoWn00P7NLtVhX+ki5AParIvLZxu/gIUHUA==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/driver-mongodb/-/driver-mongodb-17.0.0-rc.2.tgz", + "integrity": "sha512-a3A+liqxuLEQMBl6qP8dn5La4f36BnLJIx5oMv4V5z3kiLkRh6sa8z+VhsbBG08tkbdnb6FhO740+4GUG/DG1g==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1", + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2", "mongodb": "^7.5.0", "nanoid": "^6.0.0" }, @@ -1516,15 +1461,15 @@ } }, "node_modules/@objectstack/driver-sql": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/driver-sql/-/driver-sql-17.0.0-rc.1.tgz", - "integrity": "sha512-6uHyQ3GmKqSjL8Cr5u10TBWfOuOK9x2Ur97CwMbvO6ydECzKyztwVm3KVlsQIgmVA9WHLyYG+rYkjH+SSC4mJg==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/driver-sql/-/driver-sql-17.0.0-rc.2.tgz", + "integrity": "sha512-7IUaaq0SEJlxp4CO+b0RnlDtn1O1q+zmfbeOCDNRtmUVnaLzfGheAmrKbwNghHhez2RS9VvlrRfEk+V1gZiIUA==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/observability": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1", + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/observability": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2", "knex": "^3.3.0", "nanoid": "^6.0.0" }, @@ -1532,7 +1477,7 @@ "node": ">=22.0.0" }, "optionalDependencies": { - "better-sqlite3": "^13.0.1" + "better-sqlite3": "^13.0.2" }, "peerDependencies": { "mysql2": "^3.0.0", @@ -1565,14 +1510,14 @@ } }, "node_modules/@objectstack/driver-sqlite-wasm": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/driver-sqlite-wasm/-/driver-sqlite-wasm-17.0.0-rc.1.tgz", - "integrity": "sha512-oz4Kt29T+ys06RO/PIJk1McT+rx/F5E+sBa507NaycWaLElM10GeoGZ/L7FWthZXMndkKN4qlGVG7uzbZrYzVQ==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/driver-sqlite-wasm/-/driver-sqlite-wasm-17.0.0-rc.2.tgz", + "integrity": "sha512-h4p4Cve7MH1fHCzWvM43Z+ixsXHosdvrDqkLjFsCvRS7yR1ahQuUc0n3XvTsPiFfjJanR4y4ilXow1L+UKT1hw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/driver-sql": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/driver-sql": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", "knex": "^3.3.0", "nanoid": "^6.0.0", "sql.js": "^1.14.1" @@ -1582,24 +1527,25 @@ } }, "node_modules/@objectstack/formula": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/formula/-/formula-17.0.0-rc.1.tgz", - "integrity": "sha512-oAJENCl3QQcJA0484ScNdOU6EX5MEZ14pRF7sLITnoBkXGhgh/eMKboG+q6zLGJsZwS4ThPEu6sF72GVDlEmuw==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/formula/-/formula-17.0.0-rc.2.tgz", + "integrity": "sha512-+4H3nESU3fH+pjjV4b1P8llvSPff/vQF0Th5/FdbZrYz0fKxoNNL+MtLBAzpu+ME3ZLFMwwsKRH7obPyCS9wmQ==", "license": "Apache-2.0", "dependencies": { "@marcbachmann/cel-js": "^8.0.0", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/spec": "17.0.0-rc.2" } }, "node_modules/@objectstack/lint": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/lint/-/lint-17.0.0-rc.1.tgz", - "integrity": "sha512-qIXylf5FsFhWAii0m+jQp49kZXlTnGXNz/cyZTrvqwJItI78k5afo3zKxZjmDreGRnAFIKXJLGLEDvZWjHgdFg==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/lint/-/lint-17.0.0-rc.2.tgz", + "integrity": "sha512-S571+BtsXhyBpfZSNh9Ic0ljH8cVKyhgaVbQjqPc0ICgzvwh9/b4PEB7ElbgWUvTNje2KOriLgCjgNGGnTGfuw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/formula": "17.0.0-rc.1", - "@objectstack/sdui-parser": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", + "@marcbachmann/cel-js": "^8.0.0", + "@objectstack/formula": "17.0.0-rc.2", + "@objectstack/sdui-parser": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", "sucrase": "^3.35.1", "typescript": "^6.0.3" }, @@ -1621,16 +1567,16 @@ } }, "node_modules/@objectstack/mcp": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/mcp/-/mcp-17.0.0-rc.1.tgz", - "integrity": "sha512-lGPbHiiI861013hPbSt2Us/yd1jHNdRy/i6pkNsjzCuedOuSOGm7A/UtXHj3fBnryZOaiBJMLTeJg9UkBEALeA==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/mcp/-/mcp-17.0.0-rc.2.tgz", + "integrity": "sha512-GluJpCZ5UHCjlSTR5cAJagpv3CSDotPpN4kU2mGqpXNUf7j7/THIjppi74Ejlc9hWTcUm7F+BfSMoSb6JZjuVA==", "license": "Apache-2.0", "dependencies": { - "@modelcontextprotocol/sdk": "^1.29.0", - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/formula": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1", + "@modelcontextprotocol/sdk": "^1.30.0", + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/formula": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2", "zod": "^4.4.3" }, "engines": { @@ -1638,17 +1584,17 @@ } }, "node_modules/@objectstack/metadata": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/metadata/-/metadata-17.0.0-rc.1.tgz", - "integrity": "sha512-zXDeP9+zONVuwSaRL0IuaPfEjRHxISTyEBip77molWd0GQ/nQhtpj9T278DUvzAC1q5BEG3wXX985yHXMDboqg==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/metadata/-/metadata-17.0.0-rc.2.tgz", + "integrity": "sha512-AR0u/gVd/Ew9oa0hPBl1K+3QN4Zeraw2xXgi1iG4lVx7BEnx30mxG2e2spiKo6KOnwO1NAeaHs+gxwKnaZj7LQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/metadata-core": "17.0.0-rc.1", - "@objectstack/metadata-fs": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1", + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/metadata-core": "17.0.0-rc.2", + "@objectstack/metadata-fs": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2", "chokidar": "^5.0.0", "glob": "^13.0.6", "js-yaml": "^5.2.2", @@ -1659,12 +1605,12 @@ } }, "node_modules/@objectstack/metadata-core": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/metadata-core/-/metadata-core-17.0.0-rc.1.tgz", - "integrity": "sha512-ZU6d27sGnwRY8LXrWv1xHhaomPH/XswP1geyOxFgZtIimrbTgjIR56jZ8n7SBgjBw4zMWfbXF+YHNIXudnvDsg==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/metadata-core/-/metadata-core-17.0.0-rc.2.tgz", + "integrity": "sha512-to12UP5HnC5/PUj0BQc8FS6Yh2PxiQL7jXaAQ+dubxK/T7IRdSKOZ5Dn0C7ss7MINg7NlobFMee4wlwuP3BsBQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.2", "zod": "^4.4.3" }, "engines": { @@ -1680,12 +1626,12 @@ } }, "node_modules/@objectstack/metadata-fs": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/metadata-fs/-/metadata-fs-17.0.0-rc.1.tgz", - "integrity": "sha512-2zk5gzE982SAs6qtNjjdb3N3gNgzkcANQ6jL5h3/p4G4Hz51AxRXD/mvUI82ZYt0GsikvParYvqD8ISi+86lDw==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/metadata-fs/-/metadata-fs-17.0.0-rc.2.tgz", + "integrity": "sha512-SQHZoO4szNGZfo059MXnS9f5XEEH65QDb473bR8Vw8WJZV6kfCrw//+9HRw/4td0Jq4XqvvOp145/wwwB/klDQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/metadata-core": "17.0.0-rc.1", + "@objectstack/metadata-core": "17.0.0-rc.2", "chokidar": "^5.0.0" }, "engines": { @@ -1693,16 +1639,17 @@ } }, "node_modules/@objectstack/metadata-protocol": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/metadata-protocol/-/metadata-protocol-17.0.0-rc.1.tgz", - "integrity": "sha512-2XtShkp/f2W+koSwX4E4OmmKoZvkbjS3oh8JTwdgbqEgmTdQgafHiLrStr3CCzcpttmIlFUInQoTky8QYy62iQ==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/metadata-protocol/-/metadata-protocol-17.0.0-rc.2.tgz", + "integrity": "sha512-NlubR8Osa0P2htJ5B2CSxYC5SH7QbEfykSmoJqkY96cNJP7MNVL+1ROMmgwEl7d+R0DPt6DL5D6X4lTIGRwp9g==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/formula": "17.0.0-rc.1", - "@objectstack/metadata-core": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1", + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/formula": "17.0.0-rc.2", + "@objectstack/lint": "17.0.0-rc.2", + "@objectstack/metadata-core": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2", "zod": "^4.4.3" }, "engines": { @@ -1732,17 +1679,17 @@ } }, "node_modules/@objectstack/objectql": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/objectql/-/objectql-17.0.0-rc.1.tgz", - "integrity": "sha512-+jXtGwGDLggNuNfjTy9LvF6dqgxBlyfzN/6gYQ2pmE97hZ9WU70E6H1oZRDEF4j391gBVxfTilhDxjgIGmh0ow==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/objectql/-/objectql-17.0.0-rc.2.tgz", + "integrity": "sha512-J1wKVnS1a/WwkDbBF8OnGCFg7uKzpepg36Ku30Dak9dQvrj3Fh4r4b8DJZ4HH/Plx2+mQYC+3+9UZL1ijsXKZw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/formula": "17.0.0-rc.1", - "@objectstack/metadata-core": "17.0.0-rc.1", - "@objectstack/metadata-protocol": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1", + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/formula": "17.0.0-rc.2", + "@objectstack/metadata-core": "17.0.0-rc.2", + "@objectstack/metadata-protocol": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2", "ajv": "^8.20.0", "zod": "^4.4.3" }, @@ -1751,62 +1698,62 @@ } }, "node_modules/@objectstack/observability": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/observability/-/observability-17.0.0-rc.1.tgz", - "integrity": "sha512-uqOt8i3H5lWk+grXdnU+d6zxr4yFGROQ9i9WILKUZbv6cP65tKKFSUwFIbL09Q6wjWYDo36SbenwCqKQADQjhw==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/observability/-/observability-17.0.0-rc.2.tgz", + "integrity": "sha512-04f/B6ZrkJC/dmvSWj+gNlhYUHr8hvFvDxb9ROjlM9u7dJTRmVKeHqmfEImgFbTOQN95lmKJkE/7OOR5WIamTw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/platform-objects": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/platform-objects/-/platform-objects-17.0.0-rc.1.tgz", - "integrity": "sha512-SVMp3ZDrdpK39e8QDwfFuyd1yzSG7Bw45Ge4Hb36w8zpuuDOCAhqV+v30/yA+ZBXY/wt7GPEUb9AVgZUlXfcgA==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/platform-objects/-/platform-objects-17.0.0-rc.2.tgz", + "integrity": "sha512-MvinidIaLaIt7AT8a0URwJqkd3JmLocbnAzPXDgs8bi84FKiqyNd8QxvkJZQBwhapzpfvu9c2XftWpZ0/omMvw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/metadata-core": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/metadata-core": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/plugin-approvals": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-approvals/-/plugin-approvals-17.0.0-rc.1.tgz", - "integrity": "sha512-VDyKGaVAJuVcW4WFNJET+NiExobbvfVOLkB3xZHhuzY+SQZNQfeypIBo+xT37+/KZdWKyif4O3V30za3uM7eXQ==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-approvals/-/plugin-approvals-17.0.0-rc.2.tgz", + "integrity": "sha512-+1tPfw0if1IbuQT2GBXLV9DXL2b20el7msh33SQfQP6HKPyQvURkO8rchJVUpgTeQ68LkT/38racrVpI2sktGg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/formula": "17.0.0-rc.1", - "@objectstack/metadata-core": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/formula": "17.0.0-rc.2", + "@objectstack/metadata-core": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2" } }, "node_modules/@objectstack/plugin-audit": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-audit/-/plugin-audit-17.0.0-rc.1.tgz", - "integrity": "sha512-vm24oYZkUldz3X9iZ/tl79SQynIWBWlhONtLmPsKQHMJPOzN//KtU9VnWzZTJUdisDsrMI356zRlnnw49/Avcg==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-audit/-/plugin-audit-17.0.0-rc.2.tgz", + "integrity": "sha512-P4eXHAaFj4709ngljhipnPckTQbN14WVcNIIKUHd4jNl6QyAwzOEPoVTLzpYkKwesuiSO+2am0YuN8kxY41Oiw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/plugin-auth": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-auth/-/plugin-auth-17.0.0-rc.1.tgz", - "integrity": "sha512-xqJE38AR5SnC0cZPyqalttU7s1Kh8iLAL7rMYcG7tNhDuFNRROqUwCOFO3OXFb6yKeWatKiFc/dFz36C+h+DAA==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-auth/-/plugin-auth-17.0.0-rc.2.tgz", + "integrity": "sha512-WCKP0MJucKbGfqhl/w8eZU94xY1bDhbLa1mxYR2g41UQ7UXQrqSEQ8vHvxDH2qiYK3xxcLNnQq6uUKo5T2qDog==", "license": "Apache-2.0", "dependencies": { "@better-auth/core": "1.7.0-rc.2", @@ -1814,13 +1761,13 @@ "@better-auth/scim": "1.7.0-rc.1", "@better-auth/sso": "1.7.0-rc.2", "@noble/hashes": "^2.2.0", - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/rest": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1", + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/rest": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2", "better-auth": "1.7.0-rc.2", - "jose": "^6.2.4" + "jose": "^6.2.5" }, "engines": { "node": ">=22.0.0" @@ -1984,28 +1931,28 @@ } }, "node_modules/@objectstack/plugin-email": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-email/-/plugin-email-17.0.0-rc.1.tgz", - "integrity": "sha512-/DmIStXH9bB54k1TZ0LHQHBekp4zfxV6YBeYDyoXRftOCz9DpuoHIbXEEanBHZ9BwiNwApHNCbxCgjiFDODQ4A==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-email/-/plugin-email-17.0.0-rc.2.tgz", + "integrity": "sha512-lCnTFc6NgOQJxJUacZ4BRBptkwebrBwz3wgAASEMt9VHFQSsRVycRKo6GXDy/Y11pRvDERsRT4kgU9q4ESZ2rQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/formula": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/formula": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" } }, "node_modules/@objectstack/plugin-hono-server": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-hono-server/-/plugin-hono-server-17.0.0-rc.1.tgz", - "integrity": "sha512-oV+fqjPWDVHppIM8ICS3SvTIWn5JMFv57/CcpK8Ocjm1qphBMj2kzHVwOyIaDKIK7yS177eK8JxcQBu4pQHvbA==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-hono-server/-/plugin-hono-server-17.0.0-rc.2.tgz", + "integrity": "sha512-YEynyWF4Q96qHI+4VpNo4yRnVXCTz6WXu6RbUUQNx2ODxIglO4ehmlgX33BLbaKXD6aOwoTgeuh6xu3QAHFVrg==", "license": "Apache-2.0", "dependencies": { "@hono/node-server": "^2.0.12", - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/observability": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1", + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/observability": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2", "hono": "^4.12.32" }, "engines": { @@ -2013,81 +1960,81 @@ } }, "node_modules/@objectstack/plugin-pinyin-search": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-pinyin-search/-/plugin-pinyin-search-17.0.0-rc.1.tgz", - "integrity": "sha512-VGuwSsaKQxIhc2Tb/pwK83gEFPdnKHMuolPSOuAuSG+zHlP0wYUOMbF5YKxH+czccc8fIwqogpXp2UcULsH5sQ==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-pinyin-search/-/plugin-pinyin-search-17.0.0-rc.2.tgz", + "integrity": "sha512-maBKVGnL4l9tP1LUGFpFJ/V+U7roR3LjbRLQM/01TT4S3zfTUm2y3xoTHo6XFf2q9zwdjyOzsK+gs1jo+G57Ow==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/objectql": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1", + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/objectql": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2", "pinyin-pro": "^3.28.2" } }, "node_modules/@objectstack/plugin-reports": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-reports/-/plugin-reports-17.0.0-rc.1.tgz", - "integrity": "sha512-3jSQ6Ckm4BfZB0rAiuOnJFQUTGbb28+AKBBaNGgrVG4odMJcmdcEWyXkYmOH7Rk+JrT7wG1/eGg0sOLdtuGBZA==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-reports/-/plugin-reports-17.0.0-rc.2.tgz", + "integrity": "sha512-Jf7jy5XeZ6sEPNulXDZeCZVHh0cCS/OuJGCdQzGkznpK3oHwzY4iVd7i0Ub/xie9H6XAoULFaBJrUzz3klyNJw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", "croner": "^10.0.1" } }, "node_modules/@objectstack/plugin-security": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-security/-/plugin-security-17.0.0-rc.1.tgz", - "integrity": "sha512-E8PV0SrKustSQ4ztBIwU2jqgZRKPZx6XIgx5jwKnG+gZw2OqHsyW7ieD+5IKCbJTaPn+bZfb+QetDPIq9fsZig==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-security/-/plugin-security-17.0.0-rc.2.tgz", + "integrity": "sha512-wIxcORDDD8p3Cl8HelHA4J3lF25zegMv7uIXTi1G1Y34Trj1Vjl2igUY3wJORZ84kLldfoJMKx7b42gRu7/uAQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/formula": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/formula": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/plugin-sharing": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-sharing/-/plugin-sharing-17.0.0-rc.1.tgz", - "integrity": "sha512-lJcQfzxtNCPYuZIc65zWFdb/QWV+TkwAw1oR/3DXhuhg0JgwXiZx72vCfXG4W3KsOTMg2ADfUBWjZ0TXPLBWCA==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-sharing/-/plugin-sharing-17.0.0-rc.2.tgz", + "integrity": "sha512-yTB3DDPOn+XnCEcm77fV1bmGUohQmwcVxQDqYjzvSbtTL8gsD/FOiWnoOaR6j6FO1kVVT3T2g5G6523SWM3pHQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/formula": "17.0.0-rc.1", - "@objectstack/objectql": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/formula": "17.0.0-rc.2", + "@objectstack/objectql": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2" } }, "node_modules/@objectstack/plugin-webhooks": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-webhooks/-/plugin-webhooks-17.0.0-rc.1.tgz", - "integrity": "sha512-qCKh1BIPjQmYGoZ7/iPyfQd9AjeFuEgl6XkfcEaM6SpowUU2NzWyUKYSZ+mVIvaMCKF0/1Z9ZjH6pMsUBlq0zg==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-webhooks/-/plugin-webhooks-17.0.0-rc.2.tgz", + "integrity": "sha512-IrmkE03ewhF1yXNcPuwU5sGU9QVf8XnbCjs1dZrIVAiUeFGbp8ndnkdBQujDYowiI2afA/rP/eAw0iYyJ5cWAQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/service-messaging": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/service-messaging": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" } }, "node_modules/@objectstack/rest": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/rest/-/rest-17.0.0-rc.1.tgz", - "integrity": "sha512-r8/tFrwHAq9ZmykKdOOsTsXHABodmcIBP4GY1fQP19vTspj6j870VYgYtcgKNnlfjmPmz+zPli1CNFQ6ynNqBA==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/rest/-/rest-17.0.0-rc.2.tgz", + "integrity": "sha512-Z0S1BK1pmIlBFqEtTgUMDaNco0szskzNZ01sTPZa2HEY8QrmEfVJIKLqPLjuBPzMRsI4cLNoRtCM2ZadrhbL0g==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/observability": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/service-package": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1", + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/observability": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/service-package": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2", "exceljs": "^4.4.0", "zod": "^4.4.3" }, @@ -2096,29 +2043,29 @@ } }, "node_modules/@objectstack/runtime": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/runtime/-/runtime-17.0.0-rc.1.tgz", - "integrity": "sha512-7hSg8e4c7TQ2/+TdVmuttWvtD/WfCicIMRZR2KSktGuUwC6MrfFQ7H1PeBIclQEIKz6lOYhPTsn76Ud6/hvXHQ==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/runtime/-/runtime-17.0.0-rc.2.tgz", + "integrity": "sha512-mHS1F0i8VE2NQHbDFrj72/wZb4tpsJaUefqUbIENhmaFFJJDvSykha1EA8pNYADEtod7mbWtrvJYrR1roGi46w==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/driver-memory": "17.0.0-rc.1", - "@objectstack/driver-sql": "17.0.0-rc.1", - "@objectstack/driver-sqlite-wasm": "17.0.0-rc.1", - "@objectstack/formula": "17.0.0-rc.1", - "@objectstack/metadata": "17.0.0-rc.1", - "@objectstack/metadata-core": "17.0.0-rc.1", - "@objectstack/metadata-protocol": "17.0.0-rc.1", - "@objectstack/objectql": "17.0.0-rc.1", - "@objectstack/observability": "17.0.0-rc.1", - "@objectstack/plugin-auth": "17.0.0-rc.1", - "@objectstack/plugin-security": "17.0.0-rc.1", - "@objectstack/rest": "17.0.0-rc.1", - "@objectstack/service-cluster": "17.0.0-rc.1", - "@objectstack/service-datasource": "17.0.0-rc.1", - "@objectstack/service-i18n": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1", + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/driver-memory": "17.0.0-rc.2", + "@objectstack/driver-sql": "17.0.0-rc.2", + "@objectstack/driver-sqlite-wasm": "17.0.0-rc.2", + "@objectstack/formula": "17.0.0-rc.2", + "@objectstack/metadata": "17.0.0-rc.2", + "@objectstack/metadata-core": "17.0.0-rc.2", + "@objectstack/metadata-protocol": "17.0.0-rc.2", + "@objectstack/objectql": "17.0.0-rc.2", + "@objectstack/observability": "17.0.0-rc.2", + "@objectstack/plugin-auth": "17.0.0-rc.2", + "@objectstack/plugin-security": "17.0.0-rc.2", + "@objectstack/rest": "17.0.0-rc.2", + "@objectstack/service-cluster": "17.0.0-rc.2", + "@objectstack/service-datasource": "17.0.0-rc.2", + "@objectstack/service-i18n": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2", "quickjs-emscripten": "^0.32.0", "zod": "^4.4.3" }, @@ -2126,100 +2073,100 @@ "node": ">=22.0.0" }, "optionalDependencies": { - "@objectstack/driver-mongodb": "17.0.0-rc.1" + "@objectstack/driver-mongodb": "17.0.0-rc.2" } }, "node_modules/@objectstack/sdui-parser": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/sdui-parser/-/sdui-parser-17.0.0-rc.1.tgz", - "integrity": "sha512-K96OHHU/HtBkumyKhNz+Sxnhvvy1wAtzQOjuTdwTDpUYLxJu3J3xqxoXPBQUh+FuYrTlxJq99CkhsSCjDrSLjA==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/sdui-parser/-/sdui-parser-17.0.0-rc.2.tgz", + "integrity": "sha512-Xc2ftxDFaDWyKmPWh+nAhgrMXmakKEXACdU/0fTrWertmfv9vRSrKomdCgFSvLksMxS/JcDT2O9EkMxGMQbj2g==", "license": "Apache-2.0" }, "node_modules/@objectstack/service-analytics": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/service-analytics/-/service-analytics-17.0.0-rc.1.tgz", - "integrity": "sha512-1X8EEmsAlFQlYSrFO+V0LKaE7GtlNpm/S7EwBMASZxGYd73rbNrbVPiFp5J7iTEtT6rgi6XmdzocTOXbf/vuMQ==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/service-analytics/-/service-analytics-17.0.0-rc.2.tgz", + "integrity": "sha512-Goz9nWuOZvyTFdqY6VvuiBfq2G+GCOnyRUOzHpkqlhsRKh0j2aVZoUH9Xj++8t2VYZqlu+eFhtsSgVOefOzBqQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/service-automation": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/service-automation/-/service-automation-17.0.0-rc.1.tgz", - "integrity": "sha512-Gl15ZAt7GQtQLqpgU/gtu+CSydOH0AVvBGkc/O/11Scf/67nWKMSB5APysFrfT/z0MBg/IJh4pV3cTXL8LeV4Q==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/service-automation/-/service-automation-17.0.0-rc.2.tgz", + "integrity": "sha512-8FNnmB8CFeK4ApLFNJH6QkMWu/P7aSFhVjNNFJRMWTUVwkuvPy76mq2zpl1pdG0+E2kusBBtM1hZaXwOCwJykg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/formula": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/formula": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/service-cache": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/service-cache/-/service-cache-17.0.0-rc.1.tgz", - "integrity": "sha512-nCM9zZIIB+8pFSKjl5UOheLIu3sdb5l7TxfLJcVRe2s2hSwfAB7wrD/+onTum0S/GRyjajs1SaiQNhJExjUJ3w==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/service-cache/-/service-cache-17.0.0-rc.2.tgz", + "integrity": "sha512-HzwxtHxqIYaWvoqZSiuRqOAZpFvthhLSHHp5hBXbswnvuPpMnA8MX0ni9PwAIpu4ObHcAOi/6Kghn0OUeViP5w==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/observability": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/observability": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/service-cluster": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/service-cluster/-/service-cluster-17.0.0-rc.1.tgz", - "integrity": "sha512-ThjOJ9pLzAUa41fNyGzq37B4Yc4UuIIz+z2tlxQlZpEBNxU8aZSBWzQIK0PTr1c31BMUrHx2xzNozJx8WIjq1g==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/service-cluster/-/service-cluster-17.0.0-rc.2.tgz", + "integrity": "sha512-idl7mdcB3hIkbq5BfCAdSt2jE6ePoG5MWrWa8JcYWkuBdbBcEC60vPeRcJeJaBcNYXsDIQsIGNsF2iiUBs2tSA==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" } }, "node_modules/@objectstack/service-datasource": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/service-datasource/-/service-datasource-17.0.0-rc.1.tgz", - "integrity": "sha512-9ONxSN/n9I16VKiboy4SfLvZiqYWnOjLMKr2nOU1rM1/vyIeTfstn9XAnCO9J0AiZvkGDP/nJyBetPPm0ykT1Q==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/service-datasource/-/service-datasource-17.0.0-rc.2.tgz", + "integrity": "sha512-VLHAn4IltqWhlxt30EjB7/aVAdwGl+mqDtbEtcO1tt8IWCgODmLkXFdcouPxEPLuhDNJL6PwoJo/OawmDacH7Q==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2" } }, "node_modules/@objectstack/service-i18n": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/service-i18n/-/service-i18n-17.0.0-rc.1.tgz", - "integrity": "sha512-IVgxAiSbWaLzOJsYekLPKmbKSxaxGvmz7qNvg781L1uInyTmhFxkN7N3hCIBxQR5gBeZncqsAJwDpu1Wk22KCg==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/service-i18n/-/service-i18n-17.0.0-rc.2.tgz", + "integrity": "sha512-uXqsblSgL5eR1GG15uAXFmbIjod6xcIfPx0LEA0Y+Fh3z+oOhVvlMwnX+5gXvudPDhX2hwLy2RHldjQYOR41Bg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/service-job": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/service-job/-/service-job-17.0.0-rc.1.tgz", - "integrity": "sha512-ffUPPY4kCJpBBmFLM0xDR8kAXJKewjsRCkiAhl+YyBUXzxpUnGsvA2s3WadYS4c4o+gWZ7RE+D+vpSLdBYQUbg==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/service-job/-/service-job-17.0.0-rc.2.tgz", + "integrity": "sha512-BoIL6qJjnL9AOdLmnA01ugapiuKa4zueTpMGNPSqMNaSg76pN+kwt559y5KUfMM8pUYAbluJviSMi7+9WOnFPw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", "croner": "^10.0.1" }, "engines": { @@ -2227,98 +2174,98 @@ } }, "node_modules/@objectstack/service-messaging": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/service-messaging/-/service-messaging-17.0.0-rc.1.tgz", - "integrity": "sha512-JyL4J3vEBP5RG8HQKMRSWXtwiLkxE4/c0838qsxwi0ALmh7e0fTeY2sUGE1r4iIGLX9LR47MDkaAstyChynPiw==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/service-messaging/-/service-messaging-17.0.0-rc.2.tgz", + "integrity": "sha512-CmOIY8USFsrscCTU+Xi/zKLhU2JqrG0REotvnIANS5jVYuJSnX8/L3lFWvNiIDrjDhzFTdBlIME7EE693vOxbA==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/service-package": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/service-package/-/service-package-17.0.0-rc.1.tgz", - "integrity": "sha512-z65nnIaB6esz7vLE/D63zqo0XYv6KV2+5ss+risw9ZbUiPKVNCiysaKAjO7kEoXWO2SeR56qG2Q04lpnclpvMg==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/service-package/-/service-package-17.0.0-rc.2.tgz", + "integrity": "sha512-ZaMDhu4OlJmM45S3aXn8UE02tAY4UGeFoMSQwltIM2/Ry+9sKqpSfjBxSXnNr3HAl5crMZdWU1HjyOBA4jhHyw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/metadata-core": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/metadata-core": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/service-queue": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/service-queue/-/service-queue-17.0.0-rc.1.tgz", - "integrity": "sha512-2HzqQlewLiv7DkuOkqP4KspdfmZEVJqBUgX8QYc7Jio5OffofdDw5xvX99wjRpQIlQWBhpUOFX47bU7ASMepPA==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/service-queue/-/service-queue-17.0.0-rc.2.tgz", + "integrity": "sha512-rDCCMDYNUDEggoZ6GvaTlkXy+9x6mFHOEmmbvM0WBHe6AkDJ0S9jagqjfhzkLHK5tOk/yv1KCQEqAD885BWgAw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/service-realtime": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/service-realtime/-/service-realtime-17.0.0-rc.1.tgz", - "integrity": "sha512-PODVYv0GzYv3ynt54ifCd7CJQM3I7aYVhVm2JGv3CDT/FERtg/b5VifFO5XNGtnpIFX3KmqFnMbaPAaI0/JdjQ==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/service-realtime/-/service-realtime-17.0.0-rc.2.tgz", + "integrity": "sha512-uj4iQ1nvGxJ5yj5PHNTLEmZ1wfXAnF9foDKphiGWJ5h4Pb5ixd3gYyZwz3IuRPwai04Rbt77jlx270X2QdeqJw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/service-settings": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/service-settings/-/service-settings-17.0.0-rc.1.tgz", - "integrity": "sha512-5uHzDV4mhvmA1VA2T9FKX/jtxLViE0Nv1Ab+Mdit+qgg/fRuZ91f9VHuUJzMZXvY/LtghPMLChkELX1ObFDI+A==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/service-settings/-/service-settings-17.0.0-rc.2.tgz", + "integrity": "sha512-9+zMUgDV/d38Abn1JVPtHXC2/ZPy+RaOCEhTLpC6dOviPMciJLWtZMxLubZecrFCdZZtuAalabSI2q+7DCImJA==", "license": "Apache-2.0", "dependencies": { "@noble/ciphers": "^2.2.0", - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/service-sms": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/service-sms/-/service-sms-17.0.0-rc.1.tgz", - "integrity": "sha512-4VDRSU4IdFQ15kmaTPINfcoeo2D3cO7jmOKimGwcGTiCbPeyQChrW1j+DKiDflX4E3KuPVb7bgpBU+VSr+3sRQ==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/service-sms/-/service-sms-17.0.0-rc.2.tgz", + "integrity": "sha512-PQB4buIXpMOrL+s9NNhRVFL3/IgcrNE4IGiBfAEqF4vgTmBxqYUzv+I5WFT+btgRD5j/GIoWzgck3yggHDuC2g==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" } }, "node_modules/@objectstack/service-storage": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/service-storage/-/service-storage-17.0.0-rc.1.tgz", - "integrity": "sha512-piDhFnBcX9h3B0ndbmeWlJeA7ADAv6lhVSFP+lfbKza6psV5XEF6jGyTG8ls4/uGMu/lQCbd2ciyzOqVfurQvw==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/service-storage/-/service-storage-17.0.0-rc.2.tgz", + "integrity": "sha512-XNrtYKuQWe8ehpYhy7U29S1IqDr/WhqNJ2lZyPyjynvoF9CJz+hBYvtTj9uQkVKpfx8QF4lw/LM51pSfAhCpeg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/observability": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1", - "@objectstack/types": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/observability": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" @@ -2337,22 +2284,22 @@ } }, "node_modules/@objectstack/setup": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/setup/-/setup-17.0.0-rc.1.tgz", - "integrity": "sha512-PrXO6ztglohuHF7Y+bhlEpB//Hz1Y+tYqu3VsJPwwXPPh9JnSi7oZDNYjpSkX3THAyDS70wqx1D8v3+QItFcfg==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/setup/-/setup-17.0.0-rc.2.tgz", + "integrity": "sha512-8KCjobU5s62D4OK+Getrt72lDI/M1Y3s9KNxD8gdQBfg0VEy4y/vkwcdSxW4756Iu6M+auU6DVGyFdH/braELA==", "license": "Apache-2.0", "dependencies": { - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/spec": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/spec/-/spec-17.0.0-rc.1.tgz", - "integrity": "sha512-1SIDQHwxaV8GLD8YqLxCJ0fxTag6eYvvWntihil+lBIxNSjYLI3U384I4l03esBvkytrts3L5W0WCZJkquJiXw==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/spec/-/spec-17.0.0-rc.2.tgz", + "integrity": "sha512-gvybztXuGTaqAlUzSOP4xeTpjl44ty2RZ67JQfiCma/engMG8pKqfv4/18nYitFktiWUVLsr2U6AquZAidmcRQ==", "license": "Apache-2.0", "dependencies": { "zod": "^4.4.3" @@ -2370,73 +2317,74 @@ } }, "node_modules/@objectstack/trigger-api": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/trigger-api/-/trigger-api-17.0.0-rc.1.tgz", - "integrity": "sha512-HwTQR3yePaOyvPlkG59Ce0eElCweVAKWMIyc69jJ4UQ09lRgrreGnfWCq7hOzGHU9KCfekKUrh+2VNkB2ZrECQ==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/trigger-api/-/trigger-api-17.0.0-rc.2.tgz", + "integrity": "sha512-/ikaIDgoax78u75ep1ynNrrlpqXqIBwAPftwZ/gMrEwczRFVxD0jitWlgDDfqBOE3FUnC3FG3NxPTUUog+/PsQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" } }, "node_modules/@objectstack/trigger-record-change": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/trigger-record-change/-/trigger-record-change-17.0.0-rc.1.tgz", - "integrity": "sha512-DwLsNvUaA6iEXTkgJFzmhLfLVa72C5lnVJvhjoKDnoLOKWeFsyQTolUYAYiC0KyQM8YUkmVgNungEZGYxo67og==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/trigger-record-change/-/trigger-record-change-17.0.0-rc.2.tgz", + "integrity": "sha512-mcogAAYFKlBQFOyeDBOWEEGKCIWpKr3EGjqOiUCbgTsDi+CSUdnA6KMFrsJriod/6p8pnIIUH9X1dHolHWCKHQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/trigger-schedule": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/trigger-schedule/-/trigger-schedule-17.0.0-rc.1.tgz", - "integrity": "sha512-cQYOS2TlXOOFFjiEljEbOCvvo2MI+ppfEVlGLRu5UyTzjKJF9V4He+AB2zwARog2BmcZX/nzpTMK9TxHTiAiTQ==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/trigger-schedule/-/trigger-schedule-17.0.0-rc.2.tgz", + "integrity": "sha512-lA/9IisY+cJyXb7ZOOU/5tQ+4w9bZxtqT+jrcuo/aDtoVcVeE1pbgZ/HJXnZZWNlMHLGNB7FYy7jbTsfG9UuIg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/types": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/types/-/types-17.0.0-rc.1.tgz", - "integrity": "sha512-DhxuS3zLyb9LAAukJVQokF3BHzmbhxdBAjLgSujKP/In1OBON5d2DAEK+SG0TfQsrkM3d7coqS88D+v9ZrsBtQ==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/types/-/types-17.0.0-rc.2.tgz", + "integrity": "sha512-2aFKni6C6bt0NbrOrTFmfAbeWAoZivH4e8eh1lHRRgnq8UWYHZCwZgfQI+UIB37+yvCT58O2weQSYNwGTJxglQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/spec": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" } }, "node_modules/@objectstack/verify": { - "version": "17.0.0-rc.1", - "resolved": "https://registry.npmjs.org/@objectstack/verify/-/verify-17.0.0-rc.1.tgz", - "integrity": "sha512-Z9gRzB+l+L5DVsHyFgGP8EwY49+VlqSmVcJN+EtqthcWD7MN71oWQCAeom9sQeY6tEIDW49izWrji7Dcv9nFww==", + "version": "17.0.0-rc.2", + "resolved": "https://registry.npmjs.org/@objectstack/verify/-/verify-17.0.0-rc.2.tgz", + "integrity": "sha512-GlpN1Quo0DdZn2n3nXxz4iKTUIPmdTYo5/oxhK7eL+Wlshkjx0LYPMicKvOyF/a2Fw0IlgtYF0npL02Lh8kw/A==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "17.0.0-rc.1", - "@objectstack/objectql": "17.0.0-rc.1", - "@objectstack/platform-objects": "17.0.0-rc.1", - "@objectstack/plugin-auth": "17.0.0-rc.1", - "@objectstack/plugin-hono-server": "17.0.0-rc.1", - "@objectstack/plugin-security": "17.0.0-rc.1", - "@objectstack/plugin-sharing": "17.0.0-rc.1", - "@objectstack/rest": "17.0.0-rc.1", - "@objectstack/runtime": "17.0.0-rc.1", - "@objectstack/service-analytics": "17.0.0-rc.1", - "@objectstack/service-automation": "17.0.0-rc.1", - "@objectstack/service-datasource": "17.0.0-rc.1", - "@objectstack/service-settings": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/core": "17.0.0-rc.2", + "@objectstack/objectql": "17.0.0-rc.2", + "@objectstack/platform-objects": "17.0.0-rc.2", + "@objectstack/plugin-auth": "17.0.0-rc.2", + "@objectstack/plugin-hono-server": "17.0.0-rc.2", + "@objectstack/plugin-security": "17.0.0-rc.2", + "@objectstack/plugin-sharing": "17.0.0-rc.2", + "@objectstack/rest": "17.0.0-rc.2", + "@objectstack/runtime": "17.0.0-rc.2", + "@objectstack/service-analytics": "17.0.0-rc.2", + "@objectstack/service-automation": "17.0.0-rc.2", + "@objectstack/service-datasource": "17.0.0-rc.2", + "@objectstack/service-settings": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2", + "@objectstack/types": "17.0.0-rc.2" }, "engines": { "node": ">=22.0.0" @@ -2507,9 +2455,9 @@ } }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.1.tgz", - "integrity": "sha512-02hOeOSryYxVrOIphmLAsqnCJWxwlzFk+pEt/N/i6OgT3lShHO7xGCU5cpgchRDHboAEbSjzgGh+O/u1GswQmA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.2.tgz", + "integrity": "sha512-l7x215OGvo1s52JWmR8U/DAVzEDWBCIbTm28aeJV/WDTSHgcKXaZTuBT0hJMs5NggilfJTW3clZVvd24yfKJxA==", "cpu": [ "arm64" ], @@ -2524,9 +2472,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.1.tgz", - "integrity": "sha512-fMsTOnN0OjFm3CyppWPitKnc8UlliVARUULW6cfU6AIqjdtgmSFWSk9vecHzZduv/yMWIHDlRhM1e8Iff9uAfA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.2.tgz", + "integrity": "sha512-9u9Xv6c1AJZT0FfwH5vrMG5Jjcwhc1MlyrPu0XfTqkzsmqfks2M6W/o5XwAJgVVN/jHpqqngC1WevHKKTIUtIA==", "cpu": [ "arm64" ], @@ -2541,9 +2489,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.1.tgz", - "integrity": "sha512-1wjKdz/XLGKHaTNHjQveQ/B23TKx4ItAqm1JbyVuvNPc4Ze0Fb48s49TAd/2zcplPl8okE/UbTgmlVfwT7eFeQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.2.tgz", + "integrity": "sha512-9W1mbGZAfW3oqd85bhBkmpyHCCzL1TeG/zFFP3vg7b0rlly8cxOcre5nXwz+LHazCwac2MNWgPdPCHndABjpWQ==", "cpu": [ "x64" ], @@ -2558,9 +2506,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.1.tgz", - "integrity": "sha512-Fa0jHR07E7YBN4vOEsbVf2briYNsuOowfLJaXULZM0ldMlaCaj2LJgLMbMe4iacRyZmvR8efFhgR9wKuGclQUg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.2.tgz", + "integrity": "sha512-0p1lhiCSCyaerFwtrdZQUx7NqGk6LQnaRKWX7tFQqwQgvX0rjM15cIkm3pax1UpEakK14C4mOxx/jSqCBdBRqQ==", "cpu": [ "x64" ], @@ -2575,9 +2523,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.1.tgz", - "integrity": "sha512-pzkgu1SSHGgRRyRZ4fbmSgmajbVt+epaLP99NDjFft69v/ypfTi6swBMiVdh2EkQ0OSnHE1lZDM7DRGkyAzUpA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.2.tgz", + "integrity": "sha512-e+cOJXrJ2L3zx6YzqPg+f6Wbk3V1cKB8bOhbaYdVYN3DdquzNdRAmrbETz1qnt5yp/c7JNlNjmITiA2cVneQ7w==", "cpu": [ "arm" ], @@ -2592,9 +2540,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.1.tgz", - "integrity": "sha512-QI5SEDY8cbiYWHx0VO4vIc3UlS6a32vXHjU8Qy/17adEmZIPuByJg13UEvo9c/UCiUkdcVWY83C+b+JrwnNyUg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.2.tgz", + "integrity": "sha512-JsSMsj6sNat/MuhG5fnBD7QgbtpHKVe30x5/bAVirDHdhoQRXJkF6xc0Jqk8O4fiCUQAzMOoH9wZi3m60c8wtg==", "cpu": [ "arm64" ], @@ -2609,9 +2557,9 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.1.tgz", - "integrity": "sha512-Sm41FyCeXqmYcERoYOCbGIL5hNfd8w9LQ7Y61Bev48HkcjaJqV/iiVOaiDxjVTRMS+QKrZmD8cfPt4uMVnvM+A==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.2.tgz", + "integrity": "sha512-B5G/zJdHaoJn9vD50eGHWkiWfmq8Uhi3IiLPJTzmZTrAalk1bztUikSXo0qga18ibE0IXboyeMUnhPjhAJ45wQ==", "cpu": [ "arm64" ], @@ -2626,9 +2574,9 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.1.tgz", - "integrity": "sha512-2x+WhXTGl9yJYPbltW/BSEPTVz9OIWQyER4N+gJEDWkkn904eRcBzELqh/Hf7K0w/ubGbKNMv0ZC+94QK/IFEg==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.2.tgz", + "integrity": "sha512-6mC/awzKka8W6EoekjegpfGkjz8jXWDX63pqu/HYVpyKtZfu65Jsh4QAH3Kej3CAv/c1oGX7psTmFEbr0mDxLA==", "cpu": [ "ppc64" ], @@ -2643,9 +2591,9 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.1.tgz", - "integrity": "sha512-eEjmQpuRQayHPWWnywaWHkFT3ToPbP3RYy42VVd/B9aBGDA+Ol25EIWHxKQST3IiWJjikCWUF7KtbfqwZrzVwQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.2.tgz", + "integrity": "sha512-412MX9fJLdA1IK28EZnc8jYv2HRTleOZgfLQumJ5zy7OeJLZlg/CETwFaXjNmGVxG51cFHpKLqb5LKvBC+HsHA==", "cpu": [ "s390x" ], @@ -2660,9 +2608,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.1.tgz", - "integrity": "sha512-/Orga1fZYkLc/56jBICcHrKchl8Z2UKdDSr3LG9ToWO1lQ6a4Livk9Xz+9WN91zsz5QR3XQz2NNoSDEvP6qadw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.2.tgz", + "integrity": "sha512-Q/+HI/ToJafZ1iCqGgVQXUEkIjufHCTF0gBQ2a5o3cg7GJ2h0qyq3nvvSmU+bGda2/7ygXpTY4TM6gO9OhQ0ZA==", "cpu": [ "x64" ], @@ -2677,9 +2625,9 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.1.tgz", - "integrity": "sha512-xxBJRL+0q0Kce7orznGWLuylHDY65vuARXZRpX+hPdv+DqK2c3NlCsVA98tlWzWNEE7yPqA/1NQ5nnCrj49Y5A==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.2.tgz", + "integrity": "sha512-ZKp/w41n6wCvxzxQHtQSbuphfX3Y4cCvbjkKHusrLx4lh+JWLTU7StSltO/DKARISzbj368d+qUaCjI8K2wzXw==", "cpu": [ "x64" ], @@ -2694,9 +2642,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.1.tgz", - "integrity": "sha512-M6AdXIXw3s+/8XpKMzdGDEXGS1S7kwUsy+rcTIUIOx5Ge4nXKCtAFHFV9YKkXvGcC5WMoTjAteLzlsQROVI0Yw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.2.tgz", + "integrity": "sha512-pxE6xD4KS3eAROkKK5yrhB9/3+vhlhVGMvlQLbdpzrBGDbKrnzx3RLwPaHvasLo6jgaiBLn7e04Df9C4tYhjmA==", "cpu": [ "arm64" ], @@ -2710,26 +2658,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.2.1.tgz", - "integrity": "sha512-/TX0SoRGojHzSAHpfVBbavRVSazg5U3h3Y3VXfcc0cdugq6kxdqw8LPGFiPr+/7gE/60zRcsOY2Vi9b9eT0jww==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "2.0.0-alpha.3", - "@emnapi/runtime": "2.0.0-alpha.3", - "@napi-rs/wasm-runtime": "^1.2.0" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=23.5.0" - } - }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.1.tgz", - "integrity": "sha512-EvRrivJieyHG+AO9lleZWgq+g0+S7oV2C51yuqlcyU/R9net+sI4Pj0F+lUoP2bEr6TWX3SqFaaS0SzfLxSzkw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.2.tgz", + "integrity": "sha512-4MqEue5re+xIZzAWsB8sj0P1kqZySWqIuN4t6QaIO/YA6SFwySOLruvWQFzfmqk8LBK2P30KCSJwf6mJCZZ5/A==", "cpu": [ "arm64" ], @@ -2744,9 +2676,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.1.tgz", - "integrity": "sha512-Z4eCmn5QJ/5+azF9knpLWKfVd9aidn0mAe9TpJgvBLId9Ax3t0+JVxBmT25Bv7NBbVW1TZyKjQjQReouMeH5UQ==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.2.tgz", + "integrity": "sha512-NweNxxD0Nf9t8v7kodun45Ijp3EIwYY+uydPP6qBEYvfBqhIjN6dZMzlQja3tqX/aLs3F3Uz+AxDpKgRhpOZQg==", "cpu": [ "x64" ], @@ -2784,17 +2716,6 @@ "tinyglobby": "^0.2.14" } }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", - "integrity": "sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -5169,9 +5090,9 @@ } }, "node_modules/hono": { - "version": "4.12.33", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.33.tgz", - "integrity": "sha512-+SwvkaiJtxsiPjhy9LivY/1m7UsNqCJetM1BrZl9A5DkQhlbHQDU730mMiDPWjnoCYOM8Chf3WrCJw27kNTPFQ==", + "version": "4.12.34", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.34.tgz", + "integrity": "sha512-GqXJqY/xJkJmuloTrnV1ZEXG3fqte+VjkUqoRNZXcrUidiUOP4fMSIHHY4tsqZBK++kVyWmt/AAfSUuy57/eSA==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -5533,9 +5454,9 @@ } }, "node_modules/jose": { - "version": "6.2.7", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.7.tgz", - "integrity": "sha512-hq1OB1bALKfydZNoViyg6hPVGV4i93ny9Op+n4zP5RSf7SCZEXa/TsG2O3IEr7+WlHRTPnpqDmHfMH6qXAD60w==", + "version": "6.2.8", + "resolved": "https://registry.npmjs.org/jose/-/jose-6.2.8.tgz", + "integrity": "sha512-Bsdjwm3Qsd/P0jR+BHDe3LytDfY7WBq2HmCCLIwuVRHMuEC9ae7/R474GIUdF1NgCyZjzVo/A9DOiOBtXq8ZoQ==", "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" @@ -6471,9 +6392,9 @@ } }, "node_modules/nanoid": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-6.0.0.tgz", - "integrity": "sha512-mkUH+rPkwU2qPadJ0oJZOjeZ5Mxn8Q1UhevwkTRWNuUZzyia3h4rhzK39hxaHTk0o2OxB8W2SQ6A8k23ZDi1pQ==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-6.0.1.tgz", + "integrity": "sha512-3wVS3i51pE2pi1k5FFL/95BGfVS0kSsvDVuGXHOtxox/TywUmtgq+3qiTOTbs9J7KfHaXPiN171k/A6dBnaXFw==", "funding": [ { "type": "github", @@ -6929,9 +6850,9 @@ } }, "node_modules/postcss/node_modules/nanoid": { - "version": "3.3.16", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.16.tgz", - "integrity": "sha512-bzlKTyNJ7+LdGIIwy8ijFpIqEQIvafahV7eYykJ8Cvh42EdJeODoJ6gUJXpQJvej1BddH8OqTXZNE/KfbWAu8Q==", + "version": "3.3.17", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.17.tgz", + "integrity": "sha512-xQLf0A3HOMlgHq0n247/LRuAOYmB7dXJ/DvAxGvsSBij45XtBSmQycu+F8ODbHwns/XyFZagyL1+J0Offw1E0g==", "devOptional": true, "funding": [ { @@ -7381,9 +7302,9 @@ } }, "node_modules/rolldown": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.1.tgz", - "integrity": "sha512-4FKJhg8d3OiyQOA6Q1Q0hoFFpW9/OoX+VsHzpECsdsIZoOArrAK90gl59YK/Z+gnDel45bgJZK03ozH/9bCqEw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.2.tgz", + "integrity": "sha512-opwpo1tQBAcpSUJDt94B7hhLNGOKjCdE//XXjeLrnx9b83bjnw45tXdg1b09yEw/VLFBJGZpwRULMmOZo7ol+A==", "devOptional": true, "license": "MIT", "dependencies": { @@ -7397,21 +7318,20 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.2.1", - "@rolldown/binding-darwin-arm64": "1.2.1", - "@rolldown/binding-darwin-x64": "1.2.1", - "@rolldown/binding-freebsd-x64": "1.2.1", - "@rolldown/binding-linux-arm-gnueabihf": "1.2.1", - "@rolldown/binding-linux-arm64-gnu": "1.2.1", - "@rolldown/binding-linux-arm64-musl": "1.2.1", - "@rolldown/binding-linux-ppc64-gnu": "1.2.1", - "@rolldown/binding-linux-s390x-gnu": "1.2.1", - "@rolldown/binding-linux-x64-gnu": "1.2.1", - "@rolldown/binding-linux-x64-musl": "1.2.1", - "@rolldown/binding-openharmony-arm64": "1.2.1", - "@rolldown/binding-wasm32-wasi": "1.2.1", - "@rolldown/binding-win32-arm64-msvc": "1.2.1", - "@rolldown/binding-win32-x64-msvc": "1.2.1" + "@rolldown/binding-android-arm64": "1.2.2", + "@rolldown/binding-darwin-arm64": "1.2.2", + "@rolldown/binding-darwin-x64": "1.2.2", + "@rolldown/binding-freebsd-x64": "1.2.2", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.2", + "@rolldown/binding-linux-arm64-gnu": "1.2.2", + "@rolldown/binding-linux-arm64-musl": "1.2.2", + "@rolldown/binding-linux-ppc64-gnu": "1.2.2", + "@rolldown/binding-linux-s390x-gnu": "1.2.2", + "@rolldown/binding-linux-x64-gnu": "1.2.2", + "@rolldown/binding-linux-x64-musl": "1.2.2", + "@rolldown/binding-openharmony-arm64": "1.2.2", + "@rolldown/binding-win32-arm64-msvc": "1.2.2", + "@rolldown/binding-win32-x64-msvc": "1.2.2" } }, "node_modules/rou3": { @@ -8191,18 +8111,10 @@ "code-block-writer": "^13.0.3" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD", - "optional": true - }, "node_modules/tsx": { - "version": "4.23.4", - "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.4.tgz", - "integrity": "sha512-ZiUQ8oT/KzN51mJUWPqARYqwFLFJZtGZipRkw1ynHMr9vy3eU77m5yfF3Gzm6meEg/beW+lUu3fHYgskTN2oVQ==", + "version": "4.23.5", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.5.tgz", + "integrity": "sha512-rw55FUaqOoI7RvlQwLbhO4nSDApnQ4/CykPuiQ/EPvtrX3WA9Ig55jIt9VvbBJbzJuj12ueRu4PMZ2SxPVbihg==", "license": "MIT", "dependencies": { "esbuild": "~0.28.0" diff --git a/package.json b/package.json index 1949c467..bf677952 100644 --- a/package.json +++ b/package.json @@ -33,24 +33,24 @@ }, "packageManager": "pnpm@10.33.0", "dependencies": { - "@objectstack/account": "17.0.0-rc.1", - "@objectstack/cli": "17.0.0-rc.1", - "@objectstack/driver-memory": "17.0.0-rc.1", - "@objectstack/driver-sql": "17.0.0-rc.1", - "@objectstack/driver-sqlite-wasm": "17.0.0-rc.1", - "@objectstack/metadata": "17.0.0-rc.1", - "@objectstack/objectql": "17.0.0-rc.1", - "@objectstack/runtime": "17.0.0-rc.1", - "@objectstack/service-analytics": "17.0.0-rc.1", - "@objectstack/service-automation": "17.0.0-rc.1", - "@objectstack/spec": "17.0.0-rc.1" + "@objectstack/account": "17.0.0-rc.2", + "@objectstack/cli": "17.0.0-rc.2", + "@objectstack/driver-memory": "17.0.0-rc.2", + "@objectstack/driver-sql": "17.0.0-rc.2", + "@objectstack/driver-sqlite-wasm": "17.0.0-rc.2", + "@objectstack/metadata": "17.0.0-rc.2", + "@objectstack/objectql": "17.0.0-rc.2", + "@objectstack/runtime": "17.0.0-rc.2", + "@objectstack/service-analytics": "17.0.0-rc.2", + "@objectstack/service-automation": "17.0.0-rc.2", + "@objectstack/spec": "17.0.0-rc.2" }, "optionalDependencies": { "better-sqlite3": "^12.11.1" }, "devDependencies": { "@changesets/cli": "^2.31.1", - "@objectstack/formula": "17.0.0-rc.1", + "@objectstack/formula": "17.0.0-rc.2", "@playwright/test": "^1.61.1", "@vitest/coverage-v8": "^4.1.10", "tsx": "^4.23.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 596516e6..e91fd40a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,45 +9,45 @@ importers: .: dependencies: '@objectstack/account': - specifier: 17.0.0-rc.1 - version: 17.0.0-rc.1(vitest@4.1.10) + specifier: 17.0.0-rc.2 + version: 17.0.0-rc.2(vitest@4.1.10) '@objectstack/cli': - specifier: 17.0.0-rc.1 - version: 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + specifier: 17.0.0-rc.2 + version: 17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) '@objectstack/driver-memory': - specifier: 17.0.0-rc.1 - version: 17.0.0-rc.1 + specifier: 17.0.0-rc.2 + version: 17.0.0-rc.2 '@objectstack/driver-sql': - specifier: 17.0.0-rc.1 - version: 17.0.0-rc.1 + specifier: 17.0.0-rc.2 + version: 17.0.0-rc.2 '@objectstack/driver-sqlite-wasm': - specifier: 17.0.0-rc.1 - version: 17.0.0-rc.1(better-sqlite3@12.11.1) + specifier: 17.0.0-rc.2 + version: 17.0.0-rc.2(better-sqlite3@12.11.1) '@objectstack/metadata': - specifier: 17.0.0-rc.1 - version: 17.0.0-rc.1(vitest@4.1.10) + specifier: 17.0.0-rc.2 + version: 17.0.0-rc.2(vitest@4.1.10) '@objectstack/objectql': - specifier: 17.0.0-rc.1 - version: 17.0.0-rc.1(vitest@4.1.10) + specifier: 17.0.0-rc.2 + version: 17.0.0-rc.2(vitest@4.1.10) '@objectstack/runtime': - specifier: 17.0.0-rc.1 - version: 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + specifier: 17.0.0-rc.2 + version: 17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) '@objectstack/service-analytics': - specifier: 17.0.0-rc.1 - version: 17.0.0-rc.1 + specifier: 17.0.0-rc.2 + version: 17.0.0-rc.2 '@objectstack/service-automation': - specifier: 17.0.0-rc.1 - version: 17.0.0-rc.1 + specifier: 17.0.0-rc.2 + version: 17.0.0-rc.2 '@objectstack/spec': - specifier: 17.0.0-rc.1 - version: 17.0.0-rc.1 + specifier: 17.0.0-rc.2 + version: 17.0.0-rc.2 devDependencies: '@changesets/cli': specifier: ^2.31.1 version: 2.31.1 '@objectstack/formula': - specifier: 17.0.0-rc.1 - version: 17.0.0-rc.1 + specifier: 17.0.0-rc.2 + version: 17.0.0-rc.2 '@playwright/test': specifier: ^1.61.1 version: 1.62.0 @@ -526,40 +526,40 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@objectstack/account@17.0.0-rc.1': - resolution: {integrity: sha512-n1cI+ZtKdQotXohYjdFUSYWoLas9is4MbVpAbG/RVMra4iSp2EsYWUZnuOfuB9iZGEAcn0QW9IfQNzCRWszvVw==} + '@objectstack/account@17.0.0-rc.2': + resolution: {integrity: sha512-hUs3DVw9hp5mP2sbqHDeDLb/ffT523/r26/5yfd7+YnvlyUDDucGWvl2x5BQlVQ9PvMYbrNF0WnZeWSCxU2OTg==} engines: {node: '>=22.0.0'} - '@objectstack/cli@17.0.0-rc.1': - resolution: {integrity: sha512-eirXq1GxshNwjNIczaud6SINZymo19CQB/zsSuJpV9Cy85oEhlnFSKrJKrDX3JVuZ2hNdhGgGxnFxksarI5wgw==} + '@objectstack/cli@17.0.0-rc.2': + resolution: {integrity: sha512-XznKd0y16uPJCq9g1mJNMHlwwHtjd1Zc4DnpQ917/VGjuiE3QY8sYN0oXY9xW4QFeYk6tMvUnKwBqinM71O3bQ==} engines: {node: '>=22.0.0'} hasBin: true - '@objectstack/client@17.0.0-rc.1': - resolution: {integrity: sha512-3ZRNyx+lOx8C+LBBChhXZc22rWcMa5wufVRrGHc5Dfd42OZqn5AsbKjjhSZrHEfyoCvmeeENo9JGlej0R8RJ9Q==} + '@objectstack/client@17.0.0-rc.2': + resolution: {integrity: sha512-tM4jm2R6UnR2+ymA94BSefco9DbrgeZFytL6b/mTVaUv7uy/joSZKWWrcEG5FiBzcyxJCevDvQixRHuiYzcHHg==} engines: {node: '>=22.0.0'} - '@objectstack/cloud-connection@17.0.0-rc.1': - resolution: {integrity: sha512-tKUJk966/hprzRoOmZRvJowXToNwG+ECtx7wq79bOxMYBVf4V9BHfIfCMw3adngyYSLn+YHYziL8RppkdzH79w==} + '@objectstack/cloud-connection@17.0.0-rc.2': + resolution: {integrity: sha512-Fc2ySjnC33b3/oJd4lHagUW3BhEyU161x/UHQS7lBfYA6JzcL3c85TdbKI/nAp8uyq7JmbJ7Dz3hiz9m8c7Dxw==} engines: {node: '>=22.0.0'} - '@objectstack/console@17.0.0-rc.1': - resolution: {integrity: sha512-oSp9PM7QAjEwgNDK+Kq8CpT6835PeFOrRbARLbRE+fMr9WmofYxWJYuk/ShN4+HGo+b+0lNk2vkrX/o7gDg5zg==} + '@objectstack/console@17.0.0-rc.2': + resolution: {integrity: sha512-kaNdZsAp7Bdw9Zx9puwgq6dZcNCMyU8LeEvG9PbqF6KWssT1GQMqeiRtq5HNc25tt9KOXR/U+ule8V6sGOmGYw==} - '@objectstack/core@17.0.0-rc.1': - resolution: {integrity: sha512-3snd0dJhd+MPEDek+YRapZ02siBnbxYNNl8GoyfnlSeEuKXdcY6bDBf/zueAwoTqyV32zNG5epA85cZh1zLQPw==} + '@objectstack/core@17.0.0-rc.2': + resolution: {integrity: sha512-5hAtKmjBbzEWA7qWXCN8WB12+BhGZ8jZYg7Y5r8PHYH+jOf5ZLX4KkD3bQw6oTUBpBhWclLVREKSlah9truGRA==} engines: {node: '>=22.0.0'} - '@objectstack/driver-memory@17.0.0-rc.1': - resolution: {integrity: sha512-OxQAuNjCZVASpys5DVNVo/kcFUhsXtytAjVqCWVqCZPPmCaZ925RFqbCfDbnDh+1JCEQ0HTFzj+t8AYCViS2oA==} + '@objectstack/driver-memory@17.0.0-rc.2': + resolution: {integrity: sha512-zpfVQv1FcH4xRkDuvQwFuwBjtPiEa7jJcooBfIEpnirmgKtXC//93bFuQh62wwBTzaUSSvh33s+2oI+9QW4KQA==} engines: {node: '>=22.0.0'} - '@objectstack/driver-mongodb@17.0.0-rc.1': - resolution: {integrity: sha512-zPzNcTPZ8LSsCvqF8q73iVMhtSxIRlW5gij3F+p9w1Lbr8/PuOkFoWn00P7NLtVhX+ki5AParIvLZxu/gIUHUA==} + '@objectstack/driver-mongodb@17.0.0-rc.2': + resolution: {integrity: sha512-a3A+liqxuLEQMBl6qP8dn5La4f36BnLJIx5oMv4V5z3kiLkRh6sa8z+VhsbBG08tkbdnb6FhO740+4GUG/DG1g==} engines: {node: '>=22.0.0'} - '@objectstack/driver-sql@17.0.0-rc.1': - resolution: {integrity: sha512-6uHyQ3GmKqSjL8Cr5u10TBWfOuOK9x2Ur97CwMbvO6ydECzKyztwVm3KVlsQIgmVA9WHLyYG+rYkjH+SSC4mJg==} + '@objectstack/driver-sql@17.0.0-rc.2': + resolution: {integrity: sha512-7IUaaq0SEJlxp4CO+b0RnlDtn1O1q+zmfbeOCDNRtmUVnaLzfGheAmrKbwNghHhez2RS9VvlrRfEk+V1gZiIUA==} engines: {node: '>=22.0.0'} peerDependencies: mysql2: ^3.0.0 @@ -573,23 +573,23 @@ packages: tedious: optional: true - '@objectstack/driver-sqlite-wasm@17.0.0-rc.1': - resolution: {integrity: sha512-oz4Kt29T+ys06RO/PIJk1McT+rx/F5E+sBa507NaycWaLElM10GeoGZ/L7FWthZXMndkKN4qlGVG7uzbZrYzVQ==} + '@objectstack/driver-sqlite-wasm@17.0.0-rc.2': + resolution: {integrity: sha512-h4p4Cve7MH1fHCzWvM43Z+ixsXHosdvrDqkLjFsCvRS7yR1ahQuUc0n3XvTsPiFfjJanR4y4ilXow1L+UKT1hw==} engines: {node: '>=22.0.0'} - '@objectstack/formula@17.0.0-rc.1': - resolution: {integrity: sha512-oAJENCl3QQcJA0484ScNdOU6EX5MEZ14pRF7sLITnoBkXGhgh/eMKboG+q6zLGJsZwS4ThPEu6sF72GVDlEmuw==} + '@objectstack/formula@17.0.0-rc.2': + resolution: {integrity: sha512-+4H3nESU3fH+pjjV4b1P8llvSPff/vQF0Th5/FdbZrYz0fKxoNNL+MtLBAzpu+ME3ZLFMwwsKRH7obPyCS9wmQ==} - '@objectstack/lint@17.0.0-rc.1': - resolution: {integrity: sha512-qIXylf5FsFhWAii0m+jQp49kZXlTnGXNz/cyZTrvqwJItI78k5afo3zKxZjmDreGRnAFIKXJLGLEDvZWjHgdFg==} + '@objectstack/lint@17.0.0-rc.2': + resolution: {integrity: sha512-S571+BtsXhyBpfZSNh9Ic0ljH8cVKyhgaVbQjqPc0ICgzvwh9/b4PEB7ElbgWUvTNje2KOriLgCjgNGGnTGfuw==} engines: {node: '>=22.0.0'} - '@objectstack/mcp@17.0.0-rc.1': - resolution: {integrity: sha512-lGPbHiiI861013hPbSt2Us/yd1jHNdRy/i6pkNsjzCuedOuSOGm7A/UtXHj3fBnryZOaiBJMLTeJg9UkBEALeA==} + '@objectstack/mcp@17.0.0-rc.2': + resolution: {integrity: sha512-GluJpCZ5UHCjlSTR5cAJagpv3CSDotPpN4kU2mGqpXNUf7j7/THIjppi74Ejlc9hWTcUm7F+BfSMoSb6JZjuVA==} engines: {node: '>=22.0.0'} - '@objectstack/metadata-core@17.0.0-rc.1': - resolution: {integrity: sha512-ZU6d27sGnwRY8LXrWv1xHhaomPH/XswP1geyOxFgZtIimrbTgjIR56jZ8n7SBgjBw4zMWfbXF+YHNIXudnvDsg==} + '@objectstack/metadata-core@17.0.0-rc.2': + resolution: {integrity: sha512-to12UP5HnC5/PUj0BQc8FS6Yh2PxiQL7jXaAQ+dubxK/T7IRdSKOZ5Dn0C7ss7MINg7NlobFMee4wlwuP3BsBQ==} engines: {node: '>=22.0.0'} peerDependencies: vitest: ^4.0.0 @@ -597,126 +597,126 @@ packages: vitest: optional: true - '@objectstack/metadata-fs@17.0.0-rc.1': - resolution: {integrity: sha512-2zk5gzE982SAs6qtNjjdb3N3gNgzkcANQ6jL5h3/p4G4Hz51AxRXD/mvUI82ZYt0GsikvParYvqD8ISi+86lDw==} + '@objectstack/metadata-fs@17.0.0-rc.2': + resolution: {integrity: sha512-SQHZoO4szNGZfo059MXnS9f5XEEH65QDb473bR8Vw8WJZV6kfCrw//+9HRw/4td0Jq4XqvvOp145/wwwB/klDQ==} engines: {node: '>=22.0.0'} - '@objectstack/metadata-protocol@17.0.0-rc.1': - resolution: {integrity: sha512-2XtShkp/f2W+koSwX4E4OmmKoZvkbjS3oh8JTwdgbqEgmTdQgafHiLrStr3CCzcpttmIlFUInQoTky8QYy62iQ==} + '@objectstack/metadata-protocol@17.0.0-rc.2': + resolution: {integrity: sha512-NlubR8Osa0P2htJ5B2CSxYC5SH7QbEfykSmoJqkY96cNJP7MNVL+1ROMmgwEl7d+R0DPt6DL5D6X4lTIGRwp9g==} engines: {node: '>=22.0.0'} - '@objectstack/metadata@17.0.0-rc.1': - resolution: {integrity: sha512-zXDeP9+zONVuwSaRL0IuaPfEjRHxISTyEBip77molWd0GQ/nQhtpj9T278DUvzAC1q5BEG3wXX985yHXMDboqg==} + '@objectstack/metadata@17.0.0-rc.2': + resolution: {integrity: sha512-AR0u/gVd/Ew9oa0hPBl1K+3QN4Zeraw2xXgi1iG4lVx7BEnx30mxG2e2spiKo6KOnwO1NAeaHs+gxwKnaZj7LQ==} engines: {node: '>=22.0.0'} - '@objectstack/objectql@17.0.0-rc.1': - resolution: {integrity: sha512-+jXtGwGDLggNuNfjTy9LvF6dqgxBlyfzN/6gYQ2pmE97hZ9WU70E6H1oZRDEF4j391gBVxfTilhDxjgIGmh0ow==} + '@objectstack/objectql@17.0.0-rc.2': + resolution: {integrity: sha512-J1wKVnS1a/WwkDbBF8OnGCFg7uKzpepg36Ku30Dak9dQvrj3Fh4r4b8DJZ4HH/Plx2+mQYC+3+9UZL1ijsXKZw==} engines: {node: '>=22.0.0'} - '@objectstack/observability@17.0.0-rc.1': - resolution: {integrity: sha512-uqOt8i3H5lWk+grXdnU+d6zxr4yFGROQ9i9WILKUZbv6cP65tKKFSUwFIbL09Q6wjWYDo36SbenwCqKQADQjhw==} + '@objectstack/observability@17.0.0-rc.2': + resolution: {integrity: sha512-04f/B6ZrkJC/dmvSWj+gNlhYUHr8hvFvDxb9ROjlM9u7dJTRmVKeHqmfEImgFbTOQN95lmKJkE/7OOR5WIamTw==} engines: {node: '>=22.0.0'} - '@objectstack/platform-objects@17.0.0-rc.1': - resolution: {integrity: sha512-SVMp3ZDrdpK39e8QDwfFuyd1yzSG7Bw45Ge4Hb36w8zpuuDOCAhqV+v30/yA+ZBXY/wt7GPEUb9AVgZUlXfcgA==} + '@objectstack/platform-objects@17.0.0-rc.2': + resolution: {integrity: sha512-MvinidIaLaIt7AT8a0URwJqkd3JmLocbnAzPXDgs8bi84FKiqyNd8QxvkJZQBwhapzpfvu9c2XftWpZ0/omMvw==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-approvals@17.0.0-rc.1': - resolution: {integrity: sha512-VDyKGaVAJuVcW4WFNJET+NiExobbvfVOLkB3xZHhuzY+SQZNQfeypIBo+xT37+/KZdWKyif4O3V30za3uM7eXQ==} + '@objectstack/plugin-approvals@17.0.0-rc.2': + resolution: {integrity: sha512-+1tPfw0if1IbuQT2GBXLV9DXL2b20el7msh33SQfQP6HKPyQvURkO8rchJVUpgTeQ68LkT/38racrVpI2sktGg==} - '@objectstack/plugin-audit@17.0.0-rc.1': - resolution: {integrity: sha512-vm24oYZkUldz3X9iZ/tl79SQynIWBWlhONtLmPsKQHMJPOzN//KtU9VnWzZTJUdisDsrMI356zRlnnw49/Avcg==} + '@objectstack/plugin-audit@17.0.0-rc.2': + resolution: {integrity: sha512-P4eXHAaFj4709ngljhipnPckTQbN14WVcNIIKUHd4jNl6QyAwzOEPoVTLzpYkKwesuiSO+2am0YuN8kxY41Oiw==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-auth@17.0.0-rc.1': - resolution: {integrity: sha512-xqJE38AR5SnC0cZPyqalttU7s1Kh8iLAL7rMYcG7tNhDuFNRROqUwCOFO3OXFb6yKeWatKiFc/dFz36C+h+DAA==} + '@objectstack/plugin-auth@17.0.0-rc.2': + resolution: {integrity: sha512-WCKP0MJucKbGfqhl/w8eZU94xY1bDhbLa1mxYR2g41UQ7UXQrqSEQ8vHvxDH2qiYK3xxcLNnQq6uUKo5T2qDog==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-email@17.0.0-rc.1': - resolution: {integrity: sha512-/DmIStXH9bB54k1TZ0LHQHBekp4zfxV6YBeYDyoXRftOCz9DpuoHIbXEEanBHZ9BwiNwApHNCbxCgjiFDODQ4A==} + '@objectstack/plugin-email@17.0.0-rc.2': + resolution: {integrity: sha512-lCnTFc6NgOQJxJUacZ4BRBptkwebrBwz3wgAASEMt9VHFQSsRVycRKo6GXDy/Y11pRvDERsRT4kgU9q4ESZ2rQ==} - '@objectstack/plugin-hono-server@17.0.0-rc.1': - resolution: {integrity: sha512-oV+fqjPWDVHppIM8ICS3SvTIWn5JMFv57/CcpK8Ocjm1qphBMj2kzHVwOyIaDKIK7yS177eK8JxcQBu4pQHvbA==} + '@objectstack/plugin-hono-server@17.0.0-rc.2': + resolution: {integrity: sha512-YEynyWF4Q96qHI+4VpNo4yRnVXCTz6WXu6RbUUQNx2ODxIglO4ehmlgX33BLbaKXD6aOwoTgeuh6xu3QAHFVrg==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-pinyin-search@17.0.0-rc.1': - resolution: {integrity: sha512-VGuwSsaKQxIhc2Tb/pwK83gEFPdnKHMuolPSOuAuSG+zHlP0wYUOMbF5YKxH+czccc8fIwqogpXp2UcULsH5sQ==} + '@objectstack/plugin-pinyin-search@17.0.0-rc.2': + resolution: {integrity: sha512-maBKVGnL4l9tP1LUGFpFJ/V+U7roR3LjbRLQM/01TT4S3zfTUm2y3xoTHo6XFf2q9zwdjyOzsK+gs1jo+G57Ow==} - '@objectstack/plugin-reports@17.0.0-rc.1': - resolution: {integrity: sha512-3jSQ6Ckm4BfZB0rAiuOnJFQUTGbb28+AKBBaNGgrVG4odMJcmdcEWyXkYmOH7Rk+JrT7wG1/eGg0sOLdtuGBZA==} + '@objectstack/plugin-reports@17.0.0-rc.2': + resolution: {integrity: sha512-Jf7jy5XeZ6sEPNulXDZeCZVHh0cCS/OuJGCdQzGkznpK3oHwzY4iVd7i0Ub/xie9H6XAoULFaBJrUzz3klyNJw==} - '@objectstack/plugin-security@17.0.0-rc.1': - resolution: {integrity: sha512-E8PV0SrKustSQ4ztBIwU2jqgZRKPZx6XIgx5jwKnG+gZw2OqHsyW7ieD+5IKCbJTaPn+bZfb+QetDPIq9fsZig==} + '@objectstack/plugin-security@17.0.0-rc.2': + resolution: {integrity: sha512-wIxcORDDD8p3Cl8HelHA4J3lF25zegMv7uIXTi1G1Y34Trj1Vjl2igUY3wJORZ84kLldfoJMKx7b42gRu7/uAQ==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-sharing@17.0.0-rc.1': - resolution: {integrity: sha512-lJcQfzxtNCPYuZIc65zWFdb/QWV+TkwAw1oR/3DXhuhg0JgwXiZx72vCfXG4W3KsOTMg2ADfUBWjZ0TXPLBWCA==} + '@objectstack/plugin-sharing@17.0.0-rc.2': + resolution: {integrity: sha512-yTB3DDPOn+XnCEcm77fV1bmGUohQmwcVxQDqYjzvSbtTL8gsD/FOiWnoOaR6j6FO1kVVT3T2g5G6523SWM3pHQ==} - '@objectstack/plugin-webhooks@17.0.0-rc.1': - resolution: {integrity: sha512-qCKh1BIPjQmYGoZ7/iPyfQd9AjeFuEgl6XkfcEaM6SpowUU2NzWyUKYSZ+mVIvaMCKF0/1Z9ZjH6pMsUBlq0zg==} + '@objectstack/plugin-webhooks@17.0.0-rc.2': + resolution: {integrity: sha512-IrmkE03ewhF1yXNcPuwU5sGU9QVf8XnbCjs1dZrIVAiUeFGbp8ndnkdBQujDYowiI2afA/rP/eAw0iYyJ5cWAQ==} - '@objectstack/rest@17.0.0-rc.1': - resolution: {integrity: sha512-r8/tFrwHAq9ZmykKdOOsTsXHABodmcIBP4GY1fQP19vTspj6j870VYgYtcgKNnlfjmPmz+zPli1CNFQ6ynNqBA==} + '@objectstack/rest@17.0.0-rc.2': + resolution: {integrity: sha512-Z0S1BK1pmIlBFqEtTgUMDaNco0szskzNZ01sTPZa2HEY8QrmEfVJIKLqPLjuBPzMRsI4cLNoRtCM2ZadrhbL0g==} engines: {node: '>=22.0.0'} - '@objectstack/runtime@17.0.0-rc.1': - resolution: {integrity: sha512-7hSg8e4c7TQ2/+TdVmuttWvtD/WfCicIMRZR2KSktGuUwC6MrfFQ7H1PeBIclQEIKz6lOYhPTsn76Ud6/hvXHQ==} + '@objectstack/runtime@17.0.0-rc.2': + resolution: {integrity: sha512-mHS1F0i8VE2NQHbDFrj72/wZb4tpsJaUefqUbIENhmaFFJJDvSykha1EA8pNYADEtod7mbWtrvJYrR1roGi46w==} engines: {node: '>=22.0.0'} - '@objectstack/sdui-parser@17.0.0-rc.1': - resolution: {integrity: sha512-K96OHHU/HtBkumyKhNz+Sxnhvvy1wAtzQOjuTdwTDpUYLxJu3J3xqxoXPBQUh+FuYrTlxJq99CkhsSCjDrSLjA==} + '@objectstack/sdui-parser@17.0.0-rc.2': + resolution: {integrity: sha512-Xc2ftxDFaDWyKmPWh+nAhgrMXmakKEXACdU/0fTrWertmfv9vRSrKomdCgFSvLksMxS/JcDT2O9EkMxGMQbj2g==} - '@objectstack/service-analytics@17.0.0-rc.1': - resolution: {integrity: sha512-1X8EEmsAlFQlYSrFO+V0LKaE7GtlNpm/S7EwBMASZxGYd73rbNrbVPiFp5J7iTEtT6rgi6XmdzocTOXbf/vuMQ==} + '@objectstack/service-analytics@17.0.0-rc.2': + resolution: {integrity: sha512-Goz9nWuOZvyTFdqY6VvuiBfq2G+GCOnyRUOzHpkqlhsRKh0j2aVZoUH9Xj++8t2VYZqlu+eFhtsSgVOefOzBqQ==} engines: {node: '>=22.0.0'} - '@objectstack/service-automation@17.0.0-rc.1': - resolution: {integrity: sha512-Gl15ZAt7GQtQLqpgU/gtu+CSydOH0AVvBGkc/O/11Scf/67nWKMSB5APysFrfT/z0MBg/IJh4pV3cTXL8LeV4Q==} + '@objectstack/service-automation@17.0.0-rc.2': + resolution: {integrity: sha512-8FNnmB8CFeK4ApLFNJH6QkMWu/P7aSFhVjNNFJRMWTUVwkuvPy76mq2zpl1pdG0+E2kusBBtM1hZaXwOCwJykg==} engines: {node: '>=22.0.0'} - '@objectstack/service-cache@17.0.0-rc.1': - resolution: {integrity: sha512-nCM9zZIIB+8pFSKjl5UOheLIu3sdb5l7TxfLJcVRe2s2hSwfAB7wrD/+onTum0S/GRyjajs1SaiQNhJExjUJ3w==} + '@objectstack/service-cache@17.0.0-rc.2': + resolution: {integrity: sha512-HzwxtHxqIYaWvoqZSiuRqOAZpFvthhLSHHp5hBXbswnvuPpMnA8MX0ni9PwAIpu4ObHcAOi/6Kghn0OUeViP5w==} engines: {node: '>=22.0.0'} - '@objectstack/service-cluster@17.0.0-rc.1': - resolution: {integrity: sha512-ThjOJ9pLzAUa41fNyGzq37B4Yc4UuIIz+z2tlxQlZpEBNxU8aZSBWzQIK0PTr1c31BMUrHx2xzNozJx8WIjq1g==} + '@objectstack/service-cluster@17.0.0-rc.2': + resolution: {integrity: sha512-idl7mdcB3hIkbq5BfCAdSt2jE6ePoG5MWrWa8JcYWkuBdbBcEC60vPeRcJeJaBcNYXsDIQsIGNsF2iiUBs2tSA==} - '@objectstack/service-datasource@17.0.0-rc.1': - resolution: {integrity: sha512-9ONxSN/n9I16VKiboy4SfLvZiqYWnOjLMKr2nOU1rM1/vyIeTfstn9XAnCO9J0AiZvkGDP/nJyBetPPm0ykT1Q==} + '@objectstack/service-datasource@17.0.0-rc.2': + resolution: {integrity: sha512-VLHAn4IltqWhlxt30EjB7/aVAdwGl+mqDtbEtcO1tt8IWCgODmLkXFdcouPxEPLuhDNJL6PwoJo/OawmDacH7Q==} - '@objectstack/service-i18n@17.0.0-rc.1': - resolution: {integrity: sha512-IVgxAiSbWaLzOJsYekLPKmbKSxaxGvmz7qNvg781L1uInyTmhFxkN7N3hCIBxQR5gBeZncqsAJwDpu1Wk22KCg==} + '@objectstack/service-i18n@17.0.0-rc.2': + resolution: {integrity: sha512-uXqsblSgL5eR1GG15uAXFmbIjod6xcIfPx0LEA0Y+Fh3z+oOhVvlMwnX+5gXvudPDhX2hwLy2RHldjQYOR41Bg==} engines: {node: '>=22.0.0'} - '@objectstack/service-job@17.0.0-rc.1': - resolution: {integrity: sha512-ffUPPY4kCJpBBmFLM0xDR8kAXJKewjsRCkiAhl+YyBUXzxpUnGsvA2s3WadYS4c4o+gWZ7RE+D+vpSLdBYQUbg==} + '@objectstack/service-job@17.0.0-rc.2': + resolution: {integrity: sha512-BoIL6qJjnL9AOdLmnA01ugapiuKa4zueTpMGNPSqMNaSg76pN+kwt559y5KUfMM8pUYAbluJviSMi7+9WOnFPw==} engines: {node: '>=22.0.0'} - '@objectstack/service-messaging@17.0.0-rc.1': - resolution: {integrity: sha512-JyL4J3vEBP5RG8HQKMRSWXtwiLkxE4/c0838qsxwi0ALmh7e0fTeY2sUGE1r4iIGLX9LR47MDkaAstyChynPiw==} + '@objectstack/service-messaging@17.0.0-rc.2': + resolution: {integrity: sha512-CmOIY8USFsrscCTU+Xi/zKLhU2JqrG0REotvnIANS5jVYuJSnX8/L3lFWvNiIDrjDhzFTdBlIME7EE693vOxbA==} engines: {node: '>=22.0.0'} - '@objectstack/service-package@17.0.0-rc.1': - resolution: {integrity: sha512-z65nnIaB6esz7vLE/D63zqo0XYv6KV2+5ss+risw9ZbUiPKVNCiysaKAjO7kEoXWO2SeR56qG2Q04lpnclpvMg==} + '@objectstack/service-package@17.0.0-rc.2': + resolution: {integrity: sha512-ZaMDhu4OlJmM45S3aXn8UE02tAY4UGeFoMSQwltIM2/Ry+9sKqpSfjBxSXnNr3HAl5crMZdWU1HjyOBA4jhHyw==} engines: {node: '>=22.0.0'} - '@objectstack/service-queue@17.0.0-rc.1': - resolution: {integrity: sha512-2HzqQlewLiv7DkuOkqP4KspdfmZEVJqBUgX8QYc7Jio5OffofdDw5xvX99wjRpQIlQWBhpUOFX47bU7ASMepPA==} + '@objectstack/service-queue@17.0.0-rc.2': + resolution: {integrity: sha512-rDCCMDYNUDEggoZ6GvaTlkXy+9x6mFHOEmmbvM0WBHe6AkDJ0S9jagqjfhzkLHK5tOk/yv1KCQEqAD885BWgAw==} engines: {node: '>=22.0.0'} - '@objectstack/service-realtime@17.0.0-rc.1': - resolution: {integrity: sha512-PODVYv0GzYv3ynt54ifCd7CJQM3I7aYVhVm2JGv3CDT/FERtg/b5VifFO5XNGtnpIFX3KmqFnMbaPAaI0/JdjQ==} + '@objectstack/service-realtime@17.0.0-rc.2': + resolution: {integrity: sha512-uj4iQ1nvGxJ5yj5PHNTLEmZ1wfXAnF9foDKphiGWJ5h4Pb5ixd3gYyZwz3IuRPwai04Rbt77jlx270X2QdeqJw==} engines: {node: '>=22.0.0'} - '@objectstack/service-settings@17.0.0-rc.1': - resolution: {integrity: sha512-5uHzDV4mhvmA1VA2T9FKX/jtxLViE0Nv1Ab+Mdit+qgg/fRuZ91f9VHuUJzMZXvY/LtghPMLChkELX1ObFDI+A==} + '@objectstack/service-settings@17.0.0-rc.2': + resolution: {integrity: sha512-9+zMUgDV/d38Abn1JVPtHXC2/ZPy+RaOCEhTLpC6dOviPMciJLWtZMxLubZecrFCdZZtuAalabSI2q+7DCImJA==} engines: {node: '>=22.0.0'} - '@objectstack/service-sms@17.0.0-rc.1': - resolution: {integrity: sha512-4VDRSU4IdFQ15kmaTPINfcoeo2D3cO7jmOKimGwcGTiCbPeyQChrW1j+DKiDflX4E3KuPVb7bgpBU+VSr+3sRQ==} + '@objectstack/service-sms@17.0.0-rc.2': + resolution: {integrity: sha512-PQB4buIXpMOrL+s9NNhRVFL3/IgcrNE4IGiBfAEqF4vgTmBxqYUzv+I5WFT+btgRD5j/GIoWzgck3yggHDuC2g==} - '@objectstack/service-storage@17.0.0-rc.1': - resolution: {integrity: sha512-piDhFnBcX9h3B0ndbmeWlJeA7ADAv6lhVSFP+lfbKza6psV5XEF6jGyTG8ls4/uGMu/lQCbd2ciyzOqVfurQvw==} + '@objectstack/service-storage@17.0.0-rc.2': + resolution: {integrity: sha512-XNrtYKuQWe8ehpYhy7U29S1IqDr/WhqNJ2lZyPyjynvoF9CJz+hBYvtTj9uQkVKpfx8QF4lw/LM51pSfAhCpeg==} engines: {node: '>=22.0.0'} peerDependencies: '@aws-sdk/client-s3': ^3.0.0 @@ -727,12 +727,12 @@ packages: '@aws-sdk/s3-request-presigner': optional: true - '@objectstack/setup@17.0.0-rc.1': - resolution: {integrity: sha512-PrXO6ztglohuHF7Y+bhlEpB//Hz1Y+tYqu3VsJPwwXPPh9JnSi7oZDNYjpSkX3THAyDS70wqx1D8v3+QItFcfg==} + '@objectstack/setup@17.0.0-rc.2': + resolution: {integrity: sha512-8KCjobU5s62D4OK+Getrt72lDI/M1Y3s9KNxD8gdQBfg0VEy4y/vkwcdSxW4756Iu6M+auU6DVGyFdH/braELA==} engines: {node: '>=22.0.0'} - '@objectstack/spec@17.0.0-rc.1': - resolution: {integrity: sha512-1SIDQHwxaV8GLD8YqLxCJ0fxTag6eYvvWntihil+lBIxNSjYLI3U384I4l03esBvkytrts3L5W0WCZJkquJiXw==} + '@objectstack/spec@17.0.0-rc.2': + resolution: {integrity: sha512-gvybztXuGTaqAlUzSOP4xeTpjl44ty2RZ67JQfiCma/engMG8pKqfv4/18nYitFktiWUVLsr2U6AquZAidmcRQ==} engines: {node: '>=22.0.0'} peerDependencies: ai: ^7.0.0 @@ -740,23 +740,23 @@ packages: ai: optional: true - '@objectstack/trigger-api@17.0.0-rc.1': - resolution: {integrity: sha512-HwTQR3yePaOyvPlkG59Ce0eElCweVAKWMIyc69jJ4UQ09lRgrreGnfWCq7hOzGHU9KCfekKUrh+2VNkB2ZrECQ==} + '@objectstack/trigger-api@17.0.0-rc.2': + resolution: {integrity: sha512-/ikaIDgoax78u75ep1ynNrrlpqXqIBwAPftwZ/gMrEwczRFVxD0jitWlgDDfqBOE3FUnC3FG3NxPTUUog+/PsQ==} - '@objectstack/trigger-record-change@17.0.0-rc.1': - resolution: {integrity: sha512-DwLsNvUaA6iEXTkgJFzmhLfLVa72C5lnVJvhjoKDnoLOKWeFsyQTolUYAYiC0KyQM8YUkmVgNungEZGYxo67og==} + '@objectstack/trigger-record-change@17.0.0-rc.2': + resolution: {integrity: sha512-mcogAAYFKlBQFOyeDBOWEEGKCIWpKr3EGjqOiUCbgTsDi+CSUdnA6KMFrsJriod/6p8pnIIUH9X1dHolHWCKHQ==} engines: {node: '>=22.0.0'} - '@objectstack/trigger-schedule@17.0.0-rc.1': - resolution: {integrity: sha512-cQYOS2TlXOOFFjiEljEbOCvvo2MI+ppfEVlGLRu5UyTzjKJF9V4He+AB2zwARog2BmcZX/nzpTMK9TxHTiAiTQ==} + '@objectstack/trigger-schedule@17.0.0-rc.2': + resolution: {integrity: sha512-lA/9IisY+cJyXb7ZOOU/5tQ+4w9bZxtqT+jrcuo/aDtoVcVeE1pbgZ/HJXnZZWNlMHLGNB7FYy7jbTsfG9UuIg==} engines: {node: '>=22.0.0'} - '@objectstack/types@17.0.0-rc.1': - resolution: {integrity: sha512-DhxuS3zLyb9LAAukJVQokF3BHzmbhxdBAjLgSujKP/In1OBON5d2DAEK+SG0TfQsrkM3d7coqS88D+v9ZrsBtQ==} + '@objectstack/types@17.0.0-rc.2': + resolution: {integrity: sha512-2aFKni6C6bt0NbrOrTFmfAbeWAoZivH4e8eh1lHRRgnq8UWYHZCwZgfQI+UIB37+yvCT58O2weQSYNwGTJxglQ==} engines: {node: '>=22.0.0'} - '@objectstack/verify@17.0.0-rc.1': - resolution: {integrity: sha512-Z9gRzB+l+L5DVsHyFgGP8EwY49+VlqSmVcJN+EtqthcWD7MN71oWQCAeom9sQeY6tEIDW49izWrji7Dcv9nFww==} + '@objectstack/verify@17.0.0-rc.2': + resolution: {integrity: sha512-GlpN1Quo0DdZn2n3nXxz4iKTUIPmdTYo5/oxhK7eL+Wlshkjx0LYPMicKvOyF/a2Fw0IlgtYF0npL02Lh8kw/A==} engines: {node: '>=22.0.0'} '@oclif/core@4.13.2': @@ -3389,63 +3389,64 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@objectstack/account@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/account@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - vitest - '@objectstack/cli@17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': - dependencies: - '@objectstack/account': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/client': 17.0.0-rc.1 - '@objectstack/cloud-connection': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/console': 17.0.0-rc.1 - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/driver-memory': 17.0.0-rc.1 - '@objectstack/driver-mongodb': 17.0.0-rc.1 - '@objectstack/driver-sql': 17.0.0-rc.1 - '@objectstack/driver-sqlite-wasm': 17.0.0-rc.1(better-sqlite3@13.0.2) - '@objectstack/formula': 17.0.0-rc.1 - '@objectstack/lint': 17.0.0-rc.1 - '@objectstack/mcp': 17.0.0-rc.1 - '@objectstack/metadata': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/objectql': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/observability': 17.0.0-rc.1 - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/plugin-approvals': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/plugin-audit': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/plugin-auth': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/plugin-email': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/plugin-hono-server': 17.0.0-rc.1 - '@objectstack/plugin-pinyin-search': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/plugin-reports': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/plugin-security': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/plugin-sharing': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/plugin-webhooks': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/rest': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/runtime': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/service-analytics': 17.0.0-rc.1 - '@objectstack/service-automation': 17.0.0-rc.1 - '@objectstack/service-cache': 17.0.0-rc.1 - '@objectstack/service-datasource': 17.0.0-rc.1 - '@objectstack/service-job': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/service-messaging': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/service-package': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/service-queue': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/service-realtime': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/service-settings': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/service-sms': 17.0.0-rc.1 - '@objectstack/service-storage': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/setup': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/trigger-api': 17.0.0-rc.1 - '@objectstack/trigger-record-change': 17.0.0-rc.1 - '@objectstack/trigger-schedule': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 - '@objectstack/verify': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/cli@17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + dependencies: + '@objectstack/account': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/client': 17.0.0-rc.2 + '@objectstack/cloud-connection': 17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/console': 17.0.0-rc.2 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/driver-memory': 17.0.0-rc.2 + '@objectstack/driver-mongodb': 17.0.0-rc.2 + '@objectstack/driver-sql': 17.0.0-rc.2 + '@objectstack/driver-sqlite-wasm': 17.0.0-rc.2(better-sqlite3@13.0.2) + '@objectstack/formula': 17.0.0-rc.2 + '@objectstack/lint': 17.0.0-rc.2 + '@objectstack/mcp': 17.0.0-rc.2 + '@objectstack/metadata': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/metadata-protocol': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/objectql': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/observability': 17.0.0-rc.2 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/plugin-approvals': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/plugin-audit': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/plugin-auth': 17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/plugin-email': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/plugin-hono-server': 17.0.0-rc.2 + '@objectstack/plugin-pinyin-search': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/plugin-reports': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/plugin-security': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/plugin-sharing': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/plugin-webhooks': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/rest': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/runtime': 17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/service-analytics': 17.0.0-rc.2 + '@objectstack/service-automation': 17.0.0-rc.2 + '@objectstack/service-cache': 17.0.0-rc.2 + '@objectstack/service-datasource': 17.0.0-rc.2 + '@objectstack/service-job': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/service-messaging': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/service-package': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/service-queue': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/service-realtime': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/service-settings': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/service-sms': 17.0.0-rc.2 + '@objectstack/service-storage': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/setup': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/trigger-api': 17.0.0-rc.2 + '@objectstack/trigger-record-change': 17.0.0-rc.2 + '@objectstack/trigger-schedule': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 + '@objectstack/verify': 17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) '@oclif/core': 4.13.2 bundle-require: 5.1.0(esbuild@0.28.1) chalk: 6.0.0 @@ -3503,19 +3504,19 @@ snapshots: - vitest - vue - '@objectstack/client@17.0.0-rc.1': + '@objectstack/client@17.0.0-rc.2': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - '@objectstack/cloud-connection@17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + '@objectstack/cloud-connection@17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/runtime': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/runtime': 17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@better-auth/utils' @@ -3559,28 +3560,28 @@ snapshots: - vitest - vue - '@objectstack/console@17.0.0-rc.1': {} + '@objectstack/console@17.0.0-rc.2': {} - '@objectstack/core@17.0.0-rc.1': + '@objectstack/core@17.0.0-rc.2': dependencies: - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.2 zod: 4.4.3 transitivePeerDependencies: - ai - '@objectstack/driver-memory@17.0.0-rc.1': + '@objectstack/driver-memory@17.0.0-rc.2': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 mingo: 7.2.2 transitivePeerDependencies: - ai - '@objectstack/driver-mongodb@17.0.0-rc.1': + '@objectstack/driver-mongodb@17.0.0-rc.2': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 mongodb: 7.5.0 nanoid: 6.0.0 transitivePeerDependencies: @@ -3593,12 +3594,12 @@ snapshots: - snappy - socks - '@objectstack/driver-sql@17.0.0-rc.1': + '@objectstack/driver-sql@17.0.0-rc.2': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/observability': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/observability': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 knex: 3.3.0(better-sqlite3@13.0.2) nanoid: 6.0.0 optionalDependencies: @@ -3612,11 +3613,11 @@ snapshots: - sqlite3 - supports-color - '@objectstack/driver-sqlite-wasm@17.0.0-rc.1(better-sqlite3@12.11.1)': + '@objectstack/driver-sqlite-wasm@17.0.0-rc.2(better-sqlite3@12.11.1)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/driver-sql': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/driver-sql': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 knex: 3.3.0(better-sqlite3@12.11.1) nanoid: 6.0.0 sql.js: 1.14.1 @@ -3633,11 +3634,11 @@ snapshots: - supports-color - tedious - '@objectstack/driver-sqlite-wasm@17.0.0-rc.1(better-sqlite3@13.0.2)': + '@objectstack/driver-sqlite-wasm@17.0.0-rc.2(better-sqlite3@13.0.2)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/driver-sql': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/driver-sql': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 knex: 3.3.0(better-sqlite3@13.0.2) nanoid: 6.0.0 sql.js: 1.14.1 @@ -3654,73 +3655,75 @@ snapshots: - supports-color - tedious - '@objectstack/formula@17.0.0-rc.1': + '@objectstack/formula@17.0.0-rc.2': dependencies: '@marcbachmann/cel-js': 8.0.0 - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - '@objectstack/lint@17.0.0-rc.1': + '@objectstack/lint@17.0.0-rc.2': dependencies: - '@objectstack/formula': 17.0.0-rc.1 - '@objectstack/sdui-parser': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 + '@marcbachmann/cel-js': 8.0.0 + '@objectstack/formula': 17.0.0-rc.2 + '@objectstack/sdui-parser': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 sucrase: 3.35.1 typescript: 6.0.3 transitivePeerDependencies: - ai - '@objectstack/mcp@17.0.0-rc.1': + '@objectstack/mcp@17.0.0-rc.2': dependencies: '@modelcontextprotocol/sdk': 1.30.0(zod@4.4.3) - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/formula': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/formula': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 zod: 4.4.3 transitivePeerDependencies: - '@cfworker/json-schema' - ai - supports-color - '@objectstack/metadata-core@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/metadata-core@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.2 zod: 4.4.3 optionalDependencies: vitest: 4.1.10(@vitest/coverage-v8@4.1.10)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - ai - '@objectstack/metadata-fs@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/metadata-fs@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/metadata-core': 17.0.0-rc.2(vitest@4.1.10) chokidar: 5.0.0 transitivePeerDependencies: - ai - vitest - '@objectstack/metadata-protocol@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/metadata-protocol@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/formula': 17.0.0-rc.1 - '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/formula': 17.0.0-rc.2 + '@objectstack/lint': 17.0.0-rc.2 + '@objectstack/metadata-core': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 zod: 4.4.3 transitivePeerDependencies: - ai - vitest - '@objectstack/metadata@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/metadata@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/metadata-fs': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/metadata-core': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/metadata-fs': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 chokidar: 5.0.0 glob: 13.0.6 js-yaml: 5.2.2 @@ -3729,67 +3732,67 @@ snapshots: - ai - vitest - '@objectstack/objectql@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/objectql@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/formula': 17.0.0-rc.1 - '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/metadata-protocol': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/formula': 17.0.0-rc.2 + '@objectstack/metadata-core': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/metadata-protocol': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 ajv: 8.20.0 zod: 4.4.3 transitivePeerDependencies: - ai - vitest - '@objectstack/observability@17.0.0-rc.1': + '@objectstack/observability@17.0.0-rc.2': dependencies: - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - '@objectstack/platform-objects@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/platform-objects@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/metadata-core': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-approvals@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/plugin-approvals@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/formula': 17.0.0-rc.1 - '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/formula': 17.0.0-rc.2 + '@objectstack/metadata-core': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-audit@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/plugin-audit@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-auth@17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + '@objectstack/plugin-auth@17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': dependencies: '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/oauth-provider': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3)) '@better-auth/scim': 1.7.0-rc.1(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(better-auth@1.7.0-rc.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3)) '@better-auth/sso': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3)) '@noble/hashes': 2.2.0 - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/rest': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/rest': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 better-auth: 1.7.0-rc.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) jose: 6.2.5 transitivePeerDependencies: @@ -3821,18 +3824,18 @@ snapshots: - vitest - vue - '@objectstack/plugin-auth@17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + '@objectstack/plugin-auth@17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': dependencies: '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/oauth-provider': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.2(better-sqlite3@13.0.2)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3)) '@better-auth/scim': 1.7.0-rc.1(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(better-auth@1.7.0-rc.2(better-sqlite3@13.0.2)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3)) '@better-auth/sso': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.2(better-sqlite3@13.0.2)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3)) '@noble/hashes': 2.2.0 - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/rest': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/rest': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 better-auth: 1.7.0-rc.2(better-sqlite3@13.0.2)(mongodb@7.5.0)(vitest@4.1.10) jose: 6.2.5 transitivePeerDependencies: @@ -3864,116 +3867,116 @@ snapshots: - vitest - vue - '@objectstack/plugin-email@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/plugin-email@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/formula': 17.0.0-rc.1 - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/formula': 17.0.0-rc.2 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-hono-server@17.0.0-rc.1': + '@objectstack/plugin-hono-server@17.0.0-rc.2': dependencies: '@hono/node-server': 2.0.12(hono@4.12.33) - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/observability': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/observability': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 hono: 4.12.33 transitivePeerDependencies: - ai - '@objectstack/plugin-pinyin-search@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/plugin-pinyin-search@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/objectql': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/objectql': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/types': 17.0.0-rc.2 pinyin-pro: 3.28.2 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-reports@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/plugin-reports@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 croner: 10.0.1 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-security@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/plugin-security@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/formula': 17.0.0-rc.1 - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/formula': 17.0.0-rc.2 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-sharing@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/plugin-sharing@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/formula': 17.0.0-rc.1 - '@objectstack/objectql': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/formula': 17.0.0-rc.2 + '@objectstack/objectql': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-webhooks@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/plugin-webhooks@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/service-messaging': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/service-messaging': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - vitest - '@objectstack/rest@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/rest@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/observability': 17.0.0-rc.1 - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/service-package': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/observability': 17.0.0-rc.2 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/service-package': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 exceljs: 4.4.0 zod: 4.4.3 transitivePeerDependencies: - ai - vitest - '@objectstack/runtime@17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': - dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/driver-memory': 17.0.0-rc.1 - '@objectstack/driver-sql': 17.0.0-rc.1 - '@objectstack/driver-sqlite-wasm': 17.0.0-rc.1(better-sqlite3@12.11.1) - '@objectstack/formula': 17.0.0-rc.1 - '@objectstack/metadata': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/metadata-protocol': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/objectql': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/observability': 17.0.0-rc.1 - '@objectstack/plugin-auth': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/plugin-security': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/rest': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/service-cluster': 17.0.0-rc.1 - '@objectstack/service-datasource': 17.0.0-rc.1 - '@objectstack/service-i18n': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/runtime@17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + dependencies: + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/driver-memory': 17.0.0-rc.2 + '@objectstack/driver-sql': 17.0.0-rc.2 + '@objectstack/driver-sqlite-wasm': 17.0.0-rc.2(better-sqlite3@12.11.1) + '@objectstack/formula': 17.0.0-rc.2 + '@objectstack/metadata': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/metadata-core': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/metadata-protocol': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/objectql': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/observability': 17.0.0-rc.2 + '@objectstack/plugin-auth': 17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/plugin-security': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/rest': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/service-cluster': 17.0.0-rc.2 + '@objectstack/service-datasource': 17.0.0-rc.2 + '@objectstack/service-i18n': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 quickjs-emscripten: 0.32.0 zod: 4.4.3 optionalDependencies: - '@objectstack/driver-mongodb': 17.0.0-rc.1 + '@objectstack/driver-mongodb': 17.0.0-rc.2 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@better-auth/utils' @@ -4017,30 +4020,30 @@ snapshots: - vitest - vue - '@objectstack/runtime@17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': - dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/driver-memory': 17.0.0-rc.1 - '@objectstack/driver-sql': 17.0.0-rc.1 - '@objectstack/driver-sqlite-wasm': 17.0.0-rc.1(better-sqlite3@13.0.2) - '@objectstack/formula': 17.0.0-rc.1 - '@objectstack/metadata': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/metadata-protocol': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/objectql': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/observability': 17.0.0-rc.1 - '@objectstack/plugin-auth': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/plugin-security': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/rest': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/service-cluster': 17.0.0-rc.1 - '@objectstack/service-datasource': 17.0.0-rc.1 - '@objectstack/service-i18n': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/runtime@17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + dependencies: + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/driver-memory': 17.0.0-rc.2 + '@objectstack/driver-sql': 17.0.0-rc.2 + '@objectstack/driver-sqlite-wasm': 17.0.0-rc.2(better-sqlite3@13.0.2) + '@objectstack/formula': 17.0.0-rc.2 + '@objectstack/metadata': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/metadata-core': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/metadata-protocol': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/objectql': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/observability': 17.0.0-rc.2 + '@objectstack/plugin-auth': 17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/plugin-security': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/rest': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/service-cluster': 17.0.0-rc.2 + '@objectstack/service-datasource': 17.0.0-rc.2 + '@objectstack/service-i18n': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 quickjs-emscripten: 0.32.0 zod: 4.4.3 optionalDependencies: - '@objectstack/driver-mongodb': 17.0.0-rc.1 + '@objectstack/driver-mongodb': 17.0.0-rc.2 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@better-auth/utils' @@ -4084,184 +4087,185 @@ snapshots: - vitest - vue - '@objectstack/sdui-parser@17.0.0-rc.1': {} + '@objectstack/sdui-parser@17.0.0-rc.2': {} - '@objectstack/service-analytics@17.0.0-rc.1': + '@objectstack/service-analytics@17.0.0-rc.2': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - '@objectstack/service-automation@17.0.0-rc.1': + '@objectstack/service-automation@17.0.0-rc.2': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/formula': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/formula': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - '@objectstack/service-cache@17.0.0-rc.1': + '@objectstack/service-cache@17.0.0-rc.2': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/observability': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/observability': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - '@objectstack/service-cluster@17.0.0-rc.1': + '@objectstack/service-cluster@17.0.0-rc.2': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - '@objectstack/service-datasource@17.0.0-rc.1': + '@objectstack/service-datasource@17.0.0-rc.2': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 transitivePeerDependencies: - ai - '@objectstack/service-i18n@17.0.0-rc.1': + '@objectstack/service-i18n@17.0.0-rc.2': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 transitivePeerDependencies: - ai - '@objectstack/service-job@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/service-job@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 croner: 10.0.1 transitivePeerDependencies: - ai - vitest - '@objectstack/service-messaging@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/service-messaging@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - vitest - '@objectstack/service-package@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/service-package@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/metadata-core': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - vitest - '@objectstack/service-queue@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/service-queue@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - vitest - '@objectstack/service-realtime@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/service-realtime@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - vitest - '@objectstack/service-settings@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/service-settings@17.0.0-rc.2(vitest@4.1.10)': dependencies: '@noble/ciphers': 2.2.0 - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 transitivePeerDependencies: - ai - vitest - '@objectstack/service-sms@17.0.0-rc.1': + '@objectstack/service-sms@17.0.0-rc.2': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - '@objectstack/service-storage@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/service-storage@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/observability': 17.0.0-rc.1 - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 - '@objectstack/types': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/observability': 17.0.0-rc.2 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 transitivePeerDependencies: - ai - vitest - '@objectstack/setup@17.0.0-rc.1(vitest@4.1.10)': + '@objectstack/setup@17.0.0-rc.2(vitest@4.1.10)': dependencies: - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - vitest - '@objectstack/spec@17.0.0-rc.1': + '@objectstack/spec@17.0.0-rc.2': dependencies: zod: 4.4.3 - '@objectstack/trigger-api@17.0.0-rc.1': + '@objectstack/trigger-api@17.0.0-rc.2': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - '@objectstack/trigger-record-change@17.0.0-rc.1': + '@objectstack/trigger-record-change@17.0.0-rc.2': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - '@objectstack/trigger-schedule@17.0.0-rc.1': + '@objectstack/trigger-schedule@17.0.0-rc.2': dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - '@objectstack/types@17.0.0-rc.1': + '@objectstack/types@17.0.0-rc.2': dependencies: - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.2 transitivePeerDependencies: - ai - '@objectstack/verify@17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': - dependencies: - '@objectstack/core': 17.0.0-rc.1 - '@objectstack/objectql': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/plugin-auth': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/plugin-hono-server': 17.0.0-rc.1 - '@objectstack/plugin-security': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/plugin-sharing': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/rest': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/runtime': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/service-analytics': 17.0.0-rc.1 - '@objectstack/service-automation': 17.0.0-rc.1 - '@objectstack/service-datasource': 17.0.0-rc.1 - '@objectstack/service-settings': 17.0.0-rc.1(vitest@4.1.10) - '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/verify@17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + dependencies: + '@objectstack/core': 17.0.0-rc.2 + '@objectstack/objectql': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/platform-objects': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/plugin-auth': 17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/plugin-hono-server': 17.0.0-rc.2 + '@objectstack/plugin-security': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/plugin-sharing': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/rest': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/runtime': 17.0.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/service-analytics': 17.0.0-rc.2 + '@objectstack/service-automation': 17.0.0-rc.2 + '@objectstack/service-datasource': 17.0.0-rc.2 + '@objectstack/service-settings': 17.0.0-rc.2(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.2 + '@objectstack/types': 17.0.0-rc.2 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@better-auth/utils' diff --git a/scripts/analytics-reconcile/reconcile.ts b/scripts/analytics-reconcile/reconcile.ts index 2e0cee01..73006525 100644 --- a/scripts/analytics-reconcile/reconcile.ts +++ b/scripts/analytics-reconcile/reconcile.ts @@ -48,7 +48,7 @@ export interface InlineReportGrouping { export type InlineQueryWidget = DashboardWidget & { object?: string; categoryField?: string; - categoryGranularity?: string; + categoryGranularity?: NonNullable[number]['granularity']; valueField?: string; aggregate?: string; measures?: Array<{ aggregate?: string; valueField?: string }>; diff --git a/src/flows/campaign-enrollment.flow.ts b/src/flows/campaign-enrollment.flow.ts index dcd9b206..ae38416f 100644 --- a/src/flows/campaign-enrollment.flow.ts +++ b/src/flows/campaign-enrollment.flow.ts @@ -61,23 +61,12 @@ export const CampaignEnrollmentFlow: Flow = { config: { objectName: 'crm_campaign', filter: { id: '{recordId}' }, outputVariable: 'campaignRecord' }, }, { - // Only enroll into campaigns that are actually running (or planned): - // topping up a completed/aborted campaign would corrupt its final - // snapshot metrics. (Status values: planning / in_progress / completed / aborted.) - // - // TOTALITY (#643): `has(vars.campaignRecord)` first, then - // `has(vars.campaignRecord.status)`. `campaignRecord` is a `get_record` - // OUTPUT, and `findOne` answers a miss with `null` — so a campaign that - // was deleted (or hidden by sharing) between the action click and this - // node leaves the variable bound to null, and the unguarded read aborted - // with `No such key: status` on edge `e4`. Reproduced end-to-end: the run - // was recorded `failed` and not one lead was enrolled. `status` itself is - // `required` on `crm_campaign` today so the column is never sparse — but - // that is the neighbouring schema doing the work, not this predicate, so - // it is guarded too. + // The gate itself is on edge `e4` — see the note there. This node carries + // NO `config.condition`: the key is the trigger gate on a `start` node and + // is read nowhere else, so a copy here would be a second, inert statement + // of the predicate that no reader can tell apart from the live one + // (flagged by `flow-inert-node-condition` from 17.0.0-rc.2, #4414). id: 'check_campaign_open', type: 'decision', label: 'Campaign Open?', - config: { condition: P`has(vars.campaignRecord) && has(vars.campaignRecord.status) - && (vars.campaignRecord.status == "planning" || vars.campaignRecord.status == "in_progress")` }, }, { id: 'query_leads', type: 'get_record', label: 'Find Eligible Leads', @@ -140,10 +129,24 @@ export const CampaignEnrollmentFlow: Flow = { { id: 'e2', source: 'screen_1', target: 'get_campaign', type: 'default' }, { id: 'e3', source: 'get_campaign', target: 'check_campaign_open', type: 'default' }, // Closed campaign → no edge → flow ends without enrolling. - // Guarded identically to `check_campaign_open` — see the note there. The - // EDGE is the live site: a `decision` node's singular `config.condition` is - // never read by the engine (it evaluates `config.conditions[]`), so this - // copy is the one that decides, and the one that aborted. + // + // THE live gate. A `decision` node's singular `config.condition` is never + // read by the engine, so the branch lives here and only here. + // + // Only enroll into campaigns that are actually running (or planned): + // topping up a completed/aborted campaign would corrupt its final snapshot + // metrics. (Status values: planning / in_progress / completed / aborted.) + // + // TOTALITY (#643): `has(vars.campaignRecord)` first, then + // `has(vars.campaignRecord.status)`. `campaignRecord` is a `get_record` + // OUTPUT, and `findOne` answers a miss with `null` — so a campaign that was + // deleted (or hidden by sharing) between the action click and this node + // leaves the variable bound to null, and the unguarded read aborted with + // `No such key: status`. Reproduced end-to-end: the run was recorded + // `failed` and not one lead was enrolled. `status` itself is `required` on + // `crm_campaign` today so the column is never sparse — but that is the + // neighbouring schema doing the work, not this predicate, so it is guarded + // too. { id: 'e4', source: 'check_campaign_open', target: 'query_leads', type: 'conditional', condition: P`has(vars.campaignRecord) && has(vars.campaignRecord.status) && (vars.campaignRecord.status == "planning" || vars.campaignRecord.status == "in_progress")`, label: 'Open' }, { id: 'e5', source: 'query_leads', target: 'loop_leads', type: 'default' }, diff --git a/src/flows/demo-bootstrap.flow.ts b/src/flows/demo-bootstrap.flow.ts index fb82c0dc..1c0417b9 100644 --- a/src/flows/demo-bootstrap.flow.ts +++ b/src/flows/demo-bootstrap.flow.ts @@ -191,6 +191,7 @@ const TARGETS = OWNERSHIP_COLUMNS.flatMap((column) => const CHAIN = [ 'start', 'get_user', + 'bind_first_user', 'has_user', ...TARGETS.flatMap((t) => [t.find.id, t.loop.id]), 'end', @@ -213,12 +214,39 @@ export const DemoBootstrapFlow: Flow = { config: { schedule: '*/10 * * * *' }, }, { - id: 'get_user', type: 'get_record', label: 'First User', - config: { objectName: 'sys_user', filter: {}, outputVariable: 'firstUser' }, + // A LIST read, deliberately (#4419). 17.0.0-rc.2 refuses a `findOne` that + // names no record: `filter: {}` with no ordering made the platform pick an + // arbitrary row and hand it back as if it were "the" user, so the read is + // now rejected outright — `get_record(sys_user) failed: findOne('sys_user') + // selects no particular record`. That aborts the sweep on its second node + // and leaves every seeded row ownerless, which is the whole failure this + // flow exists to prevent. + // + // "Any row will genuinely do" is the honest description here — see the + // header: the reps are appended after the dev admin, and `demo:staff` + // asserts from the other side that no demo rep owns a seeded record. The + // prescription for that case is `find`, and the only way to reach `find` + // from this node is `limit > 1` (the executor routes `limit <= 1` to + // `findOne`, and offers no `orderBy` at all) — hence 2, not 1. The pick is + // the same first row as before; what changed is that it is now STATED as + // "some row out of this set" instead of smuggled through a call that + // claimed to name one. + id: 'get_user', type: 'get_record', label: 'First Users', + config: { objectName: 'sys_user', limit: 2, outputVariable: 'userList' }, }, { + // `{userList.0}` is absent on an empty org, so every downstream read of + // `vars.firstUser` is guarded with `has()` — an unguarded read aborts the + // predicate, and 17.0.0-rc.2 turns an unevaluable condition into a failed + // step rather than a skipped one. + id: 'bind_first_user', type: 'assignment', label: 'Bind First User', + config: { assignments: { firstUser: '{userList.0}' } }, + }, + { + // Branching is on the two out-edges below; a `decision` node's singular + // `config.condition` is never evaluated, so a copy here would be inert + // (17.0.0-rc.2's `flow-inert-node-condition`, #4414). id: 'has_user', type: 'decision', label: 'Any user yet?', - config: { condition: P`vars.firstUser != null` }, }, ...TARGETS.flatMap((t) => [t.find, t.loop]), { id: 'end', type: 'end', label: 'End' }, @@ -232,12 +260,14 @@ export const DemoBootstrapFlow: Flow = { target: CHAIN[i + 1], type: 'default' as const, // The only branch: leaving `has_user` towards the first claim step. - ...(source === 'has_user' ? { condition: P`vars.firstUser != null`, label: 'Yes' } : {}), + ...(source === 'has_user' + ? { condition: P`has(vars.firstUser) && vars.firstUser != null`, label: 'Yes' } + : {}), })), // Nothing to claim before anyone exists — skip the whole chain. { id: 'e_nouser', source: 'has_user', target: 'end', type: 'default', - condition: P`vars.firstUser == null`, label: 'No user yet', + condition: P`!has(vars.firstUser) || vars.firstUser == null`, label: 'No user yet', }, ], }; diff --git a/src/flows/lead-assignment.flow.ts b/src/flows/lead-assignment.flow.ts index 5625aeb8..f5d577b1 100644 --- a/src/flows/lead-assignment.flow.ts +++ b/src/flows/lead-assignment.flow.ts @@ -40,18 +40,12 @@ export const LeadAssignmentFlow: Flow = { config: { objectName: 'crm_lead', triggerType: 'record-after-create' }, }, { - // TOTALITY (#633): `rating` is neither required nor defaulted, so a lead - // written without one is stored with NO `rating` column on - // driver-memory / driver-mongodb. Measured end-to-end: the unguarded - // `record.rating >= 4` on edge `e2` aborted with `No such key: rating` - // and an unrated lead got no SLA stamp and no alert at all. `has()` - // alone is not enough on an ORDERING comparison — an explicit - // `rating: null` passes `has()` and then aborts with - // `no such overload: dyn >= int` — so both guards are required, - // in this order. Kept in sync with edge `e2` below, which is what - // actually branches (see the note there). + // Branching lives on edges `e2` / `e3` — see the totality note there. + // This node carries no `config.condition`: the engine never evaluates a + // `decision` node's singular one, so a copy here would restate the gate + // without being the gate (17.0.0-rc.2's `flow-inert-node-condition`, + // #4414). id: 'check_hot', type: 'decision', label: 'Hot Lead (rating ≥ 4)?', - config: { condition: P`has(record.rating) && record.rating != null && record.rating >= 4` }, }, // ── Hot path: 1-day SLA, high-severity alert ─────────────────── @@ -109,6 +103,14 @@ export const LeadAssignmentFlow: Flow = { // "declared ≠ enforced" shape this repo keeps deleting rules over. So the // hot branch demands a readable rating and the standard branch absorbs // everything else: an unrated lead is, correctly, not a hot lead. + // + // `rating` is neither required nor defaulted, so a lead written without one + // is stored with NO `rating` column on driver-memory / driver-mongodb. + // Measured end-to-end: the unguarded `record.rating >= 4` aborted with `No + // such key: rating` and an unrated lead got no SLA stamp and no alert at + // all. `has()` alone is not enough on an ORDERING comparison — an explicit + // `rating: null` passes `has()` and then aborts with `no such overload: + // dyn >= int` — so both guards are required, in this order. { id: 'e2', source: 'check_hot', target: 'sla_hot', type: 'conditional', condition: P`has(record.rating) && record.rating != null && record.rating >= 4`, label: 'Hot' }, { id: 'e3', source: 'check_hot', target: 'sla_std', type: 'conditional', condition: P`!has(record.rating) || record.rating == null || record.rating < 4`, label: 'Standard' }, { id: 'e4', source: 'sla_hot', target: 'notify_hot', type: 'default' }, diff --git a/src/flows/lead-conversion.flow.ts b/src/flows/lead-conversion.flow.ts index 97da868c..9119b903 100644 --- a/src/flows/lead-conversion.flow.ts +++ b/src/flows/lead-conversion.flow.ts @@ -60,11 +60,18 @@ export const LeadConversionFlow: Flow = { // client re-evaluates the predicate against the values collected so far, // which is why it cannot be a server-interpolated template. fields: [ - // `defaultValue: false` is load-bearing. An untouched checkbox holds - // `undefined`, which the runner counts as an unanswered required - // field — so "convert this lead WITHOUT an opportunity", the commonest - // path, blocked Submit on a box the user deliberately left clear. - { name: 'createOpportunity', label: 'Create Opportunity?', type: 'boolean', required: true, defaultValue: false }, + // NOT `required` (#4477). A checkbox has no unanswered state — clear + // IS an answer, and "convert this lead WITHOUT an opportunity" is the + // commonest path. `required: true` said otherwise on both sides of the + // wire: the client counted the untouched box as an unanswered field + // and blocked Submit, and from 17.0.0-rc.2 the SERVER enforces the + // screen's declared contract too, refusing the resume outright with + // `INVALID_SCREEN_INPUT: Screen field "createOpportunity" is required` + // — so a runner that posts only what the user touched could no longer + // convert a lead at all. `defaultValue: false` (and the + // `init_defaults` assignment behind it) is what actually supplies the + // answer; the flag only ever contradicted it. + { name: 'createOpportunity', label: 'Create Opportunity?', type: 'boolean', defaultValue: false }, { name: 'opportunityName', label: 'Opportunity Name', type: 'text', required: true, visibleWhen: 'createOpportunity == true' }, { name: 'opportunityAmount', label: 'Opportunity Amount', type: 'currency', visibleWhen: 'createOpportunity == true' }, ], @@ -119,8 +126,9 @@ export const LeadConversionFlow: Flow = { config: { objectName: 'crm_account', filter: { name_normalized: '{leadRecord.company_normalized}' }, outputVariable: 'matchedAccount' }, }, { + // Branching is on edges `e5` / `e6`. No `config.condition` here: a + // `decision` node's singular one is never evaluated (#4414). id: 'decision_account', type: 'decision', label: 'Account Already Exists?', - config: { condition: P`vars.matchedAccount != null` }, }, { // NEW-account branch. outputVariable is `createdAccount`; the assignment @@ -169,8 +177,8 @@ export const LeadConversionFlow: Flow = { }, }, { + // Branching is on edges `e11` / `e12` — see `decision_account`. id: 'decision_contact', type: 'decision', label: 'Contact Already Exists?', - config: { condition: P`vars.matchedContact != null` }, }, { // `accountId` is a bare id string from whichever account branch ran. @@ -195,8 +203,8 @@ export const LeadConversionFlow: Flow = { config: { assignments: { contactId: '{matchedContact.id}' } }, }, { + // Branching is on edges `e16` / `e17` — see `decision_account`. id: 'decision_opportunity', type: 'decision', label: 'Create Opportunity?', - config: { condition: P`vars.createOpportunity == true` }, }, { id: 'create_opportunity', type: 'create_record', label: 'Create Opportunity', diff --git a/src/flows/opportunity-approval.flow.ts b/src/flows/opportunity-approval.flow.ts index 2e66bcb8..8b0d93e9 100644 --- a/src/flows/opportunity-approval.flow.ts +++ b/src/flows/opportunity-approval.flow.ts @@ -105,23 +105,13 @@ export const OpportunityApprovalFlow: Flow = { // ── Tier gate: does this deal also need director sign-off? ────── { + // No `config.condition` here: the branch is on edges `e5` / `e6`, which + // is where the engine actually reads it. A copy on the node would be + // inert and indistinguishable from the live one (17.0.0-rc.2's + // `flow-inert-node-condition`, #4414). id: 'check_high_value', type: 'decision', label: 'High Value (> $500K)?', - // TOTALITY (#643): `oppRecord` is a `get_record` OUTPUT, so the read - // needs `has(vars.oppRecord)` (the variable), `has(vars.oppRecord.amount)` - // (the column — `findOne` answers a miss with `null`, and a sparse driver - // row omits an unwritten column outright) and `!= null` (an explicit null - // passes `has()` and the ordering comparison then aborts with - // `no such overload: dyn > int`). Measured total as authored today - // — `amount` is `required` on `crm_opportunity` and this `get_record` is - // keyed on the row that just fired the trigger — but that is the - // neighbouring schema doing the work, exactly as in the start condition - // above. `vars.`-scoped rather than bare: `has(oppRecord.amount)` still - // aborts with `Unknown variable: oppRecord` on an unbound variable, - // `has(vars.oppRecord)` answers `false` (measured). - config: { condition: P`has(vars.oppRecord) && has(vars.oppRecord.amount) - && vars.oppRecord.amount != null && vars.oppRecord.amount > 500000` }, }, // ── Tier 2: Sales Director sign-off (deals > $500K only) ──────── @@ -208,6 +198,21 @@ export const OpportunityApprovalFlow: Flow = { // `mark_approved`: the manager has already approved it, and an unreadable // amount must not strand an approved deal in a locked, undecidable // director step. + // + // TOTALITY (#643): `oppRecord` is a `get_record` OUTPUT, so the read needs + // `has(vars.oppRecord)` (the variable), `has(vars.oppRecord.amount)` (the + // column — `findOne` answers a miss with `null`, and a sparse driver row + // omits an unwritten column outright) and `!= null` (an explicit null + // passes `has()` and the ordering comparison then aborts with `no such + // overload: dyn > int`). Measured total as authored today — `amount` + // is `required` on `crm_opportunity` and the `get_record` is keyed on the + // row that just fired the trigger — but that is the neighbouring schema + // doing the work, exactly as in the start condition above. `vars.`-scoped + // rather than bare: `has(oppRecord.amount)` still aborts with `Unknown + // variable: oppRecord` on an unbound variable, `has(vars.oppRecord)` + // answers `false` (measured). From 17.0.0-rc.2 an unevaluable condition + // ABORTS the step rather than skipping it (#4775), so a guard that was + // belt-and-braces is now what keeps the run alive. { id: 'e5', source: 'check_high_value', target: 'director_signoff', type: 'conditional', condition: P`has(vars.oppRecord) && has(vars.oppRecord.amount) && vars.oppRecord.amount != null && vars.oppRecord.amount > 500000`, label: 'High value (> $500K)' }, { id: 'e6', source: 'check_high_value', target: 'mark_approved', type: 'conditional', condition: P`!has(vars.oppRecord) || !has(vars.oppRecord.amount) diff --git a/src/flows/quote-generation.flow.ts b/src/flows/quote-generation.flow.ts index 111b42b2..a9572e66 100644 --- a/src/flows/quote-generation.flow.ts +++ b/src/flows/quote-generation.flow.ts @@ -61,21 +61,11 @@ export const QuoteGenerationFlow: Flow = { // a deal already at proposal/negotiation was an illegal self/backward // transition — those deals keep their stage; the quote is still created. // - // TOTALITY (#643): `oppRecord` is a `get_record` OUTPUT — `findOne` - // answers a miss with `null`, and reading a field off it then aborts with - // `No such key: stage`. Measured unreachable TODAY only because two - // neighbouring schemas happen to close it: `crm_opportunity.stage` is - // `required` (never a sparse column) and `crm_quote.crm_account` is - // `required`, so a null `oppRecord` makes `create_quote` fail one node - // earlier. Both are one `required: false` away from re-opening it, so the - // predicate carries its own guard. Note the scope is `vars.oppRecord`, - // not bare `oppRecord`: measured, `has(oppRecord.stage)` still aborts - // with `Unknown variable: oppRecord` when the variable is unbound, while - // `has(vars.oppRecord)` answers `false` — only the `vars.`-scoped form is - // total against both hazards. + // The predicate itself lives on edges `e4a` / `e4b` — a `decision` node's + // singular `config.condition` is never evaluated, so a copy here would be + // inert (17.0.0-rc.2's `flow-inert-node-condition`, #4414). The totality + // rationale is on those edges, where the guards are. id: 'check_stage', type: 'decision', label: 'Can Advance to Proposal?', - config: { condition: P`has(vars.oppRecord) && has(vars.oppRecord.stage) - && (vars.oppRecord.stage == "prospecting" || vars.oppRecord.stage == "qualification" || vars.oppRecord.stage == "needs_analysis")` }, }, { id: 'update_opportunity', type: 'update_record', label: 'Update Opportunity', @@ -111,8 +101,23 @@ export const QuoteGenerationFlow: Flow = { // polarity: `has(…) && …` on the advance side, `!has(…) || …` on the keep // side. An unknown stage therefore lands on "keep stage" — the quote is // still created and nothing illegal is written to the state machine. - // These EDGES are the live sites; `check_stage`'s own `config.condition` is - // never evaluated by the engine (see the note on that node). + // These EDGES are the live sites; `check_stage` carries no + // `config.condition` at all, because the engine never evaluates one. + // + // TOTALITY (#643): `oppRecord` is a `get_record` OUTPUT — `findOne` answers + // a miss with `null`, and reading a field off it then aborts with `No such + // key: stage`. Measured unreachable TODAY only because two neighbouring + // schemas happen to close it: `crm_opportunity.stage` is `required` (never + // a sparse column) and `crm_quote.crm_account` is `required`, so a null + // `oppRecord` makes `create_quote` fail one node earlier. Both are one + // `required: false` away from re-opening it, so the predicate carries its + // own guard — and from 17.0.0-rc.2 an unevaluable condition aborts the step + // instead of skipping it (#4775), so the guard is load-bearing, not + // decorative. Note the scope is `vars.oppRecord`, not bare `oppRecord`: + // measured, `has(oppRecord.stage)` still aborts with `Unknown variable: + // oppRecord` when the variable is unbound, while `has(vars.oppRecord)` + // answers `false` — only the `vars.`-scoped form is total against both + // hazards. { id: 'e4a', source: 'check_stage', target: 'update_opportunity', type: 'conditional', condition: P`has(vars.oppRecord) && has(vars.oppRecord.stage) && (vars.oppRecord.stage == "prospecting" || vars.oppRecord.stage == "qualification" || vars.oppRecord.stage == "needs_analysis")`, label: 'Advance' }, { id: 'e4b', source: 'check_stage', target: 'notify_owner', type: 'conditional', condition: P`!has(vars.oppRecord) || !has(vars.oppRecord.stage) diff --git a/src/translations/en.ts b/src/translations/en.ts index 7e211148..a87d1c0c 100644 --- a/src/translations/en.ts +++ b/src/translations/en.ts @@ -742,11 +742,6 @@ export const en: TranslationData = { 'error.load_failed': 'Failed to load data', }, - validationMessages: { - amount_required_for_closed: 'Amount is required when stage is Closed Won', - close_date_required: 'Close date is required for opportunities', - discount_limit: 'Discount cannot exceed 40%', - }, dashboards: { crm_overview_dashboard: { diff --git a/src/translations/es-ES.ts b/src/translations/es-ES.ts index e7fde288..72776397 100644 --- a/src/translations/es-ES.ts +++ b/src/translations/es-ES.ts @@ -720,11 +720,6 @@ export const esES: TranslationData = { 'error.load_failed': 'Error al cargar los datos', }, - validationMessages: { - amount_required_for_closed: 'El monto es obligatorio cuando la etapa es Cerrada Ganada', - close_date_required: 'La fecha de cierre es obligatoria para las oportunidades', - discount_limit: 'El descuento no puede superar el 40%', - }, dashboards: { crm_overview_dashboard: { diff --git a/src/translations/ja-JP.ts b/src/translations/ja-JP.ts index 2068ff0e..d948dcaf 100644 --- a/src/translations/ja-JP.ts +++ b/src/translations/ja-JP.ts @@ -719,11 +719,6 @@ export const jaJP: TranslationData = { 'error.load_failed': 'データの読み込みに失敗しました', }, - validationMessages: { - amount_required_for_closed: 'フェーズが「成立」の場合、金額は必須です', - close_date_required: '商談には完了予定日が必要です', - discount_limit: '割引は40%を超えることはできません', - }, dashboards: { crm_overview_dashboard: { diff --git a/src/translations/zh-CN.ts b/src/translations/zh-CN.ts index 90f5ff71..2c713932 100644 --- a/src/translations/zh-CN.ts +++ b/src/translations/zh-CN.ts @@ -1084,11 +1084,6 @@ export const zhCN: TranslationData = { 'error.load_failed': '数据加载失败', }, - validationMessages: { - amount_required_for_closed: '阶段为"成交"时,金额为必填项', - close_date_required: '商机必须填写预计成交日期', - discount_limit: '折扣不能超过40%', - }, dashboards: { crm_overview_dashboard: { diff --git a/test/flow-campaign-enrollment.test.ts b/test/flow-campaign-enrollment.test.ts index e235a083..251a33ec 100644 --- a/test/flow-campaign-enrollment.test.ts +++ b/test/flow-campaign-enrollment.test.ts @@ -41,7 +41,12 @@ async function enrol(seed: Rec = {}, screen: Rec = { leadStatus: 'new' }) { }); const runId = await h.run('campaign_enrollment', { recordId: 'cmp1' }); expect(runId, 'campaign_enrollment did not start').toBeTruthy(); - await h.resume(runId!, { recordId: 'cmp1', ...screen }); + // Screen fields ONLY. `recordId` is a start-time input the console seeds on + // the trigger, and from 17.0.0-rc.2 the engine holds a resume to the screen's + // declared field contract (#4477) — re-sending it here is refused with + // `INVALID_SCREEN_INPUT: Unknown screen field "recordId"`, which is the + // engine correctly rejecting a signal the console never sends. + await h.resume(runId!, screen); return h; } diff --git a/test/flow-case-actions.test.ts b/test/flow-case-actions.test.ts index f32f1645..eb60bed3 100644 --- a/test/flow-case-actions.test.ts +++ b/test/flow-case-actions.test.ts @@ -23,7 +23,13 @@ const openCase = (over: Rec = {}): Rec => ({ is_escalated: false, is_closed: false, owner: 'agent1', ...over, }); -/** Start a screen flow and resume it with the values the screen collects. */ +/** + * Start a screen flow and resume it with the values the screen collects. + * + * `screen` carries the screen's DECLARED fields and nothing else: `recordId` is + * seeded once on the trigger, and from 17.0.0-rc.2 a resume that carries a key + * the screen never declared is refused with `INVALID_SCREEN_INPUT` (#4477). + */ async function runScreen( flowName: string, flow: Rec, @@ -47,7 +53,7 @@ describe('escalate_case — screen action', () => { it('flags, re-prioritises and stamps the case from the collected reason', async () => { const h = await runScreen('escalate_case', EscalateCaseFlow as unknown as Rec, [openCase()], { - recordId: 'c1', reason: 'Customer threatening churn', + reason: 'Customer threatening churn', }); const updated = h.store.crm_case[0]; @@ -62,7 +68,7 @@ describe('escalate_case — screen action', () => { // `escalation_reason_required` rejects any write that flips is_escalated // without a reason, which silently aborted the action. const h = await runScreen('escalate_case', EscalateCaseFlow as unknown as Rec, [openCase()], { - recordId: 'c1', reason: 'Breach', + reason: 'Breach', }); const updated = h.store.crm_case[0]; expect(updated.is_escalated && !!updated.escalation_reason).toBe(true); @@ -72,7 +78,7 @@ describe('escalate_case — screen action', () => { // `case_escalation`'s start condition is `escalated_date == null`; without // this stamp the record-change flow escalates the case a second time. const h = await runScreen('escalate_case', EscalateCaseFlow as unknown as Rec, [openCase()], { - recordId: 'c1', reason: 'Breach', + reason: 'Breach', }); expect(h.store.crm_case[0].escalated_date).toBeTruthy(); }); @@ -86,7 +92,7 @@ describe('close_case — screen action', () => { it('closes the case and records the resolution', async () => { const h = await runScreen('close_case', CloseCaseFlow as unknown as Rec, [openCase()], { - recordId: 'c1', resolution: 'Replaced the faulty unit', + resolution: 'Replaced the faulty unit', }); const updated = h.store.crm_case[0]; @@ -100,7 +106,7 @@ describe('close_case — screen action', () => { 'close_case', CloseCaseFlow as unknown as Rec, [openCase(), openCase({ id: 'c2', case_number: 'CASE-2' })], - { recordId: 'c1', resolution: 'Done' }, + { resolution: 'Done' }, ); const other = h.store.crm_case.find((c) => c.id === 'c2')!; expect(other.status).toBe('new'); diff --git a/test/flow-scheduled.test.ts b/test/flow-scheduled.test.ts index 6894fa02..5b5ef2fc 100644 --- a/test/flow-scheduled.test.ts +++ b/test/flow-scheduled.test.ts @@ -664,7 +664,7 @@ describe('forecast_snapshot — nightly per-owner pipeline snapshot', () => { }); /** - * Regression guard — a bare string condition inside a `loop` body is inert. + * Regression guard — a bare string condition inside a `loop` body WAS inert. * * `AutomationEngine.registerFlow` runs `applyConversionsToFlow`, which rewrites * a bare string `condition` into a `{ dialect: 'cel', source }` envelope. That @@ -681,24 +681,35 @@ describe('forecast_snapshot — nightly per-owner pipeline snapshot', () => { * right records, and does nothing. `opportunity_stagnation`, `contract_renewal` * and `campaign_enrollment` all shipped in that state. * - * The fix is to author nested conditions as explicit envelopes. These two tests - * keep it fixed: the first pins the engine asymmetry that makes the envelope - * necessary (so an upstream fix that makes bare strings work shows up as a - * deliberate review rather than a silent behaviour change), and the second - * fails if ANY flow ever reintroduces a bare string inside a loop body. + * The fix was to author nested conditions as explicit envelopes. + * + * ─── The platform closed the asymmetry in 17.0.0-rc.2 (#4336) ──────────── + * + * `evaluateCondition` now decides its dialect from the SOURCE rather than from + * the caller, so a bare string is parsed as CEL wherever it appears — inside a + * loop body included — and the two forms agree. The first test below used to + * assert the gap and was written to fail when it closed; it now pins the fixed + * behaviour, which is the deliberate review that assertion existed to force. + * + * The explicit envelopes STAY. They are the authored form in every flow here, + * they say which dialect the predicate is in at the point a reader needs to + * know, and they are what makes these conditions correct on any runtime that + * still carries the old path. The second test keeps them in place, so a bare + * string reintroduced inside a loop body is still a failure here rather than a + * silent dependency on one specific engine version. */ describe('loop-nested conditions must be explicit CEL envelopes', () => { - it('the engine still treats a bare string differently from an envelope', () => { + it('the engine evaluates a bare string and an envelope identically', () => { const h = makeFlowHarness({}, {}); const evaluate = (condition: unknown) => (h.engine as unknown as { evaluateCondition(c: unknown, v: Map): boolean; }).evaluateCondition(condition, new Map([['existingStallTask', null]])); - // If this ever flips to `true`, the conversion pass (or the legacy path) - // changed upstream — revisit whether the explicit envelopes are still - // needed before relaxing them. - expect(evaluate('existingStallTask == null'), 'bare string, unresolved').toBe(false); + // Both forms open the gate as of 17.0.0-rc.2 (#4336). If the bare-string + // case ever flips back to `false`, the legacy string-compare path has + // returned and the envelopes below are load-bearing again. + expect(evaluate('existingStallTask == null'), 'bare string, CEL-parsed').toBe(true); expect( evaluate({ dialect: 'cel', source: 'existingStallTask == null' }), 'explicit CEL envelope', diff --git a/test/flow-variable-conditions.test.ts b/test/flow-variable-conditions.test.ts index d868deba..0c59868b 100644 --- a/test/flow-variable-conditions.test.ts +++ b/test/flow-variable-conditions.test.ts @@ -35,12 +35,18 @@ import stack from '../objectstack.config'; * `{ label, expression }`; * - every out-edge's `condition` (`AutomationEngine.traverseNext`). * - * A `decision` node's SINGULAR `config.condition` — the shape every flow in - * this repo authors — is **never read by the engine**. The branch is decided - * entirely by the edge copies. That is why the reproductions below all abort on - * an EDGE, and why this file sweeps node and edge conditions alike: the node - * copy is inert today but it is the authored statement of intent, and it must - * not drift from the edge that actually decides. + * A `decision` node's SINGULAR `config.condition` is **never read by the + * engine**. The branch is decided entirely by the edge copies, which is why the + * reproductions below all abort on an EDGE. + * + * This repo used to author the node copy too, as a statement of intent kept in + * sync with the edge. It no longer does: 17.0.0-rc.2's `flow-inert-node-condition` + * (#4414) flags exactly that copy, on the grounds that a second statement of a + * predicate which no reader can tell apart from the live one is worse than no + * statement at all — and a copy that drifts is a lie about what the flow does. + * Every `decision` node here now carries no condition, and the sweeps below run + * over the edges that decide. (The node arm stays in the collector: it costs + * nothing and catches a re-introduced copy.) * * **How variables reach CEL.** `evaluateCondition` flattens the run's variable * Map into one object and evaluates with `{ extra: { ...vars, vars }, record: vars }` diff --git a/test/object-validation-predicates.test.ts b/test/object-validation-predicates.test.ts index 43f6f10a..b3f516d7 100644 --- a/test/object-validation-predicates.test.ts +++ b/test/object-validation-predicates.test.ts @@ -30,8 +30,9 @@ import { REPO_ROOT } from './helpers/repo-root'; * * 3. **Non-total predicate.** A field reference with no `has(...)` guard * aborts the whole predicate on a record whose merged shape has no such - * key, and the engine's answer to a predicate that cannot answer is to - * SKIP the rule. See the house rule below — this is #630. + * key. Through 17.0.0-rc.1 the engine's answer to a predicate that cannot + * answer was to SKIP the rule; from 17.0.0-rc.2 it REJECTS the write. See + * the house rule below — this is #630. * * None is visible in review without reading the CEL character by character, * which is exactly why they survived. See #514 (items 3 and 12) and #630. @@ -44,20 +45,34 @@ import { REPO_ROOT } from './helpers/repo-root'; * guard.** A predicate must return a verdict for every record shape it can be * handed — never abort. This file enforces it; you do not have to remember it. * - * ### Why the rule exists (all figures measured on 17.0.0-rc.1) + * ### Why the rule exists (all figures measured on 17.0.0-rc.1 unless noted) * * `evaluateValidationRules` evaluates a rule against `{...previous, ...data}` * and fills absent fields with `null` **only on insert**. On update, `previous` * is whatever the driver returned, and strict CEL aborts with `No such key` - * the moment a predicate reads a key that is not there. The engine's response - * to an unevaluable predicate is to skip the rule: + * the moment a predicate reads a key that is not there. Through 17.0.0-rc.1 the + * engine's response to an unevaluable predicate was to skip the rule: * * WARN Validation rule 'x' predicate failed to evaluate (…) — skipped * - * A rule that reads as enforced then requires nothing at all — silently. It is + * A rule that reads as enforced then required nothing at all — silently. It is * the same "declared ≠ enforced" failure this repo keeps deleting rules over * (`cannot_edit_converted` #575 B1, `revenue_positive` #571). * + * **17.0.0-rc.2 makes it fail CLOSED (#4649)** — the upstream question this + * file filed, answered. The same abort now rejects the write, naming the rule + * and the read that could not be evaluated (measured on 17.0.0-rc.2): + * + * WARN Validation rule 'x' predicate failed to evaluate (…) — write rejected (#4649) + * THROW ValidationError: Validation rule 'x' could not be evaluated + * (runtime: no such overload: dyn < int) — write rejected. … + * + * That does not relax the house rule, it raises the stakes: what used to be a + * rule that quietly enforced nothing is now a rule that blocks an ordinary save + * on a record shape the author never considered. The guards below are what keep + * both outcomes off the table, and the sweeps still detect a non-total + * predicate through the same `failed to evaluate` warning. + * * `!= null` does **not** substitute for `has(...)`: measured on an absent key, * `record.f != null` aborts exactly like `record.f != "v"` does. Only `has()` * is total, and `coalesce(record.f, "")` aborts too — its argument is @@ -83,8 +98,12 @@ import { REPO_ROOT } from './helpers/repo-root'; * | ------------------------------- | --------------------------- | -------------- | * | `@objectstack/driver-sql` | key present, `null` | ENFORCED | * | `@objectstack/driver-sqlite-wasm` | key present, `null` | ENFORCED | - * | `@objectstack/driver-memory` | **key absent** | **SKIPPED** | - * | `@objectstack/driver-mongodb` | **key absent** (see below) | **SKIPPED** | + * | `@objectstack/driver-memory` | **key absent** | **ABORTS** | + * | `@objectstack/driver-mongodb` | **key absent** (see below) | **ABORTS** | + * + * "ABORTS" was a silent skip through 17.0.0-rc.1 and is a rejected write from + * 17.0.0-rc.2 — the same non-total predicate, two different ways of not being + * the rule the author wrote. * * The SQL family is column-complete because `SELECT *` returns a NULL for every * unset column, and the engine reads `previous` with no field projection @@ -127,10 +146,11 @@ import { REPO_ROOT } from './helpers/repo-root'; * keys at all and fails on any `failed to evaluate` warning. Forgetting the * guard is now loud, at PR time, which is the only way a house rule survives. * - * Out of scope here, filed upstream as objectstack-ai/objectstack#4649: whether - * the engine should treat an unevaluable predicate on an `error`-severity rule - * as a failure rather than a skip. A rule that cannot answer is not a rule that - * passed — but that is a platform decision, not a HotCRM one. + * Filed upstream as objectstack-ai/objectstack#4649 — whether the engine should + * treat an unevaluable predicate as a failure rather than a skip — and **landed + * in 17.0.0-rc.2**: a rule that cannot answer is not a rule that passed, so the + * write is rejected. See the fail-closed note above; the guards here are what + * keeps that door shut for HotCRM's own rules. * * ### The same rule on the other two CEL surfaces (#633) * @@ -386,7 +406,8 @@ describe('every authored predicate guards every field it reads', () => { offenders, 'These predicates read a field with no has(…) guard. On a record whose merged ' + 'shape omits the key — every update on a driver that stores only written ' + - 'columns — strict CEL aborts and the engine SKIPS the rule entirely. ' + + 'columns — strict CEL aborts: the engine skipped the rule entirely through ' + + '17.0.0-rc.1 and rejects the write from 17.0.0-rc.2 (#4649). ' + 'Use `(!has(record.f) || isBlank(record.f))` for "f is empty" and ' + '`has(record.f) && record.f …` for "f holds a value".', ).toEqual([]); @@ -401,13 +422,15 @@ describe('every authored predicate guards every field it reads', () => { * the engine's own `evaluateValidationRules` with `mode: 'update'` and a * `previous` that has no keys at all — the exact shape the in-memory and Mongo * drivers produce — and fails on any `failed to evaluate` warning, which is how - * the engine reports that it skipped a rule. + * the engine reports a predicate it could not evaluate (skipped through + * 17.0.0-rc.1, write rejected from 17.0.0-rc.2 — same warning either way, which + * is why this sweep still reads it). * - * A `ValidationError` here is a PASS: a rule that fires returned a verdict. - * Only silence-by-abort is the defect. + * A `ValidationError` here is a PASS: a rule that fires returned a verdict. Only + * the abort is the defect, whichever way the engine of the day resolves it. */ describe('predicates are TOTAL on the real engine', () => { - /** Run one object's rules and return the engine's "I skipped it" warnings. */ + /** Run one object's rules and return the engine's "I could not evaluate" warnings. */ function skippedWarnings(obj: AnyRec, data: AnyRec, previous: AnyRec | null): string[] { const warns: string[] = []; const logger = { warn: (...a: unknown[]) => void warns.push(a.map(String).join(' ')) }; @@ -475,7 +498,9 @@ describe('predicates are TOTAL on the real engine', () => { * without `completed_date`, then update its status to `completed`. Before the * guards landed, the merged record had no `completed_date` key, CEL aborted, * the engine logged `predicate failed to evaluate … — skipped`, and the save - * SUCCEEDED with the rule silently doing nothing. + * SUCCEEDED with the rule silently doing nothing. (On 17.0.0-rc.2 the same + * unguarded predicate would block that save instead — a different wrong answer + * from the same missing guard.) */ describe('the rule fires on a driver whose stored record omits the key', () => { const task = objects.find((o) => o.name === 'crm_task') as AnyRec; diff --git a/test/win-loss-capture.test.ts b/test/win-loss-capture.test.ts index c5144e4d..e12d2b1e 100644 --- a/test/win-loss-capture.test.ts +++ b/test/win-loss-capture.test.ts @@ -592,27 +592,28 @@ describe('win rate is measured, and both halves are load-bearing', () => { expect(bySource.get('content')!.win_rate).toBe(1); }); - it('a source that only ever lost reports no wins — a measured platform gap', async () => { - // 17.0.0-rc.1: a filtered measure contributes no row for a group its - // filter selects nothing in, so `won_count` is ABSENT (not 0) for - // `cold_call`, and a derived ratio over an absent input is null. The rate - // reads blank where 0% would be right. + it('a source that only ever lost reports 0% — not a blank', async () => { + // 17.0.0-rc.1: a filtered measure contributed no row for a group its filter + // selected nothing in, so `won_count` was ABSENT (not 0) for `cold_call`, + // and a derived ratio over an absent input was null — the rate read blank + // where 0% was right. // - // Pinned rather than papered over (#656): a consumer-side `?? 0` would be - // exactly the lenient-consumer habit this repo keeps paying for, and the - // fix belongs in the executor's merge step, which is the only place that - // knows a `count` over no rows is 0 while an `avg` over no rows is not. - // The shipped table puts `lost_count` beside `win_rate` so the blank reads - // as "0 of 2", not as "no data". + // That was pinned rather than papered over (#656): a consumer-side `?? 0` + // would be exactly the lenient-consumer habit this repo keeps paying for, + // and the fix belonged in the executor's merge step, which is the only + // place that knows a `count` over no rows is 0 while an `avg` over no rows + // is not. The assertion was written to fail when the platform fixed it. // - // This assertion is deliberately written to FAIL when the platform fixes - // it — that is the notification, not a regression. + // 17.0.0-rc.2 (#4708) is that fix, in exactly that place: a measure a query + // never reported now reads `0` for a count/sum on every merge seam. So the + // pin flips — the column that used to read blank now reads "0 of 2", and + // this test is what keeps it reading that way. const rows = await run(widget('win_rate_by_lead_source'), {}); const coldCall = rows.find((r) => r.lead_source === 'cold_call')!; expect(coldCall.lost_count).toBe(2); expect(coldCall.decided_count).toBe(2); - expect(coldCall.won_count ?? null).toBeNull(); - expect(coldCall.win_rate ?? null).toBeNull(); + expect(coldCall.won_count).toBe(0); + expect(coldCall.win_rate).toBe(0); }); it('the loss-reason breakdown counts only lost deals, grouped by reason', async () => {