From 2ee88c2405197c2c9a5740d1ce35897b2d388d8f Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 29 Sep 2026 08:48:51 +0000 Subject: [PATCH 1/4] chore(deps): upgrade @objectstack/* 17.4.0 -> 17.5.0 (partial: page.assignedProfiles pending) Move all 21 @objectstack/* dependencies to 17.5.0 together, with specVersion and engines.protocol at ^17.5.0 in objectstack.manifest.json and objectstack.config.ts. Regenerate pnpm-lock.yaml from the public registry. Adopt the 17.5.0 breaking changes that reach this app's metadata: - dashboards: drop chartConfig.type / xAxis / yAxis from 34 dataset-bound widgets. The spec refuses them, and every removed value agreed with the widget's own type / dimensions / values. Axis titles are lost. - close_case flow: the lookup screen field declares reference: 'crm_knowledge_article'. It is now required, and it gives the field a real picker. - sales home: the four object-metric filters use the ViewFilterRule array. - decision default flip (#15429): no edit. All 13 decisions that `os migrate meta --from 17` offers `mode: 'inclusive'` partition their out-edges, so first-match runs what every-true-edge ran. - admin docs: scheduled flows need OS_AUTOMATION_SCHEDULED_WORK_ENABLED. Re-scope the claims that named 17.4.0 (and four missed 17.3.0 claims) as the current pin, and add the changeset. NOT INCLUDED: removing page.assignedProfiles from six pages, which 17.5.0 refuses. This change was not applied in this session. Until it lands, validate, typecheck, lint, build and boot all fail on those six keys. Claude-Session: https://claude.ai/code/session_014VGCS11YUtYAiinRcdqQwL Co-authored-by: Claude --- .changeset/objectstack-17-5-0.md | 67 + content/docs/administration/automation.mdx | 2 + .../administration/automation.zh-Hans.mdx | 2 + .../administration/automation.zh-Hant.mdx | 2 + content/docs/whats-new.mdx | 4 + content/docs/whats-new.zh-Hans.mdx | 3 + content/docs/whats-new.zh-Hant.mdx | 3 + docs/STATUS.md | 2 +- docs/architecture/module-split-plan.md | 13 +- objectstack.config.ts | 2 +- objectstack.manifest.json | 4 +- package.json | 42 +- pnpm-lock.yaml | 1320 ++++++++--------- .../flows/campaign-enrollment.flow.ts | 5 +- src/revenue/objects/quote.hook.ts | 7 +- src/sales/actions/lead.actions.ts | 4 +- src/sales/actions/opportunity.actions.ts | 2 +- src/sales/dashboards/activity.dashboard.ts | 15 +- src/sales/dashboards/crm.dashboard.ts | 10 - src/sales/dashboards/index.ts | 18 +- src/sales/dashboards/sales.dashboard.ts | 18 +- src/sales/flows/_guarded-iteration.ts | 4 +- src/sales/flows/account-approval.flow.ts | 2 +- .../flows/lead-conversion-approval.flow.ts | 2 +- src/sales/objects/_hook-api.ts | 10 +- src/sales/objects/forecast.hook.ts | 2 +- src/sales/objects/lead.hook.ts | 12 +- src/sales/objects/opportunity.hook.ts | 7 +- src/sales/objects/task.object.ts | 4 +- src/sales/pages/home.page.ts | 8 +- src/sales/pages/lead_detail.page.ts | 7 +- src/sales/pages/opportunity_detail.page.ts | 4 +- src/sales/profiles/tenant-admin.profile.ts | 4 +- src/sales/views/forecast.view.ts | 6 +- src/sales/views/opportunity.view.ts | 9 +- src/sales/views/task.view.ts | 21 +- src/service/dashboards/service.dashboard.ts | 12 - src/service/flows/case-actions.flow.ts | 26 +- src/service/objects/case.hook.ts | 5 +- src/service/objects/knowledge_article.hook.ts | 4 +- .../objects/knowledge_article.object.ts | 6 +- src/service/views/case.view.ts | 4 +- test/case-create-form-narrowing.test.ts | 2 +- test/undeclared-key-probe.test.ts | 2 +- test/view-references.test.ts | 2 +- 45 files changed, 864 insertions(+), 846 deletions(-) create mode 100644 .changeset/objectstack-17-5-0.md diff --git a/.changeset/objectstack-17-5-0.md b/.changeset/objectstack-17-5-0.md new file mode 100644 index 000000000..7fd6283af --- /dev/null +++ b/.changeset/objectstack-17-5-0.md @@ -0,0 +1,67 @@ +--- +'hotcrm': minor +--- + +Upgrade the ObjectStack platform to 17.5.0 + +All 21 `@objectstack/*` dependencies move 17.4.0 → 17.5.0 together — 20 in +`dependencies`, `@objectstack/formula` in `devDependencies` — pinned exact, no +caret. `specVersion` and `engines.protocol` follow to `^17.5.0`, in +`objectstack.manifest.json` and in the stack manifest in `objectstack.config.ts`. +`pnpm-lock.yaml` was regenerated by `pnpm install` against the public registry: +726 `packages:` entries before, 725 after. 54 `@objectstack/*` and +`create-objectstack` keys moved 1:1, and `@objectstack/plugin-reports` left the +tree because the platform removed the saved-report stack. 15 third-party keys +moved: the eleven `better-auth` / `@better-auth/*` packages 1.7.2 → exact 1.7.3, +`nodemailer` 9.0.5 → 10.0.12 (a major, taken by `@objectstack/plugin-email` for +GHSA-6vj9-mwq6-2f5v), `zod` 4.4.3 → 4.6.5, `@xmldom/xmldom` 0.9.11 → 0.9.12, and +`yaml@2.9.0` dropped. `hono@4.13.11` was added next to `hono@4.13.3`, which the +MCP SDK still resolves through the kept lock entry. + +The platform changes that reached this app: + +- **Dashboard widgets no longer carry chart structure in `chartConfig`.** On a + dataset-bound widget, `@objectstack/spec@17.5.0` refuses `chartConfig.type`, + `xAxis`, `yAxis` and `series`. The widget's own `type`, `dimensions` and + `values` were always what the renderer read, so the stack would not load with + them. 34 keys are removed across the Sales Activity, CRM Overview, Sales + Performance and Service Overview dashboards. Every removed `type` and `field` + agreed with the widget's own binding, so no chart changes family or plots a + different column. **What readers will see:** the eight bar and area charts that + had axis titles (*Rep*, *Week*, *Month*, *Revenue*, *Channel*, …) now render + without them. The platform offers no replacement for an axis title on a + dataset-bound widget. Value formatting still comes from each measure's own + `format`. +- **The *Close Case* screen offers a real knowledge-article picker.** 17.5.0 adds + `reference` to screen fields and requires it on a `lookup` screen field. On + 17.4.0, *Resolved by Article (optional)* rendered as a plain text box asking + for an article id. The field now declares `reference: 'crm_knowledge_article'`, + the same target as the case's own `resolved_by_article` lookup. The + "Knowledge article id" placeholder is gone with the text box. +- **The Sales Home KPI cards state their filters as rule arrays.** The four + `object-metric` cards (*Revenue (Won)*, *Deals Won*, *Pipeline Value*, *Open + Leads*) wrote `filter` as a record. From 17.5.0, page and `object-*` filters + take only the `ViewFilterRule` array, and the platform converted the record + form on load. The source now says it in the accepted shape, as + `os migrate meta --from 17` lists. The numbers are unchanged. +- **Decision nodes are now exclusive by default. HotCRM needs no edit.** An + edge-branched `decision` with no `mode` now takes the first out-edge whose + condition holds, not every one of them. `os migrate meta --from 17` offers + `mode: 'inclusive'` on 13 of this app's decisions. Each of the 13 was checked + by hand, and in every one the out-edge conditions are exact complements, so + first-match runs exactly what every-true-edge ran. The key is deliberately not + written, as the platform's own migration note prescribes for partitioned + branches. +- **Scheduled flows are off until the deployment turns them on.** 17.5.0 runs + package-authored scheduled work only when `OS_AUTOMATION_SCHEDULED_WORK_ENABLED` + is set. HotCRM ships nine scheduled flows: contract and quote expiry, campaign + completion, forecast snapshot, stalled-deal alert, contract renewal, case SLA + monitor, task due reminder and demo bootstrap. **An operator who upgrades and + sets nothing runs none of them.** The admin *Automation* page now says so in + all three locales. Under the `isolated` posture a scheduled flow must also name + its organization, and these do not. +- **Claims that named 17.4.0 as the current pin are re-scoped**, not renumbered, + across source comments, tests and maintainer docs. Each now dates itself to the + pin it was measured on. None was re-measured on 17.5.0 in this change. Four + stale "current pin 17.3.0" claims that the 17.4.0 sweep missed are re-scoped + the same way. diff --git a/content/docs/administration/automation.mdx b/content/docs/administration/automation.mdx index eeb2e5104..7053983a7 100644 --- a/content/docs/administration/automation.mdx +++ b/content/docs/administration/automation.mdx @@ -98,6 +98,8 @@ See [Customization › Extending Objects](/docs/customization/extending-objects) Time-based automation is implemented as **scheduled flows** — flows whose start node carries a cron schedule. The nine `Schedule` rows above are the complete set; there is no separate scheduled-job metadata to look for. They run via the job service, so the `triggers` capability is paired with `job` (both ship in the default slate). +> **From ObjectStack 17.5.0, scheduled flows are off until the deployment turns them on.** The platform runs package-authored scheduled work only when the deployment sets `OS_AUTOMATION_SCHEDULED_WORK_ENABLED=true` (`1`, `on` and `yes` also count). Without it, none of the nine flows above runs — no contract or quote expiry, no SLA monitor, no reminders, no forecast snapshots — and `os doctor` prints the effective value. Under the `isolated` tenancy posture a scheduled flow must also name the organization it acts as; these nine do not, so they are not armed there. + Date-driven field logic that needs no orchestration — defaulting a quote's expiration date, freezing an expired/accepted quote, deriving a forecast period — lives in lightweight **object hooks** (`beforeInsert` / `beforeUpdate`) rather than a scheduled sweep. The division of labour on forecasts is worth calling out, because it is the pattern to copy: the **Forecast Snapshot** flow decides *who* gets a snapshot and *what the totals are*, while the forecast object's hook decides *which calendar period the snapshot belongs to*. A cron expression can say "every night"; it cannot say "the first day of this quarter", so that boundary is derived once, by the object, for every writer. diff --git a/content/docs/administration/automation.zh-Hans.mdx b/content/docs/administration/automation.zh-Hans.mdx index 882ef0d3f..8c6905078 100644 --- a/content/docs/administration/automation.zh-Hans.mdx +++ b/content/docs/administration/automation.zh-Hans.mdx @@ -98,6 +98,8 @@ description: 验证规则、流程、计划作业与审批 —— 无需你动 基于时间的自动化以 **计划类流程** 实现 —— 即起始节点带 cron 计划的流程。上表中九个 `计划` 行就是全部;不存在另一套需要另找的「计划作业」元数据。它们通过 job 服务运行,因此 `triggers` 能力需与 `job` 搭配(两者都在默认能力集中)。 +> **自 ObjectStack 17.5.0 起,计划类流程默认关闭,需由部署方开启。** 平台只在部署设置了 `OS_AUTOMATION_SCHEDULED_WORK_ENABLED=true`(`1`、`on`、`yes` 同样有效)时,才运行包内编写的计划类工作。不设置时,上表九个计划类流程一个都不会运行 —— 没有合同与报价的自动过期、没有 SLA 监控、没有提醒、没有预测快照;`os doctor` 会打印当前生效的取值。在 `isolated` 租户隔离模式下,计划类流程还必须声明它代表哪个组织运行;这九个流程都没有声明,因此在该模式下不会被挂载。 + 无需编排的日期驱动字段逻辑 —— 例如为报价设置默认过期日、冻结已过期/已接受的报价、推导预测周期 —— 放在轻量的 **对象钩子**(`beforeInsert` / `beforeUpdate`)中,而非计划清扫。 预测这一块的分工值得单独点出来,因为它正是要照抄的模式:**预测快照** 流程决定*谁*会拿到快照、*各项合计是多少*,而预测对象的钩子决定*这条快照属于哪个日历周期*。一条 cron 计划说得出「每晚」,却说不出「本季度的第一天」—— 所以这个周期边界由对象统一推导一次,供每个写入方共用。 diff --git a/content/docs/administration/automation.zh-Hant.mdx b/content/docs/administration/automation.zh-Hant.mdx index d01d8cec2..03615bc56 100644 --- a/content/docs/administration/automation.zh-Hant.mdx +++ b/content/docs/administration/automation.zh-Hant.mdx @@ -100,6 +100,8 @@ description: 驗證規則、流程、排程作業與審批 —— 無需你動 基於時間的自動化以 **排程類流程** 實作 —— 即起始節點帶 cron 排程的流程。上表中九個 `排程` 行就是全部;不存在另一套需要另找的「排程作業」中繼資料。它們透過 job 服務執行,因此 `triggers` 能力需與 `job` 搭配(兩者都在預設能力集中)。 +> **自 ObjectStack 17.5.0 起,排程類流程預設關閉,需由部署方開啟。** 平台只在部署設定了 `OS_AUTOMATION_SCHEDULED_WORK_ENABLED=true`(`1`、`on`、`yes` 同樣有效)時,才執行套件內撰寫的排程類工作。未設定時,上表九個排程類流程一個都不會執行 —— 沒有合約與報價的自動到期、沒有 SLA 監控、沒有提醒、沒有預測快照;`os doctor` 會列印目前生效的取值。在 `isolated` 租戶隔離模式下,排程類流程還必須宣告它代表哪個組織執行;這九個流程都沒有宣告,因此在該模式下不會被掛載。 + 無需編排的日期驅動欄位邏輯 —— 例如為報價設定預設過期日、凍結已過期/已接受的報價、推導預測週期 —— 放在輕量的 **物件鉤子**(`beforeInsert` / `beforeUpdate`)中,而非排程清掃。 預測這一塊的分工值得單獨點出來,因為它正是要照抄的模式:**預測快照** 流程決定*誰*會拿到快照、*各項合計是多少*,而預測物件的鉤子決定*這筆快照屬於哪個日曆週期*。一條 cron 排程說得出「每晚」,卻說不出「本季的第一天」—— 所以這個週期邊界由物件統一推導一次,供每個寫入方共用。 diff --git a/content/docs/whats-new.mdx b/content/docs/whats-new.mdx index 80e6b5caa..3497e1b55 100644 --- a/content/docs/whats-new.mdx +++ b/content/docs/whats-new.mdx @@ -71,6 +71,10 @@ http://localhost:4001 and create the first admin account. refuses the load up front with a structured diagnostic instead of failing deep in a schema parse. +Since 3.1.0 was cut, the app has moved to **ObjectStack 17.5.0** (manifest range +`^17.5.0`). That move ships with the next HotCRM release; until then, 3.1.0 is the +release that runs on 17.4.0. + > **This page does not keep a second release table.** The release-by-release > history is `CHANGELOG.md` in the repository, compiled from the `.changeset/` > entry every pull request adds. The versions between v1.0 and 3.1.0 are diff --git a/content/docs/whats-new.zh-Hans.mdx b/content/docs/whats-new.zh-Hans.mdx index feba13239..ce5c544b0 100644 --- a/content/docs/whats-new.zh-Hans.mdx +++ b/content/docs/whats-new.zh-Hans.mdx @@ -51,6 +51,9 @@ HOTCRM_TOKEN=... ./scripts/wow1-live-schema.sh 应用清单声明了与之匹配的 `^17.4.0` 协议区间,因此协议大版本不同的运行时会在 装载之初就带着结构化诊断拒绝加载,而不是在某次 schema 解析的深处才失败。 +3.1.0 发布之后,应用已迁移到 **ObjectStack 17.5.0**(清单区间 `^17.5.0`)。这次迁移随下一个 +HotCRM 版本发布;在那之前,运行在 17.4.0 上的发布版本仍是 3.1.0。 + > **这一页不维护第二张发布表。** 逐版本的发布历史在仓库的 `CHANGELOG.md` 里,由每个 > 拉取请求补充的 `.changeset/` 条目编译而成。v1.0 与 3.1.0 之间的各个版本都记录在那里, > 这里刻意不再重列一遍 —— 手工誊抄那份历史,正是这一节最终会宣称一个从来不曾存在过的 diff --git a/content/docs/whats-new.zh-Hant.mdx b/content/docs/whats-new.zh-Hant.mdx index 225917775..868b10c5d 100644 --- a/content/docs/whats-new.zh-Hant.mdx +++ b/content/docs/whats-new.zh-Hant.mdx @@ -53,6 +53,9 @@ HOTCRM_TOKEN=... ./scripts/wow1-live-schema.sh 應用清單宣告了與之相符的 `^17.4.0` 協定區間,因此協定大版本不同的執行時會在 載入之初就帶著結構化診斷拒絕載入,而不是在某次 schema 解析的深處才失敗。 +3.1.0 發行之後,應用已遷移到 **ObjectStack 17.5.0**(清單區間 `^17.5.0`)。這次遷移隨下一個 +HotCRM 版本發行;在那之前,執行在 17.4.0 上的發行版本仍是 3.1.0。 + > **這一頁不維護第二張發行表。** 逐版本的發行歷史在儲存庫的 `CHANGELOG.md` 裡,由每個 > 拉取請求補上的 `.changeset/` 條目編譯而成。v1.0 與 3.1.0 之間的各個版本都記錄在那裡, > 這裡刻意不再重列一遍 —— 手工謄抄那份歷史,正是這一節最終會宣稱一個從來不曾存在過的 diff --git a/docs/STATUS.md b/docs/STATUS.md index c95cd1e3d..12a82e571 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -73,7 +73,7 @@ pnpm verify | --- | --- | | Node.js | `^22.11 \|\| ^24 \|\| >=26` | | pnpm | `>=10.0.0` | -| ObjectStack packages | `17.4.0` | +| ObjectStack packages | `17.5.0` | | Local dev port | `4001` | Each row above is asserted against `package.json` (`engines`, the `@objectstack/*` diff --git a/docs/architecture/module-split-plan.md b/docs/architecture/module-split-plan.md index 0af56a29c..7482e9c3d 100644 --- a/docs/architecture/module-split-plan.md +++ b/docs/architecture/module-split-plan.md @@ -173,8 +173,8 @@ navigationContributions: [ ``` The shape was first read off `ManifestSchema` in `@objectstack/spec` 17.2.0 — the -version this repo pinned when this plan was measured — and RE-READ on the current pin, -17.4.0 since PR #1814 (#1807), during #1883: +version this repo pinned when this plan was measured — and RE-READ on 17.4.0 (PR #1814, +#1807), the pin during #1883: `{ app, group?, priority, items }`, unchanged, with `priority` optional (it defaults to `200`). ⚠️ One thing the 17.2.0 reading did not record: `app` is validated as a bare snake_case identifier (`/^[a-z][a-z0-9_]*$/`), so the dotted manifest id used in the @@ -358,9 +358,10 @@ would otherwise slug the heading to `#上游缺口--upstream-gaps` — the exact [objectstack#14439](https://github.com/objectstack-ai/objectstack/issues/14439), in flight. - Studio's writable verdict — [objectstack#14430](https://github.com/objectstack-ai/objectstack/issues/14430). -- An objectstack release carrying both, and the version bump in this repository. HotCRM is - pinned to `@objectstack/*` 17.4.0 today (PR #1814, #1807; this plan's own measurements - were taken at the 17.2.0 pin and are labelled as such). Merged upstream is not the same as available +- An objectstack release carrying both, and the version bump in this repository. HotCRM was + pinned to `@objectstack/*` 17.4.0 when this was written (PR #1814, #1807) and moved to 17.5.0 + after it (this plan's own measurements were taken at the 17.2.0 pin and are labelled as such). + Merged upstream is not the same as available in the pin (AGENTS.md, *Platform Upgrades*). **New, found by this analysis — for the PM to file upstream.** None of these is worked around @@ -565,7 +566,7 @@ decisions left to the compile path and this ruling settles. - **PSA** follows as `src/psa/` (`psa-module-plan.md`). The three upstream blockers under *上游缺口* are no longer the reason to wait: the compile -path and per-package registration are carried by the 17.4.0 pin, and the Studio writable +path and per-package registration are carried from the 17.4.0 pin on, and the Studio writable verdict does not gate a module booted from an artifact — the version table in `psa-module-plan.md`, *Where PSA sits*, cites the changelog entries. PR 1 is still the measurement that proves it here. diff --git a/objectstack.config.ts b/objectstack.config.ts index dc0e56712..d4cd3933d 100644 --- a/objectstack.config.ts +++ b/objectstack.config.ts @@ -93,7 +93,7 @@ export default defineStack({ // enforces that pairing against `objectstack.manifest.json` instead of // trusting this comment, because two platform upgrades in a row (rc.2, then // rc.3) moved the manifest and left this line behind (#728). - engines: { protocol: '^17.4.0' }, + engines: { protocol: '^17.5.0' }, }, // ─── Platform capabilities this app needs ───────────────────────── diff --git a/objectstack.manifest.json b/objectstack.manifest.json index 2269405f3..f8ee1a01a 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.4.0", + "specVersion": "^17.5.0", "engines": { - "protocol": "^17.4.0" + "protocol": "^17.5.0" }, "manifestId": "app.objectstack.hotcrm", "displayName": "HotCRM", diff --git a/package.json b/package.json index a366885f3..80856b5c3 100644 --- a/package.json +++ b/package.json @@ -36,33 +36,33 @@ }, "packageManager": "pnpm@10.33.0", "dependencies": { - "@objectstack/account": "17.4.0", - "@objectstack/cli": "17.4.0", - "@objectstack/core": "17.4.0", - "@objectstack/driver-memory": "17.4.0", - "@objectstack/driver-sql": "17.4.0", - "@objectstack/driver-sqlite-wasm": "17.4.0", - "@objectstack/metadata": "17.4.0", - "@objectstack/objectql": "17.4.0", - "@objectstack/platform-objects": "17.4.0", - "@objectstack/plugin-approvals": "17.4.0", - "@objectstack/plugin-auth": "17.4.0", - "@objectstack/plugin-security": "17.4.0", - "@objectstack/plugin-sharing": "17.4.0", - "@objectstack/runtime": "17.4.0", - "@objectstack/service-analytics": "17.4.0", - "@objectstack/service-automation": "17.4.0", - "@objectstack/service-messaging": "17.4.0", - "@objectstack/service-storage": "17.4.0", - "@objectstack/spec": "17.4.0", - "@objectstack/trigger-record-change": "17.4.0" + "@objectstack/account": "17.5.0", + "@objectstack/cli": "17.5.0", + "@objectstack/core": "17.5.0", + "@objectstack/driver-memory": "17.5.0", + "@objectstack/driver-sql": "17.5.0", + "@objectstack/driver-sqlite-wasm": "17.5.0", + "@objectstack/metadata": "17.5.0", + "@objectstack/objectql": "17.5.0", + "@objectstack/platform-objects": "17.5.0", + "@objectstack/plugin-approvals": "17.5.0", + "@objectstack/plugin-auth": "17.5.0", + "@objectstack/plugin-security": "17.5.0", + "@objectstack/plugin-sharing": "17.5.0", + "@objectstack/runtime": "17.5.0", + "@objectstack/service-analytics": "17.5.0", + "@objectstack/service-automation": "17.5.0", + "@objectstack/service-messaging": "17.5.0", + "@objectstack/service-storage": "17.5.0", + "@objectstack/spec": "17.5.0", + "@objectstack/trigger-record-change": "17.5.0" }, "optionalDependencies": { "better-sqlite3": "^12.11.1" }, "devDependencies": { "@changesets/cli": "^3.0.3", - "@objectstack/formula": "17.4.0", + "@objectstack/formula": "17.5.0", "@playwright/test": "^1.63.0", "@vitest/coverage-v8": "^4.1.10", "fumadocs-core": "16.9.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7026de0de..54c71fef7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,72 +9,72 @@ importers: .: dependencies: '@objectstack/account': - specifier: 17.4.0 - version: 17.4.0(vitest@4.1.10) + specifier: 17.5.0 + version: 17.5.0(vitest@4.1.10) '@objectstack/cli': - specifier: 17.4.0 - version: 17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + specifier: 17.5.0 + version: 17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) '@objectstack/core': - specifier: 17.4.0 - version: 17.4.0 + specifier: 17.5.0 + version: 17.5.0 '@objectstack/driver-memory': - specifier: 17.4.0 - version: 17.4.0 + specifier: 17.5.0 + version: 17.5.0 '@objectstack/driver-sql': - specifier: 17.4.0 - version: 17.4.0 + specifier: 17.5.0 + version: 17.5.0 '@objectstack/driver-sqlite-wasm': - specifier: 17.4.0 - version: 17.4.0(better-sqlite3@12.11.1) + specifier: 17.5.0 + version: 17.5.0(better-sqlite3@12.11.1) '@objectstack/metadata': - specifier: 17.4.0 - version: 17.4.0(vitest@4.1.10) + specifier: 17.5.0 + version: 17.5.0(vitest@4.1.10) '@objectstack/objectql': - specifier: 17.4.0 - version: 17.4.0(vitest@4.1.10) + specifier: 17.5.0 + version: 17.5.0(vitest@4.1.10) '@objectstack/platform-objects': - specifier: 17.4.0 - version: 17.4.0(vitest@4.1.10) + specifier: 17.5.0 + version: 17.5.0(vitest@4.1.10) '@objectstack/plugin-approvals': - specifier: 17.4.0 - version: 17.4.0(vitest@4.1.10) + specifier: 17.5.0 + version: 17.5.0(vitest@4.1.10) '@objectstack/plugin-auth': - specifier: 17.4.0 - version: 17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(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.5.0 + version: 17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) '@objectstack/plugin-security': - specifier: 17.4.0 - version: 17.4.0(vitest@4.1.10) + specifier: 17.5.0 + version: 17.5.0(vitest@4.1.10) '@objectstack/plugin-sharing': - specifier: 17.4.0 - version: 17.4.0(vitest@4.1.10) + specifier: 17.5.0 + version: 17.5.0(vitest@4.1.10) '@objectstack/runtime': - specifier: 17.4.0 - version: 17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(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.5.0 + version: 17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(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.4.0 - version: 17.4.0 + specifier: 17.5.0 + version: 17.5.0 '@objectstack/service-automation': - specifier: 17.4.0 - version: 17.4.0(vitest@4.1.10) + specifier: 17.5.0 + version: 17.5.0(vitest@4.1.10) '@objectstack/service-messaging': - specifier: 17.4.0 - version: 17.4.0(vitest@4.1.10) + specifier: 17.5.0 + version: 17.5.0(vitest@4.1.10) '@objectstack/service-storage': - specifier: 17.4.0 - version: 17.4.0(vitest@4.1.10) + specifier: 17.5.0 + version: 17.5.0(vitest@4.1.10) '@objectstack/spec': - specifier: 17.4.0 - version: 17.4.0 + specifier: 17.5.0 + version: 17.5.0 '@objectstack/trigger-record-change': - specifier: 17.4.0 - version: 17.4.0 + specifier: 17.5.0 + version: 17.5.0 devDependencies: '@changesets/cli': specifier: ^3.0.3 version: 3.0.3 '@objectstack/formula': - specifier: 17.4.0 - version: 17.4.0 + specifier: 17.5.0 + version: 17.5.0 '@playwright/test': specifier: ^1.63.0 version: 1.63.0 @@ -83,7 +83,7 @@ importers: version: 4.1.10(vitest@4.1.10) fumadocs-core: specifier: 16.9.3 - version: 16.9.3(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(zod@4.4.3) + version: 16.9.3(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(zod@4.6.5) remark: specifier: ^15.0.1 version: 15.0.1 @@ -134,8 +134,8 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@better-auth/core@1.7.2': - resolution: {integrity: sha512-j0nM4ygsWbF/fcYRoKtDn8gn8uLXkmC+075HqSqsJEAV828cJR9bvYBCUQ1zmxNyRBk6Iz/qXsA0Zm2oksiOTg==} + '@better-auth/core@1.7.3': + resolution: {integrity: sha512-JdP7lOkyE83jgjn7RilJj1XvZ7n2JjRsErKJuaXchjyuNo6cf1iVd3GtbhAtiUyJJkWdk8yL+LaUBKT80H0zLA==} peerDependencies: '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 @@ -151,55 +151,55 @@ packages: '@opentelemetry/api': optional: true - '@better-auth/drizzle-adapter@1.7.2': - resolution: {integrity: sha512-A5wE10PIv3aS5LGePecEHntQylKy6OOF17B4dqlE0DwJeqU/IOBSd7/LZhMop9cNJ3WFjKMpazVSf91yYM/NFg==} + '@better-auth/drizzle-adapter@1.7.3': + resolution: {integrity: sha512-S+nQRlxbUhkR43LrSv8c98ZvOvmv3nrtOnHkiZXkdDkr60PWp7maC2cqgzZ2C9exCC1a+4TugJlx2jRL+r+/9A==} peerDependencies: - '@better-auth/core': ^1.7.2 + '@better-auth/core': ^1.7.3 '@better-auth/utils': 0.4.2 drizzle-orm: ^0.45.2 || >=1.0.0-rc.1 <2.0.0 peerDependenciesMeta: drizzle-orm: optional: true - '@better-auth/kysely-adapter@1.7.2': - resolution: {integrity: sha512-LYdSRLOvZiF+6S0UThu+wE/Qxsq9P2jQs7ZKkY6BIBJqUjYyxVDmi8HFcantBvWWW1/BeQCSsD7YVDG4gICMIQ==} + '@better-auth/kysely-adapter@1.7.3': + resolution: {integrity: sha512-UIsyJMIrjUnT+yTaS6dkCxYYmtPwxFHxwSJ8+CLty2II5w9BewlDxDA0/QzhoL/InYCPxQ5Y6xIgLHZG1dhwRA==} peerDependencies: - '@better-auth/core': ^1.7.2 + '@better-auth/core': ^1.7.3 '@better-auth/utils': 0.4.2 kysely: ^0.28.17 || ^0.29.0 peerDependenciesMeta: kysely: optional: true - '@better-auth/memory-adapter@1.7.2': - resolution: {integrity: sha512-0q1SXMzm5esH9L0xVuM6IxCk59E4G+3HySX4My9gvEwqtmUobykn+iuc/si3Y4xwUO7JODqQ5o+/pPcLDDMIrA==} + '@better-auth/memory-adapter@1.7.3': + resolution: {integrity: sha512-WdLANFY/QWC3G351RCzxU+Y9YlW+BQ1oG9NwBTSOUWQw5rZ87ws+weU8tvAMO7sQ4C9gKIlkOKBKUKXrSt91Tw==} peerDependencies: - '@better-auth/core': ^1.7.2 + '@better-auth/core': ^1.7.3 '@better-auth/utils': 0.4.2 - '@better-auth/mongo-adapter@1.7.2': - resolution: {integrity: sha512-4879SmUWHUs0OYlvHoCFbycZ7i1bqytkcgAUdt9RLQMvZ5H3LRMTgax2YVlGZEXgwNjY/X7xAoXOecWLhlQWeA==} + '@better-auth/mongo-adapter@1.7.3': + resolution: {integrity: sha512-YL9m01tNogmFmRvOWJ46M9WwE6HirCXHDell29mtsQB/Qs1TPNLrgj7ybGMMGhQuyj6S218+8Wbls8m9s+i8RQ==} peerDependencies: - '@better-auth/core': ^1.7.2 + '@better-auth/core': ^1.7.3 '@better-auth/utils': 0.4.2 mongodb: ^6.0.0 || ^7.0.0 peerDependenciesMeta: mongodb: optional: true - '@better-auth/oauth-provider@1.7.2': - resolution: {integrity: sha512-td7FnUz3lLKXFXN+0RbZe3ygaHqxpRqDG+gxbfSZbztbVfG7vuZtR4ba3uccsodAw7anchhIg2xwVP1/zlcxcw==} + '@better-auth/oauth-provider@1.7.3': + resolution: {integrity: sha512-Eoajj68F1ETmp4NBM98tgj1Uiip4cZiFqFsijAWIvOEQTejr/67PWK1/92N8PiNdLf03ezUWU538W93rd9fyIw==} peerDependencies: - '@better-auth/core': ^1.7.2 + '@better-auth/core': ^1.7.3 '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 - better-auth: ^1.7.2 + better-auth: ^1.7.3 better-call: 1.4.0 - '@better-auth/prisma-adapter@1.7.2': - resolution: {integrity: sha512-mXTr/83WrNWLrvzIjtgDgdu9iXhOcSG1+qBQOAKlbGSFiOB+z4IMRneQ2wmMOiB8mKY9qGkClVUjKRFXqtHnFQ==} + '@better-auth/prisma-adapter@1.7.3': + resolution: {integrity: sha512-TJ/DhlU7oLzrC626/1wfYA1Pl+lVsXa/zXBZ8d7Rlc2YO5fGd5fsAYJdRrYMyA51iZEo+rWLXMhZ0cez1BamsQ==} peerDependencies: - '@better-auth/core': ^1.7.2 + '@better-auth/core': ^1.7.3 '@better-auth/utils': 0.4.2 '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 prisma: ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -209,27 +209,27 @@ packages: prisma: optional: true - '@better-auth/scim@1.7.2': - resolution: {integrity: sha512-RBwVN189w37xwK0n+mRgARTmJFCriOsMVCbe7Bzeyak6esSg9kTGeCUmGtfgwOKJ3jJWQkeAQdWw7VRJ/HOG6w==} + '@better-auth/scim@1.7.3': + resolution: {integrity: sha512-1/L7zIEUAb1jxlzWKkqbDAD4Jz7u83yZg15TSaIaKcFe1dpCdNxkzQRrjbPLUfnVtBh/vnk10uLxVFCtbMdrdg==} peerDependencies: - '@better-auth/core': ^1.7.2 + '@better-auth/core': ^1.7.3 '@better-auth/utils': 0.4.2 - better-auth: ^1.7.2 + better-auth: ^1.7.3 better-call: 1.4.0 - '@better-auth/sso@1.7.2': - resolution: {integrity: sha512-8tmkAGdcVu8Tr/+LPfSRgs/5a8YE1uU8OeaN5mAzsSdMWR4iwZdwQlJJmU8f9qZyIpNL/B6mIfDc5vaVUy1ECQ==} + '@better-auth/sso@1.7.3': + resolution: {integrity: sha512-inxETRuOfyy8m0uEJSfi9uhScp4RkQ7ZYI+GRj+Jtz6ml/p5wTzNOjYZsG43TroUTDfrElF6CYQON5/Xk1XdmA==} peerDependencies: - '@better-auth/core': ^1.7.2 + '@better-auth/core': ^1.7.3 '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 - better-auth: ^1.7.2 + better-auth: ^1.7.3 better-call: 1.4.0 - '@better-auth/telemetry@1.7.2': - resolution: {integrity: sha512-LcWu+O0zrxYDQj8E36vfkJwGPW4k9ZDA/rCo0zST6ihzL+juR7pBowoZIM9E6tK0Vit52mf6412bGT4XM4eTjQ==} + '@better-auth/telemetry@1.7.3': + resolution: {integrity: sha512-aixgHbJhGvS8PRczX/LR3murYyBnIvOGmJw37ZZBMg6ZtLR/UBJAkufbDi1HYn5THSuTJ3D5DtY85Ahh/ABQtw==} peerDependencies: - '@better-auth/core': ^1.7.2 + '@better-auth/core': ^1.7.3 '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 @@ -563,45 +563,45 @@ packages: '@nodable/entities@3.0.0': resolution: {integrity: sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==} - '@objectstack/account@17.4.0': - resolution: {integrity: sha512-VrdHnwBzLrcE+nGVFKpQRdaCnE9gcPJrZWEfYFobvAA9i0Rna4qW+b8CNnZGHAwCHguZPjULA9PPQ6gddUakWQ==} + '@objectstack/account@17.5.0': + resolution: {integrity: sha512-o1lhpPoqX/NudUfdUAraXQuhzIOp+YC/vng+TGWk+sEq4MnhtV70g+wsuF+K5QxT2mqf8/A68CHtJT/YKRkLVQ==} engines: {node: '>=22.0.0'} - '@objectstack/cli@17.4.0': - resolution: {integrity: sha512-w1enDeHRS7ai2XzH47x5poYdf6qwDhfDCnNErSiib5vpaG87JDf+JOlT/QoVEyW1i3ruovlftTwpYUBEIqWEnA==} + '@objectstack/cli@17.5.0': + resolution: {integrity: sha512-KW8Thc++S7icdsbAwlBxa1jJa26aBXUmOBa9CLftyHqKnt8sJ2PmDmu+XbJAEkto9+s6OufDL/BdH+f4I8Be8A==} engines: {node: '>=22.0.0'} hasBin: true peerDependencies: - '@objectstack/driver-turso': ^17.4.0 + '@objectstack/driver-turso': ^17.5.0 peerDependenciesMeta: '@objectstack/driver-turso': optional: true - '@objectstack/client@17.4.0': - resolution: {integrity: sha512-4Zsov0iRcZhaYAGiabX2XJPhDsE6XmRhlfYikxLECZ1cxbHhXjVpsNL3rl56wkTHuNV1jMzZZwzj2rJJUbVYcQ==} + '@objectstack/client@17.5.0': + resolution: {integrity: sha512-RT8CoPw7v+ejADcK1NJRD/1rHOQJMKC+rL7SjTvEqI+Cfxulz3K4NSgILpyPZMaic72O6DWiWSNueNiFp/7W1g==} engines: {node: '>=22.0.0'} - '@objectstack/cloud-connection@17.4.0': - resolution: {integrity: sha512-WVIv57eXWoFlpkRWpUZdWQo7XG1Dxwij1HFcTvigACvAIbxwPnVXlt0bqOHCjagfdGHNfUdzutnA1LijfvGfHg==} + '@objectstack/cloud-connection@17.5.0': + resolution: {integrity: sha512-/zT7/33xSsgNUOZAfN71PtRP87+5XbkJ3fwQAzKR2b93h8XGmayCSktIq4apq/FG2c9WgSkqC8Xo3at/bK3iPQ==} engines: {node: '>=22.0.0'} - '@objectstack/console@17.4.0': - resolution: {integrity: sha512-TL8Kgw7PsJHyMK0+RGRQu7KWwuEQjhL87rUOg5rwC+G4dDIsyi/oZYQSjvf5+Nw0W51/A1rw7iIciyoLfQycTw==} + '@objectstack/console@17.5.0': + resolution: {integrity: sha512-rTZWCi5sL4cZPARgeVbyc4b5wGfkNdcqr54NQpLEszR2dP6jRiyQV/7mPknngt+EqfhuhEYmy7s3Ji6lXsnVLA==} - '@objectstack/core@17.4.0': - resolution: {integrity: sha512-e/br10MaIZAJGgD7pb9AnW8zn9I18aJyiUYswMQGdjGheZYpp98ZV3WlAVpZFhnKkfd42VDMltB+X494oB8/1Q==} + '@objectstack/core@17.5.0': + resolution: {integrity: sha512-KYVVHoqDQZzqvCD7B1REAnQc80ZeimrkSryaGvPfQc2bdurvTOjtubGXw2IkQsh3g2Gh0RD9QzohteEU7C1DFg==} engines: {node: '>=22.0.0'} - '@objectstack/driver-memory@17.4.0': - resolution: {integrity: sha512-BRldy/el8QfusgJYvN1PjnAfAD1fmKqJgvOPKRHRnp68azfBYmUqGLrSV+/p8Ut4IMGVFpsRTg8L1DkYGY5MoA==} + '@objectstack/driver-memory@17.5.0': + resolution: {integrity: sha512-MBaMzbXGo5SP5ycpahPzg7FDNoAJrv3HXHkFmqcZz0Yi2Pn4Xncc9+nTlExXfiTRAW+dOVJmXM0viFQqqOkYGA==} engines: {node: '>=22.0.0'} - '@objectstack/driver-mongodb@17.4.0': - resolution: {integrity: sha512-92n6r0eqrLbegtH5AO8IDrOCsF8C688fYG2ovqDTeD2UNGkHhsZ7DmBO3lpDEMKYbwKtG3R1ro0V1cQ4KsqP8A==} + '@objectstack/driver-mongodb@17.5.0': + resolution: {integrity: sha512-CP8qR1OhRFGNgAA1Qul1jWTZS9lK/uiUfN6DBBrA9QOcIuXX30u7DOSMGVWwgNSlyj4W4RqEfEd1nN5YluC3Cw==} engines: {node: '>=22.0.0'} - '@objectstack/driver-sql@17.4.0': - resolution: {integrity: sha512-63up0U1AUQQKhnDqADTih9HJVfATkl5BAeAx1MXHYQJuAmP2EQnMxQDDiumwSh819mj7c8IxLpyGiy8/TcbogA==} + '@objectstack/driver-sql@17.5.0': + resolution: {integrity: sha512-F8XaUaO327kh1C9ju40Pr2sW/t2ne2kNHgx94U7nMYXnZ6k9wRM/aNPNEA0id2tm+d2oLXcmoN6Jj9KGUPFKLg==} engines: {node: '>=22.0.0'} peerDependencies: mysql2: ^3.0.0 @@ -615,23 +615,23 @@ packages: tedious: optional: true - '@objectstack/driver-sqlite-wasm@17.4.0': - resolution: {integrity: sha512-jI7e3gIy65dfcw3X6PAsCL5yx9bXliso3VDaaEsglQrXW+ixLV+x0vRguk/Xa9BVv53/ntwbMryDGdDF0an02w==} + '@objectstack/driver-sqlite-wasm@17.5.0': + resolution: {integrity: sha512-ML2lIgvY1J4eqY5s3vMun1EIuYOFzAxPNbnmO5qGqHyzUT9AnflQF6lNmnOdPbuSc8Y+8TMRyXx2VmS+tlK0VQ==} engines: {node: '>=22.0.0'} - '@objectstack/formula@17.4.0': - resolution: {integrity: sha512-pWVkvXKXJxjnsx1i7mYIteltc6kjn/qS6swJ6bw5XG5B7bf8GjjBsuvcJR86nuTg+z8B9+snruaD9i9v8uw0LQ==} + '@objectstack/formula@17.5.0': + resolution: {integrity: sha512-2vot7CS7++4vuxOJ3fyWVUPOut+/oejJT1YbLwyyyVDxj4WjZ3tJqEk+WGRqNunwYbd3CTk7jrtMo7SRzF7+Xg==} - '@objectstack/lint@17.4.0': - resolution: {integrity: sha512-9Lst+TDusPVh3Fb1gxDPSsXpAFrkEIlusqLzBsCKQ0ebLaHxG2GrfMXQofDTox9vr7jOVSAKCW5jkHUmg5XpoA==} + '@objectstack/lint@17.5.0': + resolution: {integrity: sha512-sXNgX4PFAMwo5q7xRqUfTEBUE5OKStYQwmFqdwDDN5Zir8JRJi9z2cN1D42h9PciR4Y9+Qum0z9gOKgS6o0jsw==} engines: {node: '>=22.0.0'} - '@objectstack/mcp@17.4.0': - resolution: {integrity: sha512-EKvEKF9t2HjjoZPCwe7mqvMVzIKqxiYctWq95wdHqUWp4ERL2kEm4bfQKXj07AgnAZxT7WrRcqGdOdxZStEfPg==} + '@objectstack/mcp@17.5.0': + resolution: {integrity: sha512-e7T9to+D9frpAQV781Q7HVOL2uXpiboen8bxmNLNxHO1JTO7cdr7po9QVMBkqcu+Z6EAUv6MeVHojfR9ST1I8g==} engines: {node: '>=22.0.0'} - '@objectstack/metadata-core@17.4.0': - resolution: {integrity: sha512-zhQpw/FUK2UOjKWHY2x5k43h4NXRiVJZ2tnkl3iu1j/akbn6Bik73p8OVzEHO7IvpEmY821lfRp/235yTqZWAw==} + '@objectstack/metadata-core@17.5.0': + resolution: {integrity: sha512-bZeuYq4ChkmTLvjTVrErIFMiv3qC4DwNrSEBDyoCSkC4VqH9w0dp0hCzzFKtzY+hX3gImdtsl9U/Tb15HQwT3w==} engines: {node: '>=22.0.0'} peerDependencies: vitest: ^4.0.0 @@ -639,101 +639,98 @@ packages: vitest: optional: true - '@objectstack/metadata-fs@17.4.0': - resolution: {integrity: sha512-lVpVc/XBnrAWukmq5jmihDNDjf44Udopu7olYH7PacInghjdwZA+wMU4tHGNBiGJuRVjrIebcsfIxJ5o4+p4pA==} + '@objectstack/metadata-fs@17.5.0': + resolution: {integrity: sha512-+TOPgEXqaALTkd/P0cYUtmMGPdUQkHo37FbTGbAlLhAdT7fuUNXAuWG4i8F4R2INxoyEjsOPaxy1WVuoH9e6Xw==} engines: {node: '>=22.0.0'} - '@objectstack/metadata-protocol@17.4.0': - resolution: {integrity: sha512-iYHlxxKhi7t/C/i602fX9x+D/c9f2ElwdtfEUgyzf8DkZIrYel7e7Ayoincahm9xlWSlD4Ijjl3cBElnhrvJrQ==} + '@objectstack/metadata-protocol@17.5.0': + resolution: {integrity: sha512-yC0vJptIc0PfJZK5RWiNnFK9/c+BX7iEs5QU79ZkuRvwXrfYD+WOF2yADQOKY21opGESHCXUoeds7gysbtiRRg==} engines: {node: '>=22.0.0'} - '@objectstack/metadata@17.4.0': - resolution: {integrity: sha512-GQvja5+iClxhBxnX01DQvMc+JMKIFpA7/kYzgAqIdbNZ13l8OuIkP3ADwCmlBrwDid7bkkDNOCD8eYvXr5/E6A==} + '@objectstack/metadata@17.5.0': + resolution: {integrity: sha512-CpPsFzpOA1jArwsUVPZK960aM7T2XEeuX/O9OGDhtxYLcOG4/lHB+CizW2ncNNUlEed2oFMCX3KRdhBf5yljlw==} engines: {node: '>=22.0.0'} - '@objectstack/objectql@17.4.0': - resolution: {integrity: sha512-b7LNj/7BUILbmz1sHgxEVEDk2DJXAPYEuIEp5t/VzQz9vz9iAiENJow3QBvCwCcnWYD7n62dVhHDDFicMtbLsw==} + '@objectstack/objectql@17.5.0': + resolution: {integrity: sha512-1M6bX2X20ewJIBqLVqQmvHccY3JZ+hXOsZDQ8tAeeurHr71WleeDfccWnQgwYxiTfy6e61Cg0+ry2TbIZ9V1NQ==} engines: {node: '>=22.0.0'} - '@objectstack/observability@17.4.0': - resolution: {integrity: sha512-LkcfJCvrn4Zab2hz3pG9yimUfN8Ly3RhRhK011PtGBh1L4juXc67zg1flh6rfbNmayLzw7dPeg+WQMLuDkLRxw==} + '@objectstack/observability@17.5.0': + resolution: {integrity: sha512-MjGACa0SDaDMXqUhg2CFVD7pSolhVegih72kooxvCBdp6WG6dv1utqNx0yjgY/rYdkBjNz0GK3iZPQCLxuEU0A==} engines: {node: '>=22.0.0'} - '@objectstack/platform-objects@17.4.0': - resolution: {integrity: sha512-p4MdRDlPNPxvj1VUfuW8ym0eLr99vMDWVdw3mNIkR73v7rao/Xyq9Bgu4Rm9SEK63TvvQS3fVQ7CGQGwkS0MSg==} + '@objectstack/platform-objects@17.5.0': + resolution: {integrity: sha512-1yW+Y/+bLhOHED1ndv3gFag3ZxvPtvO/G7i1xFtsuOohTdo8HCztIft1M00fESWUdw/MBpBfAkppaiaKCurXmw==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-approvals@17.4.0': - resolution: {integrity: sha512-BLcrU9trWoO3gfXpazxdHJxKSAUJfNTJkFGuYDZHw/ICjt3ZdaiEQV95eUhN2Nib0we/r85DZTz3OsDab771Mg==} + '@objectstack/plugin-approvals@17.5.0': + resolution: {integrity: sha512-PCEZhHv6sH4mpfHIAzwVin0O4A3yWfAoXUX5pD6oMZtuFUa3+LVXcGgiUc6xRRAwF279aF5cLwKG2/xXfv+3hA==} - '@objectstack/plugin-audit@17.4.0': - resolution: {integrity: sha512-RLVxRMZiEjiUkEg2rwJteHkFd868bcxsoFJ/x10hYrQmCHnMoppZzFEdYzRrijNK3qkFVsCfI5FlNE6m/HyfNA==} + '@objectstack/plugin-audit@17.5.0': + resolution: {integrity: sha512-PHLxoACTamADmVnGK8+EB39Lz++Rmp1dqKX/4LBbykiwvAcdx2lzKL2SPB57LtXcacDOE7ZstBFcz7hQa5OTDA==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-auth@17.4.0': - resolution: {integrity: sha512-GISbJk9f9gbvIEc/+gHiEk/ltRaJ2ic1Dg3hmWJKCtwiyn93t7FRfxS93Qb07mjMXGXW2B2Q540EkI+vvhxgeg==} + '@objectstack/plugin-auth@17.5.0': + resolution: {integrity: sha512-A6SjjQvP0iMLU8qQ2O6uxQin8LJGw5uhkk7glaUiNIRm+xMQs73Iz2O9dTRQbpTj8mYDMJy1jim4RL1k5Rziog==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-email@17.4.0': - resolution: {integrity: sha512-jDaExEd3eSZjy7xiltFTJhgFLjnflPddwmCN2eVbMkVN8OOzI2n6pz7d5Za2kT1Mt92pfmi1z4cQE5YMn9r9NA==} + '@objectstack/plugin-email@17.5.0': + resolution: {integrity: sha512-BR2kxtpWWAbzDhrVb68RvqNsNW2AZSaD5h1GZmlPibaQoDND8akwhIQcJRt3hZfbcEdodbPVmVn5FJZGuFNGEQ==} - '@objectstack/plugin-hono-server@17.4.0': - resolution: {integrity: sha512-LTZ4RI9/ZDaKqXOtnm4uviqfeygbZNEMcEGlGu9PVTxu0uND7mLvjh0nz1wqYwWAl/f5eRN57BN3bgzqV2Bt1A==} + '@objectstack/plugin-hono-server@17.5.0': + resolution: {integrity: sha512-MBkfwzkI1m9dCZNermV2+Qw4elSbHQAjqncBaC5vtbUYZyXqK2U0XFbjQnSv/WyBmqCIer2cHM5gwoRTZEH3hQ==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-pinyin-search@17.4.0': - resolution: {integrity: sha512-p1uvYETyvfz8622y7xv3caBVeKGq/0KV6mPxkitMxO6Qpm85hT/KWCoJ6uxwRL43use9ji8CpL41mHAma7Vzhw==} + '@objectstack/plugin-pinyin-search@17.5.0': + resolution: {integrity: sha512-bk9rGpDlJUSed6h4NojE277AGjm08fvvLe2S6VShtaeJgn9uRcStqTMzVWi5/Z4QfcvXCotH/kkfMHBAK+RY7g==} - '@objectstack/plugin-reports@17.4.0': - resolution: {integrity: sha512-9ITXRV2w5WQoOuXZRsLmfPI2MG/MBee60kx1beA5K35pqRckVED06FThTMTMlClmBa0xDMZx1ITSMs0PnAmMLA==} - - '@objectstack/plugin-security@17.4.0': - resolution: {integrity: sha512-r/wgp7vKhpwrRHKua1wbGyCadyuWllT5BWOQltW/HYy2I8fCfYF+otTdkENNDq018XowB1HIfwdUXMO8p2gpXA==} + '@objectstack/plugin-security@17.5.0': + resolution: {integrity: sha512-jV90PLcxLJKXH7X8jWrPS8LVlsnYESs66u70oGSdTHsYBrxrQx1LKVc/SnrfcIHxCqK55l6MvgjnWBnCyPkwlg==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-sharing@17.4.0': - resolution: {integrity: sha512-5elA8yGI7nCP2tAT4yWl63H/76Qn6JcusaI+xeES28ScNVWuiasCVu9ocf7kxBxFk8OUmnR9ba4DANwPvQyBkQ==} + '@objectstack/plugin-sharing@17.5.0': + resolution: {integrity: sha512-JsYAXL415GMycckmFJXXV3CvnsI4HHUzZRSgk3sts5Aclt9DweUQAGszY/se5Fp0L390qS10B5tvP5q+Nc3ipA==} - '@objectstack/plugin-webhooks@17.4.0': - resolution: {integrity: sha512-6gcd+v1bME30LSQ2weeXa0q+naa5ITjqfhYDbuh+L3sSGAXOrflDRs/SGJKFvsw7dWsv98Jdw0rkknRq5kwfdA==} + '@objectstack/plugin-webhooks@17.5.0': + resolution: {integrity: sha512-GNJkd3Za8i2Mrp2YEA0lEPb1OuVNOiJakq/14s+YaIHYO/gKZBN80SD7gfYly+uGqRkMNL8xngnL21+psfAPkA==} - '@objectstack/rest@17.4.0': - resolution: {integrity: sha512-q132ZGba7Zez9Ei4a6xvkVpbephDBQ7oi5GsxGQeT8ljL9duoLpOX7GJa7HwqAbOGi7MRmgoN6+BEmrzmBz9fQ==} + '@objectstack/rest@17.5.0': + resolution: {integrity: sha512-9zvUMnzrxb8hIVsIU0Q9yCH7BWKdPytzA6eIE1ydb0vPrpF62UnRLVDA5hUi5mrK1l9JIOgTdJ2RWOO/FwXQVg==} engines: {node: '>=22.0.0'} - '@objectstack/runtime@17.4.0': - resolution: {integrity: sha512-q2bMGlD0/z+DUbsMlg055UwTSkJszgtQyqJWJWcJP8Z+5xkHo2nE3tDGQEhdwfcpJwm5aoafniZ0WLf5Pbo+Dw==} + '@objectstack/runtime@17.5.0': + resolution: {integrity: sha512-xOkGoFTTCh2fdqsJEoH4Qvt8GC3F5QUY7RS7BQlSGfL5MIR2sQzURnLZ+l3npnwezJYw1niT0I3oihX8+NayMg==} engines: {node: '>=22.0.0'} peerDependencies: - '@objectstack/driver-turso': ^17.4.0 + '@objectstack/driver-turso': ^17.5.0 peerDependenciesMeta: '@objectstack/driver-turso': optional: true - '@objectstack/sdui-parser@17.4.0': - resolution: {integrity: sha512-pKKTqP6siwsLtcO7tDxMufHoCWuUeWjoRBv8NRGlptB+a/uhO0WKXHzZ3+zWVqz9a/Ac9N2Xwp+hBPoGtG4Z1w==} + '@objectstack/sdui-parser@17.5.0': + resolution: {integrity: sha512-GBn5BONhKuWfI/wmI+X4P0mh4a/cKx6Zo0rgZojWVBVC00fPpxuMb5obO74Do509Nm6o0h7m7OAq65Rb0td7TQ==} - '@objectstack/service-analytics@17.4.0': - resolution: {integrity: sha512-meRlePSJ9pUAYXMM+sUk8wZgca5jSV6R53vYhfEoqdYXP1C1xqnpAD9gXZLFDmyK4kz3ihHv3TZ0ozvtXXL4/A==} + '@objectstack/service-analytics@17.5.0': + resolution: {integrity: sha512-f9izAUWbBE6XMsIdi6yLtwJBgsUitpILYrk6Y4auTP6NI9RWwY1QWSvUndSLccM2+6pZ8hWuBgLBQgjf5i4/Qg==} engines: {node: '>=22.0.0'} - '@objectstack/service-automation@17.4.0': - resolution: {integrity: sha512-lT+Lkx6i1Xox017nMBAFUgrtP4Bb7XPV39R4AG5u/caNxINJpnezomd/imEcGY8yBsUlwtXuRc/VFEUjyFucyg==} + '@objectstack/service-automation@17.5.0': + resolution: {integrity: sha512-aX5jaZT/KHIJquAZ9J0yofnvOYGcETnDU9dQ571mR0RM66z7vAInNE8mfIouOWDfpsdkUij3j20igdy2fIGs8w==} engines: {node: '>=22.0.0'} - '@objectstack/service-cache@17.4.0': - resolution: {integrity: sha512-hCjjx+jSU5yCasPryGC3eTzmOw2Rc4GfzMthUWlie0uw1HzlTgRFxxq6GDd2JfPg3ysCrdEdt9a96KTYCJf7Yg==} + '@objectstack/service-cache@17.5.0': + resolution: {integrity: sha512-N5CmLCvDww2ouzJAFa14QyBqw7PgHG/1G1Oj99ljE/mxuynw2dWChudxzYKFeBTxn9YuKcU0Mt+JG4TIgbrfBQ==} engines: {node: '>=22.0.0'} - '@objectstack/service-cluster@17.4.0': - resolution: {integrity: sha512-IaeUfak7j86Js31RFHgeRw78yxUFyclPIOpdBv3PQjUV5TagtODAWdUyp8URQr+jUJTrwYCIbFoz81G18t7QUA==} + '@objectstack/service-cluster@17.5.0': + resolution: {integrity: sha512-y1raG/B4TJqf6vv23T2O97jOfDab2AezRA808fHzuveNAak/lbVtSm4ItjCD8fjJrnrKkOpwZCLY/ZEHjXggfg==} - '@objectstack/service-datasource@17.4.0': - resolution: {integrity: sha512-CSOpXKBOiOHFlbbQhR9qThRZO11FZwVYmKBBviDfGr/yJQi9S7b0ZkJ9yIkZ7xsRszEFQD4jxDQ9D1J9zuQVqg==} + '@objectstack/service-datasource@17.5.0': + resolution: {integrity: sha512-YX8EdaozDhZBJJLC5UWyv5JpTboySCQNQDzgnDIkfOfbLN4trdOe0zwPgeyoQV4is/JulLcCsfhWvzk//SQC2g==} peerDependencies: - '@objectstack/driver-mongodb': ^17.4.0 - '@objectstack/driver-sqlite-wasm': ^17.4.0 - '@objectstack/driver-turso': ^17.4.0 + '@objectstack/driver-mongodb': ^17.5.0 + '@objectstack/driver-sqlite-wasm': ^17.5.0 + '@objectstack/driver-turso': ^17.5.0 peerDependenciesMeta: '@objectstack/driver-mongodb': optional: true @@ -742,39 +739,39 @@ packages: '@objectstack/driver-turso': optional: true - '@objectstack/service-i18n@17.4.0': - resolution: {integrity: sha512-hPois8KeNT98QfTde1i98cyMj0G2V9NMb1T7mHG2HNIGyqdKWYFZauhEd67glDWA7SlDBLCP1tgyMzCCYQC/jg==} + '@objectstack/service-i18n@17.5.0': + resolution: {integrity: sha512-LPYnTATUxL54cj7Je+sb301iEAky0E6/tpjtr0QNY6KOV/5B+CJhfN0TpW+Wg0/8OdbNah7o6F/9zKvKmUkJCQ==} engines: {node: '>=22.0.0'} - '@objectstack/service-job@17.4.0': - resolution: {integrity: sha512-GcCh018YCl5Liv1o1ern2+a90XofyUnKbgr/Vlz1ocBUkC2iyT4CImeq0cit3Ps5wBbmzz60f8mhf7bneOGzEQ==} + '@objectstack/service-job@17.5.0': + resolution: {integrity: sha512-/yqhOXP40FD4PorsEwqqa23AOaTvJYxXBMCSC61ECYDmPfKwUGCUfUxmpaGB/JU6BAl+S4XdKtxaMqBJViaOlA==} engines: {node: '>=22.0.0'} - '@objectstack/service-messaging@17.4.0': - resolution: {integrity: sha512-w3AcEucIJQpNLmON9oRBEysVGWWhoXXe10Xm3Ka62/dqyJUJex9MqWKIT5mt5r1Qh+go/o42n5glv+jGqmw86g==} + '@objectstack/service-messaging@17.5.0': + resolution: {integrity: sha512-UoETY5SpJ/cCYEAakvA+8JTjQwZCHaxgk/TQGJZdu6M5pcT50Re+YUGB3SYuYNPg6SyvM1Hq9QuU60wvDzes4A==} engines: {node: '>=22.0.0'} - '@objectstack/service-package@17.4.0': - resolution: {integrity: sha512-mnAdCl2Sq1ucxOj/CIhjt9mabbyez4bxxnnR8iApduX7B1GDole+MbMiWgPttju07rGyQc9Y1dvc1cl++lYEyg==} + '@objectstack/service-package@17.5.0': + resolution: {integrity: sha512-zX0NukmSNKw1DisVV77RURUfAk9PRizzXRYK5svGJRp8qEXAneqWGlYc+y87Jk1ERNgy5+v2P7QXfDX6arKMtw==} engines: {node: '>=22.0.0'} - '@objectstack/service-queue@17.4.0': - resolution: {integrity: sha512-xHH29M+B08ldA2S2JOvBDAgTnjXCPyYErzyvLLGx1uuBHgOrRrpzUp6qaLzatk6+/j/J/TU/9fvFIGWKgyLRFg==} + '@objectstack/service-queue@17.5.0': + resolution: {integrity: sha512-lp/UNFQQ6bO7ahjKogufnaY4wHmdZRttGswBqm+US1JfY89h6BGSQonhwhyGvbdXzgeZmVPl9ohfVCb1L9xiFw==} engines: {node: '>=22.0.0'} - '@objectstack/service-realtime@17.4.0': - resolution: {integrity: sha512-HGEv0un6zrf8zYMNBCP06Ssq2Iv87zh7X8dJYq92ptLIXDdr9snvW/Mk+5uY4JjUhN+I2g/8V2E84OUrhldoSQ==} + '@objectstack/service-realtime@17.5.0': + resolution: {integrity: sha512-exQim8NNHb5s0GEvQm9d/yoIsu7hubIVOjeEnLqkCf766UGeqmEFYQH7O5w0Bt/KXjfxteq0X7BcHJESxOgC3g==} engines: {node: '>=22.0.0'} - '@objectstack/service-settings@17.4.0': - resolution: {integrity: sha512-wFwwrSTDi7ykDCO8J2wkpwiYwl70edxv8lJwMExqmgYUXcjsBL9RxNNNjisIdU1Doudv5xS1u43lXvcqhjrGWA==} + '@objectstack/service-settings@17.5.0': + resolution: {integrity: sha512-dsbzdvzEfj9PJSjx7GKocWsVDt/biJLZh+6hU6Xz9biznYqo12xfUcBbCBYwo6L10xfA4qql2r3X4wu7vDaU8g==} engines: {node: '>=22.0.0'} - '@objectstack/service-sms@17.4.0': - resolution: {integrity: sha512-us2vkXJIlUo5+5nX8jqvI72V0aAIyQ8KX136Aw4mK8+3c0Bf6IG3JZBpx3IVlc9Q2un44i+m8zmkMKQLxFWFPA==} + '@objectstack/service-sms@17.5.0': + resolution: {integrity: sha512-Nj5Y6JKiccXJAMo55w/v3yx4QNHXQPxVGD2Y3FB50luKjVwEIW2utWBct0oiZeGl9iHjA2yOcuKswgAqptQgUA==} - '@objectstack/service-storage@17.4.0': - resolution: {integrity: sha512-SpOeGAeTP3xf2ObmIsoQWa54UMP7BTB1jL7bSZXUeX2/e/CJR81N6Y/s2gzuJqudy/R7p0unOeQRyAlOSe9bzg==} + '@objectstack/service-storage@17.5.0': + resolution: {integrity: sha512-Fa9XzpOZnnwbYDEPcm7K/Hj62qysipS8OKBEVX1qYy0l9dXxZm/Rsk4YhppnqCLqJJKrTd8bvhleFsPzVdfdUA==} engines: {node: '>=22.0.0'} peerDependencies: '@aws-sdk/client-s3': ^3.0.0 @@ -785,12 +782,12 @@ packages: '@aws-sdk/s3-request-presigner': optional: true - '@objectstack/setup@17.4.0': - resolution: {integrity: sha512-Z0BuKodUTEDOh5yHGwLJMMLBQauYlSb3QueiG+ZJdntBy7nRBXgBZxja5CsUNGe3wo703TAZbtxqeRKqXKycXQ==} + '@objectstack/setup@17.5.0': + resolution: {integrity: sha512-TDPxvq1rub6cf45nR3oPvX7tfu9j/yPFN+nw6ZxUTWlNIAFl/eecvIe/wglLqASgNDV6DMW0hohkD2Bc0TFLag==} engines: {node: '>=22.0.0'} - '@objectstack/spec@17.4.0': - resolution: {integrity: sha512-bOtSFih0Ed67JZMGuLmlHuIv2zPN62W8NL2qENQCYjZB174NMlIIvHC6Jlz2SIy5EwsTnTGBF5EPF6C2/TmqoA==} + '@objectstack/spec@17.5.0': + resolution: {integrity: sha512-G9IPkAnxbgk90wKTqyrIHsPm+kWyYDn2cUfmNnt5xwewdpvRtd5HqaHSjjn5wBCzO0OACerZULNR/f3gPtQu1w==} engines: {node: '>=22.0.0'} peerDependencies: ai: ^7.0.0 @@ -798,23 +795,23 @@ packages: ai: optional: true - '@objectstack/trigger-api@17.4.0': - resolution: {integrity: sha512-dngvTGtV9NiplYHgeaPetPmletyOY8x0laKr7mqKxxvpPSSD3L59DQELYUZQRzcPnBxxUuoUJshAtq35PCvBVg==} + '@objectstack/trigger-api@17.5.0': + resolution: {integrity: sha512-7wKzSVpKRrRmRA+hutIWUngDZIQ9nja01Z2oHJhNAJn92NU/12Sj+BHkBH3DN4p9BxdUln9SUjbtyl5yEbz1lg==} - '@objectstack/trigger-record-change@17.4.0': - resolution: {integrity: sha512-w+MDiNpzPcnT0OJxPVLK4MFPxQP1A1IOK1bEkxoTt/74VqG8EwbzlQ9zxnLUJ8alOAxmMnMhIDgSDTCZQ94KlA==} + '@objectstack/trigger-record-change@17.5.0': + resolution: {integrity: sha512-J+HcE2UB29vAjZWLBXKXpGNdUfJ2E9epTT9GiiQz15m3c5uymj2uTq+AsbgsX2aBgaRtArlKqFgtdD+tniK3nA==} engines: {node: '>=22.0.0'} - '@objectstack/trigger-schedule@17.4.0': - resolution: {integrity: sha512-XdU0cjtCBUryUhgzyK7qY5IV2KPXORdeRgPmaq8g8nfAIXMlGpKCxwuGYMAYdiCsllCEwlhnh3Wuu4V1lHsz7A==} + '@objectstack/trigger-schedule@17.5.0': + resolution: {integrity: sha512-atJ2g7qK3bRTwWFkpT2A97Oqsq3zftFI6kA/VszA6A+zp/IotiZTw0uyydBlzxuhYzJYYeM292TWZd7tKpgLfA==} engines: {node: '>=22.0.0'} - '@objectstack/types@17.4.0': - resolution: {integrity: sha512-z7eCTBlGqAX8ChKifkItGg+woONgAMBbWtu8OmTqI6Fzn8z7JDCm07+K0gg0hivD1uoUUL253s8mshdiqpZnnQ==} + '@objectstack/types@17.5.0': + resolution: {integrity: sha512-QSwGeHxGmDd5SQbZFkHdoct9J6kOh7tijsU6BDE1k+zgTHqOnqUGNQkp6T8KggJTdPz2MHvRDBpmstHT8Rsgng==} engines: {node: '>=22.0.0'} - '@objectstack/verify@17.4.0': - resolution: {integrity: sha512-C+0K/2p4z3QLhFa6VBbH+kK8rU2Mdlm95XL9TdrLu0KTYEmGPj92aF4jQTB2T9+7zQgwJhJ/4JaT9EZl2lUytw==} + '@objectstack/verify@17.5.0': + resolution: {integrity: sha512-mS0WlJE8TRM/dmS2yVryBfE3YLBT1saFPk8Lxtd57N4Ka9P5swYnhlNusmxgQdPlOyHZ9z+JBlIiK9ubf/uusg==} engines: {node: '>=22.0.0'} '@oclif/core@4.14.0': @@ -1188,10 +1185,9 @@ packages: engines: {node: '>=10.0.0'} deprecated: this version has critical issues, please update to the latest version - '@xmldom/xmldom@0.9.11': - resolution: {integrity: sha512-tW8bcK3hsG0/uqSnNz6TK4BkcuZSezoU7DlnYssILmZDktPnSHHuDJJFM0AJv+13gz2r0iGdrj6qqKeUnxXEDg==} + '@xmldom/xmldom@0.9.12': + resolution: {integrity: sha512-5AXjrcMClTryPe9LgZrygpB1lj7s0S9E0+W+AHaVKAVyHanafK86iPSvG5xHVSp/jC+VH1UXu0TAEmY279xH7A==} engines: {node: '>=14.6'} - deprecated: this version has critical issues, please update to the latest version accepts@2.0.0: resolution: {integrity: sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==} @@ -1276,8 +1272,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - better-auth@1.7.2: - resolution: {integrity: sha512-gKapKBEvYIGcMxi74RjQ7EbFLiqyQt58vdoJmL1qAlWSkY1Bc2Vqshl524/3u1NxauiOU03M/Ebh762Brmac9A==} + better-auth@1.7.3: + resolution: {integrity: sha512-8xGp68JQ+l36kniDEgP8bP99TLi1GdEv0NTEUBkyqnYnus/cgFUZseUfqUHKzr2BAsg2O6aD88I9f0U68shanQ==} peerDependencies: '@lynx-js/react': '*' '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -1542,8 +1538,8 @@ packages: resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} engines: {node: '>= 10'} - create-objectstack@17.4.0: - resolution: {integrity: sha512-y88N8mzKTj/zKRTXbSUVUb5VQ3oKJnjI/c6gV8b1vraAOaPNtX1cmLw3/HP0k53HkDHHrb2va4yklSIWsN0ifA==} + create-objectstack@17.5.0: + resolution: {integrity: sha512-Z4RqEHdnuApWbFThfUWkzZYv+hI9B/11cIAReMqyA4peZfNGHCqPrKStS/L9x9/Vd/c56+08WwaBljmFGNqmZQ==} engines: {node: '>=22.0.0'} hasBin: true @@ -1924,6 +1920,10 @@ packages: hast-util-whitespace@3.0.0: resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + hono@4.13.11: + resolution: {integrity: sha512-/SMX/RQNJn7oNmFwH6DtwDqcrzZU2otm1FD6OJe2cWF6cfy/F8hq0XVBv7xW3FTJshRQwuBnXHDq2kNsdZnshg==} + engines: {node: '>=16.9.0'} + hono@4.13.3: resolution: {integrity: sha512-r8AO2mYHoLxSHkgafNeC/BXyb2vWRxD3jem4Ts+ptav8oTG5FIRifAjuJEmZI4bSvvc2ns0GxmIYiZnHqN3mMw==} engines: {node: '>=16.9.0'} @@ -2560,9 +2560,9 @@ packages: node-rsa@1.1.1: resolution: {integrity: sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==} - nodemailer@9.0.5: - resolution: {integrity: sha512-wvjiKvjczmsN7U/8006JOdXubgBk2XFAbioDMbT+sM7cPs0QrhJTa6KBRX7P5REGGkDcLUz/EarWidb8G8C1jQ==} - engines: {node: '>=6.0.0'} + nodemailer@10.0.12: + resolution: {integrity: sha512-PQ46oNbNMuH/Sno7B5IWIU9etytwrO0xdTFvWXpIQFRXhBAXtzD48243AS+BCbQQTPD8y3fqUrgLn0tSo77gvg==} + engines: {node: '>=20.0.0'} normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} @@ -3257,11 +3257,6 @@ packages: resolution: {integrity: sha512-FxF6+rkr1rNSQrhUNYrAFJpRXNzlDoMxeXN5qI84939ylEv3qqPFKa85Oxr6tDaJKqwW6KKyo2v26TSv3k6LeA==} engines: {node: '>=0.6.0'} - yaml@2.9.0: - resolution: {integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==} - engines: {node: '>= 14.6'} - hasBin: true - yaml@2.9.1: resolution: {integrity: sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==} engines: {node: '>= 14.6'} @@ -3276,8 +3271,8 @@ packages: peerDependencies: zod: ^3.25.28 || ^4 - zod@4.4.3: - resolution: {integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==} + zod@4.6.5: + resolution: {integrity: sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==} zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} @@ -3305,116 +3300,116 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2)': + '@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2)': dependencies: '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 '@opentelemetry/semantic-conventions': 1.43.0 '@standard-schema/spec': 1.1.0 - better-call: 1.4.0(zod@4.4.3) + better-call: 1.4.0(zod@4.6.5) jose: 6.2.9 kysely: 0.29.4 nanostores: 1.4.2 - zod: 4.4.3 + zod: 4.6.5 - '@better-auth/drizzle-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)': + '@better-auth/drizzle-adapter@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 - '@better-auth/kysely-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(kysely@0.29.4)': + '@better-auth/kysely-adapter@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(kysely@0.29.4)': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 optionalDependencies: kysely: 0.29.4 - '@better-auth/memory-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)': + '@better-auth/memory-adapter@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 - '@better-auth/mongo-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(mongodb@7.5.0)': + '@better-auth/mongo-adapter@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(mongodb@7.5.0)': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 optionalDependencies: mongodb: 7.5.0 - '@better-auth/oauth-provider@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))': + '@better-auth/oauth-provider@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.3(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.6.5))': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 - better-auth: 1.7.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) - better-call: 1.4.0(zod@4.4.3) + better-auth: 1.7.3(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) + better-call: 1.4.0(zod@4.6.5) jose: 6.2.9 - zod: 4.4.3 + zod: 4.6.5 - '@better-auth/oauth-provider@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.2(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))': + '@better-auth/oauth-provider@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.3(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.6.5))': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 - better-auth: 1.7.2(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10) - better-call: 1.4.0(zod@4.4.3) + better-auth: 1.7.3(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10) + better-call: 1.4.0(zod@4.6.5) jose: 6.2.9 - zod: 4.4.3 + zod: 4.6.5 - '@better-auth/prisma-adapter@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)': + '@better-auth/prisma-adapter@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 - '@better-auth/scim@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(better-auth@1.7.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))': + '@better-auth/scim@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(better-auth@1.7.3(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.6.5))': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 '@noble/hashes': 2.3.0 - better-auth: 1.7.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) - better-call: 1.4.0(zod@4.4.3) - zod: 4.4.3 + better-auth: 1.7.3(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) + better-call: 1.4.0(zod@4.6.5) + zod: 4.6.5 - '@better-auth/scim@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(better-auth@1.7.2(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))': + '@better-auth/scim@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(better-auth@1.7.3(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.6.5))': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 '@noble/hashes': 2.3.0 - better-auth: 1.7.2(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10) - better-call: 1.4.0(zod@4.4.3) - zod: 4.4.3 + better-auth: 1.7.3(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10) + better-call: 1.4.0(zod@4.6.5) + zod: 4.6.5 - '@better-auth/sso@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))': + '@better-auth/sso@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.3(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.6.5))': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 - '@xmldom/xmldom': 0.9.11 - better-auth: 1.7.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) - better-call: 1.4.0(zod@4.4.3) + '@xmldom/xmldom': 0.9.12 + better-auth: 1.7.3(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) + better-call: 1.4.0(zod@4.6.5) fast-xml-parser: 5.10.1 jose: 6.2.9 samlify: 2.13.1 tldts: 7.4.10 - zod: 4.4.3 + zod: 4.6.5 - '@better-auth/sso@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.2(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3))': + '@better-auth/sso@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.3(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.6.5))': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 - '@xmldom/xmldom': 0.9.11 - better-auth: 1.7.2(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10) - better-call: 1.4.0(zod@4.4.3) + '@xmldom/xmldom': 0.9.12 + better-auth: 1.7.3(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10) + better-call: 1.4.0(zod@4.6.5) fast-xml-parser: 5.10.1 jose: 6.2.9 samlify: 2.13.1 tldts: 7.4.10 - zod: 4.4.3 + zod: 4.6.5 - '@better-auth/telemetry@1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)': + '@better-auth/telemetry@1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 @@ -3657,6 +3652,10 @@ snapshots: lodash.isundefined: 3.0.1 lodash.uniq: 4.5.0 + '@hono/node-server@2.1.1(hono@4.13.11)': + dependencies: + hono: 4.13.11 + '@hono/node-server@2.1.1(hono@4.13.3)': dependencies: hono: 4.13.3 @@ -3710,7 +3709,7 @@ snapshots: '@marcbachmann/cel-js@8.0.0': {} - '@modelcontextprotocol/sdk@1.30.0(zod@4.4.3)': + '@modelcontextprotocol/sdk@1.30.0(zod@4.6.5)': dependencies: '@hono/node-server': 2.1.1(hono@4.13.3) ajv: 8.20.0 @@ -3727,8 +3726,8 @@ snapshots: json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 - zod: 4.4.3 - zod-to-json-schema: 3.25.2(zod@4.4.3) + zod: 4.6.5 + zod-to-json-schema: 3.25.2(zod@4.6.5) transitivePeerDependencies: - supports-color @@ -3749,76 +3748,75 @@ snapshots: '@nodable/entities@3.0.0': {} - '@objectstack/account@17.4.0(vitest@4.1.10)': + '@objectstack/account@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - ai - vitest - '@objectstack/cli@17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': - dependencies: - '@objectstack/account': 17.4.0(vitest@4.1.10) - '@objectstack/client': 17.4.0 - '@objectstack/cloud-connection': 17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/console': 17.4.0 - '@objectstack/core': 17.4.0 - '@objectstack/driver-memory': 17.4.0 - '@objectstack/driver-mongodb': 17.4.0 - '@objectstack/driver-sql': 17.4.0 - '@objectstack/driver-sqlite-wasm': 17.4.0(better-sqlite3@13.0.3) - '@objectstack/formula': 17.4.0 - '@objectstack/lint': 17.4.0 - '@objectstack/mcp': 17.4.0 - '@objectstack/metadata': 17.4.0(vitest@4.1.10) - '@objectstack/metadata-core': 17.4.0(vitest@4.1.10) - '@objectstack/metadata-protocol': 17.4.0(vitest@4.1.10) - '@objectstack/objectql': 17.4.0(vitest@4.1.10) - '@objectstack/observability': 17.4.0 - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/plugin-approvals': 17.4.0(vitest@4.1.10) - '@objectstack/plugin-audit': 17.4.0(vitest@4.1.10) - '@objectstack/plugin-auth': 17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/plugin-email': 17.4.0(vitest@4.1.10) - '@objectstack/plugin-hono-server': 17.4.0 - '@objectstack/plugin-pinyin-search': 17.4.0(vitest@4.1.10) - '@objectstack/plugin-reports': 17.4.0(vitest@4.1.10) - '@objectstack/plugin-security': 17.4.0(vitest@4.1.10) - '@objectstack/plugin-sharing': 17.4.0(vitest@4.1.10) - '@objectstack/plugin-webhooks': 17.4.0(vitest@4.1.10) - '@objectstack/rest': 17.4.0(vitest@4.1.10) - '@objectstack/runtime': 17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/service-analytics': 17.4.0 - '@objectstack/service-automation': 17.4.0(vitest@4.1.10) - '@objectstack/service-cache': 17.4.0 - '@objectstack/service-datasource': 17.4.0(@objectstack/driver-mongodb@17.4.0)(@objectstack/driver-sqlite-wasm@17.4.0(better-sqlite3@12.11.1)) - '@objectstack/service-job': 17.4.0(vitest@4.1.10) - '@objectstack/service-messaging': 17.4.0(vitest@4.1.10) - '@objectstack/service-package': 17.4.0(vitest@4.1.10) - '@objectstack/service-queue': 17.4.0(vitest@4.1.10) - '@objectstack/service-realtime': 17.4.0(vitest@4.1.10) - '@objectstack/service-settings': 17.4.0(vitest@4.1.10) - '@objectstack/service-sms': 17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/service-storage': 17.4.0(vitest@4.1.10) - '@objectstack/setup': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - '@objectstack/trigger-api': 17.4.0 - '@objectstack/trigger-record-change': 17.4.0 - '@objectstack/trigger-schedule': 17.4.0 - '@objectstack/types': 17.4.0 - '@objectstack/verify': 17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@objectstack/driver-mongodb@17.4.0)(@objectstack/driver-sqlite-wasm@17.4.0(better-sqlite3@12.11.1))(better-call@1.4.0(zod@4.4.3))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/cli@17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + dependencies: + '@objectstack/account': 17.5.0(vitest@4.1.10) + '@objectstack/client': 17.5.0 + '@objectstack/cloud-connection': 17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/console': 17.5.0 + '@objectstack/core': 17.5.0 + '@objectstack/driver-memory': 17.5.0 + '@objectstack/driver-mongodb': 17.5.0 + '@objectstack/driver-sql': 17.5.0 + '@objectstack/driver-sqlite-wasm': 17.5.0(better-sqlite3@13.0.3) + '@objectstack/formula': 17.5.0 + '@objectstack/lint': 17.5.0 + '@objectstack/mcp': 17.5.0 + '@objectstack/metadata': 17.5.0(vitest@4.1.10) + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) + '@objectstack/metadata-protocol': 17.5.0(vitest@4.1.10) + '@objectstack/objectql': 17.5.0(vitest@4.1.10) + '@objectstack/observability': 17.5.0 + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/plugin-approvals': 17.5.0(vitest@4.1.10) + '@objectstack/plugin-audit': 17.5.0(vitest@4.1.10) + '@objectstack/plugin-auth': 17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/plugin-email': 17.5.0(vitest@4.1.10) + '@objectstack/plugin-hono-server': 17.5.0 + '@objectstack/plugin-pinyin-search': 17.5.0(vitest@4.1.10) + '@objectstack/plugin-security': 17.5.0(vitest@4.1.10) + '@objectstack/plugin-sharing': 17.5.0(vitest@4.1.10) + '@objectstack/plugin-webhooks': 17.5.0(vitest@4.1.10) + '@objectstack/rest': 17.5.0(vitest@4.1.10) + '@objectstack/runtime': 17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/service-analytics': 17.5.0 + '@objectstack/service-automation': 17.5.0(vitest@4.1.10) + '@objectstack/service-cache': 17.5.0 + '@objectstack/service-datasource': 17.5.0(@objectstack/driver-mongodb@17.5.0)(@objectstack/driver-sqlite-wasm@17.5.0(better-sqlite3@12.11.1)) + '@objectstack/service-job': 17.5.0(vitest@4.1.10) + '@objectstack/service-messaging': 17.5.0(vitest@4.1.10) + '@objectstack/service-package': 17.5.0(vitest@4.1.10) + '@objectstack/service-queue': 17.5.0(vitest@4.1.10) + '@objectstack/service-realtime': 17.5.0(vitest@4.1.10) + '@objectstack/service-settings': 17.5.0(vitest@4.1.10) + '@objectstack/service-sms': 17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/service-storage': 17.5.0(vitest@4.1.10) + '@objectstack/setup': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/trigger-api': 17.5.0 + '@objectstack/trigger-record-change': 17.5.0 + '@objectstack/trigger-schedule': 17.5.0(vitest@4.1.10) + '@objectstack/types': 17.5.0 + '@objectstack/verify': 17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@objectstack/driver-mongodb@17.5.0)(@objectstack/driver-sqlite-wasm@17.5.0(better-sqlite3@12.11.1))(better-call@1.4.0(zod@4.6.5))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) '@oclif/core': 4.14.0 bundle-require: 5.1.0(esbuild@0.28.2) chalk: 6.0.0 chokidar: 5.0.0 - create-objectstack: 17.4.0 + create-objectstack: 17.5.0 dotenv-flow: 4.1.0 esbuild: 0.28.2 ts-morph: 28.0.0 tsx: 4.23.12 - yaml: 2.9.0 - zod: 4.4.3 + yaml: 2.9.1 + zod: 4.6.5 optionalDependencies: better-sqlite3: 13.0.3 transitivePeerDependencies: @@ -3866,19 +3864,19 @@ snapshots: - vitest - vue - '@objectstack/client@17.4.0': + '@objectstack/client@17.5.0': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/spec': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - ai - '@objectstack/cloud-connection@17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + '@objectstack/cloud-connection@17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/runtime': 17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/runtime': 17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@better-auth/utils' @@ -3923,30 +3921,30 @@ snapshots: - vitest - vue - '@objectstack/console@17.4.0': {} + '@objectstack/console@17.5.0': {} - '@objectstack/core@17.4.0': + '@objectstack/core@17.5.0': dependencies: - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 - zod: 4.4.3 + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 + zod: 4.6.5 transitivePeerDependencies: - ai - '@objectstack/driver-memory@17.4.0': + '@objectstack/driver-memory@17.5.0': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 mingo: 7.2.4 transitivePeerDependencies: - ai - '@objectstack/driver-mongodb@17.4.0': + '@objectstack/driver-mongodb@17.5.0': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 mongodb: 7.5.0 nanoid: 6.0.1 transitivePeerDependencies: @@ -3959,12 +3957,12 @@ snapshots: - snappy - socks - '@objectstack/driver-sql@17.4.0': + '@objectstack/driver-sql@17.5.0': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/observability': 17.4.0 - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/observability': 17.5.0 + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 knex: 3.3.0(better-sqlite3@13.0.3) nanoid: 6.0.1 optionalDependencies: @@ -3978,11 +3976,11 @@ snapshots: - sqlite3 - supports-color - '@objectstack/driver-sqlite-wasm@17.4.0(better-sqlite3@12.11.1)': + '@objectstack/driver-sqlite-wasm@17.5.0(better-sqlite3@12.11.1)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/driver-sql': 17.4.0 - '@objectstack/spec': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/driver-sql': 17.5.0 + '@objectstack/spec': 17.5.0 knex: 3.3.0(better-sqlite3@12.11.1) nanoid: 6.0.1 sql.js: 1.14.1 @@ -3999,11 +3997,11 @@ snapshots: - supports-color - tedious - '@objectstack/driver-sqlite-wasm@17.4.0(better-sqlite3@13.0.3)': + '@objectstack/driver-sqlite-wasm@17.5.0(better-sqlite3@13.0.3)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/driver-sql': 17.4.0 - '@objectstack/spec': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/driver-sql': 17.5.0 + '@objectstack/spec': 17.5.0 knex: 3.3.0(better-sqlite3@13.0.3) nanoid: 6.0.1 sql.js: 1.14.1 @@ -4020,18 +4018,18 @@ snapshots: - supports-color - tedious - '@objectstack/formula@17.4.0': + '@objectstack/formula@17.5.0': dependencies: '@marcbachmann/cel-js': 8.0.0 - '@objectstack/spec': 17.4.0 + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - ai - '@objectstack/lint@17.4.0': + '@objectstack/lint@17.5.0': dependencies: - '@objectstack/formula': 17.4.0 - '@objectstack/sdui-parser': 17.4.0 - '@objectstack/spec': 17.4.0 + '@objectstack/formula': 17.5.0 + '@objectstack/sdui-parser': 17.5.0 + '@objectstack/spec': 17.5.0 ajv: 8.20.0 ajv-formats: 3.0.1 sucrase: 3.35.1 @@ -4039,133 +4037,133 @@ snapshots: transitivePeerDependencies: - ai - '@objectstack/mcp@17.4.0': + '@objectstack/mcp@17.5.0': dependencies: - '@modelcontextprotocol/sdk': 1.30.0(zod@4.4.3) - '@objectstack/core': 17.4.0 - '@objectstack/formula': 17.4.0 - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 - zod: 4.4.3 + '@modelcontextprotocol/sdk': 1.30.0(zod@4.6.5) + '@objectstack/core': 17.5.0 + '@objectstack/formula': 17.5.0 + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 + zod: 4.6.5 transitivePeerDependencies: - '@cfworker/json-schema' - ai - supports-color - '@objectstack/metadata-core@17.4.0(vitest@4.1.10)': + '@objectstack/metadata-core@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/spec': 17.4.0 - zod: 4.4.3 + '@objectstack/spec': 17.5.0 + zod: 4.6.5 optionalDependencies: vitest: 4.1.10(@vitest/coverage-v8@4.1.10)(esbuild@0.28.2)(tsx@4.23.12)(yaml@2.9.1) transitivePeerDependencies: - ai - '@objectstack/metadata-fs@17.4.0(vitest@4.1.10)': + '@objectstack/metadata-fs@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/metadata-core': 17.4.0(vitest@4.1.10) + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) chokidar: 5.0.0 transitivePeerDependencies: - ai - vitest - '@objectstack/metadata-protocol@17.4.0(vitest@4.1.10)': + '@objectstack/metadata-protocol@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/formula': 17.4.0 - '@objectstack/lint': 17.4.0 - '@objectstack/metadata': 17.4.0(vitest@4.1.10) - '@objectstack/metadata-core': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 - zod: 4.4.3 + '@objectstack/core': 17.5.0 + '@objectstack/formula': 17.5.0 + '@objectstack/lint': 17.5.0 + '@objectstack/metadata': 17.5.0(vitest@4.1.10) + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 + zod: 4.6.5 transitivePeerDependencies: - ai - vitest - '@objectstack/metadata@17.4.0(vitest@4.1.10)': + '@objectstack/metadata@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/metadata-core': 17.4.0(vitest@4.1.10) - '@objectstack/metadata-fs': 17.4.0(vitest@4.1.10) - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) + '@objectstack/metadata-fs': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 chokidar: 5.0.0 glob: 13.0.6 js-yaml: 5.3.0 - zod: 4.4.3 + zod: 4.6.5 transitivePeerDependencies: - ai - vitest - '@objectstack/objectql@17.4.0(vitest@4.1.10)': + '@objectstack/objectql@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/formula': 17.4.0 - '@objectstack/metadata': 17.4.0(vitest@4.1.10) - '@objectstack/metadata-core': 17.4.0(vitest@4.1.10) - '@objectstack/metadata-protocol': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/formula': 17.5.0 + '@objectstack/metadata': 17.5.0(vitest@4.1.10) + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) + '@objectstack/metadata-protocol': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 ajv: 8.20.0 ajv-formats: 3.0.1 - zod: 4.4.3 + zod: 4.6.5 transitivePeerDependencies: - ai - vitest - '@objectstack/observability@17.4.0': + '@objectstack/observability@17.5.0': dependencies: - '@objectstack/spec': 17.4.0 + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - ai - '@objectstack/platform-objects@17.4.0(vitest@4.1.10)': + '@objectstack/platform-objects@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/metadata-core': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-approvals@17.4.0(vitest@4.1.10)': + '@objectstack/plugin-approvals@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/formula': 17.4.0 - '@objectstack/metadata-core': 17.4.0(vitest@4.1.10) - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/formula': 17.5.0 + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-audit@17.4.0(vitest@4.1.10)': + '@objectstack/plugin-audit@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/metadata-core': 17.4.0(vitest@4.1.10) - '@objectstack/objectql': 17.4.0(vitest@4.1.10) - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) + '@objectstack/objectql': 17.5.0(vitest@4.1.10) + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-auth@17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(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.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(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.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) - '@better-auth/oauth-provider': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) - '@better-auth/scim': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(better-auth@1.7.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) - '@better-auth/sso': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/oauth-provider': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.3(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.6.5)) + '@better-auth/scim': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(better-auth@1.7.3(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.6.5)) + '@better-auth/sso': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.3(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.6.5)) '@noble/hashes': 2.3.0 - '@objectstack/core': 17.4.0 - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/rest': 17.4.0(vitest@4.1.10) - '@objectstack/service-messaging': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 - better-auth: 1.7.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) + '@objectstack/core': 17.5.0 + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/rest': 17.5.0(vitest@4.1.10) + '@objectstack/service-messaging': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 + better-auth: 1.7.3(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) jose: 6.2.9 transitivePeerDependencies: - '@better-auth/utils' @@ -4196,20 +4194,20 @@ snapshots: - vitest - vue - '@objectstack/plugin-auth@17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + '@objectstack/plugin-auth@17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) - '@better-auth/oauth-provider': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.2(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) - '@better-auth/scim': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(better-auth@1.7.2(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) - '@better-auth/sso': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.2(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.4.3)) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/oauth-provider': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.3(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.6.5)) + '@better-auth/scim': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(better-auth@1.7.3(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.6.5)) + '@better-auth/sso': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.3(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.4.0(zod@4.6.5)) '@noble/hashes': 2.3.0 - '@objectstack/core': 17.4.0 - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/rest': 17.4.0(vitest@4.1.10) - '@objectstack/service-messaging': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 - better-auth: 1.7.2(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10) + '@objectstack/core': 17.5.0 + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/rest': 17.5.0(vitest@4.1.10) + '@objectstack/service-messaging': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 + better-auth: 1.7.3(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10) jose: 6.2.9 transitivePeerDependencies: - '@better-auth/utils' @@ -4240,122 +4238,112 @@ snapshots: - vitest - vue - '@objectstack/plugin-email@17.4.0(vitest@4.1.10)': + '@objectstack/plugin-email@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/formula': 17.4.0 - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - nodemailer: 9.0.5 + '@objectstack/core': 17.5.0 + '@objectstack/formula': 17.5.0 + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + nodemailer: 10.0.12 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-hono-server@17.4.0': + '@objectstack/plugin-hono-server@17.5.0': dependencies: - '@hono/node-server': 2.1.1(hono@4.13.3) - '@objectstack/core': 17.4.0 - '@objectstack/observability': 17.4.0 - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 - hono: 4.13.3 + '@hono/node-server': 2.1.1(hono@4.13.11) + '@objectstack/core': 17.5.0 + '@objectstack/observability': 17.5.0 + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 + hono: 4.13.11 transitivePeerDependencies: - ai - '@objectstack/plugin-pinyin-search@17.4.0(vitest@4.1.10)': + '@objectstack/plugin-pinyin-search@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/objectql': 17.4.0(vitest@4.1.10) - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/objectql': 17.5.0(vitest@4.1.10) + '@objectstack/types': 17.5.0 pinyin-pro: 3.29.3 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-reports@17.4.0(vitest@4.1.10)': + '@objectstack/plugin-security@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - croner: 10.0.1 + '@objectstack/core': 17.5.0 + '@objectstack/formula': 17.5.0 + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-security@17.4.0(vitest@4.1.10)': + '@objectstack/plugin-sharing@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/formula': 17.4.0 - '@objectstack/metadata-core': 17.4.0(vitest@4.1.10) - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/formula': 17.5.0 + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) + '@objectstack/objectql': 17.5.0(vitest@4.1.10) + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-sharing@17.4.0(vitest@4.1.10)': + '@objectstack/plugin-webhooks@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/formula': 17.4.0 - '@objectstack/metadata-core': 17.4.0(vitest@4.1.10) - '@objectstack/objectql': 17.4.0(vitest@4.1.10) - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/service-messaging': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-webhooks@17.4.0(vitest@4.1.10)': + '@objectstack/rest@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/service-messaging': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - transitivePeerDependencies: - - ai - - vitest - - '@objectstack/rest@17.4.0(vitest@4.1.10)': - dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/metadata-core': 17.4.0(vitest@4.1.10) - '@objectstack/observability': 17.4.0 - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/service-package': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) + '@objectstack/observability': 17.5.0 + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/service-package': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 exceljs: 4.4.0 - zod: 4.4.3 + zod: 4.6.5 transitivePeerDependencies: - ai - vitest - '@objectstack/runtime@17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(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.4.0 - '@objectstack/driver-memory': 17.4.0 - '@objectstack/driver-sql': 17.4.0 - '@objectstack/driver-sqlite-wasm': 17.4.0(better-sqlite3@12.11.1) - '@objectstack/formula': 17.4.0 - '@objectstack/metadata': 17.4.0(vitest@4.1.10) - '@objectstack/metadata-core': 17.4.0(vitest@4.1.10) - '@objectstack/metadata-protocol': 17.4.0(vitest@4.1.10) - '@objectstack/objectql': 17.4.0(vitest@4.1.10) - '@objectstack/observability': 17.4.0 - '@objectstack/plugin-auth': 17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(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.4.0(vitest@4.1.10) - '@objectstack/rest': 17.4.0(vitest@4.1.10) - '@objectstack/service-cluster': 17.4.0 - '@objectstack/service-datasource': 17.4.0(@objectstack/driver-mongodb@17.4.0)(@objectstack/driver-sqlite-wasm@17.4.0(better-sqlite3@12.11.1)) - '@objectstack/service-i18n': 17.4.0 - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/runtime@17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(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.5.0 + '@objectstack/driver-memory': 17.5.0 + '@objectstack/driver-sql': 17.5.0 + '@objectstack/driver-sqlite-wasm': 17.5.0(better-sqlite3@12.11.1) + '@objectstack/formula': 17.5.0 + '@objectstack/metadata': 17.5.0(vitest@4.1.10) + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) + '@objectstack/metadata-protocol': 17.5.0(vitest@4.1.10) + '@objectstack/objectql': 17.5.0(vitest@4.1.10) + '@objectstack/observability': 17.5.0 + '@objectstack/plugin-auth': 17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(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.5.0(vitest@4.1.10) + '@objectstack/rest': 17.5.0(vitest@4.1.10) + '@objectstack/service-cluster': 17.5.0 + '@objectstack/service-datasource': 17.5.0(@objectstack/driver-mongodb@17.5.0)(@objectstack/driver-sqlite-wasm@17.5.0(better-sqlite3@12.11.1)) + '@objectstack/service-i18n': 17.5.0 + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 quickjs-emscripten: 0.32.0 - zod: 4.4.3 + zod: 4.6.5 optionalDependencies: - '@objectstack/driver-mongodb': 17.4.0 + '@objectstack/driver-mongodb': 17.5.0 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@better-auth/utils' @@ -4399,30 +4387,30 @@ snapshots: - vitest - vue - '@objectstack/runtime@17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': - dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/driver-memory': 17.4.0 - '@objectstack/driver-sql': 17.4.0 - '@objectstack/driver-sqlite-wasm': 17.4.0(better-sqlite3@13.0.3) - '@objectstack/formula': 17.4.0 - '@objectstack/metadata': 17.4.0(vitest@4.1.10) - '@objectstack/metadata-core': 17.4.0(vitest@4.1.10) - '@objectstack/metadata-protocol': 17.4.0(vitest@4.1.10) - '@objectstack/objectql': 17.4.0(vitest@4.1.10) - '@objectstack/observability': 17.4.0 - '@objectstack/plugin-auth': 17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/plugin-security': 17.4.0(vitest@4.1.10) - '@objectstack/rest': 17.4.0(vitest@4.1.10) - '@objectstack/service-cluster': 17.4.0 - '@objectstack/service-datasource': 17.4.0(@objectstack/driver-mongodb@17.4.0)(@objectstack/driver-sqlite-wasm@17.4.0(better-sqlite3@12.11.1)) - '@objectstack/service-i18n': 17.4.0 - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/runtime@17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + dependencies: + '@objectstack/core': 17.5.0 + '@objectstack/driver-memory': 17.5.0 + '@objectstack/driver-sql': 17.5.0 + '@objectstack/driver-sqlite-wasm': 17.5.0(better-sqlite3@13.0.3) + '@objectstack/formula': 17.5.0 + '@objectstack/metadata': 17.5.0(vitest@4.1.10) + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) + '@objectstack/metadata-protocol': 17.5.0(vitest@4.1.10) + '@objectstack/objectql': 17.5.0(vitest@4.1.10) + '@objectstack/observability': 17.5.0 + '@objectstack/plugin-auth': 17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/plugin-security': 17.5.0(vitest@4.1.10) + '@objectstack/rest': 17.5.0(vitest@4.1.10) + '@objectstack/service-cluster': 17.5.0 + '@objectstack/service-datasource': 17.5.0(@objectstack/driver-mongodb@17.5.0)(@objectstack/driver-sqlite-wasm@17.5.0(better-sqlite3@12.11.1)) + '@objectstack/service-i18n': 17.5.0 + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 quickjs-emscripten: 0.32.0 - zod: 4.4.3 + zod: 4.6.5 optionalDependencies: - '@objectstack/driver-mongodb': 17.4.0 + '@objectstack/driver-mongodb': 17.5.0 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@better-auth/utils' @@ -4466,53 +4454,54 @@ snapshots: - vitest - vue - '@objectstack/sdui-parser@17.4.0': {} + '@objectstack/sdui-parser@17.5.0': {} - '@objectstack/service-analytics@17.4.0': + '@objectstack/service-analytics@17.5.0': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 transitivePeerDependencies: - ai - '@objectstack/service-automation@17.4.0(vitest@4.1.10)': + '@objectstack/service-automation@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/formula': 17.4.0 - '@objectstack/metadata-core': 17.4.0(vitest@4.1.10) - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/formula': 17.5.0 + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 transitivePeerDependencies: - ai - vitest - '@objectstack/service-cache@17.4.0': + '@objectstack/service-cache@17.5.0': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/observability': 17.4.0 - '@objectstack/spec': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/observability': 17.5.0 + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - ai - '@objectstack/service-cluster@17.4.0': + '@objectstack/service-cluster@17.5.0': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/spec': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - ai - '@objectstack/service-datasource@17.4.0(@objectstack/driver-mongodb@17.4.0)(@objectstack/driver-sqlite-wasm@17.4.0(better-sqlite3@12.11.1))': + '@objectstack/service-datasource@17.5.0(@objectstack/driver-mongodb@17.5.0)(@objectstack/driver-sqlite-wasm@17.5.0(better-sqlite3@12.11.1))': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/driver-memory': 17.4.0 - '@objectstack/driver-sql': 17.4.0 - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/driver-memory': 17.5.0 + '@objectstack/driver-sql': 17.5.0 + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 pg-connection-string: 2.14.0 optionalDependencies: - '@objectstack/driver-mongodb': 17.4.0 - '@objectstack/driver-sqlite-wasm': 17.4.0(better-sqlite3@12.11.1) + '@objectstack/driver-mongodb': 17.5.0 + '@objectstack/driver-sqlite-wasm': 17.5.0(better-sqlite3@12.11.1) transitivePeerDependencies: - ai - mariadb @@ -4525,77 +4514,77 @@ snapshots: - supports-color - tedious - '@objectstack/service-i18n@17.4.0': + '@objectstack/service-i18n@17.5.0': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 transitivePeerDependencies: - ai - '@objectstack/service-job@17.4.0(vitest@4.1.10)': + '@objectstack/service-job@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 croner: 10.0.1 transitivePeerDependencies: - ai - vitest - '@objectstack/service-messaging@17.4.0(vitest@4.1.10)': + '@objectstack/service-messaging@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 transitivePeerDependencies: - ai - vitest - '@objectstack/service-package@17.4.0(vitest@4.1.10)': + '@objectstack/service-package@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/metadata-core': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - ai - vitest - '@objectstack/service-queue@17.4.0(vitest@4.1.10)': + '@objectstack/service-queue@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - ai - vitest - '@objectstack/service-realtime@17.4.0(vitest@4.1.10)': + '@objectstack/service-realtime@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - ai - vitest - '@objectstack/service-settings@17.4.0(vitest@4.1.10)': + '@objectstack/service-settings@17.5.0(vitest@4.1.10)': dependencies: '@noble/ciphers': 2.3.0 - '@objectstack/core': 17.4.0 - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 transitivePeerDependencies: - ai - vitest - '@objectstack/service-sms@17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + '@objectstack/service-sms@17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/plugin-auth': 17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/spec': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/plugin-auth': 17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - '@better-auth/utils' - '@better-fetch/fetch' @@ -4625,75 +4614,78 @@ snapshots: - vitest - vue - '@objectstack/service-storage@17.4.0(vitest@4.1.10)': + '@objectstack/service-storage@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/observability': 17.4.0 - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/observability': 17.5.0 + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 transitivePeerDependencies: - ai - vitest - '@objectstack/setup@17.4.0(vitest@4.1.10)': + '@objectstack/setup@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - ai - vitest - '@objectstack/spec@17.4.0': + '@objectstack/spec@17.5.0': dependencies: pg-connection-string: 2.14.0 - zod: 4.4.3 + zod: 4.6.5 - '@objectstack/trigger-api@17.4.0': + '@objectstack/trigger-api@17.5.0': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/spec': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - ai - '@objectstack/trigger-record-change@17.4.0': + '@objectstack/trigger-record-change@17.5.0': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/spec': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - ai - '@objectstack/trigger-schedule@17.4.0': + '@objectstack/trigger-schedule@17.5.0(vitest@4.1.10)': dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/spec': 17.4.0 + '@objectstack/core': 17.5.0 + '@objectstack/metadata-core': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 croner: 10.0.1 transitivePeerDependencies: - ai + - vitest - '@objectstack/types@17.4.0': + '@objectstack/types@17.5.0': dependencies: - '@objectstack/spec': 17.4.0 + '@objectstack/spec': 17.5.0 transitivePeerDependencies: - ai - '@objectstack/verify@17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@objectstack/driver-mongodb@17.4.0)(@objectstack/driver-sqlite-wasm@17.4.0(better-sqlite3@12.11.1))(better-call@1.4.0(zod@4.4.3))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': - dependencies: - '@objectstack/core': 17.4.0 - '@objectstack/objectql': 17.4.0(vitest@4.1.10) - '@objectstack/platform-objects': 17.4.0(vitest@4.1.10) - '@objectstack/plugin-auth': 17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/plugin-hono-server': 17.4.0 - '@objectstack/plugin-security': 17.4.0(vitest@4.1.10) - '@objectstack/plugin-sharing': 17.4.0(vitest@4.1.10) - '@objectstack/rest': 17.4.0(vitest@4.1.10) - '@objectstack/runtime': 17.4.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) - '@objectstack/service-analytics': 17.4.0 - '@objectstack/service-automation': 17.4.0(vitest@4.1.10) - '@objectstack/service-datasource': 17.4.0(@objectstack/driver-mongodb@17.4.0)(@objectstack/driver-sqlite-wasm@17.4.0(better-sqlite3@12.11.1)) - '@objectstack/service-settings': 17.4.0(vitest@4.1.10) - '@objectstack/spec': 17.4.0 - '@objectstack/types': 17.4.0 + '@objectstack/verify@17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(@objectstack/driver-mongodb@17.5.0)(@objectstack/driver-sqlite-wasm@17.5.0(better-sqlite3@12.11.1))(better-call@1.4.0(zod@4.6.5))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + dependencies: + '@objectstack/core': 17.5.0 + '@objectstack/objectql': 17.5.0(vitest@4.1.10) + '@objectstack/platform-objects': 17.5.0(vitest@4.1.10) + '@objectstack/plugin-auth': 17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/plugin-hono-server': 17.5.0 + '@objectstack/plugin-security': 17.5.0(vitest@4.1.10) + '@objectstack/plugin-sharing': 17.5.0(vitest@4.1.10) + '@objectstack/rest': 17.5.0(vitest@4.1.10) + '@objectstack/runtime': 17.5.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(better-sqlite3@13.0.3)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/service-analytics': 17.5.0 + '@objectstack/service-automation': 17.5.0(vitest@4.1.10) + '@objectstack/service-datasource': 17.5.0(@objectstack/driver-mongodb@17.5.0)(@objectstack/driver-sqlite-wasm@17.5.0(better-sqlite3@12.11.1)) + '@objectstack/service-settings': 17.5.0(vitest@4.1.10) + '@objectstack/spec': 17.5.0 + '@objectstack/types': 17.5.0 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@better-auth/utils' @@ -5037,7 +5029,7 @@ snapshots: '@xmldom/xmldom@0.8.13': {} - '@xmldom/xmldom@0.9.11': {} + '@xmldom/xmldom@0.9.12': {} accepts@2.0.0: dependencies: @@ -5137,25 +5129,25 @@ snapshots: base64-js@1.5.1: {} - better-auth@1.7.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10): + better-auth@1.7.3(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10): dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) - '@better-auth/drizzle-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) - '@better-auth/kysely-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(kysely@0.29.4) - '@better-auth/memory-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) - '@better-auth/mongo-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(mongodb@7.5.0) - '@better-auth/prisma-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) - '@better-auth/telemetry': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/drizzle-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) + '@better-auth/kysely-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(kysely@0.29.4) + '@better-auth/memory-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) + '@better-auth/mongo-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(mongodb@7.5.0) + '@better-auth/prisma-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) + '@better-auth/telemetry': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 '@noble/ciphers': 2.3.0 '@noble/hashes': 2.3.0 - better-call: 1.4.0(zod@4.4.3) + better-call: 1.4.0(zod@4.6.5) defu: 6.1.7 jose: 6.2.9 kysely: 0.29.4 nanostores: 1.4.2 - zod: 4.4.3 + zod: 4.6.5 optionalDependencies: better-sqlite3: 12.11.1 mongodb: 7.5.0 @@ -5164,25 +5156,25 @@ snapshots: - '@cloudflare/workers-types' - '@opentelemetry/api' - better-auth@1.7.2(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10): + better-auth@1.7.3(better-sqlite3@13.0.3)(mongodb@7.5.0)(vitest@4.1.10): dependencies: - '@better-auth/core': 1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) - '@better-auth/drizzle-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) - '@better-auth/kysely-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(kysely@0.29.4) - '@better-auth/memory-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) - '@better-auth/mongo-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(mongodb@7.5.0) - '@better-auth/prisma-adapter': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) - '@better-auth/telemetry': 1.7.2(@better-auth/core@1.7.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.4.3))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) + '@better-auth/core': 1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/drizzle-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) + '@better-auth/kysely-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(kysely@0.29.4) + '@better-auth/memory-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) + '@better-auth/mongo-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(mongodb@7.5.0) + '@better-auth/prisma-adapter': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) + '@better-auth/telemetry': 1.7.3(@better-auth/core@1.7.3(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.4.0(zod@4.6.5))(jose@6.2.9)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 '@noble/ciphers': 2.3.0 '@noble/hashes': 2.3.0 - better-call: 1.4.0(zod@4.4.3) + better-call: 1.4.0(zod@4.6.5) defu: 6.1.7 jose: 6.2.9 kysely: 0.29.4 nanostores: 1.4.2 - zod: 4.4.3 + zod: 4.6.5 optionalDependencies: better-sqlite3: 13.0.3 mongodb: 7.5.0 @@ -5191,14 +5183,14 @@ snapshots: - '@cloudflare/workers-types' - '@opentelemetry/api' - better-call@1.4.0(zod@4.4.3): + better-call@1.4.0(zod@4.6.5): dependencies: '@better-auth/utils': 0.5.0 '@better-fetch/fetch': 1.3.1 rou3: 0.9.2 set-cookie-parser: 3.1.2 optionalDependencies: - zod: 4.4.3 + zod: 4.6.5 better-sqlite3@12.11.1: dependencies: @@ -5376,7 +5368,7 @@ snapshots: crc-32: 1.2.2 readable-stream: 3.6.2 - create-objectstack@17.4.0: + create-objectstack@17.5.0: dependencies: chalk: 6.0.0 commander: 15.0.0 @@ -5664,7 +5656,7 @@ snapshots: mkdirp: 0.5.6 rimraf: 2.7.1 - fumadocs-core@16.9.3(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(zod@4.4.3): + fumadocs-core@16.9.3(@types/estree-jsx@1.0.5)(@types/hast@3.0.5)(@types/mdast@4.0.4)(zod@4.6.5): dependencies: '@orama/orama': 3.1.18 estree-util-value-to-estree: 3.5.0 @@ -5687,7 +5679,7 @@ snapshots: '@types/estree-jsx': 1.0.5 '@types/hast': 3.0.5 '@types/mdast': 4.0.4 - zod: 4.4.3 + zod: 4.6.5 transitivePeerDependencies: - supports-color @@ -5806,6 +5798,8 @@ snapshots: dependencies: '@types/hast': 3.0.5 + hono@4.13.11: {} + hono@4.13.3: {} html-escaper@2.0.2: {} @@ -6622,7 +6616,7 @@ snapshots: dependencies: asn1: 0.2.6 - nodemailer@9.0.5: {} + nodemailer@10.0.12: {} normalize-path@3.0.0: {} @@ -7404,8 +7398,6 @@ snapshots: xpath@0.0.34: {} - yaml@2.9.0: {} - yaml@2.9.1: {} zip-stream@4.1.1: @@ -7414,10 +7406,10 @@ snapshots: compress-commons: 4.1.2 readable-stream: 3.6.2 - zod-to-json-schema@3.25.2(zod@4.4.3): + zod-to-json-schema@3.25.2(zod@4.6.5): dependencies: - zod: 4.4.3 + zod: 4.6.5 - zod@4.4.3: {} + zod@4.6.5: {} zwitch@2.0.4: {} diff --git a/src/marketing/flows/campaign-enrollment.flow.ts b/src/marketing/flows/campaign-enrollment.flow.ts index 45e9f9d6c..07fae3778 100644 --- a/src/marketing/flows/campaign-enrollment.flow.ts +++ b/src/marketing/flows/campaign-enrollment.flow.ts @@ -54,9 +54,8 @@ export const CampaignEnrollmentFlow: Flow = { * `context.params.memberSource` still WINS over it. * * ⚠️ Measured on the 17.1.0 spec, with the schema key re-checked on 17.2.0. - * Neither that key nor the seeding behaviour has been re-checked against the - * current pin, 17.4.0 since PR #1814 (#1807) — nor was either re-checked on - * the 17.3.0 pin that preceded it. + * Neither that key nor the seeding behaviour was re-checked on 17.3.0 or + * 17.4.0 (PR #1814, #1807), nor on 17.5.0, the pin since the 17.5.0 bump. * * ⛔ Never seed this with an assignment node instead. An assignment is * unconditional, so it CLOBBERS a supplied param — measured: launching with diff --git a/src/revenue/objects/quote.hook.ts b/src/revenue/objects/quote.hook.ts index 46fc11282..f9f829302 100644 --- a/src/revenue/objects/quote.hook.ts +++ b/src/revenue/objects/quote.hook.ts @@ -115,10 +115,9 @@ const quoteValidation: Hook = { // master-detail cascade) that person's account undeletable forever. // // Measured on 17.1.0 — the version this repo pinned AT THE TIME of - // the measurement, not the current pin (this repo has pinned 17.4.0 - // since PR #1814, #1807, and the cascade shape below has NOT been - // re-measured on it; it was not re-measured on the 17.3.0 pin either, - // #1676) — with a probe hook at priority 199 immediately + // the measurement, not the current pin (the cascade shape below has + // NOT been re-measured on any later pin — not 17.3.0, #1676, not + // 17.4.0, PR #1814, and not 17.5.0) — with a probe hook at priority 199 immediately // ahead of each guard, not assumed. // The engine builds its cleanup write on the CALLER's own context // plus two engine keys, so on the path a REST `DELETE` takes, the diff --git a/src/sales/actions/lead.actions.ts b/src/sales/actions/lead.actions.ts index 77069bebf..ba8d67ad8 100644 --- a/src/sales/actions/lead.actions.ts +++ b/src/sales/actions/lead.actions.ts @@ -71,8 +71,8 @@ export const ConvertLeadAction: Action = { // are the shape that still earns one. // // Mechanism, measured on the console this app pinned at that taking - // (@objectstack/console 17.3.0, `dist/assets/`; the app pins 17.4.0 since PR - // #1814, #1807, and this bundle read was ⛔ NOT re-taken there) rather than + // (@objectstack/console 17.3.0, `dist/assets/`; this bundle read was ⛔ NOT + // re-taken on any later pin — 17.4.0, PR #1814, or 17.5.0) rather than // assumed: the runner gates the dialog on // the key's presence alone — // if (action.confirmText && !await confirmHandler(evaluate(action.confirmText))) diff --git a/src/sales/actions/opportunity.actions.ts b/src/sales/actions/opportunity.actions.ts index d0c8e85ec..9ee151e5d 100644 --- a/src/sales/actions/opportunity.actions.ts +++ b/src/sales/actions/opportunity.actions.ts @@ -139,7 +139,7 @@ export const MassUpdateStageAction: Action = { // from the UI. Collect the miss, keep going, reject once at the end. // // The catch is deliberately cause-AGNOSTIC — but NOT because the cause - // is invisible. On the pinned runtime (17.4.0, \`hostErrorToVm\`) a host + // is invisible. Read on 17.4.0 (\`hostErrorToVm\`; not re-read on 17.5.0), a host // rejection reaches a body as \`name\` and \`message\` plus, when the host // error carries them, \`code\`, \`status\`, \`fields\` and \`userMessage\` — // nothing else, so a stale id arrives branchable as diff --git a/src/sales/dashboards/activity.dashboard.ts b/src/sales/dashboards/activity.dashboard.ts index f228f5472..3ebcda9c4 100644 --- a/src/sales/dashboards/activity.dashboard.ts +++ b/src/sales/dashboards/activity.dashboard.ts @@ -23,7 +23,7 @@ import type { Dashboard } from '@objectstack/spec/ui'; * are fixed and released: objectstack#3912 (the coercion) and objectstack#3777 * (a bare-date `$lte` dropping same-day rows) — both under the **17.0.0** * heading of the installed `driver-sql` and `service-analytics` CHANGELOGs, - * and this app pins 17.4.0 (PR #1814, #1807). `service.dashboard.ts` records + * and every pin since 17.0.0 carries both. `service.dashboard.ts` records * the same two * closures, which is why #1157 restored the Service picker; the two files * agree, and neither states an upstream fix as an unmet precondition. @@ -139,15 +139,9 @@ export const ActivityDashboard: Dashboard = { dataset: 'event_metrics', dimensions: ['owner'], values: ['event_count'], layout: { x: 0, y: 2, w: 6, h: 4 }, chartConfig: { - type: 'bar', showLegend: false, showDataLabels: true, colors: ['#10B981'], - // Axis titles stay plain English: `ChartAxisSchema.title` accepts an inline - // locale map but the Console flattens it to the map's FIRST value regardless - // of locale — measured, see `src/dashboards/index.ts` (#1822). - xAxis: { field: 'owner', title: 'Rep', showGridLines: false, logarithmic: false }, - yAxis: [{ field: 'event_count', title: 'Interactions', showGridLines: true, logarithmic: false }], }, }, { @@ -164,12 +158,9 @@ export const ActivityDashboard: Dashboard = { dataset: 'event_metrics', dimensions: ['start_datetime'], values: ['event_count'], layout: { x: 6, y: 2, w: 6, h: 4 }, chartConfig: { - type: 'area', showLegend: false, showDataLabels: false, colors: ['#0EA5E9'], - xAxis: { field: 'start_datetime', title: 'Week', showGridLines: false, logarithmic: false }, - yAxis: [{ field: 'event_count', title: 'Interactions', showGridLines: true, logarithmic: false }], interaction: { tooltips: true, brush: true }, }, }, @@ -185,7 +176,6 @@ export const ActivityDashboard: Dashboard = { dataset: 'event_metrics', dimensions: ['type'], values: ['event_count'], layout: { x: 0, y: 6, w: 4, h: 4 }, chartConfig: { - type: 'donut', showLegend: true, showDataLabels: true, colors: ['#4169E1', '#10B981', '#8B5CF6', '#F59E0B', '#0EA5E9', '#94A3B8'], @@ -201,12 +191,9 @@ export const ActivityDashboard: Dashboard = { dataset: 'event_metrics', dimensions: ['related_to_type'], values: ['event_count'], layout: { x: 4, y: 6, w: 4, h: 4 }, chartConfig: { - type: 'bar', showLegend: false, showDataLabels: true, colors: ['#4169E1'], - xAxis: { field: 'related_to_type', title: 'Related To', showGridLines: false, logarithmic: false }, - yAxis: [{ field: 'event_count', title: 'Interactions', showGridLines: true, logarithmic: false }], }, }, { diff --git a/src/sales/dashboards/crm.dashboard.ts b/src/sales/dashboards/crm.dashboard.ts index c981c27bb..685cb01b3 100644 --- a/src/sales/dashboards/crm.dashboard.ts +++ b/src/sales/dashboards/crm.dashboard.ts @@ -113,15 +113,9 @@ export const CrmOverviewDashboard: Dashboard = { dataset: 'opportunity_metrics', dimensions: ['close_date'], values: ['total_amount'], layout: { x: 0, y: 2, w: 9, h: 4 }, chartConfig: { - type: 'area', showLegend: false, showDataLabels: false, colors: ['#10B981'], - // Axis titles stay plain English: `ChartAxisSchema.title` accepts an inline - // locale map but the Console flattens it to the map's FIRST value regardless - // of locale — measured, see `src/dashboards/index.ts` (#1822). - xAxis: { field: 'close_date', title: 'Month', showGridLines: false, logarithmic: false }, - yAxis: [{ field: 'total_amount', title: 'Revenue', format: '0,0', showGridLines: true, logarithmic: false }], interaction: { tooltips: true, brush: true }, }, options: { dateGranularity: 'month' }, @@ -135,7 +129,6 @@ export const CrmOverviewDashboard: Dashboard = { dataset: 'opportunity_metrics', dimensions: ['lead_source'], values: ['total_amount'], layout: { x: 9, y: 2, w: 3, h: 4 }, chartConfig: { - type: 'donut', showLegend: true, showDataLabels: true, colors: ['#4F46E5', '#06B6D4', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6'], @@ -161,12 +154,9 @@ export const CrmOverviewDashboard: Dashboard = { dataset: 'product_metrics', dimensions: ['category'], values: ['list_price_sum'], layout: { x: 6, y: 6, w: 6, h: 4 }, chartConfig: { - type: 'bar', showLegend: false, showDataLabels: true, colors: ['#4F46E5'], - xAxis: { field: 'category', title: 'Category', showGridLines: false, logarithmic: false }, - yAxis: [{ field: 'list_price_sum', title: 'Revenue', format: '0,0', showGridLines: true, logarithmic: false }], }, }, diff --git a/src/sales/dashboards/index.ts b/src/sales/dashboards/index.ts index 313d3c05f..ff8461a60 100644 --- a/src/sales/dashboards/index.ts +++ b/src/sales/dashboards/index.ts @@ -8,7 +8,7 @@ * `@objectstack/spec` types BOTH `GlobalFilterSchema.label` and * `ChartAxisSchema.title` as `I18nLabelSchema` — `z.union([z.string(), * InlineLocaleMapSchema])` — so both accept `{ en, 'zh-CN', … }`. Only the - * filter half is resolved against the viewer's locale. Measured on the pinned + * filter half is resolved against the viewer's locale. Measured on * `@objectstack/console@17.4.0`, driving the real Console in Chromium, not * read off a docblock: * @@ -16,15 +16,13 @@ * calls the inline-map resolver with the active language, so `zh-CN` * renders the `zh-CN` value and `ja-JP` the `ja-JP` one. This is the * spelling every `globalFilters[]` entry in this folder uses. - * - AXIS `title` → NOT locale-aware. The axis normaliser flattens the map - * with `Object.values(map).find(v => typeof v === 'string')` — the FIRST - * value, whatever the viewer's locale. Measured both ways: with `en` - * first a `zh-CN` browser rendered the English; with `'zh-CN'` first an - * `en` browser rendered the Chinese. So an inline map on an axis does not - * translate anything, it just makes the one hardcoded string harder to - * read. ⛔ Do not write one — the axis titles in this folder stay plain - * English strings until the platform resolves them, and dropping the - * `title` renders no axis title at all rather than a translated fallback. + * - AXIS `title` → NOT locale-aware on 17.4.0 (the axis normaliser took the + * map's FIRST value, whatever the viewer's locale). Since + * `@objectstack/spec@17.5.0` the question no longer arises for this + * folder: a dataset-bound widget's `chartConfig` refuses `type`, `xAxis`, + * `yAxis` and `series` (ADR-0021 · ADR-0049 D2) — the widget's `type`, + * `dimensions` and `values` are the only binding — so no widget here + * carries an axis title any more. * * ⚠️ `GlobalFilterSchema.object` — documented upstream as resolving a * filter's field and option labels through `fields..` — is diff --git a/src/sales/dashboards/sales.dashboard.ts b/src/sales/dashboards/sales.dashboard.ts index 56c237c10..cfb4d9692 100644 --- a/src/sales/dashboards/sales.dashboard.ts +++ b/src/sales/dashboards/sales.dashboard.ts @@ -188,20 +188,14 @@ export const SalesDashboard: Dashboard = { dataset: 'opportunity_metrics', dimensions: ['close_date'], values: ['total_amount'], layout: { x: 6, y: 4, w: 6, h: 4 }, chartConfig: { - type: 'area', showLegend: false, showDataLabels: false, colors: ['#10B981'], - // Axis titles stay plain English: `ChartAxisSchema.title` accepts an inline - // locale map but the Console flattens it to the map's FIRST value regardless - // of locale — measured, see `src/dashboards/index.ts` (#1822). - xAxis: { field: 'close_date', title: 'Month', showGridLines: false, logarithmic: false }, // No quota annotation line: ChartAnnotationSchema only takes a STATIC // value, and the real quotas live per-owner/per-period in // crm_forecast.quota (seeded 500k–1.5M — the old hardcoded 100000 was // fiction). Quota vs. actual is the quota_attainment_by_rep table // below, bound to the forecast_metrics dataset. - yAxis: [{ field: 'total_amount', title: 'Revenue', format: '0,0', showGridLines: true, logarithmic: false }], interaction: { tooltips: true, brush: true }, }, options: { dateGranularity: 'month' }, @@ -218,12 +212,9 @@ export const SalesDashboard: Dashboard = { dataset: 'opportunity_metrics', dimensions: ['forecast_category'], values: ['total_amount'], layout: { x: 0, y: 8, w: 6, h: 4 }, chartConfig: { - type: 'horizontal-bar', showLegend: false, showDataLabels: true, colors: ['#4F46E5'], - xAxis: { field: 'forecast_category', title: 'Forecast', showGridLines: false, logarithmic: false }, - yAxis: [{ field: 'total_amount', title: 'Pipeline value', format: '0,0', showGridLines: true, logarithmic: false }], }, }, { @@ -236,7 +227,6 @@ export const SalesDashboard: Dashboard = { dataset: 'opportunity_metrics', dimensions: ['lead_source'], values: ['total_amount'], layout: { x: 6, y: 8, w: 6, h: 4 }, chartConfig: { - type: 'donut', showLegend: true, showDataLabels: true, colors: ['#4F46E5', '#06B6D4', '#10B981', '#F59E0B', '#EF4444', '#8B5CF6'], @@ -323,10 +313,9 @@ export const SalesDashboard: Dashboard = { // through a real engine and pins a three-way outcome (current quarter // only: not zero rows, not every quarter). First taken on 17.0.0-rc.2; // RE-RUN 2026-09-03 on 17.2.0 (#1467), RE-RUN on 17.3.0 (#1676, the PR - // #1577 pin) and RE-RUN again on 17.4.0 — the version `package.json` - // pins and `node_modules` installs since PR #1814 (#1807) — green all - // four times, so the outcome holds on the - // CURRENT pin and not only on the one it was first taken on. + // #1577 pin) and RE-RUN again on 17.4.0 (PR #1814, #1807) — green all + // four times, so the outcome held on every pin it was taken on, not + // only the first. Not yet re-run on 17.5.0. // // What stood here before described the two paths as asymmetric and told // the next author not to generalise between them. That was true on @@ -449,7 +438,6 @@ export const SalesDashboard: Dashboard = { dataset: 'opportunity_metrics', dimensions: ['loss_reason'], values: ['opp_count'], layout: { x: 0, y: 24, w: 12, h: 4 }, chartConfig: { - type: 'donut', showLegend: true, showDataLabels: true, colors: ['#EF4444', '#F59E0B', '#8B5CF6', '#06B6D4', '#4F46E5', '#10B981', '#64748B'], diff --git a/src/sales/flows/_guarded-iteration.ts b/src/sales/flows/_guarded-iteration.ts index 4381f994f..2cd799701 100644 --- a/src/sales/flows/_guarded-iteration.ts +++ b/src/sales/flows/_guarded-iteration.ts @@ -31,8 +31,8 @@ * * ## Verified against the pinned `@objectstack/*` this repo installs * - * First taken on 17.3.0; RE-TAKEN on the current pin 17.4.0 (#1883, after the - * PR #1814 bump), same verdict: a 5-item sweep whose body fails on every item + * First taken on 17.3.0; RE-TAKEN on 17.4.0 (#1883, after the PR #1814 bump; + * not re-taken on 17.5.0), same verdict: a 5-item sweep whose body fails on every item * ran to completion — all 5 items touched, run `success: true` — where the * same sweep with the body UNWRAPPED stopped at the first failure with 1 item * touched and the run `failed`. That contrast IS the measurement; a guarded diff --git a/src/sales/flows/account-approval.flow.ts b/src/sales/flows/account-approval.flow.ts index 5334bd926..69b629a3f 100644 --- a/src/sales/flows/account-approval.flow.ts +++ b/src/sales/flows/account-approval.flow.ts @@ -29,7 +29,7 @@ type Flow = Automation.Flow; * that wants no account sign-off sets it to `approved`, the start condition * below is then false for every record that will ever exist, and the gate is * off AND still switchable. ⛔ Do NOT reach for `status: 'draft'` or - * `'obsolete'` instead — both were measured on the pinned + * `'obsolete'` instead — both were measured on * `@objectstack/service-automation` 17.4.0 and neither is an off switch: draft * flows still fire their triggers, and `isFlowEnabled` composes authoring * status with the installation's activation ledger so that `obsolete` is a gate diff --git a/src/sales/flows/lead-conversion-approval.flow.ts b/src/sales/flows/lead-conversion-approval.flow.ts index 214dfd366..f3e1e0429 100644 --- a/src/sales/flows/lead-conversion-approval.flow.ts +++ b/src/sales/flows/lead-conversion-approval.flow.ts @@ -26,7 +26,7 @@ type Flow = Automation.Flow; * `lead.hook.ts` refuses its conversion until this flow writes a verdict. * * ⛔ Do NOT reach for `status: 'draft'` as the off switch instead. Measured on - * the pinned `@objectstack/service-automation` 17.4.0, whose own registration + * `@objectstack/service-automation` 17.4.0, whose own registration * diagnostic says it in as many words — "draft flows still fire their triggers; * set status: 'active' to make intent explicit, or 'obsolete' to disable". And * ⛔ not `'obsolete'` either: `isFlowEnabled` composes the authoring status with diff --git a/src/sales/objects/_hook-api.ts b/src/sales/objects/_hook-api.ts index a82dc97aa..451fc9344 100644 --- a/src/sales/objects/_hook-api.ts +++ b/src/sales/objects/_hook-api.ts @@ -49,12 +49,12 @@ type Doc = Record; * * MEASURED per method against the object the kernel actually injects as * `ctx.api`. First taken on 17.2.0; RE-TAKEN on 17.3.0 during #1528; RE-TAKEN - * AGAIN on the current pin 17.4.0 during #1883, by handing each key to a real + * AGAIN on 17.4.0 during #1883, by handing each key to a real * engine — the legal key sets and the `filter` fold came back UNCHANGED at - * every taking, so the readings below are current, not merely inherited. Every line is + * every taking. Not re-taken on 17.5.0. Every line is * pinned by an assertion in `test/hook-query-predicate.test.ts`, against a - * real engine rather than the test harness, and that file runs green on the - * current pin: + * real engine rather than the test harness, so that file is what re-measures + * it on each new pin: * * - `find` — `filter` is ALIASED to `where`; the predicate is applied. * - `findOne` — `filter` is ALIASED to `where`; the predicate is applied. @@ -98,7 +98,7 @@ export interface HookQuery { * compile error again. * * MEASURED against `@objectstack` 17.3.0, and RE-MEASURED word for word on - * the current pin 17.4.0 (#1883), on the object the kernel injects as + * 17.4.0 (#1883; not on 17.5.0), on the object the kernel injects as * `ctx.api`, by handing each key to the engine and * reading its unknown-option guard — which prints the legal set verbatim, and * is the cheapest authoritative reading of it: diff --git a/src/sales/objects/forecast.hook.ts b/src/sales/objects/forecast.hook.ts index aadb9fc0b..cb8195541 100644 --- a/src/sales/objects/forecast.hook.ts +++ b/src/sales/objects/forecast.hook.ts @@ -35,7 +35,7 @@ const forecastDerive: Hook = { // all N matched rows, and the engine hands every row's `beforeUpdate` THAT // payload rather than a per-row copy. A payload write whose value — or // whose if-guard — reads `ctx.previous` therefore does not scope itself to - // the row it was decided on. Both outcomes are measured on the pinned + // the row it was decided on. Both outcomes are measured on // 17.4.0, in this app, on a fresh `pnpm dev`: // // - keys written for SOME rows only ⇒ the engine refuses the whole batch diff --git a/src/sales/objects/lead.hook.ts b/src/sales/objects/lead.hook.ts index 7f7382238..77d763803 100644 --- a/src/sales/objects/lead.hook.ts +++ b/src/sales/objects/lead.hook.ts @@ -190,9 +190,8 @@ const leadHook: Hook = { // a guest insert storing `is_converted: true` and an `owner_id` it // supplied itself. Assignment is what this block uses. // - // Upstream objectstack#12277 shipped in **17.3.0**; this repo pins - // 17.4.0 (PR #1814, #1807), so it carries the fix and `delete` is - // effective on both execution paths. + // Upstream objectstack#12277 shipped in **17.3.0**, so every later + // pin carries the fix and `delete` is effective on both execution paths. // ⛔ That is still not a licence to spell this block with `delete`: the // assignments are load-bearing as WRITES — `lead_duplicate_check` stands // down only on a NON-BLANK verdict, so these columns must arrive `null` @@ -326,10 +325,9 @@ const leadHook: Hook = { // forever (a GDPR erasure that cannot be carried out). // // Measured on 17.1.0 — the version this repo pinned AT THE TIME of - // the measurement, not the current pin (this repo has pinned 17.4.0 - // since PR #1814, #1807, and the cascade shape below has NOT been - // re-measured on it; it was not re-measured on the 17.3.0 pin either, - // #1676) — with a probe hook at priority 199 immediately + // the measurement, not the current pin (the cascade shape below has + // NOT been re-measured on any later pin — not 17.3.0, #1676, not + // 17.4.0, PR #1814, and not 17.5.0) — with a probe hook at priority 199 immediately // ahead of each guard, not assumed. // The engine builds its cleanup write on the CALLER's own context // plus two engine keys, so on the path a REST `DELETE` takes, the diff --git a/src/sales/objects/opportunity.hook.ts b/src/sales/objects/opportunity.hook.ts index a20c2556f..2bb86355c 100644 --- a/src/sales/objects/opportunity.hook.ts +++ b/src/sales/objects/opportunity.hook.ts @@ -135,10 +135,9 @@ const opportunityValidationHook: Hook = { // erasure that cannot be carried out). // // Measured on 17.1.0 — the version this repo pinned AT THE TIME of - // the measurement, not the current pin (this repo has pinned 17.4.0 - // since PR #1814, #1807, and the cascade shape below has NOT been - // re-measured on it; it was not re-measured on the 17.3.0 pin either, - // #1676) — with a probe hook at priority 199 immediately + // the measurement, not the current pin (the cascade shape below has + // NOT been re-measured on any later pin — not 17.3.0, #1676, not + // 17.4.0, PR #1814, and not 17.5.0) — with a probe hook at priority 199 immediately // ahead of each guard, not assumed. // The engine builds its cleanup write on the CALLER's own context // plus two engine keys, so on the path a REST `DELETE` takes, the diff --git a/src/sales/objects/task.object.ts b/src/sales/objects/task.object.ts index 0a1fa0b0b..dad292c31 100644 --- a/src/sales/objects/task.object.ts +++ b/src/sales/objects/task.object.ts @@ -227,8 +227,8 @@ export const Task = ObjectSchema.create({ // NOT readonly — but the old reason here ("16.x drops flow writes to // readonly fields") does not survive measurement. Taken on 17.1.0, // RE-TAKEN on 17.2.0 (#1460) and RE-CONFIRMED on 17.3.0 (#1676) — the pin - // at each of those takings, none of them the current one (17.4.0 since PR - // #1814, #1807) — same verdict all three times: `task_due_reminder` + // at each of those takings; not re-taken on 17.4.0 (PR #1814, #1807) or + // 17.5.0 — same verdict all three times: `task_due_reminder` // declares `runAs: 'system'`, so its write WOULD survive a // `readonly: true`. // diff --git a/src/sales/pages/home.page.ts b/src/sales/pages/home.page.ts index d2375def4..d5b89875e 100644 --- a/src/sales/pages/home.page.ts +++ b/src/sales/pages/home.page.ts @@ -185,7 +185,7 @@ export const SalesHomePage: Page = { label: 'Revenue (Won)', icon: 'dollar-sign', aggregate: { field: 'amount', function: 'sum' }, - filter: { stage: 'closed_won' }, + filter: [{ field: 'stage', operator: 'equals', value: 'closed_won' }], }, }, { @@ -196,7 +196,7 @@ export const SalesHomePage: Page = { label: 'Deals Won', icon: 'trophy', aggregate: { field: 'id', function: 'count' }, - filter: { stage: 'closed_won' }, + filter: [{ field: 'stage', operator: 'equals', value: 'closed_won' }], }, }, { @@ -207,7 +207,7 @@ export const SalesHomePage: Page = { label: 'Pipeline Value', icon: 'briefcase', aggregate: { field: 'amount', function: 'sum' }, - filter: { stage: { $nin: ['closed_won', 'closed_lost'] } }, + filter: [{ field: 'stage', operator: 'not_in', value: ['closed_won', 'closed_lost'] }], }, }, { @@ -218,7 +218,7 @@ export const SalesHomePage: Page = { label: 'Open Leads', icon: 'user-plus', aggregate: { field: 'id', function: 'count' }, - filter: { is_converted: false }, + filter: [{ field: 'is_converted', operator: 'equals', value: false }], }, }, ], diff --git a/src/sales/pages/lead_detail.page.ts b/src/sales/pages/lead_detail.page.ts index 194d61e74..b4cb583e2 100644 --- a/src/sales/pages/lead_detail.page.ts +++ b/src/sales/pages/lead_detail.page.ts @@ -400,13 +400,14 @@ export const LeadDetailPage: Page = { // branch. An authored page opts out of the synthesizer, // so it opts out of the derivation with it. // - // ⚠️ Version caveat: those browser numbers are 17.2.0 and - // this repo now pins 17.4.0 (PR #1814, #1807). #1521 did + // ⚠️ Version caveat: those browser numbers are 17.2.0, + // two and more pins ago (17.4.0 came with PR #1814, then + // 17.5.0). #1521 did // NOT re-run the // browser measurement. What it did do is read the // 17.3.0 console bundle (static, not run) — a pin that is // itself now behind, and nobody has re-read the 17.4.0 - // bundle — and + // or 17.5.0 bundle — and // the mechanism is unchanged there: both guards are still // `sections.length > 0` and `fields.length > 0` with no // else, the renderer still reads neither of the two diff --git a/src/sales/pages/opportunity_detail.page.ts b/src/sales/pages/opportunity_detail.page.ts index 3978e5a24..11c36de8c 100644 --- a/src/sales/pages/opportunity_detail.page.ts +++ b/src/sales/pages/opportunity_detail.page.ts @@ -205,8 +205,8 @@ export const OpportunityDetailPage: Page = { // — so an item that simply omits the key is // `undefined`, not `false`, and stays shut. Measured // on the @objectstack/console 17.3.0 bundle — the pin - // at that taking, ⛔ NOT re-taken on the current - // 17.4.0 pin (#1814, #1807) — + // at that taking, ⛔ NOT re-taken on 17.4.0 + // (#1814, #1807) or 17.5.0 — // and the component's own designer text says the same // ("collapsed: false opens a panel by default"). // diff --git a/src/sales/profiles/tenant-admin.profile.ts b/src/sales/profiles/tenant-admin.profile.ts index 63fed62e5..d11fc1e5e 100644 --- a/src/sales/profiles/tenant-admin.profile.ts +++ b/src/sales/profiles/tenant-admin.profile.ts @@ -57,8 +57,8 @@ import { SystemAdminProfile } from './system-admin.profile'; * They are KEPT, and they are bounded by the organization, not by them. * * Two measurements, both against the 17.1.0 line — the version - * installed AT THE TIME they were taken, not the current pin (#1676: this - * repo has installed 17.3.0 since PR #1577). + * installed AT THE TIME they were taken, not the current pin (neither was + * re-taken on 17.3.0, 17.4.0 or 17.5.0). * * ⚠️ The zero-occurrence result in 1 — the load-bearing half — reproduced on * 17.2.0 and has not been re-run since (#1676). The three CONTROL counts in diff --git a/src/sales/views/forecast.view.ts b/src/sales/views/forecast.view.ts index e609bfcf4..e1f2fa444 100644 --- a/src/sales/views/forecast.view.ts +++ b/src/sales/views/forecast.view.ts @@ -57,9 +57,9 @@ export const ForecastViews = defineView({ // real engine and pins the three-way outcome (one quarter selected, not // zero and not all of them). First taken on 17.0.0-rc.2, RE-RUN // 2026-09-03 on 17.2.0 (#1467), RE-RUN on 17.3.0 (#1676, after the PR - // #1577 bump) and RE-RUN again on the current pin 17.4.0 (#1883, after - // the PR #1814 bump), green all four times — so - // this is a reading on the CURRENT pin. + // #1577 bump) and RE-RUN again on 17.4.0 (#1883, after the PR #1814 + // bump), green all four times. Not yet re-run on 17.5.0; the test is + // what re-takes the reading on each new pin. // // Both halves of the key are load-bearing, same as the quota-attainment // widget in `src/dashboards/sales.dashboard.ts`: `period: 'quarter'` diff --git a/src/sales/views/opportunity.view.ts b/src/sales/views/opportunity.view.ts index 6556a0f00..734f39970 100644 --- a/src/sales/views/opportunity.view.ts +++ b/src/sales/views/opportunity.view.ts @@ -250,9 +250,8 @@ export const OpportunityViews = defineView({ // years)_(ago|from_now)}` — and it reaches the driver already substituted // for an ISO date. Measured on 17.0.0-rc.2, RE-MEASURED 2026-09-03 on // 17.2.0 (#1467), RE-RUN on 17.3.0 (#1676, after the PR #1577 bump) and - // RE-RUN again on the current pin 17.4.0 (#1883, after the PR #1814 - // bump), so it is a reading on the CURRENT pin, and unchanged - // at every taking: over four rows parked + // RE-RUN again on 17.4.0 (#1883, after the PR #1814 bump; not yet on + // 17.5.0), unchanged at every taking: over four rows parked // 30d / 15d / 13d / 1d, `stage_entry_date < {14_days_ago}` returned the // 30d and 15d rows — the same two the equivalent day-start literal // returns, and not all four, which is what an unsubstituted token would @@ -307,10 +306,10 @@ export const OpportunityViews = defineView({ // so a saved-view filter value reaches the driver already substituted. // Measured on 17.0.0-rc.2, RE-MEASURED 2026-09-03 on 17.2.0 (#1467), // RE-RUN on 17.3.0 (#1676, after the PR #1577 bump) and RE-RUN again on - // the current pin 17.4.0 (#1883, after the PR #1814 bump), unchanged at + // 17.4.0 (#1883, after the PR #1814 bump), unchanged at // every taking — see the runtime block in // `test/forecast-current-quarter-view.test.ts`, which is that - // re-measurement and runs green on the current pin. + // re-measurement (not yet re-run on 17.5.0). // // The upper bound is INCLUSIVE against `{current_quarter_end}` rather // than half-open against `{next_quarter_start}`, and that choice is diff --git a/src/sales/views/task.view.ts b/src/sales/views/task.view.ts index 2010f40a1..62a8cc017 100644 --- a/src/sales/views/task.view.ts +++ b/src/sales/views/task.view.ts @@ -174,8 +174,8 @@ export const TaskViews = defineView({ // Operator-only filter — priority and status, no tokens — and the reason // recorded here for that has expired (#782). Two claims stood here; both // were wrong already on 17.0.0-rc.2 — the version this repo pinned AT - // THE TIME they were measured, not the current pin, which is 17.4.0 - // since PR #1814 (#1807) — in different ways. "Wrong" is about those two + // THE TIME they were measured, not the current pin — in different + // ways. "Wrong" is about those two // retired claims, not about the engine: nothing in this block reports // broken platform behaviour. // @@ -196,22 +196,21 @@ export const TaskViews = defineView({ // RE-MEASURED 2026-09-03 on 17.2.0 (#1467), unchanged: both probes // reported exactly those results there. NOT re-run on 17.3.0 (#1676) — // the two-probe result is a 17.2.0 reading, and the seam it rests on - // (`resolveFilterTokens()` on the read path) is re-confirmed on the - // current pin by `test/flow-filter-today-token.test.ts`, which runs - // green there. + // (`resolveFilterTokens()` on the read path) was re-confirmed on 17.4.0 + // by `test/flow-filter-today-token.test.ts` (not yet re-run on 17.5.0). // // `{TODAY()}` is not a spelling of anything and never was. The vocabulary // is `{today}` / `{yesterday}` / `{tomorrow}` / `{now}`, the period // tokens, and the parameterised `{N_days_ago}` family. // - // ⚠️ WHAT CHANGED between rc.2 and the current pin — the one reading in + // ⚠️ WHAT CHANGED between rc.2 and 17.4.0 — the one reading in // this block that did NOT survive re-measurement, and the reason the // version qualifiers here are load-bearing rather than bookkeeping. On // rc.2 `{TODAY()}` was not REJECTED either: the placeholder grammar was // `/^\$?\{([a-zA-Z0-9_]+)\}$/`, parentheses fell outside it, // `classifyFilterToken('{TODAY()}')` returned null, and the string // reached the driver verbatim and compared as text. From 17.2.0 on — - // re-confirmed on 17.3.0 (#1676) and again on the current pin 17.4.0 + // re-confirmed on 17.3.0 (#1676) and again on 17.4.0 // (#1883) by the PREMISE case in // `test/flow-filter-today-token.test.ts`, which drives a real engine — // that is FALSE: `FILTER_TOKEN_WRAPPED_RE` in `@objectstack/spec/data` @@ -285,14 +284,14 @@ export const TaskViews = defineView({ // EXPIRED — the other reason said the view layer cannot resolve // `due_date < {TODAY()}`, and that only `{current_user_id}` interpolates. // Both halves were wrong already on 17.0.0-rc.2 — the version this repo - // pinned AT THE TIME they were measured, not the current pin, which is - // 17.4.0 since PR #1814 (#1807) — and the file said the opposite of + // pinned AT THE TIME they were measured, not the current pin — and the + // file said the opposite of // itself: the note on `todays_tasks` above asserted that // `{current_user_id}` does NOT interpolate. It does. // That comment carries the measurements with their versions, INCLUDING // the one that moved: `{TODAY()}` is REJECTED from 17.2.0 on - // (`FILTER_TOKEN_UNKNOWN`, re-confirmed on 17.3.0 and again on the - // current pin 17.4.0 by + // (`FILTER_TOKEN_UNKNOWN`, re-confirmed on 17.3.0 and again on + // 17.4.0 by // `test/flow-filter-today-token.test.ts`) where on rc.2 it shipped to // the driver as text, so "cannot resolve `{TODAY()}`" is wrong on the // current pin for a different reason than it was wrong on rc.2. The diff --git a/src/service/dashboards/service.dashboard.ts b/src/service/dashboards/service.dashboard.ts index fa610323d..fcef7256a 100644 --- a/src/service/dashboards/service.dashboard.ts +++ b/src/service/dashboards/service.dashboard.ts @@ -144,7 +144,6 @@ export const ServiceDashboard: Dashboard = { dataset: 'case_metrics', dimensions: ['status'], values: ['case_count'], layout: { x: 0, y: 2, w: 4, h: 4 }, chartConfig: { - type: 'donut', showLegend: true, showDataLabels: true, colors: ['#0EA5E9', '#06B6D4', '#14B8A6', '#10B981', '#F59E0B'], @@ -160,7 +159,6 @@ export const ServiceDashboard: Dashboard = { dataset: 'case_metrics', dimensions: ['priority'], values: ['case_count'], layout: { x: 4, y: 2, w: 4, h: 4 }, chartConfig: { - type: 'pie', showLegend: true, showDataLabels: true, // critical → high → medium → low @@ -176,15 +174,9 @@ export const ServiceDashboard: Dashboard = { dataset: 'case_metrics', dimensions: ['origin'], values: ['case_count'], layout: { x: 8, y: 2, w: 4, h: 4 }, chartConfig: { - type: 'bar', showLegend: false, showDataLabels: true, colors: ['#8B5CF6'], - // Axis titles stay plain English: `ChartAxisSchema.title` accepts an inline - // locale map but the Console flattens it to the map's FIRST value regardless - // of locale — measured, see `src/dashboards/index.ts` (#1822). - xAxis: { field: 'origin', title: 'Channel', showGridLines: false, logarithmic: false }, - yAxis: [{ field: 'case_count', title: 'Cases', showGridLines: true, logarithmic: false }], }, }, @@ -214,12 +206,9 @@ export const ServiceDashboard: Dashboard = { dataset: 'case_metrics', dimensions: ['created_date'], values: ['case_count'], layout: { x: 0, y: 6, w: 8, h: 4 }, chartConfig: { - type: 'area', showLegend: false, showDataLabels: false, colors: ['#0EA5E9'], - xAxis: { field: 'created_date', title: 'Day', showGridLines: false, logarithmic: false }, - yAxis: [{ field: 'case_count', title: 'Cases opened', showGridLines: true, logarithmic: false }], interaction: { tooltips: true, brush: true }, }, options: { dateGranularity: 'day' }, @@ -243,7 +232,6 @@ export const ServiceDashboard: Dashboard = { dataset: 'case_metrics', values: ['sla_compliance_rate'], layout: { x: 8, y: 6, w: 4, h: 4 }, chartConfig: { - type: 'gauge', showLegend: false, showDataLabels: true, colors: ['#10B981', '#F59E0B', '#EF4444'], diff --git a/src/service/flows/case-actions.flow.ts b/src/service/flows/case-actions.flow.ts index 0a2137362..9f126c025 100644 --- a/src/service/flows/case-actions.flow.ts +++ b/src/service/flows/case-actions.flow.ts @@ -157,20 +157,18 @@ export const CloseCaseFlow: Flow = { // left honest — which is worse than an absent link for a measure whose // whole job is to say how OFTEN the KB resolves a case. // - // ⚠️ MEASURED LIMITATION, stated so nobody re-discovers it: a flow screen - // field cannot name a target object. `ScreenFieldConfigSchema` - // (`@objectstack/spec/automation`) has `name` / `label` / `type` / - // `options` / `defaultValue` / `placeholder` / `visibleWhen` and NO - // object or reference key, so `type: 'lookup'` has nothing to resolve a - // record picker from — the same degradation `add_contact_to_campaign` - // documents for a bare `{ type: 'lookup' }` action param, which it avoids - // by being FIELD-BACKED, an escape a screen field does not have. + // `reference` names the object the picker offers. Up to + // `@objectstack/spec@17.4.0` a screen field had no such key, so this + // `type: 'lookup'` field had nothing to resolve a record picker from; + // 17.5.0 added `reference` to `ScreenFieldConfigSchema` and made it + // REQUIRED on a lookup screen field (#17913) — the stack does not load + // without it. It is the same target the case's own `resolved_by_article` + // lookup declares (`crm_knowledge_article`). // - // So the real picker for this link is the `Resolved by Article` lookup in - // the case's Resolution group, on the record form, and this screen field - // is the CLOSE-PATH capture beside it. Both write the same column; the - // action is `refreshAfter: true`, so the record form is what the agent - // lands on immediately after closing. + // The `Resolved by Article` lookup in the case's Resolution group, on the + // record form, writes the same column; the action is + // `refreshAfter: true`, so the record form is what the agent lands on + // immediately after closing. id: 'screen_1', type: 'screen', label: 'Close Case', config: { fields: [ @@ -179,8 +177,8 @@ export const CloseCaseFlow: Flow = { name: 'resolved_by_article', label: 'Resolved by Article (optional)', type: 'lookup', + reference: 'crm_knowledge_article', required: false, - placeholder: 'Knowledge article id, if the KB resolved this case', }, ], }, diff --git a/src/service/objects/case.hook.ts b/src/service/objects/case.hook.ts index 5e86a0070..39236f35c 100644 --- a/src/service/objects/case.hook.ts +++ b/src/service/objects/case.hook.ts @@ -69,9 +69,8 @@ const caseValidation: Hook = { // while their tests passed (#1133). This block was rewritten to ASSIGN. // // The block above predicted its own trigger — "a platform release that - // POSTDATES 2026-08-26" — and that release is **17.3.0** (`package.json` - // has pinned 17.4.0 since PR #1814, #1807, so the fix is in the installed - // tree either way). objectstack#12277 shipped: the in-process Proxy + // POSTDATES 2026-08-26" — and that release is **17.3.0**, so every later + // pin carries the fix. objectstack#12277 shipped: the in-process Proxy // traps `deleteProperty`, and the sandbox path diffs deletions against the // entry snapshot rather than writing mutations home with `Object.assign`, // which cannot represent a removal. Re-measured through the engine's own diff --git a/src/service/objects/knowledge_article.hook.ts b/src/service/objects/knowledge_article.hook.ts index 694338eb8..a8e1f8b6e 100644 --- a/src/service/objects/knowledge_article.hook.ts +++ b/src/service/objects/knowledge_article.hook.ts @@ -68,7 +68,7 @@ import type { Hook, HookContext } from '@objectstack/spec/data'; * `nowIso`, a clock read. The row only ever decides WHETHER a key is written. * * - `last_reviewed_at` sits behind the `nextStatus !== 'published'` early - * return, and that return reads the ROW. Measured on the pinned 17.4.0 on a + * return, and that return reads the ROW. Measured on 17.4.0 on a * fresh `pnpm dev`: the platform's own seed-ownership claim (one payload of * `{ owner_id }`, `where: { owner_id: null }`) matched all 4 seeded * articles; the 3 published ones stamped `last_reviewed_at`, the 1 draft @@ -92,7 +92,7 @@ import type { Hook, HookContext } from '@objectstack/spec/data'; * ⚠️ HISTORY — do not reason from it. Until 17.3.0 the sandbox context carried * no per-row signal, so a `ctx.dispatch` guard lowered cleanly, passed every * in-process test and was INERT in production; PR #1274 recorded that as the - * reason this could not be fixed here. That is FALSE on the pinned 17.4.0: + * reason this could not be fixed here. That is FALSE from 17.3.0 on: * `buildSandboxContext` marshals `dispatch` and an `inputOptions` projection * (objectstack#11552), and `test/hooks-runtime-service.test.ts` pins that they * cross. `ctx.input.id` is still absent — read `ctx.previous.id`. diff --git a/src/service/objects/knowledge_article.object.ts b/src/service/objects/knowledge_article.object.ts index 7ddc4e7ec..a142ea94f 100644 --- a/src/service/objects/knowledge_article.object.ts +++ b/src/service/objects/knowledge_article.object.ts @@ -32,9 +32,9 @@ export const KnowledgeArticle = ObjectSchema.create({ // declared while every key below is enforced. // // MEASURED on `@objectstack/plugin-sharing@17.1.0` — the version - // installed AT THE TIME of the measurement, not the current pin (this repo - // has installed 17.4.0 since PR #1814, #1807, and this table has NOT been - // re-taken on it; it was not re-taken on the 17.3.0 pin either, #1676) — + // installed AT THE TIME of the measurement, not the current pin (this table + // has NOT been re-taken on any later pin — not 17.3.0, #1676, not 17.4.0, + // PR #1814, and not 17.5.0) — // against the real `ShareLinkService` and a real engine, // not read off a grep count: // diff --git a/src/service/views/case.view.ts b/src/service/views/case.view.ts index f146ce47d..2b8da4a92 100644 --- a/src/service/views/case.view.ts +++ b/src/service/views/case.view.ts @@ -292,8 +292,8 @@ export const CaseViews = defineView({ * ## ⚠️ This object's `form` IS the create dialog (#1214 item 3) * * Measured against the console this app shipped at that taking - * (`@objectstack/console` 17.1.0, `dist/assets/`; the app ships 17.4.0 since - * PR #1814, #1807, and this bundle read was ⛔ NOT re-taken there), BOTH + * (`@objectstack/console` 17.1.0, `dist/assets/`; this bundle read was ⛔ NOT + * re-taken on any later pin), BOTH * entry points that open a case form resolve * it the same way and neither takes a create/edit argument: * diff --git a/test/case-create-form-narrowing.test.ts b/test/case-create-form-narrowing.test.ts index 7ae885d74..cf8fc2192 100644 --- a/test/case-create-form-narrowing.test.ts +++ b/test/case-create-form-narrowing.test.ts @@ -251,7 +251,7 @@ describe('crm_case create form — retention direction', () => { * The reason is NOT the blanket this comment used to carry ("the platform * DROPS writes to readonly fields"). Measured in * `test/readonly-write-semantics.test.ts` on 17.1.0, re-measured there on - * 17.2.0 (#1460) and re-measured again on the current pin 17.3.0 (#1676), + * 17.2.0 (#1460) and re-measured again on 17.3.0 (#1676, the pin at the time), * same result every time: the strip is one branch of the * UPDATE path, `if (!opCtx.context?.isSystem)`, over CALLER-supplied keys — * so a `beforeUpdate` hook's own stamp survives it, an insert is exempt from diff --git a/test/undeclared-key-probe.test.ts b/test/undeclared-key-probe.test.ts index cd0559170..0e83fb9b0 100644 --- a/test/undeclared-key-probe.test.ts +++ b/test/undeclared-key-probe.test.ts @@ -23,7 +23,7 @@ import { QuoteLineItem } from '../src/revenue/objects/quote_line_item.object'; * and field-level security by construction. * * This file is the re-measurement taken on 17.1.0 — the version this repo - * pinned AT THE TIME, not the current pin (#1676: 17.3.0 since PR #1577) — + * pinned AT THE TIME, not the current pin — * and it says two different things about two different write paths. * * ⚠️ The two halves are at DIFFERENT takings, so read the label on each. Half diff --git a/test/view-references.test.ts b/test/view-references.test.ts index cd8b88c97..2f06f3a22 100644 --- a/test/view-references.test.ts +++ b/test/view-references.test.ts @@ -131,7 +131,7 @@ describe('filter template tokens are resolvable', () => { * through a real engine and pins one quarter selected out of three, plus * the throw on the retired `{this_quarter_start}` spelling. First taken on * 17.0.0-rc.2, RE-RUN 2026-09-03 on 17.2.0 (#1467) and RE-RUN on the - * current pin 17.3.0 (#1676: the pin since PR #1577), green all three + * 17.3.0 (#1676, the pin at the time), green all three * times. * * What DID move between those two pins is WHICH spellings throw. The From 863f7ae08d014b76a4af4d16fc9fc32d380d6c4c Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 29 Sep 2026 13:02:06 +0000 Subject: [PATCH 2/4] =?UTF-8?q?chore(deps):=20finish=20the=2017.5.0=20upgr?= =?UTF-8?q?ade=20=E2=80=94=20page=20audience,=20role=20word,=20nested=20pa?= =?UTF-8?q?ge=20i18n?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Complete the @objectstack/* 17.5.0 upgrade started in the previous commit. `pnpm verify` is green again. - pages: delete `assignedProfiles` from app_launcher, home, utility_bar, lead_detail, opportunity_detail and case_detail. spec 17.5.0 refuses the key. It gated nothing on 17.4.0, since no renderer, route or metadata read ever read it, so page audience is unchanged. The two tests that check declared assignedProfiles are kept as they are. - contact: relabel the "Account & Role" section "Account & Title". The new `security-role-word` lint rule reserves "role", and the section holds the job title. Update the en bundle and the Contacts doc to match; zh/ja/es already said "job title". - i18n: add the 14 page keys that 17.5.0 `os lint` now requires for nested and slot components, in each of zh-CN, ja-JP and es-ES. `os i18n extract` does not scaffold page keys. - test: the SQL driver withholds the operator name from a refused filter's message. The `$regex` premise test now reads the full text through `withheldFilterDiagnosticOf` and also asserts that the public message does not name the operator. - changeset: describe all four. Claude-Session: https://claude.ai/code/session_014VGCS11YUtYAiinRcdqQwL Co-authored-by: Claude --- .changeset/objectstack-17-5-0.md | 33 +++++++++++++++++++ content/docs/sales/contacts.mdx | 2 +- src/sales/objects/contact.object.ts | 2 +- src/sales/pages/app_launcher.page.ts | 1 - src/sales/pages/home.page.ts | 1 - src/sales/pages/lead_detail.page.ts | 5 --- src/sales/pages/opportunity_detail.page.ts | 1 - src/sales/pages/utility_bar.page.ts | 1 - src/sales/translations/en/objects.customer.ts | 2 +- src/sales/translations/es-ES/app.ts | 15 +++++++++ src/sales/translations/ja-JP/app.ts | 15 +++++++++ src/sales/translations/zh-CN/app.ts | 15 +++++++++ src/service/pages/case_detail.page.ts | 1 - test/account-name-normalized-match.test.ts | 14 ++++++-- 14 files changed, 92 insertions(+), 16 deletions(-) diff --git a/.changeset/objectstack-17-5-0.md b/.changeset/objectstack-17-5-0.md index 7fd6283af..247cf7c1c 100644 --- a/.changeset/objectstack-17-5-0.md +++ b/.changeset/objectstack-17-5-0.md @@ -60,6 +60,39 @@ The platform changes that reached this app: sets nothing runs none of them.** The admin *Automation* page now says so in all three locales. Under the `isolated` posture a scheduled flow must also name its organization, and these do not. +- **Six pages drop `assignedProfiles`. Who can open them does not change.** + `@objectstack/spec@17.5.0` removes `page.assignedProfiles` and refuses it. No + renderer, route or metadata read on 17.4.0 ever read the key, so the six pages + that set it were already open to every caller who could reach them. The pages + are *App Launcher*, *Sales Home*, *Utility Bar*, *Lead Detail*, *Opportunity + Detail* and *Case Detail*. Deleting the key keeps that behaviour. The platform + gates what a page shows through the object permission sets, which HotCRM + already declares. `test/metadata-references.test.ts` and + `test/authorization-coverage.test.ts` still check any `assignedProfiles` a + page declares, and no page declares one now. +- **The contact form section *Account & Role* is now *Account & Title*.** + 17.5.0 adds the author-time rule `security-role-word`: "role" is a reserved + word in labels, because the platform no longer has a Role concept. The section + holds the contact's owner, account, job title and department, so the English + label now says *Title*. The Chinese, Japanese and Spanish labels already said + "job title" and are unchanged. +- **Detail pages and Sales Home carry translated copy for nested components.** + From 17.5.0, `os lint` checks the translation of every component in a page's + tree, not only the top-level ones. There are 14 new keys in each of zh-CN, + ja-JP and es-ES: + - the Account Detail title and subtitle, and its discussion panel; + - the details sections of Case, Lead and Opportunity; + - the Lead Detail related, activity and field-history panels; + - the three "My …" lists on Sales Home. + + Before this change those components showed English in every locale. + `os i18n extract` does not scaffold page keys, so the keys were added by hand. +- **One driver test reads the withheld filter diagnostic.** 17.5.0's SQL + drivers no longer put caller-supplied operator and field names in the thrown + message of a refused filter. The full text rides on the error, and + `withheldFilterDiagnosticOf` reads it. The retired-`$regex` premise test now + checks two things. The public message says RETIRED and does not name the + operator. The withheld diagnostic still names `$regex`. - **Claims that named 17.4.0 as the current pin are re-scoped**, not renumbered, across source comments, tests and maintainer docs. Each now dates itself to the pin it was measured on. None was re-measured on 17.5.0 in this change. Four diff --git a/content/docs/sales/contacts.mdx b/content/docs/sales/contacts.mdx index ae2dcb9ec..350824487 100644 --- a/content/docs/sales/contacts.mdx +++ b/content/docs/sales/contacts.mdx @@ -14,7 +14,7 @@ The contact detail screen has 7 collapsible sections: | Section | Fields | | --- | --- | | **Identity** | Salutation, first name, last name, full name, profile picture | -| **Account & Role** | Contact owner, account, job title, department | +| **Account & Title** | Contact owner, account, job title, department | | **Buying Centre** | Buying function, attitude to us, relationship strength — see [The Buying Centre](./buying-centre) | | **Contact Information** | Email, phone, mobile | | **Mailing Address** | Mailing street, city, state/province, postal code and country — five separate fields | diff --git a/src/sales/objects/contact.object.ts b/src/sales/objects/contact.object.ts index a04a9c886..5e3eb3166 100644 --- a/src/sales/objects/contact.object.ts +++ b/src/sales/objects/contact.object.ts @@ -16,7 +16,7 @@ export const Contact = ObjectSchema.create({ fieldGroups: [ { key: 'identity', label: 'Identity', icon: 'user' }, - { key: 'account_info', label: 'Account & Role', icon: 'briefcase' }, + { key: 'account_info', label: 'Account & Title', icon: 'briefcase' }, { key: 'buying_centre', label: 'Buying Centre', icon: 'users' }, { key: 'contact_info', label: 'Contact Information', icon: 'phone' }, { key: 'mailing_address', label: 'Mailing Address', icon: 'map-pin', collapse: 'collapsed' }, diff --git a/src/sales/pages/app_launcher.page.ts b/src/sales/pages/app_launcher.page.ts index da2f3b1d8..7dee0a4b9 100644 --- a/src/sales/pages/app_launcher.page.ts +++ b/src/sales/pages/app_launcher.page.ts @@ -63,7 +63,6 @@ export const AppLauncherPage: Page = { ], isDefault: false, - assignedProfiles: ['sales_rep', 'sales_manager', 'service_agent', 'system_admin'], aria: { ariaLabel: 'App Launcher Page', diff --git a/src/sales/pages/home.page.ts b/src/sales/pages/home.page.ts index d5b89875e..91057e8e7 100644 --- a/src/sales/pages/home.page.ts +++ b/src/sales/pages/home.page.ts @@ -339,7 +339,6 @@ export const SalesHomePage: Page = { ], isDefault: true, - assignedProfiles: ['sales_rep', 'sales_manager'], aria: { ariaLabel: 'Sales Home Page', diff --git a/src/sales/pages/lead_detail.page.ts b/src/sales/pages/lead_detail.page.ts index b4cb583e2..edb8a947f 100644 --- a/src/sales/pages/lead_detail.page.ts +++ b/src/sales/pages/lead_detail.page.ts @@ -640,11 +640,6 @@ export const LeadDetailPage: Page = { // Make this the default page for leads isDefault: true, - // Assign to specific profiles. These must match the profile `name`s declared - // in src/profiles — `sales_user` / `system_administrator` never existed, so - // the assignment silently matched nobody. - assignedProfiles: ['sales_rep', 'sales_manager', 'system_admin'], - // ARIA accessibility aria: { ariaLabel: 'Lead Detail Page', diff --git a/src/sales/pages/opportunity_detail.page.ts b/src/sales/pages/opportunity_detail.page.ts index 11c36de8c..e4dcc2ba3 100644 --- a/src/sales/pages/opportunity_detail.page.ts +++ b/src/sales/pages/opportunity_detail.page.ts @@ -486,7 +486,6 @@ export const OpportunityDetailPage: Page = { ], isDefault: true, - assignedProfiles: ['sales_rep', 'sales_manager', 'system_admin'], aria: { ariaLabel: 'Opportunity Detail Page', diff --git a/src/sales/pages/utility_bar.page.ts b/src/sales/pages/utility_bar.page.ts index 735e7d83b..fd8815f84 100644 --- a/src/sales/pages/utility_bar.page.ts +++ b/src/sales/pages/utility_bar.page.ts @@ -54,7 +54,6 @@ export const UtilityBarPage: Page = { ], isDefault: false, - assignedProfiles: ['sales_rep', 'sales_manager', 'service_agent', 'system_admin'], aria: { ariaLabel: 'Utility Bar', diff --git a/src/sales/translations/en/objects.customer.ts b/src/sales/translations/en/objects.customer.ts index c6ce6f37a..b638694e8 100644 --- a/src/sales/translations/en/objects.customer.ts +++ b/src/sales/translations/en/objects.customer.ts @@ -202,7 +202,7 @@ export const customer: Record = { }, _sections: { identity: { label: 'Identity' }, - account_info: { label: 'Account & Role' }, + account_info: { label: 'Account & Title' }, buying_centre: { label: 'Buying Centre' }, contact_info: { label: 'Contact Information' }, mailing_address: { label: 'Mailing Address' }, diff --git a/src/sales/translations/es-ES/app.ts b/src/sales/translations/es-ES/app.ts index c475471d2..1ee9feccf 100644 --- a/src/sales/translations/es-ES/app.ts +++ b/src/sales/translations/es-ES/app.ts @@ -485,6 +485,11 @@ export const appSurface: Omit = { account_detail_page: { label: 'Detalle de Cuenta', description: 'Página de registro de cuenta por slots: cabecera personalizada + feed de discusión permanente.', + title: '{name}', + subtitle: '{industry} · {type}', + components: { + account_chatter: { label: 'Discusión' }, + }, }, account_workbench: { label: 'Mesa de Trabajo de Cuentas', @@ -507,6 +512,7 @@ export const appSurface: Omit = { components: { case_highlights: { label: 'Información Clave' }, case_status_path: { label: 'Progreso del Estado del Caso' }, + case_details: { label: 'Detalles del Caso' }, }, }, lead_detail_page: { @@ -520,6 +526,11 @@ export const appSurface: Omit = { lead_highlights: { label: 'Información Clave' }, lead_path: { label: 'Progreso del Estado del Prospecto' }, main_tabs: { label: 'Pestañas de Información del Prospecto' }, + lead_details: { label: 'Detalles del Prospecto' }, + related_accordion: { label: 'Registros Relacionados' }, + related_tasks: { title: 'Tareas Abiertas', label: 'Tareas' }, + lead_activity: { label: 'Cronología de Actividad' }, + lead_history: { label: 'Historial de Campos' }, }, }, opportunity_detail_page: { @@ -530,6 +541,7 @@ export const appSurface: Omit = { components: { opp_highlights: { label: 'Información Clave' }, opp_stage_path: { label: 'Progreso de Etapa de la Oportunidad' }, + opp_details: { label: 'Detalles de la Oportunidad' }, }, }, sales_home_page: { @@ -556,6 +568,9 @@ export const appSurface: Omit = { quick_create: { title: 'Creación Rápida', label: 'Creación Rápida' }, key_metrics: { title: 'Indicadores Clave de Rendimiento', label: 'Métricas Clave' }, home_tabs: { label: 'Pestañas de Inicio' }, + home_my_leads: { label: 'Mis Prospectos' }, + home_my_deals: { label: 'Mis Negocios Abiertos' }, + home_my_tasks: { label: 'Mis Tareas Abiertas' }, ai_briefing: { title: 'Pregúntale al Asistente de IA', description: diff --git a/src/sales/translations/ja-JP/app.ts b/src/sales/translations/ja-JP/app.ts index 26f0a136b..7581188c8 100644 --- a/src/sales/translations/ja-JP/app.ts +++ b/src/sales/translations/ja-JP/app.ts @@ -487,6 +487,11 @@ export const appSurface: Omit = { account_detail_page: { label: '取引先詳細', description: 'スロット構成の取引先レコードページ — カスタムヘッダーと常設のディスカッションフィード。', + title: '{name}', + subtitle: '{industry} · {type}', + components: { + account_chatter: { label: 'ディスカッション' }, + }, }, account_workbench: { label: '取引先ワークベンチ', @@ -509,6 +514,7 @@ export const appSurface: Omit = { components: { case_highlights: { label: '重要情報' }, case_status_path: { label: 'ケースステータスの進捗' }, + case_details: { label: 'ケース詳細情報' }, }, }, lead_detail_page: { @@ -522,6 +528,11 @@ export const appSurface: Omit = { lead_highlights: { label: '重要情報' }, lead_path: { label: 'リードステータスの進捗' }, main_tabs: { label: 'リード情報タブ' }, + lead_details: { label: 'リード詳細情報' }, + related_accordion: { label: '関連レコード' }, + related_tasks: { title: '未完了のタスク', label: 'タスク' }, + lead_activity: { label: '活動タイムライン' }, + lead_history: { label: '項目履歴' }, }, }, opportunity_detail_page: { @@ -532,6 +543,7 @@ export const appSurface: Omit = { components: { opp_highlights: { label: '重要情報' }, opp_stage_path: { label: '商談ステージの進捗' }, + opp_details: { label: '商談詳細情報' }, }, }, sales_home_page: { @@ -558,6 +570,9 @@ export const appSurface: Omit = { quick_create: { title: 'クイック作成', label: 'クイック作成' }, key_metrics: { title: '主要業績評価指標', label: '主要指標' }, home_tabs: { label: 'ホームタブ' }, + home_my_leads: { label: '私のリード' }, + home_my_deals: { label: '私のオープン商談' }, + home_my_tasks: { label: '私のオープンタスク' }, ai_briefing: { title: 'AI アシスタントに質問', description: diff --git a/src/sales/translations/zh-CN/app.ts b/src/sales/translations/zh-CN/app.ts index 45b832f03..5094e6938 100644 --- a/src/sales/translations/zh-CN/app.ts +++ b/src/sales/translations/zh-CN/app.ts @@ -486,6 +486,11 @@ export const appSurface: Omit = { account_detail_page: { label: '客户详情', description: '插槽式客户记录页——自定义页头 + 常驻讨论区。', + title: '{name}', + subtitle: '{industry} · {type}', + components: { + account_chatter: { label: '讨论' }, + }, }, account_workbench: { label: '客户工作台', @@ -508,6 +513,7 @@ export const appSurface: Omit = { components: { case_highlights: { label: '关键信息' }, case_status_path: { label: '工单状态进度' }, + case_details: { label: '工单明细' }, }, }, lead_detail_page: { @@ -521,6 +527,11 @@ export const appSurface: Omit = { lead_highlights: { label: '关键信息' }, lead_path: { label: '线索状态进度' }, main_tabs: { label: '线索信息标签页' }, + lead_details: { label: '线索明细' }, + related_accordion: { label: '相关记录' }, + related_tasks: { title: '待办任务', label: '任务' }, + lead_activity: { label: '活动时间线' }, + lead_history: { label: '字段历史' }, }, }, opportunity_detail_page: { @@ -531,6 +542,7 @@ export const appSurface: Omit = { components: { opp_highlights: { label: '关键信息' }, opp_stage_path: { label: '商机阶段进度' }, + opp_details: { label: '商机明细' }, }, }, sales_home_page: { @@ -557,6 +569,9 @@ export const appSurface: Omit = { quick_create: { title: '快速创建', label: '快速创建' }, key_metrics: { title: '关键绩效指标', label: '关键指标' }, home_tabs: { label: '主页标签页' }, + home_my_leads: { label: '我的线索' }, + home_my_deals: { label: '我的进行中商机' }, + home_my_tasks: { label: '我的待办任务' }, ai_briefing: { title: '询问 AI 助手', description: diff --git a/src/service/pages/case_detail.page.ts b/src/service/pages/case_detail.page.ts index 3ca6f9816..bf9be7fa3 100644 --- a/src/service/pages/case_detail.page.ts +++ b/src/service/pages/case_detail.page.ts @@ -305,7 +305,6 @@ export const CaseDetailPage: Page = { ], isDefault: true, - assignedProfiles: ['service_agent', 'system_admin'], aria: { ariaLabel: 'Case Detail Page', diff --git a/test/account-name-normalized-match.test.ts b/test/account-name-normalized-match.test.ts index 956c4a650..3d82fa90c 100644 --- a/test/account-name-normalized-match.test.ts +++ b/test/account-name-normalized-match.test.ts @@ -2,7 +2,7 @@ import { describe, it, expect, beforeAll, afterAll } from 'vitest'; import { AutomationEngine, installBuiltinNodes } from '@objectstack/service-automation'; -import { fieldHasColumn, expectedIndexes } from '@objectstack/driver-sql'; +import { fieldHasColumn, expectedIndexes, withheldFilterDiagnosticOf } from '@objectstack/driver-sql'; import { SqliteWasmDriver } from '@objectstack/driver-sqlite-wasm'; import { applySystemFields } from '@objectstack/objectql'; import stack from '../objectstack.config'; @@ -260,9 +260,17 @@ describe('premise: no filter operator expresses normalize-then-exact on SQL', () }; it('`$regex` is retired — the driver refuses it instead of guessing', async () => { - await expect(names({ name: { $regex: 'Acme Corp' } })).rejects.toThrow( - /\$regex.*RETIRED|RETIRED.*\$regex/is, + // Since 17.5 the thrown message withholds the operator and field (they are + // caller-controlled text); the full diagnostic rides on the error and is + // read back with `withheldFilterDiagnosticOf`. Pin both halves. + const err = await names({ name: { $regex: 'Acme Corp' } }).then( + () => null, + (e: unknown) => e, ); + expect(err).toBeInstanceOf(Error); + expect((err as Error).message).toMatch(/RETIRED/); + expect((err as Error).message).not.toMatch(/\$regex/); + expect(withheldFilterDiagnosticOf(err)).toMatch(/\$regex.*RETIRED|RETIRED.*\$regex/is); }); it('`$icontains`, the declared replacement, matches a SUPERSTRING — not an exact match', async () => { From d75d5b8b2bc420b3501a3352c47ac9a0d7cdeca2 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 29 Sep 2026 13:14:22 +0000 Subject: [PATCH 3/4] fix(i18n): gate hint names `--no-objects-only`; correct the 17.5 changeset's i18n claims `os i18n extract` does scaffold page keys, but only with `--no-objects-only`, because its default covers objects alone. The i18n gate's failure hint gave the bare command, which does not produce the page keys that the 17.5 `i18n/missing-page` rule asks for. The hint now gives the full command and explains why. Correct the changeset on two points: - it said extract cannot scaffold page keys, which is wrong; - it said the nested components showed English before this change. A zh-CN browser check of Lead Detail on 17.5.0 found none of those labels drawn as visible text, so readers see no change. Claude-Session: https://claude.ai/code/session_014VGCS11YUtYAiinRcdqQwL Co-authored-by: Claude --- .changeset/objectstack-17-5-0.md | 9 +++++++-- scripts/check-lint-i18n-gate.mjs | 7 ++++++- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.changeset/objectstack-17-5-0.md b/.changeset/objectstack-17-5-0.md index 247cf7c1c..d32e8d02a 100644 --- a/.changeset/objectstack-17-5-0.md +++ b/.changeset/objectstack-17-5-0.md @@ -85,8 +85,13 @@ The platform changes that reached this app: - the Lead Detail related, activity and field-history panels; - the three "My …" lists on Sales Home. - Before this change those components showed English in every locale. - `os i18n extract` does not scaffold page keys, so the keys were added by hand. + These labels name the components. In a zh-CN browser check of Lead Detail on + 17.5.0 none of them is drawn as visible text: the visible headings come from + the tab items and the object's field groups, which were already translated. + So readers should see no change. The keys exist to satisfy the new lint rule. + `os i18n extract` scaffolds page keys only with `--no-objects-only`, since its + default covers objects alone. The i18n gate's failure hint now gives that + command instead of the bare one. - **One driver test reads the withheld filter diagnostic.** 17.5.0's SQL drivers no longer put caller-supplied operator and field names in the thrown message of a refused filter. The full text rides on the error, and diff --git a/scripts/check-lint-i18n-gate.mjs b/scripts/check-lint-i18n-gate.mjs index 498f909a5..db7ea736d 100644 --- a/scripts/check-lint-i18n-gate.mjs +++ b/scripts/check-lint-i18n-gate.mjs @@ -141,7 +141,12 @@ export function main(argv = process.argv.slice(2), { log = console.log, error = '(non-default-locale misses are warnings, not errors) — see #1018. Run:' ); error(' pnpm exec objectstack lint --json'); - error('to see the full report, or `pnpm exec objectstack i18n extract` to scaffold the missing keys.'); + error('to see the full report, or scaffold the missing keys with'); + error(' pnpm exec objectstack i18n extract --no-objects-only --no-metadata-forms --locales='); + error( + '(the default `--objects-only` covers objects only — page, app and dashboard keys ' + + 'need `--no-objects-only`).' + ); return 1; } From e91e1b343dc1c6167cc56fb603a29b67f96beda7 Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 30 Sep 2026 06:06:30 +0000 Subject: [PATCH 4/4] test: retire the two page.assignedProfiles checks; note the 17.5.0 grouped-list known issue Delete the two tests that checked the key this upgrade retires. The maintainer made the call. - "assignedProfiles name real profiles" in test/metadata-references.test.ts. - "every related list is readable by every profile its page is assigned to" in test/authorization-coverage.test.ts. spec 17.5.0 refuses `page.assignedProfiles`, so no page can declare it and both tests ran over zero pages. Remove the helpers that only they used (the `profileNames` import, the local `pages` list) and the header comments that described their checks. The changeset now also records the known 17.5.0 issue: the Products, Knowledge Articles and Forecasts default lists fail in every group. It is fixed upstream (objectui#11105, PR objectui#11119) and lands with the next platform release. Claude-Session: https://claude.ai/code/session_014VGCS11YUtYAiinRcdqQwL Co-authored-by: Claude --- .changeset/objectstack-17-5-0.md | 20 +++++++++++++++++--- test/authorization-coverage.test.ts | 24 +----------------------- test/metadata-references.test.ts | 23 ++++++----------------- 3 files changed, 24 insertions(+), 43 deletions(-) diff --git a/.changeset/objectstack-17-5-0.md b/.changeset/objectstack-17-5-0.md index d32e8d02a..010deeaa3 100644 --- a/.changeset/objectstack-17-5-0.md +++ b/.changeset/objectstack-17-5-0.md @@ -67,9 +67,12 @@ The platform changes that reached this app: are *App Launcher*, *Sales Home*, *Utility Bar*, *Lead Detail*, *Opportunity Detail* and *Case Detail*. Deleting the key keeps that behaviour. The platform gates what a page shows through the object permission sets, which HotCRM - already declares. `test/metadata-references.test.ts` and - `test/authorization-coverage.test.ts` still check any `assignedProfiles` a - page declares, and no page declares one now. + already declares. Two tests checked the retired key and are deleted with it. + One was "assignedProfiles name real profiles" in + `test/metadata-references.test.ts`. The other was "every related list is + readable by every profile its page is assigned to" in + `test/authorization-coverage.test.ts`. With no page able to declare the key, + both ran over zero pages and could no longer fail. - **The contact form section *Account & Role* is now *Account & Title*.** 17.5.0 adds the author-time rule `security-role-word`: "role" is a reserved word in labels, because the platform no longer has a Role concept. The section @@ -103,3 +106,14 @@ The platform changes that reached this app: pin it was measured on. None was re-measured on 17.5.0 in this change. Four stale "current pin 17.3.0" claims that the 17.4.0 sweep missed are re-scoped the same way. + +**Known issue on 17.5.0, fixed upstream but not yet released.** The *Products*, +*Knowledge Articles* and *Forecasts* default lists show +`Unknown field '[object Object]'` (`INVALID_FIELD`) in every group instead of +rows. On 17.5.0 the +console fetches grouped rows from the server, and the query it builds for a +view whose `columns` are objects sends the objects instead of field names. The +same views work on 17.4.0. HotCRM's views are valid and are left unchanged. The +fix is objectui#11105 (PR objectui#11119, merged). It reaches HotCRM with the +first platform release whose `@objectstack/console` carries it, and HotCRM then +needs only a pin bump. diff --git a/test/authorization-coverage.test.ts b/test/authorization-coverage.test.ts index 5aee4f3f5..377636505 100644 --- a/test/authorization-coverage.test.ts +++ b/test/authorization-coverage.test.ts @@ -26,14 +26,13 @@ import stack from '../objectstack.config'; * `crm_campaign_member` rows that action inserts. * * These tests resolve the whole authorization surface (grants ↔ objects ↔ - * navigation ↔ pages ↔ sharing rules ↔ positions) so the next uncovered object + * navigation ↔ sharing rules ↔ positions) so the next uncovered object * fails in CI instead of at a customer's first click. */ type AnyRec = Record; const objects: AnyRec[] = (stack as any).objects ?? []; -const pages: AnyRec[] = (stack as any).pages ?? []; const apps: AnyRec[] = (stack as any).apps ?? []; const permissionSets: AnyRec[] = (stack as any).permissions ?? []; const sharingRules: AnyRec[] = (stack as any).sharingRules ?? []; @@ -151,27 +150,6 @@ describe('reachable UI is reachable for someone', () => { expect(bad, `dead navigation (permission-denied for every user):\n ${bad.join('\n ')}`) .toEqual([]); }); - - it('every related list is readable by every profile its page is assigned to', () => { - const bad: string[] = []; - for (const page of pages) { - const assigned: string[] = page.assignedProfiles ?? []; - if (assigned.length === 0) continue; - for (const c of [...walk(page.regions), ...walk(page.slots)]) { - if (c.type !== 'record:related_list') continue; - const objectName = c.properties?.objectName as string; - if (!objectName || objectName.startsWith('sys_')) continue; - const readers = new Set(setsGranting(objectName, 'read')); - for (const profile of assigned) { - if (!readers.has(profile)) { - bad.push(`${page.name} / ${c.id}: "${objectName}" is not readable by "${profile}"`); - } - } - } - } - expect(bad, `related lists denied to their own page audience:\n ${bad.join('\n ')}`) - .toEqual([]); - }); }); describe('record-level scope is authored, not implied', () => { diff --git a/test/metadata-references.test.ts b/test/metadata-references.test.ts index 44d002a0e..d98da5f2c 100644 --- a/test/metadata-references.test.ts +++ b/test/metadata-references.test.ts @@ -10,7 +10,6 @@ import { pages, views, objectNames, - profileNames, PLATFORM_OBJECTS, fieldsOf, walk, @@ -21,13 +20,13 @@ import { * * `os validate` / `build` check metadata SHAPE — that a page declares a * `relationshipField`, that a view section lists `fields` — but never that the - * named field, object, or profile actually exists. Every reference below was a - * real defect found by clicking through the app, and each failed silently: the - * related list rendered "0", the form section rendered blank, the profile - * assignment matched nobody. Nothing errored, so nothing was noticed. + * named field or object actually exists. Every reference below was a real + * defect found by clicking through the app, and each failed silently: the + * related list rendered "0", the form section rendered blank. Nothing errored, + * so nothing was noticed. * - * These tests resolve every UI reference against the objects/profiles the app - * really defines, so the next bad name fails in CI instead of in a demo. + * These tests resolve every UI reference against the objects the app really + * defines, so the next bad name fails in CI instead of in a demo. * * --- * @@ -584,16 +583,6 @@ describe('page component references resolve', () => { expect(bad, `dangling path stages:\n ${bad.join('\n ')}`).toEqual([]); }); - it('assignedProfiles name real profiles', () => { - const bad: string[] = []; - for (const page of pages) { - for (const p of page.assignedProfiles ?? []) { - if (!profileNames.has(p)) bad.push(`${page.name}: profile "${p}" is not defined`); - } - } - expect(bad, `dangling profile assignments:\n ${bad.join('\n ')}`).toEqual([]); - }); - /** * Container types that render only what they are given. *