From e1080b1a19cea25319b2a9285bd4704e24a28432 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 3 Nov 2026 16:37:52 +0000 Subject: [PATCH] chore(deps): upgrade @objectstack/* to 18.3.0 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Moves the four @objectstack pins and the eight pnpm overrides from 18.2.0 to 18.3.0; every @objectstack package in the lockfile resolves to 18.3.0. 18.3 retired `page.slots.tabs` (ADR-0085, objectstack#27053), so the contract page's authored seven-tab strip no longer parses. Per the maintainer's ruling (hotclm decision box batch 11, letter A, 2026-11-03) the page follows the platform's v3 record page: the slotted page keeps its header, highlights and path, and the body is composed from the object — the key-term field groups, then six full-width child tables placed by body-table entries in `clm_contract.fieldGroups`, with the columns the page used to carry moved to each child FK's `relatedListColumns`. Renewals stay a side card; `parent_contract` is kept off the page as before. DESIGN.md §05 and the README describe the new shape. 18.3 also makes a master-detail field's `inlineTitle` translatable, so the i18n gate now counts the six child grid titles; both bundles carry them. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01QsR2jUw8KJgAwuwk6sqYLD --- DESIGN.md | 2 +- README.md | 14 +- package.json | 8 +- pnpm-lock.yaml | 1052 ++++++++++--------- pnpm-workspace.yaml | 16 +- src/objects/contract-version.object.ts | 3 + src/objects/contract.object.ts | 36 + src/objects/deviation.object.ts | 3 + src/objects/obligation.object.ts | 3 + src/objects/payment-plan.object.ts | 3 + src/objects/review.object.ts | 3 + src/objects/signature.object.ts | 3 + src/pages/contract_detail.page.ts | 391 +------ src/translations/en/app.ts | 6 - src/translations/en/objects.contract.ts | 20 +- src/translations/en/objects.lifecycle.ts | 5 + src/translations/zh-CN/app.ts | 6 - src/translations/zh-CN/objects.contract.ts | 20 +- src/translations/zh-CN/objects.lifecycle.ts | 5 + 19 files changed, 686 insertions(+), 913 deletions(-) diff --git a/DESIGN.md b/DESIGN.md index 4bf1529..1099266 100644 --- a/DESIGN.md +++ b/DESIGN.md @@ -215,7 +215,7 @@ RLS 谓词不能跨对象(ADR-0055),所以「同部门可见」无法用 ` | 执行与档案 | `clm_records.access` | 待执行 · 待归档 · 合同台账 | 待执行 grid(`signing` 且签署记录未 `completed` 或执行形式未齐)· 待归档 grid(终态且 `archive_no` 空)· 台账 grid(全字段,可导出) | | 管理 | `clm_admin.access` | 审批矩阵 · 相对方 · 签约主体与部门 · 报表 | 配置对象 grid | -**合同详情页**(slotted):header 挂「提交 / 受理 / 送审 / 发起签署 / 生效 / 终止 / 发起续签」动作,按 status 与门控显隐;highlights:编号 · 相对方 · 金额 · 到期日 · 当前轮次;path 组件显示 draft→submitted→in_review→in_approval→approved→signing→active;tab:概要 / 版本(timeline)/ 审查与偏离 / 审批记录(平台 `sys_approval_request`)/ 履约与收付款 / 签署与归档 / 讨论(平台 discussion slot,评论与 @)。 +**合同详情页**(slotted):header 挂「提交 / 受理 / 送审 / 发起签署 / 生效 / 终止 / 发起续签」动作,按 status 与门控显隐;highlights:编号 · 相对方 · 金额 · 到期日 · 当前轮次;path 组件显示 draft→submitted→in_review→in_approval→approved→signing→active;正文由平台按对象编排(@objectstack 18.3 起,ADR-0085 记录页 v3 取消了页面自带的 tabs 槽;维护者 2026-11-03 裁定跟随平台):先是关键条款各字段组(合同 / 签约方与负责人 / 商务条款 / 期限与续约 / 法律条款),再是 版本 · 审查 · 偏离 · 履约义务 · 收付款计划 · 签署记录 六张整宽子表(`clm_contract.fieldGroups` 中的子表组定位,列由各子表外键的 `relatedListColumns` 声明),最后是收起的 路由与审批 / 生命周期 / AI 审阅 / 汇总;右栏是平台的动态(讨论,评论与 @)、续签合同侧卡、附件与审批面板(平台 `sys_approval_request`)。 无匿名公开表单:合同发起必须登录。 diff --git a/README.md b/README.md index ea7f1d1..ee90f16 100644 --- a/README.md +++ b/README.md @@ -218,17 +218,17 @@ step waits on a read-only view of the one record the request is about (upstream `objectstack-ai/objectstack#26180`); this app declares nothing for it. So a manager who holds no position at all opens the request from **我的合同 › Waiting on Me** and lands on the contract page itself, with -**通过 / 拒绝** above it. Every tab opens: the overview, **版本** (the version's -PDF opens), **审查与偏离**, **审批记录**, **履约与收付款**, **签署与归档** and **讨论**, -and each review, deviation, obligation, signature round and version opens on -its own page. Nothing can be changed: the page has no **编辑**, its **⋯** menu +**通过 / 拒绝** above it. The whole page opens: the key terms, the **合同版本** +table (the version's PDF opens), **审查**, **偏离**, **履约义务**, **收付款计划**, +**签署记录**, the approval panel and the activity feed, and each review, +deviation, obligation, signature round and version opens on its own page. Nothing can be changed: the page has no **编辑**, its **⋯** menu offers only 添加到收藏 and 分享, and a write through the API answers `403 PERMISSION_DENIED`. The read ends with the step. Once the manager approves or rejects, the contract, -its child rows and its files are closed to them again — the page they decided -on reads 「未找到记录」 straight away, which means the step is over, not that -the record is gone. A contract of a report's that is not waiting on them (a +its child rows and its files are closed to them again — from @objectstack 18.3 +the page they decided on says so straight away (「你的审批决定已记录 · 你的审批环节已结束, +对此记录的访问权限也随之结束」) with a link back to the approvals inbox. A contract of a report's that is not waiting on them (a draft, or one already past rung 1) stays closed too: on the open edition being the owner's manager grants no read. The scope that would (`own_and_reports`, DESIGN.md §04 `contract_manager_reports`) is an diff --git a/package.json b/package.json index 26b5a9b..299d9b1 100644 --- a/package.json +++ b/package.json @@ -21,12 +21,12 @@ "verify": "pnpm validate && pnpm lint && pnpm typecheck && pnpm lint:i18n-gate" }, "dependencies": { - "@objectstack/spec": "18.2.0", - "@objectstack/runtime": "18.2.0", - "@objectstack/plugin-hono-server": "18.2.0" + "@objectstack/spec": "18.3.0", + "@objectstack/runtime": "18.3.0", + "@objectstack/plugin-hono-server": "18.3.0" }, "devDependencies": { - "@objectstack/cli": "18.2.0", + "@objectstack/cli": "18.3.0", "typescript": "^6.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7e005fc..a7265a3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -5,32 +5,32 @@ settings: excludeLinksFromLockfile: false overrides: - '@objectstack/core': 18.2.0 - '@objectstack/driver-memory': 18.2.0 - '@objectstack/driver-mongodb': 18.2.0 - '@objectstack/driver-sql': 18.2.0 - '@objectstack/driver-sqlite-wasm': 18.2.0 - '@objectstack/objectql': 18.2.0 - '@objectstack/observability': 18.2.0 - '@objectstack/runtime': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/driver-memory': 18.3.0 + '@objectstack/driver-mongodb': 18.3.0 + '@objectstack/driver-sql': 18.3.0 + '@objectstack/driver-sqlite-wasm': 18.3.0 + '@objectstack/objectql': 18.3.0 + '@objectstack/observability': 18.3.0 + '@objectstack/runtime': 18.3.0 importers: .: dependencies: '@objectstack/plugin-hono-server': - specifier: 18.2.0 - version: 18.2.0 + specifier: 18.3.0 + version: 18.3.0 '@objectstack/runtime': - specifier: 18.2.0 - version: 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + specifier: 18.3.0 + version: 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) '@objectstack/spec': - specifier: 18.2.0 - version: 18.2.0 + specifier: 18.3.0 + version: 18.3.0 devDependencies: '@objectstack/cli': - specifier: 18.2.0 - version: 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + specifier: 18.3.0 + version: 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) typescript: specifier: ^6.0.0 version: 6.0.3 @@ -311,6 +311,15 @@ packages: peerDependencies: hono: ^4 + '@hono/node-server@2.1.6': + resolution: {integrity: sha512-p/KH9MnfNcsm3sR6x4lNgm5j+QN4Et8srKredl9DZfXiyZ1UQ3aQ2YVpFLbqktYN5JI+DB+VZFKM2PqE5hLKjQ==} + engines: {node: '>=20'} + peerDependencies: + hono: ^4 || ^5.0.0-0 + + '@isaacs/nonrecursive-glob-match@1.0.3': + resolution: {integrity: sha512-SI7kyKHq4XXDRozw+r9GlRZkia1ZkFrpLW98r2IC2Bpr8YkFGE3fvjzmxCG0x78A++69HmDNrDvSMYBZmHGpKA==} + '@jitl/quickjs-ffi-types@0.32.0': resolution: {integrity: sha512-v9T+GQpmk43VDJ7d72sf0Nexhk+ArvtUihW27dy7lqAl0zBObFKtSBBIm5RBjwIhE8VwsPPm9PNuvPvNqLWUEg==} @@ -368,50 +377,50 @@ packages: '@nodable/entities@3.0.0': resolution: {integrity: sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==} - '@objectstack/account@18.2.0': - resolution: {integrity: sha512-g66m1pekLv6IPcPCjcSrOZ/etRQ0LHTS+eNGCz/RDmtpIQfGwStfoOTXI9si5hnZt+iD6rM6P75k3BDYbVKKSQ==} + '@objectstack/account@18.3.0': + resolution: {integrity: sha512-dwVJs8dTYbAJJi3FgG7itxyiNzHhRbqvt9uj2HBHdqo0kA4fFZ3uddQq38GPL6/xp3vmC7pH/uyddB9fcg1iNg==} engines: {node: '>=22.0.0'} - '@objectstack/cli@18.2.0': - resolution: {integrity: sha512-leaGtniIuEESJOPuFLcmtwZgYF+dyEQPdMyQTSZxjLPwB5GpxwFlR+PbC6gzuCOIVluRXJgZwQXAjmY1h8J/zw==} + '@objectstack/cli@18.3.0': + resolution: {integrity: sha512-Ew4iqbvkGI/9/mUrc0Ke4K0KTi1hSItPpG0R3WmWapBVL0YReYKXpWY5SmPXnrRB2I2BTtYE1N5H6PcVKibhZg==} engines: {node: '>=22.0.0'} hasBin: true peerDependencies: - '@objectstack/driver-turso': ^18.2.0 + '@objectstack/driver-turso': ^18.3.0 peerDependenciesMeta: '@objectstack/driver-turso': optional: true - '@objectstack/client@18.2.0': - resolution: {integrity: sha512-AUv95ekCQlO0Ztdars2pMlKxABO7pm00RugBhkk2oayD35EyjMEcFLUWSjurDKB7FXKccr8WfgaPwJiWm8aSLw==} + '@objectstack/client@18.3.0': + resolution: {integrity: sha512-0g52Ou+eOYqHndJeZfn1e7Qa2ARLBp4GwlpJimEoi+t360IAWVmvnqXQd0uBlI3+rTm05MUBI19kCFa2F+wDNQ==} engines: {node: '>=22.0.0'} - '@objectstack/cloud-connection@18.2.0': - resolution: {integrity: sha512-Mc0YDcxTpwSjj5UJCWB1nlQypaL8ubflv1sUZe6aiI4njWglo0XuyjEE/4hh8iEiwt9qb7RtF+vurBGVtfviFA==} + '@objectstack/cloud-connection@18.3.0': + resolution: {integrity: sha512-bFKTomkCLuhW30Eyhph06fMgLHfTLEBVv4vDlyanDXOni93fY0PoytPrvqXxMtDZ6M9qX+r9K+MyZn/fYy1X2A==} engines: {node: '>=22.0.0'} - '@objectstack/connector-imap@18.2.0': - resolution: {integrity: sha512-0igeqAKXTM+T/9Id3zKGzsoSM5wo+tfsK4RixIPNqCzlqj6T7b5czguFyJvaidBOzVjHPZtl+P1nDWpSTglnzw==} + '@objectstack/connector-imap@18.3.0': + resolution: {integrity: sha512-iNTLrXBOgdwgj580AJjRNBtQz8TyQ6wvEbE3KWY5UYG+ncFBjdW3yDxWRkD/g6iHT9Z3gAw5PEdcunlaflq9sw==} engines: {node: '>=22.0.0'} - '@objectstack/console@18.2.0': - resolution: {integrity: sha512-6966yBwyjc3qkUU23pqDYglCJal0OxeD0k4omMtJWZat/uzBESw+D8qz/lstlj1irDA1v59FWoA9bR2TIMYd1w==} + '@objectstack/console@18.3.0': + resolution: {integrity: sha512-Bdjc4DrW3hf2cLixGrnJQAYMWnpdgJR7Ba4aTjl4Jv5GIe98JiYd0kXLHk97TjWZPW7hhe39RCnqIF3RRD9VPw==} engines: {node: '>=22.0.0'} - '@objectstack/core@18.2.0': - resolution: {integrity: sha512-Xcji8R8rf3TsRdOW/kt3UXPJSGT9+btC8TA1jnfk029jd2eZKfBeR1lwWbySMtWYqWfGyhLTiukMBcz24RewJw==} + '@objectstack/core@18.3.0': + resolution: {integrity: sha512-Fi03+dEpM5+uHrmjkQhDNJHP2pePAWrARtI4myWmGsoYOc47xOAzGzX6qc+V9vT5QeFVykUIz/6TihWzNvU50Q==} engines: {node: '>=22.0.0'} - '@objectstack/driver-memory@18.2.0': - resolution: {integrity: sha512-XXIE0rXQkEYBpGZqBN787+UMj4aGfDd68L+ZT08MwZFkFfGxON0hf7Gc7S02XaER6rkdbC8zZssZVv60rBWaTA==} + '@objectstack/driver-memory@18.3.0': + resolution: {integrity: sha512-5K6KShBwPC3NveJul4JZP768h5sxyRBzGlAnMO6PB/uqZLbdP0zo6Jop+erelQrTRrzVHfC85XMJ/VarE9MVoA==} engines: {node: '>=22.0.0'} - '@objectstack/driver-mongodb@18.2.0': - resolution: {integrity: sha512-96H2AhgMPj968v7z1E7T2n14tbTOgSTSPZ/MdXgaYDzJ/lUeWFrspy30cq9Tx0guYCe9dJsXzEugDhIi0R68oQ==} + '@objectstack/driver-mongodb@18.3.0': + resolution: {integrity: sha512-kAi5U5FqgE4EE87UAdB/fZc6WbzvpI6h4WnbRZ3RrfTQESh5enZ5n31EaZzTLODtUL3CYLkhcuNzOGXL88m9kQ==} engines: {node: '>=22.0.0'} - '@objectstack/driver-sql@18.2.0': - resolution: {integrity: sha512-F4nszsZ0MsaaAi8WDE9Ei9RAM20e0w+dP3xXkZI+UbkxDMCv9DQS2HvEnbz6EYB3MPR8h9bGHy+L5hI31krwsg==} + '@objectstack/driver-sql@18.3.0': + resolution: {integrity: sha512-FPD2OcKMB7d2i25mh9lFP4B4+aSEhCA0KWLwZ+Z5tvsiik3/Rb0SNlV6Lso1HbWBZGRbSmA8cB8AiLVK2Ljhjw==} engines: {node: '>=22.0.0'} peerDependencies: mysql2: ^3.0.0 @@ -425,126 +434,126 @@ packages: tedious: optional: true - '@objectstack/driver-sqlite-wasm@18.2.0': - resolution: {integrity: sha512-tW8vEZBABh9lXESNdixnnNm32wkYZazdFBxO6+Y7que5eN8UaltMhmxTe89qqDqbZhp3PcucIshWA9PjIb7mQg==} + '@objectstack/driver-sqlite-wasm@18.3.0': + resolution: {integrity: sha512-EsSIP74fyFdU/vQb5fTIyCKFGEnd8XGKmcWGPgQScPXsCFCcC7B7AAyda1t6h+p5z3Q/RwJP13/tJix5T2hhUw==} engines: {node: '>=22.0.0'} - '@objectstack/formula@18.2.0': - resolution: {integrity: sha512-tTh90kLMUjzixWR6+O51yAqLcaLdSv2SMcr6HAAaVJTc4nQFPXMz7vkoOuEMn0b5j+ejZjtdmmq8tla96D8HXw==} + '@objectstack/formula@18.3.0': + resolution: {integrity: sha512-DyBj+DlqjYnOMNxtHffZSBfpDRb41cEfnq/byD+g3UUDM4GCeQHBGCa2ROS5rLDi0vrlVe5pddHcVANtP4NvLQ==} engines: {node: '>=22.0.0'} - '@objectstack/lint@18.2.0': - resolution: {integrity: sha512-tACJ91OSGnFaBfJQ99aJpcFLoXcvmGMBlSkMz5jYR27U9fWjOa3pw8hlDB3Yo0if8dV9OXc37XHOCu8KMOa4oQ==} + '@objectstack/lint@18.3.0': + resolution: {integrity: sha512-pML07D403ABjxagPW0d9SAsmmVKRzasWkctX0UGG9oN5ybaRegm6/reQuRbCF5POT/r5JpJ78ItEInfjaqYAKQ==} engines: {node: '>=22.0.0'} - '@objectstack/mcp@18.2.0': - resolution: {integrity: sha512-43g+4kK6ZPkXzySk9ebDLyrMPke/ahcgRUvlTU/7c1wn7LdpLZD7fnYwlSPQzEmBEmojjCB1/bAdkZLxLrRb1A==} + '@objectstack/mcp@18.3.0': + resolution: {integrity: sha512-K7cvLNlVoZ4OAnME50YnJy4P6Sl/LJkiiWA/kQuGLzxlkUBWpXFdBDfhbEXynvFwpMkBfrz6Z638R46/MTBLNA==} engines: {node: '>=22.0.0'} - '@objectstack/metadata-core@18.2.0': - resolution: {integrity: sha512-mhowMA31DMlv7ORYU+S5ZaGvzXETvKGI+Pw86cV6Wj2EU4+0YvvNUP2vA4EHGoh/Yx4xMWYj5NiCY0abgKdIwQ==} + '@objectstack/metadata-core@18.3.0': + resolution: {integrity: sha512-IcWsdZ360kZR3jatcK8OA0D7VTlGEZtj2KDMMlAUn/k3sx0DoxBCWVRPxzEKsRZ7tZ4/fqeoqGWpZYhrs6AWGA==} engines: {node: '>=22.0.0'} - '@objectstack/metadata-fs@18.2.0': - resolution: {integrity: sha512-1DEdVnbEmoS4UTY+wuK1nyUqps/Jlv2aKMeIIyx5QneJmg8FMjLgzgwEMA/y8eM3/EU1IWnjE2pPBE35fcwO7A==} + '@objectstack/metadata-fs@18.3.0': + resolution: {integrity: sha512-/teSIW1eA/YhRBe9hpnHLOZhPlSy/b1nE+1QUZuatI/SjZQSJSoYPi83Wu+oQ45yhk7VIXnFfDT5kodw1v9OBA==} engines: {node: '>=22.0.0'} - '@objectstack/metadata-protocol@18.2.0': - resolution: {integrity: sha512-cSqPyIkCHxTjRxvRlRxM/oOFwMbf9sI130JJTIKXvsiQeYHYLKFO5O3dT59QKjW4daIJnAPuqUytzpm8rzkocQ==} + '@objectstack/metadata-protocol@18.3.0': + resolution: {integrity: sha512-Fug+O+de4842MYhH7eroBZlLE40OoMvXXNAupqlps99GA9iuzU8Do+5ZiCl1vwanhfHZYd632/O/KoPMa3iERQ==} engines: {node: '>=22.0.0'} - '@objectstack/metadata@18.2.0': - resolution: {integrity: sha512-c7uJkJVjWJFRmKITTZ4h8pLkzQe6x3puyncbQR1qMTfCT+u/Lo+3yqBD9aMhqQYCtzzwYWladBdYFahMLGHOVQ==} + '@objectstack/metadata@18.3.0': + resolution: {integrity: sha512-pepkdkaId6jDFwcs0y/Fd0uXcPc0+mJRzjwAkhvgjmAviXGaJ8pPXBaO+LGn7egLqTjT9w8zgbKVjrAAqUUPvA==} engines: {node: '>=22.0.0'} - '@objectstack/objectql@18.2.0': - resolution: {integrity: sha512-duImdEsV2m1OPWommsxJcMBxeIPG9TNPbbIHwy9cdIM1cIsb/i8HXVatkmLysu0qrshdtPqz0Cxc/+hsqfaZNQ==} + '@objectstack/objectql@18.3.0': + resolution: {integrity: sha512-sPthcFW5/Hk60dzo7SaS8AkB2c1VusxvofMz88bA0wG0kT55trffVcfOpofdo+zdG3HlrY/sIh0GpNQEjdqVXw==} engines: {node: '>=22.0.0'} - '@objectstack/observability@18.2.0': - resolution: {integrity: sha512-54jUS+gdx8Otuz1hbCgYvqYne00L9qw/7JtPFBCZVZfd/sFxNYDiaohUZEDkgd0OslKAE2bE1TjQcFHn0TvhnA==} + '@objectstack/observability@18.3.0': + resolution: {integrity: sha512-8KvQGECHfX0S5KwD1KqyI8J3PqnRM90wyP28jMt7furWUSyvFNWMNmG5YsOMOhn1qiGcPXPiN/iCXPO2DlpDSA==} engines: {node: '>=22.0.0'} - '@objectstack/platform-objects@18.2.0': - resolution: {integrity: sha512-1d/mxZxTzpqFmWS5yuwGKQZQ4sMmOEy+XVK6c2a4h9Mqrnh7ux0lDhj50Yh56TZguIcJGBdjJoiYnhY31ucZEg==} + '@objectstack/platform-objects@18.3.0': + resolution: {integrity: sha512-CA4c4yz9H+4KlkKLq+BtShznGa1e45guOvZpfTz1JXFhn5kNcf9rrGPRpn0gGw1y4+X/uDUZv3gdSnAcTXi7TQ==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-approvals@18.2.0': - resolution: {integrity: sha512-TDjZBYfk3qKjLD5QFsPZqSrHwOXbbYSjMQroVZ81CU+KC8Ujdsh0HO0DqvF2H0ePARKLgCBMynfLimDFS9wf6w==} + '@objectstack/plugin-approvals@18.3.0': + resolution: {integrity: sha512-dKe20+rmA8Q0XziTuNIcmilb6rCbT8439K6oJrOaeiZLWyr/G8uFe+OabrkdbbT7AyJOiVT3xpyrtMqrrR0YHg==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-audit@18.2.0': - resolution: {integrity: sha512-r6Hbs5l3ZNGs50bsxAj0DfgfRGDXSE0vEYoyJDZOaZp/rSxep7+8chCeEQYrhHV7s6H1bTO5S5lrsIG9qIWdwQ==} + '@objectstack/plugin-audit@18.3.0': + resolution: {integrity: sha512-ZMWRyAe4TZ6sLV607yT1pO09Ssmd5y3lcm9FHjb0wzo+QGUD6cM27tsGPvrNSTs/2FrFsNBQ7Gdu/Hbcw+C/GQ==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-auth@18.2.0': - resolution: {integrity: sha512-xEQVZhlgsTRpxrE2ClCoMfRZ32LugXylizOI3qicSAzNxU+DGaSALsoePWQjGKk+c2YVPjhHTQ9mTA5Joes4Hw==} + '@objectstack/plugin-auth@18.3.0': + resolution: {integrity: sha512-co5k4Ec316/LxWfyXFdx8yMz8VxXBE/ty7shECH+i0uT4RpGJMqTUh8ezZb1op55/NsYmJ9DAvV+k+HnGs685g==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-email@18.2.0': - resolution: {integrity: sha512-Z6ckePY6f+0j3LSJMSw0kF0ImHkN/4/ZbvVN5YisPev2qen+KdBrSZs3JyO3vAPHDgfxHx50oGmIL9dV4hXL+g==} + '@objectstack/plugin-email@18.3.0': + resolution: {integrity: sha512-i/+ptaThvlKZGjD4UsdwEURQ0jVA1SqlnLFzue3bvdzimrdl0FM385lce+QQOpbBZsKumj40QJ/9Cyzgg7SbVg==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-hono-server@18.2.0': - resolution: {integrity: sha512-FOzoX6ZRBxhjIRJBavxKUaToEz8WlTkDGuiwYvLsYKkIjv3hsTPp7PbfCKeuFubyVejyxN0oMtN0Q2lpIKfgvA==} + '@objectstack/plugin-hono-server@18.3.0': + resolution: {integrity: sha512-XNLD6h9Xz5V7gfaQOLuRB1suO26piHkvh68cVHFJbi7mnWqySeWoPpu0leB7khkylPMuABDN2F2VHJEK5FWhvw==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-pinyin-search@18.2.0': - resolution: {integrity: sha512-Tqu1bjF0Pev2QmibOtzfw0eWiX8AnC3TxAaQb1TwI5atwA5sa5tnO2oSygMLtPwxeud/+SD6y/Z+UeABi7jnlA==} + '@objectstack/plugin-pinyin-search@18.3.0': + resolution: {integrity: sha512-EcT53qg0ppP4K550gMnSVggjp0NJJrOoY9I3xoqGg7hkR9jEFYytR1ieJNbEP32yOjzPy9tjrBXoGSnA4pJzzQ==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-security@18.2.0': - resolution: {integrity: sha512-sJBxt1M090zNKNrYSBoL+HPa7zXjx26D+ILt2DYN6F6ekXMsTN39/ELdz50H9L/FMx/HQSmy3QS9uijoGeaQAw==} + '@objectstack/plugin-security@18.3.0': + resolution: {integrity: sha512-3zZ9RHAIPDnt4d3HPiCxhgGCTPJu8tAMG4/c/Oe/8hVo7UFzDSOyp7ZFOphQCBYD54/6jSwb3+Ibhpe3qXsVwQ==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-sharing@18.2.0': - resolution: {integrity: sha512-72QaQE+FtND3/0WXOv2vTNdH2KaZfUzXo5s68wDAOh7kaTH3z61w5q9SZod5vmYpuOA/aeTUM1r9gWe5fGQ88g==} + '@objectstack/plugin-sharing@18.3.0': + resolution: {integrity: sha512-V662bOBJm0UabcZU4XO8AWrOzESu9f2gEtEQSahKrZ9f1lZzQH9tIRwQOLFrvIaqxTPUCNLfHWYWRk/yvf/7jg==} engines: {node: '>=22.0.0'} - '@objectstack/plugin-webhooks@18.2.0': - resolution: {integrity: sha512-Gaw2Gr8XWaj96pMpxu1+58OHB0ABFMcf2PMiStcxEtoxsMVEgOJSEUOnT6GFgOz0OC9UX6GAeN6v8i27fuu/og==} + '@objectstack/plugin-webhooks@18.3.0': + resolution: {integrity: sha512-7FU1UctZJgW3Q3YtcEpwjYllp28/N41fuIXSzigb0sSfUQlDBKVrhWVM1CRdJ75h1mOVqG6JHFn/HcNpfncw3Q==} engines: {node: '>=22.0.0'} - '@objectstack/rest@18.2.0': - resolution: {integrity: sha512-ugNYcCuL54Y31ulrJsSf+Tm46fpS85WT22VkiaUB8Fln7o6KAtvdp/yYJEQD+RcLUpfFW1au+am8+JbJSJ2PFw==} + '@objectstack/rest@18.3.0': + resolution: {integrity: sha512-G2iioVPReic1OWtJWjdnLuxxrc1f03QiPkkS2VLNBIfjsmRo/o+jMRWysyfARg5a5akwVsL/LOKpfaf4SJ1HdQ==} engines: {node: '>=22.0.0'} - '@objectstack/runtime@18.2.0': - resolution: {integrity: sha512-rL1apkBGBHZzqvx8QIqsuaLO45XRAqjIHBm2Pt1O7/i3aZxCUpqadTgMg91mlT7J3aZq5ENjWT6rrA9gK10omQ==} + '@objectstack/runtime@18.3.0': + resolution: {integrity: sha512-qln6H+dPedT39E7fVmYf6GCcdL9ZRmzqLbjijRB/mED90qtiqW3PDdTjgw85LLU3KV3P7cVLnxqbEkE7pgLwDQ==} engines: {node: '>=22.0.0'} peerDependencies: - '@objectstack/driver-turso': ^18.2.0 + '@objectstack/driver-turso': ^18.3.0 peerDependenciesMeta: '@objectstack/driver-turso': optional: true - '@objectstack/sdui-parser@18.2.0': - resolution: {integrity: sha512-nbGXvO+pna3Qtu2QyHjGMs01es8fdbvQNQopv+njv43zawhyLgO66qkWoQyv80KmUIYb8WrPCqNx5XEg/+AexA==} + '@objectstack/sdui-parser@18.3.0': + resolution: {integrity: sha512-KM/RSCB3hXjzo0fMOuu3np+YpArPijUqOweEg37yH44qaR2kmpJDMCu42+L7NwpqgPKH0a2ApPD650ooXtKzmw==} engines: {node: '>=22.0.0'} - '@objectstack/service-analytics@18.2.0': - resolution: {integrity: sha512-wQYt+5ZreqqLlgoZqPXO/CpFUFDzUxN5tYdl3dzgWnBvn4SxRx1bi4Xqr5LB/bbsiMX+yzm8zZRP5FdJNxAWww==} + '@objectstack/service-analytics@18.3.0': + resolution: {integrity: sha512-daxhMcO9oCIorDxVdCFBycwgNSRtNWNDshbsnZ3KYnI2sA1YNT4w4mnJfsq5RWO7qR0aHNaLOfA1tyEkrtdCpg==} engines: {node: '>=22.0.0'} - '@objectstack/service-automation@18.2.0': - resolution: {integrity: sha512-WSRZ7eCfdaO/uuEW3LPOuB10yxJwzguI2NuB8PCDARNiTWMEZFgbCpcDcZE75gQ+5YBXwtLV2o/Bj5QAORFQVQ==} + '@objectstack/service-automation@18.3.0': + resolution: {integrity: sha512-5DkB28yfdmt5jTj5ViZFcy3MYiyRYPHKEEBC392paETu0WzRF8RlQPqsshmScsaZYTKxt6NVyTYE2Tig2nGClw==} engines: {node: '>=22.0.0'} - '@objectstack/service-cache@18.2.0': - resolution: {integrity: sha512-vjLcsYKzS3Cdd7PwCnUkV4dl/rMhh2lIjMVz6dqnNFFgEmFVTfY8nj3qPz1YcgUe7tLUX9hukCiaVfColPWleA==} + '@objectstack/service-cache@18.3.0': + resolution: {integrity: sha512-bpk8RyMIhx5nGsjLzgIHjPI5FbKoujaDpprh5sMs9p6XuBRf1zK0gj8wb+e8kJNxXBw+814F3mnWLvBPdwJO6Q==} engines: {node: '>=22.0.0'} - '@objectstack/service-cluster@18.2.0': - resolution: {integrity: sha512-ynvhihdNZdE3gUEebfQ96vJUFjiOGrG9W4xIu6kep4IyGxC+P0lPUelKaLYzz9TKYm0GV4aD6TTW2P0zxbP0SA==} + '@objectstack/service-cluster@18.3.0': + resolution: {integrity: sha512-9lXWpMwONZsueq2dfTukV2pFJbvoCfmAmz2/PsmKiNntq1vsBcrrPYZNsW/w8JYZHxdygLzT6awQ9j+DOAY7WA==} engines: {node: '>=22.0.0'} - '@objectstack/service-datasource@18.2.0': - resolution: {integrity: sha512-3RqdV40YYxUrm6cfMt/IeMcgwK6pm+FqL5vrirtDdU7Utp01Bc49u/8yJm3kJ/JgwG1A0Dh2Jg/29izju0KIyQ==} + '@objectstack/service-datasource@18.3.0': + resolution: {integrity: sha512-nZ3AsvBUQ+gkCll390l2kfpSkBh4lfCS2Q7p3tTPQah5igrLiyQlaGFghV1rNj400FzNz9jrjohZzlaSxlub1g==} engines: {node: '>=22.0.0'} peerDependencies: - '@objectstack/driver-mongodb': 18.2.0 - '@objectstack/driver-sqlite-wasm': 18.2.0 - '@objectstack/driver-turso': ^18.2.0 + '@objectstack/driver-mongodb': 18.3.0 + '@objectstack/driver-sqlite-wasm': 18.3.0 + '@objectstack/driver-turso': ^18.3.0 peerDependenciesMeta: '@objectstack/driver-mongodb': optional: true @@ -553,44 +562,44 @@ packages: '@objectstack/driver-turso': optional: true - '@objectstack/service-i18n@18.2.0': - resolution: {integrity: sha512-Xh6RGdKG0EDrECJpCMPTSiZk481pRJ2Z/iTtHiS/wvB72XnJLw95MHXNteR6dA7wjmx88N+b2x0gCVByqhQR5w==} + '@objectstack/service-i18n@18.3.0': + resolution: {integrity: sha512-v2MTWZlxYplW/JCxzT7gtZJUBWr6DhWFloIXyDSbbnfT+ABTsWP4+S5AnPawjZnzCOm4bxkEyXgBeFdEasOKVQ==} engines: {node: '>=22.0.0'} - '@objectstack/service-job@18.2.0': - resolution: {integrity: sha512-8cqTIkFBvLvUs99ly6d/dHAGGlGQVjtyDSQPzUuejHAXtg4l7nLRteAF6Qg//o/sU021KzhZ/PGM4Hw8Z83Lww==} + '@objectstack/service-job@18.3.0': + resolution: {integrity: sha512-arHAzYeuTuEPg3YTBUDGvE1fOha/qPWl57D5wfofp92N31MX6CKIYn4G/tJHqXD2pNfZamgDXi8HBLZYQl2zdA==} engines: {node: '>=22.0.0'} - '@objectstack/service-mailbox@18.2.0': - resolution: {integrity: sha512-Fc89OBTWrzqAVL4n/gZ9HSZnDYgGfpTJQL844HEhyOjTzQrHGNtrvW02VXmMQv/1uUxS3tFuhokAJ03KdzQEgQ==} + '@objectstack/service-mailbox@18.3.0': + resolution: {integrity: sha512-f6MiW1ZQ8FBA4VS2P6FljPRV8UIpCr0UzSBqR4HKtcnC+wkM8g32Igz0VjFIoubx3i/xByadOFgkdgylgQ/EHg==} engines: {node: '>=22.0.0'} - '@objectstack/service-messaging@18.2.0': - resolution: {integrity: sha512-CJOdLEXa7U3cZfPXiqQf/gVXjAbZhgrrSWW9G8fvYmUIxbVJrr3cMpqJuNQvgyCohvxXbXLwzg18HX/CBrfvvw==} + '@objectstack/service-messaging@18.3.0': + resolution: {integrity: sha512-dQsIE00iPG9sOOlEgOMiEq0Wk1LS/Vdk3eGQqeryQqvINXjfWmjoRmCRoam3I55VpIcdtPRvSanfFfg1U7gHJA==} engines: {node: '>=22.0.0'} - '@objectstack/service-package@18.2.0': - resolution: {integrity: sha512-NjTynxhUy/jy78Ak6NIemDDvnWG2gEREci1qKLg4LJRYoAdoHeGGtPZw41/VxuQREh1evNxnaoBlVU45vIXIUw==} + '@objectstack/service-package@18.3.0': + resolution: {integrity: sha512-rqfC7uoYuDGauDjLQxWAXpIReOzrGLR1ui1ai7S5r8SAxwQx+rLSZCkoFbpfz49Qh6Q5qk/0L0xjdG3U9utkRA==} engines: {node: '>=22.0.0'} - '@objectstack/service-queue@18.2.0': - resolution: {integrity: sha512-eO1GyWoI4FHR4JAAJsRyuDN9SJSG86kWtWA/C1/whniJIazluJqMxnMm2ynAkch5QMf2GPS+iyfJD5TTyn/mmQ==} + '@objectstack/service-queue@18.3.0': + resolution: {integrity: sha512-2HGMOGh3bheyipachiJP7aSIqNr6FsVxt7cl25Sk5Wx0tDNiBGsIBi3VR35qSHPhqR6zgsYX5rDW4DC4IiVOdg==} engines: {node: '>=22.0.0'} - '@objectstack/service-realtime@18.2.0': - resolution: {integrity: sha512-KT+lmu0qYCMI+UfV0S75WqdQyp8f8iCBHQ/7v5PfqbgezcMP+MicgRa+qXAeenjFRe/uzslbXpLj0N+RVDrF1g==} + '@objectstack/service-realtime@18.3.0': + resolution: {integrity: sha512-iigEo3MapVtiIGYIfJpYmf9V392UGy32yXaqMT5ADJK8kopRjKcwdYmRGaFnEStrRYEcDIel8UrpNJtx2XCN3Q==} engines: {node: '>=22.0.0'} - '@objectstack/service-settings@18.2.0': - resolution: {integrity: sha512-oUPh8Vyn/bWWhP3Scz00tebBYT1N6r7PNLIB+5qUulDLF5y9TYNvplfiI20IONUM1zqJS8i7Iwa5aUwmZe6ZUQ==} + '@objectstack/service-settings@18.3.0': + resolution: {integrity: sha512-RfbC34a5fKuJzQ6Ad7hNmQV1lVkvJNdLYA/BiCA3hVYptF9Q/s6lmGseOhisG8ZO1nOTNB4+Yno/iOWhUqIOgQ==} engines: {node: '>=22.0.0'} - '@objectstack/service-sms@18.2.0': - resolution: {integrity: sha512-KzaJSFcc2qFmG97CeOc4506ApAIEUFtqllfRmUL+GUKJzoAwLfjog8hcZ9m8ySesMn9wY9YkgBEpr93g8hyYyA==} + '@objectstack/service-sms@18.3.0': + resolution: {integrity: sha512-XIRO5dzDQnvS/fb+PlGmcz2UMJtOy9VMMIDQ7tcdtnU0Dxw4YTNNrlTpKGMP4pIZxKLZ7vN13QfB7DI1fqqjiw==} engines: {node: '>=22.0.0'} - '@objectstack/service-storage@18.2.0': - resolution: {integrity: sha512-3ZLq5hqU7Uc0LDU02nllt4jyrSu0D7DozerYCUGffrs2XWq9MXo8GheNob99P3V+HtM4WUdqfJyYwosximo4Jw==} + '@objectstack/service-storage@18.3.0': + resolution: {integrity: sha512-alvlxmvALHcaHDaRDrISawRZn9jZgxkgR+brLJZlLTxhENlkhkIFmp5RcizkF6lkT2vYs//GB/nUq9hu5wyXJg==} engines: {node: '>=22.0.0'} peerDependencies: '@aws-sdk/client-s3': ^3.0.0 @@ -601,12 +610,12 @@ packages: '@aws-sdk/s3-request-presigner': optional: true - '@objectstack/setup@18.2.0': - resolution: {integrity: sha512-/jNdvmLOChP5fKeBSaUB3FV7tDRfPCwS6xRNdiyLCEWLS0yuYnEe19ArHdnPQMbklve/mm6hv5ZuONtucxsJkA==} + '@objectstack/setup@18.3.0': + resolution: {integrity: sha512-d2Q/pz6NOmuFyn3vgAT5x5wm53IBFOjKJRLQXTZ2eDUd6QWosSsM8hfjlfs12QAOMYsspZ8nRA3Hi6O8vzUfXQ==} engines: {node: '>=22.0.0'} - '@objectstack/spec@18.2.0': - resolution: {integrity: sha512-bPI/23NB08gCnyQRn042vLyk2tZFxv9uy1pgRGPlrbEdUEe/WyTYPH4ZXu3qzZKaG4U3U2GWQsWF5/pe2642Gg==} + '@objectstack/spec@18.3.0': + resolution: {integrity: sha512-8gKxvolZBHgFhcAuWiTMDO43FjrGx9YjqEBaRE91TOKNJShc9etbH795GDaER3zL7XxZRgDn3vwXy00kvaw8ig==} engines: {node: '>=22.0.0'} peerDependencies: ai: ^7.0.0 @@ -614,24 +623,24 @@ packages: ai: optional: true - '@objectstack/trigger-api@18.2.0': - resolution: {integrity: sha512-WCxRZrGYksSVIWawZUDw8LEFmwoCkPHUEj2J4nfmTMsizKR5UovaSOUVEamfYJusJfbWTsm7tr8A/LmXabBRVw==} + '@objectstack/trigger-api@18.3.0': + resolution: {integrity: sha512-brdNTTH0mzajinhm2cN36MqfDMjcO2AHigfYe3DasekTma6mps86R78WY3NTstVSnrjm99EOrE92PPiVObPZJA==} engines: {node: '>=22.0.0'} - '@objectstack/trigger-record-change@18.2.0': - resolution: {integrity: sha512-ixy51NFyMV36EbEFGCcY3YUPMlEkUkNgq0h3sljF+//DGpxe2g1C0NgWfdZ8mH9FXU/GmmH27NgkQ/EocgWtGw==} + '@objectstack/trigger-record-change@18.3.0': + resolution: {integrity: sha512-qMR/zoLxiwPENiCYo+Ab//+T6r4aBHVwOZNarEfS2mCPK/eumUf2UL3VAgjCc7K6LDUSOaPhdgPHKsEsRLgZ2Q==} engines: {node: '>=22.0.0'} - '@objectstack/trigger-schedule@18.2.0': - resolution: {integrity: sha512-xyBichJF8oE1UK+48YAbfmi3B0OZSFfqo3jUY8Kmgf1QeepijMhMdC00H1tKWBM/QeDYFyIqS5RQyYp418PJFw==} + '@objectstack/trigger-schedule@18.3.0': + resolution: {integrity: sha512-3SKT3aQ1/YCf6aPilSAnj+0T1t1nOupsgyO6PmkvU0o7hMpEsuIY1LJytkvKdkdNcqHxSbmSbt7UPVcukBBw8w==} engines: {node: '>=22.0.0'} - '@objectstack/types@18.2.0': - resolution: {integrity: sha512-3kHAHOQTn2XDqtz/6BCXYUjfNgRPA4CoY8jmyA29r8UPl/cx3h8FewOkDVcRJGdxp0taCHXTW4VhZYH/RAKSLA==} + '@objectstack/types@18.3.0': + resolution: {integrity: sha512-U69HnEgh9u81bXhz7XZJvgEc/NceY4CRPmWDT2ZBQTetHZsnDQb71Tr2srPV+PAjgW2oKEdD2jN5GyxzxHTVww==} engines: {node: '>=22.0.0'} - '@objectstack/verify@18.2.0': - resolution: {integrity: sha512-A+A/JkAI7QXSc/75otGkCv/K82E0rVTDwruGi8Cr4wEz//b6YsIbCrcwWzAO9tUWjOmG2XL717aIuH/P4mUyIA==} + '@objectstack/verify@18.3.0': + resolution: {integrity: sha512-0FLmG5uV2QJPQ+6RqiRC8upClByWNI0Q8cn73LcxA9wJsID3IEjlLQiIOBqLSx7gYUdEoJKR1hWULL8BruP8OA==} engines: {node: '>=22.0.0'} '@oclif/core@5.1.6': @@ -641,9 +650,6 @@ packages: '@standard-schema/spec@1.1.0': resolution: {integrity: sha512-l2aFy5jALhniG5HgqrD6jXLi/rUWrKvqN/qJx6yoJsgKhblVd+iqqU4RCXavm/jPityDo5TCvKMnpjKnOriy0w==} - '@ts-morph/common@0.29.0': - resolution: {integrity: sha512-35oUmphHbJvQ/+UTwFNme/t2p3FoKiGJ5auTjjpNTop2dyREspirjMy82PLSC1pnDJ8ah1GU98hwpVt64YXQsg==} - '@types/node@14.18.63': resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} @@ -827,6 +833,10 @@ packages: brace-expansion@2.1.4: resolution: {integrity: sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==} + brace-expansion@5.0.12: + resolution: {integrity: sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==} + engines: {node: 20 || >=22} + brace-expansion@5.0.9: resolution: {integrity: sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==} engines: {node: 20 || >=22} @@ -886,9 +896,6 @@ packages: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} - code-block-writer@13.0.3: - resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -954,8 +961,8 @@ packages: resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} engines: {node: '>= 10'} - create-objectstack@18.2.0: - resolution: {integrity: sha512-iP2zYqKcDZkmzQySkw+OEWirMyB8h6tQ8j3QdbULMx/u+B0MOqCbPQBNCH0rKf+jepbw0QXFk7+tsdsV3pFdoA==} + create-objectstack@18.3.0: + resolution: {integrity: sha512-fhfEvZemX5dK1zyqRcXbKidcoTIdzXdEG8xlWGicmSCsnTD4h4pxv8nqhoQp+nKUoiELBzr5ZMndtGj3MH9upA==} engines: {node: '>=22.0.0'} hasBin: true @@ -1158,8 +1165,8 @@ packages: getopts@2.3.0: resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} - glob@13.0.6: - resolution: {integrity: sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==} + glob@14.0.3: + resolution: {integrity: sha512-A1vjIwC3qpdCso45Iw127gnp7sPhqgY8lUQhDrArIs+GbmfaaVPFuoyy7WyLT9EPZCRZ7j7aLdwUhQmHWesEow==} engines: {node: 18 || 20 || >=22} glob@7.2.3: @@ -1412,6 +1419,10 @@ packages: resolution: {integrity: sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A==} engines: {node: 18 || 20 || >=22} + minimatch@11.0.4: + resolution: {integrity: sha512-/UJ1dEoVQTjPNDh6SGlUo+ueLMmoHTas4q+8yaAR/5t6nLAIiBDJtoYUh20IYleix7ehiQkgczb84PE3uzHkxg==} + engines: {node: 20 || >=22} + minimatch@3.1.5: resolution: {integrity: sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==} @@ -1520,9 +1531,6 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-expression-matcher@1.6.2: resolution: {integrity: sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==} engines: {node: '>=14.0.0'} @@ -1538,8 +1546,8 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@2.0.2: - resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} + path-scurry@3.0.0: + resolution: {integrity: sha512-1pTbQqH1wIwMi/eleQ5leFTTCkzFsPcgXNjwOA8YGGW/W4/kHT3dssE7Z6NH+zuqNLOzOB0uaD61yl7cAcVhgg==} engines: {node: 18 || 20 || >=22} path-to-regexp@8.4.2: @@ -1797,9 +1805,6 @@ packages: ts-interface-checker@0.1.13: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-morph@28.0.0: - resolution: {integrity: sha512-Wp3tnZ2bzwxyTZMtgWVzXDfm7lB1Drz+y9DmmYH/L702PQhPyVrp3pkou3yIz4qjS14GY9kcpmLiOOMvl8oG1g==} - tsx@4.23.15: resolution: {integrity: sha512-Yiex1Ovn8z2xPpOWckIiysV1SSyRMY9BkLF++q0yKiDxCqRhosKfMg3janKkiLBwZ5c/YryloKwGZcrEmtwxKw==} engines: {node: '>=18.0.0'} @@ -1833,6 +1838,10 @@ packages: deprecated: uuid@10 and below is no longer supported. For ESM codebases, update to uuid@latest. For CommonJS codebases, use uuid@11 (but be aware this version will likely be deprecated in 2028). hasBin: true + validate-npm-package-name@7.0.2: + resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} + engines: {node: ^20.17.0 || >=22.9.0} + vary@1.1.2: resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} engines: {node: '>= 0.8'} @@ -2108,6 +2117,12 @@ snapshots: dependencies: hono: 4.13.13 + '@hono/node-server@2.1.6(hono@4.13.13)': + dependencies: + hono: 4.13.13 + + '@isaacs/nonrecursive-glob-match@1.0.3': {} + '@jitl/quickjs-ffi-types@0.32.0': {} '@jitl/quickjs-wasmfile-debug-asyncify@0.32.0': @@ -2174,73 +2189,73 @@ snapshots: '@nodable/entities@3.0.0': {} - '@objectstack/account@18.2.0': + '@objectstack/account@18.3.0': dependencies: - '@objectstack/platform-objects': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/cli@18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3)': - dependencies: - '@objectstack/account': 18.2.0 - '@objectstack/client': 18.2.0 - '@objectstack/cloud-connection': 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) - '@objectstack/console': 18.2.0 - '@objectstack/core': 18.2.0 - '@objectstack/driver-memory': 18.2.0 - '@objectstack/driver-mongodb': 18.2.0 - '@objectstack/driver-sql': 18.2.0 - '@objectstack/driver-sqlite-wasm': 18.2.0(better-sqlite3@13.0.3) - '@objectstack/formula': 18.2.0 - '@objectstack/lint': 18.2.0 - '@objectstack/mcp': 18.2.0 - '@objectstack/metadata': 18.2.0 - '@objectstack/metadata-core': 18.2.0 - '@objectstack/metadata-protocol': 18.2.0 - '@objectstack/objectql': 18.2.0 - '@objectstack/observability': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/plugin-approvals': 18.2.0 - '@objectstack/plugin-audit': 18.2.0 - '@objectstack/plugin-auth': 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) - '@objectstack/plugin-email': 18.2.0 - '@objectstack/plugin-hono-server': 18.2.0 - '@objectstack/plugin-pinyin-search': 18.2.0 - '@objectstack/plugin-security': 18.2.0 - '@objectstack/plugin-sharing': 18.2.0 - '@objectstack/plugin-webhooks': 18.2.0 - '@objectstack/rest': 18.2.0 - '@objectstack/runtime': 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) - '@objectstack/service-analytics': 18.2.0 - '@objectstack/service-automation': 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) - '@objectstack/service-cache': 18.2.0 - '@objectstack/service-datasource': 18.2.0(@objectstack/driver-mongodb@18.2.0)(@objectstack/driver-sqlite-wasm@18.2.0) - '@objectstack/service-job': 18.2.0 - '@objectstack/service-mailbox': 18.2.0 - '@objectstack/service-messaging': 18.2.0 - '@objectstack/service-package': 18.2.0 - '@objectstack/service-queue': 18.2.0 - '@objectstack/service-realtime': 18.2.0 - '@objectstack/service-settings': 18.2.0 - '@objectstack/service-sms': 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) - '@objectstack/service-storage': 18.2.0 - '@objectstack/setup': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/trigger-api': 18.2.0 - '@objectstack/trigger-record-change': 18.2.0 - '@objectstack/trigger-schedule': 18.2.0 - '@objectstack/types': 18.2.0 - '@objectstack/verify': 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(@objectstack/driver-mongodb@18.2.0)(@objectstack/driver-sqlite-wasm@18.2.0)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + '@objectstack/cli@18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3)': + dependencies: + '@objectstack/account': 18.3.0 + '@objectstack/client': 18.3.0 + '@objectstack/cloud-connection': 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + '@objectstack/console': 18.3.0 + '@objectstack/core': 18.3.0 + '@objectstack/driver-memory': 18.3.0 + '@objectstack/driver-mongodb': 18.3.0 + '@objectstack/driver-sql': 18.3.0 + '@objectstack/driver-sqlite-wasm': 18.3.0(better-sqlite3@13.0.3) + '@objectstack/formula': 18.3.0 + '@objectstack/lint': 18.3.0 + '@objectstack/mcp': 18.3.0 + '@objectstack/metadata': 18.3.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/metadata-protocol': 18.3.0 + '@objectstack/objectql': 18.3.0 + '@objectstack/observability': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/plugin-approvals': 18.3.0 + '@objectstack/plugin-audit': 18.3.0 + '@objectstack/plugin-auth': 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + '@objectstack/plugin-email': 18.3.0 + '@objectstack/plugin-hono-server': 18.3.0 + '@objectstack/plugin-pinyin-search': 18.3.0 + '@objectstack/plugin-security': 18.3.0 + '@objectstack/plugin-sharing': 18.3.0 + '@objectstack/plugin-webhooks': 18.3.0 + '@objectstack/rest': 18.3.0 + '@objectstack/runtime': 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + '@objectstack/service-analytics': 18.3.0 + '@objectstack/service-automation': 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + '@objectstack/service-cache': 18.3.0 + '@objectstack/service-datasource': 18.3.0(@objectstack/driver-mongodb@18.3.0)(@objectstack/driver-sqlite-wasm@18.3.0) + '@objectstack/service-job': 18.3.0 + '@objectstack/service-mailbox': 18.3.0 + '@objectstack/service-messaging': 18.3.0 + '@objectstack/service-package': 18.3.0 + '@objectstack/service-queue': 18.3.0 + '@objectstack/service-realtime': 18.3.0 + '@objectstack/service-settings': 18.3.0 + '@objectstack/service-sms': 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + '@objectstack/service-storage': 18.3.0 + '@objectstack/setup': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/trigger-api': 18.3.0 + '@objectstack/trigger-record-change': 18.3.0 + '@objectstack/trigger-schedule': 18.3.0 + '@objectstack/types': 18.3.0 + '@objectstack/verify': 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(@objectstack/driver-mongodb@18.3.0)(@objectstack/driver-sqlite-wasm@18.3.0)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) '@oclif/core': 5.1.6 bundle-require: 5.1.0(esbuild@0.28.2) chalk: 6.0.1 chokidar: 5.0.0 - create-objectstack: 18.2.0 + create-objectstack: 18.3.0 dotenv-flow: 4.1.0 esbuild: 0.28.2 - ts-morph: 28.0.0 tsx: 4.23.15 + typescript: 6.0.3 yaml: 2.9.1 zod: 4.6.7 optionalDependencies: @@ -2289,22 +2304,23 @@ snapshots: - vitest - vue - '@objectstack/client@18.2.0': + '@objectstack/client@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/cloud-connection@18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3)': + '@objectstack/cloud-connection@18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3)': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/metadata-core': 18.2.0 - '@objectstack/metadata-protocol': 18.2.0 - '@objectstack/objectql': 18.2.0 - '@objectstack/runtime': 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/metadata-protocol': 18.3.0 + '@objectstack/objectql': 18.3.0 + '@objectstack/observability': 18.3.0 + '@objectstack/runtime': 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@better-auth/utils' @@ -2348,32 +2364,32 @@ snapshots: - vitest - vue - '@objectstack/connector-imap@18.2.0': {} + '@objectstack/connector-imap@18.3.0': {} - '@objectstack/console@18.2.0': {} + '@objectstack/console@18.3.0': {} - '@objectstack/core@18.2.0': + '@objectstack/core@18.3.0': dependencies: - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 zod: 4.6.7 transitivePeerDependencies: - ai - '@objectstack/driver-memory@18.2.0': + '@objectstack/driver-memory@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 mingo: 7.2.4 transitivePeerDependencies: - ai - '@objectstack/driver-mongodb@18.2.0': + '@objectstack/driver-mongodb@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 mongodb: 7.6.0 nanoid: 6.0.1 transitivePeerDependencies: @@ -2386,12 +2402,12 @@ snapshots: - snappy - socks - '@objectstack/driver-sql@18.2.0': + '@objectstack/driver-sql@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/observability': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/observability': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 knex: 3.3.0(better-sqlite3@13.0.3) nanoid: 6.0.1 optionalDependencies: @@ -2405,11 +2421,11 @@ snapshots: - sqlite3 - supports-color - '@objectstack/driver-sqlite-wasm@18.2.0(better-sqlite3@13.0.3)': + '@objectstack/driver-sqlite-wasm@18.3.0(better-sqlite3@13.0.3)': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/driver-sql': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/driver-sql': 18.3.0 + '@objectstack/spec': 18.3.0 knex: 3.3.0(better-sqlite3@13.0.3) nanoid: 6.0.1 sql.js: 1.14.2 @@ -2426,18 +2442,18 @@ snapshots: - supports-color - tedious - '@objectstack/formula@18.2.0': + '@objectstack/formula@18.3.0': dependencies: '@marcbachmann/cel-js': 8.0.0 - '@objectstack/spec': 18.2.0 + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/lint@18.2.0': + '@objectstack/lint@18.3.0': dependencies: - '@objectstack/formula': 18.2.0 - '@objectstack/sdui-parser': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/formula': 18.3.0 + '@objectstack/sdui-parser': 18.3.0 + '@objectstack/spec': 18.3.0 ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) sucrase: 3.35.1 @@ -2445,124 +2461,124 @@ snapshots: transitivePeerDependencies: - ai - '@objectstack/mcp@18.2.0': + '@objectstack/mcp@18.3.0': dependencies: '@modelcontextprotocol/sdk': 1.32.1(zod@4.6.7) - '@objectstack/core': 18.2.0 - '@objectstack/formula': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/formula': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 zod: 4.6.7 transitivePeerDependencies: - '@cfworker/json-schema' - ai - supports-color - '@objectstack/metadata-core@18.2.0': + '@objectstack/metadata-core@18.3.0': dependencies: - '@objectstack/spec': 18.2.0 + '@objectstack/spec': 18.3.0 zod: 4.6.7 transitivePeerDependencies: - ai - '@objectstack/metadata-fs@18.2.0': + '@objectstack/metadata-fs@18.3.0': dependencies: - '@objectstack/metadata-core': 18.2.0 + '@objectstack/metadata-core': 18.3.0 chokidar: 5.0.0 transitivePeerDependencies: - ai - '@objectstack/metadata-protocol@18.2.0': + '@objectstack/metadata-protocol@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/formula': 18.2.0 - '@objectstack/lint': 18.2.0 - '@objectstack/metadata': 18.2.0 - '@objectstack/metadata-core': 18.2.0 - '@objectstack/sdui-parser': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/formula': 18.3.0 + '@objectstack/lint': 18.3.0 + '@objectstack/metadata': 18.3.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/sdui-parser': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 zod: 4.6.7 transitivePeerDependencies: - ai - '@objectstack/metadata@18.2.0': + '@objectstack/metadata@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/metadata-core': 18.2.0 - '@objectstack/metadata-fs': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/metadata-fs': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 chokidar: 5.0.0 - glob: 13.0.6 + glob: 14.0.3 js-yaml: 5.4.1 zod: 4.6.7 transitivePeerDependencies: - ai - '@objectstack/objectql@18.2.0': + '@objectstack/objectql@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/formula': 18.2.0 - '@objectstack/metadata': 18.2.0 - '@objectstack/metadata-core': 18.2.0 - '@objectstack/metadata-protocol': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/formula': 18.3.0 + '@objectstack/metadata': 18.3.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/metadata-protocol': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 ajv: 8.20.0 ajv-formats: 3.0.1(ajv@8.20.0) zod: 4.6.7 transitivePeerDependencies: - ai - '@objectstack/observability@18.2.0': + '@objectstack/observability@18.3.0': dependencies: - '@objectstack/spec': 18.2.0 + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/platform-objects@18.2.0': + '@objectstack/platform-objects@18.3.0': dependencies: - '@objectstack/metadata-core': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/plugin-approvals@18.2.0': + '@objectstack/plugin-approvals@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/formula': 18.2.0 - '@objectstack/metadata-core': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/formula': 18.3.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/plugin-audit@18.2.0': + '@objectstack/plugin-audit@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/metadata-core': 18.2.0 - '@objectstack/objectql': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/objectql': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/plugin-auth@18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3)': + '@objectstack/plugin-auth@18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3)': dependencies: '@better-auth/core': 1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3) '@better-auth/oauth-provider': 1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-auth@1.7.12(mongodb@7.6.0))(better-call@1.4.4(zod@4.6.7)) '@better-auth/scim': 1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.5.0)(better-auth@1.7.12(mongodb@7.6.0))(better-call@1.4.4(zod@4.6.7)) '@better-auth/sso': 1.7.12(@better-auth/core@1.7.12(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(jose@6.2.12)(kysely@0.29.5)(nanostores@1.5.3))(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-auth@1.7.12(mongodb@7.6.0))(better-call@1.4.4(zod@4.6.7)) '@noble/hashes': 2.4.0 - '@objectstack/core': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/rest': 18.2.0 - '@objectstack/service-messaging': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/rest': 18.3.0 + '@objectstack/service-messaging': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 better-auth: 1.7.12(mongodb@7.6.0) jose: 6.2.12 transitivePeerDependencies: @@ -2592,110 +2608,111 @@ snapshots: - vitest - vue - '@objectstack/plugin-email@18.2.0': + '@objectstack/plugin-email@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/formula': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/formula': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/spec': 18.3.0 nodemailer: 10.2.1 transitivePeerDependencies: - ai - '@objectstack/plugin-hono-server@18.2.0': + '@objectstack/plugin-hono-server@18.3.0': dependencies: - '@hono/node-server': 2.1.1(hono@4.13.13) - '@objectstack/core': 18.2.0 - '@objectstack/observability': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@hono/node-server': 2.1.6(hono@4.13.13) + '@objectstack/core': 18.3.0 + '@objectstack/observability': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 hono: 4.13.13 transitivePeerDependencies: - ai - '@objectstack/plugin-pinyin-search@18.2.0': + '@objectstack/plugin-pinyin-search@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/objectql': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/objectql': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 pinyin-pro: 3.29.4 transitivePeerDependencies: - ai - '@objectstack/plugin-security@18.2.0': + '@objectstack/plugin-security@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/formula': 18.2.0 - '@objectstack/metadata-core': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/formula': 18.3.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/plugin-sharing@18.2.0': + '@objectstack/plugin-sharing@18.3.0': dependencies: '@noble/hashes': 2.4.0 - '@objectstack/core': 18.2.0 - '@objectstack/formula': 18.2.0 - '@objectstack/metadata-core': 18.2.0 - '@objectstack/objectql': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/formula': 18.3.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/objectql': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/plugin-webhooks@18.2.0': + '@objectstack/plugin-webhooks@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/service-messaging': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/service-messaging': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/rest@18.2.0': + '@objectstack/rest@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/metadata': 18.2.0 - '@objectstack/metadata-core': 18.2.0 - '@objectstack/observability': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/service-package': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/metadata': 18.3.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/observability': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/service-package': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 exceljs: 4.4.0 zod: 4.6.7 transitivePeerDependencies: - ai - '@objectstack/runtime@18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3)': - dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/driver-memory': 18.2.0 - '@objectstack/driver-sql': 18.2.0 - '@objectstack/driver-sqlite-wasm': 18.2.0(better-sqlite3@13.0.3) - '@objectstack/formula': 18.2.0 - '@objectstack/metadata': 18.2.0 - '@objectstack/metadata-core': 18.2.0 - '@objectstack/metadata-protocol': 18.2.0 - '@objectstack/objectql': 18.2.0 - '@objectstack/observability': 18.2.0 - '@objectstack/plugin-auth': 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) - '@objectstack/plugin-security': 18.2.0 - '@objectstack/rest': 18.2.0 - '@objectstack/service-cluster': 18.2.0 - '@objectstack/service-datasource': 18.2.0(@objectstack/driver-mongodb@18.2.0)(@objectstack/driver-sqlite-wasm@18.2.0) - '@objectstack/service-i18n': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/runtime@18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3)': + dependencies: + '@objectstack/core': 18.3.0 + '@objectstack/driver-memory': 18.3.0 + '@objectstack/driver-sql': 18.3.0 + '@objectstack/driver-sqlite-wasm': 18.3.0(better-sqlite3@13.0.3) + '@objectstack/formula': 18.3.0 + '@objectstack/lint': 18.3.0 + '@objectstack/metadata': 18.3.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/metadata-protocol': 18.3.0 + '@objectstack/objectql': 18.3.0 + '@objectstack/observability': 18.3.0 + '@objectstack/plugin-auth': 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + '@objectstack/plugin-security': 18.3.0 + '@objectstack/rest': 18.3.0 + '@objectstack/service-cluster': 18.3.0 + '@objectstack/service-datasource': 18.3.0(@objectstack/driver-mongodb@18.3.0)(@objectstack/driver-sqlite-wasm@18.3.0) + '@objectstack/service-i18n': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 quickjs-emscripten: 0.32.0 zod: 4.6.7 optionalDependencies: - '@objectstack/driver-mongodb': 18.2.0 + '@objectstack/driver-mongodb': 18.3.0 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@better-auth/utils' @@ -2738,26 +2755,26 @@ snapshots: - vitest - vue - '@objectstack/sdui-parser@18.2.0': {} + '@objectstack/sdui-parser@18.3.0': {} - '@objectstack/service-analytics@18.2.0': + '@objectstack/service-analytics@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/service-automation@18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3)': + '@objectstack/service-automation@18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3)': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/formula': 18.2.0 - '@objectstack/metadata-core': 18.2.0 - '@objectstack/metadata-protocol': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/plugin-auth': 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/formula': 18.3.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/metadata-protocol': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/plugin-auth': 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - '@better-auth/utils' - '@better-fetch/fetch' @@ -2785,33 +2802,33 @@ snapshots: - vitest - vue - '@objectstack/service-cache@18.2.0': + '@objectstack/service-cache@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/observability': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/observability': 18.3.0 + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/service-cluster@18.2.0': + '@objectstack/service-cluster@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/service-datasource@18.2.0(@objectstack/driver-mongodb@18.2.0)(@objectstack/driver-sqlite-wasm@18.2.0)': + '@objectstack/service-datasource@18.3.0(@objectstack/driver-mongodb@18.3.0)(@objectstack/driver-sqlite-wasm@18.3.0)': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/driver-memory': 18.2.0 - '@objectstack/driver-sql': 18.2.0 - '@objectstack/metadata-core': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/driver-memory': 18.3.0 + '@objectstack/driver-sql': 18.3.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 pg-connection-string: 2.14.0 optionalDependencies: - '@objectstack/driver-mongodb': 18.2.0 - '@objectstack/driver-sqlite-wasm': 18.2.0(better-sqlite3@13.0.3) + '@objectstack/driver-mongodb': 18.3.0 + '@objectstack/driver-sqlite-wasm': 18.3.0(better-sqlite3@13.0.3) transitivePeerDependencies: - ai - mariadb @@ -2824,82 +2841,82 @@ snapshots: - supports-color - tedious - '@objectstack/service-i18n@18.2.0': + '@objectstack/service-i18n@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/service-job@18.2.0': + '@objectstack/service-job@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/spec': 18.3.0 croner: 10.0.1 transitivePeerDependencies: - ai - '@objectstack/service-mailbox@18.2.0': + '@objectstack/service-mailbox@18.3.0': dependencies: - '@objectstack/connector-imap': 18.2.0 - '@objectstack/core': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/connector-imap': 18.3.0 + '@objectstack/core': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 postal-mime: 4.1.4 transitivePeerDependencies: - ai - '@objectstack/service-messaging@18.2.0': + '@objectstack/service-messaging@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/service-package@18.2.0': + '@objectstack/service-package@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/metadata-core': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/service-queue@18.2.0': + '@objectstack/service-queue@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/service-realtime@18.2.0': + '@objectstack/service-realtime@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/service-settings@18.2.0': + '@objectstack/service-settings@18.3.0': dependencies: '@noble/ciphers': 2.4.0 - '@objectstack/core': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/service-sms@18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3)': + '@objectstack/service-sms@18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3)': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/plugin-auth': 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) - '@objectstack/spec': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/plugin-auth': 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - '@better-auth/utils' - '@better-fetch/fetch' @@ -2927,94 +2944,94 @@ snapshots: - vitest - vue - '@objectstack/service-storage@18.2.0': + '@objectstack/service-storage@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/observability': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/observability': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/setup@18.2.0': + '@objectstack/setup@18.3.0': dependencies: - '@objectstack/platform-objects': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/spec@18.2.0': + '@objectstack/spec@18.3.0': dependencies: pg-connection-string: 2.14.0 zod: 4.6.7 - '@objectstack/trigger-api@18.2.0': + '@objectstack/trigger-api@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/trigger-record-change@18.2.0': + '@objectstack/trigger-record-change@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/trigger-schedule@18.2.0': + '@objectstack/trigger-schedule@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/metadata-core': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/metadata-core': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 croner: 10.0.1 transitivePeerDependencies: - ai - '@objectstack/types@18.2.0': + '@objectstack/types@18.3.0': dependencies: - '@objectstack/spec': 18.2.0 + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/verify@18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(@objectstack/driver-mongodb@18.2.0)(@objectstack/driver-sqlite-wasm@18.2.0)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3)': - dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/mcp': 18.2.0 - '@objectstack/metadata': 18.2.0 - '@objectstack/objectql': 18.2.0 - '@objectstack/platform-objects': 18.2.0 - '@objectstack/plugin-approvals': 18.2.0 - '@objectstack/plugin-audit': 18.2.0 - '@objectstack/plugin-auth': 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) - '@objectstack/plugin-email': 18.2.0 - '@objectstack/plugin-hono-server': 18.2.0 - '@objectstack/plugin-pinyin-search': 18.2.0 - '@objectstack/plugin-security': 18.2.0 - '@objectstack/plugin-sharing': 18.2.0 - '@objectstack/plugin-webhooks': 18.2.0 - '@objectstack/rest': 18.2.0 - '@objectstack/runtime': 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) - '@objectstack/service-analytics': 18.2.0 - '@objectstack/service-automation': 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) - '@objectstack/service-cache': 18.2.0 - '@objectstack/service-datasource': 18.2.0(@objectstack/driver-mongodb@18.2.0)(@objectstack/driver-sqlite-wasm@18.2.0) - '@objectstack/service-job': 18.2.0 - '@objectstack/service-mailbox': 18.2.0 - '@objectstack/service-messaging': 18.2.0 - '@objectstack/service-package': 18.2.0 - '@objectstack/service-queue': 18.2.0 - '@objectstack/service-realtime': 18.2.0 - '@objectstack/service-settings': 18.2.0 - '@objectstack/service-sms': 18.2.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) - '@objectstack/service-storage': 18.2.0 - '@objectstack/spec': 18.2.0 - '@objectstack/trigger-api': 18.2.0 - '@objectstack/trigger-record-change': 18.2.0 - '@objectstack/trigger-schedule': 18.2.0 - '@objectstack/types': 18.2.0 + '@objectstack/verify@18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(@objectstack/driver-mongodb@18.3.0)(@objectstack/driver-sqlite-wasm@18.3.0)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3)': + dependencies: + '@objectstack/core': 18.3.0 + '@objectstack/mcp': 18.3.0 + '@objectstack/metadata': 18.3.0 + '@objectstack/objectql': 18.3.0 + '@objectstack/platform-objects': 18.3.0 + '@objectstack/plugin-approvals': 18.3.0 + '@objectstack/plugin-audit': 18.3.0 + '@objectstack/plugin-auth': 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + '@objectstack/plugin-email': 18.3.0 + '@objectstack/plugin-hono-server': 18.3.0 + '@objectstack/plugin-pinyin-search': 18.3.0 + '@objectstack/plugin-security': 18.3.0 + '@objectstack/plugin-sharing': 18.3.0 + '@objectstack/plugin-webhooks': 18.3.0 + '@objectstack/rest': 18.3.0 + '@objectstack/runtime': 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(better-sqlite3@13.0.3)(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + '@objectstack/service-analytics': 18.3.0 + '@objectstack/service-automation': 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + '@objectstack/service-cache': 18.3.0 + '@objectstack/service-datasource': 18.3.0(@objectstack/driver-mongodb@18.3.0)(@objectstack/driver-sqlite-wasm@18.3.0) + '@objectstack/service-job': 18.3.0 + '@objectstack/service-mailbox': 18.3.0 + '@objectstack/service-messaging': 18.3.0 + '@objectstack/service-package': 18.3.0 + '@objectstack/service-queue': 18.3.0 + '@objectstack/service-realtime': 18.3.0 + '@objectstack/service-settings': 18.3.0 + '@objectstack/service-sms': 18.3.0(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-call@1.4.4(zod@4.6.7))(kysely@0.29.5)(mongodb@7.6.0)(nanostores@1.5.3) + '@objectstack/service-storage': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/trigger-api': 18.3.0 + '@objectstack/trigger-record-change': 18.3.0 + '@objectstack/trigger-schedule': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - '@aws-sdk/client-s3' - '@aws-sdk/credential-providers' @@ -3086,12 +3103,6 @@ snapshots: '@standard-schema/spec@1.1.0': {} - '@ts-morph/common@0.29.0': - dependencies: - minimatch: 10.2.6 - path-browserify: 1.0.1 - tinyglobby: 0.2.17 - '@types/node@14.18.63': {} '@types/webidl-conversions@7.0.3': {} @@ -3264,6 +3275,10 @@ snapshots: dependencies: balanced-match: 1.0.2 + brace-expansion@5.0.12: + dependencies: + balanced-match: 4.0.4 + brace-expansion@5.0.9: dependencies: balanced-match: 4.0.4 @@ -3314,8 +3329,6 @@ snapshots: cli-spinners@2.9.2: {} - code-block-writer@13.0.3: {} - color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -3363,10 +3376,11 @@ snapshots: crc-32: 1.2.2 readable-stream: 3.6.2 - create-objectstack@18.2.0: + create-objectstack@18.3.0: dependencies: chalk: 6.0.1 commander: 15.0.0 + validate-npm-package-name: 7.0.2 croner@10.0.1: {} @@ -3606,11 +3620,11 @@ snapshots: getopts@2.3.0: {} - glob@13.0.6: + glob@14.0.3: dependencies: - minimatch: 10.2.6 + minimatch: 11.0.4 minipass: 7.1.3 - path-scurry: 2.0.2 + path-scurry: 3.0.0 glob@7.2.3: dependencies: @@ -3796,6 +3810,11 @@ snapshots: dependencies: brace-expansion: 5.0.9 + minimatch@11.0.4: + dependencies: + '@isaacs/nonrecursive-glob-match': 1.0.3 + brace-expansion: 5.0.12 + minimatch@3.1.5: dependencies: brace-expansion: 1.1.18 @@ -3868,8 +3887,6 @@ snapshots: parseurl@1.3.3: {} - path-browserify@1.0.1: {} - path-expression-matcher@1.6.2: {} path-is-absolute@1.0.1: {} @@ -3878,7 +3895,7 @@ snapshots: path-parse@1.0.7: {} - path-scurry@2.0.2: + path-scurry@3.0.0: dependencies: lru-cache: 11.5.2 minipass: 7.1.3 @@ -4165,11 +4182,6 @@ snapshots: ts-interface-checker@0.1.13: {} - ts-morph@28.0.0: - dependencies: - '@ts-morph/common': 0.29.0 - code-block-writer: 13.0.3 - tsx@4.23.15: dependencies: esbuild: 0.28.2 @@ -4205,6 +4217,8 @@ snapshots: uuid@8.3.2: {} + validate-npm-package-name@7.0.2: {} + vary@1.1.2: {} webidl-conversions@7.0.0: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 60898b9..e6b7f26 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -81,11 +81,11 @@ peerDependencyRules: # upgrade checklist, step 1): without this block the tree resolves a mix of # 18.x versions. Move these with the @objectstack/* pins at every upgrade. overrides: - '@objectstack/core': '18.2.0' - '@objectstack/driver-memory': '18.2.0' - '@objectstack/driver-mongodb': '18.2.0' - '@objectstack/driver-sql': '18.2.0' - '@objectstack/driver-sqlite-wasm': '18.2.0' - '@objectstack/objectql': '18.2.0' - '@objectstack/observability': '18.2.0' - '@objectstack/runtime': '18.2.0' + '@objectstack/core': '18.3.0' + '@objectstack/driver-memory': '18.3.0' + '@objectstack/driver-mongodb': '18.3.0' + '@objectstack/driver-sql': '18.3.0' + '@objectstack/driver-sqlite-wasm': '18.3.0' + '@objectstack/objectql': '18.3.0' + '@objectstack/observability': '18.3.0' + '@objectstack/runtime': '18.3.0' diff --git a/src/objects/contract-version.object.ts b/src/objects/contract-version.object.ts index 290c655..18b9fe6 100644 --- a/src/objects/contract-version.object.ts +++ b/src/objects/contract-version.object.ts @@ -49,6 +49,9 @@ export const ContractVersion = ObjectSchema.create({ deleteBehavior: 'cascade', inlineEdit: 'grid', inlineTitle: 'Versions', + // The columns the contract page's list shows (ADR-0085: the record page + // derives the list from this relationship since @objectstack 18.3). + relatedListColumns: ['display_name', 'version_no', 'kind', 'turn', 'is_current', 'file', 'submitted_by', 'created_at'], }), version_no: Field.number({ label: 'Version No.', diff --git a/src/objects/contract.object.ts b/src/objects/contract.object.ts index 2425e89..c843f42 100644 --- a/src/objects/contract.object.ts +++ b/src/objects/contract.object.ts @@ -52,12 +52,38 @@ export const Contract = ObjectSchema.create({ { key: 'commercial', label: 'Commercial Terms', icon: 'dollar-sign' }, { key: 'term', label: 'Term & Renewal', icon: 'calendar' }, { key: 'legal', label: 'Legal', icon: 'scale' }, + // Body tables, placed after the key terms (ADR-0085 / objectstack#27069: + // a group naming a relationship stands for that list's table). Without + // these the record page drew all six tables between the first group and + // the parties, pushing the terms below them. + { key: 'versions', label: 'Versions', icon: 'files', relatedList: 'clm_contract_version' }, + { key: 'reviews', label: 'Reviews', icon: 'clipboard-check', relatedList: 'clm_review' }, + { key: 'deviations', label: 'Deviations', icon: 'git-compare', relatedList: 'clm_deviation' }, + { key: 'obligations', label: 'Obligations', icon: 'list-checks', relatedList: 'clm_obligation' }, + { key: 'payments', label: 'Payment Schedule', icon: 'wallet', relatedList: 'clm_payment_plan' }, + { key: 'signatures', label: 'Signature Records', icon: 'pen-tool', relatedList: 'clm_signature' }, { key: 'routing', label: 'Routing & Approval', icon: 'route', defaultExpanded: false }, { key: 'lifecycle', label: 'Lifecycle', icon: 'history', defaultExpanded: false }, { key: 'ai', label: 'AI Review', icon: 'sparkles', defaultExpanded: false }, { key: 'rollup', label: 'Roll-ups', icon: 'sigma', defaultExpanded: false }, ], + // The record page's related lists, in the order a contract passes through + // them (DESIGN.md §05: versions → review & deviations → performance → + // signing), then the renewals that point back here. Since @objectstack 18.3 + // the record page composes its lists from these relationships (ADR-0085, + // objectstack#27053 retired the page's own `tabs` slot), so this list is + // where §05's order lives. Approvals are the platform's own panel. + relatedLists: [ + 'clm_contract_version', + 'clm_review', + 'clm_deviation', + 'clm_obligation', + 'clm_payment_plan', + 'clm_signature', + 'clm_contract.renewed_from', + ], + fields: { // ─── Identity ─────────────────────────────────────────────────────── contract_number: Field.text({ @@ -353,11 +379,21 @@ export const Contract = ObjectSchema.create({ // Written by the start_renewal flow; DESIGN.md §03: renewal is a new // contract, not a transition. description: 'Set by Start Renewal on the new draft. A renewal is a new contract, not a status change.', + // The old contract's page lists its renewals — including the draft + // `start_renewal` has just created — so a reader reaches the successor. + // A side card, not a body table: as a body table the list draws the + // contract's own list actions (Launch Contract, Backfill), which start + // an unrelated intake rather than a renewal. + relatedListColumns: ['contract_number', 'title', 'status', 'start_date', 'end_date', 'owner_id', 'created_at'], }), parent_contract: Field.lookup('clm_contract', { label: 'Parent Contract', group: 'term', description: 'The framework agreement this order sits under, or the main contract an amendment modifies.', + // Not listed on the parent's page: the record page before 18.3 never + // showed it, and two lists both titled "Contracts" on one contract page + // would read as the same list twice. + relatedList: false, }), is_expiring: Field.boolean({ label: 'Expiring Soon', diff --git a/src/objects/deviation.object.ts b/src/objects/deviation.object.ts index be7f491..1224132 100644 --- a/src/objects/deviation.object.ts +++ b/src/objects/deviation.object.ts @@ -46,6 +46,9 @@ export const Deviation = ObjectSchema.create({ deleteBehavior: 'cascade', inlineEdit: 'grid', inlineTitle: 'Deviations', + // The columns the contract page's list shows (ADR-0085: the record page + // derives the list from this relationship since @objectstack 18.3). + relatedListColumns: ['display_name', 'clause', 'requested_position', 'status', 'decided_by', 'decided_at'], }), clause: Field.lookup('clm_clause', { label: 'Clause', diff --git a/src/objects/obligation.object.ts b/src/objects/obligation.object.ts index 2ea8e17..e9d345c 100644 --- a/src/objects/obligation.object.ts +++ b/src/objects/obligation.object.ts @@ -70,6 +70,9 @@ export const Obligation = ObjectSchema.create({ deleteBehavior: 'cascade', inlineEdit: 'grid', inlineTitle: 'Obligations', + // The columns the contract page's list shows (ADR-0085: the record page + // derives the list from this relationship since @objectstack 18.3). + relatedListColumns: ['display_name', 'title', 'kind', 'due_date', 'owner', 'status'], }), title: Field.text({ label: 'Title', diff --git a/src/objects/payment-plan.object.ts b/src/objects/payment-plan.object.ts index 35e4d83..b98edf3 100644 --- a/src/objects/payment-plan.object.ts +++ b/src/objects/payment-plan.object.ts @@ -59,6 +59,9 @@ export const PaymentPlan = ObjectSchema.create({ deleteBehavior: 'cascade', inlineEdit: 'grid', inlineTitle: 'Payment Plan', + // The columns the contract page's list shows (ADR-0085: the record page + // derives the list from this relationship since @objectstack 18.3). + relatedListColumns: ['display_name', 'seq', 'planned_date', 'planned_amount', 'status', 'actual_date', 'actual_amount', 'invoice_no'], }), seq: Field.number({ label: 'Instalment No.', diff --git a/src/objects/review.object.ts b/src/objects/review.object.ts index 83c3c27..794abd7 100644 --- a/src/objects/review.object.ts +++ b/src/objects/review.object.ts @@ -44,6 +44,9 @@ export const Review = ObjectSchema.create({ deleteBehavior: 'cascade', inlineEdit: 'grid', inlineTitle: 'Reviews', + // The columns the contract page's list shows (ADR-0085: the record page + // derives the list from this relationship since @objectstack 18.3). + relatedListColumns: ['display_name', 'stage', 'reviewer', 'decision', 'risk_level_assessed', 'started_at', 'decided_at'], }), reviewer: Field.user({ label: 'Reviewer', diff --git a/src/objects/signature.object.ts b/src/objects/signature.object.ts index 1ed83b8..1c00659 100644 --- a/src/objects/signature.object.ts +++ b/src/objects/signature.object.ts @@ -50,6 +50,9 @@ export const Signature = ObjectSchema.create({ deleteBehavior: 'cascade', inlineEdit: 'grid', inlineTitle: 'Signatures', + // The columns the contract page's list shows (ADR-0085: the record page + // derives the list from this relationship since @objectstack 18.3). + relatedListColumns: ['display_name', 'method', 'provider', 'status', 'formalities_done', 'executed_file', 'completed_at'], }), method: Field.select({ label: 'Method', diff --git a/src/pages/contract_detail.page.ts b/src/pages/contract_detail.page.ts index e1fc78c..7fff171 100644 --- a/src/pages/contract_detail.page.ts +++ b/src/pages/contract_detail.page.ts @@ -3,87 +3,45 @@ import type { Page } from '@objectstack/spec/ui'; /** * The contract record page — DESIGN.md §05's 合同详情页, slotted. * - * §05 spells the shape out: header actions shown by status AND gate, - * highlights, a `path` over the seven pre-terminal statuses, and seven tabs - * including the platform discussion slot. `kind: 'slotted'` is that sentence - * literally: the slot menu IS `header | actions | alerts | highlights | - * details | tabs | discussion`, each a full replacement at the slot boundary, - * with every slot left unset falling through to the synthesized default. + * §05 asks for header actions shown by status AND gate, highlights, a `path` + * over the seven pre-terminal statuses, then the contract's body: key terms, + * versions, review and deviations, approvals, obligations and payments, + * signing and archive, and the discussion. `kind: 'slotted'` authors only + * the first three; every slot left unset falls through to the synthesized + * record page. * - * ## Filters on this page + * ## Where the body comes from (since @objectstack 18.3) * - * Every `record:related_list` `filter` is the rule-object form - * `RecordRelatedListProps` declares — `[{ field, operator, value }]`, the - * operator from `VIEW_FILTER_OPERATORS`. The AST array form - * (`[['status', '!=', 'done']]`) and the `op:` key are rejected at build, and - * this page has exactly one filter (the approval tab's `object_name` cut), - * written in that shape and checked against the schema rather than copied from - * a sibling — HotCRM's AGENTS.md records that every `record:related_list` - * filter under its own `src/pages/` is one of the rejected forms. + * Up to 18.2 this page authored its own seven-tab strip in `slots.tabs`. + * 18.3 retired that slot (ADR-0085, objectstack#27053): an authored strip + * replaced the whole synthesized one and kept the page tabbed at every width, + * off the record page's columns, drawer and phone layouts. The body is now + * the platform's, composed from the object: * - * ## Why 22 labels on this page are inline `{ en, 'zh-CN' }` maps (card 11) + * - **Key terms** — `clm_contract.fieldGroups`, the same eight groups the old + * Overview tab enumerated one by one. The archive facts sit in their own + * groups (`archive_no` in identity, the stamps in lifecycle). + * - **Versions, reviews, deviations, obligations, payments, signatures** — + * full-width tables from each child's `contract` master-detail field, with + * the columns its `relatedListColumns` names (the columns this page used to + * carry), placed after the key terms by the body-table entries in + * `clm_contract.fieldGroups`. + * - **Renewals** — the `renewed_from` lookup, a side card. + * - **Approvals, discussion** — the platform's own panels; the discussion is + * no longer emptied here, since there is no authored tab to hold it. * - * `I18nLabelSchema` authorizes two forms for a display label: a plain string - * whose translations live in a bundle, and an inline locale map picked at - * render time. Everything else this repo authors uses the first form — - * translators never open a `*.object.ts` — and this page uses the second, - * because for these 22 strings THE FIRST FORM HAS NO KEY. + * ## Path labels are inline `{ en, 'zh-CN' }` maps * - * Measured, not assumed. `walkAddressedPageComponents` (`@objectstack/spec` - * 17.3.0) is the traversal `translatePage` runs to decide what - * `pages..components..*` addresses, and it addresses **zero** - * components on this page: + * `record:path` stage labels have no bundle key (the page-component key face + * gives `record:path` one `label`, the component's own, not one per stage), so the seven stage names are inline locale maps — the spec's ruled + * route for page copy a bundle cannot address. ⚠️ `pnpm lint:i18n-gate` + * cannot see an inline map: a new stage with a plain-string label would ship + * English on a zh-CN console with the gate green. * - * import { walkAddressedPageComponents } from '@objectstack/spec/system'; - * let n = 0; walkAddressedPageComponents(ContractDetailPage, (c) => (n++, c)); - * // -> 0 (21 components and tab labels are authored below) - * - * Two independent reasons, either of which alone is enough. The walk's roots - * are `regions[].components[]` and this page is `kind: 'slotted'`, so its - * `slots` are not roots at all. And the descent is `properties.children` only, - * so `page:tabs` `items[].children` would be out of reach even on a regions - * page — which also means a TAB LABEL (`items[].label`) has no bundle key on - * any page, of any kind. - * - * So `pages.contract_detail` carries exactly two bundle keys, `label` and - * `description`, and the seven tab labels, seven path stages, seven related-list - * titles and one block label below could not be translated by a bundle if one - * were written. The inline map is the spec's own ruled route for page copy the - * bundle cannot address, not a workaround for it — `translation.zod.ts` says so - * where it declines to add `content` to the page-component key face: "The - * inline locale map is the ruled route for page prose". - * - * ⚠️ Superseded from 17.5 (spec 4bbf766, #16772), measured on 17.7.0 (#82): - * the walk now roots at a slotted page's `slots` too, and the same call above - * returns 14 on this page, so the bundle also addresses its header `title` / - * `subtitle` and `components..*`. The inline maps below still render; they - * are now a workaround that release made obsolete, and moving them into the - * bundle is a card of its own. - * - * ⚠️ THE GATE CANNOT SEE THESE. `os i18n check` counts bundle keys, and an - * inline map is invisible to it (the extractor skips a label already in map - * form — it is multilingual, so no key is scaffolded). Adding an eighth tab - * with a plain-string label would therefore ship an English tab on a zh-CN - * console and `pnpm lint:i18n-gate` would stay green. The section labels one - * level down are NOT in this class and are deliberately left as plain strings: - * they carry `name`, which resolves `objects.clm_contract._sections..label` - * from the bundle, and the gate does cover those. - * - * ## What §05 asks for that this page renders differently, and why - * - * - **版本(timeline)** — the page-component vocabulary has no timeline - * member (`ComponentPropsMap` has `record:related_list`, `record:activity`, - * `record:history`, no `record:timeline`), and a `type: 'timeline'` LIST VIEW - * is a list-page visualization, not something a tab can mount. The versions - * tab is therefore a related list ordered newest-first, which is the same - * chronology in a different frame. Reported, not silently substituted. - * - **发起续签** is now the seventh header action (`start_renewal`), which is - * what card 09 owed: F12's sweep flags a contract `is_expiring` and the - * notification tells the owner a renewal decision is due, and this is the - * button that decision is taken with. It is a flow action, not a transition - * — §03 is explicit that renewal creates a NEW contract carrying - * `renewed_from` rather than moving this one — so it sits beside the six - * status writes without being one. + * **发起续签** is the eighth header action (`start_renewal`): a flow action, + * not a transition — §03 is explicit that renewal creates a NEW contract + * carrying `renewed_from` rather than moving this one — so it sits beside the + * status writes without being one. */ export const ContractDetailPage: Page = { name: 'contract_detail', @@ -200,288 +158,5 @@ export const ContractDetailPage: Page = { }, }, ], - - /** - * The seven tabs of §05, in the order a contract passes through them. - * - * `tabStyle`, not `type`: a props key named `type` collides with the - * component node's own dispatch key and was removed at protocol 17. Item - * keys are `value`, not `key` — `value` is the `?tab=` URL token the - * renderer reads, which is what makes a tab linkable. - */ - tabs: { - type: 'page:tabs', - id: 'contract_tabs', - properties: { - tabStyle: 'line', - position: 'top', - items: [ - { - // 概要 - value: 'overview', - label: { en: 'Overview', 'zh-CN': '概要' }, - children: [ - { - type: 'record:details', - id: 'contract_details', - properties: { - columns: '2', - // Sections enumerate their `fields`, mirroring the object's - // own `fieldGroups` — NOT the `{ group: 'parties' }` reference - // form. That form is declared (`RecordDetailsProps.sections`, - // #13855) and this console pin does not implement it: with - // `{ group: … }` sections the whole tab rendered the panel - // *Component "record:details" failed to render — Cannot read - // properties of undefined (reading 'name')*, because - // `RecordDetailsRenderer` maps every section through `s.name` - // and a group reference carries none. Reported upstream; the - // enumerated form is the other DECLARED spelling of the same - // fact, not a workaround fixture. - // - // ⚠️ KNOWN RENDERING DEFECT, platform side, reported not - // patched (AGENTS.md "Platform gaps"): an enumerated - // `fields` section renders each field's RAW KEY as its label - // — `OUR_ENTITY`, `TERM_MONTHS` — instead of the `label:` the - // object declares. Measured against two controls in the same - // session: this object's own list views render the same - // fields' labels correctly (`Contract Number`, `Counterparty`, - // `Contract Amount`), and the platform's SYNTHESIZED default - // record page for `clm_party` renders `REGISTRATION / TAX ID` - // and `LEGAL REPRESENTATIVE` — so the labels resolve - // everywhere except here. The synthesized page reaches them - // through the group-derived path, which is the same path the - // `{ group: … }` section form above would have used and which - // throws. Both halves are one story: the group-derived body - // works and the enumerated one is second-class. - // - // `identity` is deliberately absent: `contract_number` is the - // page H1, `title` its subtitle, and `record:details` drops - // every field the mounted highlights strip already registered - // — a section built only from duplicates renders nothing at - // all, silently. - sections: [ - { name: 'parties', label: 'Parties & Owners', columns: 2, - fields: ['party', 'our_entity', 'department', 'owner_id', 'legal_owner', 'current_turn', 'turn_since'] }, - { name: 'commercial', label: 'Commercial Terms', columns: 2, - fields: ['amount', 'currency_code', 'is_amount_estimated', 'payment_terms', 'liability_cap'] }, - { name: 'term', label: 'Term & Renewal', columns: 2, - fields: ['start_date', 'end_date', 'term_months', 'auto_renew', 'renewal_notice_days', 'renewed_from', 'parent_contract', 'is_expiring'] }, - { name: 'legal', label: 'Legal', columns: 2, - fields: ['governing_law', 'jurisdiction', 'contract_language', 'confidentiality_term_months', 'execution_formalities', 'risk_level', 'summary'] }, - { name: 'rollup', label: 'Roll-ups', columns: 2, - fields: ['version_count', 'open_deviation_count', 'overdue_obligation_count', 'planned_amount', 'actual_amount'] }, - { name: 'routing', label: 'Routing & Approval', columns: 2, - fields: ['route_legal_head', 'route_finance', 'route_executive', 'route_gm', 'approval_status'] }, - { name: 'lifecycle', label: 'Lifecycle', columns: 2, - fields: ['submitted_at', 'review_started_at', 'approved_at', 'signed_at', 'executed_at', 'activated_at', 'closed_at', 'archived_at'] }, - { name: 'ai', label: 'AI Review', columns: 2, - fields: ['ai_summary', 'ai_risk_score', 'ai_risk_rationale', 'ai_reviewed_at'] }, - ], - }, - }, - { - // The forward link `renewed_from` points back along. Renewal is - // a NEW contract (§03 「续签不是转换」), so the old contract's own - // fields never name its successor; this list is how a reader of - // the old contract reaches the renewal — including the draft - // `start_renewal` has just created, since that press leaves the - // user on this page (taking them to the draft is the platform's: - // a `flow` action cannot declare `onSuccess`, objectstack#25800). - // - // The title is a plain string, translated by the bundle at - // `pages.contract_detail.components.contract_renewals.title`, - // which the i18n gate counts — not an inline map (see the header). - type: 'record:related_list', - id: 'contract_renewals', - properties: { - objectName: 'clm_contract', - relationshipField: 'renewed_from', - title: 'Renewals', - columns: ['contract_number', 'title', 'status', 'start_date', 'end_date', 'owner_id', 'created_at'], - sort: [{ field: 'created_at', order: 'desc' }], - limit: 10, - // None of the contract's own list actions: unnamed, the list - // draws every `list_toolbar` action of `clm_contract`, and - // "Launch Contract" above a list of renewals starts an - // unrelated intake. A renewal is started from the header. - actions: [], - }, - }, - ], - }, - { - // 版本 — newest first; see the file header on §05's "(timeline)". - value: 'versions', - label: { en: 'Versions', 'zh-CN': '版本' }, - children: [ - { - type: 'record:related_list', - id: 'contract_versions', - properties: { - objectName: 'clm_contract_version', - relationshipField: 'contract', - title: { en: 'Versions', 'zh-CN': '版本' }, - columns: ['display_name', 'version_no', 'kind', 'turn', 'is_current', 'file', 'submitted_by', 'created_at'], - sort: [{ field: 'version_no', order: 'desc' }], - limit: 20, - }, - }, - ], - }, - { - // 审查与偏离 — the two objects legal works in, on one tab because - // a deviation only means anything beside the review that raised it. - value: 'review', - label: { en: 'Review & Deviations', 'zh-CN': '审查与偏离' }, - children: [ - { - type: 'record:related_list', - id: 'contract_reviews', - properties: { - objectName: 'clm_review', - relationshipField: 'contract', - title: { en: 'Reviews', 'zh-CN': '审查' }, - columns: ['display_name', 'stage', 'reviewer', 'decision', 'risk_level_assessed', 'started_at', 'decided_at'], - sort: [{ field: 'started_at', order: 'desc' }], - limit: 10, - }, - }, - { - type: 'record:related_list', - id: 'contract_deviations', - properties: { - objectName: 'clm_deviation', - relationshipField: 'contract', - title: { en: 'Deviations', 'zh-CN': '偏离' }, - columns: ['display_name', 'clause', 'requested_position', 'status', 'decided_by', 'decided_at'], - sort: [{ field: 'created_at', order: 'desc' }], - limit: 10, - }, - }, - ], - }, - { - // 审批记录 — the platform's own `sys_approval_request` rows, which - // F5 opens. `record_id` is the request's pointer at the record and - // `object_name` says which object it points into, so BOTH are - // needed: without the filter this list would show every approval - // request whose `record_id` happens to collide across objects. - value: 'approvals', - label: { en: 'Approvals', 'zh-CN': '审批记录' }, - children: [ - { - type: 'record:related_list', - id: 'contract_approvals', - properties: { - objectName: 'sys_approval_request', - relationshipField: 'record_id', - title: { en: 'Approval Requests', 'zh-CN': '审批请求' }, - filter: [{ field: 'object_name', operator: 'equals', value: 'clm_contract' }], - sort: [{ field: 'created_at', order: 'desc' }], - limit: 10, - }, - }, - ], - }, - { - // 履约与收付款 - value: 'performance', - label: { en: 'Obligations & Payments', 'zh-CN': '履约与收付款' }, - children: [ - { - type: 'record:related_list', - id: 'contract_obligations', - properties: { - objectName: 'clm_obligation', - relationshipField: 'contract', - title: { en: 'Obligations', 'zh-CN': '履约义务' }, - columns: ['display_name', 'title', 'kind', 'due_date', 'owner', 'status'], - sort: [{ field: 'due_date', order: 'asc' }], - limit: 10, - }, - }, - { - type: 'record:related_list', - id: 'contract_payments', - properties: { - objectName: 'clm_payment_plan', - relationshipField: 'contract', - title: { en: 'Payment Schedule', 'zh-CN': '收付款计划' }, - columns: ['display_name', 'seq', 'planned_date', 'planned_amount', 'status', 'actual_date', 'actual_amount', 'invoice_no'], - sort: [{ field: 'seq', order: 'asc' }], - limit: 12, - }, - }, - ], - }, - { - // 签署与归档 — the signature records, then the archive facts that - // F7 and F14 stamp. The details block is a second section on the - // same tab because "is it archived" is a property of the contract, - // not of a signature row. - value: 'signing', - label: { en: 'Signing & Archive', 'zh-CN': '签署与归档' }, - children: [ - { - type: 'record:related_list', - id: 'contract_signatures', - properties: { - objectName: 'clm_signature', - relationshipField: 'contract', - title: { en: 'Signature Records', 'zh-CN': '签署记录' }, - columns: ['display_name', 'method', 'provider', 'status', 'formalities_done', 'executed_file', 'completed_at'], - sort: [{ field: 'created_at', order: 'desc' }], - limit: 10, - }, - }, - { - type: 'record:details', - id: 'contract_archive_details', - label: { en: 'Archive', 'zh-CN': '归档' }, - properties: { - columns: '2', - sections: [ - { - name: 'archive', - label: 'Archive', - columns: 2, - fields: ['archive_no', 'archived_at', 'executed_at', 'signed_at', 'execution_formalities', 'is_backfilled'], - }, - ], - }, - }, - ], - }, - { - // 讨论 — §05's "平台 discussion slot,评论与 @". - // - // `record:discussion` and `record:chatter` are ONE renderer under - // two registered names sharing one props schema; `discussion` is - // the registration-preferred spelling and what the platform's own - // default-page synthesizer emits, so it is the one authored here. - // - // It is mounted as the seventh TAB rather than in the page's - // `discussion` SLOT because §05 lists 讨论 among the tabs. The slot - // is then overridden with an empty array so the synthesized default - // does not render a second copy of the same panel below the body. - value: 'discussion', - label: { en: 'Discussion', 'zh-CN': '讨论' }, - children: [ - { - type: 'record:discussion', - id: 'contract_discussion', - properties: { - position: 'bottom', - }, - }, - ], - }, - ], - }, - }, - - // See the discussion tab: the panel lives there, so the slot is emptied - // rather than left to fall through to the synthesized default. - discussion: [], }, }; diff --git a/src/translations/en/app.ts b/src/translations/en/app.ts index 6cfdb20..9dbf57b 100644 --- a/src/translations/en/app.ts +++ b/src/translations/en/app.ts @@ -449,12 +449,6 @@ export const appSurface: Pick = { rollup: { label: 'Roll-ups', }, - archive: { - label: 'Archive', + versions: { + label: 'Versions', + }, + reviews: { + label: 'Reviews', + }, + deviations: { + label: 'Deviations', + }, + obligations: { + label: 'Obligations', + }, + payments: { + label: 'Payment Schedule', + }, + signatures: { + label: 'Signature Records', }, }, _validations: { @@ -586,6 +601,7 @@ export const contract: Record = { }, contract: { label: 'Contract', + inlineTitle: 'Versions', }, version_no: { label: 'Version No.', diff --git a/src/translations/en/objects.lifecycle.ts b/src/translations/en/objects.lifecycle.ts index 579c63b..a55944e 100644 --- a/src/translations/en/objects.lifecycle.ts +++ b/src/translations/en/objects.lifecycle.ts @@ -21,6 +21,7 @@ export const lifecycle: Record = { }, contract: { label: 'Contract', + inlineTitle: 'Reviews', }, reviewer: { label: 'Reviewer', @@ -88,6 +89,7 @@ export const lifecycle: Record = { }, contract: { label: 'Contract', + inlineTitle: 'Deviations', }, clause: { label: 'Clause', @@ -149,6 +151,7 @@ export const lifecycle: Record = { }, contract: { label: 'Contract', + inlineTitle: 'Signatures', }, method: { label: 'Method', @@ -229,6 +232,7 @@ export const lifecycle: Record = { }, contract: { label: 'Contract', + inlineTitle: 'Obligations', }, title: { label: 'Title', @@ -307,6 +311,7 @@ export const lifecycle: Record = { }, contract: { label: 'Contract', + inlineTitle: 'Payment Plan', }, seq: { label: 'Instalment No.', diff --git a/src/translations/zh-CN/app.ts b/src/translations/zh-CN/app.ts index 8224edd..b58cf45 100644 --- a/src/translations/zh-CN/app.ts +++ b/src/translations/zh-CN/app.ts @@ -449,12 +449,6 @@ export const appSurface: Pick = { rollup: { label: '汇总', }, - archive: { - label: '归档', + versions: { + label: '版本', + }, + reviews: { + label: '审查', + }, + deviations: { + label: '偏离', + }, + obligations: { + label: '履约义务', + }, + payments: { + label: '收付款计划', + }, + signatures: { + label: '签署记录', }, }, _validations: { @@ -586,6 +601,7 @@ export const contract: Record = { }, contract: { label: '合同', + inlineTitle: '版本', }, version_no: { label: '版本号', diff --git a/src/translations/zh-CN/objects.lifecycle.ts b/src/translations/zh-CN/objects.lifecycle.ts index 5bcc651..eb2992f 100644 --- a/src/translations/zh-CN/objects.lifecycle.ts +++ b/src/translations/zh-CN/objects.lifecycle.ts @@ -21,6 +21,7 @@ export const lifecycle: Record = { }, contract: { label: '合同', + inlineTitle: '审查', }, reviewer: { label: '审查人', @@ -88,6 +89,7 @@ export const lifecycle: Record = { }, contract: { label: '合同', + inlineTitle: '偏离', }, clause: { label: '条款', @@ -149,6 +151,7 @@ export const lifecycle: Record = { }, contract: { label: '合同', + inlineTitle: '签署记录', }, method: { label: '签署方式', @@ -229,6 +232,7 @@ export const lifecycle: Record = { }, contract: { label: '合同', + inlineTitle: '履约义务', }, title: { label: '标题', @@ -307,6 +311,7 @@ export const lifecycle: Record = { }, contract: { label: '合同', + inlineTitle: '收付款计划', }, seq: { label: '期次',