From 105ee156f4fe0556cc6764e5b9c2134956c5f010 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 11 Aug 2026 04:34:18 +0000 Subject: [PATCH] chore: version packages (rc) --- .changeset/pre.json | 23 + examples/app-crm/CHANGELOG.md | 20 + examples/app-crm/package.json | 2 +- examples/app-showcase/CHANGELOG.md | 27 + examples/app-showcase/package.json | 2 +- examples/app-todo/CHANGELOG.md | 30 + examples/app-todo/package.json | 2 +- examples/embed-objectql/CHANGELOG.md | 22 + examples/embed-objectql/package.json | 2 +- packages/adapters/hono/CHANGELOG.md | 11 + packages/adapters/hono/package.json | 2 +- packages/apps/account/CHANGELOG.md | 18 + packages/apps/account/package.json | 2 +- packages/apps/setup/CHANGELOG.md | 18 + packages/apps/setup/package.json | 2 +- packages/apps/studio/CHANGELOG.md | 18 + packages/apps/studio/package.json | 2 +- packages/cli/CHANGELOG.md | 167 ++++++ packages/cli/package.json | 2 +- packages/client-react/CHANGELOG.md | 19 + packages/client-react/package.json | 2 +- packages/client/CHANGELOG.md | 89 +++ packages/client/package.json | 2 +- packages/cloud-connection/CHANGELOG.md | 22 + packages/cloud-connection/package.json | 2 +- .../connectors/connector-mcp/CHANGELOG.md | 18 + .../connectors/connector-mcp/package.json | 2 +- .../connectors/connector-openapi/CHANGELOG.md | 18 + .../connectors/connector-openapi/package.json | 2 +- .../connectors/connector-rest/CHANGELOG.md | 18 + .../connectors/connector-rest/package.json | 2 +- .../connectors/connector-slack/CHANGELOG.md | 18 + .../connectors/connector-slack/package.json | 2 +- packages/console/CHANGELOG.md | 2 + packages/console/package.json | 2 +- packages/core/CHANGELOG.md | 17 + packages/core/package.json | 2 +- packages/create-objectstack/CHANGELOG.md | 2 + packages/create-objectstack/package.json | 2 +- packages/drivers/driver-memory/CHANGELOG.md | 20 +- packages/drivers/driver-memory/package.json | 2 +- packages/drivers/driver-mongodb/CHANGELOG.md | 21 +- packages/drivers/driver-mongodb/package.json | 2 +- packages/drivers/driver-sql/CHANGELOG.md | 22 +- packages/drivers/driver-sql/package.json | 2 +- .../drivers/driver-sqlite-wasm/CHANGELOG.md | 21 +- .../drivers/driver-sqlite-wasm/package.json | 2 +- packages/drivers/driver-turso/CHANGELOG.md | 21 +- packages/drivers/driver-turso/package.json | 2 +- packages/formula/CHANGELOG.md | 17 + packages/formula/package.json | 2 +- packages/lint/CHANGELOG.md | 65 ++- packages/lint/package.json | 2 +- packages/mcp/CHANGELOG.md | 20 + packages/mcp/package.json | 2 +- packages/metadata-core/CHANGELOG.md | 17 + packages/metadata-core/package.json | 2 +- packages/metadata-fs/CHANGELOG.md | 6 + packages/metadata-fs/package.json | 2 +- packages/metadata-protocol/CHANGELOG.md | 112 ++++ packages/metadata-protocol/package.json | 2 +- packages/metadata/CHANGELOG.md | 22 + packages/metadata/package.json | 2 +- packages/objectql/CHANGELOG.md | 296 +++++++++- packages/objectql/package.json | 2 +- packages/observability/CHANGELOG.md | 17 + packages/observability/package.json | 2 +- packages/platform-objects/CHANGELOG.md | 18 + packages/platform-objects/package.json | 2 +- packages/plugins/embedder-openai/CHANGELOG.md | 17 + packages/plugins/embedder-openai/package.json | 2 +- .../plugins/knowledge-memory/CHANGELOG.md | 19 + .../plugins/knowledge-memory/package.json | 2 +- .../plugins/knowledge-ragflow/CHANGELOG.md | 19 + .../plugins/knowledge-ragflow/package.json | 2 +- .../plugins/plugin-approvals/CHANGELOG.md | 22 + .../plugins/plugin-approvals/package.json | 2 +- packages/plugins/plugin-audit/CHANGELOG.md | 23 + packages/plugins/plugin-audit/package.json | 2 +- packages/plugins/plugin-auth/CHANGELOG.md | 22 + packages/plugins/plugin-auth/package.json | 2 +- packages/plugins/plugin-dev/CHANGELOG.md | 37 ++ packages/plugins/plugin-dev/package.json | 2 +- packages/plugins/plugin-email/CHANGELOG.md | 20 + packages/plugins/plugin-email/package.json | 2 +- .../plugins/plugin-hono-server/CHANGELOG.md | 20 + .../plugins/plugin-hono-server/package.json | 2 +- .../plugins/plugin-pinyin-search/CHANGELOG.md | 13 + .../plugins/plugin-pinyin-search/package.json | 2 +- packages/plugins/plugin-reports/CHANGELOG.md | 19 + packages/plugins/plugin-reports/package.json | 2 +- packages/plugins/plugin-security/CHANGELOG.md | 122 ++++ packages/plugins/plugin-security/package.json | 2 +- packages/plugins/plugin-sharing/CHANGELOG.md | 25 + packages/plugins/plugin-sharing/package.json | 2 +- packages/plugins/plugin-webhooks/CHANGELOG.md | 19 + packages/plugins/plugin-webhooks/package.json | 2 +- packages/qa/dogfood/CHANGELOG.md | 40 ++ packages/qa/dogfood/package.json | 2 +- packages/qa/downstream-contract/CHANGELOG.md | 17 + packages/qa/downstream-contract/package.json | 2 +- packages/qa/http-conformance/CHANGELOG.md | 6 + packages/qa/http-conformance/package.json | 2 +- packages/rest/CHANGELOG.md | 76 +++ packages/rest/package.json | 2 +- packages/runtime/CHANGELOG.md | 204 +++++++ packages/runtime/package.json | 2 +- packages/sdui-parser/CHANGELOG.md | 2 + packages/sdui-parser/package.json | 2 +- .../services/service-analytics/CHANGELOG.md | 21 +- .../services/service-analytics/package.json | 2 +- .../services/service-automation/CHANGELOG.md | 113 ++++ .../services/service-automation/package.json | 2 +- packages/services/service-cache/CHANGELOG.md | 19 + packages/services/service-cache/package.json | 2 +- .../service-cluster-redis/CHANGELOG.md | 18 + .../service-cluster-redis/package.json | 2 +- .../services/service-cluster/CHANGELOG.md | 18 + .../services/service-cluster/package.json | 2 +- .../services/service-datasource/CHANGELOG.md | 19 + .../services/service-datasource/package.json | 2 +- packages/services/service-i18n/CHANGELOG.md | 19 + packages/services/service-i18n/package.json | 2 +- packages/services/service-job/CHANGELOG.md | 44 ++ packages/services/service-job/package.json | 2 +- .../services/service-knowledge/CHANGELOG.md | 18 + .../services/service-knowledge/package.json | 2 +- .../services/service-messaging/CHANGELOG.md | 20 + .../services/service-messaging/package.json | 2 +- .../services/service-package/CHANGELOG.md | 19 + .../services/service-package/package.json | 2 +- packages/services/service-queue/CHANGELOG.md | 19 + packages/services/service-queue/package.json | 2 +- .../services/service-realtime/CHANGELOG.md | 19 + .../services/service-realtime/package.json | 2 +- .../services/service-settings/CHANGELOG.md | 20 + .../services/service-settings/package.json | 2 +- packages/services/service-sms/CHANGELOG.md | 19 + packages/services/service-sms/package.json | 2 +- .../services/service-storage/CHANGELOG.md | 21 + .../services/service-storage/package.json | 2 +- packages/spec/CHANGELOG.md | 534 +++++++++++++++++- packages/spec/package.json | 2 +- packages/triggers/trigger-api/CHANGELOG.md | 18 + packages/triggers/trigger-api/package.json | 2 +- .../trigger-record-change/CHANGELOG.md | 18 + .../trigger-record-change/package.json | 2 +- .../triggers/trigger-schedule/CHANGELOG.md | 18 + .../triggers/trigger-schedule/package.json | 2 +- packages/types/CHANGELOG.md | 17 + packages/types/package.json | 2 +- packages/verify/CHANGELOG.md | 38 ++ packages/verify/package.json | 2 +- 153 files changed, 3148 insertions(+), 87 deletions(-) diff --git a/.changeset/pre.json b/.changeset/pre.json index 5e49118ff1..681292df24 100644 --- a/.changeset/pre.json +++ b/.changeset/pre.json @@ -188,6 +188,7 @@ "adr0104-attest-after-boot-writes", "adr0104-lax-deviation-marker", "adr0120-isolated-install-gate-and-truth-sweep", + "after-hook-in-transaction-semantics", "agent-code-is-the-record", "agent-knowledge-alias-and-experimental-markers", "agents-md-worktree-staleness", @@ -344,6 +345,7 @@ "authz-ledger-flow-runas", "auto-org-admin-revoke-delete-signature", "automation-client-resume-screen-flow", + "automation-descriptor-query-refusal", "automation-resume-authority-gate", "automation-runs-query-param-refusal", "autonumber-builder-readonly", @@ -393,6 +395,7 @@ "capabilities-registry-provenance-seam", "capability-metadata-kind-registry-entry", "cel-classify-error-by-code", + "cel-default-temporal-storage-shape", "cel-overload-retry-operand-scope", "cel-overload-retry-structured-code", "cel-parse-fault-kind", @@ -559,6 +562,7 @@ "decision-outputs-surface-3447", "declarative-cron-job-schedule-envelope", "declarative-endpoints-docs-skill-catchup", + "declare-public-picker", "declare-publish-meta-item-response", "declared-unique-index-not-legacy", "default-agent-value-lint", @@ -571,8 +575,10 @@ "degraded-register-cause", "degraded-suspended-run-load-log-cause-meta", "delegable-scope-read-surface", + "delete-cascade-one-unit-of-work", "delete-fallback-success-shape", "delete-many-id-predicate", + "delete-meta-item-rewrap-carries-code", "delete-restricted-user-copy", "delivery-payload-severity-closed-union", "department-approver-env-wide-business-unit", @@ -693,6 +699,7 @@ "email-persistence-insert-id-contract", "email-provider-smtp", "email-template-materializer-bridge", + "embedded-action-crossref-validation", "embedded-host-unsealed-node-type-vocabulary-warns", "empty-capability-answers-501", "empty-env-disabled-package-seed", @@ -848,6 +855,7 @@ "group-union-driver-scope", "groupby-alias-multi-face", "grouping-notify-describe-align", + "groups-fold-reaches-stored-rows", "guard-refusal-chokepoint", "handwritten-errmap-fix-before-history", "has-is-not-a-null-guard-lint", @@ -954,6 +962,7 @@ "job-placeholder-migrates-to-db-adapter", "job-queue-completed-retention", "job-retry-timeout-3494", + "job-run-degraded-status", "job-runtime-create-closed", "json-schema-rule-format-enforced", "json-schema-rule-unknown-format-gate", @@ -1010,6 +1019,7 @@ "lint-visibility-bare-identifier-gate", "lint-visibility-predicate-syntax-gate", "list-column-prefix-summary-object", + "list-runs-status-filter", "list-single-flight", "listcommits-outage-503", "liveness-evidence-path-resolution", @@ -1022,6 +1032,7 @@ "liveness-readme-table-gated", "liveness-register-orphan-proofs", "liveness-stale-evidence-fails-ci", + "liveness-state-counts-generated", "liveness-ten-preview-claims", "liveness-verified-at-clock", "liveness-widget-drill-and-container-coverage", @@ -1033,6 +1044,7 @@ "login-json-refuses-non-interactive", "lost-audit-row-is-an-error", "loud-pausing-resume-authority", + "lower-callables-functions-passthrough", "lucky-buttons-shave", "lucky-moons-smoke", "lucky-pandas-repeat", @@ -1105,6 +1117,7 @@ "migrate-plan-lists-datetime-convergence", "migrate-search-companion-parity", "migration-journal-boot-recovery", + "migration-registry-per-entry-files", "milestone-summary-lookup-titles", "missing-table-column-of-relation", "mixed-wrapper-refusal", @@ -1115,10 +1128,12 @@ "name-shaped-log-splice-sweep", "naming-drift-recheck", "nav-access-lint", + "nav-declared-empty-group-dropped", "nav-expanded-alias-cross-variant", "nav-item-input-type", "nav-runaction-declared-contract", "nested-plugin-collection-registration", + "nested-plugin-view-container-expansion", "next-event-seq-read-failure-loud", "node-and-shutdown-timeout-guards-cleared", "notification-action-embed-config-retired", @@ -1173,6 +1188,7 @@ "org-overlay-registry-gate", "org-scoped-cold-boot-audit", "org-scoped-write-refused", + "os-test-glob-lazy-walk", "osv-batch-2026-07-dep-bumps", "osv-batch-2026-08-fixable-bumps", "osv-exemption-conventions", @@ -1197,6 +1213,8 @@ "patch-path-id-wins-over-body-id", "per-package-typecheck-coverage", "permission-backfill-row-state-columns", + "permission-denied-error-single-declaration", + "permission-denied-user-copy", "permission-set-projection-d5r-jsdoc", "pin-control-flow-designer-forms", "platform-always-on-capabilities", @@ -1365,6 +1383,7 @@ "retire-data-engine-batch", "retire-default-dispatcher-routes", "retire-degraded-analytics-shim", + "retire-delete-by-id-before-hook-repoint", "retire-delete-fetch-previous-builtin", "retire-dev-analytics-stub", "retire-dev-service-marker", @@ -1392,6 +1411,7 @@ "rls-predicate-authoring-gate", "rls-predicate-over-budget", "rls-priority-removed", + "rls-using-tsdoc-grammar-rewrite", "root-reference-index-generated", "route-audit-tranche-3-service-mounts", "route-envelope-four-more-modules", @@ -1448,6 +1468,7 @@ "searchable-fields-formula-refused", "searchable-fields-stale-declaration", "searchable-fields-stored-hint", + "security-denial-end-user-copy", "security-get-readable-fields", "security-props-liveness-recheck", "security-service-contract", @@ -1606,6 +1627,7 @@ "strictness-ledger-remeasure", "strip-read-decorations-on-save", "studio-strict", + "submitbehavior-jsdoc-mode-aware-default", "subscribe-metadata-event-subject", "summary-count-zero-on-parent-insert", "summary-index-registry-revision", @@ -1764,6 +1786,7 @@ "view-union-identity-precondition", "views-translation-key-runtime-identity", "visibility-alias-deprecated-retired", + "visibility-predicate-family-runtime-publish", "visibility-predicate-over-budget", "wait-loose-config-graduation", "wait-node-log-cause-meta", diff --git a/examples/app-crm/CHANGELOG.md b/examples/app-crm/CHANGELOG.md index 5d8eff2f9c..f3552cfeb0 100644 --- a/examples/app-crm/CHANGELOG.md +++ b/examples/app-crm/CHANGELOG.md @@ -1,5 +1,25 @@ # @objectstack/example-crm +## 4.0.92-rc.6 + +### Patch Changes + +- Updated dependencies [76d74ec] +- Updated dependencies [c546c89] +- Updated dependencies [211abdb] +- Updated dependencies [08363a0] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [91eddca] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] + - @objectstack/spec@17.0.0-rc.7 + - @objectstack/runtime@17.0.0-rc.7 + ## 4.0.92-rc.5 ### Patch Changes diff --git a/examples/app-crm/package.json b/examples/app-crm/package.json index 2e38f8153f..34b01beed0 100644 --- a/examples/app-crm/package.json +++ b/examples/app-crm/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/example-crm", - "version": "4.0.92-rc.5", + "version": "4.0.92-rc.6", "description": "Minimal CRM example — a smoke-test workspace that exercises the metadata loading pipeline (objects → views → app → dashboard → hook → flow → seed). For a full-featured enterprise CRM see https://github.com/objectstack-ai/hotcrm.", "license": "Apache-2.0", "private": true, diff --git a/examples/app-showcase/CHANGELOG.md b/examples/app-showcase/CHANGELOG.md index e0255e63c5..ab4a01ef17 100644 --- a/examples/app-showcase/CHANGELOG.md +++ b/examples/app-showcase/CHANGELOG.md @@ -1,5 +1,32 @@ # @objectstack/example-showcase +## 0.3.14-rc.6 + +### Patch Changes + +- Updated dependencies [76d74ec] +- Updated dependencies [c546c89] +- Updated dependencies [211abdb] +- Updated dependencies [08363a0] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [91eddca] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] + - @objectstack/spec@17.0.0-rc.7 + - @objectstack/runtime@17.0.0-rc.7 + - @objectstack/cloud-connection@17.0.0-rc.7 + - @objectstack/connector-mcp@17.0.0-rc.7 + - @objectstack/connector-openapi@17.0.0-rc.7 + - @objectstack/connector-rest@17.0.0-rc.7 + - @objectstack/connector-slack@17.0.0-rc.7 + - @objectstack/driver-sql@17.0.0-rc.7 + - @objectstack/service-datasource@17.0.0-rc.7 + ## 0.3.14-rc.5 ### Patch Changes diff --git a/examples/app-showcase/package.json b/examples/app-showcase/package.json index aef1ecaf52..5d4c9a7261 100644 --- a/examples/app-showcase/package.json +++ b/examples/app-showcase/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/example-showcase", - "version": "0.3.14-rc.5", + "version": "0.3.14-rc.6", "description": "Kitchen-sink showcase workspace — exercises every metadata type, every view type, every chart type, and the major end-to-end capability chains (security, automation, analytics). Built for demonstration, debugging, and coverage-driven verification.", "license": "Apache-2.0", "private": true, diff --git a/examples/app-todo/CHANGELOG.md b/examples/app-todo/CHANGELOG.md index 09a8e9ce3e..8e9b6176db 100644 --- a/examples/app-todo/CHANGELOG.md +++ b/examples/app-todo/CHANGELOG.md @@ -1,5 +1,35 @@ # @objectstack/example-todo +## 4.0.92-rc.6 + +### Patch Changes + +- Updated dependencies [76d74ec] +- Updated dependencies [c546c89] +- Updated dependencies [db31402] +- Updated dependencies [211abdb] +- Updated dependencies [8e17759] +- Updated dependencies [08363a0] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [edbf873] +- Updated dependencies [91eddca] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] + - @objectstack/spec@17.0.0-rc.7 + - @objectstack/objectql@17.0.0-rc.7 + - @objectstack/runtime@17.0.0-rc.7 + - @objectstack/client@17.0.0-rc.7 + - @objectstack/driver-sqlite-wasm@17.0.0-rc.7 + - @objectstack/mcp@17.0.0-rc.7 + - @objectstack/metadata@17.0.0-rc.7 + - @objectstack/knowledge-memory@17.0.0-rc.7 + - @objectstack/service-knowledge@17.0.0-rc.7 + ## 4.0.92-rc.5 ### Patch Changes diff --git a/examples/app-todo/package.json b/examples/app-todo/package.json index 763228d75c..0aeeae6a3e 100644 --- a/examples/app-todo/package.json +++ b/examples/app-todo/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/example-todo", - "version": "4.0.92-rc.5", + "version": "4.0.92-rc.6", "description": "Example Todo App using ObjectStack Protocol", "license": "Apache-2.0", "private": true, diff --git a/examples/embed-objectql/CHANGELOG.md b/examples/embed-objectql/CHANGELOG.md index 80eeb2f318..cf2601645c 100644 --- a/examples/embed-objectql/CHANGELOG.md +++ b/examples/embed-objectql/CHANGELOG.md @@ -1,5 +1,27 @@ # @objectstack/example-embed-objectql +## 0.0.32-rc.6 + +### Patch Changes + +- Updated dependencies [76d74ec] +- Updated dependencies [db31402] +- Updated dependencies [211abdb] +- Updated dependencies [8e17759] +- Updated dependencies [08363a0] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [edbf873] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] + - @objectstack/spec@17.0.0-rc.7 + - @objectstack/objectql@17.0.0-rc.7 + - @objectstack/driver-memory@17.0.0-rc.7 + ## 0.0.32-rc.5 ### Patch Changes diff --git a/examples/embed-objectql/package.json b/examples/embed-objectql/package.json index 08a1fb65fe..e751a0c49a 100644 --- a/examples/embed-objectql/package.json +++ b/examples/embed-objectql/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/example-embed-objectql", - "version": "0.0.32-rc.5", + "version": "0.0.32-rc.6", "private": true, "description": "Embed the ObjectQL engine as a plain library via @objectstack/objectql/core — no kernel, no plugins, no metadata protocol (ADR-0076).", "type": "module", diff --git a/packages/adapters/hono/CHANGELOG.md b/packages/adapters/hono/CHANGELOG.md index ab79de28b1..8c25645da0 100644 --- a/packages/adapters/hono/CHANGELOG.md +++ b/packages/adapters/hono/CHANGELOG.md @@ -1,5 +1,16 @@ # @objectstack/hono +## 17.0.0-rc.7 + +### Patch Changes + +- Updated dependencies [c546c89] +- Updated dependencies [cf7c694] +- Updated dependencies [91eddca] + - @objectstack/runtime@17.0.0-rc.7 + - @objectstack/plugin-hono-server@17.0.0-rc.7 + - @objectstack/types@17.0.0-rc.7 + ## 17.0.0-rc.6 ### Patch Changes diff --git a/packages/adapters/hono/package.json b/packages/adapters/hono/package.json index 7d0a0961a9..ca6983aad4 100644 --- a/packages/adapters/hono/package.json +++ b/packages/adapters/hono/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/hono", - "version": "17.0.0-rc.6", + "version": "17.0.0-rc.7", "license": "Apache-2.0", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/apps/account/CHANGELOG.md b/packages/apps/account/CHANGELOG.md index bbcb5d9d0f..cdb8c06f7c 100644 --- a/packages/apps/account/CHANGELOG.md +++ b/packages/apps/account/CHANGELOG.md @@ -1,5 +1,23 @@ # @objectstack/account +## 17.0.0-rc.7 + +### Patch Changes + +- Updated dependencies [76d74ec] +- Updated dependencies [211abdb] +- Updated dependencies [08363a0] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] + - @objectstack/spec@17.0.0-rc.7 + - @objectstack/platform-objects@17.0.0-rc.7 + ## 17.0.0-rc.6 ### Patch Changes diff --git a/packages/apps/account/package.json b/packages/apps/account/package.json index 74c83de8b3..54607ad28e 100644 --- a/packages/apps/account/package.json +++ b/packages/apps/account/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/account", - "version": "17.0.0-rc.6", + "version": "17.0.0-rc.7", "license": "Apache-2.0", "description": "ObjectStack Account — the end-user account/self-service console app, packaged as its own ObjectStack app package (ADR-0048: one app per package).", "main": "dist/index.js", diff --git a/packages/apps/setup/CHANGELOG.md b/packages/apps/setup/CHANGELOG.md index f9cc349cae..44541b9042 100644 --- a/packages/apps/setup/CHANGELOG.md +++ b/packages/apps/setup/CHANGELOG.md @@ -1,5 +1,23 @@ # @objectstack/setup +## 17.0.0-rc.7 + +### Patch Changes + +- Updated dependencies [76d74ec] +- Updated dependencies [211abdb] +- Updated dependencies [08363a0] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] + - @objectstack/spec@17.0.0-rc.7 + - @objectstack/platform-objects@17.0.0-rc.7 + ## 17.0.0-rc.6 ### Patch Changes diff --git a/packages/apps/setup/package.json b/packages/apps/setup/package.json index 82593ba476..970f6a4b41 100644 --- a/packages/apps/setup/package.json +++ b/packages/apps/setup/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/setup", - "version": "17.0.0-rc.6", + "version": "17.0.0-rc.7", "license": "Apache-2.0", "description": "ObjectStack Setup — the platform administration app, packaged as its own ObjectStack app package (ADR-0048: one app per package).", "main": "dist/index.js", diff --git a/packages/apps/studio/CHANGELOG.md b/packages/apps/studio/CHANGELOG.md index 331c900edc..157c2168b8 100644 --- a/packages/apps/studio/CHANGELOG.md +++ b/packages/apps/studio/CHANGELOG.md @@ -1,5 +1,23 @@ # @objectstack/studio +## 17.0.0-rc.7 + +### Patch Changes + +- Updated dependencies [76d74ec] +- Updated dependencies [211abdb] +- Updated dependencies [08363a0] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] + - @objectstack/spec@17.0.0-rc.7 + - @objectstack/platform-objects@17.0.0-rc.7 + ## 17.0.0-rc.6 ### Patch Changes diff --git a/packages/apps/studio/package.json b/packages/apps/studio/package.json index 90be6f2db2..d57de01ce5 100644 --- a/packages/apps/studio/package.json +++ b/packages/apps/studio/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/studio", - "version": "17.0.0-rc.6", + "version": "17.0.0-rc.7", "license": "Apache-2.0", "description": "ObjectStack Studio — the metadata builder app, packaged as its own ObjectStack app package (ADR-0048: one app per package).", "main": "dist/index.js", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 7cd9fae1e7..2ec15060bc 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,172 @@ # @objectstack/cli +## 17.0.0-rc.7 + +### Patch Changes + +- bf4ebe2: fix(cli): stop `lowerCallables` deleting the `functions` entries it does not recognise (#7318) + + The map branch of the top-level `functions` lowering REBUILT the map instead of + editing it: `out` admitted an entry only in the three shapes it knew — a bare + callable, `{ handler: callable }`, or a plain string ref — and everything else + was dropped. No error, no warning, no key. Two distinct failures came out of + that one line. + + **A built artifact could not be lowered again.** The already-lowered declaration + `{ handler: 'syncBilling', effect: 'writes' }` — the shape this very step emits + for a declared writer, and the one `FlowFunctionLoweredDeclarationSchema` was + added to accept in #4976 — matched none of the recognised shapes. A second pass + therefore deleted the key outright, silently un-declaring the writer the first + pass had gone out of its way to keep. Lowering is now idempotent: lower a + lowered stack and the `functions` key set and the declared entries are + unchanged, in both the map and the array spelling. + + **A malformed entry was destroyed rather than reported.** The headless husk + `{ effect: 'writes' }` — a declaration for a function that is not there, which + is exactly what a plain `JSON.stringify(stack)` leaves where a declared writer + was (#6293) — reached the lowering and left it as `functions: {}`. The stack + then parsed GREEN, so `objectstack build` wrote an artifact missing the function + instead of refusing, and the evidence had been deleted before the parse could + name it. + + Unrecognised entries now ride through under their own key, untouched, and + `FlowFunctionEntrySchema` decides. The husk is refused where the build actually + checks — `invalid_union` on `functions`, with the offending key nameable in the + branch tree, which `formatZodErrors` (#5341) prints in the terminal. + + Nothing changes for a stack that was building correctly: bare callables, declared + callables, pre-existing string refs and the array form all lower exactly as + before. A stack that was silently shipping a `functions` map missing an entry now + fails its build, naming `functions` — which is the point. + +- 072ab7f: fix(cli): `os test` walks the tree lazily and prunes, instead of listing the whole repository first (#7363) + + `os test` documents `**` in `resolveGlob`'s own header, and a `**` pattern was the + one thing it could not survive. Run from a repository root: + + ``` + $ node packages/cli/bin/run.js test '**/*.test.json' + FATAL ERROR: Ineffective mark-compacts near heap limit — JavaScript heap out of memory + ``` + + Exit 134, after ~7 minutes of GC thrash, before a single suite loaded. + + **Why.** `resolveGlob` split the pattern at the first wildcard to get a static base + directory, so a leading `**` left the base at `.` — and then called + `fs.readdirSync(baseDir, { recursive: true })`, which **materialises every path + under the base as one array before any filtering runs**. The filter that would have + thrown almost all of them away never got to run. + + The array was worse than "one entry per file", too. `readdirSync(…, { recursive: +true })` _follows symlinked directories_, and a pnpm `node_modules` is a symlink + graph in which every package links to its dependencies' real directories — so the + set of walkable paths is combinatorial in dependency depth, not linear in file + count. That is how a tree `find` reports as ~97k real entries exhausted an 8 GB heap. + + **Now.** The walk is lazy and segment-directed: it reads one directory at a time and + descends only into directories that can still satisfy the rest of the pattern, so + nothing is ever accumulated in order to be discarded. It does not follow symlinked + directories, which removes the combinatorial blow-up along with any cycle risk. + + Same command, same repository, after: **completes in 3 seconds**, having found the + three `*.test.json` files that are actually in the tree. + + **A wildcard no longer descends into `node_modules`, `.git`, `dist` or `build`.** + These are the same defect at a smaller scale: with no ignore list, a suite vendored + in `node_modules` — or a stale copy of your own suite left in `dist` — was a match + `os test` would load and **run against a live server**. A wildcard is a search of + your sources, and none of those four holds one. The prune applies only to + directories a _wildcard_ reached: a pattern that spells the name out + (`packages/*/dist/*.test.json`) still walks it, because naming a directory is asking + for it and a list of defaults must not overrule the argument you typed. + + Three smaller corrections that fell out of the rewrite: + + - **No second `statSync` pass.** The old code stat'ed every surviving match to + confirm it was a file; `Dirent` already answers that during the walk. Symlinks are + the only entries that still cost a syscall, and they are still counted as matches + exactly as before. + - **Only `*` and `**`are wildcards now.** The old translation escaped dots and +nothing else, so every other regex metacharacter in a filename reached the`RegExp`as an operator:`a+b.test.json`did not match itself, and`a?.json`meant "optional`a`" and matched `.json`. + - **Absolute patterns resolve absolutely.** A leading `/` was folded through + `path.join` as an ordinary segment, so `/tmp/x/*.test.json` was resolved against + the current working directory and silently matched nothing. + + Matching is otherwise unchanged: the default `qa/*.test.json` resolves as it always + did, `**` still matches zero segments as well as many, and a pattern with no wildcard + is still a direct file path. Results are now sorted, so suites run in the same order + on every filesystem. + +- Updated dependencies [76d74ec] +- Updated dependencies [c546c89] +- Updated dependencies [db31402] +- Updated dependencies [211abdb] +- Updated dependencies [8e17759] +- Updated dependencies [2c28df9] +- Updated dependencies [08363a0] +- Updated dependencies [769511c] +- Updated dependencies [05ac83d] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [7bc02f4] +- Updated dependencies [edbf873] +- Updated dependencies [91eddca] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] +- Updated dependencies [333769d] + - @objectstack/spec@17.0.0-rc.7 + - @objectstack/objectql@17.0.0-rc.7 + - @objectstack/runtime@17.0.0-rc.7 + - @objectstack/metadata-protocol@17.0.0-rc.7 + - @objectstack/service-job@17.0.0-rc.7 + - @objectstack/service-automation@17.0.0-rc.7 + - @objectstack/client@17.0.0-rc.7 + - @objectstack/rest@17.0.0-rc.7 + - @objectstack/plugin-security@17.0.0-rc.7 + - @objectstack/lint@17.0.0-rc.7 + - @objectstack/account@17.0.0-rc.7 + - @objectstack/setup@17.0.0-rc.7 + - @objectstack/cloud-connection@17.0.0-rc.7 + - @objectstack/core@17.0.0-rc.7 + - @objectstack/driver-memory@17.0.0-rc.7 + - @objectstack/driver-mongodb@17.0.0-rc.7 + - @objectstack/driver-sql@17.0.0-rc.7 + - @objectstack/driver-sqlite-wasm@17.0.0-rc.7 + - @objectstack/formula@17.0.0-rc.7 + - @objectstack/mcp@17.0.0-rc.7 + - @objectstack/metadata@17.0.0-rc.7 + - @objectstack/observability@17.0.0-rc.7 + - @objectstack/platform-objects@17.0.0-rc.7 + - @objectstack/plugin-approvals@17.0.0-rc.7 + - @objectstack/plugin-audit@17.0.0-rc.7 + - @objectstack/plugin-auth@17.0.0-rc.7 + - @objectstack/plugin-email@17.0.0-rc.7 + - @objectstack/plugin-hono-server@17.0.0-rc.7 + - @objectstack/plugin-reports@17.0.0-rc.7 + - @objectstack/plugin-sharing@17.0.0-rc.7 + - @objectstack/plugin-webhooks@17.0.0-rc.7 + - @objectstack/service-analytics@17.0.0-rc.7 + - @objectstack/service-cache@17.0.0-rc.7 + - @objectstack/service-datasource@17.0.0-rc.7 + - @objectstack/service-messaging@17.0.0-rc.7 + - @objectstack/service-package@17.0.0-rc.7 + - @objectstack/service-queue@17.0.0-rc.7 + - @objectstack/service-realtime@17.0.0-rc.7 + - @objectstack/service-settings@17.0.0-rc.7 + - @objectstack/service-sms@17.0.0-rc.7 + - @objectstack/service-storage@17.0.0-rc.7 + - @objectstack/trigger-api@17.0.0-rc.7 + - @objectstack/trigger-record-change@17.0.0-rc.7 + - @objectstack/trigger-schedule@17.0.0-rc.7 + - @objectstack/types@17.0.0-rc.7 + - @objectstack/verify@17.0.0-rc.7 + - @objectstack/plugin-pinyin-search@17.0.0-rc.7 + - @objectstack/console@17.0.0-rc.7 + ## 17.0.0-rc.6 ### Major Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index 95a2c1c9e9..eef0c039bb 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/cli", - "version": "17.0.0-rc.6", + "version": "17.0.0-rc.7", "description": "Command Line Interface for ObjectStack Protocol", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/client-react/CHANGELOG.md b/packages/client-react/CHANGELOG.md index 7a08400d41..5d86bf0fec 100644 --- a/packages/client-react/CHANGELOG.md +++ b/packages/client-react/CHANGELOG.md @@ -1,5 +1,24 @@ # @objectstack/client-react +## 17.0.0-rc.7 + +### Patch Changes + +- Updated dependencies [76d74ec] +- Updated dependencies [211abdb] +- Updated dependencies [08363a0] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] + - @objectstack/spec@17.0.0-rc.7 + - @objectstack/client@17.0.0-rc.7 + - @objectstack/core@17.0.0-rc.7 + ## 17.0.0-rc.6 ### Patch Changes diff --git a/packages/client-react/package.json b/packages/client-react/package.json index e2b6a1d410..f6a1d7e392 100644 --- a/packages/client-react/package.json +++ b/packages/client-react/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/client-react", - "version": "17.0.0-rc.6", + "version": "17.0.0-rc.7", "license": "Apache-2.0", "description": "React hooks for ObjectStack Client SDK", "main": "dist/index.js", diff --git a/packages/client/CHANGELOG.md b/packages/client/CHANGELOG.md index 98ef578695..fdd8a1df75 100644 --- a/packages/client/CHANGELOG.md +++ b/packages/client/CHANGELOG.md @@ -1,5 +1,94 @@ # @objectstack/client +## 17.0.0-rc.7 + +### Minor Changes + +- cf7c694: fix(spec,runtime,service-automation): `GET /automation/:name/runs?status=` filters the runs instead of being dropped (#7359) + + `ListRunsRequestSchema` has always declared a `status` filter on + `GET /api/automation/:name/runs` — `z.enum([...the eight ExecutionStatus +members]).optional()`, described as "Filter by execution status". Nothing read + it. It had no slot on `IAutomationService.listRuns`, whose options were + `{ limit?, cursor? }`, and the runtime handler never built it into the object it + forwarded, so the parameter was dropped at the HTTP boundary and the caller was + answered **200 with every run of the flow**, capped by `limit`. + + That is worse than an error, because the answer looks like the one that was + asked for: a monitoring caller paging `?status=failed` reads the first 20 runs + of any status and concludes those are the failures. Exposure was raw HTTP, + generated clients, and anything authored against the OpenAPI surface — the typed + SDK could not send the parameter at all, which is why nothing had tripped over + it. #7300 fixed this route's two _coerced_ parameters and deliberately preserved + the ignore-the-key behaviour rather than decide between honouring and retiring + the third; this change takes the enforce route (ADR-0049), so the declared + surface is now true. + + **The filter is honoured across both stores.** `AutomationEngine.listRuns` + serves the Runs view by merging an in-memory ring buffer with the durable run + history it reads back from the store. The narrowing is applied to the merged + result, so both halves are covered: filtering only the buffer would answer "no + failures" for a flow whose failures are all in durable history — i.e. after any + restart, which is exactly when someone asks — and filtering only the durable + rows would hide the live ones. Applying it after the merge also means each run + is matched on its **resolved** status: the buffer holds more than one entry per + run id (a run that pauses appends `paused`, then its terminal entry), and + narrowing before the collapse would have let a stale `paused` entry outlive the + terminal one, so every approval/screen/wait run that had since completed would + report itself as still paused. + + The durable arm's window is unchanged: `listHistory(flowName, limit)` has no + status slot, so the filter is applied to the rows that come back rather than + pushed down, and a status filter can therefore return fewer than `limit` matches + while older ones exist. That is this merge's pre-existing shape — durable rows + were already capped at `limit` before the sort-and-slice — and closing it is a + store-contract change. What it never does is return a run of another status. + + **An undeclared status is now refused, not silently widened.** Once the filter + is honoured, a value outside the set has no safe reading: `?status=faild` cannot + mean "no filter", and serving the empty list is no better, because "no runs are + `faild`" and "no runs failed" read identically to a caller who cannot see their + own typo. The check goes through the shared `query-param` module this route + already consumes with `/notifications`, as a new `parseEnumParam` gate, and + refuses in the house shape — `400` `VALIDATION_FAILED` (ADR-0112) with a + `details.fields[]` entry carrying ADR-0114's existing `invalid_option` + ("not a member of the field's declared options"); a value that was never a + single string at all — a repeated `?status=a&status=b`, a structured + `?status[$ne]=x` — gets `invalid_type`, the same mapping the module's string + gate already makes. No new error vocabulary. The accepted members are read from + the spec's own `ExecutionStatus` enum, the one `ListRunsRequestSchema` is built + from, so the wire's declared set and the boundary's accepted set cannot drift. + + **The typed client can now send it.** `client.automation.listRuns(flow, { +status })` — both the `automation.listRuns` alias and `automation.runs.list` — + takes the filter as an optional `ExecutionStatus`, additively. It could not send + the parameter at all before, which is the reason nothing had tripped over the + server-side gap; leaving it out would have made the enforced filter reachable + only from raw HTTP, and the Runs view that wants it goes through this client. + + **Nothing that had a defensible answer changes.** An absent `status` still + returns every run, exactly as before. So does the empty spelling `?status=` — + unlike `?read=` on the notifications inbox, which used to serve the wrong _half_ + of the result, `?status=` already served precisely what "no filter" means, and + it is what an "All statuses" `` submits. `limit` and `cursor` are + untouched, including out-of-range values, which remain the service's business. + +- 91eddca: refactor(runtime): `PermissionDeniedError` has ONE declaration again (#7270) + + `security/resolve-execution-context.ts` re-declared `PermissionDeniedError` and + `isPermissionDeniedError` character-for-character from + `@objectstack/plugin-security`'s `errors.ts`, with a doc comment asking the next + editor to keep them "structurally identical" and **nothing enforcing it**: + + ```ts + // runtime/src/security/resolve-execution-context.ts ← the copy + export class PermissionDeniedError extends Error { + readonly code = 'PERMISSION_DENIED'; + readonly statusCode = 403; + … + ``` + + Two hand-maintained declarations of an ADR-0112 denial envelope, where both + fields are load-bearing. `statusCode` is what the dispatcher answers with, and + `code` is what a matcher keys on — edit one copy's `403` and every test in the + repo still passes while one dispatch path starts answering a denial with the + wrong status. A comment is not a constraint. + + `@objectstack/plugin-security` is the package that _throws_ these (23 call sites + across `security-plugin.ts`, `delegated-admin-gate.ts`, `predicate-guard.ts`, + `system-write-guard.ts`, `suggested-audience-bindings.ts`); the runtime only ever + _catches_ them. So the plugin owns the declaration and the runtime module now + re-exports it. `@objectstack/plugin-security` was already a plain `dependencies` + entry of `@objectstack/runtime`, so this adds no dependency — and `tsup` + externalizes workspace dependencies, so the built bundle gained an + `import "@objectstack/plugin-security"` and lost the duplicated class (ESM + 428.21 KB → 428.02 KB). + + The symbols stay exported from `security/resolve-execution-context.ts` rather + than being deleted outright, because `http-dispatcher.ts` imports + `isPermissionDeniedError` from that module path. Nothing outside the package is + affected either way: `runtime/src/security/index.ts` never re-exported either + symbol, so neither was reachable from `@objectstack/runtime`'s public barrel. + + The matcher itself is unchanged and stays **duck-typed** (`name` / `code` / + message-prefix, never `instanceof`), which is what makes the re-export safe: dual + CJS/ESM output and bundling can still hand the two sides distinct class objects, + and a denial crossing that boundary is recognized regardless. A new + `security/permission-denied-error-parity.test.ts` pins both halves — that the two + import paths reach the same declaration (the assertion that fails against the old + copy), and that an instance built from a _deliberately foreign_ class of the same + shape is still matched, so the duck-typed property is held independently of + whether the two ever collapse to one class object. + + No behaviour change: `name`, `code: 'PERMISSION_DENIED'` and `statusCode: 403` + are byte-identical to what the runtime copy produced. + +- Updated dependencies [76d74ec] +- Updated dependencies [db31402] +- Updated dependencies [211abdb] +- Updated dependencies [8e17759] +- Updated dependencies [2c28df9] +- Updated dependencies [08363a0] +- Updated dependencies [769511c] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [7bc02f4] +- Updated dependencies [edbf873] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] + - @objectstack/spec@17.0.0-rc.7 + - @objectstack/objectql@17.0.0-rc.7 + - @objectstack/metadata-protocol@17.0.0-rc.7 + - @objectstack/rest@17.0.0-rc.7 + - @objectstack/plugin-security@17.0.0-rc.7 + - @objectstack/core@17.0.0-rc.7 + - @objectstack/driver-memory@17.0.0-rc.7 + - @objectstack/driver-sql@17.0.0-rc.7 + - @objectstack/driver-sqlite-wasm@17.0.0-rc.7 + - @objectstack/formula@17.0.0-rc.7 + - @objectstack/metadata@17.0.0-rc.7 + - @objectstack/metadata-core@17.0.0-rc.7 + - @objectstack/observability@17.0.0-rc.7 + - @objectstack/plugin-auth@17.0.0-rc.7 + - @objectstack/service-cluster@17.0.0-rc.7 + - @objectstack/service-datasource@17.0.0-rc.7 + - @objectstack/service-i18n@17.0.0-rc.7 + - @objectstack/types@17.0.0-rc.7 + ## 17.0.0-rc.6 ### Major Changes diff --git a/packages/runtime/package.json b/packages/runtime/package.json index 897d11e0ee..cc8c443d22 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/runtime", - "version": "17.0.0-rc.6", + "version": "17.0.0-rc.7", "license": "Apache-2.0", "description": "ObjectStack Core Runtime & Query Engine", "type": "module", diff --git a/packages/sdui-parser/CHANGELOG.md b/packages/sdui-parser/CHANGELOG.md index b4163686dc..024ce215f6 100644 --- a/packages/sdui-parser/CHANGELOG.md +++ b/packages/sdui-parser/CHANGELOG.md @@ -1,5 +1,7 @@ # @objectstack/sdui-parser +## 17.0.0-rc.7 + ## 17.0.0-rc.6 ## 17.0.0-rc.5 diff --git a/packages/sdui-parser/package.json b/packages/sdui-parser/package.json index bd0138c53a..9c4f323339 100644 --- a/packages/sdui-parser/package.json +++ b/packages/sdui-parser/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/sdui-parser", - "version": "17.0.0-rc.6", + "version": "17.0.0-rc.7", "license": "Apache-2.0", "description": "ObjectStack constrained JSX-source → SDUI SchemaNode tree compiler (parse, never execute). Isomorphic, zero React. ADR-0080.", "main": "dist/index.js", diff --git a/packages/services/service-analytics/CHANGELOG.md b/packages/services/service-analytics/CHANGELOG.md index da8e3647b1..8c77837cf9 100644 --- a/packages/services/service-analytics/CHANGELOG.md +++ b/packages/services/service-analytics/CHANGELOG.md @@ -1,5 +1,24 @@ # Changelog — @objectstack/service-analytics +## 17.0.0-rc.7 + +### Patch Changes + +- Updated dependencies [76d74ec] +- Updated dependencies [211abdb] +- Updated dependencies [08363a0] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] + - @objectstack/spec@17.0.0-rc.7 + - @objectstack/core@17.0.0-rc.7 + - @objectstack/types@17.0.0-rc.7 + ## 17.0.0-rc.6 ### Minor Changes @@ -199,7 +218,7 @@ vocabulary − this`), which is what stops the next aggregate added to the spec is untouched; it is simply no longer reachable through a spec-valid request. On the dataset path nothing changes: `compileDataset` refused both by name already. - + - 2bc1876: fix(service-analytics): refuse a dotted `measures` entry loudly instead of aggregating the base column (#5918) diff --git a/packages/services/service-analytics/package.json b/packages/services/service-analytics/package.json index 0f8a23dff0..9714704d4f 100644 --- a/packages/services/service-analytics/package.json +++ b/packages/services/service-analytics/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-analytics", - "version": "17.0.0-rc.6", + "version": "17.0.0-rc.7", "license": "Apache-2.0", "description": "Analytics Service for ObjectStack — implements IAnalyticsService with multi-driver strategy pattern (NativeSQL, ObjectQL, InMemory)", "type": "module", diff --git a/packages/services/service-automation/CHANGELOG.md b/packages/services/service-automation/CHANGELOG.md index b9ff95e25e..fd71bb5667 100644 --- a/packages/services/service-automation/CHANGELOG.md +++ b/packages/services/service-automation/CHANGELOG.md @@ -1,5 +1,118 @@ # @objectstack/service-automation +## 17.0.0-rc.7 + +### Patch Changes + +- 05ac83d: Job runs that finish without doing their work are now audited as `degraded`, not `success` (#5548) + + `DbJobAdapter` decided a run's outcome solely by whether the handler threw, so a + handler that failed internally and deliberately did not throw was recorded as + `sys_job_run.status: 'success'` — the audit surface Studio's jobs view reads + reported the one thing that had definitely not happened. + + The adapters now consume the `JobRunOutcome` channel `JobHandler` gained in + #6617, using the `degraded` status vocabulary added in #7072: + + - a handler resolving `{ outcome: 'degraded', reason? }` lands + `sys_job_run.status: 'degraded'` with the reason in `error`, and mirrors onto + `sys_job.last_status` / `last_error`; + - `degraded` is not a failure: `failure_count` stays flat and nothing retries + (retry keys on a rejected promise only, unchanged); + - `IntervalJobAdapter` / `CronJobAdapter` report the same verdict through + `getExecutions()`, so the in-memory history and the persisted row agree. + + Strictly additive: a handler that resolves `undefined` — every handler written + before #6617 — is still recorded as `success`, byte for byte as before. + + The first adopter is the `wait` node's timer wake-up: a shot that fires into an + unreachable suspended-run store now reports `degraded` / `STORE_UNAVAILABLE` + while still keeping its one-shot armed and its `sys_job` row active (#5529). + +- cf7c694: fix(spec,runtime,service-automation): `GET /automation/:name/runs?status=` filters the runs instead of being dropped (#7359) + + `ListRunsRequestSchema` has always declared a `status` filter on + `GET /api/automation/:name/runs` — `z.enum([...the eight ExecutionStatus +members]).optional()`, described as "Filter by execution status". Nothing read + it. It had no slot on `IAutomationService.listRuns`, whose options were + `{ limit?, cursor? }`, and the runtime handler never built it into the object it + forwarded, so the parameter was dropped at the HTTP boundary and the caller was + answered **200 with every run of the flow**, capped by `limit`. + + That is worse than an error, because the answer looks like the one that was + asked for: a monitoring caller paging `?status=failed` reads the first 20 runs + of any status and concludes those are the failures. Exposure was raw HTTP, + generated clients, and anything authored against the OpenAPI surface — the typed + SDK could not send the parameter at all, which is why nothing had tripped over + it. #7300 fixed this route's two _coerced_ parameters and deliberately preserved + the ignore-the-key behaviour rather than decide between honouring and retiring + the third; this change takes the enforce route (ADR-0049), so the declared + surface is now true. + + **The filter is honoured across both stores.** `AutomationEngine.listRuns` + serves the Runs view by merging an in-memory ring buffer with the durable run + history it reads back from the store. The narrowing is applied to the merged + result, so both halves are covered: filtering only the buffer would answer "no + failures" for a flow whose failures are all in durable history — i.e. after any + restart, which is exactly when someone asks — and filtering only the durable + rows would hide the live ones. Applying it after the merge also means each run + is matched on its **resolved** status: the buffer holds more than one entry per + run id (a run that pauses appends `paused`, then its terminal entry), and + narrowing before the collapse would have let a stale `paused` entry outlive the + terminal one, so every approval/screen/wait run that had since completed would + report itself as still paused. + + The durable arm's window is unchanged: `listHistory(flowName, limit)` has no + status slot, so the filter is applied to the rows that come back rather than + pushed down, and a status filter can therefore return fewer than `limit` matches + while older ones exist. That is this merge's pre-existing shape — durable rows + were already capped at `limit` before the sort-and-slice — and closing it is a + store-contract change. What it never does is return a run of another status. + + **An undeclared status is now refused, not silently widened.** Once the filter + is honoured, a value outside the set has no safe reading: `?status=faild` cannot + mean "no filter", and serving the empty list is no better, because "no runs are + `faild`" and "no runs failed" read identically to a caller who cannot see their + own typo. The check goes through the shared `query-param` module this route + already consumes with `/notifications`, as a new `parseEnumParam` gate, and + refuses in the house shape — `400` `VALIDATION_FAILED` (ADR-0112) with a + `details.fields[]` entry carrying ADR-0114's existing `invalid_option` + ("not a member of the field's declared options"); a value that was never a + single string at all — a repeated `?status=a&status=b`, a structured + `?status[$ne]=x` — gets `invalid_type`, the same mapping the module's string + gate already makes. No new error vocabulary. The accepted members are read from + the spec's own `ExecutionStatus` enum, the one `ListRunsRequestSchema` is built + from, so the wire's declared set and the boundary's accepted set cannot drift. + + **The typed client can now send it.** `client.automation.listRuns(flow, { +status })` — both the `automation.listRuns` alias and `automation.runs.list` — + takes the filter as an optional `ExecutionStatus`, additively. It could not send + the parameter at all before, which is the reason nothing had tripped over the + server-side gap; leaving it out would have made the enforced filter reachable + only from raw HTTP, and the Runs view that wants it goes through this client. + + **Nothing that had a defensible answer changes.** An absent `status` still + returns every run, exactly as before. So does the empty spelling `?status=` — + unlike `?read=` on the notifications inbox, which used to serve the wrong _half_ + of the result, `?status=` already served precisely what "no filter" means, and + it is what an "All statuses" `` submits. `limit` and `cursor` are + untouched, including out-of-range values, which remain the service's business. + +- b61afc1: fix(plugin-security,spec): the `403 PERMISSION_DENIED` from the object CRUD gate stops handing a business user internal authorization vocabulary + + An operation the caller's permission sets do not grant is correctly refused with + `403 PERMISSION_DENIED`, and the transport was never the problem. What reached + the end user was: `Error.message` is the body's human-readable string on every + transport (`mapDataError`'s `body.error`, the dispatcher's `error.message`) and + Console renders it verbatim in a toast. So an operator in a fully localized app + read + + ``` + [Security] Access denied: operation 'delete' on object 'app_child_object' + is not permitted for positions [org_member, everyone] + ``` + + English-only; naming a table they have never seen; ending in `positions [...]`, + internal authorization vocabulary that reads as a contradiction to someone who + does hold rights on the record they clicked. It is not confined to obviously + unauthorized actions either — `cascadeDeleteRelations` re-authorises every + cascade CHILD independently, so an ordinary delete of a parent the app + deliberately granted can surface a 403 naming a child object the operator never + addressed. + + The error now carries two messages because it has two audiences: + + - `message` — the user's half, rendered in `ExecutionContext.locale` through the + shared operation-message catalog (`@objectstack/spec/system`, the mechanism + built for `DELETE_RESTRICTED`), overridable per deployment under + `errors.permission_denied`. It names no object, no operation and no position, + in any of the four shipped locales. + - `developerMessage` — the developer's half, the previous sentence byte for + byte. It is LOGGED at the throw site, not shipped to the client. + + That last point is where this deliberately diverges from its sibling. + `DELETE_RESTRICTED` ships its developer half over the wire because the same body + already carries the API names it mentions; the 403 body does not. REST's + `mapDataError` builds `{ error, code, object? }` for a permission denial and + never reads `error.details`, so the positions, the operation and (on a cascade) + the child object's API name reach a client through nothing but the message — + shipping a `developerMessage` there would have ADDED a disclosure rather than + removed one. `developerMessage` is therefore a sibling of `details`, never a + member of it, because `details` is the field the runtime dispatcher serialises. + + Enforcement is untouched: same 403, same `PERMISSION_DENIED`, same decision + logic, and the structured `details` payload (`operation`, `object`, `positions`, + `permissionSets`) is byte-identical to before. + +- c6a4eeb: fix(plugin-security,spec): the row-level and capability `403 PERMISSION_DENIED` refusals stop handing a business user internal authorization vocabulary + + #7414 converted one template of this family — the object CRUD grant denial. The + same defect sat on the other gates of the same middleware that an ordinary, + non-admin principal reaches on ordinary business work. `Error.message` is the + body's human-readable string on every transport (`mapDataError`'s `body.error`, + the dispatcher's `error.message`) and Console renders it verbatim in a toast, so + a salesperson editing someone else's opportunity read + + ``` + [Security] Access denied: not permitted to update this 'crm_opportunity' + record (row-level security) + ``` + + English-only, naming a table they have never seen, and ending in the name of the + mechanism that refused them rather than anything they can act on. + + Three gates now render the user's half through the shared operation-message + catalog (`@objectstack/spec/system`, the mechanism built for `DELETE_RESTRICTED` + and reused by #7414), overridable per deployment under `errors.`: + + - the row-level pre-image write denial renders `record_access_denied`; + - the row-level CHECK post-image denial renders `record_change_not_allowed`; + - the capability AND-gate (ADR-0066 D3) renders the existing `permission_denied`. + + Two new catalog keys, in all four shipped locales, and not three: the rule is one + key per SITUATION, not per gate and not per wire code. A user blocked by + row-level security can often ask the record's owner; a user whose post-image + failed a CHECK can simply change what they typed; a user whose grants do not + cover the action needs an administrator. Those are three different next steps, so + they are three different sentences. A caller missing a CRUD bit and a caller + missing a `requiredPermissions` capability, by contrast, are in ONE situation with + one remedy — the difference between them is a fact about our authorization model, + which is exactly the vocabulary that must not reach a toast — so both render + `permission_denied`. + + Each sentence names nothing: no object, no record id, no capability, no + mechanism. That was re-derived per site rather than inherited. The row-level + denial is the one gate here that COULD have named honestly, because the refused + record is the one the caller just addressed; it still does not, because the only + spellings available at the throw site are the object's API name and an opaque row + id, and reaching a label means the ladder whose last rung is the API name. + + Each refusal keeps its developer half as `developerMessage`, the previous + sentence byte for byte, LOGGED at the throw site rather than shipped — following + #7414, which measured that REST's `mapDataError` builds `{ error, code, object? }` + and never reads `error.details`, so shipping it would ADD a disclosure on the + transport that discloses less. `developerMessage` is a sibling of `details`, + never a member, because `details` is what the runtime dispatcher serialises. + + Enforcement is untouched: same 403, same `PERMISSION_DENIED`, same decision + logic, and every structured `details` payload — including `requiredPermissions`, + `missingPermissions` and `recordId` — is byte-identical to before. + +### Patch Changes + +- 76d74ec: docs(spec,objectql): declare that `after*` hooks fire inside the unit of work (#7477) + + `afterInsert` / `afterUpdate` / `afterDelete` are dispatched **before** the + enclosing transaction commits. What that guarantees has never been written + down, and the two readings differ in exactly the case that matters — so it is + now declared, on the API surface and in the docs, per the maintainer ruling on + #7477. + + **The declared meaning:** an `after*` hook means _"the write has been requested + and will happen unless this unit of work is undone"_ — not _"the write + happened"_. A later refusal inside the same unit rolls the row back after the + hook has already run. + + Three ordinary operations put a write inside such a unit: + + - a by-id `delete()` whose cascade is atomic — each **cascaded child's** + `afterDelete` fires inside the wrap the parent opened (#7413); the parent's + own `afterDelete` runs after that unit closes and is unaffected; + - `batchData` / `deleteManyData` with `atomic: true` — every member's `after*` + fires inside one transaction that aborts on the first failure (#4620); + - any caller that wrapped the write in `engine.transaction()` / + `ctx.api.transaction()`. + + **What it means for a handler.** Effects routed back through the engine + (`ctx.api`, `ctx.ql`) join the same transaction and roll back with everything + else — that is what makes an in-engine audit or projection hook correct. + Effects that leave the engine — webhooks, notifications, external index + updates, file deletion — are the handler's own responsibility to make + rollback-tolerant: idempotent and reconcilable, or handed to a worker that + re-reads the record instead of trusting the event alone. + + **No behaviour change.** Nothing about when a hook fires moved; the alternative + (deferring `after*` to commit) was considered and rejected in the same ruling, + because it would push a handler's own `ctx.api` writes outside the transaction + the write ran in. The statement lands as JSDoc on `HookEvent` and + `HookEventType` in `@objectstack/spec`, on `DISPATCHABLE_HOOK_EVENTS`, + `HookHandler` and `triggerHooks` in `@objectstack/objectql`, and as a new + section on the Hooks documentation page. The existing #7413 pin already + asserted this ordering; its comment now records the ruling instead of leaving + the question open. + +- 603cab8: The liveness ledger's "Current state" table stops hand-maintaining its counts: the numbers + move into a generated `packages/spec/liveness/state-counts.md` carrying `merge=os-regen`, + and the eleven rows that had drifted from the gate are reconciled — each with the Notes + prose beside it re-read against the new measurement. + + **Why it was a card and not a `sed`.** The table declares its own counting method (the + gate's `--json` report, fixed in #4488) and says the count columns are never hand-edited. + Nobody re-ran the snippet, and 9 of 30 rows disagreed with the gate by the time #7377 was + filed — two more (`job`, `translation`) joined when PR #7425 re-graded four docs-shaped + rows. Several Notes cells enumerate their own dead sets BY HAND, so regenerating the + numbers alone would have left a row reading `dead 6` next to a sentence naming four, which + is worse than the drift: the prose is the part a reader believes. + + **Every delta is explained, not absorbed.** Six rows moved for one structural reason — + `field`, `action`, `hook`, `page`, `seed`, `webhook` picked up the ADR-0010 protection + envelope as the #4001 strictness campaign closed each schema (#4514/#4530/#4531/#4533/#4974), + and the gate auto-classifies those keys `live`. The rest are verdict-shaped: `flow`'s sixth + dead is `errorHandling.retryDelayMs`, tombstoned by the #4964 rename to `backoffMs`; + `view` gained three container-level keys in #4001 batch 6e (`object` live, `name`/`label` + dead) that its Note never mentioned; `app` gained `_unpublished` (#4829, a `live` key no + author may write) and its first `planned`, `navigation.runAction` (#4848); `action` gained + `description` (#7367); `job` and `translation` reached zero dead under #7425's ruling that + designer previews count as consumers. + + **`job` is the first row in the table with zero dead where the ADR-0033 exemption is still + in force**, and the row now says so out loud: the keys are still docs-shaped, still + deliberately kept, still not `authorWarn`'d — what changed is that the measurement, not the + exemption, now carries the verdict. + + **The split follows #5107.** Hand-maintained counts merge clean and WRONG: two PRs each move + a different row by their own correct delta, the rows do not overlap, and git composes a + table nobody wrote. The Notes prose stays hand-written in `README.md` — regenerating a Note + would manufacture a verdict, which that README calls worse than a missing row. + `check:liveness` gains three legs over the split (`scripts/liveness/readme-table.mts`, + unit-tested for the usual reason: on a green tree none of them can fire): the artifact must + equal what the gate measures right now, its row set and the README's must agree in both + directions, and a count column reappearing in the README fails — that last one is invisible + to the other two, and would let the table publish two sets of numbers with only one + enforced. `gen:liveness-counts` regenerates, spawning the gate rather than re-implementing + its walk, and keeps #7257's skeleton row for a governed type with no Note. + +- f293d45: refactor(spec): split the migration registry's three append tables into per-entry files (#7297) + + `packages/spec/src/migrations/registry.ts` carried three hand-authored **append** + tables — each protocol step's `semantic` list, `RETIRED_KEYS_BY_MAJOR` and + `RETIRED_DEFS_BY_MAJOR`. Every retirement card appended to the same tail line of the + same two of them, so two cards in one window were a textual conflict by construction. + Measured on #6957 over 2026-08-06..10: `step17`'s semantic list and + `RETIRED_KEYS_BY_MAJOR[17]` conflicted in **6 of 11** contended re-merge laps, for 613 + hand-resolved lines of conflict markers in four days. + + Wall-clock was never the reason to fix it. **Both tables are consumed as sets**, so a + conflict resolution that drops a sibling's entry produces **no error anywhere**: the + tombstone `check:authorable-surface` was waiting for never arrives, and the D3 + prescription leaves the upgrade guide without a trace. + + Per the maintainer ruling on #6957 (2026-08-10, option (a)), the entries now live one + file per entry under `packages/spec/src/migrations/entries/`, concatenated into + `registry.ts`'s `` regions by `gen:migration-registry` and verified by + `check:migration-registry` (wired into `check:generated`). The filename is a pure + function of the entry id, so two cards registering different entries write different + files and merge clean, while two cards editing one entry collide in git — which is + correct and must stay true. Order is derived (sorted by id); there is deliberately no + index file. `scripts/adr-anchors/` (#7301) is the pilot this mirrors. + + **No behaviour change and no acceptance movement.** Every exported value is identical + entry-for-entry — proved before and after by deep-comparing `MIGRATIONS_BY_MAJOR`, + `RETIRED_KEYS_BY_MAJOR` and `RETIRED_DEFS_BY_MAJOR` across the change. What moved is + order: `spec-changes.json` and `docs/protocol-upgrade-guide.md` now list the 59 + semantic migrations sorted by id rather than in append order, a one-time reorder whose + line multiset is byte-identical to before. Twelve prose cross-references that pointed + at a neighbour by POSITION ("the entry above", "the trio at the top of this list") were + rewritten to name the entry, since position is no longer stable. + + ⚠️ Honest limit, carried from #6957: this removes the conflict **resolution**, not the + regeneration **lap**. `spec-changes.json` and the upgrade guide are still committed + projections (option B was rejected — the review diff is worth the laps it costs), so a + retirement card is not faster, only much harder to lose. + +- 8dd98bf: + + feat(objectql)!: retire `delete()`'s by-id `beforeDelete` REPOINT, aligning it with `update()` (#6752) + + A `beforeDelete` handler on a **by-id** `delete()` may no longer move the + delete onto a different row by assigning `ctx.input.id`. The rebind is + **refused** with `HookTargetRebindError` / `ERR_HOOK_TARGET_REBIND` + (`path: 'by-id'`) — exactly what the `update()` twin and both per-row paths + already raised. Nothing is deleted, and `afterDelete` and the roll-up + recompute never run. + + **The rule is now one line, on both verbs: a by-id target is immutable in a + `before*` handler.** + + | | CLEARED id | REBOUND to another id | + | ---------------- | ------------ | -------------------------- | + | `update()` by-id | refused | refused | + | `delete()` by-id | refused | **refused** (was honoured) | + | either, per-row | refused (D4) | refused (D4) | + + **Removed keys and their prescriptions (FROM → TO):** + + | Wrote | Write instead | + | ------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | + | `beforeDelete` handler: `ctx.input.id = otherId` | `await ctx.ql.delete(object, otherId)` for that row explicitly, and let the addressed delete proceed — or `throw` from the handler to stop it | + | `beforeDelete` handler repointing to delete a set | have the **caller** pass `{ multi: true, where: … }` | + + Writing the **same** id back is unaffected and stays legal: the check is + `input.id !== id`, the `update()` check verbatim, so a handler that reads the + id or assigns it to itself is not caught. + + **This removes a capability that WORKED, and the reasoning has to be read that + way.** `delete()` had a re-resolution for a repointed target since #5272: it + re-read the new target's pre-image and rebound `previous`, so `afterDelete` and + the summary recompute saw the row actually deleted. Nothing stale ever leaked, + and the case that retires a rebind on `update()` — the write landing on a row + whose pre-image, `readonlyWhen` locks and validation rules were never evaluated + — did not apply to it. That is why #5574's engine half (PR #6697) deliberately + left the asymmetry standing and filed it as its own question. + + The 2026-08-09 maintainer ruling on #6752 retires it anyway, on three measured + axes: + + - **Compatibility cost, measured: zero.** A repository-wide grep for assignments + into a hook's `input.id`, re-run on this PR's base rather than inherited, + finds six sites and all six are this family's own pins. No consumer anywhere + repoints — not in the framework, plugins, examples or docs. + - **One rule beats two correct rules.** Two verbs answering the same slot + differently is something every hook author must hold in memory, and the + justification for the split lived in an ADR, not at the call site. + - **The surface is a footgun independent of the mechanism.** "A hook silently + redirects which row gets deleted" is a top-grade hazard for authored — and + especially AI-authored — handlers. Correctness of a mechanism does not justify + the surface it exposes. + + Aligning the other way — building `update()` the same re-resolution — stays + excluded by #5574's recorded ruling ("do not silently pick re-resolution + instead"). + + The re-read block in `delete()`'s by-id branch is **deleted, not bypassed**: its + guard was `input.id !== id && input.id`, precisely the case the refusal now + throws on, so it became unreachable the moment the refusal landed. The single + pre-dispatch pre-image read that binds `previous` for `beforeDelete` is a + different read and is untouched. + + Recorded as **ADR-0058 Amendment II.2**; the `hook-target-rebind-errors.ts` + "what this does NOT cover" section is gone, because there is no longer an + exception to remember. The #5272 pin asserting the repoint was honoured is + **flipped to assert the refusal**, not deleted, with a new negative control + pinning that a same-id rewrite stays legal. + + Supersedes the scope note in the pending `bulk-write-before-hooks-per-row` + changeset ("a `beforeDelete` handler that repoints the target is unaffected"), + which described PR #6697's deliberate carve-out and is closed by this change in + the same release. + +- 8a9c079: docs(spec): describe the RLS `using` grammar by what pushes down, not by a count (#6919) + + The TSDoc block above `RowLevelSecurityPolicySchema`'s `using` property still + opened with "The reference RLS compiler implements a deliberately **small, + fixed grammar** … **Exactly four forms compile**", then enumerated four SQL + spellings and declared "there is intentionally **no** support for `AND`/`OR`/ + `NOT`, comparison operators other than `=`". That contradicted the + `.describe()` on the _same property_ — corrected in #6762 / PR #6918 — and it + contradicted the compiler. Measured against `isSupportedRlsExpression` + (`@objectstack/formula`, `src/rls-predicate.ts`): `!=` and the full ordering + comparisons, `in` over a `current_user.*` array **and** over an inline CEL list, + string `startsWith`/`endsWith`/`contains`, `&&`, `||`, parenthesised grouping + and a bare `true` all lower to a filter and genuinely enforce. + + PR #6918 could only park a `⚠️ STALE` marker on the block, because rewriting + ~60 lines of grammar prose deserved its own review. This is that rewrite; the + marker is gone with it. + + The block is now written as the one question the compiler actually asks — + _does this predicate lower to an ObjectQL filter?_ — with the forms that lower + listed as open categories rather than a numbered set, and the forms that fail + closed listed beside them. Replacing "four" with the current number would have + been the same defect, so no count appears. Canonical CEL leads; the SQL + spelling is presented as what it is, a deprecated transitional bridge + (`sqlPredicateToCel`, ADR-0058 D1) covering only `=` → `==` and `IN` → `in`. + The property's five `@example` strings, all SQL dialect, are now CEL. + + Two boundaries the old text got wrong in the _permissive_ direction are stated + explicitly, because both are silent-fail-closed traps: SQL's parenthesised + value list does not survive the bridge (`status IN ('draft', 'pending')` fails + closed where `status in ['draft', 'pending']` lowers), and `!` negates a + parenthesised comparison but cannot negate a bare field. + + Also adds `rls-predicate-grammar-docs.pin.test.ts`, which holds the file's + three grammar faces — the published module docblock line, the property TSDoc, + and the property's `.describe()` — to one story: none may re-assert a + fixed-count or closed-set grammar, all must keep stating the fail-closed + contract, and the two operator-listing faces must name the same operators. + This grammar has now drifted twice in the same direction, and nothing compared + the faces to each other. + + No generated output changes: `gen:docs` never renders property-level TSDoc, so + `check:docs` reports all 231 files still in sync. + +- 1059965: docs(spec): state `submitBehavior`'s default as mode-aware, not a single fixed kind (#7441) + + The TSDoc block above `FormViewSchema.submitBehavior` in `packages/spec/src/ui/view.zod.ts` + still read `` `thank-you` (default) — show a confirmation panel``, which the maintainer's + 2026-08-10 ruling on #7245 makes false for the internal path: `thank-you` stays the default + only on the public `/console/f/:slug` path, while the internal `/console/forms/:name` path + — where `type: 'form'` actions send operators — now defaults to redirecting to the record + that was just created. An explicit `submitBehavior` wins in either mode. + + Rewritten to state both defaults and the reasoning behind each, mirroring the contract + already landed in `content/docs/protocol/objectui/actions.mdx` and `content/docs/ui/forms.mdx` + (PR #7417). The schema itself is unchanged: `submitBehavior` stays `.optional()` with no + `.default()`, and its `.describe()` string (`'Post-submit behavior'`) is untouched — only + the source comment was wrong, and only the source comment changes. + + No generated output changes: `gen:docs` never renders property-level TSDoc, so `check:docs` + reports all 231 files still in sync (same measurement PR #7444 made for the same reason). + ## 17.0.0-rc.6 ### Major Changes @@ -391,7 +921,7 @@ vocabulary − this`), which is what stops the next aggregate added to the spec is untouched; it is simply no longer reachable through a spec-valid request. On the dataset path nothing changes: `compileDataset` refused both by name already. - + - 3f7f14e: refactor(spec,objectql)!: retire `AggregationNode.distinct` — one face honoured it, five ignored it, and the same query answered two plausible numbers (#6815, ADR-0049) @@ -1049,7 +1579,7 @@ security } })` / `StackServerConfigSchema` (#5006) parses exactly as it did in 1 If host-implementer conformance becomes a real requirement it returns through the ENFORCE route: an adapter contract with a checker behind it, vocabulary second. - + - c3f4916: fix(spec)!: `ImportRequest.runAutomations` declares the default the import route actually applies (#6704, ADR-0049) diff --git a/packages/spec/package.json b/packages/spec/package.json index 58b38c4140..4aa9b0e1ee 100644 --- a/packages/spec/package.json +++ b/packages/spec/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/spec", - "version": "17.0.0-rc.6", + "version": "17.0.0-rc.7", "description": "ObjectStack Protocol & Specification - TypeScript Interfaces, JSON Schemas, and Convention Configurations", "license": "Apache-2.0", "main": "dist/index.js", diff --git a/packages/triggers/trigger-api/CHANGELOG.md b/packages/triggers/trigger-api/CHANGELOG.md index 6173742c29..6e0d758dea 100644 --- a/packages/triggers/trigger-api/CHANGELOG.md +++ b/packages/triggers/trigger-api/CHANGELOG.md @@ -1,5 +1,23 @@ # @objectstack/trigger-api +## 17.0.0-rc.7 + +### Patch Changes + +- Updated dependencies [76d74ec] +- Updated dependencies [211abdb] +- Updated dependencies [08363a0] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] + - @objectstack/spec@17.0.0-rc.7 + - @objectstack/core@17.0.0-rc.7 + ## 17.0.0-rc.6 ### Patch Changes diff --git a/packages/triggers/trigger-api/package.json b/packages/triggers/trigger-api/package.json index 768781de2c..f79756f590 100644 --- a/packages/triggers/trigger-api/package.json +++ b/packages/triggers/trigger-api/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/trigger-api", - "version": "17.0.0-rc.6", + "version": "17.0.0-rc.7", "license": "Apache-2.0", "description": "Inbound HTTP/webhook flow trigger for ObjectStack — per-flow HMAC-verified endpoints with queue-backed ingestion (ADR-0041)", "main": "dist/index.js", diff --git a/packages/triggers/trigger-record-change/CHANGELOG.md b/packages/triggers/trigger-record-change/CHANGELOG.md index f278600226..7d470842ae 100644 --- a/packages/triggers/trigger-record-change/CHANGELOG.md +++ b/packages/triggers/trigger-record-change/CHANGELOG.md @@ -1,5 +1,23 @@ # @objectstack/plugin-trigger-record-change +## 17.0.0-rc.7 + +### Patch Changes + +- Updated dependencies [76d74ec] +- Updated dependencies [211abdb] +- Updated dependencies [08363a0] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] + - @objectstack/spec@17.0.0-rc.7 + - @objectstack/core@17.0.0-rc.7 + ## 17.0.0-rc.6 ### Patch Changes diff --git a/packages/triggers/trigger-record-change/package.json b/packages/triggers/trigger-record-change/package.json index d038124708..c811fcad1c 100644 --- a/packages/triggers/trigger-record-change/package.json +++ b/packages/triggers/trigger-record-change/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/trigger-record-change", - "version": "17.0.0-rc.6", + "version": "17.0.0-rc.7", "license": "Apache-2.0", "description": "Record-change flow trigger for ObjectStack — auto-launches flows on object insert/update/delete via ObjectQL lifecycle hooks (ADR-0018)", "main": "dist/index.js", diff --git a/packages/triggers/trigger-schedule/CHANGELOG.md b/packages/triggers/trigger-schedule/CHANGELOG.md index 0d59fadb10..8c3532ad74 100644 --- a/packages/triggers/trigger-schedule/CHANGELOG.md +++ b/packages/triggers/trigger-schedule/CHANGELOG.md @@ -1,5 +1,23 @@ # @objectstack/plugin-trigger-schedule +## 17.0.0-rc.7 + +### Patch Changes + +- Updated dependencies [76d74ec] +- Updated dependencies [211abdb] +- Updated dependencies [08363a0] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] + - @objectstack/spec@17.0.0-rc.7 + - @objectstack/core@17.0.0-rc.7 + ## 17.0.0-rc.6 ### Patch Changes diff --git a/packages/triggers/trigger-schedule/package.json b/packages/triggers/trigger-schedule/package.json index 1c18b5c86f..47420658e0 100644 --- a/packages/triggers/trigger-schedule/package.json +++ b/packages/triggers/trigger-schedule/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/trigger-schedule", - "version": "17.0.0-rc.6", + "version": "17.0.0-rc.7", "license": "Apache-2.0", "description": "Schedule flow trigger for ObjectStack — auto-launches flows on a cron/interval/once schedule via the IJobService (ADR-0018)", "main": "dist/index.js", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index b52624d317..df841fd4ee 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/types +## 17.0.0-rc.7 + +### Patch Changes + +- Updated dependencies [76d74ec] +- Updated dependencies [211abdb] +- Updated dependencies [08363a0] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] + - @objectstack/spec@17.0.0-rc.7 + ## 17.0.0-rc.6 ### Minor Changes diff --git a/packages/types/package.json b/packages/types/package.json index c99045a807..aa12cad7fb 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/types", - "version": "17.0.0-rc.6", + "version": "17.0.0-rc.7", "license": "Apache-2.0", "description": "Shared interfaces describing the ObjectStack Runtime environment", "main": "dist/index.js", diff --git a/packages/verify/CHANGELOG.md b/packages/verify/CHANGELOG.md index 298d51210c..c5a1404fbc 100644 --- a/packages/verify/CHANGELOG.md +++ b/packages/verify/CHANGELOG.md @@ -1,5 +1,43 @@ # @objectstack/verify +## 17.0.0-rc.7 + +### Patch Changes + +- Updated dependencies [76d74ec] +- Updated dependencies [c546c89] +- Updated dependencies [db31402] +- Updated dependencies [211abdb] +- Updated dependencies [8e17759] +- Updated dependencies [08363a0] +- Updated dependencies [05ac83d] +- Updated dependencies [cf7c694] +- Updated dependencies [603cab8] +- Updated dependencies [f293d45] +- Updated dependencies [7bc02f4] +- Updated dependencies [edbf873] +- Updated dependencies [91eddca] +- Updated dependencies [b61afc1] +- Updated dependencies [8dd98bf] +- Updated dependencies [8a9c079] +- Updated dependencies [c6a4eeb] +- Updated dependencies [1059965] + - @objectstack/spec@17.0.0-rc.7 + - @objectstack/objectql@17.0.0-rc.7 + - @objectstack/runtime@17.0.0-rc.7 + - @objectstack/service-automation@17.0.0-rc.7 + - @objectstack/rest@17.0.0-rc.7 + - @objectstack/plugin-security@17.0.0-rc.7 + - @objectstack/core@17.0.0-rc.7 + - @objectstack/platform-objects@17.0.0-rc.7 + - @objectstack/plugin-auth@17.0.0-rc.7 + - @objectstack/plugin-hono-server@17.0.0-rc.7 + - @objectstack/plugin-sharing@17.0.0-rc.7 + - @objectstack/service-analytics@17.0.0-rc.7 + - @objectstack/service-datasource@17.0.0-rc.7 + - @objectstack/service-settings@17.0.0-rc.7 + - @objectstack/types@17.0.0-rc.7 + ## 17.0.0-rc.6 ### Major Changes diff --git a/packages/verify/package.json b/packages/verify/package.json index 9b33c6b30f..0722413c53 100644 --- a/packages/verify/package.json +++ b/packages/verify/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/verify", - "version": "17.0.0-rc.6", + "version": "17.0.0-rc.7", "license": "Apache-2.0", "description": "Boot any ObjectStack app in-process and verify it through the real HTTP stack — auto-derived CRUD round-trip fidelity plus the cross-owner RLS invariant. Catches runtime regressions that static checks miss.", "type": "module",