From 55c1d1c3e9f0c701c93afee62e2251192dbb86fb Mon Sep 17 00:00:00 2001 From: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com> Date: Sat, 1 Aug 2026 01:12:32 +0800 Subject: [PATCH 1/3] feat: upgrade ObjectStack to 17.0.0-rc.1 --- .changeset/upgrade-objectstack-v17-rc.md | 8 + CHANGELOG.md | 1 + content/docs/customization/ai-skills.mdx | 4 +- .../docs/customization/ai-skills.zh-Hans.mdx | 4 +- .../docs/customization/ai-skills.zh-Hant.mdx | 4 +- docs/STATUS.md | 2 +- docs/developers/code_examples.md | 8 +- objectstack.config.ts | 3 +- objectstack.manifest.json | 4 +- package.json | 22 +- pnpm-lock.yaml | 1423 ++++++++++------- src/dashboards/crm.dashboard.ts | 2 +- src/dashboards/sales.dashboard.ts | 2 +- src/dashboards/service.dashboard.ts | 2 +- src/datasets/account.dataset.ts | 4 +- src/datasets/case.dataset.ts | 6 +- src/datasets/lead.dataset.ts | 6 +- src/datasets/opportunity.dataset.ts | 37 +- src/flows/campaign-enrollment.flow.ts | 4 +- src/flows/case-actions.flow.ts | 3 + src/flows/case-csat-followup.flow.ts | 4 +- src/flows/case-escalation.flow.ts | 4 +- src/flows/case-sla-monitor.flow.ts | 4 +- src/flows/contact-welcome.flow.ts | 4 +- src/flows/contract-expiration.flow.ts | 4 +- src/flows/contract-renewal.flow.ts | 4 +- src/flows/lead-assignment.flow.ts | 8 +- src/flows/lead-conversion.flow.ts | 4 +- src/flows/opportunity-approval.flow.ts | 8 +- src/flows/opportunity-stagnation.flow.ts | 4 +- src/flows/opportunity-won-alert.flow.ts | 4 +- src/flows/quote-generation.flow.ts | 4 +- src/flows/task-due-reminder.flow.ts | 4 +- src/flows/task-urgent-alert.flow.ts | 4 +- src/objects/account.object.ts | 5 +- src/objects/campaign.object.ts | 6 +- src/objects/campaign_member.object.ts | 2 + src/objects/case.object.ts | 4 + src/objects/contact.object.ts | 4 + src/objects/contract.object.ts | 9 +- src/objects/forecast.object.ts | 6 +- src/objects/knowledge_article.object.ts | 5 +- src/objects/lead.object.ts | 5 + src/objects/opportunity.object.ts | 9 +- src/objects/opportunity_line_item.object.ts | 4 + src/objects/product.object.ts | 4 +- src/objects/quote.object.ts | 7 +- src/objects/quote_line_item.object.ts | 4 + src/objects/task.object.ts | 3 + src/reports/case.report.ts | 8 +- src/reports/lead.report.ts | 7 +- src/reports/opportunity.report.ts | 16 +- src/skills/case-triage.skill.ts | 7 - src/skills/customer-360.skill.ts | 6 - src/skills/email-drafting.skill.ts | 7 - src/skills/lead-qualification.skill.ts | 8 - src/skills/live-data.skill.ts | 11 - src/skills/revenue-forecasting.skill.ts | 8 - src/translations/en.ts | 2 - src/translations/es-ES.ts | 2 - src/translations/ja-JP.ts | 2 - src/translations/zh-CN.ts | 10 - src/views/case.view.ts | 7 +- src/views/lead.view.ts | 10 +- src/views/opportunity.view.ts | 5 +- test/action-sandbox.test.ts | 7 +- test/hook-query-predicate.test.ts | 35 +- 67 files changed, 1003 insertions(+), 845 deletions(-) create mode 100644 .changeset/upgrade-objectstack-v17-rc.md diff --git a/.changeset/upgrade-objectstack-v17-rc.md b/.changeset/upgrade-objectstack-v17-rc.md new file mode 100644 index 00000000..622c4b7d --- /dev/null +++ b/.changeset/upgrade-objectstack-v17-rc.md @@ -0,0 +1,8 @@ +--- +'hotcrm': minor +--- + +Upgrade HotCRM to ObjectStack 17.0.0-rc.1. The app now declares protocol 17 +compatibility, preserves existing required-field database constraints explicitly, +uses the live metadata contracts for skills, flows, and APIs, and enables the +date buckets that make CRM analytics aggregate by month, day, and quarter. diff --git a/CHANGELOG.md b/CHANGELOG.md index c4ed9f1a..1e4628c9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Everything merged after the 2.2.2 tag. Not yet versioned or published. ### Changed +- **ObjectStack platform → 17.0.0-rc.1** across all `@objectstack/*` packages (from 16.1.0). The manifest protocol handshake and marketplace `specVersion` now declare the 17.0.0-rc.1 compatibility line; API methods, skills and flow notifications use only live metadata keys; pre-17 required fields preserve their database `NOT NULL` constraints explicitly; and the analytics semantic layer now declares the month/day/quarter buckets v17 executes correctly. - **ObjectStack platform → 16.1.0 stable** across all `@objectstack/*` packages (from the 16.0.0-rc.1 line pinned in 2.2.0). [#465](https://github.com/objectstack-ai/hotcrm/pull/465) - CI: bump `actions/checkout` 4 → 7 ([#422](https://github.com/objectstack-ai/hotcrm/pull/422)) and `actions/setup-node` 4 → 6 ([#421](https://github.com/objectstack-ai/hotcrm/pull/421)). - Docs: README hero states HotCRM's size in tokens ([#483](https://github.com/objectstack-ai/hotcrm/pull/483)); drifted README counts fixed ([#466](https://github.com/objectstack-ai/hotcrm/pull/466)). diff --git a/content/docs/customization/ai-skills.mdx b/content/docs/customization/ai-skills.mdx index 5daf8f5d..34265944 100644 --- a/content/docs/customization/ai-skills.mdx +++ b/content/docs/customization/ai-skills.mdx @@ -19,10 +19,8 @@ export const RenewalPitchSkill = defineSkill({ description: 'Drafts renewal talk tracks from account and contract context.', instructions: `When asked for a renewal pitch, inspect the current account and contract records, summarize risk, and draft a concise -customer-facing talk track.`, + customer-facing talk track.`, tools: ['describe_object', 'query_records'], - triggerPhrases: ['draft renewal pitch', 'renewal talk track'], - permissions: ['crm:account:read'], }); ``` diff --git a/content/docs/customization/ai-skills.zh-Hans.mdx b/content/docs/customization/ai-skills.zh-Hans.mdx index 80bd633d..7fa4b5ae 100644 --- a/content/docs/customization/ai-skills.zh-Hans.mdx +++ b/content/docs/customization/ai-skills.zh-Hans.mdx @@ -19,10 +19,8 @@ export const RenewalPitchSkill = defineSkill({ description: 'Drafts renewal talk tracks from account and contract context.', instructions: `When asked for a renewal pitch, inspect the current account and contract records, summarize risk, and draft a concise -customer-facing talk track.`, + customer-facing talk track.`, tools: ['describe_object', 'query_records'], - triggerPhrases: ['draft renewal pitch', 'renewal talk track'], - permissions: ['crm:account:read'], }); ``` diff --git a/content/docs/customization/ai-skills.zh-Hant.mdx b/content/docs/customization/ai-skills.zh-Hant.mdx index 5c26b3b8..6eb89392 100644 --- a/content/docs/customization/ai-skills.zh-Hant.mdx +++ b/content/docs/customization/ai-skills.zh-Hant.mdx @@ -19,10 +19,8 @@ export const RenewalPitchSkill = defineSkill({ description: 'Drafts renewal talk tracks from account and contract context.', instructions: `When asked for a renewal pitch, inspect the current account and contract records, summarize risk, and draft a concise -customer-facing talk track.`, + customer-facing talk track.`, tools: ['describe_object', 'query_records'], - triggerPhrases: ['draft renewal pitch', 'renewal talk track'], - permissions: ['crm:account:read'], }); ``` diff --git a/docs/STATUS.md b/docs/STATUS.md index 2a8f8562..6cf11848 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -45,7 +45,7 @@ pnpm verify | --- | --- | | Node.js | `>=22` | | pnpm | `>=10.0.0` | -| ObjectStack packages | `16.1.0` | +| ObjectStack packages | `17.0.0-rc.1` | | Local dev port | `4001` | ## Current Metadata Inventory diff --git a/docs/developers/code_examples.md b/docs/developers/code_examples.md index ba7c261e..2d50f478 100644 --- a/docs/developers/code_examples.md +++ b/docs/developers/code_examples.md @@ -203,7 +203,6 @@ export const WarrantySummarySkill = defineSkill({ summarize status, identify expired or soon-expiring warranties, and recommend the next action.`, tools: ['describe_object', 'query_records'], - triggerPhrases: ['summarize warranties', 'warranty risk'], }); ``` @@ -222,7 +221,7 @@ sources resolve, and only two: `query_records`, `query_data`, `get_record`, `aggregate_data`, `search_knowledge` and `visualize_data`. From 17.0 the authoritative set is exported as `PLATFORM_PROVIDED_TOOL_NAMES` from `@objectstack/spec/system`; - on 16.1.0 it is transcribed into `test/skills-integrity.test.ts`. Note + before 17.0 it is transcribed into `test/skills-integrity.test.ts`. Note `search_knowledge` retrieves over a *declared knowledge source*, and there is currently nowhere in a skills-only app to declare one. - **`action_`** — materialised from an Action that opts in with @@ -239,6 +238,11 @@ Note there is no `permissions` key on a skill — `SkillSchema` has no such fiel so one is silently stripped ([#511](https://github.com/objectstack-ai/hotcrm/pull/511)). Gate access on the Actions the skill calls instead. +Likewise, `triggerPhrases` was removed in 17.0 because the runtime never used +it. Describe a skill's intended requests in its `description` and +`instructions`, and use `triggerConditions` only when routing needs an +explicit context predicate. + ## Common Registration Points | New metadata | Add file under | Export from | diff --git a/objectstack.config.ts b/objectstack.config.ts index 367a21ec..166208a1 100644 --- a/objectstack.config.ts +++ b/objectstack.config.ts @@ -41,7 +41,7 @@ export default defineStack({ // `objectstack migrate meta` replay) instead of failing deep in a schema // parse. Bump together with `specVersion` on every platform upgrade // (docs/MAINTENANCE.md §3). - engines: { protocol: '^16.0.0' }, + engines: { protocol: '^17.0.0-rc.1' }, }, // ─── Platform capabilities this app needs ───────────────────────── @@ -106,7 +106,6 @@ export default defineStack({ defaultLocale: 'en', supportedLocales: ['en', 'zh-CN', 'ja-JP', 'es-ES'], fallbackLocale: 'en', - fileOrganization: 'per_locale', }, translations: Object.values(translations), diff --git a/objectstack.manifest.json b/objectstack.manifest.json index 3e1bf188..b8c72476 100644 --- a/objectstack.manifest.json +++ b/objectstack.manifest.json @@ -1,9 +1,9 @@ { "$schema": "https://schemas.objectstack.dev/template-manifest.json", "name": "hotcrm", - "specVersion": "^16.0.0-rc.1", + "specVersion": "^17.0.0-rc.1", "engines": { - "protocol": "^16.0.0" + "protocol": "^17.0.0-rc.1" }, "manifestId": "app.objectstack.hotcrm", "displayName": "HotCRM", diff --git a/package.json b/package.json index dd06726a..0c72e53f 100644 --- a/package.json +++ b/package.json @@ -32,17 +32,17 @@ }, "packageManager": "pnpm@10.33.0", "dependencies": { - "@objectstack/account": "16.1.0", - "@objectstack/cli": "16.1.0", - "@objectstack/driver-memory": "16.1.0", - "@objectstack/driver-sql": "16.1.0", - "@objectstack/driver-sqlite-wasm": "16.1.0", - "@objectstack/metadata": "16.1.0", - "@objectstack/objectql": "16.1.0", - "@objectstack/runtime": "16.1.0", - "@objectstack/service-analytics": "16.1.0", - "@objectstack/service-automation": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/account": "17.0.0-rc.1", + "@objectstack/cli": "17.0.0-rc.1", + "@objectstack/driver-memory": "17.0.0-rc.1", + "@objectstack/driver-sql": "17.0.0-rc.1", + "@objectstack/driver-sqlite-wasm": "17.0.0-rc.1", + "@objectstack/metadata": "17.0.0-rc.1", + "@objectstack/objectql": "17.0.0-rc.1", + "@objectstack/runtime": "17.0.0-rc.1", + "@objectstack/service-analytics": "17.0.0-rc.1", + "@objectstack/service-automation": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "optionalDependencies": { "better-sqlite3": "^12.11.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b261d7a6..311a29d8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,38 +9,38 @@ importers: .: dependencies: '@objectstack/account': - specifier: 16.1.0 - version: 16.1.0(vitest@4.1.10) + specifier: 17.0.0-rc.1 + version: 17.0.0-rc.1(vitest@4.1.10) '@objectstack/cli': - specifier: 16.1.0 - version: 16.1.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.1)(vitest@4.1.10) + specifier: 17.0.0-rc.1 + version: 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) '@objectstack/driver-memory': - specifier: 16.1.0 - version: 16.1.0 + specifier: 17.0.0-rc.1 + version: 17.0.0-rc.1 '@objectstack/driver-sql': - specifier: 16.1.0 - version: 16.1.0 + specifier: 17.0.0-rc.1 + version: 17.0.0-rc.1 '@objectstack/driver-sqlite-wasm': - specifier: 16.1.0 - version: 16.1.0(better-sqlite3@12.11.1) + specifier: 17.0.0-rc.1 + version: 17.0.0-rc.1(better-sqlite3@12.11.1) '@objectstack/metadata': - specifier: 16.1.0 - version: 16.1.0(vitest@4.1.10) + specifier: 17.0.0-rc.1 + version: 17.0.0-rc.1(vitest@4.1.10) '@objectstack/objectql': - specifier: 16.1.0 - version: 16.1.0(vitest@4.1.10) + specifier: 17.0.0-rc.1 + version: 17.0.0-rc.1(vitest@4.1.10) '@objectstack/runtime': - specifier: 16.1.0 - version: 16.1.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.1)(vitest@4.1.10) + specifier: 17.0.0-rc.1 + version: 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) '@objectstack/service-analytics': - specifier: 16.1.0 - version: 16.1.0 + specifier: 17.0.0-rc.1 + version: 17.0.0-rc.1 '@objectstack/service-automation': - specifier: 16.1.0 - version: 16.1.0 + specifier: 17.0.0-rc.1 + version: 17.0.0-rc.1 '@objectstack/spec': - specifier: 16.1.0 - version: 16.1.0 + specifier: 17.0.0-rc.1 + version: 17.0.0-rc.1 devDependencies: '@changesets/cli': specifier: ^2.31.1 @@ -96,8 +96,8 @@ packages: resolution: {integrity: sha512-6zABk/ECA/QYSCQ1NGiVwwbQerUCZ+TQbp64Q3AgmfNvurHH0j8TtXa1qbShXA6qqkpAj4V5W8pP6mLe1mcMqA==} engines: {node: '>=18'} - '@better-auth/core@1.7.0-rc.1': - resolution: {integrity: sha512-qwVJ5LBPAp8FhhRbUzJDv8cp6h6sn266PPJIXBhB2aYXee40/VGpyoTmx9+LmOotOLQ4BWSO5rCSDvS8FGVdEQ==} + '@better-auth/core@1.7.0-rc.2': + resolution: {integrity: sha512-NreNGg68j4qUVVYTcC1DtvRTwSJdCavH5igrMyTO5ghZxnzL4G539uRIzOZmJ64MLzOyOwzWH+JHqpVaj0ZRxw==} peerDependencies: '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 @@ -113,55 +113,55 @@ packages: '@opentelemetry/api': optional: true - '@better-auth/drizzle-adapter@1.7.0-rc.1': - resolution: {integrity: sha512-r2PjeNFZpWwkW9hvMyE+sgqzYPm3+pB7wE6+aL/iVl0SumqJns1fTFZiqTlQP67AUhJHO2Oelra+WdrtEE0v5Q==} + '@better-auth/drizzle-adapter@1.7.0-rc.2': + resolution: {integrity: sha512-o6HCC8PCyvg1/BQaNWvJM7kO8svXWvuM++APj7ah+iEfFWcp0yklNQWLijDLu+PAaoKHwNMgDpmclDruirHdPA==} peerDependencies: - '@better-auth/core': ^1.7.0-rc.1 + '@better-auth/core': ^1.7.0-rc.2 '@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.0-rc.1': - resolution: {integrity: sha512-8ykUlvqJERPJj3fohgc66VA091tGNiZlw0Pr4YnChr4n7bSqI6P/9bic1g6+XiGz10Li4t0qGcyqBpXKJb/iTw==} + '@better-auth/kysely-adapter@1.7.0-rc.2': + resolution: {integrity: sha512-g65JeOOseffsqHJXOM0/+SdPvojXzFPejVEFKuUatkdfXcw/l0zEiEkH38Ag5SWFaqfvog/wRPY/MK8PC/ODvg==} peerDependencies: - '@better-auth/core': ^1.7.0-rc.1 + '@better-auth/core': ^1.7.0-rc.2 '@better-auth/utils': 0.4.2 kysely: ^0.28.17 || ^0.29.0 peerDependenciesMeta: kysely: optional: true - '@better-auth/memory-adapter@1.7.0-rc.1': - resolution: {integrity: sha512-CyGMXZNCLQ531K4mhdSfhAjXXh+R+ybX/Xss2u9ZYs7un5XZbL+gC5rTGNPktV3KcEHPG60/om7x3bH4jMPi6g==} + '@better-auth/memory-adapter@1.7.0-rc.2': + resolution: {integrity: sha512-ACP69pbSDnIYYcx/KEtRXpFmte6q0Adh3028pRP5aDydkmbcCc7cFiwnRMQuI/MY7aBfW0wefEbcEwOse61Hcg==} peerDependencies: - '@better-auth/core': ^1.7.0-rc.1 + '@better-auth/core': ^1.7.0-rc.2 '@better-auth/utils': 0.4.2 - '@better-auth/mongo-adapter@1.7.0-rc.1': - resolution: {integrity: sha512-nJEythD9d9rsEPCb3awTSrYn+heLDAReTyBQrfxOC5HYv+m+ekElE8Fy/XuFzENw+7qyY0V7LlfGK7JYhL5XbQ==} + '@better-auth/mongo-adapter@1.7.0-rc.2': + resolution: {integrity: sha512-/QeC23KheruIamhu4XIqtPLcvupoDXmSpPB9QvmVqQcb5oVjAILJo6kIbZtq/JYbaHjrIO7mpdH6404hyv7weg==} peerDependencies: - '@better-auth/core': ^1.7.0-rc.1 + '@better-auth/core': ^1.7.0-rc.2 '@better-auth/utils': 0.4.2 mongodb: ^6.0.0 || ^7.0.0 peerDependenciesMeta: mongodb: optional: true - '@better-auth/oauth-provider@1.7.0-rc.1': - resolution: {integrity: sha512-992i44HfdHRDlMSnaapXMkMRKGyNxIMm5K//K2yiL0dErdtBB5s5q1PZI0Cm2/imzrOI6HP9UjUvy6lCDj6EHw==} + '@better-auth/oauth-provider@1.7.0-rc.2': + resolution: {integrity: sha512-fc3jCYwS/PaQyErOPqIUplqK456zhrmNWGnJPhDEF68merXBQN1OodUTzicZ3skFDpAv6MY3m5vk4D1Gz3R/oA==} peerDependencies: - '@better-auth/core': ^1.7.0-rc.1 + '@better-auth/core': ^1.7.0-rc.2 '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 - better-auth: ^1.7.0-rc.1 + better-auth: ^1.7.0-rc.2 better-call: 1.3.7 - '@better-auth/prisma-adapter@1.7.0-rc.1': - resolution: {integrity: sha512-d7J+VO7ZGnt20agKYDfA8XRi8Tzw4fekmzQTUzfkfd9EwYvOUx1Ed6cCjG7nsEPuHn49PLVtv+iX5Cfx2XF2kw==} + '@better-auth/prisma-adapter@1.7.0-rc.2': + resolution: {integrity: sha512-OFRJbg44ha2zD5lpXIKfoGBEwPe58YBhwIgKlfRuHpsZSpknaXOTvFIH2da8q8SK5L5mjYQ9vSsnX0oOf8gNDA==} peerDependencies: - '@better-auth/core': ^1.7.0-rc.1 + '@better-auth/core': ^1.7.0-rc.2 '@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 @@ -179,19 +179,19 @@ packages: better-auth: ^1.7.0-rc.1 better-call: 1.3.7 - '@better-auth/sso@1.7.0-rc.1': - resolution: {integrity: sha512-+v7y+NbuWKnQphSq6K9R3NzIwdpxsY3BSDcM2Z2EoLIMaKYJczR6L2NTf3medG1UYdZDbVLunZQ7RxWaO4pzoQ==} + '@better-auth/sso@1.7.0-rc.2': + resolution: {integrity: sha512-vn+WjTNMYWKX/jrrSCekv8Aia7uuhBlFcgUcwJpbSxCvD67uyNhN0W48ob+NKKY2vlT4nrDVESP2csxUXyUmtw==} peerDependencies: - '@better-auth/core': ^1.7.0-rc.1 + '@better-auth/core': ^1.7.0-rc.2 '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 - better-auth: ^1.7.0-rc.1 + better-auth: ^1.7.0-rc.2 better-call: 1.3.7 - '@better-auth/telemetry@1.7.0-rc.1': - resolution: {integrity: sha512-1lpODl12kDY3jA/46odeEtfC0u/UyPWAchtqIZq/JZVJGrnK5UCLwHRcSHYlkpHfZWXm7sXZYJ1vHJHKX66HCg==} + '@better-auth/telemetry@1.7.0-rc.2': + resolution: {integrity: sha512-sSZ+/FkG/axBjXVeF01LT+NQjT23TLwRwpdkcI8FJBWINNUCYhuxgdi05dv70MeX8iocfMhKxQ4EPgvt/eW/kQ==} peerDependencies: - '@better-auth/core': ^1.7.0-rc.1 + '@better-auth/core': ^1.7.0-rc.2 '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 @@ -427,12 +427,6 @@ packages: '@fast-csv/parse@4.3.6': resolution: {integrity: sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==} - '@hono/node-server@1.19.17': - resolution: {integrity: sha512-dSneS5qhiauZWGDCeK4o695Xd9nUNjviSZCMQrj10eetr8Uln1ucn6bbphOM6UynAMMtNIzZNSpL9vnASJwrPQ==} - engines: {node: '>=18.14.1'} - peerDependencies: - hono: ^4 - '@hono/node-server@2.0.12': resolution: {integrity: sha512-eWpQYr67tqJLeaSUl0Q+TquuYfUdTibpOJlUMV2FfUP7+KqCC5TufnwnlXL6mobZBJbGAYRd7ZvEBDCbLInjhg==} engines: {node: '>=20'} @@ -487,8 +481,8 @@ packages: engines: {node: '>=20.19.0'} hasBin: true - '@modelcontextprotocol/sdk@1.29.0': - resolution: {integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==} + '@modelcontextprotocol/sdk@1.30.0': + resolution: {integrity: sha512-xKd8OIzlqNzcqcNumGAa6g+PW2kjD5vrpcKOnfldAUPP3j7lnqMPwlTXQm8gF+UwH72z0lqaRbjr9hqGz0eITA==} engines: {node: '>=18'} peerDependencies: '@cfworker/json-schema': ^4.1.1 @@ -529,41 +523,41 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@objectstack/account@16.1.0': - resolution: {integrity: sha512-r2hVjXdSVKsFMWjfciogXb02WrFCgVzQ8dkz58dMKfY9vE2uVrNTPXk9BeTfR54amlU9Arw+J2ycDRZ3Xet7PA==} - engines: {node: '>=18.0.0'} + '@objectstack/account@17.0.0-rc.1': + resolution: {integrity: sha512-n1cI+ZtKdQotXohYjdFUSYWoLas9is4MbVpAbG/RVMra4iSp2EsYWUZnuOfuB9iZGEAcn0QW9IfQNzCRWszvVw==} + engines: {node: '>=22.0.0'} - '@objectstack/cli@16.1.0': - resolution: {integrity: sha512-P91RtoTNDj1L19k1JnITwGPIsjU0I360p7Ej1eUmL0YeGr5NM2whkHgA3mSQkEkgdjrlmkRJy9JLVlIniYnvEA==} - engines: {node: '>=18.0.0'} + '@objectstack/cli@17.0.0-rc.1': + resolution: {integrity: sha512-eirXq1GxshNwjNIczaud6SINZymo19CQB/zsSuJpV9Cy85oEhlnFSKrJKrDX3JVuZ2hNdhGgGxnFxksarI5wgw==} + engines: {node: '>=22.0.0'} hasBin: true - '@objectstack/client@16.1.0': - resolution: {integrity: sha512-Vj/90HiwmNfsFRa6gfP6p1wHQet7twQaJV4we3srvWVLosdN2zEKRaSKy9x4qVMCORe08vS+AXqPYEcGPQ2OWw==} - engines: {node: '>=18.0.0'} + '@objectstack/client@17.0.0-rc.1': + resolution: {integrity: sha512-3ZRNyx+lOx8C+LBBChhXZc22rWcMa5wufVRrGHc5Dfd42OZqn5AsbKjjhSZrHEfyoCvmeeENo9JGlej0R8RJ9Q==} + engines: {node: '>=22.0.0'} - '@objectstack/cloud-connection@16.1.0': - resolution: {integrity: sha512-0uUlDOr+2p2TtJ5/3w4fif9wcNAthS6ZFb4k1bJhBDfzDEZMiGPXpohueZfb5vvDBcXBvkL6CppJ17MMkYIjEQ==} - engines: {node: '>=18.0.0'} + '@objectstack/cloud-connection@17.0.0-rc.1': + resolution: {integrity: sha512-tKUJk966/hprzRoOmZRvJowXToNwG+ECtx7wq79bOxMYBVf4V9BHfIfCMw3adngyYSLn+YHYziL8RppkdzH79w==} + engines: {node: '>=22.0.0'} - '@objectstack/console@16.1.0': - resolution: {integrity: sha512-RQWDmqQDGJnkSRZY1Gxc1ZBtO0nbKa+yNzJenDYR/rdEZGbHhy7+w8LQzDRNYaigsiv0xk0eZaAb6mwOMK+9Cw==} + '@objectstack/console@17.0.0-rc.1': + resolution: {integrity: sha512-oSp9PM7QAjEwgNDK+Kq8CpT6835PeFOrRbARLbRE+fMr9WmofYxWJYuk/ShN4+HGo+b+0lNk2vkrX/o7gDg5zg==} - '@objectstack/core@16.1.0': - resolution: {integrity: sha512-10yG+jANw5y0GCe4If1ihXRuMdJjAeqrCyQMsG90zITsgNx00ThRoo84fZ+5okdqR3RUunk5bH0UGyBuqMik/g==} - engines: {node: '>=18.0.0'} + '@objectstack/core@17.0.0-rc.1': + resolution: {integrity: sha512-3snd0dJhd+MPEDek+YRapZ02siBnbxYNNl8GoyfnlSeEuKXdcY6bDBf/zueAwoTqyV32zNG5epA85cZh1zLQPw==} + engines: {node: '>=22.0.0'} - '@objectstack/driver-memory@16.1.0': - resolution: {integrity: sha512-NrtcLjU9JKJTdM4q7YlOVAhb2+8YXmKFzv+BpK8UhCe+BAjS1mVy+x/RWQvmCXpfh2IIWdTsiVm6MFxgp3QO4g==} - engines: {node: '>=18.0.0'} + '@objectstack/driver-memory@17.0.0-rc.1': + resolution: {integrity: sha512-OxQAuNjCZVASpys5DVNVo/kcFUhsXtytAjVqCWVqCZPPmCaZ925RFqbCfDbnDh+1JCEQ0HTFzj+t8AYCViS2oA==} + engines: {node: '>=22.0.0'} - '@objectstack/driver-mongodb@16.1.0': - resolution: {integrity: sha512-HI0+4pYbNiwX6D/Uz0OV27h2Qz1CR7d18YlTvmD7x6hs7c4myEOyP2NnEImsHSvV987ja3yIZBKG+rtCVG7+9Q==} - engines: {node: '>=18.0.0'} + '@objectstack/driver-mongodb@17.0.0-rc.1': + resolution: {integrity: sha512-zPzNcTPZ8LSsCvqF8q73iVMhtSxIRlW5gij3F+p9w1Lbr8/PuOkFoWn00P7NLtVhX+ki5AParIvLZxu/gIUHUA==} + engines: {node: '>=22.0.0'} - '@objectstack/driver-sql@16.1.0': - resolution: {integrity: sha512-A17OCREWqi7sglrXLfyauRley4Czd3iilq3EPt+uKxB+V4gpuQwCnstTEwAe6jbhu4v5mL6GM9v5Ff3HmOgS1g==} - engines: {node: '>=18.0.0'} + '@objectstack/driver-sql@17.0.0-rc.1': + resolution: {integrity: sha512-6uHyQ3GmKqSjL8Cr5u10TBWfOuOK9x2Ur97CwMbvO6ydECzKyztwVm3KVlsQIgmVA9WHLyYG+rYkjH+SSC4mJg==} + engines: {node: '>=22.0.0'} peerDependencies: mysql2: ^3.0.0 pg: ^8.0.0 @@ -576,151 +570,151 @@ packages: tedious: optional: true - '@objectstack/driver-sqlite-wasm@16.1.0': - resolution: {integrity: sha512-S2zlDY4Ex5ED9J58+NgFKoRAVveRwL3Y5Uq/ohVKW3fQmr+2wSod3tF03SYxav8fLEQaBU0HWqLdBBN1ovnX3g==} - engines: {node: '>=18.0.0'} + '@objectstack/driver-sqlite-wasm@17.0.0-rc.1': + resolution: {integrity: sha512-oz4Kt29T+ys06RO/PIJk1McT+rx/F5E+sBa507NaycWaLElM10GeoGZ/L7FWthZXMndkKN4qlGVG7uzbZrYzVQ==} + engines: {node: '>=22.0.0'} - '@objectstack/formula@16.1.0': - resolution: {integrity: sha512-uLSUGH5wj7UskXAHEF/RU0SYepWgMIOHij/WPBJRE6IXMyoARbVjZDmqbOLeluTDtJlz9irmwvCwjVBKMpghEw==} + '@objectstack/formula@17.0.0-rc.1': + resolution: {integrity: sha512-oAJENCl3QQcJA0484ScNdOU6EX5MEZ14pRF7sLITnoBkXGhgh/eMKboG+q6zLGJsZwS4ThPEu6sF72GVDlEmuw==} - '@objectstack/lint@16.1.0': - resolution: {integrity: sha512-yXlcJJbXjseZ3gXAtzVCMzL/fDT/66dSjnAR5xiVwYl7JcsALF1Lwtlu12dt/C9oN/gcyi7g9KSmlnSj4I4yxg==} - engines: {node: '>=18.0.0'} + '@objectstack/lint@17.0.0-rc.1': + resolution: {integrity: sha512-qIXylf5FsFhWAii0m+jQp49kZXlTnGXNz/cyZTrvqwJItI78k5afo3zKxZjmDreGRnAFIKXJLGLEDvZWjHgdFg==} + engines: {node: '>=22.0.0'} - '@objectstack/mcp@16.1.0': - resolution: {integrity: sha512-L1f3CeZCsBsN+Ydd2WWbKTz2flJuWLEbRqzsHBUQp+H8LqHGHKW03pbRw8xj3+ACcfKBC1tBS4EvSOjSrVPmoA==} - engines: {node: '>=18.0.0'} + '@objectstack/mcp@17.0.0-rc.1': + resolution: {integrity: sha512-lGPbHiiI861013hPbSt2Us/yd1jHNdRy/i6pkNsjzCuedOuSOGm7A/UtXHj3fBnryZOaiBJMLTeJg9UkBEALeA==} + engines: {node: '>=22.0.0'} - '@objectstack/metadata-core@16.1.0': - resolution: {integrity: sha512-FmCXhV9g03hKKhaIIZAQtiAITv8W7D+WnkwN9exhFY8dobFG3mBxMNlRO8PLyMvltHIFkaCxH/vSuzptWFvI0A==} - engines: {node: '>=18.0.0'} + '@objectstack/metadata-core@17.0.0-rc.1': + resolution: {integrity: sha512-ZU6d27sGnwRY8LXrWv1xHhaomPH/XswP1geyOxFgZtIimrbTgjIR56jZ8n7SBgjBw4zMWfbXF+YHNIXudnvDsg==} + engines: {node: '>=22.0.0'} peerDependencies: vitest: ^4.0.0 peerDependenciesMeta: vitest: optional: true - '@objectstack/metadata-fs@16.1.0': - resolution: {integrity: sha512-ND2Ln89ElyQEbuNp0UwTAp0gNyZ/tS2MWYINIDtp3nLYIWE0sB3itf24ZXEgf5sKCc2rIgSwkVr0iNMFtkbvMA==} - engines: {node: '>=18.0.0'} + '@objectstack/metadata-fs@17.0.0-rc.1': + resolution: {integrity: sha512-2zk5gzE982SAs6qtNjjdb3N3gNgzkcANQ6jL5h3/p4G4Hz51AxRXD/mvUI82ZYt0GsikvParYvqD8ISi+86lDw==} + engines: {node: '>=22.0.0'} - '@objectstack/metadata-protocol@16.1.0': - resolution: {integrity: sha512-1/I18/dYNaQC4TyVlV2Wjigg6WDYZzuwXK/PdDPM9pghR1/Tock4QCwzitGrpzd3qH8KVdAKQ6z58rpUNNU3Ag==} - engines: {node: '>=18.0.0'} + '@objectstack/metadata-protocol@17.0.0-rc.1': + resolution: {integrity: sha512-2XtShkp/f2W+koSwX4E4OmmKoZvkbjS3oh8JTwdgbqEgmTdQgafHiLrStr3CCzcpttmIlFUInQoTky8QYy62iQ==} + engines: {node: '>=22.0.0'} - '@objectstack/metadata@16.1.0': - resolution: {integrity: sha512-5P7BMBqy7I/JgHxUEaoMNtKL9XoHMj45895/EQBxb9j+tR5Aml80v7u25VFji8f7HyvRkntme5Wyh99LH0P/FA==} - engines: {node: '>=18.0.0'} + '@objectstack/metadata@17.0.0-rc.1': + resolution: {integrity: sha512-zXDeP9+zONVuwSaRL0IuaPfEjRHxISTyEBip77molWd0GQ/nQhtpj9T278DUvzAC1q5BEG3wXX985yHXMDboqg==} + engines: {node: '>=22.0.0'} - '@objectstack/objectql@16.1.0': - resolution: {integrity: sha512-V4zVwVqQDiKI4bdGSBls9SBIIk+Dj5IQnzqLT0JB3w9ETo2JzcjG1UVmliW/SWXKIkUJWJS42e8w0ivVTvLWYg==} - engines: {node: '>=18.0.0'} + '@objectstack/objectql@17.0.0-rc.1': + resolution: {integrity: sha512-+jXtGwGDLggNuNfjTy9LvF6dqgxBlyfzN/6gYQ2pmE97hZ9WU70E6H1oZRDEF4j391gBVxfTilhDxjgIGmh0ow==} + engines: {node: '>=22.0.0'} - '@objectstack/observability@16.1.0': - resolution: {integrity: sha512-nl1x4OARlJVXW0rcIY7H1BETTj/pUfH2n035eK3oAikwiRgf1Ea595ShKqLGH9tYHpHBrHO4P285N+K7m3GN3A==} - engines: {node: '>=18.0.0'} + '@objectstack/observability@17.0.0-rc.1': + resolution: {integrity: sha512-uqOt8i3H5lWk+grXdnU+d6zxr4yFGROQ9i9WILKUZbv6cP65tKKFSUwFIbL09Q6wjWYDo36SbenwCqKQADQjhw==} + engines: {node: '>=22.0.0'} - '@objectstack/platform-objects@16.1.0': - resolution: {integrity: sha512-W75mG1UrIExRgThSXgC9OSY0yJPULM4RmpS6SUDh2uChlYHM4VpXG9tjJA8LdGaLfYk/yvVHU8yJfS5UOQ7LNw==} - engines: {node: '>=18.0.0'} + '@objectstack/platform-objects@17.0.0-rc.1': + resolution: {integrity: sha512-SVMp3ZDrdpK39e8QDwfFuyd1yzSG7Bw45Ge4Hb36w8zpuuDOCAhqV+v30/yA+ZBXY/wt7GPEUb9AVgZUlXfcgA==} + engines: {node: '>=22.0.0'} - '@objectstack/plugin-approvals@16.1.0': - resolution: {integrity: sha512-IEudAyv/xkVDouLUl1Kow/BInpPUk+nNpfSX2Gu8oFl7jx/fLGrsuAigRNIOqkZlg6XdB3jic1BdQyTxXHhkAQ==} + '@objectstack/plugin-approvals@17.0.0-rc.1': + resolution: {integrity: sha512-VDyKGaVAJuVcW4WFNJET+NiExobbvfVOLkB3xZHhuzY+SQZNQfeypIBo+xT37+/KZdWKyif4O3V30za3uM7eXQ==} - '@objectstack/plugin-audit@16.1.0': - resolution: {integrity: sha512-vf/mZEdxV2fsPPK7Oo32UhekIL4EuuSQ4s6zek6xTuUTRFXCZYvriTPoXVU/lgbhvnVwsK6flpliTKPy1iT+5w==} - engines: {node: '>=18.0.0'} + '@objectstack/plugin-audit@17.0.0-rc.1': + resolution: {integrity: sha512-vm24oYZkUldz3X9iZ/tl79SQynIWBWlhONtLmPsKQHMJPOzN//KtU9VnWzZTJUdisDsrMI356zRlnnw49/Avcg==} + engines: {node: '>=22.0.0'} - '@objectstack/plugin-auth@16.1.0': - resolution: {integrity: sha512-XUVBzmb3Z2CLz002o2n+j3bRSJu69EEa02tFXFYYPNlAzHju9Yh809lfFYzKYeJ+yqq/e88rBrUdD7NHFzkbvg==} - engines: {node: '>=18.0.0'} + '@objectstack/plugin-auth@17.0.0-rc.1': + resolution: {integrity: sha512-xqJE38AR5SnC0cZPyqalttU7s1Kh8iLAL7rMYcG7tNhDuFNRROqUwCOFO3OXFb6yKeWatKiFc/dFz36C+h+DAA==} + engines: {node: '>=22.0.0'} - '@objectstack/plugin-email@16.1.0': - resolution: {integrity: sha512-V3l8682mSnQLwo2jlOXnISaHm0+6ie/y1DRolMKfnP5aKGFpAHXZHdP4vE+HQ61T8E4etFgjczTdSX3fkJYKqw==} + '@objectstack/plugin-email@17.0.0-rc.1': + resolution: {integrity: sha512-/DmIStXH9bB54k1TZ0LHQHBekp4zfxV6YBeYDyoXRftOCz9DpuoHIbXEEanBHZ9BwiNwApHNCbxCgjiFDODQ4A==} - '@objectstack/plugin-hono-server@16.1.0': - resolution: {integrity: sha512-7XBS0QWJLgTIi0b3KEzT7ZbbLCTDAbWF+5nDt4zrL4zTxWLbSVbmpSz7ACbQjhJj8ftqbVK8CZvp7/CR2aKIVg==} - engines: {node: '>=18.0.0'} + '@objectstack/plugin-hono-server@17.0.0-rc.1': + resolution: {integrity: sha512-oV+fqjPWDVHppIM8ICS3SvTIWn5JMFv57/CcpK8Ocjm1qphBMj2kzHVwOyIaDKIK7yS177eK8JxcQBu4pQHvbA==} + engines: {node: '>=22.0.0'} - '@objectstack/plugin-pinyin-search@16.1.0': - resolution: {integrity: sha512-TrTI+JmX86Ui6FzI8ahquSI9g6smj9QtPFT/mWkEqkmdH1V6vbYhLURSeeTK5oGnxcYOSm4Sb6ys9cy7xEyTIA==} + '@objectstack/plugin-pinyin-search@17.0.0-rc.1': + resolution: {integrity: sha512-VGuwSsaKQxIhc2Tb/pwK83gEFPdnKHMuolPSOuAuSG+zHlP0wYUOMbF5YKxH+czccc8fIwqogpXp2UcULsH5sQ==} - '@objectstack/plugin-reports@16.1.0': - resolution: {integrity: sha512-stZzhADvU6njLzK8Lv8ODUaFCmHskea9jHlfYzfp9rNQq4fZU4sFnDO/Dwo+K9YBEvWsnTKmi27Gc1fcgZZ+9Q==} + '@objectstack/plugin-reports@17.0.0-rc.1': + resolution: {integrity: sha512-3jSQ6Ckm4BfZB0rAiuOnJFQUTGbb28+AKBBaNGgrVG4odMJcmdcEWyXkYmOH7Rk+JrT7wG1/eGg0sOLdtuGBZA==} - '@objectstack/plugin-security@16.1.0': - resolution: {integrity: sha512-tIohnIaII4UvHd3ZtG7Z+ig2ykdLIZu8mFcra6OeBjUe1v3QbjiuYYjD+y16s30D3txSJeS/wmH3BnNJD4GjoQ==} - engines: {node: '>=18.0.0'} + '@objectstack/plugin-security@17.0.0-rc.1': + resolution: {integrity: sha512-E8PV0SrKustSQ4ztBIwU2jqgZRKPZx6XIgx5jwKnG+gZw2OqHsyW7ieD+5IKCbJTaPn+bZfb+QetDPIq9fsZig==} + engines: {node: '>=22.0.0'} - '@objectstack/plugin-sharing@16.1.0': - resolution: {integrity: sha512-CS9a4NdXO6SiviZw/As3ihMRLWS/J/v8SZg3GSy9+M4MKRWmLOV7VGBgXmPQouE+6/FQUZVTjuVX9oqMZvLm7g==} + '@objectstack/plugin-sharing@17.0.0-rc.1': + resolution: {integrity: sha512-lJcQfzxtNCPYuZIc65zWFdb/QWV+TkwAw1oR/3DXhuhg0JgwXiZx72vCfXG4W3KsOTMg2ADfUBWjZ0TXPLBWCA==} - '@objectstack/plugin-webhooks@16.1.0': - resolution: {integrity: sha512-1XQCpuJfbSiedu1L6L0jsmxMTJWG6n7JAFS10ofS3fVA9V2z3jeXHtaeIof5N+j6q1iCGAN4rQIcMysyqskRJQ==} + '@objectstack/plugin-webhooks@17.0.0-rc.1': + resolution: {integrity: sha512-qCKh1BIPjQmYGoZ7/iPyfQd9AjeFuEgl6XkfcEaM6SpowUU2NzWyUKYSZ+mVIvaMCKF0/1Z9ZjH6pMsUBlq0zg==} - '@objectstack/rest@16.1.0': - resolution: {integrity: sha512-FKFDM0HVGcAT19X5dgvTMugtKUKLwyzqBxgJ/xwmtOoVp/G3l0qJP+dBs3zBFp2AvOIP0MCEcqV1vcsDNO0rDA==} - engines: {node: '>=18.0.0'} + '@objectstack/rest@17.0.0-rc.1': + resolution: {integrity: sha512-r8/tFrwHAq9ZmykKdOOsTsXHABodmcIBP4GY1fQP19vTspj6j870VYgYtcgKNnlfjmPmz+zPli1CNFQ6ynNqBA==} + engines: {node: '>=22.0.0'} - '@objectstack/runtime@16.1.0': - resolution: {integrity: sha512-cYTZyS5QxKs81LC82QrlnH5S9pXaoK3eHYX1EJGaFr8CoUOzDXWpPqR3gWKlmoAkQJ2iRfys0ZyLz3ZxCx/pJA==} - engines: {node: '>=18.0.0'} + '@objectstack/runtime@17.0.0-rc.1': + resolution: {integrity: sha512-7hSg8e4c7TQ2/+TdVmuttWvtD/WfCicIMRZR2KSktGuUwC6MrfFQ7H1PeBIclQEIKz6lOYhPTsn76Ud6/hvXHQ==} + engines: {node: '>=22.0.0'} - '@objectstack/sdui-parser@16.1.0': - resolution: {integrity: sha512-GQm/+W09NHnja+p2MYTKVBJ9i+FvsWa6hmb1rHV8qiRYgtvXa0xSzypMxR6zIiJWkPslEPdcJaSqX0oEXPjMUw==} + '@objectstack/sdui-parser@17.0.0-rc.1': + resolution: {integrity: sha512-K96OHHU/HtBkumyKhNz+Sxnhvvy1wAtzQOjuTdwTDpUYLxJu3J3xqxoXPBQUh+FuYrTlxJq99CkhsSCjDrSLjA==} - '@objectstack/service-analytics@16.1.0': - resolution: {integrity: sha512-TfIbrkUC/UAg3+Iah5hjbnHBgbU8m5Q5fxvpkUZm/sHEDpOg10YT0cDPD5kz1cOVFJRQtj/DxxydAJ2xQwbw1Q==} - engines: {node: '>=18.0.0'} + '@objectstack/service-analytics@17.0.0-rc.1': + resolution: {integrity: sha512-1X8EEmsAlFQlYSrFO+V0LKaE7GtlNpm/S7EwBMASZxGYd73rbNrbVPiFp5J7iTEtT6rgi6XmdzocTOXbf/vuMQ==} + engines: {node: '>=22.0.0'} - '@objectstack/service-automation@16.1.0': - resolution: {integrity: sha512-nNUpF9OSTPnpv6jGuBtUh7a7u0iKUmL5pCAHbAr1u7gUpgHkPlGTeuxZ019s83dtNxWryej5U71CQaxs+sXn+Q==} - engines: {node: '>=18.0.0'} + '@objectstack/service-automation@17.0.0-rc.1': + resolution: {integrity: sha512-Gl15ZAt7GQtQLqpgU/gtu+CSydOH0AVvBGkc/O/11Scf/67nWKMSB5APysFrfT/z0MBg/IJh4pV3cTXL8LeV4Q==} + engines: {node: '>=22.0.0'} - '@objectstack/service-cache@16.1.0': - resolution: {integrity: sha512-5T7FF/IrIVQ6kmJmF+GvIvHrpGKHLupMfXQe/T74GOYo8M3OI+mSKzMphygscfTXOHcG5k9LmINR5AG5XGhejg==} - engines: {node: '>=18.0.0'} + '@objectstack/service-cache@17.0.0-rc.1': + resolution: {integrity: sha512-nCM9zZIIB+8pFSKjl5UOheLIu3sdb5l7TxfLJcVRe2s2hSwfAB7wrD/+onTum0S/GRyjajs1SaiQNhJExjUJ3w==} + engines: {node: '>=22.0.0'} - '@objectstack/service-cluster@16.1.0': - resolution: {integrity: sha512-9YolTHYCKRl/0kHIglyVsiDsSvRCUrJhM/DbgIn9H/KUaYWMun9e7JLm7NyX1RKb9EkK6l6XsW63GRtDt44oww==} + '@objectstack/service-cluster@17.0.0-rc.1': + resolution: {integrity: sha512-ThjOJ9pLzAUa41fNyGzq37B4Yc4UuIIz+z2tlxQlZpEBNxU8aZSBWzQIK0PTr1c31BMUrHx2xzNozJx8WIjq1g==} - '@objectstack/service-datasource@16.1.0': - resolution: {integrity: sha512-EUwXFKL2a3godfrJaMuinUzPzLr6Rkhfx6OtLpj4dtWaT2I0/AcYzCwl8Ni79DeRE6PaL5vb5LbKn3YTfQhadg==} + '@objectstack/service-datasource@17.0.0-rc.1': + resolution: {integrity: sha512-9ONxSN/n9I16VKiboy4SfLvZiqYWnOjLMKr2nOU1rM1/vyIeTfstn9XAnCO9J0AiZvkGDP/nJyBetPPm0ykT1Q==} - '@objectstack/service-i18n@16.1.0': - resolution: {integrity: sha512-2unXnYv7p+SSpTDRRRibGq4sNMeTHMshvvQLmPtx0nN2bgNUOmlDEiTx/x2Mg1VeayA/tH7gXKS5j7+l786IAg==} - engines: {node: '>=18.0.0'} + '@objectstack/service-i18n@17.0.0-rc.1': + resolution: {integrity: sha512-IVgxAiSbWaLzOJsYekLPKmbKSxaxGvmz7qNvg781L1uInyTmhFxkN7N3hCIBxQR5gBeZncqsAJwDpu1Wk22KCg==} + engines: {node: '>=22.0.0'} - '@objectstack/service-job@16.1.0': - resolution: {integrity: sha512-HGAWC9cX4nTL9ivSp19avBP/Iy9m7Xreo5t5e1IQ1dRYlg+WWCoIpaxuNEwenb/SGeh12QG+SryDQ1G4eNJpnQ==} - engines: {node: '>=18.0.0'} + '@objectstack/service-job@17.0.0-rc.1': + resolution: {integrity: sha512-ffUPPY4kCJpBBmFLM0xDR8kAXJKewjsRCkiAhl+YyBUXzxpUnGsvA2s3WadYS4c4o+gWZ7RE+D+vpSLdBYQUbg==} + engines: {node: '>=22.0.0'} - '@objectstack/service-messaging@16.1.0': - resolution: {integrity: sha512-sZl//oJl2Yoq3ziQGe4OGrndkyby0nI6XU3N/tc+iBa1cLv8XX63ruNmnxFa2eO+bsA14rqXvauRtWcLTtubxw==} - engines: {node: '>=18.0.0'} + '@objectstack/service-messaging@17.0.0-rc.1': + resolution: {integrity: sha512-JyL4J3vEBP5RG8HQKMRSWXtwiLkxE4/c0838qsxwi0ALmh7e0fTeY2sUGE1r4iIGLX9LR47MDkaAstyChynPiw==} + engines: {node: '>=22.0.0'} - '@objectstack/service-package@16.1.0': - resolution: {integrity: sha512-98gQsJkdIDOMuxjoTUfZ9iWkkkzcQDLt0BPt00EWxAC03Fi6YbgJ+WJ2UVYfzquc6nVVjg3/rgwpSqsoFDt7aA==} - engines: {node: '>=18.0.0'} + '@objectstack/service-package@17.0.0-rc.1': + resolution: {integrity: sha512-z65nnIaB6esz7vLE/D63zqo0XYv6KV2+5ss+risw9ZbUiPKVNCiysaKAjO7kEoXWO2SeR56qG2Q04lpnclpvMg==} + engines: {node: '>=22.0.0'} - '@objectstack/service-queue@16.1.0': - resolution: {integrity: sha512-zKWxi729mUGO0q0BMO0SIZk3vdayWP/rdw29YFMSjpIo1jtnIzSiDW+k7rQV+rUfFkRGHo2QhXjNCbSqMtd3dQ==} - engines: {node: '>=18.0.0'} + '@objectstack/service-queue@17.0.0-rc.1': + resolution: {integrity: sha512-2HzqQlewLiv7DkuOkqP4KspdfmZEVJqBUgX8QYc7Jio5OffofdDw5xvX99wjRpQIlQWBhpUOFX47bU7ASMepPA==} + engines: {node: '>=22.0.0'} - '@objectstack/service-realtime@16.1.0': - resolution: {integrity: sha512-V7jI0YNcj1NXQWwdEoX42sXqobRmW+TVRPK/rsOERnfnelOxZCkdjTjEtEPCzWqOjC6tHRSIS6AaRZqRvyoL0g==} - engines: {node: '>=18.0.0'} + '@objectstack/service-realtime@17.0.0-rc.1': + resolution: {integrity: sha512-PODVYv0GzYv3ynt54ifCd7CJQM3I7aYVhVm2JGv3CDT/FERtg/b5VifFO5XNGtnpIFX3KmqFnMbaPAaI0/JdjQ==} + engines: {node: '>=22.0.0'} - '@objectstack/service-settings@16.1.0': - resolution: {integrity: sha512-Ev3AYcgrcp4aJ7xt+RIXypyuVOS7SfHLFzoePwI5TfU0a/JID1noNSdP2rwaSaUB0OEZWMRgyOGiGuMrx7Zv8A==} - engines: {node: '>=18.0.0'} + '@objectstack/service-settings@17.0.0-rc.1': + resolution: {integrity: sha512-5uHzDV4mhvmA1VA2T9FKX/jtxLViE0Nv1Ab+Mdit+qgg/fRuZ91f9VHuUJzMZXvY/LtghPMLChkELX1ObFDI+A==} + engines: {node: '>=22.0.0'} - '@objectstack/service-sms@16.1.0': - resolution: {integrity: sha512-2encL9plD0j2JPiKMu6Lw7Fgb1hSgM8VbZrTaXxbwlAR69iRA2ifh3zzxjVvaG29ojHxBtzRu7+tNlEkmdsG8w==} + '@objectstack/service-sms@17.0.0-rc.1': + resolution: {integrity: sha512-4VDRSU4IdFQ15kmaTPINfcoeo2D3cO7jmOKimGwcGTiCbPeyQChrW1j+DKiDflX4E3KuPVb7bgpBU+VSr+3sRQ==} - '@objectstack/service-storage@16.1.0': - resolution: {integrity: sha512-vy6a08Wl5BnAwG8wcKYhIHlM3gnOoTkwj690pvg+cUaGAlktmkhZNgpMAdygtZiTahiXVIO0Ga93y+5Vb4tK1A==} - engines: {node: '>=18.0.0'} + '@objectstack/service-storage@17.0.0-rc.1': + resolution: {integrity: sha512-piDhFnBcX9h3B0ndbmeWlJeA7ADAv6lhVSFP+lfbKza6psV5XEF6jGyTG8ls4/uGMu/lQCbd2ciyzOqVfurQvw==} + engines: {node: '>=22.0.0'} peerDependencies: '@aws-sdk/client-s3': ^3.0.0 '@aws-sdk/s3-request-presigner': ^3.0.0 @@ -730,40 +724,40 @@ packages: '@aws-sdk/s3-request-presigner': optional: true - '@objectstack/setup@16.1.0': - resolution: {integrity: sha512-r3RilWSkUAAhhAM8dM/pB8DwNL77ktExQI3Jto1Foee79TT3rVE81tCbk1Gyasv7xJkWk9gBXeujyHTOsFgbdw==} - engines: {node: '>=18.0.0'} + '@objectstack/setup@17.0.0-rc.1': + resolution: {integrity: sha512-PrXO6ztglohuHF7Y+bhlEpB//Hz1Y+tYqu3VsJPwwXPPh9JnSi7oZDNYjpSkX3THAyDS70wqx1D8v3+QItFcfg==} + engines: {node: '>=22.0.0'} - '@objectstack/spec@16.1.0': - resolution: {integrity: sha512-JoDl1ZC4yTxy85/9OoMlOwMTa0I31Jlg5h3lBFSXabZQUclVoexHvF49G4df3xcYyu9r339dskl3F9vwN3kwWA==} - engines: {node: '>=18.0.0'} + '@objectstack/spec@17.0.0-rc.1': + resolution: {integrity: sha512-1SIDQHwxaV8GLD8YqLxCJ0fxTag6eYvvWntihil+lBIxNSjYLI3U384I4l03esBvkytrts3L5W0WCZJkquJiXw==} + engines: {node: '>=22.0.0'} peerDependencies: ai: ^7.0.0 peerDependenciesMeta: ai: optional: true - '@objectstack/trigger-api@16.1.0': - resolution: {integrity: sha512-5QTujHmvAU2LsoPKsv3NW1BSCdHo4qQQyjPXwAVMOeHA+HW4f5tCREjQHm59lFKKuufR7P/1F+L3XUvVaSUTSg==} + '@objectstack/trigger-api@17.0.0-rc.1': + resolution: {integrity: sha512-HwTQR3yePaOyvPlkG59Ce0eElCweVAKWMIyc69jJ4UQ09lRgrreGnfWCq7hOzGHU9KCfekKUrh+2VNkB2ZrECQ==} - '@objectstack/trigger-record-change@16.1.0': - resolution: {integrity: sha512-mfbznLZaMg7pDx9FSUUQ2lC2eNHzLIEnCmsmA8czTLNO71cD7tPaUEiimjAwmgffWHZRWGRHZvkbhR/NJlDcFw==} - engines: {node: '>=18.0.0'} + '@objectstack/trigger-record-change@17.0.0-rc.1': + resolution: {integrity: sha512-DwLsNvUaA6iEXTkgJFzmhLfLVa72C5lnVJvhjoKDnoLOKWeFsyQTolUYAYiC0KyQM8YUkmVgNungEZGYxo67og==} + engines: {node: '>=22.0.0'} - '@objectstack/trigger-schedule@16.1.0': - resolution: {integrity: sha512-DDSql11A2MFrm8jPl8106J/Vy7/cS4ooYcASn0S9deGYWDrPU9G/ZjjiKQkhT3OCXYzu+qgzwem7VL5PJX9MCg==} - engines: {node: '>=18.0.0'} + '@objectstack/trigger-schedule@17.0.0-rc.1': + resolution: {integrity: sha512-cQYOS2TlXOOFFjiEljEbOCvvo2MI+ppfEVlGLRu5UyTzjKJF9V4He+AB2zwARog2BmcZX/nzpTMK9TxHTiAiTQ==} + engines: {node: '>=22.0.0'} - '@objectstack/types@16.1.0': - resolution: {integrity: sha512-/OnXfk0FZt0bgfDUx4BrIoiySS7xbr5rR1rnoBl5K1uUnjyrwswNJMmMNotkCufoaU0SBymcrYK53VlqAF1L1w==} - engines: {node: '>=18.0.0'} + '@objectstack/types@17.0.0-rc.1': + resolution: {integrity: sha512-DhxuS3zLyb9LAAukJVQokF3BHzmbhxdBAjLgSujKP/In1OBON5d2DAEK+SG0TfQsrkM3d7coqS88D+v9ZrsBtQ==} + engines: {node: '>=22.0.0'} - '@objectstack/verify@16.1.0': - resolution: {integrity: sha512-37YNsOFIF3xWoGUslLdbT88AAsnKXd1dcT5/CN62WOTTKPpj8ceBaxJp/t3CX0SBrjItZedXOdiwZZnuTTw8hw==} - engines: {node: '>=18.0.0'} + '@objectstack/verify@17.0.0-rc.1': + resolution: {integrity: sha512-Z9gRzB+l+L5DVsHyFgGP8EwY49+VlqSmVcJN+EtqthcWD7MN71oWQCAeom9sQeY6tEIDW49izWrji7Dcv9nFww==} + engines: {node: '>=22.0.0'} - '@oclif/core@4.13.1': - resolution: {integrity: sha512-f4hesbXkYjMDmvUfTv+Ir0eDrxEHXh52yODykEMiMl+PQ17/0O32g1BvKo+bY8FBh91vy14kS3/kAhsra+RDlw==} + '@oclif/core@4.13.2': + resolution: {integrity: sha512-YWQs0JvESCliWopKtCZqPLgEB1e3oqR+KYecMReseYWbo7E73Rz2tFwQDFQtAp48VLMiAsiTPKKQaZAo+ghzLw==} engines: {node: '>=18.0.0'} '@opentelemetry/semantic-conventions@1.43.0': @@ -1153,8 +1147,8 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - better-auth@1.7.0-rc.1: - resolution: {integrity: sha512-dmTImZTzxDYfNSLdv5yTwRxNMnN8xBQnG9oeeW+eSltO0R0TxOfYZTnu1JE9MSI8tlR5tFfUaoLBTal6Z28v9A==} + better-auth@1.7.0-rc.2: + resolution: {integrity: sha512-5KZrqbAsoQA8q1edmufaoF/CBbMjGb/BoPqyMTzXFyDeXNhk8pXO2xJkiDDeZcSGtyhUKXiDnD7hxh4sJVgYZw==} peerDependencies: '@lynx-js/react': '*' '@prisma/client': ^5.0.0 || ^6.0.0 || ^7.0.0 @@ -1162,7 +1156,7 @@ packages: '@tanstack/react-start': ^1.0.0 '@tanstack/solid-start': ^1.0.0 better-sqlite3: ^12.0.0 - drizzle-kit: '>=0.31.4' + drizzle-kit: '>=0.31.4 || >=1.0.0-beta.1' drizzle-orm: ^0.45.2 mongodb: ^6.0.0 || ^7.0.0 mysql2: ^3.0.0 @@ -1231,6 +1225,10 @@ packages: resolution: {integrity: sha512-dq9AtApgg5PGFtBzPFSBl3HZQjHok5gaQCM6zh2Yk0aSmDCs1CbnVI8/HgASQkNKsWFpseIO9beg5xxpYhbIfA==} engines: {node: 20.x || 22.x || 23.x || 24.x || 25.x || 26.x} + better-sqlite3@13.0.2: + resolution: {integrity: sha512-jW6oufeDhXZaiX9Lw5A+oerVClx4iFrI6uDj1zu7SqUAjak9vbJvA0NEcKLNxHiQHb6kYCoFzzXYV0YOauhV3g==} + engines: {node: '>=22'} + big-integer@1.6.52: resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} engines: {node: '>=0.6'} @@ -1251,14 +1249,14 @@ packages: resolution: {integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==} engines: {node: '>=18'} - brace-expansion@1.1.16: - resolution: {integrity: sha512-IDw48K2/2kRkg9LdJxurvq3lV3aBgq0REY89duEqFRthjlPdXHKMj7EnQOXVckxzgisinf3nHfrcE2FufFLXMw==} + brace-expansion@1.1.18: + resolution: {integrity: sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==} - brace-expansion@2.1.2: - resolution: {integrity: sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==} + brace-expansion@2.1.4: + resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} - brace-expansion@5.0.8: - resolution: {integrity: sha512-JZyDyq3D4AUifKTPOB7DELf6XsB3WdPuNxCtob1vFXPsSXhdAiHBWJ/tJ8HAc9aH84BK+5JFZLNkJKx3G9kzQg==} + brace-expansion@5.0.9: + resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} engines: {node: 20 || >=22} braces@3.0.3: @@ -1308,9 +1306,9 @@ packages: chainsaw@0.1.0: resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} - chalk@5.6.2: - resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chalk@6.0.0: + resolution: {integrity: sha512-2uNTXIuTTxk7ciZgAU1BQcgnchcG0xXnrs6jzkQfj9SsRa9M2s5zE8WT96hS6KmG4MzWHSrvH43DF1m4XRkrFg==} + engines: {node: '>=22'} chardet@2.2.0: resolution: {integrity: sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==} @@ -1581,8 +1579,8 @@ packages: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} - fast-uri@3.1.4: - resolution: {integrity: sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==} + fast-uri@3.1.5: + resolution: {integrity: sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==} fast-xml-builder@1.3.0: resolution: {integrity: sha512-F74cZEdCvuw9P41GAC3rod4X04jjWGM1JPEv/GWSqFTWLsdyMSBMBMlm9Hk3GLBgLBbdBNY8yee0pQh2RBVESQ==} @@ -1714,8 +1712,8 @@ packages: resolution: {integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==} engines: {node: '>= 0.4'} - hono@4.12.32: - resolution: {integrity: sha512-XcuyW9qE2kJn07PkecMOBd5Vq/hMy7mmGw+idz1yblbg9N17ijJODrvPkn7/dwL3Kulj8LcRJ69DLOWf91dRUg==} + hono@4.12.33: + resolution: {integrity: sha512-+SwvkaiJtxsiPjhy9LivY/1m7UsNqCJetM1BrZl9A5DkQhlbHQDU730mMiDPWjnoCYOM8Chf3WrCJw27kNTPFQ==} engines: {node: '>=16.9.0'} html-escaper@2.0.2: @@ -1761,8 +1759,8 @@ packages: resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} engines: {node: '>= 0.10'} - ip-address@10.3.1: - resolution: {integrity: sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==} + ip-address@10.4.0: + resolution: {integrity: sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==} engines: {node: '>= 12'} ipaddr.js@1.9.1: @@ -1835,8 +1833,8 @@ packages: engines: {node: '>=10'} hasBin: true - jose@6.2.4: - resolution: {integrity: sha512-N8acGzVsQy6M/fjFcxtysNc4Q379TcM5dM/qKkNtsHFji88yANnXTr7BLeP75iPnFwBfQzM/jg2BZ9+HZrHCZA==} + jose@6.2.5: + resolution: {integrity: sha512-2E5L2yRp03FnwreJLJX8/r7mHiZICCf8kG7fAsTWkSQTDAcc46NIZoQLKy+EJ8sPoJlxyS4OQR5H70LjIZZlIQ==} js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} @@ -2100,8 +2098,8 @@ packages: mingo@7.2.2: resolution: {integrity: sha512-ll8DV+C5RnV2zF3Jwendxhgqknofzp7KaDwmlpvqo4xrdMC5F7JTc2ToZOz//de84QymZTFY7LPHMViE8uNHhA==} - minimatch@10.2.5: - resolution: {integrity: sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==} + minimatch@10.2.6: + resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} minimatch@3.1.5: @@ -2179,8 +2177,8 @@ packages: engines: {node: ^22 || ^24 || >=26} hasBin: true - nanostores@1.4.1: - resolution: {integrity: sha512-PGd3uPojJB9Z07d5NX3Db/SOSBbyy3wLMUGq0GpnEEJfVzY9mq7daPMAZ3jObV5D3Jn+YKND636eI5ULg7F80Q==} + nanostores@1.4.2: + resolution: {integrity: sha512-Wxv8Roefr2nqtiRG0bnaFlpYqpIVtOEeJZHaH+4nGgOK1/7n6OHOuHCb/bhqrNQgZM8fyd0s1PqhdrJc9Ib44g==} engines: {node: ^20.0.0 || >=22.0.0} napi-build-utils@2.0.0: @@ -2194,6 +2192,10 @@ packages: resolution: {integrity: sha512-W5ZNO5KRPB5TkYmGVD9F6YqhsglXJzE6etpbmT+f6EQElhiX/UTG551cnsRGvLG3fyZEg9HwaDmNmj5nwJ4z9g==} engines: {node: '>=10'} + node-addon-api@8.9.0: + resolution: {integrity: sha512-ekZMeaaIzSQTSpr7X2X3iJM7lTzgnx8ahAG9pJfT/7+14mlEM8ZYQ9cgCDvSSRbReFK0oHli3WrZdCiRsgAT9Q==} + engines: {node: ^18 || ^20 || >= 21} + node-rsa@1.1.1: resolution: {integrity: sha512-Jd4cvbJMryN21r5HgxQOpMEqv+ooke/korixNNK3mGqfGJmy0M77WDDzo/05969+OkMy3XW1UuZsSmW9KQm7Fw==} @@ -2633,11 +2635,11 @@ packages: resolution: {integrity: sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==} engines: {node: '>=14.0.0'} - tldts-core@7.4.9: - resolution: {integrity: sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg==} + tldts-core@7.4.10: + resolution: {integrity: sha512-KnQjp53ZekKgm/r3l+u8kJGGzYgrWdP8+Mql7a4vijh2WE0IrZWspQj/TpTxDho/YxO+AnOZnIjQcCD+q6iJsw==} - tldts@7.4.9: - resolution: {integrity: sha512-3kZ8wQQ/k5DrChD4X4FVvr2D7E5uoRgAqkPyLpSCGUvqOvqu+JEdr3mwMUaVWb+vMHZaKhF5fp2PBigKsui7hA==} + tldts@7.4.10: + resolution: {integrity: sha512-GgouD1B+sWwvkaEq8vXC15DjQitxbvs12oIXELpconwm+Tg3zfcEv4jgzq3vtKverDXsg3VI8aRgNL2Nra0Iog==} hasBin: true tmp@0.2.7: @@ -2903,81 +2905,112 @@ snapshots: '@bcoe/v8-coverage@1.0.2': {} - '@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1)': + '@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2)': 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.3.7(zod@4.4.3) - jose: 6.2.4 + jose: 6.2.5 kysely: 0.29.4 - nanostores: 1.4.1 + nanostores: 1.4.2 zod: 4.4.3 - '@better-auth/drizzle-adapter@1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2)': + '@better-auth/drizzle-adapter@1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1) + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 - '@better-auth/kysely-adapter@1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2)(kysely@0.29.4)': + '@better-auth/kysely-adapter@1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(kysely@0.29.4)': dependencies: - '@better-auth/core': 1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1) + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 optionalDependencies: kysely: 0.29.4 - '@better-auth/memory-adapter@1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2)': + '@better-auth/memory-adapter@1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)': dependencies: - '@better-auth/core': 1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1) + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 - '@better-auth/mongo-adapter@1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2)(mongodb@7.5.0)': + '@better-auth/mongo-adapter@1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(mongodb@7.5.0)': dependencies: - '@better-auth/core': 1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1) + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 optionalDependencies: mongodb: 7.5.0 - '@better-auth/oauth-provider@1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.1(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3))': + '@better-auth/oauth-provider@1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3))': dependencies: - '@better-auth/core': 1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1) + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 - better-auth: 1.7.0-rc.1(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) + better-auth: 1.7.0-rc.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) better-call: 1.3.7(zod@4.4.3) - jose: 6.2.4 + jose: 6.2.5 zod: 4.4.3 - '@better-auth/prisma-adapter@1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2)': + '@better-auth/oauth-provider@1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.2(better-sqlite3@13.0.2)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3))': dependencies: - '@better-auth/core': 1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1) + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + better-auth: 1.7.0-rc.2(better-sqlite3@13.0.2)(mongodb@7.5.0)(vitest@4.1.10) + better-call: 1.3.7(zod@4.4.3) + jose: 6.2.5 + zod: 4.4.3 + + '@better-auth/prisma-adapter@1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)': + dependencies: + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/utils': 0.4.2 + + '@better-auth/scim@1.7.0-rc.1(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(better-auth@1.7.0-rc.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3))': + dependencies: + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/utils': 0.4.2 + better-auth: 1.7.0-rc.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) + better-call: 1.3.7(zod@4.4.3) + zod: 4.4.3 + + '@better-auth/scim@1.7.0-rc.1(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(better-auth@1.7.0-rc.2(better-sqlite3@13.0.2)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3))': + dependencies: + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/utils': 0.4.2 + better-auth: 1.7.0-rc.2(better-sqlite3@13.0.2)(mongodb@7.5.0)(vitest@4.1.10) + better-call: 1.3.7(zod@4.4.3) + zod: 4.4.3 - '@better-auth/scim@1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2)(better-auth@1.7.0-rc.1(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3))': + '@better-auth/sso@1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3))': dependencies: - '@better-auth/core': 1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1) + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 - better-auth: 1.7.0-rc.1(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) + '@better-fetch/fetch': 1.3.1 + better-auth: 1.7.0-rc.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) better-call: 1.3.7(zod@4.4.3) + fast-xml-parser: 5.10.1 + jose: 6.2.5 + samlify: 2.13.1 + tldts: 7.4.10 zod: 4.4.3 - '@better-auth/sso@1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.1(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3))': + '@better-auth/sso@1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.2(better-sqlite3@13.0.2)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3))': dependencies: - '@better-auth/core': 1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1) + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 - better-auth: 1.7.0-rc.1(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) + better-auth: 1.7.0-rc.2(better-sqlite3@13.0.2)(mongodb@7.5.0)(vitest@4.1.10) better-call: 1.3.7(zod@4.4.3) fast-xml-parser: 5.10.1 - jose: 6.2.4 + jose: 6.2.5 samlify: 2.13.1 - tldts: 7.4.9 + tldts: 7.4.10 zod: 4.4.3 - '@better-auth/telemetry@1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)': + '@better-auth/telemetry@1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)': dependencies: - '@better-auth/core': 1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1) + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 @@ -3243,13 +3276,9 @@ snapshots: lodash.isundefined: 3.0.1 lodash.uniq: 4.5.0 - '@hono/node-server@1.19.17(hono@4.12.32)': - dependencies: - hono: 4.12.32 - - '@hono/node-server@2.0.12(hono@4.12.32)': + '@hono/node-server@2.0.12(hono@4.12.33)': dependencies: - hono: 4.12.32 + hono: 4.12.33 '@inquirer/external-editor@1.0.3': dependencies: @@ -3306,9 +3335,9 @@ snapshots: '@marcbachmann/cel-js@8.0.0': {} - '@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)': + '@modelcontextprotocol/sdk@1.30.0(zod@4.4.3)': dependencies: - '@hono/node-server': 1.19.17(hono@4.12.32) + '@hono/node-server': 2.0.12(hono@4.12.33) ajv: 8.20.0 ajv-formats: 3.0.1 content-type: 1.0.5 @@ -3318,8 +3347,8 @@ snapshots: eventsource-parser: 3.1.0 express: 5.2.1 express-rate-limit: 8.6.1(express@5.2.1) - hono: 4.12.32 - jose: 6.2.4 + hono: 4.12.33 + jose: 6.2.5 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 @@ -3357,66 +3386,66 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.20.1 - '@objectstack/account@16.1.0(vitest@4.1.10)': + '@objectstack/account@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - vitest - '@objectstack/cli@16.1.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.1)(vitest@4.1.10)': - dependencies: - '@objectstack/account': 16.1.0(vitest@4.1.10) - '@objectstack/client': 16.1.0 - '@objectstack/cloud-connection': 16.1.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.1)(vitest@4.1.10) - '@objectstack/console': 16.1.0 - '@objectstack/core': 16.1.0 - '@objectstack/driver-memory': 16.1.0 - '@objectstack/driver-mongodb': 16.1.0 - '@objectstack/driver-sql': 16.1.0 - '@objectstack/driver-sqlite-wasm': 16.1.0(better-sqlite3@12.11.1) - '@objectstack/formula': 16.1.0 - '@objectstack/lint': 16.1.0 - '@objectstack/mcp': 16.1.0 - '@objectstack/metadata': 16.1.0(vitest@4.1.10) - '@objectstack/objectql': 16.1.0(vitest@4.1.10) - '@objectstack/observability': 16.1.0 - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/plugin-approvals': 16.1.0(vitest@4.1.10) - '@objectstack/plugin-audit': 16.1.0(vitest@4.1.10) - '@objectstack/plugin-auth': 16.1.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.1)(vitest@4.1.10) - '@objectstack/plugin-email': 16.1.0(vitest@4.1.10) - '@objectstack/plugin-hono-server': 16.1.0 - '@objectstack/plugin-pinyin-search': 16.1.0(vitest@4.1.10) - '@objectstack/plugin-reports': 16.1.0(vitest@4.1.10) - '@objectstack/plugin-security': 16.1.0(vitest@4.1.10) - '@objectstack/plugin-sharing': 16.1.0(vitest@4.1.10) - '@objectstack/plugin-webhooks': 16.1.0 - '@objectstack/rest': 16.1.0(vitest@4.1.10) - '@objectstack/runtime': 16.1.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.1)(vitest@4.1.10) - '@objectstack/service-analytics': 16.1.0 - '@objectstack/service-automation': 16.1.0 - '@objectstack/service-cache': 16.1.0 - '@objectstack/service-datasource': 16.1.0 - '@objectstack/service-job': 16.1.0(vitest@4.1.10) - '@objectstack/service-messaging': 16.1.0 - '@objectstack/service-package': 16.1.0(vitest@4.1.10) - '@objectstack/service-queue': 16.1.0(vitest@4.1.10) - '@objectstack/service-realtime': 16.1.0(vitest@4.1.10) - '@objectstack/service-settings': 16.1.0(vitest@4.1.10) - '@objectstack/service-sms': 16.1.0 - '@objectstack/service-storage': 16.1.0(vitest@4.1.10) - '@objectstack/setup': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 - '@objectstack/trigger-api': 16.1.0 - '@objectstack/trigger-record-change': 16.1.0 - '@objectstack/trigger-schedule': 16.1.0 - '@objectstack/types': 16.1.0 - '@objectstack/verify': 16.1.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.1)(vitest@4.1.10) - '@oclif/core': 4.13.1 + '@objectstack/cli@17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + dependencies: + '@objectstack/account': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/client': 17.0.0-rc.1 + '@objectstack/cloud-connection': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/console': 17.0.0-rc.1 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/driver-memory': 17.0.0-rc.1 + '@objectstack/driver-mongodb': 17.0.0-rc.1 + '@objectstack/driver-sql': 17.0.0-rc.1 + '@objectstack/driver-sqlite-wasm': 17.0.0-rc.1(better-sqlite3@13.0.2) + '@objectstack/formula': 17.0.0-rc.1 + '@objectstack/lint': 17.0.0-rc.1 + '@objectstack/mcp': 17.0.0-rc.1 + '@objectstack/metadata': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/objectql': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/observability': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/plugin-approvals': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/plugin-audit': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/plugin-auth': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/plugin-email': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/plugin-hono-server': 17.0.0-rc.1 + '@objectstack/plugin-pinyin-search': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/plugin-reports': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/plugin-security': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/plugin-sharing': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/plugin-webhooks': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/rest': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/runtime': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/service-analytics': 17.0.0-rc.1 + '@objectstack/service-automation': 17.0.0-rc.1 + '@objectstack/service-cache': 17.0.0-rc.1 + '@objectstack/service-datasource': 17.0.0-rc.1 + '@objectstack/service-job': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/service-messaging': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/service-package': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/service-queue': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/service-realtime': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/service-settings': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/service-sms': 17.0.0-rc.1 + '@objectstack/service-storage': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/setup': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/trigger-api': 17.0.0-rc.1 + '@objectstack/trigger-record-change': 17.0.0-rc.1 + '@objectstack/trigger-schedule': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 + '@objectstack/verify': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@oclif/core': 4.13.2 bundle-require: 5.1.0(esbuild@0.28.1) - chalk: 5.6.2 + chalk: 6.0.0 chokidar: 5.0.0 dotenv-flow: 4.1.0 esbuild: 0.28.1 @@ -3424,6 +3453,8 @@ snapshots: tsx: 4.23.1 yaml: 2.9.0 zod: 4.4.3 + optionalDependencies: + better-sqlite3: 13.0.2 transitivePeerDependencies: - '@aws-sdk/client-s3' - '@aws-sdk/credential-providers' @@ -3441,7 +3472,6 @@ snapshots: - '@tanstack/solid-start' - ai - better-call - - better-sqlite3 - drizzle-kit - drizzle-orm - gcp-metadata @@ -3470,19 +3500,19 @@ snapshots: - vitest - vue - '@objectstack/client@16.1.0': + '@objectstack/client@17.0.0-rc.1': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - '@objectstack/cloud-connection@16.1.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.1)(vitest@4.1.10)': + '@objectstack/cloud-connection@17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/runtime': 16.1.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.1)(vitest@4.1.10) - '@objectstack/spec': 16.1.0 - '@objectstack/types': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/runtime': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@better-auth/utils' @@ -3526,27 +3556,28 @@ snapshots: - vitest - vue - '@objectstack/console@16.1.0': {} + '@objectstack/console@17.0.0-rc.1': {} - '@objectstack/core@16.1.0': + '@objectstack/core@17.0.0-rc.1': dependencies: - '@objectstack/spec': 16.1.0 + '@objectstack/spec': 17.0.0-rc.1 zod: 4.4.3 transitivePeerDependencies: - ai - '@objectstack/driver-memory@16.1.0': + '@objectstack/driver-memory@17.0.0-rc.1': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 mingo: 7.2.2 transitivePeerDependencies: - ai - '@objectstack/driver-mongodb@16.1.0': + '@objectstack/driver-mongodb@17.0.0-rc.1': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 mongodb: 7.5.0 nanoid: 6.0.0 transitivePeerDependencies: @@ -3559,16 +3590,16 @@ snapshots: - snappy - socks - '@objectstack/driver-sql@16.1.0': + '@objectstack/driver-sql@17.0.0-rc.1': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/observability': 16.1.0 - '@objectstack/spec': 16.1.0 - '@objectstack/types': 16.1.0 - knex: 3.3.0(better-sqlite3@12.11.1) + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/observability': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 + knex: 3.3.0(better-sqlite3@13.0.2) nanoid: 6.0.0 optionalDependencies: - better-sqlite3: 12.11.1 + better-sqlite3: 13.0.2 transitivePeerDependencies: - ai - mariadb @@ -3578,11 +3609,11 @@ snapshots: - sqlite3 - supports-color - '@objectstack/driver-sqlite-wasm@16.1.0(better-sqlite3@12.11.1)': + '@objectstack/driver-sqlite-wasm@17.0.0-rc.1(better-sqlite3@12.11.1)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/driver-sql': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/driver-sql': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 knex: 3.3.0(better-sqlite3@12.11.1) nanoid: 6.0.0 sql.js: 1.14.1 @@ -3599,73 +3630,94 @@ snapshots: - supports-color - tedious - '@objectstack/formula@16.1.0': + '@objectstack/driver-sqlite-wasm@17.0.0-rc.1(better-sqlite3@13.0.2)': + dependencies: + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/driver-sql': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 + knex: 3.3.0(better-sqlite3@13.0.2) + nanoid: 6.0.0 + sql.js: 1.14.1 + transitivePeerDependencies: + - ai + - better-sqlite3 + - mariadb + - mysql + - mysql2 + - pg + - pg-native + - pg-query-stream + - sqlite3 + - supports-color + - tedious + + '@objectstack/formula@17.0.0-rc.1': dependencies: '@marcbachmann/cel-js': 8.0.0 - '@objectstack/spec': 16.1.0 + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - '@objectstack/lint@16.1.0': + '@objectstack/lint@17.0.0-rc.1': dependencies: - '@objectstack/formula': 16.1.0 - '@objectstack/sdui-parser': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/formula': 17.0.0-rc.1 + '@objectstack/sdui-parser': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 sucrase: 3.35.1 typescript: 6.0.3 transitivePeerDependencies: - ai - '@objectstack/mcp@16.1.0': + '@objectstack/mcp@17.0.0-rc.1': dependencies: - '@modelcontextprotocol/sdk': 1.29.0(zod@4.4.3) - '@objectstack/core': 16.1.0 - '@objectstack/formula': 16.1.0 - '@objectstack/spec': 16.1.0 - '@objectstack/types': 16.1.0 + '@modelcontextprotocol/sdk': 1.30.0(zod@4.4.3) + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/formula': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 zod: 4.4.3 transitivePeerDependencies: - '@cfworker/json-schema' - ai - supports-color - '@objectstack/metadata-core@16.1.0(vitest@4.1.10)': + '@objectstack/metadata-core@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/spec': 16.1.0 + '@objectstack/spec': 17.0.0-rc.1 zod: 4.4.3 optionalDependencies: vitest: 4.1.10(@vitest/coverage-v8@4.1.10)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0) transitivePeerDependencies: - ai - '@objectstack/metadata-fs@16.1.0(vitest@4.1.10)': + '@objectstack/metadata-fs@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/metadata-core': 16.1.0(vitest@4.1.10) + '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) chokidar: 5.0.0 transitivePeerDependencies: - ai - vitest - '@objectstack/metadata-protocol@16.1.0(vitest@4.1.10)': + '@objectstack/metadata-protocol@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/formula': 16.1.0 - '@objectstack/metadata-core': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 - '@objectstack/types': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/formula': 17.0.0-rc.1 + '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 zod: 4.4.3 transitivePeerDependencies: - ai - vitest - '@objectstack/metadata@16.1.0(vitest@4.1.10)': + '@objectstack/metadata@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/metadata-core': 16.1.0(vitest@4.1.10) - '@objectstack/metadata-fs': 16.1.0(vitest@4.1.10) - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 - '@objectstack/types': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/metadata-fs': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 chokidar: 5.0.0 glob: 13.0.6 js-yaml: 5.2.2 @@ -3674,68 +3726,112 @@ snapshots: - ai - vitest - '@objectstack/objectql@16.1.0(vitest@4.1.10)': + '@objectstack/objectql@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/formula': 16.1.0 - '@objectstack/metadata-core': 16.1.0(vitest@4.1.10) - '@objectstack/metadata-protocol': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 - '@objectstack/types': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/formula': 17.0.0-rc.1 + '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/metadata-protocol': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 ajv: 8.20.0 zod: 4.4.3 transitivePeerDependencies: - ai - vitest - '@objectstack/observability@16.1.0': + '@objectstack/observability@17.0.0-rc.1': + dependencies: + '@objectstack/spec': 17.0.0-rc.1 + transitivePeerDependencies: + - ai + + '@objectstack/platform-objects@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/spec': 16.1.0 + '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai + - vitest - '@objectstack/platform-objects@16.1.0(vitest@4.1.10)': + '@objectstack/plugin-approvals@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/metadata-core': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/formula': 17.0.0-rc.1 + '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-approvals@16.1.0(vitest@4.1.10)': + '@objectstack/plugin-audit@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/formula': 16.1.0 - '@objectstack/metadata-core': 16.1.0(vitest@4.1.10) - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-audit@16.1.0(vitest@4.1.10)': + '@objectstack/plugin-auth@17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/oauth-provider': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3)) + '@better-auth/scim': 1.7.0-rc.1(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(better-auth@1.7.0-rc.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3)) + '@better-auth/sso': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3)) + '@noble/hashes': 2.2.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/rest': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 + better-auth: 1.7.0-rc.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) + jose: 6.2.5 transitivePeerDependencies: + - '@better-auth/utils' + - '@better-fetch/fetch' + - '@cloudflare/workers-types' + - '@lynx-js/react' + - '@opentelemetry/api' + - '@prisma/client' + - '@sveltejs/kit' + - '@tanstack/react-start' + - '@tanstack/solid-start' - ai + - better-call + - better-sqlite3 + - drizzle-kit + - drizzle-orm + - kysely + - mongodb + - mysql2 + - nanostores + - next + - pg + - prisma + - react + - react-dom + - solid-js + - svelte - vitest + - vue - '@objectstack/plugin-auth@16.1.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.1)(vitest@4.1.10)': + '@objectstack/plugin-auth@17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': dependencies: - '@better-auth/core': 1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1) - '@better-auth/oauth-provider': 1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.1(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3)) - '@better-auth/scim': 1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2)(better-auth@1.7.0-rc.1(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3)) - '@better-auth/sso': 1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.1(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3)) + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/oauth-provider': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.2(better-sqlite3@13.0.2)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3)) + '@better-auth/scim': 1.7.0-rc.1(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(better-auth@1.7.0-rc.2(better-sqlite3@13.0.2)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3)) + '@better-auth/sso': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-auth@1.7.0-rc.2(better-sqlite3@13.0.2)(mongodb@7.5.0)(vitest@4.1.10))(better-call@1.3.7(zod@4.4.3)) '@noble/hashes': 2.2.0 - '@objectstack/core': 16.1.0 - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/rest': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 - '@objectstack/types': 16.1.0 - better-auth: 1.7.0-rc.1(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10) - jose: 6.2.4 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/rest': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 + better-auth: 1.7.0-rc.2(better-sqlite3@13.0.2)(mongodb@7.5.0)(vitest@4.1.10) + jose: 6.2.5 transitivePeerDependencies: - '@better-auth/utils' - '@better-fetch/fetch' @@ -3765,113 +3861,183 @@ snapshots: - vitest - vue - '@objectstack/plugin-email@16.1.0(vitest@4.1.10)': + '@objectstack/plugin-email@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/formula': 16.1.0 - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/formula': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-hono-server@16.1.0': + '@objectstack/plugin-hono-server@17.0.0-rc.1': dependencies: - '@hono/node-server': 2.0.12(hono@4.12.32) - '@objectstack/core': 16.1.0 - '@objectstack/observability': 16.1.0 - '@objectstack/spec': 16.1.0 - '@objectstack/types': 16.1.0 - hono: 4.12.32 + '@hono/node-server': 2.0.12(hono@4.12.33) + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/observability': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 + hono: 4.12.33 transitivePeerDependencies: - ai - '@objectstack/plugin-pinyin-search@16.1.0(vitest@4.1.10)': + '@objectstack/plugin-pinyin-search@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/objectql': 16.1.0(vitest@4.1.10) - '@objectstack/types': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/objectql': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/types': 17.0.0-rc.1 pinyin-pro: 3.28.2 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-reports@16.1.0(vitest@4.1.10)': + '@objectstack/plugin-reports@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 croner: 10.0.1 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-security@16.1.0(vitest@4.1.10)': + '@objectstack/plugin-security@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/formula': 16.1.0 - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/formula': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-sharing@16.1.0(vitest@4.1.10)': + '@objectstack/plugin-sharing@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/formula': 16.1.0 - '@objectstack/objectql': 16.1.0(vitest@4.1.10) - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/formula': 17.0.0-rc.1 + '@objectstack/objectql': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 transitivePeerDependencies: - ai - vitest - '@objectstack/plugin-webhooks@16.1.0': + '@objectstack/plugin-webhooks@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/service-messaging': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/service-messaging': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai + - vitest - '@objectstack/rest@16.1.0(vitest@4.1.10)': + '@objectstack/rest@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/observability': 16.1.0 - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/service-package': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 - '@objectstack/types': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/observability': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/service-package': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 exceljs: 4.4.0 zod: 4.4.3 transitivePeerDependencies: - ai - vitest - '@objectstack/runtime@16.1.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.1)(vitest@4.1.10)': - dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/driver-memory': 16.1.0 - '@objectstack/driver-sql': 16.1.0 - '@objectstack/driver-sqlite-wasm': 16.1.0(better-sqlite3@12.11.1) - '@objectstack/formula': 16.1.0 - '@objectstack/metadata': 16.1.0(vitest@4.1.10) - '@objectstack/metadata-core': 16.1.0(vitest@4.1.10) - '@objectstack/objectql': 16.1.0(vitest@4.1.10) - '@objectstack/observability': 16.1.0 - '@objectstack/plugin-auth': 16.1.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.1)(vitest@4.1.10) - '@objectstack/plugin-security': 16.1.0(vitest@4.1.10) - '@objectstack/rest': 16.1.0(vitest@4.1.10) - '@objectstack/service-cluster': 16.1.0 - '@objectstack/service-datasource': 16.1.0 - '@objectstack/service-i18n': 16.1.0 - '@objectstack/spec': 16.1.0 - '@objectstack/types': 16.1.0 + '@objectstack/runtime@17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + dependencies: + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/driver-memory': 17.0.0-rc.1 + '@objectstack/driver-sql': 17.0.0-rc.1 + '@objectstack/driver-sqlite-wasm': 17.0.0-rc.1(better-sqlite3@12.11.1) + '@objectstack/formula': 17.0.0-rc.1 + '@objectstack/metadata': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/metadata-protocol': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/objectql': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/observability': 17.0.0-rc.1 + '@objectstack/plugin-auth': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/plugin-security': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/rest': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/service-cluster': 17.0.0-rc.1 + '@objectstack/service-datasource': 17.0.0-rc.1 + '@objectstack/service-i18n': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 + quickjs-emscripten: 0.32.0 + zod: 4.4.3 + optionalDependencies: + '@objectstack/driver-mongodb': 17.0.0-rc.1 + transitivePeerDependencies: + - '@aws-sdk/credential-providers' + - '@better-auth/utils' + - '@better-fetch/fetch' + - '@cloudflare/workers-types' + - '@lynx-js/react' + - '@mongodb-js/zstd' + - '@opentelemetry/api' + - '@prisma/client' + - '@sveltejs/kit' + - '@tanstack/react-start' + - '@tanstack/solid-start' + - ai + - better-call + - better-sqlite3 + - drizzle-kit + - drizzle-orm + - gcp-metadata + - kerberos + - kysely + - mariadb + - mongodb + - mongodb-client-encryption + - mysql + - mysql2 + - nanostores + - next + - pg + - pg-native + - pg-query-stream + - prisma + - react + - react-dom + - snappy + - socks + - solid-js + - sqlite3 + - supports-color + - svelte + - tedious + - vitest + - vue + + '@objectstack/runtime@17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + dependencies: + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/driver-memory': 17.0.0-rc.1 + '@objectstack/driver-sql': 17.0.0-rc.1 + '@objectstack/driver-sqlite-wasm': 17.0.0-rc.1(better-sqlite3@13.0.2) + '@objectstack/formula': 17.0.0-rc.1 + '@objectstack/metadata': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/metadata-protocol': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/objectql': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/observability': 17.0.0-rc.1 + '@objectstack/plugin-auth': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/plugin-security': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/rest': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/service-cluster': 17.0.0-rc.1 + '@objectstack/service-datasource': 17.0.0-rc.1 + '@objectstack/service-i18n': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 quickjs-emscripten: 0.32.0 zod: 4.4.3 optionalDependencies: - '@objectstack/driver-mongodb': 16.1.0 + '@objectstack/driver-mongodb': 17.0.0-rc.1 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@better-auth/utils' @@ -3915,179 +4081,184 @@ snapshots: - vitest - vue - '@objectstack/sdui-parser@16.1.0': {} + '@objectstack/sdui-parser@17.0.0-rc.1': {} - '@objectstack/service-analytics@16.1.0': + '@objectstack/service-analytics@17.0.0-rc.1': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - '@objectstack/service-automation@16.1.0': + '@objectstack/service-automation@17.0.0-rc.1': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/formula': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/formula': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - '@objectstack/service-cache@16.1.0': + '@objectstack/service-cache@17.0.0-rc.1': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/observability': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/observability': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - '@objectstack/service-cluster@16.1.0': + '@objectstack/service-cluster@17.0.0-rc.1': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - '@objectstack/service-datasource@16.1.0': + '@objectstack/service-datasource@17.0.0-rc.1': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 transitivePeerDependencies: - ai - '@objectstack/service-i18n@16.1.0': + '@objectstack/service-i18n@17.0.0-rc.1': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 transitivePeerDependencies: - ai - '@objectstack/service-job@16.1.0(vitest@4.1.10)': + '@objectstack/service-job@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 croner: 10.0.1 transitivePeerDependencies: - ai - vitest - '@objectstack/service-messaging@16.1.0': + '@objectstack/service-messaging@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai + - vitest - '@objectstack/service-package@16.1.0(vitest@4.1.10)': + '@objectstack/service-package@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/metadata-core': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/metadata-core': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - vitest - '@objectstack/service-queue@16.1.0(vitest@4.1.10)': + '@objectstack/service-queue@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - vitest - '@objectstack/service-realtime@16.1.0(vitest@4.1.10)': + '@objectstack/service-realtime@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - vitest - '@objectstack/service-settings@16.1.0(vitest@4.1.10)': + '@objectstack/service-settings@17.0.0-rc.1(vitest@4.1.10)': dependencies: '@noble/ciphers': 2.2.0 - '@objectstack/core': 16.1.0 - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 - '@objectstack/types': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 transitivePeerDependencies: - ai - vitest - '@objectstack/service-sms@16.1.0': + '@objectstack/service-sms@17.0.0-rc.1': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - '@objectstack/service-storage@16.1.0(vitest@4.1.10)': + '@objectstack/service-storage@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/observability': 16.1.0 - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/observability': 17.0.0-rc.1 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 + '@objectstack/types': 17.0.0-rc.1 transitivePeerDependencies: - ai - vitest - '@objectstack/setup@16.1.0(vitest@4.1.10)': + '@objectstack/setup@17.0.0-rc.1(vitest@4.1.10)': dependencies: - '@objectstack/platform-objects': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - vitest - '@objectstack/spec@16.1.0': + '@objectstack/spec@17.0.0-rc.1': dependencies: zod: 4.4.3 - '@objectstack/trigger-api@16.1.0': + '@objectstack/trigger-api@17.0.0-rc.1': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - '@objectstack/trigger-record-change@16.1.0': + '@objectstack/trigger-record-change@17.0.0-rc.1': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - '@objectstack/trigger-schedule@16.1.0': + '@objectstack/trigger-schedule@17.0.0-rc.1': dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/spec': 16.1.0 + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - '@objectstack/types@16.1.0': + '@objectstack/types@17.0.0-rc.1': dependencies: - '@objectstack/spec': 16.1.0 + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - ai - '@objectstack/verify@16.1.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.1)(vitest@4.1.10)': - dependencies: - '@objectstack/core': 16.1.0 - '@objectstack/driver-sqlite-wasm': 16.1.0(better-sqlite3@12.11.1) - '@objectstack/objectql': 16.1.0(vitest@4.1.10) - '@objectstack/plugin-auth': 16.1.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.1)(vitest@4.1.10) - '@objectstack/plugin-hono-server': 16.1.0 - '@objectstack/plugin-security': 16.1.0(vitest@4.1.10) - '@objectstack/plugin-sharing': 16.1.0(vitest@4.1.10) - '@objectstack/rest': 16.1.0(vitest@4.1.10) - '@objectstack/runtime': 16.1.0(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@12.11.1)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.1)(vitest@4.1.10) - '@objectstack/service-analytics': 16.1.0 - '@objectstack/service-automation': 16.1.0 - '@objectstack/service-datasource': 16.1.0 - '@objectstack/service-settings': 16.1.0(vitest@4.1.10) - '@objectstack/spec': 16.1.0 + '@objectstack/verify@17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10)': + dependencies: + '@objectstack/core': 17.0.0-rc.1 + '@objectstack/objectql': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/platform-objects': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/plugin-auth': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/plugin-hono-server': 17.0.0-rc.1 + '@objectstack/plugin-security': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/plugin-sharing': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/rest': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/runtime': 17.0.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(better-sqlite3@13.0.2)(kysely@0.29.4)(mongodb@7.5.0)(nanostores@1.4.2)(vitest@4.1.10) + '@objectstack/service-analytics': 17.0.0-rc.1 + '@objectstack/service-automation': 17.0.0-rc.1 + '@objectstack/service-datasource': 17.0.0-rc.1 + '@objectstack/service-settings': 17.0.0-rc.1(vitest@4.1.10) + '@objectstack/spec': 17.0.0-rc.1 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@better-auth/utils' @@ -4131,7 +4302,7 @@ snapshots: - vitest - vue - '@oclif/core@4.13.1': + '@oclif/core@4.13.2': dependencies: ansi-escapes: 4.3.2 ansis: 3.17.0 @@ -4143,7 +4314,7 @@ snapshots: indent-string: 4.0.0 is-wsl: 2.2.0 lilconfig: 3.1.3 - minimatch: 10.2.5 + minimatch: 10.2.6 semver: 7.8.5 string-width: 4.2.3 supports-color: 8.1.1 @@ -4215,7 +4386,7 @@ snapshots: '@ts-morph/common@0.29.0': dependencies: - minimatch: 10.2.5 + minimatch: 10.2.6 path-browserify: 1.0.1 tinyglobby: 0.2.17 @@ -4374,7 +4545,7 @@ snapshots: ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.4 + fast-uri: 3.1.5 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -4460,24 +4631,24 @@ snapshots: base64-js@1.5.1: {} - better-auth@1.7.0-rc.1(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10): + better-auth@1.7.0-rc.2(better-sqlite3@12.11.1)(mongodb@7.5.0)(vitest@4.1.10): dependencies: - '@better-auth/core': 1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1) - '@better-auth/drizzle-adapter': 1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2) - '@better-auth/kysely-adapter': 1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2)(kysely@0.29.4) - '@better-auth/memory-adapter': 1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2) - '@better-auth/mongo-adapter': 1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2)(mongodb@7.5.0) - '@better-auth/prisma-adapter': 1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2) - '@better-auth/telemetry': 1.7.0-rc.1(@better-auth/core@1.7.0-rc.1(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.4)(kysely@0.29.4)(nanostores@1.4.1))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/drizzle-adapter': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) + '@better-auth/kysely-adapter': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(kysely@0.29.4) + '@better-auth/memory-adapter': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) + '@better-auth/mongo-adapter': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(mongodb@7.5.0) + '@better-auth/prisma-adapter': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) + '@better-auth/telemetry': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) '@better-auth/utils': 0.4.2 '@better-fetch/fetch': 1.3.1 '@noble/ciphers': 2.2.0 '@noble/hashes': 2.2.0 better-call: 1.3.7(zod@4.4.3) defu: 6.1.7 - jose: 6.2.4 + jose: 6.2.5 kysely: 0.29.4 - nanostores: 1.4.1 + nanostores: 1.4.2 zod: 4.4.3 optionalDependencies: better-sqlite3: 12.11.1 @@ -4487,6 +4658,33 @@ snapshots: - '@cloudflare/workers-types' - '@opentelemetry/api' + better-auth@1.7.0-rc.2(better-sqlite3@13.0.2)(mongodb@7.5.0)(vitest@4.1.10): + dependencies: + '@better-auth/core': 1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2) + '@better-auth/drizzle-adapter': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) + '@better-auth/kysely-adapter': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(kysely@0.29.4) + '@better-auth/memory-adapter': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) + '@better-auth/mongo-adapter': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(mongodb@7.5.0) + '@better-auth/prisma-adapter': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2) + '@better-auth/telemetry': 1.7.0-rc.2(@better-auth/core@1.7.0-rc.2(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1)(better-call@1.3.7(zod@4.4.3))(jose@6.2.5)(kysely@0.29.4)(nanostores@1.4.2))(@better-auth/utils@0.4.2)(@better-fetch/fetch@1.3.1) + '@better-auth/utils': 0.4.2 + '@better-fetch/fetch': 1.3.1 + '@noble/ciphers': 2.2.0 + '@noble/hashes': 2.2.0 + better-call: 1.3.7(zod@4.4.3) + defu: 6.1.7 + jose: 6.2.5 + kysely: 0.29.4 + nanostores: 1.4.2 + zod: 4.4.3 + optionalDependencies: + better-sqlite3: 13.0.2 + mongodb: 7.5.0 + vitest: 4.1.10(@vitest/coverage-v8@4.1.10)(esbuild@0.28.1)(tsx@4.23.1)(yaml@2.9.0) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@opentelemetry/api' + better-call@1.3.7(zod@4.4.3): dependencies: '@better-auth/utils': 0.4.2 @@ -4506,6 +4704,11 @@ snapshots: prebuild-install: 7.1.3 optional: true + better-sqlite3@13.0.2: + dependencies: + node-addon-api: 8.9.0 + optional: true + big-integer@1.6.52: {} binary@0.3.0: @@ -4540,16 +4743,16 @@ snapshots: transitivePeerDependencies: - supports-color - brace-expansion@1.1.16: + brace-expansion@1.1.18: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 - brace-expansion@2.1.2: + brace-expansion@2.1.4: dependencies: balanced-match: 1.0.2 - brace-expansion@5.0.8: + brace-expansion@5.0.9: dependencies: balanced-match: 4.0.4 @@ -4593,7 +4796,7 @@ snapshots: dependencies: traverse: 0.3.9 - chalk@5.6.2: {} + chalk@6.0.0: {} chardet@2.2.0: {} @@ -4816,7 +5019,7 @@ snapshots: dependencies: debug: 4.4.3(supports-color@8.1.1) express: 5.2.1 - ip-address: 10.3.1 + ip-address: 10.4.0 transitivePeerDependencies: - supports-color @@ -4870,7 +5073,7 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-uri@3.1.4: {} + fast-uri@3.1.5: {} fast-xml-builder@1.3.0: dependencies: @@ -4987,7 +5190,7 @@ snapshots: glob@13.0.6: dependencies: - minimatch: 10.2.5 + minimatch: 10.2.6 minipass: 7.1.3 path-scurry: 2.0.2 @@ -5021,7 +5224,7 @@ snapshots: dependencies: function-bind: 1.1.2 - hono@4.12.32: {} + hono@4.12.33: {} html-escaper@2.0.2: {} @@ -5059,7 +5262,7 @@ snapshots: interpret@2.2.0: {} - ip-address@10.3.1: {} + ip-address@10.4.0: {} ipaddr.js@1.9.1: {} @@ -5116,7 +5319,7 @@ snapshots: filelist: 1.0.6 picocolors: 1.1.1 - jose@6.2.4: {} + jose@6.2.5: {} js-tokens@10.0.0: {} @@ -5169,6 +5372,27 @@ snapshots: transitivePeerDependencies: - supports-color + knex@3.3.0(better-sqlite3@13.0.2): + dependencies: + colorette: 2.0.19 + commander: 10.0.1 + debug: 4.3.4 + escalade: 3.2.0 + esm: 3.2.25 + get-package-type: 0.1.0 + getopts: 2.3.0 + interpret: 2.2.0 + lodash: 4.18.1 + pg-connection-string: 2.6.2 + rechoir: 0.8.0 + resolve-from: 5.0.0 + tarn: 3.1.2 + tildify: 2.0.0 + optionalDependencies: + better-sqlite3: 13.0.2 + transitivePeerDependencies: + - supports-color + kysely@0.29.4: {} lazystream@1.0.1: @@ -5312,17 +5536,17 @@ snapshots: mingo@7.2.2: {} - minimatch@10.2.5: + minimatch@10.2.6: dependencies: - brace-expansion: 5.0.8 + brace-expansion: 5.0.9 minimatch@3.1.5: dependencies: - brace-expansion: 1.1.16 + brace-expansion: 1.1.18 minimatch@5.1.9: dependencies: - brace-expansion: 2.1.2 + brace-expansion: 2.1.4 minimist@1.2.8: {} @@ -5362,7 +5586,7 @@ snapshots: nanoid@6.0.0: {} - nanostores@1.4.1: {} + nanostores@1.4.2: {} napi-build-utils@2.0.0: optional: true @@ -5374,6 +5598,9 @@ snapshots: semver: 7.8.5 optional: true + node-addon-api@8.9.0: + optional: true + node-rsa@1.1.1: dependencies: asn1: 0.2.6 @@ -5843,11 +6070,11 @@ snapshots: tinyrainbow@3.1.0: {} - tldts-core@7.4.9: {} + tldts-core@7.4.10: {} - tldts@7.4.9: + tldts@7.4.10: dependencies: - tldts-core: 7.4.9 + tldts-core: 7.4.10 tmp@0.2.7: {} diff --git a/src/dashboards/crm.dashboard.ts b/src/dashboards/crm.dashboard.ts index c568ba29..861df341 100644 --- a/src/dashboards/crm.dashboard.ts +++ b/src/dashboards/crm.dashboard.ts @@ -120,7 +120,7 @@ export const CrmOverviewDashboard: Dashboard = { colors: ['#10B981'], 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, zoom: false }, + interaction: { tooltips: true, brush: true }, }, options: { dateGranularity: 'month' }, }, diff --git a/src/dashboards/sales.dashboard.ts b/src/dashboards/sales.dashboard.ts index 4a2720f6..284900ca 100644 --- a/src/dashboards/sales.dashboard.ts +++ b/src/dashboards/sales.dashboard.ts @@ -139,7 +139,7 @@ export const SalesDashboard: Dashboard = { // 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, zoom: false }, + interaction: { tooltips: true, brush: true }, }, options: { dateGranularity: 'month' }, }, diff --git a/src/dashboards/service.dashboard.ts b/src/dashboards/service.dashboard.ts index 5f2f8995..0213bdcd 100644 --- a/src/dashboards/service.dashboard.ts +++ b/src/dashboards/service.dashboard.ts @@ -229,7 +229,7 @@ export const ServiceDashboard: Dashboard = { 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, zoom: false }, + interaction: { tooltips: true, brush: true }, }, options: { dateGranularity: 'day' }, }, diff --git a/src/datasets/account.dataset.ts b/src/datasets/account.dataset.ts index f1d6947e..92702866 100644 --- a/src/datasets/account.dataset.ts +++ b/src/datasets/account.dataset.ts @@ -11,9 +11,7 @@ export const AccountDataset = defineDataset({ dimensions: [ { name: 'industry', label: 'Industry', field: 'industry', type: 'string' }, { name: 'type', label: 'Type', field: 'type', type: 'string' }, - // No `dateGranularity` (intended: month) — see the note on - // opportunity_metrics.close_date for why it cannot be declared on 16.x. - { name: 'created_at', label: 'Created', field: 'created_at', type: 'date' }, + { name: 'created_at', label: 'Created', field: 'created_at', type: 'date', dateGranularity: 'month' }, ], measures: [ { name: 'account_count', label: 'Accounts', aggregate: 'count' }, diff --git a/src/datasets/case.dataset.ts b/src/datasets/case.dataset.ts index 0448b177..a7119776 100644 --- a/src/datasets/case.dataset.ts +++ b/src/datasets/case.dataset.ts @@ -17,11 +17,7 @@ export const CaseDataset = defineDataset({ { name: 'priority', label: 'Priority', field: 'priority', type: 'string' }, { name: 'origin', label: 'Origin', field: 'origin', type: 'string' }, { name: 'type', label: 'Type', field: 'type', type: 'string' }, - // No `dateGranularity` (intended: day, for cases_opened_by_day_priority and - // the Service dashboard's inflow trend) — see the note on - // opportunity_metrics.close_date. `crm_case.created_date` is a - // `Field.datetime()`, so it is blocked by BOTH gaps described there. - { name: 'created_date', label: 'Created', field: 'created_date', type: 'date' }, + { name: 'created_date', label: 'Created', field: 'created_date', type: 'date', dateGranularity: 'day' }, ], measures: [ diff --git a/src/datasets/lead.dataset.ts b/src/datasets/lead.dataset.ts index 549a256a..ecd29cc8 100644 --- a/src/datasets/lead.dataset.ts +++ b/src/datasets/lead.dataset.ts @@ -12,11 +12,7 @@ export const LeadDataset = defineDataset({ { name: 'status', label: 'Status', field: 'status', type: 'string' }, { name: 'lead_source', label: 'Source', field: 'lead_source', type: 'string' }, { name: 'created_at', label: 'Created', field: 'created_at', type: 'date' }, - // No `dateGranularity` (intended: month, for lead_inflow_by_month_source) - // — see the note on opportunity_metrics.close_date for why it cannot be - // declared on 16.x. `crm_lead.last_contacted_date` is a `Field.datetime()`, - // so it is blocked by BOTH gaps described there. - { name: 'last_contacted_date', label: 'Last Contacted', field: 'last_contacted_date', type: 'date' }, + { name: 'last_contacted_date', label: 'Last Contacted', field: 'last_contacted_date', type: 'date', dateGranularity: 'month' }, ], measures: [{ name: 'lead_count', label: 'Leads', aggregate: 'count' }], }); diff --git a/src/datasets/opportunity.dataset.ts b/src/datasets/opportunity.dataset.ts index a862e9cf..87cde54b 100644 --- a/src/datasets/opportunity.dataset.ts +++ b/src/datasets/opportunity.dataset.ts @@ -26,38 +26,11 @@ export const OpportunityDataset = defineDataset({ { name: 'forecast_category', label: 'Forecast Category', field: 'forecast_category', type: 'string' }, { name: 'type', label: 'Deal Type', field: 'type', type: 'string' }, { name: 'owner', label: 'Owner', field: 'owner', type: 'lookup' }, - // ─── Why no `dateGranularity` on any date dimension (hotcrm#523) ──── - // This is the canonical note; the other datasets point here. - // - // Declaring a bucket on a dataset dimension is the supported mechanism and - // IS what these dimensions want (month for the trend widgets, quarter for - // pipeline_coverage_by_quarter, day for cases_opened_by_day_priority). It - // cannot be declared while the app is pinned to @objectstack 16.x: doing so - // makes every affected surface render EMPTY, which is worse than the - // un-bucketed columns it would fix. Two independent 16.x gaps, both - // verified against the pinned packages, both fixed in 17.0.0-rc.0: - // - // 1. Read scope. A granular dimension is refused by NativeSQLStrategy - // (service-analytics `canHandle` bails on any timeDimension carrying a - // granularity), so the query falls through to ObjectQLStrategy → the - // auto-bridged `executeAggregate`, which calls `engine.aggregate()` - // WITHOUT the caller's ExecutionContext. The sharing middleware then - // sees an empty principal and composes `{ id: '__deny_all__' }` for - // every `sharingModel: 'private'` object — which is all of ours. Fixed - // upstream by #3602/#3597: the bridge threads `context`, and the - // strategy applies the read scope itself. - // 2. Bucketing. A `Field.datetime()` column lands in SQLite as INTEGER - // epoch millis, and 16.x buckets with a bare `strftime('%Y-%m', col)` - // — NULL for every row, i.e. a single '—' column. 17.0's driver-sql - // normalises epoch storage before formatting. `Field.date()` columns - // (close_date) are TEXT and bucket correctly even on 16.x, but they - // still hit gap 1. - // - // The intended bucket per dimension is not lost — it lives in - // `test/dataset-granularity.test.ts`, whose guard flips from "must not - // declare" to "must declare" the moment this app moves to @objectstack 17. - // Until then the trend widgets and matrix reports group by the raw date. - { name: 'close_date', label: 'Close Date', field: 'close_date', type: 'date' }, + // v17 fixes scoped aggregate execution and SQLite's epoch bucketing. + // Trends and quarter coverage need different buckets over the same field, + // so each one is its own semantic dimension. + { name: 'close_date', label: 'Close Date', field: 'close_date', type: 'date', dateGranularity: 'month' }, + { name: 'close_quarter', label: 'Close Quarter', field: 'close_date', type: 'date', dateGranularity: 'quarter' }, // Cross-object dimension: account industry via the crm_account relationship. { name: 'account_industry', label: 'Account Industry', field: 'crm_account.industry', type: 'string' }, ], diff --git a/src/flows/campaign-enrollment.flow.ts b/src/flows/campaign-enrollment.flow.ts index 83790b11..89bc4976 100644 --- a/src/flows/campaign-enrollment.flow.ts +++ b/src/flows/campaign-enrollment.flow.ts @@ -65,7 +65,7 @@ export const CampaignEnrollmentFlow: Flow = { // topping up a completed/aborted campaign would corrupt its final // snapshot metrics. (Status values: planning / in_progress / completed / aborted.) id: 'check_campaign_open', type: 'decision', label: 'Campaign Open?', - config: { condition: P`campaignRecord.status == "planning" || campaignRecord.status == "in_progress"` }, + config: { condition: P`vars.campaignRecord.status == "planning" || vars.campaignRecord.status == "in_progress"` }, }, { id: 'query_leads', type: 'get_record', label: 'Find Eligible Leads', @@ -128,7 +128,7 @@ export const CampaignEnrollmentFlow: Flow = { { id: 'e2', source: 'screen_1', target: 'get_campaign', type: 'default' }, { id: 'e3', source: 'get_campaign', target: 'check_campaign_open', type: 'default' }, // Closed campaign → no edge → flow ends without enrolling. - { id: 'e4', source: 'check_campaign_open', target: 'query_leads', type: 'conditional', condition: P`campaignRecord.status == "planning" || campaignRecord.status == "in_progress"`, label: 'Open' }, + { id: 'e4', source: 'check_campaign_open', target: 'query_leads', type: 'conditional', condition: P`vars.campaignRecord.status == "planning" || vars.campaignRecord.status == "in_progress"`, label: 'Open' }, { id: 'e5', source: 'query_leads', target: 'loop_leads', type: 'default' }, { id: 'e6', source: 'loop_leads', target: 'end', type: 'default' }, ], diff --git a/src/flows/case-actions.flow.ts b/src/flows/case-actions.flow.ts index 7c93182f..4bd555fd 100644 --- a/src/flows/case-actions.flow.ts +++ b/src/flows/case-actions.flow.ts @@ -82,6 +82,9 @@ export const CloseCaseFlow: Flow = { description: 'Collect the resolution, then close the case and stop the SLA clock.', type: 'screen', status: 'active', + // `is_closed` is a readonly lifecycle field. This trusted screen flow owns + // the transition and must therefore run with the system writer. + runAs: 'system', variables: [ { name: 'recordId', type: 'text', isInput: true, isOutput: false }, diff --git a/src/flows/case-csat-followup.flow.ts b/src/flows/case-csat-followup.flow.ts index 9c037504..029b0ffd 100644 --- a/src/flows/case-csat-followup.flow.ts +++ b/src/flows/case-csat-followup.flow.ts @@ -47,11 +47,11 @@ export const CaseCsatFollowupFlow: Flow = { { id: 'notify_csat', type: 'notify', label: 'Request Satisfaction Rating', config: { - to: ['{record.owner}'], + recipients: ['{record.owner}'], channels: ['inbox', 'email'], topic: 'case_csat', title: 'Collect CSAT: case {record.case_number}', - body: 'Case {record.case_number} closed yesterday. Reach out to the contact and log their satisfaction rating.', + message: 'Case {record.case_number} closed yesterday. Reach out to the contact and log their satisfaction rating.', actionUrl: '/crm_case/{record.id}', }, }, diff --git a/src/flows/case-escalation.flow.ts b/src/flows/case-escalation.flow.ts index d4b11a3c..e5c691e6 100644 --- a/src/flows/case-escalation.flow.ts +++ b/src/flows/case-escalation.flow.ts @@ -83,12 +83,12 @@ export const CaseEscalationFlow: Flow = { // `{caseRecord.crm_account.name}` both interpolate to the literal // string "undefined" — a phantom recipient and a garbled body. // "reassigned" was also false: this flow never changes the owner. - to: ['{caseRecord.owner}'], + recipients: ['{caseRecord.owner}'], channels: ['inbox', 'email'], severity: 'critical', topic: 'case_escalated', title: 'Case escalated: {caseRecord.case_number}', - body: 'Case {caseRecord.case_number} ({caseRecord.priority}) has been auto-escalated on critical priority. It remains assigned to you.', + message: 'Case {caseRecord.case_number} ({caseRecord.priority}) has been auto-escalated on critical priority. It remains assigned to you.', actionUrl: '/crm_case/{record.id}', }, }, diff --git a/src/flows/case-sla-monitor.flow.ts b/src/flows/case-sla-monitor.flow.ts index e2484fc4..6bf80e5d 100644 --- a/src/flows/case-sla-monitor.flow.ts +++ b/src/flows/case-sla-monitor.flow.ts @@ -81,12 +81,12 @@ export const CaseSlaMonitorFlow: Flow = { config: { // Owner only — `{currentCase.owner.manager}` dot-walks a // lookup, which flow templates interpolate as "undefined". - to: ['{currentCase.owner}'], + recipients: ['{currentCase.owner}'], channels: ['inbox', 'email'], severity: 'critical', topic: 'case_sla_breach', title: 'SLA breached: case {currentCase.case_number}', - body: 'Case {currentCase.case_number} ({currentCase.priority}) passed its SLA due date and has been auto-escalated.', + message: 'Case {currentCase.case_number} ({currentCase.priority}) passed its SLA due date and has been auto-escalated.', actionUrl: '/crm_case/{currentCase.id}', }, }, diff --git a/src/flows/contact-welcome.flow.ts b/src/flows/contact-welcome.flow.ts index 0b6bc72f..decf9035 100644 --- a/src/flows/contact-welcome.flow.ts +++ b/src/flows/contact-welcome.flow.ts @@ -38,11 +38,11 @@ export const ContactWelcomeFlow: Flow = { { id: 'send_welcome', type: 'notify', label: 'Prompt Owner to Welcome', config: { - to: ['{record.owner}'], + recipients: ['{record.owner}'], channels: ['inbox', 'email'], topic: 'contact_welcome', title: 'New contact: {record.first_name} {record.last_name}', - body: '{record.first_name} {record.last_name} was added as a contact. Reach out to welcome them.', + message: '{record.first_name} {record.last_name} was added as a contact. Reach out to welcome them.', actionUrl: '/crm_contact/{record.id}', }, }, diff --git a/src/flows/contract-expiration.flow.ts b/src/flows/contract-expiration.flow.ts index 846c8397..f1210681 100644 --- a/src/flows/contract-expiration.flow.ts +++ b/src/flows/contract-expiration.flow.ts @@ -47,11 +47,11 @@ export const ContractExpirationFlow: Flow = { { id: 'notify_owner', type: 'notify', label: 'Notify Owner', config: { - to: ['{currentContract.owner}'], + recipients: ['{currentContract.owner}'], channels: ['inbox', 'email'], topic: 'contract_expired', title: 'Contract expired: {currentContract.contract_number}', - body: 'Contract {currentContract.contract_number} reached its end date and has been marked expired.', + message: 'Contract {currentContract.contract_number} reached its end date and has been marked expired.', actionUrl: '/crm_contract/{currentContract.id}', }, }, diff --git a/src/flows/contract-renewal.flow.ts b/src/flows/contract-renewal.flow.ts index 2b7ad612..365dc1c2 100644 --- a/src/flows/contract-renewal.flow.ts +++ b/src/flows/contract-renewal.flow.ts @@ -106,11 +106,11 @@ export const ContractRenewalFlow: Flow = { { id: 'notify_owner', type: 'notify', label: 'Notify Owner', config: { - to: ['{currentContract.owner}'], + recipients: ['{currentContract.owner}'], channels: ['inbox', 'email'], topic: 'contract_renewal', title: 'Contract renewal due: {currentContract.contract_number}', - body: 'Contract {currentContract.contract_number} ends on {currentContract.end_date}. Start the renewal conversation now.', + message: 'Contract {currentContract.contract_number} ends on {currentContract.end_date}. Start the renewal conversation now.', actionUrl: '/crm_contract/{currentContract.id}', }, }, diff --git a/src/flows/lead-assignment.flow.ts b/src/flows/lead-assignment.flow.ts index baba9c9a..484ea251 100644 --- a/src/flows/lead-assignment.flow.ts +++ b/src/flows/lead-assignment.flow.ts @@ -58,12 +58,12 @@ export const LeadAssignmentFlow: Flow = { // 'sales_manager' was stored verbatim as sys_inbox_message.user_id, // matching no real user, so these alerts reached nobody. owner is set // on insert (defaultValue os.user.id) and is the accountable party. - to: ['{record.owner}'], + recipients: ['{record.owner}'], channels: ['inbox', 'email'], severity: 'warning', topic: 'lead_routing', title: 'Hot lead — assign within 24h: {record.first_name} {record.last_name}', - body: '{record.first_name} {record.last_name} from {record.company} (rating {record.rating}) needs an owner today.', + message: '{record.first_name} {record.last_name} from {record.company} (rating {record.rating}) needs an owner today.', actionUrl: '/crm_lead/{record.id}', }, }, @@ -78,11 +78,11 @@ export const LeadAssignmentFlow: Flow = { config: { // Route to the lead's owner — see notify_hot for why a bare // 'sales_manager' position never reached anyone. - to: ['{record.owner}'], + recipients: ['{record.owner}'], channels: ['inbox'], topic: 'lead_routing', title: 'New lead to assign: {record.first_name} {record.last_name}', - body: '{record.first_name} {record.last_name} from {record.company} is awaiting assignment.', + message: '{record.first_name} {record.last_name} from {record.company} is awaiting assignment.', actionUrl: '/crm_lead/{record.id}', }, }, diff --git a/src/flows/lead-conversion.flow.ts b/src/flows/lead-conversion.flow.ts index 42035937..7be4455f 100644 --- a/src/flows/lead-conversion.flow.ts +++ b/src/flows/lead-conversion.flow.ts @@ -173,11 +173,11 @@ export const LeadConversionFlow: Flow = { // `script` + `actionType:'email'` shape is a no-op stub in 7.4. id: 'send_notification', type: 'notify', label: 'Send Confirmation', config: { - to: ['{$User.Id}'], + recipients: ['{$User.Id}'], channels: ['inbox', 'email'], topic: 'lead_converted', title: 'Lead converted: {leadRecord.first_name} {leadRecord.last_name}', - body: 'Lead {leadRecord.first_name} {leadRecord.last_name} was converted into an account and contact.', + message: 'Lead {leadRecord.first_name} {leadRecord.last_name} was converted into an account and contact.', actionUrl: '/crm_account/{accountId}', }, }, diff --git a/src/flows/opportunity-approval.flow.ts b/src/flows/opportunity-approval.flow.ts index 1f576e97..428eab98 100644 --- a/src/flows/opportunity-approval.flow.ts +++ b/src/flows/opportunity-approval.flow.ts @@ -131,11 +131,11 @@ export const OpportunityApprovalFlow: Flow = { type: 'notify', label: 'Notify Owner — Approved', config: { - to: ['{oppRecord.owner}'], + recipients: ['{oppRecord.owner}'], channels: ['inbox', 'email'], topic: 'opportunity_approved', title: 'Deal approved: {oppRecord.name}', - body: 'Your opportunity {oppRecord.name} has been approved.', + message: 'Your opportunity {oppRecord.name} has been approved.', actionUrl: '/crm_opportunity/{record.id}', }, }, @@ -156,12 +156,12 @@ export const OpportunityApprovalFlow: Flow = { type: 'notify', label: 'Notify Owner — Rejected', config: { - to: ['{oppRecord.owner}'], + recipients: ['{oppRecord.owner}'], channels: ['inbox', 'email'], severity: 'warning', topic: 'opportunity_rejected', title: 'Deal rejected: {oppRecord.name}', - body: 'Your opportunity {oppRecord.name} was not approved. Review and revise before resubmitting.', + message: 'Your opportunity {oppRecord.name} was not approved. Review and revise before resubmitting.', actionUrl: '/crm_opportunity/{record.id}', }, }, diff --git a/src/flows/opportunity-stagnation.flow.ts b/src/flows/opportunity-stagnation.flow.ts index ddf93042..b037fd84 100644 --- a/src/flows/opportunity-stagnation.flow.ts +++ b/src/flows/opportunity-stagnation.flow.ts @@ -88,11 +88,11 @@ export const OpportunityStagnationFlow: Flow = { // "undefined" (cf. opportunity_won_alert). id: 'notify_owner', type: 'notify', label: 'Nudge Owner', config: { - to: ['{currentOpp.owner}'], + recipients: ['{currentOpp.owner}'], channels: ['inbox', 'email'], topic: 'deal_stalled', title: 'Stalled deal: {currentOpp.name}', - body: 'Opportunity {currentOpp.name} has sat in {currentOpp.stage} for {currentOpp.days_in_stage} days. Time to advance or re-qualify it.', + message: 'Opportunity {currentOpp.name} has sat in {currentOpp.stage} for {currentOpp.days_in_stage} days. Time to advance or re-qualify it.', actionUrl: '/crm_opportunity/{currentOpp.id}', }, }, diff --git a/src/flows/opportunity-won-alert.flow.ts b/src/flows/opportunity-won-alert.flow.ts index 992a5eb2..3bcb757f 100644 --- a/src/flows/opportunity-won-alert.flow.ts +++ b/src/flows/opportunity-won-alert.flow.ts @@ -42,12 +42,12 @@ export const OpportunityWonAlertFlow: Flow = { // Owner only: `{record.owner.manager}` cannot traverse a lookup on the // raw trigger snapshot — it interpolates to the literal "undefined" // and the message is delivered to a phantom user. - to: ['{record.owner}'], + recipients: ['{record.owner}'], channels: ['inbox', 'email'], severity: 'info', topic: 'large_deal_won', title: 'Large deal won: {record.name}', - body: '{record.name} closed at {record.amount}. Congratulations to the team.', + message: '{record.name} closed at {record.amount}. Congratulations to the team.', actionUrl: '/crm_opportunity/{record.id}', }, }, diff --git a/src/flows/quote-generation.flow.ts b/src/flows/quote-generation.flow.ts index ede73305..d4a72a2b 100644 --- a/src/flows/quote-generation.flow.ts +++ b/src/flows/quote-generation.flow.ts @@ -77,11 +77,11 @@ export const QuoteGenerationFlow: Flow = { // `script` + `actionType:'email'` shape is a no-op stub in 7.4. id: 'notify_owner', type: 'notify', label: 'Send Notification', config: { - to: ['{$User.Id}'], + recipients: ['{$User.Id}'], channels: ['inbox', 'email'], topic: 'quote_created', title: 'Quote created: {quoteName}', - body: 'Your quote {quoteName} has been created from this opportunity.', + message: 'Your quote {quoteName} has been created from this opportunity.', actionUrl: '/crm_quote/{quoteId.id}', }, }, diff --git a/src/flows/task-due-reminder.flow.ts b/src/flows/task-due-reminder.flow.ts index 4c48194a..b4ed77a5 100644 --- a/src/flows/task-due-reminder.flow.ts +++ b/src/flows/task-due-reminder.flow.ts @@ -69,12 +69,12 @@ export const TaskDueReminderFlow: Flow = { { id: 'notify_owner', type: 'notify', label: 'Notify Owner', config: { - to: ['{currentTask.owner}'], + recipients: ['{currentTask.owner}'], channels: ['inbox', 'email'], severity: 'warning', topic: 'task_reminder', title: 'Task reminder: {currentTask.subject}', - body: 'Your task "{currentTask.subject}" is due (reminder set for {currentTask.reminder_date}).', + message: 'Your task "{currentTask.subject}" is due (reminder set for {currentTask.reminder_date}).', actionUrl: '/crm_task/{currentTask.id}', }, }, diff --git a/src/flows/task-urgent-alert.flow.ts b/src/flows/task-urgent-alert.flow.ts index c92e32b2..f057ce60 100644 --- a/src/flows/task-urgent-alert.flow.ts +++ b/src/flows/task-urgent-alert.flow.ts @@ -34,12 +34,12 @@ export const TaskUrgentAlertFlow: Flow = { { id: 'notify_owner', type: 'notify', label: 'Notify Owner', config: { - to: ['{record.owner}'], + recipients: ['{record.owner}'], channels: ['inbox', 'email'], severity: 'warning', topic: 'urgent_task', title: 'Urgent task: {record.subject}', - body: 'An urgent task "{record.subject}" was assigned to you and needs attention.', + message: 'An urgent task "{record.subject}" was assigned to you and needs attention.', actionUrl: '/crm_task/{record.id}', }, }, diff --git a/src/objects/account.object.ts b/src/objects/account.object.ts index 5a961aa7..45542ff0 100644 --- a/src/objects/account.object.ts +++ b/src/objects/account.object.ts @@ -47,6 +47,7 @@ export const Account = ObjectSchema.create({ name: Field.text({ label: 'Account Name', required: true, + storage: { notNull: true }, searchable: true, maxLength: 255, group: 'basic', @@ -228,7 +229,7 @@ export const Account = ObjectSchema.create({ // `searchableFields`/per-field `searchable`. enable: { apiEnabled: true, // Expose via REST/GraphQL - apiMethods: ['get', 'list', 'create', 'update', 'delete', 'search', 'export'], // Whitelist allowed API operations + apiMethods: ['get', 'list', 'create', 'update', 'delete'], // Whitelist allowed API operations }, // Validation Rules @@ -250,4 +251,4 @@ export const Account = ObjectSchema.create({ // NOTE: object `workflows[]` were removed in @objectstack 7.7. Field-updates // moved to this object's *.hook.ts; scheduled status-flips & notifications // moved to src/flows/*.flow.ts (see flows/index.ts). -}); \ No newline at end of file +}); diff --git a/src/objects/campaign.object.ts b/src/objects/campaign.object.ts index dfe9d690..0eebdb34 100644 --- a/src/objects/campaign.object.ts +++ b/src/objects/campaign.object.ts @@ -54,6 +54,7 @@ export const Campaign = ObjectSchema.create({ group: 'basic', label: 'Campaign Name', required: true, + storage: { notNull: true }, searchable: true, maxLength: 255, }), @@ -109,6 +110,7 @@ export const Campaign = ObjectSchema.create({ { label: 'Aborted', value: 'aborted', color: '#FF0000' }, ], required: true, + storage: { notNull: true }, trackHistory: true, }), @@ -117,12 +119,14 @@ export const Campaign = ObjectSchema.create({ group: 'schedule', label: 'Start Date', required: true, + storage: { notNull: true }, }), end_date: Field.date({ group: 'schedule', label: 'End Date', required: true, + storage: { notNull: true }, }), // Budget & ROI @@ -261,7 +265,7 @@ export const Campaign = ObjectSchema.create({ // only the live API surface remains. History → Field.trackHistory (ADR-0052). enable: { apiEnabled: true, - apiMethods: ['get', 'list', 'create', 'update', 'delete', 'search', 'export'], + apiMethods: ['get', 'list', 'create', 'update', 'delete'], }, // Validation Rules diff --git a/src/objects/campaign_member.object.ts b/src/objects/campaign_member.object.ts index fd816d93..b06a9f1c 100644 --- a/src/objects/campaign_member.object.ts +++ b/src/objects/campaign_member.object.ts @@ -55,6 +55,7 @@ export const CampaignMember = ObjectSchema.create({ crm_campaign: Field.lookup('crm_campaign', { label: 'Campaign', required: true, + storage: { notNull: true }, group: 'basic', }), @@ -73,6 +74,7 @@ export const CampaignMember = ObjectSchema.create({ status: Field.select({ label: 'Status', required: true, + storage: { notNull: true }, group: 'response', trackHistory: true, options: [ diff --git a/src/objects/case.object.ts b/src/objects/case.object.ts index 82a942c8..bf20a324 100644 --- a/src/objects/case.object.ts +++ b/src/objects/case.object.ts @@ -34,6 +34,7 @@ export const Case = ObjectSchema.create({ label: 'Subject', group: 'basic', required: true, + storage: { notNull: true }, searchable: true, maxLength: 255, }), @@ -49,6 +50,7 @@ export const Case = ObjectSchema.create({ label: 'Description', group: 'basic', required: true, + storage: { notNull: true }, }), // Relationships @@ -75,6 +77,7 @@ export const Case = ObjectSchema.create({ label: 'Status', group: 'basic', required: true, + storage: { notNull: true }, // ADR-0052 §5b.1 — platform auto-renders status changes on the timeline // ("Status: New → Escalated"). Delivers the case timeline declaratively // (the hand-coded version was deferred in #396 due to a hook-crash bug). @@ -94,6 +97,7 @@ export const Case = ObjectSchema.create({ label: 'Priority', group: 'sla', required: true, + storage: { notNull: true }, trackHistory: true, options: [ { label: 'Low', value: 'low', color: '#4169E1', default: true }, diff --git a/src/objects/contact.object.ts b/src/objects/contact.object.ts index 590599c8..ac25da68 100644 --- a/src/objects/contact.object.ts +++ b/src/objects/contact.object.ts @@ -34,12 +34,14 @@ export const Contact = ObjectSchema.create({ first_name: Field.text({ label: 'First Name', required: true, + storage: { notNull: true }, searchable: true, group: 'identity', }), last_name: Field.text({ label: 'Last Name', required: true, + storage: { notNull: true }, searchable: true, group: 'identity', }), @@ -66,6 +68,7 @@ export const Contact = ObjectSchema.create({ crm_account: Field.masterDetail('crm_account', { label: 'Account', required: true, + storage: { notNull: true }, deleteBehavior: 'cascade', // Delete contacts when account is deleted group: 'account_info', }), @@ -110,6 +113,7 @@ export const Contact = ObjectSchema.create({ email: Field.email({ label: 'Email', required: true, + storage: { notNull: true }, unique: true, group: 'contact_info', }), diff --git a/src/objects/contract.object.ts b/src/objects/contract.object.ts index 04f24049..1fc65bad 100644 --- a/src/objects/contract.object.ts +++ b/src/objects/contract.object.ts @@ -48,12 +48,14 @@ export const Contract = ObjectSchema.create({ label: 'Account', group: 'parties', required: true, + storage: { notNull: true }, }), crm_contact: Field.lookup('crm_contact', { label: 'Primary Contact', group: 'parties', required: true, + storage: { notNull: true }, // @objectstack 12: string[] `referenceFilters` is dead (not read by the // picker); `dependsOn` is the live cascading-lookup form — scopes contacts // to the contract's `crm_account` (ADR-0049). @@ -87,6 +89,7 @@ export const Contract = ObjectSchema.create({ { label: 'Terminated', value: 'terminated', color: '#666666' }, ], required: true, + storage: { notNull: true }, trackHistory: true, }), @@ -95,6 +98,7 @@ export const Contract = ObjectSchema.create({ label: 'Contract Term (Months)', group: 'terms', required: true, + storage: { notNull: true }, min: 1, }), @@ -102,12 +106,14 @@ export const Contract = ObjectSchema.create({ label: 'Start Date', group: 'terms', required: true, + storage: { notNull: true }, }), end_date: Field.date({ label: 'End Date', group: 'terms', required: true, + storage: { notNull: true }, }), // Financial @@ -117,6 +123,7 @@ export const Contract = ObjectSchema.create({ scale: 2, min: 0, required: true, + storage: { notNull: true }, }), billing_frequency: Field.select({ @@ -214,7 +221,7 @@ export const Contract = ObjectSchema.create({ // only the live API surface remains. History → Field.trackHistory (ADR-0052). enable: { apiEnabled: true, - apiMethods: ['get', 'list', 'create', 'update', 'delete', 'search', 'export'], + apiMethods: ['get', 'list', 'create', 'update', 'delete'], }, // Validation Rules diff --git a/src/objects/forecast.object.ts b/src/objects/forecast.object.ts index b6148f3f..43826356 100644 --- a/src/objects/forecast.object.ts +++ b/src/objects/forecast.object.ts @@ -62,6 +62,7 @@ export const Forecast = ObjectSchema.create({ period: Field.select({ label: 'Period', required: true, + storage: { notNull: true }, group: 'basic', options: [ { label: 'Month', value: 'month', default: true }, @@ -72,12 +73,14 @@ export const Forecast = ObjectSchema.create({ period_start: Field.date({ label: 'Period Start', required: true, + storage: { notNull: true }, group: 'basic', }), period_end: Field.date({ label: 'Period End', required: true, + storage: { notNull: true }, group: 'basic', }), @@ -101,6 +104,7 @@ export const Forecast = ObjectSchema.create({ label: 'Snapshot Date', description: 'The day this snapshot was captured.', required: true, + storage: { notNull: true }, group: 'meta', }), @@ -192,7 +196,7 @@ export const Forecast = ObjectSchema.create({ // only the live API surface remains. History → Field.trackHistory (ADR-0052). enable: { apiEnabled: true, - apiMethods: ['get', 'list', 'create', 'update', 'delete', 'search', 'export'], + apiMethods: ['get', 'list', 'create', 'update', 'delete'], }, validations: [ diff --git a/src/objects/knowledge_article.object.ts b/src/objects/knowledge_article.object.ts index a536cea0..1f8cf04c 100644 --- a/src/objects/knowledge_article.object.ts +++ b/src/objects/knowledge_article.object.ts @@ -48,6 +48,7 @@ export const KnowledgeArticle = ObjectSchema.create({ title: Field.text({ label: 'Title', required: true, + storage: { notNull: true }, searchable: true, maxLength: 255, group: 'basic', @@ -108,6 +109,7 @@ export const KnowledgeArticle = ObjectSchema.create({ status: Field.select({ label: 'Status', required: true, + storage: { notNull: true }, group: 'basic', trackHistory: true, options: [ @@ -121,6 +123,7 @@ export const KnowledgeArticle = ObjectSchema.create({ audience: Field.select({ label: 'Audience', required: true, + storage: { notNull: true }, group: 'basic', description: 'Public articles are visible in the customer portal; internal articles are agent-only.', options: [ @@ -200,7 +203,7 @@ export const KnowledgeArticle = ObjectSchema.create({ // only the live API surface remains. History → Field.trackHistory (ADR-0052). enable: { apiEnabled: true, - apiMethods: ['get', 'list', 'create', 'update', 'delete', 'search', 'export'], + apiMethods: ['get', 'list', 'create', 'update', 'delete'], }, validations: [ diff --git a/src/objects/lead.object.ts b/src/objects/lead.object.ts index 482271ba..7de148aa 100644 --- a/src/objects/lead.object.ts +++ b/src/objects/lead.object.ts @@ -38,6 +38,7 @@ export const Lead = ObjectSchema.create({ first_name: Field.text({ label: 'First Name', required: true, + storage: { notNull: true }, searchable: true, group: 'identity', }), @@ -45,6 +46,7 @@ export const Lead = ObjectSchema.create({ last_name: Field.text({ label: 'Last Name', required: true, + storage: { notNull: true }, searchable: true, group: 'identity', }), @@ -71,6 +73,7 @@ export const Lead = ObjectSchema.create({ company: Field.text({ label: 'Company', required: true, + storage: { notNull: true }, searchable: true, group: 'company_info', }), @@ -92,6 +95,7 @@ export const Lead = ObjectSchema.create({ email: Field.email({ label: 'Email', required: true, + storage: { notNull: true }, unique: true, group: 'contact_info', }), @@ -117,6 +121,7 @@ export const Lead = ObjectSchema.create({ status: Field.select({ label: 'Lead Status', required: true, + storage: { notNull: true }, group: 'qualification', trackHistory: true, // Field-level default: option-level `default: true` only preselects in diff --git a/src/objects/opportunity.object.ts b/src/objects/opportunity.object.ts index 9e933e08..90706d48 100644 --- a/src/objects/opportunity.object.ts +++ b/src/objects/opportunity.object.ts @@ -43,6 +43,7 @@ export const Opportunity = ObjectSchema.create({ name: Field.text({ label: 'Opportunity Name', required: true, + storage: { notNull: true }, searchable: true, group: 'basic', }), @@ -54,6 +55,7 @@ export const Opportunity = ObjectSchema.create({ crm_account: Field.lookup('crm_account', { label: 'Account', required: true, + storage: { notNull: true }, group: 'basic', }), @@ -78,6 +80,7 @@ export const Opportunity = ObjectSchema.create({ amount: Field.currency({ label: 'Amount', required: true, + storage: { notNull: true }, scale: 2, min: 0, group: 'financials', @@ -95,6 +98,7 @@ export const Opportunity = ObjectSchema.create({ stage: Field.select({ label: 'Stage', required: true, + storage: { notNull: true }, group: 'sales_process', // ADR-0052 §5b.1 — the platform auto-renders each stage change on the // activity timeline as "Stage: Proposal → Negotiation" (no hook code). @@ -116,6 +120,7 @@ export const Opportunity = ObjectSchema.create({ close_date: Field.date({ label: 'Close Date', required: true, + storage: { notNull: true }, group: 'sales_process', trackHistory: true, }), @@ -309,7 +314,7 @@ export const Opportunity = ObjectSchema.create({ // per-field via Field.trackHistory (ADR-0052). enable: { apiEnabled: true, - apiMethods: ['get', 'list', 'create', 'update', 'delete', 'aggregate', 'search'], // Whitelist allowed API operations + apiMethods: ['get', 'list', 'create', 'update', 'delete'], // Whitelist allowed API operations }, // ADR-0052 §5b.2 — declarative milestone activity. When `stage` enters these @@ -379,4 +384,4 @@ export const Opportunity = ObjectSchema.create({ // NOTE: object `workflows[]` were removed in @objectstack 7.7. Field-updates // moved to this object's *.hook.ts; scheduled status-flips & notifications // moved to src/flows/*.flow.ts (see flows/index.ts). -}); \ No newline at end of file +}); diff --git a/src/objects/opportunity_line_item.object.ts b/src/objects/opportunity_line_item.object.ts index 0a8c20b3..3b4536a7 100644 --- a/src/objects/opportunity_line_item.object.ts +++ b/src/objects/opportunity_line_item.object.ts @@ -43,11 +43,13 @@ export const OpportunityLineItem = ObjectSchema.create({ crm_opportunity: Field.lookup('crm_opportunity', { label: 'Opportunity', required: true, + storage: { notNull: true }, }), crm_product: Field.lookup('crm_product', { label: 'Product', required: true, + storage: { notNull: true }, }), description: Field.text({ @@ -58,6 +60,7 @@ export const OpportunityLineItem = ObjectSchema.create({ quantity: Field.number({ label: 'Quantity', required: true, + storage: { notNull: true }, scale: 2, min: 0, defaultValue: 1, @@ -73,6 +76,7 @@ export const OpportunityLineItem = ObjectSchema.create({ unit_price: Field.currency({ label: 'Sales Price', required: true, + storage: { notNull: true }, description: 'Negotiated unit price (may differ from list price)', trackHistory: true, }), diff --git a/src/objects/product.object.ts b/src/objects/product.object.ts index 55ebad90..c677cef3 100644 --- a/src/objects/product.object.ts +++ b/src/objects/product.object.ts @@ -46,6 +46,7 @@ export const Product = ObjectSchema.create({ label: 'Product Name', group: 'basic', required: true, + storage: { notNull: true }, searchable: true, maxLength: 255, }), @@ -93,6 +94,7 @@ export const Product = ObjectSchema.create({ scale: 2, min: 0, required: true, + storage: { notNull: true }, }), cost: Field.currency({ @@ -209,7 +211,7 @@ export const Product = ObjectSchema.create({ // only the live API surface remains. History → Field.trackHistory (ADR-0052). enable: { apiEnabled: true, - apiMethods: ['get', 'list', 'create', 'update', 'delete', 'search'], + apiMethods: ['get', 'list', 'create', 'update', 'delete'], }, // Validation Rules diff --git a/src/objects/quote.object.ts b/src/objects/quote.object.ts index 48a0e5e8..e9114928 100644 --- a/src/objects/quote.object.ts +++ b/src/objects/quote.object.ts @@ -49,6 +49,7 @@ export const Quote = ObjectSchema.create({ label: 'Quote Name', group: 'basic', required: true, + storage: { notNull: true }, searchable: true, maxLength: 255, }), @@ -65,6 +66,7 @@ export const Quote = ObjectSchema.create({ label: 'Account', group: 'basic', required: true, + storage: { notNull: true }, }), crm_contact: Field.lookup('crm_contact', { @@ -106,6 +108,7 @@ export const Quote = ObjectSchema.create({ { label: 'Expired', value: 'expired', color: '#666666' }, ], required: true, + storage: { notNull: true }, trackHistory: true, }), @@ -114,6 +117,7 @@ export const Quote = ObjectSchema.create({ label: 'Quote Date', group: 'terms', required: true, + storage: { notNull: true }, defaultValue: cel`today()`, }), @@ -121,6 +125,7 @@ export const Quote = ObjectSchema.create({ label: 'Expiration Date', group: 'terms', required: true, + storage: { notNull: true }, }), // Pricing @@ -216,7 +221,7 @@ export const Quote = ObjectSchema.create({ // only the live API surface remains. History → Field.trackHistory (ADR-0052). enable: { apiEnabled: true, - apiMethods: ['get', 'list', 'create', 'update', 'delete', 'search', 'export'], + apiMethods: ['get', 'list', 'create', 'update', 'delete'], }, // Validation Rules diff --git a/src/objects/quote_line_item.object.ts b/src/objects/quote_line_item.object.ts index 3f40c014..16bebacc 100644 --- a/src/objects/quote_line_item.object.ts +++ b/src/objects/quote_line_item.object.ts @@ -40,11 +40,13 @@ export const QuoteLineItem = ObjectSchema.create({ crm_quote: Field.lookup('crm_quote', { label: 'Quote', required: true, + storage: { notNull: true }, }), crm_product: Field.lookup('crm_product', { label: 'Product', required: true, + storage: { notNull: true }, }), description: Field.text({ @@ -55,6 +57,7 @@ export const QuoteLineItem = ObjectSchema.create({ quantity: Field.number({ label: 'Quantity', required: true, + storage: { notNull: true }, scale: 2, min: 0, defaultValue: 1, @@ -69,6 +72,7 @@ export const QuoteLineItem = ObjectSchema.create({ unit_price: Field.currency({ label: 'Sales Price', required: true, + storage: { notNull: true }, trackHistory: true, }), diff --git a/src/objects/task.object.ts b/src/objects/task.object.ts index 9ed9a670..7a14616a 100644 --- a/src/objects/task.object.ts +++ b/src/objects/task.object.ts @@ -36,6 +36,7 @@ export const Task = ObjectSchema.create({ group: 'basic', label: 'Subject', required: true, + storage: { notNull: true }, searchable: true, maxLength: 255, }), @@ -50,6 +51,7 @@ export const Task = ObjectSchema.create({ group: 'basic', label: 'Status', required: true, + storage: { notNull: true }, trackHistory: true, // Field-level default, not just the option flag: the option `default` // only preselects in some form surfaces, so a quick-create modal opened @@ -69,6 +71,7 @@ export const Task = ObjectSchema.create({ group: 'basic', label: 'Priority', required: true, + storage: { notNull: true }, trackHistory: true, // `normal` is the default rather than `low`: a rep filing a to-do has // made no priority judgement, and defaulting everything to Low made the diff --git a/src/reports/case.report.ts b/src/reports/case.report.ts index f96104da..3a581572 100644 --- a/src/reports/case.report.ts +++ b/src/reports/case.report.ts @@ -33,12 +33,8 @@ export const SlaPerformanceReport: ReportInput = { * use this to spot priority spikes (e.g. a P1 burst on Tuesday) and staff * accordingly. * - * The across axis is NOT bucketed by day yet: `case_metrics` cannot declare - * `dateGranularity` while the app is pinned to @objectstack 16.x (see the note - * on `opportunity_metrics.close_date`; hotcrm#523). Seeded cases carry a - * midnight timestamp, so the raw columns happen to READ as days — but they are - * raw timestamps, and a case created mid-afternoon gets its own column. The - * day bucket is pinned as intent in `test/dataset-granularity.test.ts`. + * `case_metrics.created_date` declares the day bucket, so records created at + * different times on the same day aggregate into one column. */ export const CasesOpenedByDayPriorityReport: ReportInput = { name: 'cases_opened_by_day_priority', diff --git a/src/reports/lead.report.ts b/src/reports/lead.report.ts index 4c1b6fc2..00660dcb 100644 --- a/src/reports/lead.report.ts +++ b/src/reports/lead.report.ts @@ -8,11 +8,8 @@ import type { ReportInput } from '@objectstack/spec/ui'; * realistic demo). Lets a marketing-ops lead spot which channels we're * actively working month-over-month. * - * The across axis is NOT bucketed by month yet: `lead_metrics` cannot declare - * `dateGranularity` while the app is pinned to @objectstack 16.x (both gaps - * are spelled out on `opportunity_metrics.close_date`; hotcrm#523), so the - * columns are one-per-raw-date until the 17.0 upgrade lands. The month bucket - * is pinned as intent in `test/dataset-granularity.test.ts`. + * `lead_metrics.last_contacted_date` declares the month bucket, so each column + * represents one calendar month instead of a raw timestamp. */ export const LeadInflowByMonthSourceReport: ReportInput = { name: 'lead_inflow_by_month_source', diff --git a/src/reports/opportunity.report.ts b/src/reports/opportunity.report.ts index 147e7496..fb1fce95 100644 --- a/src/reports/opportunity.report.ts +++ b/src/reports/opportunity.report.ts @@ -28,23 +28,15 @@ export const WonOpportunitiesByOwnerReport: ReportInput = { /** * Quarterly pipeline coverage — the matrix view that powers the classic * sales-ops "pipeline coverage" conversation: each forecast category against - * the quarter the deal is expected to close in. `close_date` is the across - * dimension (`columns`). - * - * It is NOT bucketed into quarters yet — the comment here used to claim "the - * dataset's dateGranularity buckets it into quarters", but no such declaration - * exists (it was dropped in the v9 single-form migration and cannot be - * restored on @objectstack 16.x; see the note on - * `opportunity_metrics.close_date`, hotcrm#523). Restoring it needs a - * DEDICATED quarter dimension rather than a bucket on `close_date` itself: - * that dimension is shared with the Sales/CRM/Executive revenue trends, which - * want month. Both intents are pinned in `test/dataset-granularity.test.ts`. + * the quarter the deal is expected to close in. `close_quarter` is a dedicated + * quarterly dimension over the same field; the trend widgets keep their + * monthly `close_date` dimension. */ export const PipelineCoverageByQuarterReport: ReportInput = { name: 'pipeline_coverage_by_quarter', label: 'Pipeline Coverage by Forecast × Quarter', description: 'Open pipeline amount by forecast category, bucketed by close quarter', - dataset: 'opportunity_metrics', rows: ['forecast_category'], columns: ['close_date'], values: ['total_amount', 'opp_count'], + dataset: 'opportunity_metrics', rows: ['forecast_category'], columns: ['close_quarter'], values: ['total_amount', 'opp_count'], type: 'matrix', runtimeFilter: { stage: { $nin: ['closed_won', 'closed_lost'] } }, }; diff --git a/src/skills/case-triage.skill.ts b/src/skills/case-triage.skill.ts index 7094a6c2..bf7998dd 100644 --- a/src/skills/case-triage.skill.ts +++ b/src/skills/case-triage.skill.ts @@ -48,13 +48,6 @@ export const CaseTriageSkill = defineSkill({ tools: ['describe_object', 'get_record'], - triggerPhrases: [ - 'triage this case', - 'prioritise case', - 'how urgent is this', - 'case severity', - ], - triggerConditions: [ { field: 'objectName', operator: 'eq', value: 'crm_case' }, ], diff --git a/src/skills/customer-360.skill.ts b/src/skills/customer-360.skill.ts index b793c6f8..0fec27ac 100644 --- a/src/skills/customer-360.skill.ts +++ b/src/skills/customer-360.skill.ts @@ -60,10 +60,4 @@ customer / account / contact: tools: ['describe_object', 'get_record', 'query_records', 'aggregate_data'], - triggerPhrases: [ - 'customer 360', - 'tell me about this account', - 'give me the full picture', - 'account summary', - ], }); diff --git a/src/skills/email-drafting.skill.ts b/src/skills/email-drafting.skill.ts index ae40d378..15ed8131 100644 --- a/src/skills/email-drafting.skill.ts +++ b/src/skills/email-drafting.skill.ts @@ -38,11 +38,4 @@ export const EmailDraftingSkill = defineSkill({ tools: ['get_record', 'query_records'], - triggerPhrases: [ - 'draft an email', - 'write a follow-up', - 'compose email', - 'optimise subject line', - 'email template', - ], }); diff --git a/src/skills/lead-qualification.skill.ts b/src/skills/lead-qualification.skill.ts index 0ce585a1..02aa2c62 100644 --- a/src/skills/lead-qualification.skill.ts +++ b/src/skills/lead-qualification.skill.ts @@ -46,14 +46,6 @@ export const LeadQualificationSkill = defineSkill({ 'action_schedule_followup', ], - triggerPhrases: [ - 'qualify this lead', - 'score this lead', - 'is this a hot lead', - 'BANT analysis', - 'lead score', - ], - triggerConditions: [ { field: 'objectName', operator: 'eq', value: 'crm_lead' }, ], diff --git a/src/skills/live-data.skill.ts b/src/skills/live-data.skill.ts index 796f736c..c57dee8f 100644 --- a/src/skills/live-data.skill.ts +++ b/src/skills/live-data.skill.ts @@ -41,15 +41,4 @@ record (account, contact, lead, opportunity, case, quote, etc.): 'aggregate_data', ], - triggerPhrases: [ - 'show me', - 'how many', - 'list', - 'count', - 'sum', - 'top', - 'recent', - 'pipeline', - 'forecast', - ], }); diff --git a/src/skills/revenue-forecasting.skill.ts b/src/skills/revenue-forecasting.skill.ts index 5e07d105..e72a3df3 100644 --- a/src/skills/revenue-forecasting.skill.ts +++ b/src/skills/revenue-forecasting.skill.ts @@ -40,14 +40,6 @@ risk, or deal slippage: tools: ['describe_object', 'aggregate_data', 'query_records', 'visualize_data'], - triggerPhrases: [ - 'forecast revenue', - 'pipeline health', - 'at-risk deals', - 'how is the quarter looking', - 'revenue projection', - ], - triggerConditions: [ { field: 'objectName', operator: 'in', value: ['crm_opportunity', 'dashboard'] }, ], diff --git a/src/translations/en.ts b/src/translations/en.ts index 7e73e1ff..24aa6b7a 100644 --- a/src/translations/en.ts +++ b/src/translations/en.ts @@ -689,8 +689,6 @@ export const en: TranslationData = { group_sales: { label: 'Sales' }, group_service: { label: 'Service' }, group_marketing: { label: 'Marketing' }, - group_products: { label: 'Products' }, - group_analytics: { label: 'Analytics' }, }, }, }, diff --git a/src/translations/es-ES.ts b/src/translations/es-ES.ts index b57adc0f..97c6bd42 100644 --- a/src/translations/es-ES.ts +++ b/src/translations/es-ES.ts @@ -647,8 +647,6 @@ export const esES: TranslationData = { group_sales: { label: 'Ventas' }, group_service: { label: 'Servicio' }, group_marketing: { label: 'Marketing' }, - group_products: { label: 'Productos' }, - group_analytics: { label: 'Analíticas' }, }, }, }, diff --git a/src/translations/ja-JP.ts b/src/translations/ja-JP.ts index 2b47bb5f..363ab611 100644 --- a/src/translations/ja-JP.ts +++ b/src/translations/ja-JP.ts @@ -647,8 +647,6 @@ export const jaJP: TranslationData = { group_sales: { label: '営業' }, group_service: { label: 'サービス' }, group_marketing: { label: 'マーケティング' }, - group_products: { label: '製品' }, - group_analytics: { label: '分析' }, }, }, }, diff --git a/src/translations/zh-CN.ts b/src/translations/zh-CN.ts index ea136298..8ce07ad3 100644 --- a/src/translations/zh-CN.ts +++ b/src/translations/zh-CN.ts @@ -509,17 +509,11 @@ export const zhCN: TranslationData = { label: '升级工单', confirmText: '此操作会将工单升级到升级处理团队,是否继续?', successMessage: '工单升级成功!', - params: { - reason: { label: '升级原因' }, - }, }, close_case: { label: '关闭工单', confirmText: '确定要关闭此工单吗?', successMessage: '工单已成功关闭!', - params: { - resolution: { label: '解决方案' }, - }, }, }, _sections: { @@ -879,9 +873,6 @@ export const zhCN: TranslationData = { label: 'HotCRM', description: '涵盖销售、服务和市场营销的客户关系管理系统', // Keyed by navigation-node `id` (a flat keyspace regardless of depth). - // The groups were translated but every leaf was not, so the sidebar read - // "销售 / Leads / Accounts / …" — half Chinese, half English. `group_products` - // and `group_analytics` were translations for nodes that don't exist. navigation: { nav_home: { label: '首页' }, @@ -921,7 +912,6 @@ export const zhCN: TranslationData = { group_approvals: { label: '审批' }, nav_approval_requests: { label: '待我审批' }, - nav_approval_processes: { label: '审批流程' }, }, }, }, diff --git a/src/views/case.view.ts b/src/views/case.view.ts index 26b88d0a..3fb6fd4a 100644 --- a/src/views/case.view.ts +++ b/src/views/case.view.ts @@ -55,11 +55,8 @@ export const CaseViews = defineView({ { name: 'at_risk', label: 'SLA at Risk', icon: 'clock-alert', view: 'sla_at_risk' }, { name: 'mine', label: 'My Cases', icon: 'user', view: 'my_open_cases' }, ], - // Escalate straight from the queue: escalate_case's own `locations: - // ['list_item']` auto-injects the row-menu item. Do not repeat it here as - // a string — the legacy rowActions path dispatches the string as an - // action TYPE, yielding a duplicate, dead entry (objectui#2960). - rowActions: ['edit'], + // Escalate straight from the queue: escalate_case's own + // `locations: ['list_item']` auto-injects the row-menu item. }, listViews: { diff --git a/src/views/lead.view.ts b/src/views/lead.view.ts index 980f0c54..e30044fa 100644 --- a/src/views/lead.view.ts +++ b/src/views/lead.view.ts @@ -84,13 +84,9 @@ export const LeadViews = defineView({ view: 'detail_form', // Use named form view }, - // List Actions — built-ins only. `convert_lead` / `schedule_followup` - // must NOT be repeated here: they already declare `locations: - // ['list_item']` on their Action defs, which auto-injects the menu item. - // A string entry here goes through the legacy rowActions path (the string - // is dispatched as an action TYPE — objectstack-ai/objectui#2960), which - // produced a second, dead "Convert Lead" item next to the working one. - rowActions: ['edit', 'delete'], + // `convert_lead` / `schedule_followup` declare `locations: ['list_item']` + // and are auto-injected into the menu. Do not add strings here: the legacy + // rowActions surface only dispatches defined stack actions. // Built-in `exportOptions` covers CSV export; no export action needed. bulkActions: ['create_campaign'], diff --git a/src/views/opportunity.view.ts b/src/views/opportunity.view.ts index 9b5d1b81..ac7ab97a 100644 --- a/src/views/opportunity.view.ts +++ b/src/views/opportunity.view.ts @@ -71,13 +71,10 @@ export const OpportunityViews = defineView({ { name: 'closing', label: 'Closing Soon', icon: 'calendar-check', view: 'closing_this_quarter' }, ], // List-level entry points: generate_quote reaches the row menu via its - // own `locations: ['list_item']` — repeating it here as a string would go - // through the legacy rowActions path and render a duplicate, dead item - // (objectstack-ai/objectui#2960). mass_update_stage stays wired even + // own `locations: ['list_item']`. mass_update_stage stays wired even // though console 16.1.0 cannot deliver bulk selections yet (tracked in // issue #508 — see the note in opportunity.actions.ts). Built-in // `exportOptions` covers CSV export. - rowActions: ['edit'], bulkActions: ['mass_update_stage'], }, diff --git a/test/action-sandbox.test.ts b/test/action-sandbox.test.ts index 5ef8123f..0979803a 100644 --- a/test/action-sandbox.test.ts +++ b/test/action-sandbox.test.ts @@ -92,12 +92,13 @@ describe('the sandbox engine stub obeys the kernel’s update contract', () => { // The real kernel first. `ctx.api` in production is an ObjectRepository (or // the runtime's identical repo facade), whose update takes `(data, options)` // — so passing an id string as `data` leaves the engine with nothing to - // resolve, and it says so rather than updating every row. + // resolve. v17 now rejects the second positional document as an unknown + // option rather than risking a write to every row. const api = ql.createContext({ isSystem: true }); const row = await api.object('crm_opportunity').insert({ name: 'A', stage: 'prospecting' }); await expect( (api.object('crm_opportunity') as AnyRec).update(row.id, { stage: 'closed_won' }), - ).rejects.toThrow(/Update requires an ID or options\.multi=true/); + ).rejects.toThrow(/does not recognise option 'stage'|Update requires an ID or options\.multi=true/); expect((await api.object('crm_opportunity').findOne({ where: { id: row.id } }))?.stage).toBe('prospecting'); // Now the stub, reached the way a body reaches it: through the runtime's @@ -105,7 +106,7 @@ describe('the sandbox engine stub obeys the kernel’s update contract', () => { const engine = makeSandboxEngine({ crm_opportunity: [{ id: 'opp_1', stage: 'prospecting' }] }); await expect( runActionBody(writerAction(`await ctx.api.object('crm_opportunity').update('opp_1', { stage: 'closed_won' });`), { engine }), - ).rejects.toThrow(/Update requires an ID or options\.multi=true/); + ).rejects.toThrow(/does not recognise option 'stage'|Update requires an ID or options\.multi=true/); expect(engine.rows('crm_opportunity')[0]!.stage).toBe('prospecting'); }); diff --git a/test/hook-query-predicate.test.ts b/test/hook-query-predicate.test.ts index 2eff010d..da8cdb53 100644 --- a/test/hook-query-predicate.test.ts +++ b/test/hook-query-predicate.test.ts @@ -88,41 +88,30 @@ describe('ctx.api query predicate — against the real kernel', () => { }); /** - * Characterisation of the kernel as it ships in @objectstack/objectql 16.1.0. - * These are NOT the behaviour we want — they are the trap this change exists - * to close, pinned so nobody "helpfully" reintroduces `filter` believing the - * two spellings are interchangeable. - * - * If one of these starts failing, the platform has fixed the underlying - * silent-drop (reported separately to the @objectstack maintainers — it is - * framework behaviour, not ours to patch here). That is good news: confirm - * against the release notes, then relax the assertion. Do not just delete it, - * and do not read a kernel fix as licence to go back to `filter` — `where` is - * the spelling every read path has always honoured. + * v17 makes `filter` a live predicate alias across repository reads. Keep + * this compatibility contract explicit while production hooks continue to + * use canonical `where`. */ - describe('filter: — the unsupported spelling the kernel drops silently', () => { - it('findOne ignores the predicate and yields the first row', async () => { + describe('filter: — supported repository predicate alias', () => { + it('findOne applies the predicate', async () => { const hit = await api.object('crm_account').findOne({ filter: { id: second.id } } as any); - expect(hit?.id).not.toBe(second.id); - expect(hit?.id).toBe(first.id); + expect(hit?.id).toBe(second.id); }); - it('findOne yields the first row even when the predicate matches nothing', async () => { - // The most dangerous shape: a caller that checks for null gets a record. + it('findOne returns null when the predicate matches nothing', async () => { const hit = await api.object('crm_account').findOne({ where: undefined, filter: { id: 'no_such_id' } } as any); - expect(hit).not.toBeNull(); - expect(hit?.id).toBe(first.id); + expect(hit).toBeNull(); }); - it('count ignores the predicate and counts the whole object', async () => { + it('count applies the predicate', async () => { const n = await api.object('crm_account').count({ filter: { annual_revenue: 100 } } as any); - expect(n).toBe(2); // 1 row actually matches + expect(n).toBe(1); }); - it('never throws — which is exactly why this was invisible', async () => { + it('does not throw when a predicate has no match', async () => { await expect( api.object('crm_account').findOne({ filter: { id: 'no_such_id' } } as any), - ).resolves.toBeDefined(); + ).resolves.toBeNull(); }); }); }); From 3566daa1ba8799c367c2c071408c888782c7363b Mon Sep 17 00:00:00 2001 From: Jack Zhuang <277994282+os-zhuang@users.noreply.github.com> Date: Sat, 1 Aug 2026 01:16:36 +0800 Subject: [PATCH 2/3] chore: sync StackBlitz npm lockfile --- package-lock.json | 1067 +++++++++++++++++++++++---------------------- 1 file changed, 557 insertions(+), 510 deletions(-) diff --git a/package-lock.json b/package-lock.json index 02f1813d..381e276d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,17 +9,17 @@ "version": "2.2.2", "license": "Apache-2.0", "dependencies": { - "@objectstack/account": "16.1.0", - "@objectstack/cli": "16.1.0", - "@objectstack/driver-memory": "16.1.0", - "@objectstack/driver-sql": "16.1.0", - "@objectstack/driver-sqlite-wasm": "16.1.0", - "@objectstack/metadata": "16.1.0", - "@objectstack/objectql": "16.1.0", - "@objectstack/runtime": "16.1.0", - "@objectstack/service-analytics": "16.1.0", - "@objectstack/service-automation": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/account": "17.0.0-rc.1", + "@objectstack/cli": "17.0.0-rc.1", + "@objectstack/driver-memory": "17.0.0-rc.1", + "@objectstack/driver-sql": "17.0.0-rc.1", + "@objectstack/driver-sqlite-wasm": "17.0.0-rc.1", + "@objectstack/metadata": "17.0.0-rc.1", + "@objectstack/objectql": "17.0.0-rc.1", + "@objectstack/runtime": "17.0.0-rc.1", + "@objectstack/service-analytics": "17.0.0-rc.1", + "@objectstack/service-automation": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "devDependencies": { "@changesets/cli": "^2.31.1", @@ -131,9 +131,9 @@ } }, "node_modules/@better-auth/core": { - "version": "1.7.0-rc.1", - "resolved": "https://registry.npmjs.org/@better-auth/core/-/core-1.7.0-rc.1.tgz", - "integrity": "sha512-qwVJ5LBPAp8FhhRbUzJDv8cp6h6sn266PPJIXBhB2aYXee40/VGpyoTmx9+LmOotOLQ4BWSO5rCSDvS8FGVdEQ==", + "version": "1.7.0-rc.2", + "resolved": "https://registry.npmjs.org/@better-auth/core/-/core-1.7.0-rc.2.tgz", + "integrity": "sha512-NreNGg68j4qUVVYTcC1DtvRTwSJdCavH5igrMyTO5ghZxnzL4G539uRIzOZmJ64MLzOyOwzWH+JHqpVaj0ZRxw==", "license": "MIT", "dependencies": { "@opentelemetry/semantic-conventions": "^1.41.1", @@ -160,12 +160,12 @@ } }, "node_modules/@better-auth/drizzle-adapter": { - "version": "1.7.0-rc.1", - "resolved": "https://registry.npmjs.org/@better-auth/drizzle-adapter/-/drizzle-adapter-1.7.0-rc.1.tgz", - "integrity": "sha512-r2PjeNFZpWwkW9hvMyE+sgqzYPm3+pB7wE6+aL/iVl0SumqJns1fTFZiqTlQP67AUhJHO2Oelra+WdrtEE0v5Q==", + "version": "1.7.0-rc.2", + "resolved": "https://registry.npmjs.org/@better-auth/drizzle-adapter/-/drizzle-adapter-1.7.0-rc.2.tgz", + "integrity": "sha512-o6HCC8PCyvg1/BQaNWvJM7kO8svXWvuM++APj7ah+iEfFWcp0yklNQWLijDLu+PAaoKHwNMgDpmclDruirHdPA==", "license": "MIT", "peerDependencies": { - "@better-auth/core": "^1.7.0-rc.1", + "@better-auth/core": "^1.7.0-rc.2", "@better-auth/utils": "0.4.2", "drizzle-orm": "^0.45.2 || >=1.0.0-rc.1 <2.0.0" }, @@ -176,12 +176,12 @@ } }, "node_modules/@better-auth/kysely-adapter": { - "version": "1.7.0-rc.1", - "resolved": "https://registry.npmjs.org/@better-auth/kysely-adapter/-/kysely-adapter-1.7.0-rc.1.tgz", - "integrity": "sha512-8ykUlvqJERPJj3fohgc66VA091tGNiZlw0Pr4YnChr4n7bSqI6P/9bic1g6+XiGz10Li4t0qGcyqBpXKJb/iTw==", + "version": "1.7.0-rc.2", + "resolved": "https://registry.npmjs.org/@better-auth/kysely-adapter/-/kysely-adapter-1.7.0-rc.2.tgz", + "integrity": "sha512-g65JeOOseffsqHJXOM0/+SdPvojXzFPejVEFKuUatkdfXcw/l0zEiEkH38Ag5SWFaqfvog/wRPY/MK8PC/ODvg==", "license": "MIT", "peerDependencies": { - "@better-auth/core": "^1.7.0-rc.1", + "@better-auth/core": "^1.7.0-rc.2", "@better-auth/utils": "0.4.2", "kysely": "^0.28.17 || ^0.29.0" }, @@ -192,22 +192,22 @@ } }, "node_modules/@better-auth/memory-adapter": { - "version": "1.7.0-rc.1", - "resolved": "https://registry.npmjs.org/@better-auth/memory-adapter/-/memory-adapter-1.7.0-rc.1.tgz", - "integrity": "sha512-CyGMXZNCLQ531K4mhdSfhAjXXh+R+ybX/Xss2u9ZYs7un5XZbL+gC5rTGNPktV3KcEHPG60/om7x3bH4jMPi6g==", + "version": "1.7.0-rc.2", + "resolved": "https://registry.npmjs.org/@better-auth/memory-adapter/-/memory-adapter-1.7.0-rc.2.tgz", + "integrity": "sha512-ACP69pbSDnIYYcx/KEtRXpFmte6q0Adh3028pRP5aDydkmbcCc7cFiwnRMQuI/MY7aBfW0wefEbcEwOse61Hcg==", "license": "MIT", "peerDependencies": { - "@better-auth/core": "^1.7.0-rc.1", + "@better-auth/core": "^1.7.0-rc.2", "@better-auth/utils": "0.4.2" } }, "node_modules/@better-auth/mongo-adapter": { - "version": "1.7.0-rc.1", - "resolved": "https://registry.npmjs.org/@better-auth/mongo-adapter/-/mongo-adapter-1.7.0-rc.1.tgz", - "integrity": "sha512-nJEythD9d9rsEPCb3awTSrYn+heLDAReTyBQrfxOC5HYv+m+ekElE8Fy/XuFzENw+7qyY0V7LlfGK7JYhL5XbQ==", + "version": "1.7.0-rc.2", + "resolved": "https://registry.npmjs.org/@better-auth/mongo-adapter/-/mongo-adapter-1.7.0-rc.2.tgz", + "integrity": "sha512-/QeC23KheruIamhu4XIqtPLcvupoDXmSpPB9QvmVqQcb5oVjAILJo6kIbZtq/JYbaHjrIO7mpdH6404hyv7weg==", "license": "MIT", "peerDependencies": { - "@better-auth/core": "^1.7.0-rc.1", + "@better-auth/core": "^1.7.0-rc.2", "@better-auth/utils": "0.4.2", "mongodb": "^6.0.0 || ^7.0.0" }, @@ -218,12 +218,12 @@ } }, "node_modules/@better-auth/prisma-adapter": { - "version": "1.7.0-rc.1", - "resolved": "https://registry.npmjs.org/@better-auth/prisma-adapter/-/prisma-adapter-1.7.0-rc.1.tgz", - "integrity": "sha512-d7J+VO7ZGnt20agKYDfA8XRi8Tzw4fekmzQTUzfkfd9EwYvOUx1Ed6cCjG7nsEPuHn49PLVtv+iX5Cfx2XF2kw==", + "version": "1.7.0-rc.2", + "resolved": "https://registry.npmjs.org/@better-auth/prisma-adapter/-/prisma-adapter-1.7.0-rc.2.tgz", + "integrity": "sha512-OFRJbg44ha2zD5lpXIKfoGBEwPe58YBhwIgKlfRuHpsZSpknaXOTvFIH2da8q8SK5L5mjYQ9vSsnX0oOf8gNDA==", "license": "MIT", "peerDependencies": { - "@better-auth/core": "^1.7.0-rc.1", + "@better-auth/core": "^1.7.0-rc.2", "@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" @@ -238,12 +238,12 @@ } }, "node_modules/@better-auth/telemetry": { - "version": "1.7.0-rc.1", - "resolved": "https://registry.npmjs.org/@better-auth/telemetry/-/telemetry-1.7.0-rc.1.tgz", - "integrity": "sha512-1lpODl12kDY3jA/46odeEtfC0u/UyPWAchtqIZq/JZVJGrnK5UCLwHRcSHYlkpHfZWXm7sXZYJ1vHJHKX66HCg==", + "version": "1.7.0-rc.2", + "resolved": "https://registry.npmjs.org/@better-auth/telemetry/-/telemetry-1.7.0-rc.2.tgz", + "integrity": "sha512-sSZ+/FkG/axBjXVeF01LT+NQjT23TLwRwpdkcI8FJBWINNUCYhuxgdi05dv70MeX8iocfMhKxQ4EPgvt/eW/kQ==", "license": "MIT", "peerDependencies": { - "@better-auth/core": "^1.7.0-rc.1", + "@better-auth/core": "^1.7.0-rc.2", "@better-auth/utils": "0.4.2", "@better-fetch/fetch": "1.3.1" } @@ -1337,74 +1337,74 @@ } }, "node_modules/@objectstack/account": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/account/-/account-16.1.0.tgz", - "integrity": "sha512-r2hVjXdSVKsFMWjfciogXb02WrFCgVzQ8dkz58dMKfY9vE2uVrNTPXk9BeTfR54amlU9Arw+J2ycDRZ3Xet7PA==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/account/-/account-17.0.0-rc.1.tgz", + "integrity": "sha512-n1cI+ZtKdQotXohYjdFUSYWoLas9is4MbVpAbG/RVMra4iSp2EsYWUZnuOfuB9iZGEAcn0QW9IfQNzCRWszvVw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/platform-objects": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/cli": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/cli/-/cli-16.1.0.tgz", - "integrity": "sha512-P91RtoTNDj1L19k1JnITwGPIsjU0I360p7Ej1eUmL0YeGr5NM2whkHgA3mSQkEkgdjrlmkRJy9JLVlIniYnvEA==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/cli/-/cli-17.0.0-rc.1.tgz", + "integrity": "sha512-eirXq1GxshNwjNIczaud6SINZymo19CQB/zsSuJpV9Cy85oEhlnFSKrJKrDX3JVuZ2hNdhGgGxnFxksarI5wgw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/account": "16.1.0", - "@objectstack/client": "16.1.0", - "@objectstack/cloud-connection": "16.1.0", - "@objectstack/console": "16.1.0", - "@objectstack/core": "^16.1.0", - "@objectstack/driver-memory": "^16.1.0", - "@objectstack/driver-mongodb": "^16.1.0", - "@objectstack/driver-sql": "^16.1.0", - "@objectstack/driver-sqlite-wasm": "^16.1.0", - "@objectstack/formula": "16.1.0", - "@objectstack/lint": "16.1.0", - "@objectstack/mcp": "16.1.0", - "@objectstack/metadata": "16.1.0", - "@objectstack/objectql": "^16.1.0", - "@objectstack/observability": "^16.1.0", - "@objectstack/platform-objects": "16.1.0", - "@objectstack/plugin-approvals": "16.1.0", - "@objectstack/plugin-audit": "16.1.0", - "@objectstack/plugin-auth": "16.1.0", - "@objectstack/plugin-email": "16.1.0", - "@objectstack/plugin-hono-server": "16.1.0", - "@objectstack/plugin-pinyin-search": "16.1.0", - "@objectstack/plugin-reports": "16.1.0", - "@objectstack/plugin-security": "16.1.0", - "@objectstack/plugin-sharing": "16.1.0", - "@objectstack/plugin-webhooks": "16.1.0", - "@objectstack/rest": "16.1.0", - "@objectstack/runtime": "^16.1.0", - "@objectstack/service-analytics": "16.1.0", - "@objectstack/service-automation": "16.1.0", - "@objectstack/service-cache": "16.1.0", - "@objectstack/service-datasource": "16.1.0", - "@objectstack/service-job": "16.1.0", - "@objectstack/service-messaging": "16.1.0", - "@objectstack/service-package": "16.1.0", - "@objectstack/service-queue": "16.1.0", - "@objectstack/service-realtime": "16.1.0", - "@objectstack/service-settings": "16.1.0", - "@objectstack/service-sms": "16.1.0", - "@objectstack/service-storage": "16.1.0", - "@objectstack/setup": "16.1.0", - "@objectstack/spec": "16.1.0", - "@objectstack/trigger-api": "16.1.0", - "@objectstack/trigger-record-change": "16.1.0", - "@objectstack/trigger-schedule": "16.1.0", - "@objectstack/types": "16.1.0", - "@objectstack/verify": "16.1.0", - "@oclif/core": "^4.11.14", + "@objectstack/account": "17.0.0-rc.1", + "@objectstack/client": "17.0.0-rc.1", + "@objectstack/cloud-connection": "17.0.0-rc.1", + "@objectstack/console": "17.0.0-rc.1", + "@objectstack/core": "^17.0.0-rc.1", + "@objectstack/driver-memory": "^17.0.0-rc.1", + "@objectstack/driver-mongodb": "^17.0.0-rc.1", + "@objectstack/driver-sql": "^17.0.0-rc.1", + "@objectstack/driver-sqlite-wasm": "^17.0.0-rc.1", + "@objectstack/formula": "17.0.0-rc.1", + "@objectstack/lint": "17.0.0-rc.1", + "@objectstack/mcp": "17.0.0-rc.1", + "@objectstack/metadata": "17.0.0-rc.1", + "@objectstack/objectql": "^17.0.0-rc.1", + "@objectstack/observability": "^17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/plugin-approvals": "17.0.0-rc.1", + "@objectstack/plugin-audit": "17.0.0-rc.1", + "@objectstack/plugin-auth": "17.0.0-rc.1", + "@objectstack/plugin-email": "17.0.0-rc.1", + "@objectstack/plugin-hono-server": "17.0.0-rc.1", + "@objectstack/plugin-pinyin-search": "17.0.0-rc.1", + "@objectstack/plugin-reports": "17.0.0-rc.1", + "@objectstack/plugin-security": "17.0.0-rc.1", + "@objectstack/plugin-sharing": "17.0.0-rc.1", + "@objectstack/plugin-webhooks": "17.0.0-rc.1", + "@objectstack/rest": "17.0.0-rc.1", + "@objectstack/runtime": "^17.0.0-rc.1", + "@objectstack/service-analytics": "17.0.0-rc.1", + "@objectstack/service-automation": "17.0.0-rc.1", + "@objectstack/service-cache": "17.0.0-rc.1", + "@objectstack/service-datasource": "17.0.0-rc.1", + "@objectstack/service-job": "17.0.0-rc.1", + "@objectstack/service-messaging": "17.0.0-rc.1", + "@objectstack/service-package": "17.0.0-rc.1", + "@objectstack/service-queue": "17.0.0-rc.1", + "@objectstack/service-realtime": "17.0.0-rc.1", + "@objectstack/service-settings": "17.0.0-rc.1", + "@objectstack/service-sms": "17.0.0-rc.1", + "@objectstack/service-storage": "17.0.0-rc.1", + "@objectstack/setup": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/trigger-api": "17.0.0-rc.1", + "@objectstack/trigger-record-change": "17.0.0-rc.1", + "@objectstack/trigger-schedule": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1", + "@objectstack/verify": "17.0.0-rc.1", + "@oclif/core": "^4.13.0", "bundle-require": "^5.1.0", - "chalk": "^5.6.2", + "chalk": "^6.0.0", "chokidar": "^5.0.0", "dotenv-flow": "^4.1.0", "esbuild": "^0.28.1", @@ -1418,103 +1418,120 @@ "os": "bin/run.js" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" + }, + "optionalDependencies": { + "better-sqlite3": "^13.0.1" + } + }, + "node_modules/@objectstack/cli/node_modules/better-sqlite3": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-13.0.2.tgz", + "integrity": "sha512-jW6oufeDhXZaiX9Lw5A+oerVClx4iFrI6uDj1zu7SqUAjak9vbJvA0NEcKLNxHiQHb6kYCoFzzXYV0YOauhV3g==", + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^8.0.0" + }, + "engines": { + "node": ">=22" } }, "node_modules/@objectstack/client": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/client/-/client-16.1.0.tgz", - "integrity": "sha512-Vj/90HiwmNfsFRa6gfP6p1wHQet7twQaJV4we3srvWVLosdN2zEKRaSKy9x4qVMCORe08vS+AXqPYEcGPQ2OWw==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/client/-/client-17.0.0-rc.1.tgz", + "integrity": "sha512-3ZRNyx+lOx8C+LBBChhXZc22rWcMa5wufVRrGHc5Dfd42OZqn5AsbKjjhSZrHEfyoCvmeeENo9JGlej0R8RJ9Q==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/cloud-connection": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/cloud-connection/-/cloud-connection-16.1.0.tgz", - "integrity": "sha512-0uUlDOr+2p2TtJ5/3w4fif9wcNAthS6ZFb4k1bJhBDfzDEZMiGPXpohueZfb5vvDBcXBvkL6CppJ17MMkYIjEQ==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/cloud-connection/-/cloud-connection-17.0.0-rc.1.tgz", + "integrity": "sha512-tKUJk966/hprzRoOmZRvJowXToNwG+ECtx7wq79bOxMYBVf4V9BHfIfCMw3adngyYSLn+YHYziL8RppkdzH79w==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/runtime": "16.1.0", - "@objectstack/spec": "16.1.0", - "@objectstack/types": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/runtime": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/console": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/console/-/console-16.1.0.tgz", - "integrity": "sha512-RQWDmqQDGJnkSRZY1Gxc1ZBtO0nbKa+yNzJenDYR/rdEZGbHhy7+w8LQzDRNYaigsiv0xk0eZaAb6mwOMK+9Cw==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/console/-/console-17.0.0-rc.1.tgz", + "integrity": "sha512-oSp9PM7QAjEwgNDK+Kq8CpT6835PeFOrRbARLbRE+fMr9WmofYxWJYuk/ShN4+HGo+b+0lNk2vkrX/o7gDg5zg==", "license": "Apache-2.0" }, "node_modules/@objectstack/core": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/core/-/core-16.1.0.tgz", - "integrity": "sha512-10yG+jANw5y0GCe4If1ihXRuMdJjAeqrCyQMsG90zITsgNx00ThRoo84fZ+5okdqR3RUunk5bH0UGyBuqMik/g==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/core/-/core-17.0.0-rc.1.tgz", + "integrity": "sha512-3snd0dJhd+MPEDek+YRapZ02siBnbxYNNl8GoyfnlSeEuKXdcY6bDBf/zueAwoTqyV32zNG5epA85cZh1zLQPw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/spec": "16.1.0", + "@objectstack/spec": "17.0.0-rc.1", "zod": "^4.4.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/driver-memory": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/driver-memory/-/driver-memory-16.1.0.tgz", - "integrity": "sha512-NrtcLjU9JKJTdM4q7YlOVAhb2+8YXmKFzv+BpK8UhCe+BAjS1mVy+x/RWQvmCXpfh2IIWdTsiVm6MFxgp3QO4g==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/driver-memory/-/driver-memory-17.0.0-rc.1.tgz", + "integrity": "sha512-OxQAuNjCZVASpys5DVNVo/kcFUhsXtytAjVqCWVqCZPPmCaZ925RFqbCfDbnDh+1JCEQ0HTFzj+t8AYCViS2oA==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/spec": "16.1.0", + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", "mingo": "^7.2.2" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/driver-mongodb": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/driver-mongodb/-/driver-mongodb-16.1.0.tgz", - "integrity": "sha512-HI0+4pYbNiwX6D/Uz0OV27h2Qz1CR7d18YlTvmD7x6hs7c4myEOyP2NnEImsHSvV987ja3yIZBKG+rtCVG7+9Q==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/driver-mongodb/-/driver-mongodb-17.0.0-rc.1.tgz", + "integrity": "sha512-zPzNcTPZ8LSsCvqF8q73iVMhtSxIRlW5gij3F+p9w1Lbr8/PuOkFoWn00P7NLtVhX+ki5AParIvLZxu/gIUHUA==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/spec": "16.1.0", + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1", "mongodb": "^7.5.0", "nanoid": "^6.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/driver-sql": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/driver-sql/-/driver-sql-16.1.0.tgz", - "integrity": "sha512-A17OCREWqi7sglrXLfyauRley4Czd3iilq3EPt+uKxB+V4gpuQwCnstTEwAe6jbhu4v5mL6GM9v5Ff3HmOgS1g==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/driver-sql/-/driver-sql-17.0.0-rc.1.tgz", + "integrity": "sha512-6uHyQ3GmKqSjL8Cr5u10TBWfOuOK9x2Ur97CwMbvO6ydECzKyztwVm3KVlsQIgmVA9WHLyYG+rYkjH+SSC4mJg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/observability": "16.1.0", - "@objectstack/spec": "16.1.0", - "@objectstack/types": "16.1.0", + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/observability": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1", "knex": "^3.3.0", "nanoid": "^6.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" }, "optionalDependencies": { - "better-sqlite3": "^12.11.1" + "better-sqlite3": "^13.0.1" }, "peerDependencies": { "mysql2": "^3.0.0", @@ -1533,47 +1550,60 @@ } } }, + "node_modules/@objectstack/driver-sql/node_modules/better-sqlite3": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-13.0.2.tgz", + "integrity": "sha512-jW6oufeDhXZaiX9Lw5A+oerVClx4iFrI6uDj1zu7SqUAjak9vbJvA0NEcKLNxHiQHb6kYCoFzzXYV0YOauhV3g==", + "license": "MIT", + "optional": true, + "dependencies": { + "node-addon-api": "^8.0.0" + }, + "engines": { + "node": ">=22" + } + }, "node_modules/@objectstack/driver-sqlite-wasm": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/driver-sqlite-wasm/-/driver-sqlite-wasm-16.1.0.tgz", - "integrity": "sha512-S2zlDY4Ex5ED9J58+NgFKoRAVveRwL3Y5Uq/ohVKW3fQmr+2wSod3tF03SYxav8fLEQaBU0HWqLdBBN1ovnX3g==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/driver-sqlite-wasm/-/driver-sqlite-wasm-17.0.0-rc.1.tgz", + "integrity": "sha512-oz4Kt29T+ys06RO/PIJk1McT+rx/F5E+sBa507NaycWaLElM10GeoGZ/L7FWthZXMndkKN4qlGVG7uzbZrYzVQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/driver-sql": "16.1.0", - "@objectstack/spec": "16.1.0", + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/driver-sql": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", "knex": "^3.3.0", "nanoid": "^6.0.0", "sql.js": "^1.14.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/formula": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/formula/-/formula-16.1.0.tgz", - "integrity": "sha512-uLSUGH5wj7UskXAHEF/RU0SYepWgMIOHij/WPBJRE6IXMyoARbVjZDmqbOLeluTDtJlz9irmwvCwjVBKMpghEw==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/formula/-/formula-17.0.0-rc.1.tgz", + "integrity": "sha512-oAJENCl3QQcJA0484ScNdOU6EX5MEZ14pRF7sLITnoBkXGhgh/eMKboG+q6zLGJsZwS4ThPEu6sF72GVDlEmuw==", "license": "Apache-2.0", "dependencies": { "@marcbachmann/cel-js": "^8.0.0", - "@objectstack/spec": "16.1.0" + "@objectstack/spec": "17.0.0-rc.1" } }, "node_modules/@objectstack/lint": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/lint/-/lint-16.1.0.tgz", - "integrity": "sha512-yXlcJJbXjseZ3gXAtzVCMzL/fDT/66dSjnAR5xiVwYl7JcsALF1Lwtlu12dt/C9oN/gcyi7g9KSmlnSj4I4yxg==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/lint/-/lint-17.0.0-rc.1.tgz", + "integrity": "sha512-qIXylf5FsFhWAii0m+jQp49kZXlTnGXNz/cyZTrvqwJItI78k5afo3zKxZjmDreGRnAFIKXJLGLEDvZWjHgdFg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/formula": "16.1.0", - "@objectstack/sdui-parser": "16.1.0", - "@objectstack/spec": "16.1.0", + "@objectstack/formula": "17.0.0-rc.1", + "@objectstack/sdui-parser": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", "sucrase": "^3.35.1", "typescript": "^6.0.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/lint/node_modules/typescript": { @@ -1590,54 +1620,54 @@ } }, "node_modules/@objectstack/mcp": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/mcp/-/mcp-16.1.0.tgz", - "integrity": "sha512-L1f3CeZCsBsN+Ydd2WWbKTz2flJuWLEbRqzsHBUQp+H8LqHGHKW03pbRw8xj3+ACcfKBC1tBS4EvSOjSrVPmoA==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/mcp/-/mcp-17.0.0-rc.1.tgz", + "integrity": "sha512-lGPbHiiI861013hPbSt2Us/yd1jHNdRy/i6pkNsjzCuedOuSOGm7A/UtXHj3fBnryZOaiBJMLTeJg9UkBEALeA==", "license": "Apache-2.0", "dependencies": { "@modelcontextprotocol/sdk": "^1.29.0", - "@objectstack/core": "16.1.0", - "@objectstack/formula": "16.1.0", - "@objectstack/spec": "16.1.0", - "@objectstack/types": "16.1.0", + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/formula": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1", "zod": "^4.4.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/metadata": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/metadata/-/metadata-16.1.0.tgz", - "integrity": "sha512-5P7BMBqy7I/JgHxUEaoMNtKL9XoHMj45895/EQBxb9j+tR5Aml80v7u25VFji8f7HyvRkntme5Wyh99LH0P/FA==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/metadata/-/metadata-17.0.0-rc.1.tgz", + "integrity": "sha512-zXDeP9+zONVuwSaRL0IuaPfEjRHxISTyEBip77molWd0GQ/nQhtpj9T278DUvzAC1q5BEG3wXX985yHXMDboqg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/metadata-core": "16.1.0", - "@objectstack/metadata-fs": "16.1.0", - "@objectstack/platform-objects": "16.1.0", - "@objectstack/spec": "16.1.0", - "@objectstack/types": "16.1.0", + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/metadata-core": "17.0.0-rc.1", + "@objectstack/metadata-fs": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1", "chokidar": "^5.0.0", "glob": "^13.0.6", - "js-yaml": "^5.2.1", + "js-yaml": "^5.2.2", "zod": "^4.4.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/metadata-core": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/metadata-core/-/metadata-core-16.1.0.tgz", - "integrity": "sha512-FmCXhV9g03hKKhaIIZAQtiAITv8W7D+WnkwN9exhFY8dobFG3mBxMNlRO8PLyMvltHIFkaCxH/vSuzptWFvI0A==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/metadata-core/-/metadata-core-17.0.0-rc.1.tgz", + "integrity": "sha512-ZU6d27sGnwRY8LXrWv1xHhaomPH/XswP1geyOxFgZtIimrbTgjIR56jZ8n7SBgjBw4zMWfbXF+YHNIXudnvDsg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/spec": "16.1.0", + "@objectstack/spec": "17.0.0-rc.1", "zod": "^4.4.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" }, "peerDependencies": { "vitest": "^4.0.0" @@ -1649,33 +1679,33 @@ } }, "node_modules/@objectstack/metadata-fs": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/metadata-fs/-/metadata-fs-16.1.0.tgz", - "integrity": "sha512-ND2Ln89ElyQEbuNp0UwTAp0gNyZ/tS2MWYINIDtp3nLYIWE0sB3itf24ZXEgf5sKCc2rIgSwkVr0iNMFtkbvMA==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/metadata-fs/-/metadata-fs-17.0.0-rc.1.tgz", + "integrity": "sha512-2zk5gzE982SAs6qtNjjdb3N3gNgzkcANQ6jL5h3/p4G4Hz51AxRXD/mvUI82ZYt0GsikvParYvqD8ISi+86lDw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/metadata-core": "16.1.0", + "@objectstack/metadata-core": "17.0.0-rc.1", "chokidar": "^5.0.0" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/metadata-protocol": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/metadata-protocol/-/metadata-protocol-16.1.0.tgz", - "integrity": "sha512-1/I18/dYNaQC4TyVlV2Wjigg6WDYZzuwXK/PdDPM9pghR1/Tock4QCwzitGrpzd3qH8KVdAKQ6z58rpUNNU3Ag==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/metadata-protocol/-/metadata-protocol-17.0.0-rc.1.tgz", + "integrity": "sha512-2XtShkp/f2W+koSwX4E4OmmKoZvkbjS3oh8JTwdgbqEgmTdQgafHiLrStr3CCzcpttmIlFUInQoTky8QYy62iQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/formula": "16.1.0", - "@objectstack/metadata-core": "16.1.0", - "@objectstack/spec": "16.1.0", - "@objectstack/types": "16.1.0", + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/formula": "17.0.0-rc.1", + "@objectstack/metadata-core": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1", "zod": "^4.4.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/metadata/node_modules/js-yaml": { @@ -1701,113 +1731,114 @@ } }, "node_modules/@objectstack/objectql": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/objectql/-/objectql-16.1.0.tgz", - "integrity": "sha512-V4zVwVqQDiKI4bdGSBls9SBIIk+Dj5IQnzqLT0JB3w9ETo2JzcjG1UVmliW/SWXKIkUJWJS42e8w0ivVTvLWYg==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/objectql/-/objectql-17.0.0-rc.1.tgz", + "integrity": "sha512-+jXtGwGDLggNuNfjTy9LvF6dqgxBlyfzN/6gYQ2pmE97hZ9WU70E6H1oZRDEF4j391gBVxfTilhDxjgIGmh0ow==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/formula": "16.1.0", - "@objectstack/metadata-core": "16.1.0", - "@objectstack/metadata-protocol": "16.1.0", - "@objectstack/spec": "16.1.0", - "@objectstack/types": "16.1.0", + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/formula": "17.0.0-rc.1", + "@objectstack/metadata-core": "17.0.0-rc.1", + "@objectstack/metadata-protocol": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1", "ajv": "^8.20.0", "zod": "^4.4.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/observability": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/observability/-/observability-16.1.0.tgz", - "integrity": "sha512-nl1x4OARlJVXW0rcIY7H1BETTj/pUfH2n035eK3oAikwiRgf1Ea595ShKqLGH9tYHpHBrHO4P285N+K7m3GN3A==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/observability/-/observability-17.0.0-rc.1.tgz", + "integrity": "sha512-uqOt8i3H5lWk+grXdnU+d6zxr4yFGROQ9i9WILKUZbv6cP65tKKFSUwFIbL09Q6wjWYDo36SbenwCqKQADQjhw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/spec": "16.1.0" + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/platform-objects": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/platform-objects/-/platform-objects-16.1.0.tgz", - "integrity": "sha512-W75mG1UrIExRgThSXgC9OSY0yJPULM4RmpS6SUDh2uChlYHM4VpXG9tjJA8LdGaLfYk/yvVHU8yJfS5UOQ7LNw==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/platform-objects/-/platform-objects-17.0.0-rc.1.tgz", + "integrity": "sha512-SVMp3ZDrdpK39e8QDwfFuyd1yzSG7Bw45Ge4Hb36w8zpuuDOCAhqV+v30/yA+ZBXY/wt7GPEUb9AVgZUlXfcgA==", "license": "Apache-2.0", "dependencies": { - "@objectstack/metadata-core": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/metadata-core": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/plugin-approvals": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-approvals/-/plugin-approvals-16.1.0.tgz", - "integrity": "sha512-IEudAyv/xkVDouLUl1Kow/BInpPUk+nNpfSX2Gu8oFl7jx/fLGrsuAigRNIOqkZlg6XdB3jic1BdQyTxXHhkAQ==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-approvals/-/plugin-approvals-17.0.0-rc.1.tgz", + "integrity": "sha512-VDyKGaVAJuVcW4WFNJET+NiExobbvfVOLkB3xZHhuzY+SQZNQfeypIBo+xT37+/KZdWKyif4O3V30za3uM7eXQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/formula": "16.1.0", - "@objectstack/metadata-core": "16.1.0", - "@objectstack/platform-objects": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/formula": "17.0.0-rc.1", + "@objectstack/metadata-core": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1" } }, "node_modules/@objectstack/plugin-audit": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-audit/-/plugin-audit-16.1.0.tgz", - "integrity": "sha512-vf/mZEdxV2fsPPK7Oo32UhekIL4EuuSQ4s6zek6xTuUTRFXCZYvriTPoXVU/lgbhvnVwsK6flpliTKPy1iT+5w==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-audit/-/plugin-audit-17.0.0-rc.1.tgz", + "integrity": "sha512-vm24oYZkUldz3X9iZ/tl79SQynIWBWlhONtLmPsKQHMJPOzN//KtU9VnWzZTJUdisDsrMI356zRlnnw49/Avcg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/platform-objects": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/plugin-auth": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-auth/-/plugin-auth-16.1.0.tgz", - "integrity": "sha512-XUVBzmb3Z2CLz002o2n+j3bRSJu69EEa02tFXFYYPNlAzHju9Yh809lfFYzKYeJ+yqq/e88rBrUdD7NHFzkbvg==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-auth/-/plugin-auth-17.0.0-rc.1.tgz", + "integrity": "sha512-xqJE38AR5SnC0cZPyqalttU7s1Kh8iLAL7rMYcG7tNhDuFNRROqUwCOFO3OXFb6yKeWatKiFc/dFz36C+h+DAA==", "license": "Apache-2.0", "dependencies": { - "@better-auth/core": "1.7.0-rc.1", - "@better-auth/oauth-provider": "1.7.0-rc.1", + "@better-auth/core": "1.7.0-rc.2", + "@better-auth/oauth-provider": "1.7.0-rc.2", "@better-auth/scim": "1.7.0-rc.1", - "@better-auth/sso": "1.7.0-rc.1", + "@better-auth/sso": "1.7.0-rc.2", "@noble/hashes": "^2.2.0", - "@objectstack/core": "16.1.0", - "@objectstack/platform-objects": "16.1.0", - "@objectstack/rest": "16.1.0", - "@objectstack/spec": "16.1.0", - "@objectstack/types": "16.1.0", - "better-auth": "1.7.0-rc.1", - "jose": "^6.2.3" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/rest": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1", + "better-auth": "1.7.0-rc.2", + "jose": "^6.2.4" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/plugin-auth/node_modules/@better-auth/oauth-provider": { - "version": "1.7.0-rc.1", - "resolved": "https://registry.npmjs.org/@better-auth/oauth-provider/-/oauth-provider-1.7.0-rc.1.tgz", - "integrity": "sha512-992i44HfdHRDlMSnaapXMkMRKGyNxIMm5K//K2yiL0dErdtBB5s5q1PZI0Cm2/imzrOI6HP9UjUvy6lCDj6EHw==", + "version": "1.7.0-rc.2", + "resolved": "https://registry.npmjs.org/@better-auth/oauth-provider/-/oauth-provider-1.7.0-rc.2.tgz", + "integrity": "sha512-fc3jCYwS/PaQyErOPqIUplqK456zhrmNWGnJPhDEF68merXBQN1OodUTzicZ3skFDpAv6MY3m5vk4D1Gz3R/oA==", "license": "MIT", "dependencies": { "jose": "^6.2.3", "zod": "^4.3.6" }, "peerDependencies": { - "@better-auth/core": "^1.7.0-rc.1", + "@better-auth/core": "^1.7.0-rc.2", "@better-auth/utils": "0.4.2", "@better-fetch/fetch": "1.3.1", - "better-auth": "^1.7.0-rc.1", + "better-auth": "^1.7.0-rc.2", "better-call": "1.3.7" } }, @@ -1827,9 +1858,9 @@ } }, "node_modules/@objectstack/plugin-auth/node_modules/@better-auth/sso": { - "version": "1.7.0-rc.1", - "resolved": "https://registry.npmjs.org/@better-auth/sso/-/sso-1.7.0-rc.1.tgz", - "integrity": "sha512-+v7y+NbuWKnQphSq6K9R3NzIwdpxsY3BSDcM2Z2EoLIMaKYJczR6L2NTf3medG1UYdZDbVLunZQ7RxWaO4pzoQ==", + "version": "1.7.0-rc.2", + "resolved": "https://registry.npmjs.org/@better-auth/sso/-/sso-1.7.0-rc.2.tgz", + "integrity": "sha512-vn+WjTNMYWKX/jrrSCekv8Aia7uuhBlFcgUcwJpbSxCvD67uyNhN0W48ob+NKKY2vlT4nrDVESP2csxUXyUmtw==", "license": "MIT", "dependencies": { "fast-xml-parser": "^5.8.0", @@ -1839,26 +1870,26 @@ "zod": "^4.3.6" }, "peerDependencies": { - "@better-auth/core": "^1.7.0-rc.1", + "@better-auth/core": "^1.7.0-rc.2", "@better-auth/utils": "0.4.2", "@better-fetch/fetch": "1.3.1", - "better-auth": "^1.7.0-rc.1", + "better-auth": "^1.7.0-rc.2", "better-call": "1.3.7" } }, "node_modules/@objectstack/plugin-auth/node_modules/better-auth": { - "version": "1.7.0-rc.1", - "resolved": "https://registry.npmjs.org/better-auth/-/better-auth-1.7.0-rc.1.tgz", - "integrity": "sha512-dmTImZTzxDYfNSLdv5yTwRxNMnN8xBQnG9oeeW+eSltO0R0TxOfYZTnu1JE9MSI8tlR5tFfUaoLBTal6Z28v9A==", - "license": "MIT", - "dependencies": { - "@better-auth/core": "1.7.0-rc.1", - "@better-auth/drizzle-adapter": "1.7.0-rc.1", - "@better-auth/kysely-adapter": "1.7.0-rc.1", - "@better-auth/memory-adapter": "1.7.0-rc.1", - "@better-auth/mongo-adapter": "1.7.0-rc.1", - "@better-auth/prisma-adapter": "1.7.0-rc.1", - "@better-auth/telemetry": "1.7.0-rc.1", + "version": "1.7.0-rc.2", + "resolved": "https://registry.npmjs.org/better-auth/-/better-auth-1.7.0-rc.2.tgz", + "integrity": "sha512-5KZrqbAsoQA8q1edmufaoF/CBbMjGb/BoPqyMTzXFyDeXNhk8pXO2xJkiDDeZcSGtyhUKXiDnD7hxh4sJVgYZw==", + "license": "MIT", + "dependencies": { + "@better-auth/core": "1.7.0-rc.2", + "@better-auth/drizzle-adapter": "1.7.0-rc.2", + "@better-auth/kysely-adapter": "1.7.0-rc.2", + "@better-auth/memory-adapter": "1.7.0-rc.2", + "@better-auth/mongo-adapter": "1.7.0-rc.2", + "@better-auth/prisma-adapter": "1.7.0-rc.2", + "@better-auth/telemetry": "1.7.0-rc.2", "@better-auth/utils": "0.4.2", "@better-fetch/fetch": "1.3.1", "@noble/ciphers": "^2.2.0", @@ -1877,7 +1908,7 @@ "@tanstack/react-start": "^1.0.0", "@tanstack/solid-start": "^1.0.0", "better-sqlite3": "^12.0.0", - "drizzle-kit": ">=0.31.4", + "drizzle-kit": ">=0.31.4 || >=1.0.0-beta.1", "drizzle-orm": "^0.45.2", "mongodb": "^6.0.0 || ^7.0.0", "mysql2": "^3.0.0", @@ -1952,338 +1983,344 @@ } }, "node_modules/@objectstack/plugin-email": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-email/-/plugin-email-16.1.0.tgz", - "integrity": "sha512-V3l8682mSnQLwo2jlOXnISaHm0+6ie/y1DRolMKfnP5aKGFpAHXZHdP4vE+HQ61T8E4etFgjczTdSX3fkJYKqw==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-email/-/plugin-email-17.0.0-rc.1.tgz", + "integrity": "sha512-/DmIStXH9bB54k1TZ0LHQHBekp4zfxV6YBeYDyoXRftOCz9DpuoHIbXEEanBHZ9BwiNwApHNCbxCgjiFDODQ4A==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/formula": "16.1.0", - "@objectstack/platform-objects": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/formula": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" } }, "node_modules/@objectstack/plugin-hono-server": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-hono-server/-/plugin-hono-server-16.1.0.tgz", - "integrity": "sha512-7XBS0QWJLgTIi0b3KEzT7ZbbLCTDAbWF+5nDt4zrL4zTxWLbSVbmpSz7ACbQjhJj8ftqbVK8CZvp7/CR2aKIVg==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-hono-server/-/plugin-hono-server-17.0.0-rc.1.tgz", + "integrity": "sha512-oV+fqjPWDVHppIM8ICS3SvTIWn5JMFv57/CcpK8Ocjm1qphBMj2kzHVwOyIaDKIK7yS177eK8JxcQBu4pQHvbA==", "license": "Apache-2.0", "dependencies": { - "@hono/node-server": "^2.0.10", - "@objectstack/core": "16.1.0", - "@objectstack/observability": "16.1.0", - "@objectstack/spec": "16.1.0", - "@objectstack/types": "16.1.0", - "hono": "^4.12.31" + "@hono/node-server": "^2.0.12", + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/observability": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1", + "hono": "^4.12.32" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/plugin-pinyin-search": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-pinyin-search/-/plugin-pinyin-search-16.1.0.tgz", - "integrity": "sha512-TrTI+JmX86Ui6FzI8ahquSI9g6smj9QtPFT/mWkEqkmdH1V6vbYhLURSeeTK5oGnxcYOSm4Sb6ys9cy7xEyTIA==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-pinyin-search/-/plugin-pinyin-search-17.0.0-rc.1.tgz", + "integrity": "sha512-VGuwSsaKQxIhc2Tb/pwK83gEFPdnKHMuolPSOuAuSG+zHlP0wYUOMbF5YKxH+czccc8fIwqogpXp2UcULsH5sQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/objectql": "16.1.0", - "@objectstack/types": "16.1.0", - "pinyin-pro": "^3.28.1" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/objectql": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1", + "pinyin-pro": "^3.28.2" } }, "node_modules/@objectstack/plugin-reports": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-reports/-/plugin-reports-16.1.0.tgz", - "integrity": "sha512-stZzhADvU6njLzK8Lv8ODUaFCmHskea9jHlfYzfp9rNQq4fZU4sFnDO/Dwo+K9YBEvWsnTKmi27Gc1fcgZZ+9Q==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-reports/-/plugin-reports-17.0.0-rc.1.tgz", + "integrity": "sha512-3jSQ6Ckm4BfZB0rAiuOnJFQUTGbb28+AKBBaNGgrVG4odMJcmdcEWyXkYmOH7Rk+JrT7wG1/eGg0sOLdtuGBZA==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/platform-objects": "16.1.0", - "@objectstack/spec": "16.1.0", + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", "croner": "^10.0.1" } }, "node_modules/@objectstack/plugin-security": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-security/-/plugin-security-16.1.0.tgz", - "integrity": "sha512-tIohnIaII4UvHd3ZtG7Z+ig2ykdLIZu8mFcra6OeBjUe1v3QbjiuYYjD+y16s30D3txSJeS/wmH3BnNJD4GjoQ==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-security/-/plugin-security-17.0.0-rc.1.tgz", + "integrity": "sha512-E8PV0SrKustSQ4ztBIwU2jqgZRKPZx6XIgx5jwKnG+gZw2OqHsyW7ieD+5IKCbJTaPn+bZfb+QetDPIq9fsZig==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/formula": "16.1.0", - "@objectstack/platform-objects": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/formula": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/plugin-sharing": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-sharing/-/plugin-sharing-16.1.0.tgz", - "integrity": "sha512-CS9a4NdXO6SiviZw/As3ihMRLWS/J/v8SZg3GSy9+M4MKRWmLOV7VGBgXmPQouE+6/FQUZVTjuVX9oqMZvLm7g==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-sharing/-/plugin-sharing-17.0.0-rc.1.tgz", + "integrity": "sha512-lJcQfzxtNCPYuZIc65zWFdb/QWV+TkwAw1oR/3DXhuhg0JgwXiZx72vCfXG4W3KsOTMg2ADfUBWjZ0TXPLBWCA==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/formula": "16.1.0", - "@objectstack/objectql": "16.1.0", - "@objectstack/platform-objects": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/formula": "17.0.0-rc.1", + "@objectstack/objectql": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1" } }, "node_modules/@objectstack/plugin-webhooks": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/plugin-webhooks/-/plugin-webhooks-16.1.0.tgz", - "integrity": "sha512-1XQCpuJfbSiedu1L6L0jsmxMTJWG6n7JAFS10ofS3fVA9V2z3jeXHtaeIof5N+j6q1iCGAN4rQIcMysyqskRJQ==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/plugin-webhooks/-/plugin-webhooks-17.0.0-rc.1.tgz", + "integrity": "sha512-qCKh1BIPjQmYGoZ7/iPyfQd9AjeFuEgl6XkfcEaM6SpowUU2NzWyUKYSZ+mVIvaMCKF0/1Z9ZjH6pMsUBlq0zg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/service-messaging": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/service-messaging": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" } }, "node_modules/@objectstack/rest": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/rest/-/rest-16.1.0.tgz", - "integrity": "sha512-FKFDM0HVGcAT19X5dgvTMugtKUKLwyzqBxgJ/xwmtOoVp/G3l0qJP+dBs3zBFp2AvOIP0MCEcqV1vcsDNO0rDA==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/rest/-/rest-17.0.0-rc.1.tgz", + "integrity": "sha512-r8/tFrwHAq9ZmykKdOOsTsXHABodmcIBP4GY1fQP19vTspj6j870VYgYtcgKNnlfjmPmz+zPli1CNFQ6ynNqBA==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/observability": "16.1.0", - "@objectstack/platform-objects": "16.1.0", - "@objectstack/service-package": "16.1.0", - "@objectstack/spec": "16.1.0", - "@objectstack/types": "16.1.0", + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/observability": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/service-package": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1", "exceljs": "^4.4.0", "zod": "^4.4.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/runtime": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/runtime/-/runtime-16.1.0.tgz", - "integrity": "sha512-cYTZyS5QxKs81LC82QrlnH5S9pXaoK3eHYX1EJGaFr8CoUOzDXWpPqR3gWKlmoAkQJ2iRfys0ZyLz3ZxCx/pJA==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/runtime/-/runtime-17.0.0-rc.1.tgz", + "integrity": "sha512-7hSg8e4c7TQ2/+TdVmuttWvtD/WfCicIMRZR2KSktGuUwC6MrfFQ7H1PeBIclQEIKz6lOYhPTsn76Ud6/hvXHQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/driver-memory": "16.1.0", - "@objectstack/driver-sql": "16.1.0", - "@objectstack/driver-sqlite-wasm": "16.1.0", - "@objectstack/formula": "16.1.0", - "@objectstack/metadata": "16.1.0", - "@objectstack/metadata-core": "16.1.0", - "@objectstack/objectql": "16.1.0", - "@objectstack/observability": "16.1.0", - "@objectstack/plugin-auth": "16.1.0", - "@objectstack/plugin-security": "16.1.0", - "@objectstack/rest": "16.1.0", - "@objectstack/service-cluster": "16.1.0", - "@objectstack/service-datasource": "16.1.0", - "@objectstack/service-i18n": "16.1.0", - "@objectstack/spec": "16.1.0", - "@objectstack/types": "16.1.0", + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/driver-memory": "17.0.0-rc.1", + "@objectstack/driver-sql": "17.0.0-rc.1", + "@objectstack/driver-sqlite-wasm": "17.0.0-rc.1", + "@objectstack/formula": "17.0.0-rc.1", + "@objectstack/metadata": "17.0.0-rc.1", + "@objectstack/metadata-core": "17.0.0-rc.1", + "@objectstack/metadata-protocol": "17.0.0-rc.1", + "@objectstack/objectql": "17.0.0-rc.1", + "@objectstack/observability": "17.0.0-rc.1", + "@objectstack/plugin-auth": "17.0.0-rc.1", + "@objectstack/plugin-security": "17.0.0-rc.1", + "@objectstack/rest": "17.0.0-rc.1", + "@objectstack/service-cluster": "17.0.0-rc.1", + "@objectstack/service-datasource": "17.0.0-rc.1", + "@objectstack/service-i18n": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1", "quickjs-emscripten": "^0.32.0", "zod": "^4.4.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" }, "optionalDependencies": { - "@objectstack/driver-mongodb": "16.1.0" + "@objectstack/driver-mongodb": "17.0.0-rc.1" } }, "node_modules/@objectstack/sdui-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/sdui-parser/-/sdui-parser-16.1.0.tgz", - "integrity": "sha512-GQm/+W09NHnja+p2MYTKVBJ9i+FvsWa6hmb1rHV8qiRYgtvXa0xSzypMxR6zIiJWkPslEPdcJaSqX0oEXPjMUw==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/sdui-parser/-/sdui-parser-17.0.0-rc.1.tgz", + "integrity": "sha512-K96OHHU/HtBkumyKhNz+Sxnhvvy1wAtzQOjuTdwTDpUYLxJu3J3xqxoXPBQUh+FuYrTlxJq99CkhsSCjDrSLjA==", "license": "Apache-2.0" }, "node_modules/@objectstack/service-analytics": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/service-analytics/-/service-analytics-16.1.0.tgz", - "integrity": "sha512-TfIbrkUC/UAg3+Iah5hjbnHBgbU8m5Q5fxvpkUZm/sHEDpOg10YT0cDPD5kz1cOVFJRQtj/DxxydAJ2xQwbw1Q==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/service-analytics/-/service-analytics-17.0.0-rc.1.tgz", + "integrity": "sha512-1X8EEmsAlFQlYSrFO+V0LKaE7GtlNpm/S7EwBMASZxGYd73rbNrbVPiFp5J7iTEtT6rgi6XmdzocTOXbf/vuMQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/service-automation": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/service-automation/-/service-automation-16.1.0.tgz", - "integrity": "sha512-nNUpF9OSTPnpv6jGuBtUh7a7u0iKUmL5pCAHbAr1u7gUpgHkPlGTeuxZ019s83dtNxWryej5U71CQaxs+sXn+Q==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/service-automation/-/service-automation-17.0.0-rc.1.tgz", + "integrity": "sha512-Gl15ZAt7GQtQLqpgU/gtu+CSydOH0AVvBGkc/O/11Scf/67nWKMSB5APysFrfT/z0MBg/IJh4pV3cTXL8LeV4Q==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/formula": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/formula": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/service-cache": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/service-cache/-/service-cache-16.1.0.tgz", - "integrity": "sha512-5T7FF/IrIVQ6kmJmF+GvIvHrpGKHLupMfXQe/T74GOYo8M3OI+mSKzMphygscfTXOHcG5k9LmINR5AG5XGhejg==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/service-cache/-/service-cache-17.0.0-rc.1.tgz", + "integrity": "sha512-nCM9zZIIB+8pFSKjl5UOheLIu3sdb5l7TxfLJcVRe2s2hSwfAB7wrD/+onTum0S/GRyjajs1SaiQNhJExjUJ3w==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/observability": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/observability": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/service-cluster": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/service-cluster/-/service-cluster-16.1.0.tgz", - "integrity": "sha512-9YolTHYCKRl/0kHIglyVsiDsSvRCUrJhM/DbgIn9H/KUaYWMun9e7JLm7NyX1RKb9EkK6l6XsW63GRtDt44oww==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/service-cluster/-/service-cluster-17.0.0-rc.1.tgz", + "integrity": "sha512-ThjOJ9pLzAUa41fNyGzq37B4Yc4UuIIz+z2tlxQlZpEBNxU8aZSBWzQIK0PTr1c31BMUrHx2xzNozJx8WIjq1g==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" } }, "node_modules/@objectstack/service-datasource": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/service-datasource/-/service-datasource-16.1.0.tgz", - "integrity": "sha512-EUwXFKL2a3godfrJaMuinUzPzLr6Rkhfx6OtLpj4dtWaT2I0/AcYzCwl8Ni79DeRE6PaL5vb5LbKn3YTfQhadg==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/service-datasource/-/service-datasource-17.0.0-rc.1.tgz", + "integrity": "sha512-9ONxSN/n9I16VKiboy4SfLvZiqYWnOjLMKr2nOU1rM1/vyIeTfstn9XAnCO9J0AiZvkGDP/nJyBetPPm0ykT1Q==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1" } }, "node_modules/@objectstack/service-i18n": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/service-i18n/-/service-i18n-16.1.0.tgz", - "integrity": "sha512-2unXnYv7p+SSpTDRRRibGq4sNMeTHMshvvQLmPtx0nN2bgNUOmlDEiTx/x2Mg1VeayA/tH7gXKS5j7+l786IAg==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/service-i18n/-/service-i18n-17.0.0-rc.1.tgz", + "integrity": "sha512-IVgxAiSbWaLzOJsYekLPKmbKSxaxGvmz7qNvg781L1uInyTmhFxkN7N3hCIBxQR5gBeZncqsAJwDpu1Wk22KCg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/service-job": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/service-job/-/service-job-16.1.0.tgz", - "integrity": "sha512-HGAWC9cX4nTL9ivSp19avBP/Iy9m7Xreo5t5e1IQ1dRYlg+WWCoIpaxuNEwenb/SGeh12QG+SryDQ1G4eNJpnQ==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/service-job/-/service-job-17.0.0-rc.1.tgz", + "integrity": "sha512-ffUPPY4kCJpBBmFLM0xDR8kAXJKewjsRCkiAhl+YyBUXzxpUnGsvA2s3WadYS4c4o+gWZ7RE+D+vpSLdBYQUbg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/platform-objects": "16.1.0", - "@objectstack/spec": "16.1.0", + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", "croner": "^10.0.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/service-messaging": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/service-messaging/-/service-messaging-16.1.0.tgz", - "integrity": "sha512-sZl//oJl2Yoq3ziQGe4OGrndkyby0nI6XU3N/tc+iBa1cLv8XX63ruNmnxFa2eO+bsA14rqXvauRtWcLTtubxw==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/service-messaging/-/service-messaging-17.0.0-rc.1.tgz", + "integrity": "sha512-JyL4J3vEBP5RG8HQKMRSWXtwiLkxE4/c0838qsxwi0ALmh7e0fTeY2sUGE1r4iIGLX9LR47MDkaAstyChynPiw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/service-package": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/service-package/-/service-package-16.1.0.tgz", - "integrity": "sha512-98gQsJkdIDOMuxjoTUfZ9iWkkkzcQDLt0BPt00EWxAC03Fi6YbgJ+WJ2UVYfzquc6nVVjg3/rgwpSqsoFDt7aA==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/service-package/-/service-package-17.0.0-rc.1.tgz", + "integrity": "sha512-z65nnIaB6esz7vLE/D63zqo0XYv6KV2+5ss+risw9ZbUiPKVNCiysaKAjO7kEoXWO2SeR56qG2Q04lpnclpvMg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/metadata-core": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/metadata-core": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/service-queue": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/service-queue/-/service-queue-16.1.0.tgz", - "integrity": "sha512-zKWxi729mUGO0q0BMO0SIZk3vdayWP/rdw29YFMSjpIo1jtnIzSiDW+k7rQV+rUfFkRGHo2QhXjNCbSqMtd3dQ==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/service-queue/-/service-queue-17.0.0-rc.1.tgz", + "integrity": "sha512-2HzqQlewLiv7DkuOkqP4KspdfmZEVJqBUgX8QYc7Jio5OffofdDw5xvX99wjRpQIlQWBhpUOFX47bU7ASMepPA==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/platform-objects": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/service-realtime": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/service-realtime/-/service-realtime-16.1.0.tgz", - "integrity": "sha512-V7jI0YNcj1NXQWwdEoX42sXqobRmW+TVRPK/rsOERnfnelOxZCkdjTjEtEPCzWqOjC6tHRSIS6AaRZqRvyoL0g==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/service-realtime/-/service-realtime-17.0.0-rc.1.tgz", + "integrity": "sha512-PODVYv0GzYv3ynt54ifCd7CJQM3I7aYVhVm2JGv3CDT/FERtg/b5VifFO5XNGtnpIFX3KmqFnMbaPAaI0/JdjQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/platform-objects": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/service-settings": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/service-settings/-/service-settings-16.1.0.tgz", - "integrity": "sha512-Ev3AYcgrcp4aJ7xt+RIXypyuVOS7SfHLFzoePwI5TfU0a/JID1noNSdP2rwaSaUB0OEZWMRgyOGiGuMrx7Zv8A==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/service-settings/-/service-settings-17.0.0-rc.1.tgz", + "integrity": "sha512-5uHzDV4mhvmA1VA2T9FKX/jtxLViE0Nv1Ab+Mdit+qgg/fRuZ91f9VHuUJzMZXvY/LtghPMLChkELX1ObFDI+A==", "license": "Apache-2.0", "dependencies": { "@noble/ciphers": "^2.2.0", - "@objectstack/core": "16.1.0", - "@objectstack/platform-objects": "16.1.0", - "@objectstack/spec": "16.1.0", - "@objectstack/types": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/service-sms": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/service-sms/-/service-sms-16.1.0.tgz", - "integrity": "sha512-2encL9plD0j2JPiKMu6Lw7Fgb1hSgM8VbZrTaXxbwlAR69iRA2ifh3zzxjVvaG29ojHxBtzRu7+tNlEkmdsG8w==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/service-sms/-/service-sms-17.0.0-rc.1.tgz", + "integrity": "sha512-4VDRSU4IdFQ15kmaTPINfcoeo2D3cO7jmOKimGwcGTiCbPeyQChrW1j+DKiDflX4E3KuPVb7bgpBU+VSr+3sRQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" } }, "node_modules/@objectstack/service-storage": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/service-storage/-/service-storage-16.1.0.tgz", - "integrity": "sha512-vy6a08Wl5BnAwG8wcKYhIHlM3gnOoTkwj690pvg+cUaGAlktmkhZNgpMAdygtZiTahiXVIO0Ga93y+5Vb4tK1A==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/service-storage/-/service-storage-17.0.0-rc.1.tgz", + "integrity": "sha512-piDhFnBcX9h3B0ndbmeWlJeA7ADAv6lhVSFP+lfbKza6psV5XEF6jGyTG8ls4/uGMu/lQCbd2ciyzOqVfurQvw==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/observability": "16.1.0", - "@objectstack/platform-objects": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/observability": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1", + "@objectstack/types": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" }, "peerDependencies": { "@aws-sdk/client-s3": "^3.0.0", @@ -2299,28 +2336,28 @@ } }, "node_modules/@objectstack/setup": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/setup/-/setup-16.1.0.tgz", - "integrity": "sha512-r3RilWSkUAAhhAM8dM/pB8DwNL77ktExQI3Jto1Foee79TT3rVE81tCbk1Gyasv7xJkWk9gBXeujyHTOsFgbdw==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/setup/-/setup-17.0.0-rc.1.tgz", + "integrity": "sha512-PrXO6ztglohuHF7Y+bhlEpB//Hz1Y+tYqu3VsJPwwXPPh9JnSi7oZDNYjpSkX3THAyDS70wqx1D8v3+QItFcfg==", "license": "Apache-2.0", "dependencies": { - "@objectstack/platform-objects": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/spec": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/spec/-/spec-16.1.0.tgz", - "integrity": "sha512-JoDl1ZC4yTxy85/9OoMlOwMTa0I31Jlg5h3lBFSXabZQUclVoexHvF49G4df3xcYyu9r339dskl3F9vwN3kwWA==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/spec/-/spec-17.0.0-rc.1.tgz", + "integrity": "sha512-1SIDQHwxaV8GLD8YqLxCJ0fxTag6eYvvWntihil+lBIxNSjYLI3U384I4l03esBvkytrts3L5W0WCZJkquJiXw==", "license": "Apache-2.0", "dependencies": { "zod": "^4.4.3" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" }, "peerDependencies": { "ai": "^7.0.0" @@ -2332,76 +2369,76 @@ } }, "node_modules/@objectstack/trigger-api": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/trigger-api/-/trigger-api-16.1.0.tgz", - "integrity": "sha512-5QTujHmvAU2LsoPKsv3NW1BSCdHo4qQQyjPXwAVMOeHA+HW4f5tCREjQHm59lFKKuufR7P/1F+L3XUvVaSUTSg==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/trigger-api/-/trigger-api-17.0.0-rc.1.tgz", + "integrity": "sha512-HwTQR3yePaOyvPlkG59Ce0eElCweVAKWMIyc69jJ4UQ09lRgrreGnfWCq7hOzGHU9KCfekKUrh+2VNkB2ZrECQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" } }, "node_modules/@objectstack/trigger-record-change": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/trigger-record-change/-/trigger-record-change-16.1.0.tgz", - "integrity": "sha512-mfbznLZaMg7pDx9FSUUQ2lC2eNHzLIEnCmsmA8czTLNO71cD7tPaUEiimjAwmgffWHZRWGRHZvkbhR/NJlDcFw==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/trigger-record-change/-/trigger-record-change-17.0.0-rc.1.tgz", + "integrity": "sha512-DwLsNvUaA6iEXTkgJFzmhLfLVa72C5lnVJvhjoKDnoLOKWeFsyQTolUYAYiC0KyQM8YUkmVgNungEZGYxo67og==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/trigger-schedule": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/trigger-schedule/-/trigger-schedule-16.1.0.tgz", - "integrity": "sha512-DDSql11A2MFrm8jPl8106J/Vy7/cS4ooYcASn0S9deGYWDrPU9G/ZjjiKQkhT3OCXYzu+qgzwem7VL5PJX9MCg==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/trigger-schedule/-/trigger-schedule-17.0.0-rc.1.tgz", + "integrity": "sha512-cQYOS2TlXOOFFjiEljEbOCvvo2MI+ppfEVlGLRu5UyTzjKJF9V4He+AB2zwARog2BmcZX/nzpTMK9TxHTiAiTQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/types": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/types/-/types-16.1.0.tgz", - "integrity": "sha512-/OnXfk0FZt0bgfDUx4BrIoiySS7xbr5rR1rnoBl5K1uUnjyrwswNJMmMNotkCufoaU0SBymcrYK53VlqAF1L1w==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/types/-/types-17.0.0-rc.1.tgz", + "integrity": "sha512-DhxuS3zLyb9LAAukJVQokF3BHzmbhxdBAjLgSujKP/In1OBON5d2DAEK+SG0TfQsrkM3d7coqS88D+v9ZrsBtQ==", "license": "Apache-2.0", "dependencies": { - "@objectstack/spec": "16.1.0" + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@objectstack/verify": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/@objectstack/verify/-/verify-16.1.0.tgz", - "integrity": "sha512-37YNsOFIF3xWoGUslLdbT88AAsnKXd1dcT5/CN62WOTTKPpj8ceBaxJp/t3CX0SBrjItZedXOdiwZZnuTTw8hw==", + "version": "17.0.0-rc.1", + "resolved": "https://registry.npmjs.org/@objectstack/verify/-/verify-17.0.0-rc.1.tgz", + "integrity": "sha512-Z9gRzB+l+L5DVsHyFgGP8EwY49+VlqSmVcJN+EtqthcWD7MN71oWQCAeom9sQeY6tEIDW49izWrji7Dcv9nFww==", "license": "Apache-2.0", "dependencies": { - "@objectstack/core": "16.1.0", - "@objectstack/driver-sqlite-wasm": "16.1.0", - "@objectstack/objectql": "16.1.0", - "@objectstack/plugin-auth": "16.1.0", - "@objectstack/plugin-hono-server": "16.1.0", - "@objectstack/plugin-security": "16.1.0", - "@objectstack/plugin-sharing": "16.1.0", - "@objectstack/rest": "16.1.0", - "@objectstack/runtime": "16.1.0", - "@objectstack/service-analytics": "16.1.0", - "@objectstack/service-automation": "16.1.0", - "@objectstack/service-datasource": "16.1.0", - "@objectstack/service-settings": "16.1.0", - "@objectstack/spec": "16.1.0" + "@objectstack/core": "17.0.0-rc.1", + "@objectstack/objectql": "17.0.0-rc.1", + "@objectstack/platform-objects": "17.0.0-rc.1", + "@objectstack/plugin-auth": "17.0.0-rc.1", + "@objectstack/plugin-hono-server": "17.0.0-rc.1", + "@objectstack/plugin-security": "17.0.0-rc.1", + "@objectstack/plugin-sharing": "17.0.0-rc.1", + "@objectstack/rest": "17.0.0-rc.1", + "@objectstack/runtime": "17.0.0-rc.1", + "@objectstack/service-analytics": "17.0.0-rc.1", + "@objectstack/service-automation": "17.0.0-rc.1", + "@objectstack/service-datasource": "17.0.0-rc.1", + "@objectstack/service-settings": "17.0.0-rc.1", + "@objectstack/spec": "17.0.0-rc.1" }, "engines": { - "node": ">=18.0.0" + "node": ">=22.0.0" } }, "node_modules/@oclif/core": { @@ -3927,12 +3964,12 @@ } }, "node_modules/chalk": { - "version": "5.6.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.6.2.tgz", - "integrity": "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-6.0.0.tgz", + "integrity": "sha512-2uNTXIuTTxk7ciZgAU1BQcgnchcG0xXnrs6jzkQfj9SsRa9M2s5zE8WT96hS6KmG4MzWHSrvH43DF1m4XRkrFg==", "license": "MIT", "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" + "node": ">=22" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" @@ -4729,9 +4766,9 @@ } }, "node_modules/fast-uri": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.4.tgz", - "integrity": "sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.5.tgz", + "integrity": "sha512-gHwA1O9LDIcKunMKhObS/HimwtehO1nPUECKAu5TpKgaO19fcWEl4bliWe1jWxVFvIXztJjjQ4L8XQ1EU9f7Jw==", "funding": [ { "type": "github", @@ -5131,9 +5168,9 @@ } }, "node_modules/hono": { - "version": "4.12.32", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.32.tgz", - "integrity": "sha512-XcuyW9qE2kJn07PkecMOBd5Vq/hMy7mmGw+idz1yblbg9N17ijJODrvPkn7/dwL3Kulj8LcRJ69DLOWf91dRUg==", + "version": "4.12.33", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.33.tgz", + "integrity": "sha512-+SwvkaiJtxsiPjhy9LivY/1m7UsNqCJetM1BrZl9A5DkQhlbHQDU730mMiDPWjnoCYOM8Chf3WrCJw27kNTPFQ==", "license": "MIT", "engines": { "node": ">=16.9.0" @@ -5271,9 +5308,9 @@ } }, "node_modules/ip-address": { - "version": "10.3.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.3.1.tgz", - "integrity": "sha512-1e9d3kb97NHJTIJDZW9rKqW2h6+dFa50Dy0fpPSMQp2ADje5gvKsXmdiK6dwY5t76TaTt5+P5N1Y/LoToIxP6g==", + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.4.0.tgz", + "integrity": "sha512-oSK96Grm3aP6OrS263xVxbNDGVL7rzBtYdpGqlDG8iQdoenDoTs/nkki+DflYbAEE8Xl6o5YxhxlrKvI3nqKXQ==", "license": "MIT", "engines": { "node": ">= 12" @@ -6494,6 +6531,16 @@ "node": ">=10" } }, + "node_modules/node-addon-api": { + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.9.1.tgz", + "integrity": "sha512-4eUQWVPCUUUiBjLnHS3cXWeC6ryoPUc0U3rP7IuzapoGbzMqd/r6KKO0clr0b+snQhsrueFEhCZDdK+LK7hxKg==", + "license": "MIT", + "optional": true, + "engines": { + "node": "^18 || ^20 || >= 21" + } + }, "node_modules/node-rsa": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-1.1.1.tgz", From cc433cb8fcec7c926d53315747d4407b170d1bb1 Mon Sep 17 00:00:00 2001 From: os-zhuang Date: Sat, 1 Aug 2026 08:58:00 +0800 Subject: [PATCH 3/3] fix: complete the v17 permission, approval and media migrations (#580) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The version bump leaves three 17.0 contracts half-migrated. The first is a silent outage. allowExport became an opt-in bit. Before 17.0 an unset value inherited read, so "can list => can export" and the bit only ever hid a button; 17.0 inverted the default, and `resolveUserExportAllowed` now demands an explicit `allowExport: true` with neither `viewAllRecords` nor `modifyAllRecords` standing in for it. No profile carried the bit, so every CSV/XLSX list export and every report export would have 403'd for every user, system_admin included — while `os validate`, `os build` and the whole suite stayed green, because the grant is well-formed, it just isn't there. Grant it on the five objects with a real export surface (a list view declaring `exportOptions`, or a report whose dataset is built on them), for each profile that already reads them. `guest_portal` gets none: ADR-0090 D9 classes `allowExport` as high-privilege, so a set carrying it stops binding to the `guest` anchor entirely. New guards in authorization-coverage fail in both directions — an export surface nobody can reach, and a grant with no surface behind it — so the next `exportOptions` cannot ship without its grant. Approval nodes drop the hand-rolled `org_membership_level: 'owner'` approver for the native `onEmptyApprovers: 'admin_rescue'`. That entry existed only to avoid the empty-position dead-end, and with `behavior: 'first_response'` it overshot: it made an org owner a routine approver on every deal over $100K rather than a rescue when the bench is empty. Media fields declare `accept` / `maxSize`, which 17.0 enforces server-side against the stored sys_file (ADR-0104 D3 wave 2). Previously the upload widget read them while FieldSchema dropped them at parse, so the constraint never reached a caller talking to the API directly. Also drop the `edit`/`delete`/`view` builtin whitelist from the rowActions guard. 17.0's `action-name-undefined` rule refuses a rowActions string naming no defined action, so the whitelist was letting metadata past CI that the platform then rejects. MAINTENANCE.md §3.2 documents the `os migrate` data gates and the `OS_ALLOW_LAX_*` escape hatches: `pnpm verify` and `demo:reset` start from an empty database, so neither can catch what an in-place upgrade needs. Claude-Session: https://claude.ai/code/session_01YHzpTPCxNfskro88FRuBwH Co-authored-by: Claude --- .changeset/upgrade-objectstack-v17-rc.md | 8 ++ CHANGELOG.md | 4 + docs/MAINTENANCE.md | 41 +++++++++ src/flows/opportunity-approval.flow.ts | 29 ++++--- src/objects/account.object.ts | 5 +- src/objects/contact.object.ts | 5 +- src/objects/product.object.ts | 8 ++ src/profiles/guest-portal.profile.ts | 4 + src/profiles/index.ts | 36 ++++++++ src/profiles/marketing-user.profile.ts | 12 ++- src/profiles/sales-manager.profile.ts | 13 +-- src/profiles/sales-rep.profile.ts | 13 +-- src/profiles/service-agent.profile.ts | 11 ++- src/profiles/system-admin.profile.ts | 14 +-- test/authorization-coverage.test.ts | 104 +++++++++++++++++++++++ test/metadata-references.test.ts | 20 ++++- 16 files changed, 285 insertions(+), 42 deletions(-) diff --git a/.changeset/upgrade-objectstack-v17-rc.md b/.changeset/upgrade-objectstack-v17-rc.md index 622c4b7d..24dde21c 100644 --- a/.changeset/upgrade-objectstack-v17-rc.md +++ b/.changeset/upgrade-objectstack-v17-rc.md @@ -6,3 +6,11 @@ Upgrade HotCRM to ObjectStack 17.0.0-rc.1. The app now declares protocol 17 compatibility, preserves existing required-field database constraints explicitly, uses the live metadata contracts for skills, flows, and APIs, and enables the date buckets that make CRM analytics aggregate by month, day, and quarter. + +Also completes the 17.0 permission migration that the version bump alone leaves +half-done: `allowExport` became an opt-in bit whose absence DENIES, so every +CSV/XLSX list export and every report export is authored explicitly on the +profiles that need it. Approval nodes drop their hand-rolled org-owner backstop +for the native `onEmptyApprovers` policy, media fields declare the `accept` and +`maxSize` constraints 17.0 enforces server-side, and the platform-upgrade +checklist now covers the `os migrate` data gates. diff --git a/CHANGELOG.md b/CHANGELOG.md index 1e4628c9..7c8d4ed7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,10 @@ Everything merged after the 2.2.2 tag. Not yet versioned or published. ### Changed - **ObjectStack platform → 17.0.0-rc.1** across all `@objectstack/*` packages (from 16.1.0). The manifest protocol handshake and marketplace `specVersion` now declare the 17.0.0-rc.1 compatibility line; API methods, skills and flow notifications use only live metadata keys; pre-17 required fields preserve their database `NOT NULL` constraints explicitly; and the analytics semantic layer now declares the month/day/quarter buckets v17 executes correctly. +- **`allowExport` is authored on every profile that needs it (17.0 opt-in export axis, upstream #3544).** Before 17.0 an unset `allowExport` inherited read, so "can list ⇒ can export". 17.0 inverted the default: `resolveUserExportAllowed` demands an explicit `allowExport: true` and neither `viewAllRecords` nor `modifyAllRecords` substitutes, so an unset bit now DENIES — at both bulk-egress doors, the list views' built-in `exportOptions` and `ReportService.assertExportAllowed`. No profile carried the bit, which would have 403'd every CSV/XLSX and report export for every user, `system_admin` included, while `os validate`, `os build` and the whole test suite stayed green. The five objects with a real export surface (`crm_account`, `crm_case`, `crm_contact`, `crm_lead`, `crm_opportunity`) now carry the grant on each profile that already reads them; `guest_portal` deliberately carries none (ADR-0090 D9 forbids binding a high-privilege set to the `guest` anchor). Pinned by `test/authorization-coverage.test.ts`, which fails both on an export surface nobody can reach and on a grant with no surface behind it. +- Approval nodes in `opportunity_approval` use the native `onEmptyApprovers: 'admin_rescue'` policy instead of the hand-rolled `org_membership_level: 'owner'` approver. That entry existed only to avoid the empty-position dead-end, and with `behavior: 'first_response'` it overshot — it made an org owner a routine approver on every deal over $100K, not a rescue when the bench is empty. +- Media fields (`crm_product.image`, `crm_product.datasheet`, `crm_account.logo`, `crm_contact.avatar`) declare `accept` and `maxSize`. 17.0 enforces both server-side against the stored `sys_file` (ADR-0104 D3 wave 2); before, the upload widget read them but `FieldSchema` dropped them at parse, so the constraint never reached a direct API caller. +- Docs: [`docs/MAINTENANCE.md`](docs/MAINTENANCE.md) §3.2 covers the `os migrate` data gates (`files-to-references`, `value-shapes`) and the `OS_ALLOW_LAX_*` escape hatches. `pnpm verify` and `demo:reset` cannot catch these — they start from an empty database, so a green local run says nothing about an in-place upgrade. - **ObjectStack platform → 16.1.0 stable** across all `@objectstack/*` packages (from the 16.0.0-rc.1 line pinned in 2.2.0). [#465](https://github.com/objectstack-ai/hotcrm/pull/465) - CI: bump `actions/checkout` 4 → 7 ([#422](https://github.com/objectstack-ai/hotcrm/pull/422)) and `actions/setup-node` 4 → 6 ([#421](https://github.com/objectstack-ai/hotcrm/pull/421)). - Docs: README hero states HotCRM's size in tokens ([#483](https://github.com/objectstack-ai/hotcrm/pull/483)); drifted README counts fixed ([#466](https://github.com/objectstack-ai/hotcrm/pull/466)). diff --git a/docs/MAINTENANCE.md b/docs/MAINTENANCE.md index 5a2a0f85..39d10a59 100644 --- a/docs/MAINTENANCE.md +++ b/docs/MAINTENANCE.md @@ -68,6 +68,47 @@ can silently invalidate existing metadata or **seed data** (see §4). Treat ever native binary was built for a different Node ABI — `pnpm rebuild better-sqlite3` and restart. This is an environment issue, not an app change. 7. Note the new platform version in `CHANGELOG.md`. +8. **Check the release notes for `os migrate` steps that run against DATA, not + metadata** — see §3.2. `pnpm verify` cannot catch these: they gate runtime + behaviour on a deployment flag, so a fresh install is clean and an in-place + upgrade is not. + +### 3.2 Data migrations and enforcement gates (`os migrate`) + +Steps 1–7 cover the app's own metadata. A major can additionally ship +migrations that rewrite or re-validate **stored rows**, gated behind a +deployment flag so the new enforcement turns on only once the data is known +clean. `demo:reset` hides these entirely — it starts from an empty database, so +a green local run says nothing about an existing deployment. + +Run the metadata replay first, then each data gate as a dry run before +`--apply`: + +```bash +os migrate meta --from # replays renames and key conversions +os migrate files-to-references # dry run: media fields → sys_file records +os migrate files-to-references --apply # convert, verify, record the flag +os migrate value-shapes # dry run: scan reference & JSON validity +os migrate value-shapes --apply # record the gate if the scan is clean +``` + +For **17.0** specifically: `files-to-references` backfills the four media +fields this app declares (`crm_product.image`, `crm_product.datasheet`, +`crm_account.logo`, `crm_contact.avatar`) into `sys_file` records, and +`value-shapes` scans reference and JSON columns. Neither is needed for a fresh +install — no seed data populates a media field — but an in-place upgrade needs +both before strict validation is safe to enable. + +If a scan reports rows it cannot convert, the escape hatches downgrade the new +enforcement to warnings while you fix the data. They are temporary, not a +destination: + +| Variable | Effect | +| --- | --- | +| `OS_ALLOW_LAX_MEDIA_VALUES=1` | File-value verification warns instead of failing | +| `OS_ALLOW_LAX_VALUE_SHAPES=1` | Reference/JSON validation warns instead of failing | +| `OS_ALLOW_LAX_ACTION_PARAMS=1` | Action-param shape enforcement warns instead of failing | +| `OS_DATA_VALUE_SHAPE_STRICT_ENABLED=1` | Opt into strict value shapes immediately, without the gate | ### 3.1 Destructive schema drift — database-only columns after an upgrade diff --git a/src/flows/opportunity-approval.flow.ts b/src/flows/opportunity-approval.flow.ts index 428eab98..1f5b8a09 100644 --- a/src/flows/opportunity-approval.flow.ts +++ b/src/flows/opportunity-approval.flow.ts @@ -75,15 +75,18 @@ export const OpportunityApprovalFlow: Flow = { type: 'approval', label: 'Sales Manager Review', config: { - // Org-owner backstop: approvers snapshot at request creation, and a - // position with no holders leaves the request undecidable while - // lockRecord holds the record hostage (no admin override exists). - // behavior:'first_response' means whoever responds first wins, so the - // backstop changes nothing when the sales-manager bench is staffed. - approvers: [ - { type: 'position', value: 'sales_manager' }, - { type: 'org_membership_level', value: 'owner' }, - ], + // The empty-position dead-end (approvers snapshot at request creation, + // so a position with no holders left the request undecidable while + // lockRecord held the record hostage) is a NODE POLICY on @objectstack + // 17, not something the approver list has to work around. The + // `{ type: 'org_membership_level', value: 'owner' }` entry that used to + // sit here was that workaround, and it overshot: with + // `behavior: 'first_response'` it made an org owner a routine approver + // for every deal, not just a rescue when the bench is empty. + approvers: [{ type: 'position', value: 'sales_manager' }], + // Explicit even though `admin_rescue` is the schema default — this is + // the mechanism the node depends on, so it is authored, not inherited. + onEmptyApprovers: 'admin_rescue', behavior: 'first_response', lockRecord: true, approvalStatusField: 'approval_status', @@ -104,11 +107,9 @@ export const OpportunityApprovalFlow: Flow = { type: 'approval', label: 'Sales Director Sign-off', config: { - // Same org-owner backstop as manager_review (empty-position dead-end). - approvers: [ - { type: 'position', value: 'sales_director' }, - { type: 'org_membership_level', value: 'owner' }, - ], + // Same node policy as manager_review — see the note there. + approvers: [{ type: 'position', value: 'sales_director' }], + onEmptyApprovers: 'admin_rescue', behavior: 'first_response', lockRecord: true, approvalStatusField: 'approval_status', diff --git a/src/objects/account.object.ts b/src/objects/account.object.ts index 45542ff0..332b7988 100644 --- a/src/objects/account.object.ts +++ b/src/objects/account.object.ts @@ -153,10 +153,13 @@ export const Account = ObjectSchema.create({ group: 'branding', }), - // Company logo (uploaded image) + // Company logo (uploaded image). `accept` / `maxSize` are server-enforced + // from @objectstack 17 — see the note on `crm_product.image`. logo: Field.image({ label: 'Company Logo', group: 'branding', + accept: ['image/png', 'image/jpeg', 'image/svg+xml', 'image/webp'], + maxSize: 2 * 1024 * 1024, }), // Date field diff --git a/src/objects/contact.object.ts b/src/objects/contact.object.ts index ac25da68..9a990038 100644 --- a/src/objects/contact.object.ts +++ b/src/objects/contact.object.ts @@ -58,10 +58,13 @@ export const Contact = ObjectSchema.create({ group: 'identity', }), - // Avatar field + // Avatar field. `accept` / `maxSize` are server-enforced from + // @objectstack 17 — see the note on `crm_product.image`. avatar: Field.avatar({ label: 'Profile Picture', group: 'identity', + accept: ['image/png', 'image/jpeg', 'image/webp'], + maxSize: 2 * 1024 * 1024, }), // Relationship: Link to Account (Master-Detail) diff --git a/src/objects/product.object.ts b/src/objects/product.object.ts index c677cef3..329ac231 100644 --- a/src/objects/product.object.ts +++ b/src/objects/product.object.ts @@ -146,14 +146,22 @@ export const Product = ObjectSchema.create({ }), // Images and Assets + // `accept` / `maxSize` are declarable AND server-enforced from + // @objectstack 17 (ADR-0104 D3 wave 2). Before that the upload widget read + // them but `FieldSchema` dropped them at parse, so the constraint existed + // only in the browser and any direct API caller walked past it. image: Field.image({ label: 'Product Image', group: 'metadata', + accept: ['image/png', 'image/jpeg', 'image/webp'], + maxSize: 5 * 1024 * 1024, }), datasheet: Field.file({ label: 'Datasheet', group: 'metadata', + accept: ['application/pdf'], + maxSize: 20 * 1024 * 1024, }), // Tax & billing diff --git a/src/profiles/guest-portal.profile.ts b/src/profiles/guest-portal.profile.ts index 37b20df6..62d01d04 100644 --- a/src/profiles/guest-portal.profile.ts +++ b/src/profiles/guest-portal.profile.ts @@ -25,6 +25,10 @@ export const GuestPortalProfile = { description: 'Anonymous visitors submitting public Web-to-Lead / Web-to-Case forms. ' + 'INSERT-only on lead and case; no read/edit/delete on any object.', + // No `allowExport` anywhere below, deliberately: this set is bound to the + // `guest` anchor, and ADR-0090 D9 classes `allowExport` as a high-privilege + // bit no anchor may confer — the set would stop binding at all, on top of + // handing anonymous visitors bulk table egress. See `src/profiles/index.ts`. objects: { crm_lead: { allowCreate: true, diff --git a/src/profiles/index.ts b/src/profiles/index.ts index 4376450b..a4a3a89f 100644 --- a/src/profiles/index.ts +++ b/src/profiles/index.ts @@ -2,6 +2,42 @@ /** * Profile Definitions Barrel + * + * ─── `allowExport` — the opt-in bulk-egress axis (@objectstack 17, #3544) ─── + * + * This is the canonical note; the profiles point here. + * + * Before 17.0 the export axis was advisory: an unset `allowExport` inherited + * read, so "can list ⇒ can export" and the bit only ever hid a button. 17.0 + * makes it a real gate and inverts the default — `resolveUserExportAllowed` + * (plugin-security) returns true only for an explicit `allowExport: true`, and + * neither `viewAllRecords` nor `modifyAllRecords` substitutes for it. An unset + * bit now DENIES. Both bulk-egress doors ask before they read: the list views' + * built-in `exportOptions`, and `ReportService.assertExportAllowed`, which + * fails a report export closed with `EXPORT_NOT_PERMITTED`. + * + * So the grants below are authored, not inherited. The rule, pinned by + * `test/authorization-coverage.test.ts`: + * + * a profile grants `allowExport` on an object IFF it already holds + * `allowRead` there AND the app ships an export surface for that object — + * a list view declaring `exportOptions`, or a report whose dataset is + * built on it. + * + * That union is exactly `crm_account`, `crm_case`, `crm_contact`, `crm_lead`, + * `crm_opportunity` today. Adding `exportOptions` to a view (or a report over + * a new dataset) means adding the matching grant here in the same change — the + * guard fails otherwise, which is the point: a surface nobody can use is the + * failure this axis exists to make loud instead of silent. + * + * Export is READ-DERIVED (`export ⊆ list`), so the grant opens the door but + * does not widen the rows: record scope, RLS and sharing still apply on top. A + * `sales_rep` exporting `crm_opportunity` gets their own book, not the org's. + * + * `guest_portal` deliberately carries none. Per ADR-0090 D9 a set holding + * `allowExport` is high-privilege and cannot be bound to the `everyone` or + * `guest` anchors at all — granting it there would both hand anonymous + * visitors bulk table egress and make the set unbindable. */ export { GuestPortalProfile } from './guest-portal.profile'; export { MarketingUserProfile } from './marketing-user.profile'; diff --git a/src/profiles/marketing-user.profile.ts b/src/profiles/marketing-user.profile.ts index b5884f18..041fa54c 100644 --- a/src/profiles/marketing-user.profile.ts +++ b/src/profiles/marketing-user.profile.ts @@ -4,15 +4,19 @@ export const MarketingUserProfile = { name: 'marketing_user', label: 'Marketing User', objects: { - crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - crm_account: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + // `allowExport` where an export surface exists — canonical note in + // `src/profiles/index.ts`. Lead and contact list exports are marketing's + // core targeting workflow; account/opportunity back the campaign-ROI + // reports. No `crm_case` grant here, so no export bit for it either. + crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, + crm_account: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, + crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, crm_campaign: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, // Org-wide read: marketing attributes campaign → pipeline ROI, which needs // every opportunity, not just self-owned. viewAllRecords was false here // while every other object on this set is true — an oversight that hid all // pipeline from marketing (and tripped security-private-no-readscope). - crm_opportunity: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + crm_opportunity: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, // Campaign membership is THIS profile's core write surface: the // "Add to Campaign" action (`src/actions/lead.actions.ts`) inserts // `crm_campaign_member` rows, and before #488 no permission set granted the diff --git a/src/profiles/sales-manager.profile.ts b/src/profiles/sales-manager.profile.ts index cfb2e5d0..e9ab32c0 100644 --- a/src/profiles/sales-manager.profile.ts +++ b/src/profiles/sales-manager.profile.ts @@ -10,15 +10,18 @@ export const SalesManagerProfile = { name: 'sales_manager', label: 'Sales Manager', objects: { - crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, - crm_account: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, - crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, - crm_opportunity: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, + // `allowExport` where an export surface exists — canonical note in + // `src/profiles/index.ts`. A manager owns the number, so the pipeline and + // book exports that feed offline forecasting are part of the job. + crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowExport: true }, + crm_account: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowExport: true }, + crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowExport: true }, + crm_opportunity: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowExport: true }, crm_quote: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, crm_contract: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, crm_product: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, crm_campaign: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - crm_case: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + crm_case: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, crm_task: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, // The forecast IS the manager's job: they read every rep's snapshot and // adjust the committed number, so this is org-wide read AND write on a diff --git a/src/profiles/sales-rep.profile.ts b/src/profiles/sales-rep.profile.ts index b319d19c..6a168285 100644 --- a/src/profiles/sales-rep.profile.ts +++ b/src/profiles/sales-rep.profile.ts @@ -12,21 +12,24 @@ export const SalesRepProfile = { // need cross-team visibility get it through the account team / territory // sharing rules, not by widening the base set. objects: { - crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: 'own' as const }, - crm_account: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: 'own' as const }, + // `allowExport` where an export surface exists — canonical note in + // `src/profiles/index.ts`. Safe alongside `readScope: 'own'`: export is + // read-derived, so a rep's CSV carries their own book, not the org's. + crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: 'own' as const, allowExport: true }, + crm_account: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: 'own' as const, allowExport: true }, // NO readScope: `crm_contact` is `controlled_by_parent` (master-detail to // crm_account), so its rows derive from the account the rep can read — // territory- and team-shared accounts included. A `readScope` here was // inert (the sharing service only applies owner scope to `private` objects) // and read as a promise the engine never kept: it said "own contacts only" // while access actually followed the account (#488). - crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, - crm_opportunity: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: 'own' as const }, + crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, allowExport: true }, + crm_opportunity: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: 'own' as const, allowExport: true }, crm_quote: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: 'own' as const }, crm_contract: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: 'own' as const }, crm_product: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, crm_campaign: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - crm_case: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: 'own' as const }, + crm_case: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: 'own' as const, allowExport: true }, crm_task: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false, readScope: 'own' as const }, // Reference catalog (public_read OWD): reps read knowledge articles, which // are authored by service. diff --git a/src/profiles/service-agent.profile.ts b/src/profiles/service-agent.profile.ts index 75c0ec1b..46faa8ff 100644 --- a/src/profiles/service-agent.profile.ts +++ b/src/profiles/service-agent.profile.ts @@ -10,13 +10,16 @@ export const ServiceAgentProfile = { // security-private-no-readscope warning's real signal: allowRead on a // private object with no scope had silently locked agents out of every // account they didn't personally own. - crm_lead: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - crm_account: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, - crm_contact: { allowCreate: false, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, + // `allowExport` where an export surface exists — canonical note in + // `src/profiles/index.ts`. `crm_opportunity` carries no export bit: this + // set has no read on it at all, and the axis never widens read. + crm_lead: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, + crm_account: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, + crm_contact: { allowCreate: false, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: true, modifyAllRecords: false, allowExport: true }, crm_opportunity: { allowCreate: false, allowRead: false, allowEdit: false, allowDelete: false, viewAllRecords: false, modifyAllRecords: false }, // Cases + tasks: an agent's own queue by default (readScope: 'own'); // cross-agent visibility comes from the case-escalation sharing rule. - crm_case: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: 'own' as const }, + crm_case: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: false, viewAllRecords: false, modifyAllRecords: false, readScope: 'own' as const, allowExport: true }, crm_task: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: false, modifyAllRecords: false, readScope: 'own' as const }, crm_product: { allowCreate: false, allowRead: true, allowEdit: false, allowDelete: false, viewAllRecords: true, modifyAllRecords: false }, // The knowledge base is this team's own surface: agents draft and revise diff --git a/src/profiles/system-admin.profile.ts b/src/profiles/system-admin.profile.ts index e9847e47..c87abea8 100644 --- a/src/profiles/system-admin.profile.ts +++ b/src/profiles/system-admin.profile.ts @@ -14,15 +14,19 @@ export const SystemAdminProfile = { name: 'system_admin', label: 'System Administrator', objects: { - crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, - crm_account: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, - crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, - crm_opportunity: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, + // `allowExport` on the five objects with an export surface — see the + // canonical note in `src/profiles/index.ts`. It is authored even here: + // 17.0 gates export on the explicit bit, and `modifyAllRecords` does not + // stand in for it, so without these an admin cannot export either. + crm_lead: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowExport: true }, + crm_account: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowExport: true }, + crm_contact: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowExport: true }, + crm_opportunity: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowExport: true }, crm_quote: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, crm_contract: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, crm_product: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, crm_campaign: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, - crm_case: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, + crm_case: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true, allowExport: true }, crm_task: { allowCreate: true, allowRead: true, allowEdit: true, allowDelete: true, viewAllRecords: true, modifyAllRecords: true }, // The objects below shipped with navigation, views, hooks and seed data // but no grant in ANY permission set (#488): "Knowledge" and "Forecasts" diff --git a/test/authorization-coverage.test.ts b/test/authorization-coverage.test.ts index 61d13552..14f0d99b 100644 --- a/test/authorization-coverage.test.ts +++ b/test/authorization-coverage.test.ts @@ -448,3 +448,107 @@ describe('#488 regressions stay fixed', () => { expect(readable, 'the guest set must stay INSERT-only').toEqual([]); }); }); + +/** + * `allowExport` coverage — the opt-in bulk-egress axis (@objectstack 17, #3544). + * + * 17.0 inverted this bit's default: unset used to inherit read, so the axis + * only hid a button; now `resolveUserExportAllowed` (plugin-security) demands + * an explicit `allowExport: true` and neither `viewAllRecords` nor + * `modifyAllRecords` substitutes. Unset DENIES, at both bulk-egress doors — + * the list views' built-in `exportOptions`, and `assertExportAllowed`, which + * fails a report export closed with `EXPORT_NOT_PERMITTED`. + * + * That makes an unauthored export bit a SILENT outage: `os validate`, `os + * build` and every metadata test still pass while the Export button 403s for + * every user, admins included. Nothing else in this suite would catch it, + * because the grant is well-formed — it just isn't there. + * + * The rule these guards pin (canonical note: `src/profiles/index.ts`): + * a profile grants `allowExport` on an object IFF it already holds `allowRead` + * there AND the app ships an export surface for it. Both directions matter — + * a surface nobody can use is the outage, and a grant behind no surface is + * bulk egress nobody asked for. + */ +describe('allowExport tracks the app’s real export surfaces', () => { + const datasetByName = new Map( + ((stack as any).datasets ?? []).map((d: AnyRec) => [d.name as string, d] as [string, AnyRec]), + ); + const views: AnyRec[] = (stack as any).views ?? []; + const reports: AnyRec[] = (stack as any).reports ?? []; + + /** Every `dataset:` reference anywhere in a report, including `blocks[]`. */ + const datasetRefsIn = (node: unknown, out: string[] = []): string[] => { + if (Array.isArray(node)) node.forEach((n) => datasetRefsIn(n, out)); + else if (node && typeof node === 'object') { + for (const [k, v] of Object.entries(node as AnyRec)) { + if (k === 'dataset' && typeof v === 'string') out.push(v); + else datasetRefsIn(v, out); + } + } + return out; + }; + + /** + * Objects with a bulk-egress door: a list view declaring `exportOptions`, + * or a report whose dataset is built on them. + */ + const exportSurfaces = new Set(); + for (const v of views) { + const defaultObject = v.list?.data?.object; + for (const list of [v.list, ...Object.values(v.listViews ?? {})].filter(Boolean) as AnyRec[]) { + if (!(list.exportOptions ?? []).length) continue; + const objectName = list.data?.object ?? defaultObject; + if (typeof objectName === 'string') exportSurfaces.add(objectName); + } + } + for (const r of reports) { + for (const ref of datasetRefsIn(r)) { + const objectName = datasetByName.get(ref)?.object; + if (typeof objectName === 'string') exportSurfaces.add(objectName); + } + } + + /** `[setName, objectName]` for every grant carrying the export bit. */ + const exportGrants: Array<[string, string, AnyRec]> = permissionSets.flatMap((ps) => + Object.entries((ps.objects ?? {}) as Record) + .filter(([, perm]) => perm.allowExport === true) + .map(([objectName, perm]) => [ps.name as string, objectName, perm] as [string, string, AnyRec]), + ); + + it('the app actually has export surfaces (the guard is wired to real metadata)', () => { + expect( + [...exportSurfaces].sort(), + 'no exportOptions view and no report dataset resolved — this guard has gone blind', + ).not.toEqual([]); + }); + + it('every export surface is reachable by at least one profile', () => { + const stranded = [...exportSurfaces] + .filter((objectName) => !exportGrants.some(([, granted]) => granted === objectName)) + .map((objectName) => `${objectName}: has an export surface, but no permission set grants allowExport`); + expect(stranded, `export surfaces nobody can use:\n ${stranded.join('\n ')}`).toEqual([]); + }); + + it('no profile grants export on an object with no export surface', () => { + const gratuitous = exportGrants + .filter(([, objectName]) => !exportSurfaces.has(objectName)) + .map(([set, objectName]) => `${set}.${objectName}: allowExport with no export surface behind it`); + expect(gratuitous, `undeclared bulk egress:\n ${gratuitous.join('\n ')}`).toEqual([]); + }); + + it('export never outruns read — the axis widens egress, never visibility', () => { + const bad = exportGrants + .filter(([, , perm]) => perm.allowRead !== true) + .map(([set, objectName]) => `${set}.${objectName}: allowExport without allowRead`); + expect(bad, `export grants with no read behind them:\n ${bad.join('\n ')}`).toEqual([]); + }); + + it('the guest set carries no export bit (ADR-0090 D9 anchor rule)', () => { + // `allowExport` is high-privilege: a set holding it cannot bind to the + // `everyone` or `guest` anchors at all, so granting it here would break the + // binding on top of handing anonymous visitors bulk table egress. + const guestExports = exportGrants.filter(([set]) => set === 'guest_portal').map(([, o]) => o); + expect(guestExports, 'the guest set must never carry allowExport').toEqual([]); + }); +}); diff --git a/test/metadata-references.test.ts b/test/metadata-references.test.ts index 4432bfc0..a749b96e 100644 --- a/test/metadata-references.test.ts +++ b/test/metadata-references.test.ts @@ -721,16 +721,30 @@ describe('object references outside views resolve', () => { describe('list-level action references resolve', () => { const actions: AnyRec[] = (stack as any).actions ?? []; const actionNames = new Set(actions.map((a) => a.name)); - // Row/bulk affordances the list renderer provides without an Action def. - const BUILTIN = new Set(['edit', 'delete', 'view']); + /** + * There is NO builtin escape hatch (@objectstack 17). + * + * This guard used to whitelist `edit` / `delete` / `view` as "affordances the + * list renderer provides without an Action def". 17.0's `action-name-undefined` + * validator rule refuses exactly that: a `rowActions` string naming no defined + * action is reported as a dead affordance — "the button renders and does + * nothing when clicked" — and `os validate` fails the build. + * + * So the whitelist was a trap: it let metadata pass CI that the platform then + * rejected. Row-menu entries come from an Action declaring + * `locations: ['list_item']`, which auto-injects them; naming one here as a + * string is the legacy path the next test forbids. Between the two rules, + * `rowActions` has no correct use in this app today — which is why no view + * declares it. + */ it('every rowAction / bulkAction names a defined action', () => { const bad: string[] = []; for (const v of views) { const lists = [v.list, ...Object.values(v.listViews ?? {})].filter(Boolean) as AnyRec[]; for (const list of lists) { for (const name of [...(list.rowActions ?? []), ...(list.bulkActions ?? [])]) { - if (typeof name === 'string' && !BUILTIN.has(name) && !actionNames.has(name)) { + if (typeof name === 'string' && !actionNames.has(name)) { bad.push(`view "${list.name ?? 'default'}": action "${name}" is not defined`); } }