diff --git a/package.json b/package.json index c9c0ccb..b89739a 100644 --- a/package.json +++ b/package.json @@ -24,24 +24,24 @@ "verify": "pnpm validate && pnpm typecheck && pnpm test" }, "dependencies": { - "@objectstack/spec": "^18.2.0", - "@objectstack/runtime": "^18.2.0", - "@objectstack/plugin-hono-server": "^18.2.0", - "@objectstack/connector-rest": "^18.2.0", - "@objectstack/connector-openapi": "^18.2.0", - "@objectstack/connector-mcp": "^18.2.0" + "@objectstack/spec": "^18.3.0", + "@objectstack/runtime": "^18.3.0", + "@objectstack/plugin-hono-server": "^18.3.0", + "@objectstack/connector-rest": "^18.3.0", + "@objectstack/connector-openapi": "^18.3.0", + "@objectstack/connector-mcp": "^18.3.0" }, "devDependencies": { - "@objectstack/cli": "^18.2.0", - "@objectstack/platform-objects": "^18.2.0", - "@objectstack/plugin-auth": "^18.2.0", - "@objectstack/plugin-email": "^18.2.0", - "@objectstack/plugin-security": "^18.2.0", - "@objectstack/plugin-sharing": "^18.2.0", - "@objectstack/service-automation": "^18.2.0", - "@objectstack/service-job": "^18.2.0", - "@objectstack/service-messaging": "^18.2.0", - "@objectstack/trigger-schedule": "^18.2.0", + "@objectstack/cli": "^18.3.0", + "@objectstack/platform-objects": "^18.3.0", + "@objectstack/plugin-auth": "^18.3.0", + "@objectstack/plugin-email": "^18.3.0", + "@objectstack/plugin-security": "^18.3.0", + "@objectstack/plugin-sharing": "^18.3.0", + "@objectstack/service-automation": "^18.3.0", + "@objectstack/service-job": "^18.3.0", + "@objectstack/service-messaging": "^18.3.0", + "@objectstack/trigger-schedule": "^18.3.0", "typescript": "^6.0.0", "vitest": "^4.1.10" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 122dacc..5128318 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,54 +9,54 @@ importers: .: dependencies: '@objectstack/connector-mcp': - specifier: ^18.2.0 - version: 18.2.0(zod@4.6.7) + specifier: ^18.3.0 + version: 18.3.0(zod@4.6.7) '@objectstack/connector-openapi': - specifier: ^18.2.0 - version: 18.2.0 + specifier: ^18.3.0 + version: 18.3.0 '@objectstack/connector-rest': - specifier: ^18.2.0 - version: 18.2.0 + specifier: ^18.3.0 + version: 18.3.0 '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) '@objectstack/platform-objects': - specifier: ^18.2.0 - version: 18.2.0 + specifier: ^18.3.0 + version: 18.3.0 '@objectstack/plugin-auth': - 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) '@objectstack/plugin-email': - specifier: ^18.2.0 - version: 18.2.0 + specifier: ^18.3.0 + version: 18.3.0 '@objectstack/plugin-security': - specifier: ^18.2.0 - version: 18.2.0 + specifier: ^18.3.0 + version: 18.3.0 '@objectstack/plugin-sharing': - specifier: ^18.2.0 - version: 18.2.0 + specifier: ^18.3.0 + version: 18.3.0 '@objectstack/service-automation': - 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) '@objectstack/service-job': - specifier: ^18.2.0 - version: 18.2.0 + specifier: ^18.3.0 + version: 18.3.0 '@objectstack/service-messaging': - specifier: ^18.2.0 - version: 18.2.0 + specifier: ^18.3.0 + version: 18.3.0 '@objectstack/trigger-schedule': - specifier: ^18.2.0 - version: 18.2.0 + specifier: ^18.3.0 + version: 18.3.0 typescript: specifier: ^6.0.0 version: 6.0.3 @@ -340,6 +340,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==} @@ -397,62 +406,62 @@ 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/connector-mcp@18.2.0': - resolution: {integrity: sha512-6cjFJd0V9G+TMXVn/Kfft0+htiKFYdauhJFusQBSqK54AH7wfMvqOGyyZDvMkpXGOkGR1B3jHuguPjEkmKy8Zw==} + '@objectstack/connector-mcp@18.3.0': + resolution: {integrity: sha512-J/O/yKw3k3zol86nkJ59S/pqjId2iQ1TTEMNWq61S2dj/j3/lGYdbkd5unhLBxIuIJiU7rkuMFnYlNbptIP0wQ==} engines: {node: '>=22.0.0'} - '@objectstack/connector-openapi@18.2.0': - resolution: {integrity: sha512-kQogvFyp5j26Ueckb4n6qFMtnEERS1/vOp25TXOjvjfH3fa8zfkcosPeQgj/K2irbel4lpLclFFl096nfNkN3g==} + '@objectstack/connector-openapi@18.3.0': + resolution: {integrity: sha512-lygK5BOlqngZevemcUB00Vc8OBvhJHtShHCjVVgZRYry/ktmhhc1ad9+BufPrKQwgTderEXMQKvY3+ZHmbs/yQ==} engines: {node: '>=22.0.0'} - '@objectstack/connector-rest@18.2.0': - resolution: {integrity: sha512-Ys/QDW3eO/Scmp5iD+BiMBnZPsMIGLFSAgETcDOw/RLgBzNRLUAoCQYWLodkqggxIQZlhVkIpjr3bJFGZyRXRQ==} + '@objectstack/connector-rest@18.3.0': + resolution: {integrity: sha512-SgtXpF4Fbs8iO7ePm20V6xslgirVZjuxanwm1wVYTvOsfqZlq52JPe0zPxavvRqPLf99cMpbOmAlgXWF3i/dMw==} 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 @@ -466,126 +475,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 @@ -594,44 +603,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 @@ -642,12 +651,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 @@ -655,24 +664,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.9': @@ -778,9 +787,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/chai@5.2.3': resolution: {integrity: sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA==} @@ -1006,6 +1012,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} @@ -1069,9 +1079,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'} @@ -1140,8 +1147,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 @@ -1358,8 +1365,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: @@ -1685,6 +1692,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==} @@ -1802,9 +1813,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'} @@ -1820,8 +1828,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: @@ -2118,9 +2126,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'} @@ -2154,6 +2159,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'} @@ -2518,6 +2527,12 @@ snapshots: dependencies: hono: 4.13.14 + '@hono/node-server@2.1.6(hono@4.13.14)': + dependencies: + hono: 4.13.14 + + '@isaacs/nonrecursive-glob-match@1.0.3': {} + '@jitl/quickjs-ffi-types@0.32.0': {} '@jitl/quickjs-wasmfile-debug-asyncify@0.32.0': @@ -2584,73 +2599,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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1)))': - 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) - '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) - '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) - '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) - '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) - '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1)))': + 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) '@oclif/core': 5.1.9 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: @@ -2699,22 +2714,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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1)))': + '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1)))': 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) - '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - '@aws-sdk/credential-providers' - '@better-auth/utils' @@ -2758,57 +2774,60 @@ snapshots: - vitest - vue - '@objectstack/connector-imap@18.2.0': {} + '@objectstack/connector-imap@18.3.0': {} - '@objectstack/connector-mcp@18.2.0(zod@4.6.7)': + '@objectstack/connector-mcp@18.3.0(zod@4.6.7)': dependencies: '@modelcontextprotocol/sdk': 1.32.2(zod@4.6.7) - '@objectstack/core': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - '@cfworker/json-schema' - ai - supports-color - zod - '@objectstack/connector-openapi@18.2.0': + '@objectstack/connector-openapi@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - ai - '@objectstack/connector-rest@18.2.0': + '@objectstack/connector-rest@18.3.0': dependencies: - '@objectstack/core': 18.2.0 - '@objectstack/spec': 18.2.0 + '@objectstack/core': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - ai - '@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: @@ -2821,12 +2840,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: @@ -2840,11 +2859,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 @@ -2861,18 +2880,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 @@ -2880,124 +2899,124 @@ snapshots: transitivePeerDependencies: - ai - '@objectstack/mcp@18.2.0': + '@objectstack/mcp@18.3.0': dependencies: '@modelcontextprotocol/sdk': 1.32.2(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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1)))': + '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1)))': 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.13)(kysely@0.29.5)(nanostores@1.5.2) '@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.13)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-auth@1.7.12(mongodb@7.6.0)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))))(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.13)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.5.0)(better-auth@1.7.12(mongodb@7.6.0)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))))(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.13)(kysely@0.29.5)(nanostores@1.5.2))(@better-auth/utils@0.5.0)(@better-fetch/fetch@1.3.2)(better-auth@1.7.12(mongodb@7.6.0)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))))(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)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) jose: 6.2.13 transitivePeerDependencies: @@ -3027,110 +3046,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.14) - '@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.14) + '@objectstack/core': 18.3.0 + '@objectstack/observability': 18.3.0 + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 hono: 4.13.14 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.5 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1)))': - 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) - '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1)))': + 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + '@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' @@ -3173,26 +3193,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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1)))': + '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1)))': 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) - '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + '@objectstack/spec': 18.3.0 + '@objectstack/types': 18.3.0 transitivePeerDependencies: - '@better-auth/utils' - '@better-fetch/fetch' @@ -3220,33 +3240,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 @@ -3259,82 +3279,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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1)))': + '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1)))': 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) - '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + '@objectstack/spec': 18.3.0 transitivePeerDependencies: - '@better-auth/utils' - '@better-fetch/fetch' @@ -3362,94 +3382,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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1)))': - 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) - '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) - '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) - '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) - '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1)))': + 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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + '@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.2)(vitest@4.1.11(vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1))) + '@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' @@ -3570,12 +3590,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/chai@5.2.3': dependencies: '@types/deep-eql': 4.0.2 @@ -3801,6 +3815,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 @@ -3853,8 +3871,6 @@ snapshots: cli-spinners@2.9.2: {} - code-block-writer@13.0.3: {} - color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -3904,10 +3920,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: {} @@ -4157,11 +4174,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: @@ -4400,6 +4417,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 @@ -4476,8 +4498,6 @@ snapshots: parseurl@1.3.3: {} - path-browserify@1.0.1: {} - path-expression-matcher@1.6.2: {} path-is-absolute@1.0.1: {} @@ -4486,7 +4506,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 @@ -4818,11 +4838,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 @@ -4858,6 +4873,8 @@ snapshots: uuid@8.3.2: {} + validate-npm-package-name@7.0.2: {} + vary@1.1.2: {} vite@8.2.2(esbuild@0.28.2)(tsx@4.23.15)(yaml@2.9.1): diff --git a/src/actions/catalog.actions.ts b/src/actions/catalog.actions.ts index 1aa086f..57c7bee 100644 --- a/src/actions/catalog.actions.ts +++ b/src/actions/catalog.actions.ts @@ -87,10 +87,10 @@ export const CatalogApplyAction = defineAction({ // of every per-unit reading, so the toast says how many and why, and the // result's `unanchored_owners` says who. Inherited by the twin below. outcomeMessages: { - created: 'Created ${result.created} duties. ${result.skipped} already existed and were skipped.', + created: 'Created {{ result.created }} duties. {{ result.skipped }} already existed and were skipped.', created_unanchored: - 'Created ${result.created} duties. ${result.unanchored} have no business unit, because none could be determined for their owner. ${result.skipped} already existed and were skipped.', - nothing_created: 'Nothing new: all ${result.skipped} duties already existed.', + 'Created {{ result.created }} duties. {{ result.unanchored }} have no business unit, because none could be determined for their owner. {{ result.skipped }} already existed and were skipped.', + nothing_created: 'Nothing new: all {{ result.skipped }} duties already existed.', }, params: [ { diff --git a/src/pages/member.page.ts b/src/pages/member.page.ts index 1139629..e178e95 100644 --- a/src/pages/member.page.ts +++ b/src/pages/member.page.ts @@ -147,8 +147,9 @@ import { definePage } from '@objectstack/spec/ui'; * error, and "showing who assigned each" is the one line of this card that * is not fully delivered. Recorded on the issue and filed upstream. * - * **§5 — Opening a person does NOT land here; plugin-auth's default wins** - * (objectstack#28979; on 17.2 it was objectui#7298). + * **§5 — Opening a person lands here only because of `apps`** + * (objectstack#28979, shipped in 18.3 as `PageSchema.apps`; on 17.2 it was + * objectui#7298). * `@objectstack/platform-objects` ships `sys_user_detail` * (`type: 'record'`, `object: 'sys_user'`, `isDefault: true`). On 17.2 the * console chose between the two pages by list order, and this page happened @@ -168,9 +169,22 @@ import { definePage } from '@objectstack/spec/ui'; * "⋯" menu. It is not on the People row menu, because 18.2 runs a row * url action with no record in context. That is one click more than it * should be, labelled a stopgap, and deleted when #28979 lands. - * `isDefault` stays `false`. `test/member-page.test.ts` mirrors the - * console's rule and pins that a person resolves to `sys_user_detail` - * today, so the day that changes is a red test, not a silent one. + * `isDefault` stays `false`. + * → FROM 18.3: `apps: ['duly_app']`. A record page that names an app opens + * for its object inside that app, before the object's default; everywhere + * else, Setup → Users included, `sys_user_detail` still opens. Measured on + * 18.3.0 against a live `pnpm demo`, en and zh: Duly > People > a person + * opens this page in the record drawer, and Setup → Users opens + * `sys_user_detail`. It is also the ONLY entry on 18.3: the console no + * longer renders `duly_member_open` in the person's header menu. Removing + * that stopgap is its own card. + * ⚠️ Known 18.3 limit: the drawer's "Open full page", and the explicit + * `/page/duly_member` route, answer 400. The record-page request refuses + * a related list over a `user` field (`duly_task.owner`), because the + * REST route accepts only lookup and master_detail + * (objectstack#29946). The drawer renders every region. + * `test/member-page.test.ts` mirrors the console's rule and pins both + * answers, in the app and outside it. * * **§7 — The auto-appended discussion panel cannot be declined by a page, and * it carries a comment box** (objectui#7298, the second instance there). Found in the browser, not in the schema. @@ -223,6 +237,11 @@ export const MemberPage = definePage({ // already declares `isDefault: true` for this object, and from 18 on a // second default refuses the boot (DEFAULT_RECORD_PAGE_CONFLICT). isDefault: false, + // The app slot, not the deployment default (gap §5, objectstack#28979): + // inside Duly a person opens this page; Setup → Users keeps + // `sys_user_detail`. An app NAME (`AppSchema.name`), never the route's + // package-id segment. + apps: ['duly_app'], regions: [ // ── 1. Header — who this is ─────────────────────────────────────────── diff --git a/src/translations/authored-text.ts b/src/translations/authored-text.ts index 014193c..6a123fe 100644 --- a/src/translations/authored-text.ts +++ b/src/translations/authored-text.ts @@ -78,15 +78,13 @@ import { TRANSLATABLE_METADATA_TYPES } from '@objectstack/spec/system'; * `objects..fields..help`. So `help` is the bundle * slot for an authored field `description`, which is why * the key builder below spells it that way. - * translateAction label / confirmText / successMessage only. `description` - * and `params.*` are declared by `TranslationItemSchema`, - * and `@objectstack/rest`'s `validateTranslationReferences` - * lints their KEYS — but `translateAction` applies neither. - * They are authored anyway, for the same reason the gantt's - * `viewMode` stays authored in `src/views/task.view.ts`: - * the key is the spec's own, it is served to API and MCP - * callers, and it starts rendering the moment the resolver - * is fixed. Filed upstream; see the PR body. + * translateAction label / confirmText / successMessage, and from 18.3 + * also `description`, `outcomeMessages.` and each + * param's `label` / `helpText` / `placeholder`, read at the + * same `objects.._actions.` / `globalActions.` + * addresses this repo already authored (on 17.2 it applied + * only the first three; the others were authored ahead of + * the resolver, and 18.3's `translateAction` now reads them). * translateApp app label / description, and each navigation node's * label addressed by its stable `id`, at any tree depth. * translateDashboard dashboard label / description, widget title / @@ -497,6 +495,7 @@ const VERDICTS: Readonly> = { 'page.kind': machine('page override mode'), 'page.template': machine('layout template name'), 'page.object': machine('bound object'), + 'page.apps[]': machine('app names whose routes open this record page (objectstack#28979)'), 'page.label': translate((c) => (id(c) ? ['pages', id(c)!, 'label'] : undefined)), 'page.description': translate((c) => (id(c) ? ['pages', id(c)!, 'description'] : undefined)), 'page.regions[].name': machine('layout region name'), @@ -550,7 +549,13 @@ const VERDICTS: Readonly> = { // under `globalActions`. `validateTranslationReferences` refuses the wrong // one of the two explicitly, so the branch below is the platform's rule. 'action.label': translate((c) => actionKey(c, 'label')), - 'action.description': translate((c) => actionKey(c, 'description')), + // `description`, each param's `helpText` and each `outcomeMessages` entry + // are template slots from 18.3 (`action-dialog-outcome-copy-template-holes`), + // like `successMessage` from 18.2: the sentence sits at `.source`, and the + // bundle key stays the action's own `description` / `outcomeMessages.` / + // `params.

.helpText`, which is where 18.3's `translateAction` reads it. + 'action.description.source': translate((c) => actionKey(c, 'description')), + 'action.description.dialect': machine('template dialect'), 'action.confirmText': translate((c) => actionKey(c, 'confirmText')), // A template slot from 18.2, like a bulk action's `confirmText`: the sentence // sits at `.source` and keeps the action's own `successMessage` key. @@ -558,14 +563,17 @@ const VERDICTS: Readonly> = { 'action.successMessage.dialect': machine('template dialect'), // Success copy per handler outcome (#179). The bundle address is the // action's own entry, `outcomeMessages.`, the key the platform's - // translation-reference check names; the outcome is the last path segment. - 'action.outcomeMessages{}': translate((c) => { - const outcome = c.path[c.path.length - 1]; + // translation-reference check names; the outcome is the segment above the + // envelope's `.source`. + 'action.outcomeMessages{}.source': translate((c) => { + const [mapKey, outcome] = c.path; const base = actionKey(c, 'outcomeMessages'); - return outcome && base ? [...base, outcome] : undefined; + return mapKey === 'outcomeMessages' && outcome && base ? [...base, outcome] : undefined; }), + 'action.outcomeMessages{}.dialect': machine('template dialect'), 'action.params[].label': translate((c) => actionParamKey(c, 'label')), - 'action.params[].helpText': translate((c) => actionParamKey(c, 'helpText')), + 'action.params[].helpText.source': translate((c) => actionParamKeyAt(c, 'helpText')), + 'action.params[].helpText.dialect': machine('template dialect'), 'action.params[].placeholder': translate((c) => actionParamKey(c, 'placeholder')), 'action.name': machine('action name'), 'action.objectName': machine('bound object'), @@ -779,6 +787,16 @@ function actionParamKey(ctx: KeyContext, leaf: string): readonly string[] | unde return param && base ? [...base, param, leaf] : undefined; } +/** A param's template slot (`helpText.source`) sits inside the envelope, so the param is found by its index. */ +function actionParamKeyAt(ctx: KeyContext, leaf: string): readonly string[] | undefined { + const [paramsKey, paramIndex] = ctx.path; + const params = ctx.ids.params; + if (paramsKey !== 'params' || !Array.isArray(params) || paramIndex === undefined) return undefined; + const param = str((params[Number(paramIndex)] as Rec | undefined)?.name); + const base = actionKey(ctx, 'params'); + return param && base ? [...base, param, leaf] : undefined; +} + // ─── The walk ──────────────────────────────────────────────────────────── /** diff --git a/src/translations/zh-CN.ts b/src/translations/zh-CN.ts index e62bbce..121f451 100644 --- a/src/translations/zh-CN.ts +++ b/src/translations/zh-CN.ts @@ -518,10 +518,10 @@ export const dulyChinese = defineTranslationBundle({ description: '为选中的每个人创建这个岗位应尽的职责。可以放心重复执行——已经从职责库条目获得过职责的人会被跳过,不会重复创建。', // 操作完成后的提示,按处理器返回的 outcome 选取(#179)。 outcomeMessages: { - created: '已创建 ${result.created} 条职责。${result.skipped} 条已存在,已跳过。', + created: '已创建 {{ result.created }} 条职责。{{ result.skipped }} 条已存在,已跳过。', created_unanchored: - '已创建 ${result.created} 条职责。其中 ${result.unanchored} 条没有业务单元,因为无法确定负责人所属的业务单元。${result.skipped} 条已存在,已跳过。', - nothing_created: '没有新职责:全部 ${result.skipped} 条都已存在。', + '已创建 {{ result.created }} 条职责。其中 {{ result.unanchored }} 条没有业务单元,因为无法确定负责人所属的业务单元。{{ result.skipped }} 条已存在,已跳过。', + nothing_created: '没有新职责:全部 {{ result.skipped }} 条都已存在。', }, params: { position_code: { @@ -833,10 +833,10 @@ export const dulyChinese = defineTranslationBundle({ description: '为选中的每个人创建这个岗位应尽的职责。可以放心重复执行——已经从职责库条目获得过职责的人会被跳过,不会重复创建。', // 操作完成后的提示,按处理器返回的 outcome 选取(#179)。 outcomeMessages: { - created: '已创建 ${result.created} 条职责。${result.skipped} 条已存在,已跳过。', + created: '已创建 {{ result.created }} 条职责。{{ result.skipped }} 条已存在,已跳过。', created_unanchored: - '已创建 ${result.created} 条职责。其中 ${result.unanchored} 条没有业务单元,因为无法确定负责人所属的业务单元。${result.skipped} 条已存在,已跳过。', - nothing_created: '没有新职责:全部 ${result.skipped} 条都已存在。', + '已创建 {{ result.created }} 条职责。其中 {{ result.unanchored }} 条没有业务单元,因为无法确定负责人所属的业务单元。{{ result.skipped }} 条已存在,已跳过。', + nothing_created: '没有新职责:全部 {{ result.skipped }} 条都已存在。', }, params: { position_code: { diff --git a/test/catalog-apply-unit.test.ts b/test/catalog-apply-unit.test.ts index ac43fb8..4be5a42 100644 --- a/test/catalog-apply-unit.test.ts +++ b/test/catalog-apply-unit.test.ts @@ -177,17 +177,23 @@ describe('Apply catalog on the demo organisation (#179)', () => { describe('the toast the console shows for each outcome', () => { const OUTCOMES: CatalogApplyOutcome[] = ['created', 'created_unanchored', 'nothing_created']; const RESULT_KEYS = new Set(['created', 'skipped', 'unanchored']); + /** A `{{ result. }}` hole, the only spelling a template slot reads. */ + const HOLE = /\{\{\s*result\.(\w+)\s*\}\}/g; for (const name of [CATALOG_APPLY_ACTION, CATALOG_APPLY_TO_PEOPLE_ACTION]) { it(`${name} declares one message per outcome, each reading only real result keys`, () => { - const action = dulyActions.find((candidate) => candidate.name === name) as { outcomeMessages?: Record }; + // A template slot from 18.3: each entry parses to `{ dialect, source }`. + const action = dulyActions.find((candidate) => candidate.name === name) as { + outcomeMessages?: Record; + }; expect(Object.keys(action.outcomeMessages ?? {}).sort()).toEqual([...OUTCOMES].sort()); for (const message of Object.values(action.outcomeMessages ?? {})) { - for (const [, key] of message.matchAll(/\$\{result\.(\w+)\}/g)) { - expect(RESULT_KEYS.has(key as keyof CatalogApplyResult), `${name}: \${result.${key}}`).toBe(true); + expect(message.dialect).toBe('template'); + for (const [, key] of message.source.matchAll(HOLE)) { + expect(RESULT_KEYS.has(key as keyof CatalogApplyResult), `${name}: {{ result.${key} }}`).toBe(true); } } - expect(action.outcomeMessages?.created_unanchored).toContain('${result.unanchored}'); + expect(action.outcomeMessages?.created_unanchored?.source).toContain('{{ result.unanchored }}'); }); } @@ -198,10 +204,13 @@ describe('the toast the console shows for each outcome', () => { bundle.objects?.duly_catalog_item?._actions?.[CATALOG_APPLY_TO_PEOPLE_ACTION]?.outcomeMessages, ]; const en = (dulyActions.find((candidate) => candidate.name === CATALOG_APPLY_ACTION) as any).outcomeMessages; - const placeholders = (text: string) => [...text.matchAll(/\$\{result\.\w+\}/g)].map((m) => m[0]).sort(); + const placeholders = (text: string) => [...text.matchAll(HOLE)].map((m) => m[1]).sort(); for (const messages of zh) { expect(Object.keys(messages ?? {}).sort()).toEqual([...OUTCOMES].sort()); - for (const outcome of OUTCOMES) expect(placeholders(messages[outcome])).toEqual(placeholders(en[outcome])); + for (const outcome of OUTCOMES) { + expect(placeholders(messages[outcome]).length).toBeGreaterThan(0); + expect(placeholders(messages[outcome])).toEqual(placeholders(en[outcome].source)); + } } }); }); diff --git a/test/email-templates.test.ts b/test/email-templates.test.ts index 5a138bf..0efc748 100644 --- a/test/email-templates.test.ts +++ b/test/email-templates.test.ts @@ -422,8 +422,7 @@ const DELIVERY_TERMINAL = new Set(['success', 'failed', 'dead']); /** * The recipient's language is read per recipient, after fan-out, off * `sys_user.locale` (falling back to the deployment default), and handed to - * the resolver — which matches it exactly, then tries the literal `en-US` - * floor, and stops. `sys_user.locale` is free-text BCP-47 the user can edit; + * the resolver. `sys_user.locale` is free-text BCP-47 the user can edit; * it is NOT constrained to `i18n.supportedLocales`. * * Measured on @objectstack 18.2.0 with the English rows tagged `en`, through @@ -433,9 +432,16 @@ const DELIVERY_TERMINAL = new Set(['success', 'failed', 'dead']); * delivery row's status as well as on the inbox body: a dead letter is not a * thrown error anywhere a flow run can see, and the run reports success. * - * `zh` and `zh-TW` land on ENGLISH, not on the zh-CN row. That is what the - * platform gives today — there is no subtag folding — and it is pinned so the - * day the resolver learns to fold, this goes red and says so. + * On 18.2.0 the resolver matched exactly, then tried the literal `en-US` + * floor, and stopped, so `zh` and `zh-TW` landed on ENGLISH. That was pinned + * so the day the resolver learned to fold, this would go red and say so. + * + * It did, on 18.3.0 (objectstack#28880): the built-in loader now folds the + * recipient's tag against the template's own locales by the platform's + * BCP-47 rules — exact, case-insensitive, base language (`en-GB` → `en`), + * then variant expansion (`zh` / `zh-TW` → `zh-CN`) — before the stack's + * declared fallback and the `en-US` floor. So `zh` and `zh-TW` now read the + * Chinese row; a language the app never authored still gets English. */ describe('a recipient whose locale no row lists gets the en-US floor, not a dead letter', () => { const ENGLISH = `This is now on your list. Due ${utcDay(7)}.`; @@ -444,8 +450,8 @@ describe('a recipient whose locale no row lists gets the en-US floor, not a dead /** user id → `sys_user.locale`, and the body that user must receive. */ const RECIPIENTS: { id: string; locale: string; body: string }[] = [ { id: 'user_fr', locale: 'fr-FR', body: ENGLISH }, // a language the app never authored - { id: 'user_zh_tw', locale: 'zh-TW', body: ENGLISH }, // no folding to zh-CN - { id: 'user_zh', locale: 'zh', body: ENGLISH }, // ditto, bare language subtag + { id: 'user_zh_tw', locale: 'zh-TW', body: CHINESE }, // folds to zh-CN (18.3, objectstack#28880) + { id: 'user_zh', locale: 'zh', body: CHINESE }, // ditto, bare language subtag { id: 'user_en_us', locale: 'en-US', body: ENGLISH }, // the floor, matched exactly { id: 'user_en_gb', locale: 'en-GB', body: ENGLISH }, { id: 'user_en', locale: 'en', body: ENGLISH }, // the app's own tag: exact miss, then floor diff --git a/test/i18n-coverage.test.ts b/test/i18n-coverage.test.ts index 3a23978..df69c60 100644 --- a/test/i18n-coverage.test.ts +++ b/test/i18n-coverage.test.ts @@ -308,12 +308,16 @@ describe('the bundles reach the stack', () => { // translator. Re-derived: all four paths are `translate` now, keyed // `positions.` and `permissions.`, and zh-CN carries them. // This app declares no report, so `report` moves nothing. + // + // `book` arrived in 18.3.0. Re-derived, nothing moves: this app declares + // no book, and no `untranslatable` verdict in the walk rests on books + // being absent. So the pin widens with no verdict to revisit. expect( [...PLATFORM_TRANSLATABLE_TYPES].sort(), 'the platform\'s translatable metadata types changed — re-derive the ' + '`untranslatable` verdicts in src/translations/authored-text.ts against the new set', ).toEqual([ - 'action', 'app', 'dashboard', 'dataset', 'object', 'page', 'permission', 'picklist', 'position', 'report', 'view', + 'action', 'app', 'book', 'dashboard', 'dataset', 'object', 'page', 'permission', 'picklist', 'position', 'report', 'view', ]); }); }); diff --git a/test/member-page.test.ts b/test/member-page.test.ts index fbeeda5..d2a9dad 100644 --- a/test/member-page.test.ts +++ b/test/member-page.test.ts @@ -136,55 +136,78 @@ describe('duly_member — wiring', () => { }); }); -// ─── Which page opening a person lands on (#113) ───────────────────────── +// ─── Which page opening a person lands on (#113, objectstack#28979) ─────── /** - * The console's record-page choice, copied from `@objectstack/console` 18.2.0 - * (`usePageAssignment`, framework chunk) and measured live on `pnpm demo`: + * The console's record-page choice from `@objectstack/console` 18.3.0 + * (`usePageAssignment`, which now reads the app the record is opened in), as + * the platform states it on `PageSchema.apps` and measured live on + * `pnpm demo`, en and zh: * - * candidates.find((p) => defaultRecordPageObject(p) === object) ?? candidates[0] + * candidates.find((p) => defaultRecordPageObject(p, app) === object) // the app's page + * ?? candidates.find((p) => defaultRecordPageObject(p) === object) // the deployment default + * ?? candidates[0] * - * where `candidates` are the served record pages bound to `object`, in - * `/api/v1/meta/page` order. The `isDefault` page wins; list order only breaks - * the case where no page claims the default. + * where `candidates` are the served record pages bound to `object`, and `app` + * is the NAME of the app the route resolves to (`duly_app` for + * `/apps/ai.objectstack.duly/...`; Setup is another app, and names no page + * here). On 18.2 the first line did not exist and a person opened + * `sys_user_detail` everywhere. * * This is a COPY of a rule that lives in the console bundle, and a copy cannot - * see the console change. What it can see is the two inputs that are on disk: - * our page's `isDefault` and plugin-auth's. Re-measure the rule in the browser - * after every platform upgrade (open one person from People) and update this - * copy with what you find. 17.2 resolved by list order alone, which is why the - * original card asked for a "first in the list" pin; on 18.2 that pin would - * pass while the member page was unreachable. + * see the console change. What it can see is the inputs on disk: our page's + * `apps` and `isDefault`, and plugin-auth's. Re-measure the rule in the + * browser after every platform upgrade (open one person from People) and + * update this copy with what you find. */ -const resolveRecordPage = (pages: readonly unknown[], object: string): string | undefined => { +const resolveRecordPage = (pages: readonly unknown[], object: string, app?: string): string | undefined => { const candidates = (pages as Rec[]).filter( (candidate) => (candidate.type ?? 'record') === 'record' && candidate.object === object, ); - const chosen = candidates.find((candidate) => defaultRecordPageObject(candidate) === object) ?? candidates[0]; + const chosen = + (app === undefined ? undefined : candidates.find((candidate) => defaultRecordPageObject(candidate, app) === object)) + ?? candidates.find((candidate) => defaultRecordPageObject(candidate) === object) + ?? candidates[0]; return chosen?.name as string | undefined; }; -describe('duly_member — what opening a person resolves to (#113)', () => { +describe('duly_member — what opening a person resolves to (#113, objectstack#28979)', () => { // Served order, as measured: the app's pages ahead of plugin-auth's. const served = [...(dulyPages as unknown[]), SysUserDetailPage]; + const appName = ((dulyApps as Rec[])[0] as { name: string }).name; it('plugin-auth still ships its own default record page for sys_user', () => { - // The input that decides the outcome. If this flips, re-measure: the member - // page may be reachable by the plain record route again. + // The input that decides the outcome outside Duly. If this flips, + // re-measure Setup → Users. expect(defaultRecordPageObject(SysUserDetailPage)).toBe('sys_user'); }); - it('on 18.2 a person opens sys_user_detail, NOT duly_member', () => { - // The regression this card found, stated rather than hidden. duly_member is - // first in the served list and still loses: no key on PageSchema lets an - // app outrank another package's default (gap §5). + it('names exactly the Duly app, by its app name', () => { + // An app NAME, never the route's package-id segment: the console resolves + // the segment to its app and compares the name. A typo here is not + // refused anywhere; it silently opens sys_user_detail again. + expect(appName).toBe('duly_app'); + expect(page.apps).toEqual([appName]); + expect(defaultRecordPageObject(MemberPage, appName)).toBe('sys_user'); + }); + + it('inside Duly a person opens duly_member', () => { + expect(resolveRecordPage(served, 'sys_user', appName)).toBe('duly_member'); + }); + + it('outside Duly (Setup → Users) a person still opens sys_user_detail', () => { + // The default slot is untouched: Setup keeps its admin page (set password, + // ban, impersonate). `apps` is what made that possible; a second + // `isDefault` would have taken Setup too, and refuses the boot. expect(resolveRecordPage(served, 'sys_user')).toBe('sys_user_detail'); + expect(resolveRecordPage(served, 'sys_user', 'setup')).toBe('sys_user_detail'); }); - it('control: without the platform default, the same rule picks duly_member', () => { - // So the pin above is measuring plugin-auth's default, not a rule that - // could never pick our page. - expect(resolveRecordPage(dulyPages as unknown[], 'sys_user')).toBe('duly_member'); + it('control: without `apps`, Duly would open sys_user_detail too', () => { + // So the pin above is measuring `apps`, not a rule that always picks our + // page. + const { apps: _apps, ...unscoped } = page; + expect(resolveRecordPage([unscoped, SysUserDetailPage], 'sys_user', appName)).toBe('sys_user_detail'); }); });