From e4a3917402a9d88d1b01711229ae3361346b438c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 2 Jun 2026 06:25:59 +0000 Subject: [PATCH] chore: version packages --- .changeset/adr-0018-m3-http-notify.md | 36 --- .../adr-0018-m5-webhooks-shared-outbox.md | 32 --- .changeset/adr-0032-expression-validation.md | 32 --- .changeset/bpmn-construct-mapping.md | 25 -- .changeset/client-approvals-namespace.md | 38 --- .changeset/docs-adr0031-control-flow.md | 15 -- .../durable-suspended-flow-runs-1518.md | 37 --- .changeset/enforce-validation-rules-1475.md | 40 ---- .../fix-build-optional-driver-bundling.md | 14 -- .changeset/fix-dev-seed-admin-in-process.md | 29 --- .changeset/fix-docs-mdx-escape.md | 5 - .../fix-email-htmltotext-sanitization.md | 19 -- .changeset/fix-fixed-group-peer-major.md | 24 -- .changeset/fix-sqlite-wasm-tx-export-1494.md | 13 - .changeset/fix-sys-user-unique-validation.md | 17 -- .../local-crypto-provider-fail-loud-1507.md | 38 --- .changeset/notification-rest-inbox-surface.md | 36 --- .changeset/print-seeded-admin-banner.md | 21 -- .changeset/structured-loop-container.md | 26 -- .changeset/structured-parallel-block.md | 21 -- .changeset/structured-try-catch.md | 24 -- apps/account/CHANGELOG.md | 2 + apps/account/package.json | 2 +- examples/app-crm/CHANGELOG.md | 17 ++ examples/app-crm/package.json | 2 +- examples/app-showcase/CHANGELOG.md | 19 ++ examples/app-showcase/package.json | 2 +- examples/app-todo/CHANGELOG.md | 26 ++ examples/app-todo/package.json | 2 +- packages/adapters/express/CHANGELOG.md | 17 ++ packages/adapters/express/package.json | 2 +- packages/adapters/fastify/CHANGELOG.md | 17 ++ packages/adapters/fastify/package.json | 2 +- packages/adapters/hono/CHANGELOG.md | 19 ++ packages/adapters/hono/package.json | 2 +- packages/adapters/nestjs/CHANGELOG.md | 17 ++ packages/adapters/nestjs/package.json | 2 +- packages/adapters/nextjs/CHANGELOG.md | 17 ++ packages/adapters/nextjs/package.json | 2 +- packages/adapters/nuxt/CHANGELOG.md | 17 ++ packages/adapters/nuxt/package.json | 2 +- packages/adapters/sveltekit/CHANGELOG.md | 17 ++ packages/adapters/sveltekit/package.json | 2 +- packages/cli/CHANGELOG.md | 179 ++++++++++++++ packages/cli/package.json | 2 +- packages/client-react/CHANGELOG.md | 17 ++ packages/client-react/package.json | 2 +- packages/client/CHANGELOG.md | 53 +++++ packages/client/package.json | 2 +- .../connectors/connector-mcp/CHANGELOG.md | 16 ++ .../connectors/connector-mcp/package.json | 2 +- .../connectors/connector-openapi/CHANGELOG.md | 16 ++ .../connectors/connector-openapi/package.json | 2 +- .../connectors/connector-rest/CHANGELOG.md | 16 ++ .../connectors/connector-rest/package.json | 2 +- .../connectors/connector-slack/CHANGELOG.md | 16 ++ .../connectors/connector-slack/package.json | 2 +- packages/console/CHANGELOG.md | 2 + packages/console/package.json | 2 +- packages/core/CHANGELOG.md | 15 ++ packages/core/package.json | 2 +- packages/create-objectstack/CHANGELOG.md | 2 + packages/create-objectstack/package.json | 2 +- packages/formula/CHANGELOG.md | 42 ++++ packages/formula/package.json | 2 +- packages/metadata-core/CHANGELOG.md | 2 + packages/metadata-core/package.json | 2 +- packages/metadata-fs/CHANGELOG.md | 6 + packages/metadata-fs/package.json | 2 +- packages/metadata/CHANGELOG.md | 21 ++ packages/metadata/package.json | 2 +- packages/objectql/CHANGELOG.md | 57 +++++ packages/objectql/package.json | 2 +- packages/observability/CHANGELOG.md | 15 ++ packages/observability/package.json | 2 +- packages/platform-objects/CHANGELOG.md | 29 +++ packages/platform-objects/package.json | 2 +- packages/plugins/driver-memory/CHANGELOG.md | 16 ++ packages/plugins/driver-memory/package.json | 2 +- packages/plugins/driver-mongodb/CHANGELOG.md | 16 ++ packages/plugins/driver-mongodb/package.json | 2 +- packages/plugins/driver-sql/CHANGELOG.md | 16 ++ packages/plugins/driver-sql/package.json | 2 +- .../plugins/driver-sqlite-wasm/CHANGELOG.md | 27 +++ .../plugins/driver-sqlite-wasm/package.json | 2 +- packages/plugins/embedder-openai/CHANGELOG.md | 15 ++ packages/plugins/embedder-openai/package.json | 2 +- .../plugins/knowledge-memory/CHANGELOG.md | 17 ++ .../plugins/knowledge-memory/package.json | 2 +- .../plugins/knowledge-ragflow/CHANGELOG.md | 17 ++ .../plugins/knowledge-ragflow/package.json | 2 +- .../plugins/plugin-approvals/CHANGELOG.md | 20 ++ .../plugins/plugin-approvals/package.json | 2 +- packages/plugins/plugin-audit/CHANGELOG.md | 18 ++ packages/plugins/plugin-audit/package.json | 2 +- packages/plugins/plugin-auth/CHANGELOG.md | 60 +++++ packages/plugins/plugin-auth/package.json | 2 +- packages/plugins/plugin-dev/CHANGELOG.md | 73 ++++++ packages/plugins/plugin-dev/package.json | 2 +- packages/plugins/plugin-email/CHANGELOG.md | 34 +++ packages/plugins/plugin-email/package.json | 2 +- .../plugins/plugin-hono-server/CHANGELOG.md | 17 ++ .../plugins/plugin-hono-server/package.json | 2 +- .../plugins/plugin-mcp-server/CHANGELOG.md | 17 ++ .../plugins/plugin-mcp-server/package.json | 2 +- packages/plugins/plugin-msw/CHANGELOG.md | 30 +++ packages/plugins/plugin-msw/package.json | 2 +- .../plugins/plugin-org-scoping/CHANGELOG.md | 18 ++ .../plugins/plugin-org-scoping/package.json | 2 +- packages/plugins/plugin-reports/CHANGELOG.md | 18 ++ packages/plugins/plugin-reports/package.json | 2 +- packages/plugins/plugin-security/CHANGELOG.md | 18 ++ packages/plugins/plugin-security/package.json | 2 +- packages/plugins/plugin-sharing/CHANGELOG.md | 19 ++ packages/plugins/plugin-sharing/package.json | 2 +- .../plugin-trigger-record-change/CHANGELOG.md | 16 ++ .../plugin-trigger-record-change/package.json | 2 +- .../plugin-trigger-schedule/CHANGELOG.md | 16 ++ .../plugin-trigger-schedule/package.json | 2 +- packages/plugins/plugin-webhooks/CHANGELOG.md | 49 ++++ packages/plugins/plugin-webhooks/package.json | 2 +- packages/rest/CHANGELOG.md | 17 ++ packages/rest/package.json | 2 +- packages/runtime/CHANGELOG.md | 67 ++++++ packages/runtime/package.json | 2 +- packages/services/service-ai/CHANGELOG.md | 55 +++++ packages/services/service-ai/package.json | 2 +- .../services/service-analytics/CHANGELOG.md | 16 ++ .../services/service-analytics/package.json | 2 +- .../services/service-automation/CHANGELOG.md | 170 +++++++++++++ .../services/service-automation/package.json | 2 +- packages/services/service-cache/CHANGELOG.md | 17 ++ packages/services/service-cache/package.json | 2 +- .../service-cluster-redis/CHANGELOG.md | 16 ++ .../service-cluster-redis/package.json | 2 +- .../services/service-cluster/CHANGELOG.md | 16 ++ .../services/service-cluster/package.json | 2 +- .../services/service-datasource/CHANGELOG.md | 36 +++ .../services/service-datasource/package.json | 2 +- packages/services/service-feed/CHANGELOG.md | 16 ++ packages/services/service-feed/package.json | 2 +- packages/services/service-i18n/CHANGELOG.md | 16 ++ packages/services/service-i18n/package.json | 2 +- packages/services/service-job/CHANGELOG.md | 18 ++ packages/services/service-job/package.json | 2 +- .../services/service-knowledge/CHANGELOG.md | 16 ++ .../services/service-knowledge/package.json | 2 +- .../services/service-messaging/CHANGELOG.md | 109 +++++++++ .../services/service-messaging/package.json | 2 +- .../services/service-package/CHANGELOG.md | 16 ++ .../services/service-package/package.json | 2 +- packages/services/service-queue/CHANGELOG.md | 18 ++ packages/services/service-queue/package.json | 2 +- .../services/service-realtime/CHANGELOG.md | 18 ++ .../services/service-realtime/package.json | 2 +- .../services/service-settings/CHANGELOG.md | 54 +++++ .../services/service-settings/package.json | 2 +- .../services/service-storage/CHANGELOG.md | 17 ++ .../services/service-storage/package.json | 2 +- packages/spec/CHANGELOG.md | 223 ++++++++++++++++++ packages/spec/package.json | 2 +- packages/types/CHANGELOG.md | 15 ++ packages/types/package.json | 2 +- packages/vscode-objectstack/CHANGELOG.md | 2 + packages/vscode-objectstack/package.json | 2 +- 165 files changed, 2256 insertions(+), 614 deletions(-) delete mode 100644 .changeset/adr-0018-m3-http-notify.md delete mode 100644 .changeset/adr-0018-m5-webhooks-shared-outbox.md delete mode 100644 .changeset/adr-0032-expression-validation.md delete mode 100644 .changeset/bpmn-construct-mapping.md delete mode 100644 .changeset/client-approvals-namespace.md delete mode 100644 .changeset/docs-adr0031-control-flow.md delete mode 100644 .changeset/durable-suspended-flow-runs-1518.md delete mode 100644 .changeset/enforce-validation-rules-1475.md delete mode 100644 .changeset/fix-build-optional-driver-bundling.md delete mode 100644 .changeset/fix-dev-seed-admin-in-process.md delete mode 100644 .changeset/fix-docs-mdx-escape.md delete mode 100644 .changeset/fix-email-htmltotext-sanitization.md delete mode 100644 .changeset/fix-fixed-group-peer-major.md delete mode 100644 .changeset/fix-sqlite-wasm-tx-export-1494.md delete mode 100644 .changeset/fix-sys-user-unique-validation.md delete mode 100644 .changeset/local-crypto-provider-fail-loud-1507.md delete mode 100644 .changeset/notification-rest-inbox-surface.md delete mode 100644 .changeset/print-seeded-admin-banner.md delete mode 100644 .changeset/structured-loop-container.md delete mode 100644 .changeset/structured-parallel-block.md delete mode 100644 .changeset/structured-try-catch.md diff --git a/.changeset/adr-0018-m3-http-notify.md b/.changeset/adr-0018-m3-http-notify.md deleted file mode 100644 index db43c79d44..0000000000 --- a/.changeset/adr-0018-m3-http-notify.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -"@objectstack/service-messaging": minor -"@objectstack/service-automation": minor -"@objectstack/spec": minor ---- - -ADR-0018 M3: unified `http` / `notify` executors backed by a generic HTTP outbox. - -Promotes a reliable outbound-HTTP delivery outbox into `service-messaging` (the -raw-callout counterpart to the notification outbox) and routes the Flow `http` -node through it — closing the "`http_request` is a bare `fetch()` with no retry" -gap. The five divergent outbound verbs collapse onto canonical `http` / `notify`. - -**`@objectstack/service-messaging` (additive):** - -- `IHttpOutbox` / `HttpDelivery` generic raw-callout shape - (`source` / `refId` / `dedupKey` / `label` / `signingSecret`), `SqlHttpOutbox` - over a new `sys_http_delivery` object, `MemoryHttpOutbox`, `HttpDispatcher` - (per-partition cluster lock, claim/ack/retry/dead-letter), and a shared - `sendOnce` + 7-step jittered retry schedule. -- `MessagingService` gains `setHttpOutbox()` / `isHttpDeliveryReady()` / - `enqueueHttp()`; the plugin wires the outbox + dispatcher at `kernel:ready`. - -**`@objectstack/service-automation`:** - -- Canonical `http` executor — `durable: true` enqueues onto the messaging HTTP - outbox (retry/dead-letter); otherwise an inline `fetch()` preserving - `http_request`'s request/response semantics. -- `engine.registerNodeAlias()` — registers a delegating executor + a - `deprecated` / `aliasOf` descriptor. `http_request` / `http_call` / `webhook` - are now deprecated aliases of `http`; existing flows keep running. -- `notify` descriptor marked `needsOutbox` (its delivery is outbox-backed). - -**`@objectstack/spec`:** `flow.zod` adds `http` to the builtin node-type seed set. - -`plugin-webhooks` cut-over to the shared outbox is a deliberate follow-up. diff --git a/.changeset/adr-0018-m5-webhooks-shared-outbox.md b/.changeset/adr-0018-m5-webhooks-shared-outbox.md deleted file mode 100644 index 6f3ddd57a1..0000000000 --- a/.changeset/adr-0018-m5-webhooks-shared-outbox.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -"@objectstack/plugin-webhooks": minor -"@objectstack/service-messaging": minor ---- - -ADR-0018 M3 (Phase 5): `plugin-webhooks` now delivers through the shared -`service-messaging` HTTP outbox instead of its own. - -The webhook delivery substrate — durable outbox, cluster-coordinated dispatcher, -retry/backoff/dead-letter, retention — is removed from `plugin-webhooks` and -replaced by the generic `sys_http_delivery` outbox + `HttpDispatcher` in -`@objectstack/service-messaging`. Webhooks keep only their domain concerns: the -`sys_webhook` config object, the `AutoEnqueuer` (now enqueues `source: 'webhook'` -rows via `messaging.enqueueHttp`), and the redeliver admin endpoint (now backed -by `messaging.redeliverHttp`). - -**`@objectstack/service-messaging`:** `MessagingService` gains `redeliverHttp(id)` -and `listHttp(filter)` over the HTTP outbox. - -**`@objectstack/plugin-webhooks` — BREAKING:** - -- Now **requires** `MessagingServicePlugin` (declared as a plugin dependency). -- Removed exports: `WebhookDispatcher`, `MemoryWebhookOutbox`, `SqlWebhookOutbox` - (and the `./sql` subpath), `DeliveryRetentionSweeper`, `hashPartition`, - `sendOnce` / `classifyAttempt` / `nextRetryDelayMs`, and the `IWebhookOutbox` / - `WebhookDelivery` / `EnqueueInput` / `AckResult` / `RedeliverError` types. -- Removed the `sys_webhook_delivery` object — webhook deliveries are now rows in - `sys_http_delivery` (`source = 'webhook'`). The Setup nav points there. -- `AutoEnqueuer`'s constructor takes an `HttpEnqueueFn` instead of an - `IWebhookOutbox`. -- `WebhookOutboxPluginOptions` reduced to `{ autoEnqueue }` (dispatcher / outbox / - retention / nodeId options removed — those now live on `MessagingServicePlugin`). diff --git a/.changeset/adr-0032-expression-validation.md b/.changeset/adr-0032-expression-validation.md deleted file mode 100644 index 837f6df333..0000000000 --- a/.changeset/adr-0032-expression-validation.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -"@objectstack/formula": minor -"@objectstack/service-automation": minor -"@objectstack/service-ai": minor -"@objectstack/cli": minor -"@objectstack/spec": patch ---- - -ADR-0032 (phase 1): validate-by-default expression layer — no silent failure. - -Kills the #1491 class where a malformed predicate (e.g. the `{record.x}` -template-brace-in-CEL mistake) silently evaluated to `false` and made a flow -"fire" with no effect: - -- **service-automation**: flow `evaluateCondition` no longer swallows CEL - failures to `false` — it throws an attributed, corrective error; and - `registerFlow` now parse-validates every predicate (start/decision/edge - condition) at registration, failing loudly with the offending location + - source + the fix. -- **formula**: new shared validator — `validateExpression(role, src, schema?)`, - `introspectScope`, `CEL_STDLIB_FUNCTIONS` — with schema-aware field-existence - + did-you-mean. The `{{ }}` template engine gains a formatter whitelist - (`currency`/`number`/`percent`/`date`/`datetime`/`truncate`/`upper`/`lower`/ - `default`/…) with defined value→string semantics; arbitrary logic in holes is - rejected. Plain `{{ path }}` stays back-compatible. -- **cli**: `objectstack compile` validates every flow / validation-rule / - field-formula predicate against the resolved object schema and fails the - build with located, corrective messages. -- **service-ai**: new agent-callable `validate_expression` tool so authoring - agents self-correct before committing. -- **spec**: fix the `FlowSchema` JSDoc example that taught the bad - `condition: "{amount} < 500"` single-brace form. diff --git a/.changeset/bpmn-construct-mapping.md b/.changeset/bpmn-construct-mapping.md deleted file mode 100644 index bcb175fcfd..0000000000 --- a/.changeset/bpmn-construct-mapping.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -"@objectstack/spec": minor ---- - -feat(automation): BPMN ⇄ structured-construct model mapping (ADR-0031, task 5) - -Add the semantic bridge between the structured control-flow constructs (the -native model) and the BPMN gateway/boundary/multi-instance vocabulary (kept for -interop only), at the **flow-model level** — independent of any wire format -(`automation/bpmn-mapping.ts`): - -- `exportConstructsToBpmn(flow)` expands each construct into its BPMN - interchange shape — `parallel` → `parallel_gateway` (AND-split) + branch - regions + `join_gateway` (AND-join); `try_catch` → the protected activity + - an error `boundary_event` + the handler region; `loop` → its body marked with - multi-instance loop characteristics — so external BPM tools see a well-formed - BPMN graph. Each expansion's anchor carries an `osConstruct` extension marker. -- `importBpmnToConstructs(flow)` folds that BPMN shape back into the constructs: - exact reconstruction from the `osConstruct` marker (so `construct → BPMN → - construct` is identity), and a best-effort structural fold of foreign - `parallel_gateway`/`join_gateway` pairs, with diagnostics for shapes it can't - safely fold. - -BPMN 2.0 **XML** (de)serialization layers on top of this mapping and remains a -plugin concern (per `bpmn-interop.zod.ts`), out of scope here. diff --git a/.changeset/client-approvals-namespace.md b/.changeset/client-approvals-namespace.md deleted file mode 100644 index 842d25e20e..0000000000 --- a/.changeset/client-approvals-namespace.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -'@objectstack/client': minor -'@objectstack/spec': minor ---- - -client SDK: add `approvals` namespace; remove dead workflow approve/reject surface (ADR-0019) - -ADR-0019 collapsed approval into Flow: approval is no longer a workflow step but -a first-class **flow node** that opens a request and suspends the run, with a -human decision resuming the flow down the matching `approve` / `reject` edge. -The server already exposes this as a dedicated `/api/v1/approvals` surface -(`registerApprovalsEndpoints`), but the client SDK still carried the old -approval-on-`workflow` methods, which pointed at routes that never existed. - -- **`@objectstack/client`** gains a `client.approvals` namespace backed by the - real REST surface: - - `listRequests(filter?)` → `GET /approvals/requests` (the "my approvals" - inbox; filter by `status` (single or array), `object`, `recordId`, - `approverId`, `submitterId`). - - `getRequest(id)` → `GET /approvals/requests/:id`. - - `approve(id, { actorId?, comment? })` / `reject(id, …)` → - `POST /approvals/requests/:id/{approve,reject}` (records a decision and - resumes the owning flow run). - - `listActions(id)` → `GET /approvals/requests/:id/actions` (audit trail). - - The approval runtime types (`ApprovalRequestRow`, `ApprovalActionRow`, - `ApprovalStatus`, `ApprovalDecisionInput`, `ApprovalDecisionResult`) are - re-exported so consumers can type the namespace without reaching into - `@objectstack/spec`. - -- **Removed the dead workflow approve/reject surface.** `client.workflow.approve` - / `client.workflow.reject` and the backing `WorkflowApprove*` / `WorkflowReject*` - protocol schemas, types, `IProtocolService` methods, and the `/approve` / - `/reject` entries in `DEFAULT_WORKFLOW_ROUTES` are gone — approval decisions - are no longer recorded on a workflow record. `workflow` is reclaimed for state - machines, so `getConfig` / `getState` / `transition` are unchanged. - -- Discovery advertises the new route key: `ApiRoutesSchema.approvals`. diff --git a/.changeset/docs-adr0031-control-flow.md b/.changeset/docs-adr0031-control-flow.md deleted file mode 100644 index e4ae16dd1b..0000000000 --- a/.changeset/docs-adr0031-control-flow.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -"@objectstack/spec": patch ---- - -docs(automation): document ADR-0031 control-flow constructs; fix dangling reference card - -- **guide**: `content/docs/guides/metadata/flow.mdx` now documents the structured - control-flow constructs — the `loop` container, `parallel` block (implicit - join), and `try_catch` (try/catch/retry) — with config examples and the - region/DAG model. The Node Types table is updated accordingly. -- **doc generator**: `build-docs.ts` now cards only reference pages that were - actually generated. Control-flow's schemas embed CEL-expression transforms - (like `Flow`/`FlowEdge`) and so have no JSON-Schema page; the index previously - carded every `.zod.ts`, producing a dangling "Control Flow" 404 link. Cards - now align with `meta.json` (generated pages only). diff --git a/.changeset/durable-suspended-flow-runs-1518.md b/.changeset/durable-suspended-flow-runs-1518.md deleted file mode 100644 index fe2601a9d1..0000000000 --- a/.changeset/durable-suspended-flow-runs-1518.md +++ /dev/null @@ -1,37 +0,0 @@ ---- -"@objectstack/service-automation": minor ---- - -Persist suspended flow runs so a durable pause survives a process restart (#1518). - -`service-automation` kept suspended runs in an in-memory `Map` only, so a flow -paused at an `approval` / `wait` / `screen` node could never be resumed after the -process restarted — a hard blocker on hibernating/serverless hosts (e.g. the -Cloudflare Workers control plane), where the approval record persists but -`resume(runId)` had nothing to continue. - -The engine now backs that map with a pluggable `SuspendedRunStore` (ADR-0019): - -- **`SuspendedRunStore`** interface + two implementations — `InMemorySuspendedRunStore` - (the default; JSON round-trips so it faithfully mirrors a DB boundary) and - `ObjectStoreSuspendedRunStore`, which persists to a new **`sys_automation_run`** - system object via the ObjectQL engine. `AutomationServicePlugin` registers the - object and auto-enables the DB-backed store when an ObjectQL engine is present - (opt out with `suspendedRunStore: 'memory'`). -- **Durable suspend/resume** — a run is persisted on suspend and deleted on - terminal completion. `resume(runId)` rehydrates from the store when the run is - not in memory (cold boot), so a fully restarted kernel can continue from the - paused node down the correct branch and run the downstream nodes. The resumable - state (`variables` / `steps` / `context` / `screen`) round-trips through the - store, including nested objects. -- **Idempotent resume** — the suspension is consumed before downstream work runs, - plus an in-process guard rejects a concurrent duplicate `resume`, so a repeated - resume after a partial restart can't double-run side effects. -- Run ids are now process-unique (random component) so they don't collide with a - still-suspended run persisted by a previous process lifetime. - -New exports: `SuspendedRun`, `SuspendedRunStore`, `StepLogEntry`, -`InMemorySuspendedRunStore`, `ObjectStoreSuspendedRunStore`, -`SuspendedRunStoreEngine`, `SysAutomationRun`, plus -`AutomationEngine.setSuspendedRunStore()` and `listSuspendedRunsDurable()`. -Existing service-automation and plugin-approvals tests pass unchanged. diff --git a/.changeset/enforce-validation-rules-1475.md b/.changeset/enforce-validation-rules-1475.md deleted file mode 100644 index e586b73b3f..0000000000 --- a/.changeset/enforce-validation-rules-1475.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -"@objectstack/objectql": minor -"@objectstack/spec": minor ---- - -Enforce every declared validation-rule type on the write path; trim the three that can't be (#1475). - -The `validations` union advertised nine rule types but only three (`state_machine`, -`cross_field`, `script`) ran on insert/update — the other six were accepted by the -schema yet silently did nothing. This closes that gap on both sides: implement the -synchronous types, and trim the ones that don't belong in a write-path rule. - -**`@objectstack/objectql` (additive):** the rule evaluator now enforces three more -types, all deterministic, synchronous, side-effect-free predicates over one record: - -- `format` — a field value against a `regex` and/or a named format - (`email` / `url` / `phone` / `json`). Runs only when the write touches the field - and the value is non-empty; a malformed regex fails open. -- `json_schema` — a JSON field validated against a JSON Schema via `ajv` (compiled - result memoised per schema). Accepts a parsed object or a JSON string; an - unparseable string is itself a violation; an uncompilable schema fails open. -- `conditional` — evaluates `when`, then recurses into `then` / `otherwise`. The - nested rule supplies the message; the outer conditional's `severity` decides - blocking. `needsPriorRecord` now recurses into conditional branches. - -Adds `ajv` as a dependency and three error codes (`invalid_format`, `invalid_json`, -`json_schema_violation`). - -**`@objectstack/spec` (breaking for unused declarations):** removes the -`unique`, `async`, and `custom` validation-rule variants (and the -`UniquenessValidationSchema` / `AsyncValidationSchema` / `CustomValidatorSchema` -exports). They were never enforced and each needs I/O or a handler model a -write-path rule must not carry. Use the layer that already does each correctly: -uniqueness → a unique index (`ObjectSchema.indexes`, `partial` for scope) or -field-level `unique: true`; async/remote → the client form layer; custom code → -a `beforeInsert` / `beforeUpdate` lifecycle hook. Field-level `unique: true` is -unaffected. - -`examples/app-showcase` demonstrates and verifies each newly-enforced type. See the -ADR-0020 addendum for the rationale. diff --git a/.changeset/fix-build-optional-driver-bundling.md b/.changeset/fix-build-optional-driver-bundling.md deleted file mode 100644 index a8c9110855..0000000000 --- a/.changeset/fix-build-optional-driver-bundling.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -"@objectstack/plugin-dev": patch -"@objectstack/service-datasource": patch ---- - -fix(build): don't bundle lazily-imported optional drivers (fixes build break from #1524). - -After moving optional internal `@objectstack/*` peerDependencies off `peer` (to -stop the changesets fixed-group major cascade), tsup no longer auto-externalized -them and began bundling the lazily `await import()`-ed driver packages — pulling -in their optional native clients (`mysql` / `oracledb` via knex) and failing the -build. Fix: `service-datasource` externalizes `@objectstack/driver-*` in tsup -(kept as devDeps for tests); `plugin-dev` moves its framework packages to -`dependencies` (auto-externalized; it's a dev-only plugin). Full build green. diff --git a/.changeset/fix-dev-seed-admin-in-process.md b/.changeset/fix-dev-seed-admin-in-process.md deleted file mode 100644 index 8ffc875e3b..0000000000 --- a/.changeset/fix-dev-seed-admin-in-process.md +++ /dev/null @@ -1,29 +0,0 @@ ---- -"@objectstack/plugin-auth": patch -"@objectstack/cli": patch -"@objectstack/plugin-dev": patch ---- - -fix(dev): seed the dev admin in-process and fix the port-drift seed failure. - -`os dev` (and `pnpm dev:showcase`) seeded the admin over HTTP against a -hard-coded `localhost:3000`. In dev, `serve` auto-shifts off a busy port, so -the seed POST hit the wrong server (or nothing) and the running instance never -got an admin. A second, divergent seed in `plugin-dev` inserted a -credential-less `sys_user` row that could not log in. - -Consolidate to a single in-process seed: - -- **`@objectstack/plugin-auth`** — `maybeSeedDevAdmin()` runs on `kernel:ready` - and creates `admin@objectos.ai` / `admin123` through better-auth's real - `signUpEmail` pipeline (hashed credential), so the account is loginable; - `plugin-security` then promotes it to platform admin. Empty-DB only - (excludes the system service account), idempotent, never overwrites an - existing account. Hard-gated to `NODE_ENV=development`; opt out with - `OS_SEED_ADMIN=0`. -- **`@objectstack/cli`** — removed the HTTP seed; `--seed-admin` now passes - `OS_SEED_ADMIN[_EMAIL|_PASSWORD]` to the serve child. `serve` publishes its - actually-bound port over IPC and to a `runtime..json` state file under - `OS_HOME`. -- **`@objectstack/plugin-dev`** — removed the credential-less raw insert; - `seedAdminUser` maps to the unified `OS_SEED_ADMIN` toggle. diff --git a/.changeset/fix-docs-mdx-escape.md b/.changeset/fix-docs-mdx-escape.md deleted file mode 100644 index 82dab30b3c..0000000000 --- a/.changeset/fix-docs-mdx-escape.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@objectstack/spec": patch ---- - -Fix the docs generator (`build-docs.ts`) leaking an unmatched `<` / `{` into generated MDX, which broke the `apps/docs` Turbopack build (e.g. a SemVer range `">=4.0 <5"` in a `.describe()` string was read as the start of a JSX tag). Unmatched openers are now emitted as HTML entities (`<` / `{`); union-variant descriptions also go through the escaper. diff --git a/.changeset/fix-email-htmltotext-sanitization.md b/.changeset/fix-email-htmltotext-sanitization.md deleted file mode 100644 index 2d5b85beda..0000000000 --- a/.changeset/fix-email-htmltotext-sanitization.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -'@objectstack/plugin-email': patch ---- - -Harden `htmlToText` against double-escaping and incomplete tag stripping - -Fixes two CodeQL high-severity alerts in `template-engine.ts`: - -- `js/double-escaping`: the order-dependent chain of single-entity - `.replace()` calls could double-unescape (e.g. `&lt;` → `<` → `<`). - Entities are now decoded in a single left-to-right pass via one alternation - regex, so each entity decodes exactly once. -- `js/incomplete-multi-character-sanitization`: the single `<[^>]+>` strip - could leave a live tag behind on crafted/overlapping input - (e.g. `ipt>`). Tag stripping now loops until the string is - stable, and runs before entity decoding so decoding cannot re-introduce a - tag. - -Adds adversarial unit tests covering nested entities and overlapping tags. diff --git a/.changeset/fix-fixed-group-peer-major.md b/.changeset/fix-fixed-group-peer-major.md deleted file mode 100644 index aabc12906b..0000000000 --- a/.changeset/fix-fixed-group-peer-major.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -"@objectstack/cli": patch -"@objectstack/express": patch -"@objectstack/sveltekit": patch -"@objectstack/hono": patch -"@objectstack/nuxt": patch -"@objectstack/nextjs": patch -"@objectstack/nestjs": patch -"@objectstack/fastify": patch -"@objectstack/plugin-msw": patch -"@objectstack/plugin-dev": patch -"@objectstack/service-datasource": patch -"@objectstack/service-ai": patch ---- - -fix(release): stop the fixed-group major cascade caused by internal `@objectstack/*` peerDependencies. - -These packages declared workspace peerDependencies on other framework packages -in the changesets `fixed` group. Inside a fixed group, changesets rewrites those -peer ranges on every release and treats a peer-range change as breaking → major, -which cascaded to **all 69 packages → 8.0.0** on *any* minor changeset. Required -internal peers are now regular `dependencies`; optional ones move to -`devDependencies` (kept for in-workspace tests, no longer a published peer edge). -Releases now bump correctly (patch/minor) instead of a spurious major. diff --git a/.changeset/fix-sqlite-wasm-tx-export-1494.md b/.changeset/fix-sqlite-wasm-tx-export-1494.md deleted file mode 100644 index 8925dac3a4..0000000000 --- a/.changeset/fix-sqlite-wasm-tx-export-1494.md +++ /dev/null @@ -1,13 +0,0 @@ ---- -"@objectstack/driver-sqlite-wasm": patch ---- - -Fix `COMMIT; - cannot commit - no transaction is active` under `persist: 'on-write'` (#1494). - -sql.js's `Database.export()` closes and reopens the database (it has no in-place -serialize), which rolls back any open transaction. The fire-and-forget flush -triggered after a write inside a Knex transaction (e.g. the autonumber sequence -`BEGIN…COMMIT`) could therefore abort that transaction, leaving the trailing -`COMMIT` to fail. The connection is now transaction-aware: `flush()` is deferred -while a transaction is open and runs once it fully closes, so committed data is -still persisted without aborting in-flight transactions. diff --git a/.changeset/fix-sys-user-unique-validation.md b/.changeset/fix-sys-user-unique-validation.md deleted file mode 100644 index 610b7ce0b6..0000000000 --- a/.changeset/fix-sys-user-unique-validation.md +++ /dev/null @@ -1,17 +0,0 @@ ---- -'@objectstack/platform-objects': patch ---- - -Fix `sys_user` load failure after the validation-rule type trim (#1485) - -#1485 trimmed the unenforceable validation-rule types (`unique`, `async`, -`custom`) from the `ValidationRuleSchema` discriminated union, but `sys_user` -still declared an `email_unique` rule with `type: 'unique'`. Loading the object -then threw a `ZodError` ("Invalid discriminator value … at validations[0].type"), -failing `platform-objects.test.ts` and turning `main` red. - -The rule was redundant: `sys_user` already declares a unique index on `email` -(`indexes: [{ fields: ['email'], unique: true }]`), and the user table is -managed by better-auth which enforces email uniqueness at the source. Removed -the unenforceable validation rule; uniqueness remains enforced by the index. -No other object uses a trimmed validation type. diff --git a/.changeset/local-crypto-provider-fail-loud-1507.md b/.changeset/local-crypto-provider-fail-loud-1507.md deleted file mode 100644 index 5f2975fc1d..0000000000 --- a/.changeset/local-crypto-provider-fail-loud-1507.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -"@objectstack/service-settings": minor -"@objectstack/cli": patch -"@objectstack/spec": patch ---- - -Fail loud instead of silently minting an ephemeral encryption key; ship a persistent env-master-key provider as the default (#1507). - -The default `ICryptoProvider` backs every secret-at-rest in the platform — -encrypted settings (`sys_setting.value_enc`), ObjectQL `secret` fields, and -runtime datasource credentials. Its key resolution previously fell back, -**silently**, to a fresh per-process `randomBytes(32)` key (or auto-minted a -new on-disk key on every boot) when no stable key was available. In an -ephemeral-FS container or a multi-node cluster, each restart / each node then -encrypts under a different key, and every previously-written `sys_secret` value -becomes undecryptable. The failure was invisible at encrypt and boot time and -only surfaced later as "all my saved passwords / API keys / DB credentials -fail to decrypt". - -- **Renamed `InMemoryCryptoProvider` → `LocalCryptoProvider`.** The old name - implied an ephemeral key when the provider in fact persists one. - `InMemoryCryptoProvider` stays as a deprecated alias for backward - compatibility. -- **Added `OS_SECRET_KEY`** as the canonical production master key (32-byte - hex or base64), the documented production default. `OS_DEV_CRYPTO_KEY` - remains the dev convenience key. -- **Fail-loud in production.** When `NODE_ENV=production` and no stable key - source (env var or a pre-existing persisted file) is available, the provider - now throws an actionable error at construction instead of generating a key — - turning silent data-loss into a config error at boot. It never auto-mints a - key in production. Development and test keep the ergonomic fallback - (persisted dev key / ephemeral test key). -- `serve` surfaces the production-key error verbatim and refuses to wire an - unstable provider for `secret` fields. - -KMS / Vault providers (managed custody, per-tenant keys, automatic rotation) -remain future/enterprise plug-ins behind the same `ICryptoProvider` seam; -"your stored secret is still there after a reboot" stays open-source. diff --git a/.changeset/notification-rest-inbox-surface.md b/.changeset/notification-rest-inbox-surface.md deleted file mode 100644 index b3ce168f5a..0000000000 --- a/.changeset/notification-rest-inbox-surface.md +++ /dev/null @@ -1,36 +0,0 @@ ---- -'@objectstack/service-messaging': minor -'@objectstack/runtime': minor ---- - -Implement the `/api/v1/notifications` REST surface (ADR-0030) - -The notification REST routes (`GET /notifications`, `POST /notifications/read`, -`POST /notifications/read/all`) were declared in the spec but never had a -server-side handler — no plugin registered the `notification` core service, so -the routes were never advertised in discovery and `client.notifications.*` -calls 404'd. (The Console bell works today only because it bypasses these -endpoints and reads the inbox via the generic data API.) - -This wires the surface end-to-end against the ADR-0030 L5 model: - -- **`MessagingService`** gains an inbox read API: `listInbox(userId, opts)` - reads `sys_inbox_message` joined with `sys_notification_receipt` for - read-state (a message is unread until its event has a `read`/`clicked`/ - `dismissed` receipt); `markRead(userId, ids)` and `markAllRead(userId)` - upsert the receipt to `read`, keyed `(notification_id, user_id, - channel:'inbox')` — updating the existing `delivered` receipt in place, - inserting only when absent. No reliance on the re-modeled `sys_notification` - L2 event (which carries no recipient/read columns). -- **`MessagingServicePlugin`** now also registers the messaging service under - the `notification` core service slot, so the dispatcher resolves + advertises - the routes. The legacy `INotificationService.send()` abstraction is unused and - unconsumed. -- **`HttpDispatcher`** gains `handleNotification` + a `/notifications` dispatch - branch: it takes the authenticated user from the execution context and maps - list / mark-read / mark-all-read to the service. Responses match the spec - schemas (`{ notifications, unreadCount }`, `{ success, readCount }`). - -Pairs with the objectui SDK consumer repoint (`useClientNotifications` → -`markRead`/`registerDevice` signatures). Device registration and preference -endpoints remain out of scope (unimplemented as before). diff --git a/.changeset/print-seeded-admin-banner.md b/.changeset/print-seeded-admin-banner.md deleted file mode 100644 index 6a048a64d4..0000000000 --- a/.changeset/print-seeded-admin-banner.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -"@objectstack/plugin-auth": patch -"@objectstack/cli": patch ---- - -fix(dev): surface the seeded dev-admin credentials in the `serve` startup banner. - -When the runtime seeds the dev admin on an empty DB, the confirmation was -emitted via `ctx.logger` during `runtime.start()` — inside serve's boot-quiet -window — so it was swallowed and never reached the console. plugin-auth now -records the seed result on the `auth` service and `serve` prints it in the -ready banner (after stdout is restored), e.g.: - -``` - 🔑 Dev admin: admin@objectos.ai / admin123 - seeded on empty DB · dev only — do not use in production -``` - -Shown only when an admin was actually seeded this boot (empty DB) — never on a -DB that already had a user, so stale credentials are never displayed. Visible -in both `serve --dev` and `os dev` (the child's stdout is inherited). diff --git a/.changeset/structured-loop-container.md b/.changeset/structured-loop-container.md deleted file mode 100644 index c52e729dc6..0000000000 --- a/.changeset/structured-loop-container.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -"@objectstack/spec": minor -"@objectstack/service-automation": minor ---- - -feat(automation): structured control-flow constructs (ADR-0031) — loop container - -Adopt structured control-flow as the native, AI-authored flow model (ADR-0031), -choosing representation **(B) nested sub-structure**: containers carry their body -as a self-contained single-entry/single-exit region in `config`. - -- **spec**: new `automation/control-flow.zod.ts` defining the `loop` container - (`config.body`), `parallel` block (`config.branches[]`, implicit join), and - `try/catch/retry` (`config.try`/`config.catch`/`config.retry`) configs, plus - region well-formedness analysis (`analyzeRegion`, `findRegionEntry`) and - `validateControlFlow` (single-entry/single-exit, acyclic; bounded loop). -- **engine**: `registerFlow()` now rejects malformed control-flow regions before - a flow can run; new `AutomationEngine.runRegion()` executes a body region in - the enclosing variable scope without touching the shared DAG traversal. -- **loop executor**: replaces the no-op `loop` stub with a real iteration - container — binds the iterator/index variables and runs the body once per item - under a hard max-iteration guard. Legacy flat-graph loops (no `config.body`) - keep working — the construct is additive. - -Parallel-block and try/catch *engine execution* and BPMN interop mapping remain -follow-ups (issue #1479, tasks 3–5). diff --git a/.changeset/structured-parallel-block.md b/.changeset/structured-parallel-block.md deleted file mode 100644 index 947965db30..0000000000 --- a/.changeset/structured-parallel-block.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -"@objectstack/service-automation": minor ---- - -feat(automation): structured parallel block (ADR-0031, task 3) - -Implement engine execution for the `parallel` block — a structured construct -with an **implicit join** (ADR-0031 §Decision 2). The `parallel` node declares N -branch regions in `config.branches[]`; the executor runs them concurrently in -the enclosing variable scope (via `AutomationEngine.runRegion`) and continues -once when all branches complete — no author-visible split/join gateway. - -- New `builtin/parallel-node.ts` executor (registered as a built-in). -- Branch failure fails the block (surfaced as a node failure → fault edge/error - handling); durable pause inside a branch is a clear error. -- Well-formedness (≥2 branches, single-entry/single-exit regions) is already - enforced at `registerFlow()` by `validateControlFlow` (shipped with the loop - container). - -Showcase `FanOutNotifyFlow` demonstrates the parallel block. Try/catch execution -and BPMN interop mapping remain follow-ups (#1479 tasks 4–5). diff --git a/.changeset/structured-try-catch.md b/.changeset/structured-try-catch.md deleted file mode 100644 index 9ea9f12d88..0000000000 --- a/.changeset/structured-try-catch.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -"@objectstack/service-automation": minor ---- - -feat(automation): structured try/catch/retry block (ADR-0031, task 4) - -Implement engine execution for the `try_catch` construct — structured error -handling (ADR-0031 §Decision 3). The node runs a protected `try` region; on -failure it retries with exponential backoff (`config.retry`), and if it still -fails the optional `catch` region runs with the caught error bound to -`config.errorVariable` (default `$error`). Both regions execute in the enclosing -variable scope via `AutomationEngine.runRegion`. - -- New `builtin/try-catch-node.ts` executor (registered as a built-in). -- `try` success (incl. a successful retry) → node succeeds; `catch` handling a - failure → node succeeds; no `catch` / failing `catch` → node fails to the - flow's fault edge / error handling. -- Well-formedness (single-entry/single-exit `try`/`catch` regions) is already - enforced at `registerFlow()` by `validateControlFlow` (shipped with the loop - container). - -Showcase `ResilientSyncFlow` demonstrates the construct. This completes the -native control-flow execution trio (loop / parallel / try-catch); BPMN interop -mapping remains a follow-up (#1479 task 5). diff --git a/apps/account/CHANGELOG.md b/apps/account/CHANGELOG.md index 7910940e48..c009c4c89d 100644 --- a/apps/account/CHANGELOG.md +++ b/apps/account/CHANGELOG.md @@ -1,5 +1,7 @@ # @objectstack/account +## 7.6.0 + ## 7.5.0 ## 7.4.1 diff --git a/apps/account/package.json b/apps/account/package.json index a928113b2d..c7ed6d566a 100644 --- a/apps/account/package.json +++ b/apps/account/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/account", - "version": "7.5.0", + "version": "7.6.0", "description": "ObjectStack Account - End-user account & organization self-service portal", "license": "Apache-2.0", "type": "module", diff --git a/examples/app-crm/CHANGELOG.md b/examples/app-crm/CHANGELOG.md index b4897ad487..23c532afef 100644 --- a/examples/app-crm/CHANGELOG.md +++ b/examples/app-crm/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/example-crm +## 4.0.34 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [8e539cc] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/runtime@7.6.0 + ## 4.0.33 ### Patch Changes diff --git a/examples/app-crm/package.json b/examples/app-crm/package.json index cdb88dca21..ccaa3480af 100644 --- a/examples/app-crm/package.json +++ b/examples/app-crm/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/example-crm", - "version": "4.0.33", + "version": "4.0.34", "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 f464ffd73c..891f2f9c5c 100644 --- a/examples/app-showcase/CHANGELOG.md +++ b/examples/app-showcase/CHANGELOG.md @@ -1,5 +1,24 @@ # @objectstack/example-showcase +## 0.1.4 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [8e539cc] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/runtime@7.6.0 + - @objectstack/connector-rest@7.6.0 + - @objectstack/connector-slack@7.6.0 + ## 0.1.3 ### Patch Changes diff --git a/examples/app-showcase/package.json b/examples/app-showcase/package.json index b2629426a4..31b170d130 100644 --- a/examples/app-showcase/package.json +++ b/examples/app-showcase/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/example-showcase", - "version": "0.1.3", + "version": "0.1.4", "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, AI). 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 85ec8f685f..24fb38269c 100644 --- a/examples/app-todo/CHANGELOG.md +++ b/examples/app-todo/CHANGELOG.md @@ -1,5 +1,31 @@ # @objectstack/example-todo +## 4.0.34 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [3377e38] +- Updated dependencies [be20aa4] +- Updated dependencies [55866f5] +- Updated dependencies [8e539cc] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/service-ai@7.6.0 + - @objectstack/client@7.6.0 + - @objectstack/objectql@7.6.0 + - @objectstack/driver-sqlite-wasm@7.6.0 + - @objectstack/runtime@7.6.0 + - @objectstack/metadata@7.6.0 + - @objectstack/knowledge-memory@7.6.0 + - @objectstack/service-knowledge@7.6.0 + ## 4.0.33 ### Patch Changes diff --git a/examples/app-todo/package.json b/examples/app-todo/package.json index 7e3d75246c..646cea934c 100644 --- a/examples/app-todo/package.json +++ b/examples/app-todo/package.json @@ -1,6 +1,6 @@ { "name": "@example/app-todo", - "version": "4.0.33", + "version": "4.0.34", "description": "Example Todo App using ObjectStack Protocol", "license": "Apache-2.0", "private": true, diff --git a/packages/adapters/express/CHANGELOG.md b/packages/adapters/express/CHANGELOG.md index c0594ac6d1..5955fa9ca3 100644 --- a/packages/adapters/express/CHANGELOG.md +++ b/packages/adapters/express/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/express +## 7.6.0 + +### Patch Changes + +- 3377e38: fix(release): stop the fixed-group major cascade caused by internal `@objectstack/*` peerDependencies. + + These packages declared workspace peerDependencies on other framework packages + in the changesets `fixed` group. Inside a fixed group, changesets rewrites those + peer ranges on every release and treats a peer-range change as breaking → major, + which cascaded to **all 69 packages → 8.0.0** on _any_ minor changeset. Required + internal peers are now regular `dependencies`; optional ones move to + `devDependencies` (kept for in-workspace tests, no longer a published peer edge). + Releases now bump correctly (patch/minor) instead of a spurious major. + +- Updated dependencies [8e539cc] + - @objectstack/runtime@7.6.0 + ## 7.5.0 ## 7.4.1 diff --git a/packages/adapters/express/package.json b/packages/adapters/express/package.json index 7e0a68be53..80fef49496 100644 --- a/packages/adapters/express/package.json +++ b/packages/adapters/express/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/express", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/adapters/fastify/CHANGELOG.md b/packages/adapters/fastify/CHANGELOG.md index 531d6510d6..323acc5661 100644 --- a/packages/adapters/fastify/CHANGELOG.md +++ b/packages/adapters/fastify/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/fastify +## 7.6.0 + +### Patch Changes + +- 3377e38: fix(release): stop the fixed-group major cascade caused by internal `@objectstack/*` peerDependencies. + + These packages declared workspace peerDependencies on other framework packages + in the changesets `fixed` group. Inside a fixed group, changesets rewrites those + peer ranges on every release and treats a peer-range change as breaking → major, + which cascaded to **all 69 packages → 8.0.0** on _any_ minor changeset. Required + internal peers are now regular `dependencies`; optional ones move to + `devDependencies` (kept for in-workspace tests, no longer a published peer edge). + Releases now bump correctly (patch/minor) instead of a spurious major. + +- Updated dependencies [8e539cc] + - @objectstack/runtime@7.6.0 + ## 7.5.0 ## 7.4.1 diff --git a/packages/adapters/fastify/package.json b/packages/adapters/fastify/package.json index 933fa5f97a..f057f8a80d 100644 --- a/packages/adapters/fastify/package.json +++ b/packages/adapters/fastify/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/fastify", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/adapters/hono/CHANGELOG.md b/packages/adapters/hono/CHANGELOG.md index 12ab0cf18d..39e78138bc 100644 --- a/packages/adapters/hono/CHANGELOG.md +++ b/packages/adapters/hono/CHANGELOG.md @@ -1,5 +1,24 @@ # @objectstack/hono +## 7.6.0 + +### Patch Changes + +- 3377e38: fix(release): stop the fixed-group major cascade caused by internal `@objectstack/*` peerDependencies. + + These packages declared workspace peerDependencies on other framework packages + in the changesets `fixed` group. Inside a fixed group, changesets rewrites those + peer ranges on every release and treats a peer-range change as breaking → major, + which cascaded to **all 69 packages → 8.0.0** on _any_ minor changeset. Required + internal peers are now regular `dependencies`; optional ones move to + `devDependencies` (kept for in-workspace tests, no longer a published peer edge). + Releases now bump correctly (patch/minor) instead of a spurious major. + +- Updated dependencies [8e539cc] + - @objectstack/runtime@7.6.0 + - @objectstack/plugin-hono-server@7.6.0 + - @objectstack/types@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/adapters/hono/package.json b/packages/adapters/hono/package.json index 5b33fa12df..b63480d569 100644 --- a/packages/adapters/hono/package.json +++ b/packages/adapters/hono/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/hono", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/adapters/nestjs/CHANGELOG.md b/packages/adapters/nestjs/CHANGELOG.md index c210ec2849..fcf591eb6a 100644 --- a/packages/adapters/nestjs/CHANGELOG.md +++ b/packages/adapters/nestjs/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/nestjs +## 7.6.0 + +### Patch Changes + +- 3377e38: fix(release): stop the fixed-group major cascade caused by internal `@objectstack/*` peerDependencies. + + These packages declared workspace peerDependencies on other framework packages + in the changesets `fixed` group. Inside a fixed group, changesets rewrites those + peer ranges on every release and treats a peer-range change as breaking → major, + which cascaded to **all 69 packages → 8.0.0** on _any_ minor changeset. Required + internal peers are now regular `dependencies`; optional ones move to + `devDependencies` (kept for in-workspace tests, no longer a published peer edge). + Releases now bump correctly (patch/minor) instead of a spurious major. + +- Updated dependencies [8e539cc] + - @objectstack/runtime@7.6.0 + ## 7.5.0 ## 7.4.1 diff --git a/packages/adapters/nestjs/package.json b/packages/adapters/nestjs/package.json index 8329bc0134..7c4c8ec867 100644 --- a/packages/adapters/nestjs/package.json +++ b/packages/adapters/nestjs/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/nestjs", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/adapters/nextjs/CHANGELOG.md b/packages/adapters/nextjs/CHANGELOG.md index 87e9054ea2..5c1f6a7994 100644 --- a/packages/adapters/nextjs/CHANGELOG.md +++ b/packages/adapters/nextjs/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/nextjs +## 7.6.0 + +### Patch Changes + +- 3377e38: fix(release): stop the fixed-group major cascade caused by internal `@objectstack/*` peerDependencies. + + These packages declared workspace peerDependencies on other framework packages + in the changesets `fixed` group. Inside a fixed group, changesets rewrites those + peer ranges on every release and treats a peer-range change as breaking → major, + which cascaded to **all 69 packages → 8.0.0** on _any_ minor changeset. Required + internal peers are now regular `dependencies`; optional ones move to + `devDependencies` (kept for in-workspace tests, no longer a published peer edge). + Releases now bump correctly (patch/minor) instead of a spurious major. + +- Updated dependencies [8e539cc] + - @objectstack/runtime@7.6.0 + ## 7.5.0 ## 7.4.1 diff --git a/packages/adapters/nextjs/package.json b/packages/adapters/nextjs/package.json index 24cf1a70d5..d746ad341c 100644 --- a/packages/adapters/nextjs/package.json +++ b/packages/adapters/nextjs/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/nextjs", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/adapters/nuxt/CHANGELOG.md b/packages/adapters/nuxt/CHANGELOG.md index b251ca3ae7..48b4bbe49f 100644 --- a/packages/adapters/nuxt/CHANGELOG.md +++ b/packages/adapters/nuxt/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/nuxt +## 7.6.0 + +### Patch Changes + +- 3377e38: fix(release): stop the fixed-group major cascade caused by internal `@objectstack/*` peerDependencies. + + These packages declared workspace peerDependencies on other framework packages + in the changesets `fixed` group. Inside a fixed group, changesets rewrites those + peer ranges on every release and treats a peer-range change as breaking → major, + which cascaded to **all 69 packages → 8.0.0** on _any_ minor changeset. Required + internal peers are now regular `dependencies`; optional ones move to + `devDependencies` (kept for in-workspace tests, no longer a published peer edge). + Releases now bump correctly (patch/minor) instead of a spurious major. + +- Updated dependencies [8e539cc] + - @objectstack/runtime@7.6.0 + ## 7.5.0 ## 7.4.1 diff --git a/packages/adapters/nuxt/package.json b/packages/adapters/nuxt/package.json index c99f477428..e66bb55a67 100644 --- a/packages/adapters/nuxt/package.json +++ b/packages/adapters/nuxt/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/nuxt", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/adapters/sveltekit/CHANGELOG.md b/packages/adapters/sveltekit/CHANGELOG.md index 399de4561b..2e0cd9d509 100644 --- a/packages/adapters/sveltekit/CHANGELOG.md +++ b/packages/adapters/sveltekit/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/sveltekit +## 7.6.0 + +### Patch Changes + +- 3377e38: fix(release): stop the fixed-group major cascade caused by internal `@objectstack/*` peerDependencies. + + These packages declared workspace peerDependencies on other framework packages + in the changesets `fixed` group. Inside a fixed group, changesets rewrites those + peer ranges on every release and treats a peer-range change as breaking → major, + which cascaded to **all 69 packages → 8.0.0** on _any_ minor changeset. Required + internal peers are now regular `dependencies`; optional ones move to + `devDependencies` (kept for in-workspace tests, no longer a published peer edge). + Releases now bump correctly (patch/minor) instead of a spurious major. + +- Updated dependencies [8e539cc] + - @objectstack/runtime@7.6.0 + ## 7.5.0 ## 7.4.1 diff --git a/packages/adapters/sveltekit/package.json b/packages/adapters/sveltekit/package.json index 723d0619b4..4e789c743a 100644 --- a/packages/adapters/sveltekit/package.json +++ b/packages/adapters/sveltekit/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/sveltekit", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/cli/CHANGELOG.md b/packages/cli/CHANGELOG.md index 695829a2c6..d2cf8318db 100644 --- a/packages/cli/CHANGELOG.md +++ b/packages/cli/CHANGELOG.md @@ -1,5 +1,184 @@ # @objectstack/cli +## 7.6.0 + +### Minor Changes + +- c4a4cbd: ADR-0032 (phase 1): validate-by-default expression layer — no silent failure. + + Kills the #1491 class where a malformed predicate (e.g. the `{record.x}` + template-brace-in-CEL mistake) silently evaluated to `false` and made a flow + "fire" with no effect: + + - **service-automation**: flow `evaluateCondition` no longer swallows CEL + failures to `false` — it throws an attributed, corrective error; and + `registerFlow` now parse-validates every predicate (start/decision/edge + condition) at registration, failing loudly with the offending location + + source + the fix. + - **formula**: new shared validator — `validateExpression(role, src, schema?)`, + `introspectScope`, `CEL_STDLIB_FUNCTIONS` — with schema-aware field-existence + - did-you-mean. The `{{ }}` template engine gains a formatter whitelist + (`currency`/`number`/`percent`/`date`/`datetime`/`truncate`/`upper`/`lower`/ + `default`/…) with defined value→string semantics; arbitrary logic in holes is + rejected. Plain `{{ path }}` stays back-compatible. + - **cli**: `objectstack compile` validates every flow / validation-rule / + field-formula predicate against the resolved object schema and fails the + build with located, corrective messages. + - **service-ai**: new agent-callable `validate_expression` tool so authoring + agents self-correct before committing. + - **spec**: fix the `FlowSchema` JSDoc example that taught the bad + `condition: "{amount} < 500"` single-brace form. + +### Patch Changes + +- 8c01eea: fix(dev): seed the dev admin in-process and fix the port-drift seed failure. + + `os dev` (and `pnpm dev:showcase`) seeded the admin over HTTP against a + hard-coded `localhost:3000`. In dev, `serve` auto-shifts off a busy port, so + the seed POST hit the wrong server (or nothing) and the running instance never + got an admin. A second, divergent seed in `plugin-dev` inserted a + credential-less `sys_user` row that could not log in. + + Consolidate to a single in-process seed: + + - **`@objectstack/plugin-auth`** — `maybeSeedDevAdmin()` runs on `kernel:ready` + and creates `admin@objectos.ai` / `admin123` through better-auth's real + `signUpEmail` pipeline (hashed credential), so the account is loginable; + `plugin-security` then promotes it to platform admin. Empty-DB only + (excludes the system service account), idempotent, never overwrites an + existing account. Hard-gated to `NODE_ENV=development`; opt out with + `OS_SEED_ADMIN=0`. + - **`@objectstack/cli`** — removed the HTTP seed; `--seed-admin` now passes + `OS_SEED_ADMIN[_EMAIL|_PASSWORD]` to the serve child. `serve` publishes its + actually-bound port over IPC and to a `runtime..json` state file under + `OS_HOME`. + - **`@objectstack/plugin-dev`** — removed the credential-less raw insert; + `seedAdminUser` maps to the unified `OS_SEED_ADMIN` toggle. + +- 3377e38: fix(release): stop the fixed-group major cascade caused by internal `@objectstack/*` peerDependencies. + + These packages declared workspace peerDependencies on other framework packages + in the changesets `fixed` group. Inside a fixed group, changesets rewrites those + peer ranges on every release and treats a peer-range change as breaking → major, + which cascaded to **all 69 packages → 8.0.0** on _any_ minor changeset. Required + internal peers are now regular `dependencies`; optional ones move to + `devDependencies` (kept for in-workspace tests, no longer a published peer edge). + Releases now bump correctly (patch/minor) instead of a spurious major. + +- 55866f5: Fail loud instead of silently minting an ephemeral encryption key; ship a persistent env-master-key provider as the default (#1507). + + The default `ICryptoProvider` backs every secret-at-rest in the platform — + encrypted settings (`sys_setting.value_enc`), ObjectQL `secret` fields, and + runtime datasource credentials. Its key resolution previously fell back, + **silently**, to a fresh per-process `randomBytes(32)` key (or auto-minted a + new on-disk key on every boot) when no stable key was available. In an + ephemeral-FS container or a multi-node cluster, each restart / each node then + encrypts under a different key, and every previously-written `sys_secret` value + becomes undecryptable. The failure was invisible at encrypt and boot time and + only surfaced later as "all my saved passwords / API keys / DB credentials + fail to decrypt". + + - **Renamed `InMemoryCryptoProvider` → `LocalCryptoProvider`.** The old name + implied an ephemeral key when the provider in fact persists one. + `InMemoryCryptoProvider` stays as a deprecated alias for backward + compatibility. + - **Added `OS_SECRET_KEY`** as the canonical production master key (32-byte + hex or base64), the documented production default. `OS_DEV_CRYPTO_KEY` + remains the dev convenience key. + - **Fail-loud in production.** When `NODE_ENV=production` and no stable key + source (env var or a pre-existing persisted file) is available, the provider + now throws an actionable error at construction instead of generating a key — + turning silent data-loss into a config error at boot. It never auto-mints a + key in production. Development and test keep the ergonomic fallback + (persisted dev key / ephemeral test key). + - `serve` surfaces the production-key error verbatim and refuses to wire an + unstable provider for `secret` fields. + + KMS / Vault providers (managed custody, per-tenant keys, automatic rotation) + remain future/enterprise plug-ins behind the same `ICryptoProvider` seam; + "your stored secret is still there after a reboot" stays open-source. + +- b7a4f14: fix(dev): surface the seeded dev-admin credentials in the `serve` startup banner. + + When the runtime seeds the dev admin on an empty DB, the confirmation was + emitted via `ctx.logger` during `runtime.start()` — inside serve's boot-quiet + window — so it was swallowed and never reached the console. plugin-auth now + records the seed result on the `auth` service and `serve` prints it in the + ready banner (after stdout is restored), e.g.: + + ``` + 🔑 Dev admin: admin@objectos.ai / admin123 + seeded on empty DB · dev only — do not use in production + ``` + + Shown only when an admin was actually seeded this boot (empty DB) — never on a + DB that already had a user, so stale credentials are never displayed. Visible + in both `serve --dev` and `os dev` (the child's stdout is inherited). + +- Updated dependencies [955d4c8] +- Updated dependencies [11905fa] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [cf03ef2] +- Updated dependencies [7648242] +- Updated dependencies [bb04824] +- Updated dependencies [8c01eea] +- Updated dependencies [8fa1e7f] +- Updated dependencies [d8aa11d] +- Updated dependencies [3377e38] +- Updated dependencies [be20aa4] +- Updated dependencies [7ae6abc] +- Updated dependencies [55866f5] +- Updated dependencies [8e539cc] +- Updated dependencies [b7a4f14] +- Updated dependencies [60f9c45] +- Updated dependencies [f06a6a5] +- Updated dependencies [4ee139d] + - @objectstack/service-messaging@7.6.0 + - @objectstack/service-automation@7.6.0 + - @objectstack/spec@7.6.0 + - @objectstack/plugin-webhooks@7.6.0 + - @objectstack/formula@7.6.0 + - @objectstack/service-ai@7.6.0 + - @objectstack/client@7.6.0 + - @objectstack/objectql@7.6.0 + - @objectstack/service-datasource@7.6.0 + - @objectstack/plugin-auth@7.6.0 + - @objectstack/plugin-email@7.6.0 + - @objectstack/driver-sqlite-wasm@7.6.0 + - @objectstack/platform-objects@7.6.0 + - @objectstack/service-settings@7.6.0 + - @objectstack/runtime@7.6.0 + - @objectstack/plugin-approvals@7.6.0 + - @objectstack/account@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/observability@7.6.0 + - @objectstack/driver-memory@7.6.0 + - @objectstack/driver-mongodb@7.6.0 + - @objectstack/driver-sql@7.6.0 + - @objectstack/plugin-audit@7.6.0 + - @objectstack/plugin-hono-server@7.6.0 + - @objectstack/plugin-mcp-server@7.6.0 + - @objectstack/plugin-org-scoping@7.6.0 + - @objectstack/plugin-reports@7.6.0 + - @objectstack/plugin-security@7.6.0 + - @objectstack/plugin-sharing@7.6.0 + - @objectstack/plugin-trigger-record-change@7.6.0 + - @objectstack/plugin-trigger-schedule@7.6.0 + - @objectstack/rest@7.6.0 + - @objectstack/service-analytics@7.6.0 + - @objectstack/service-cache@7.6.0 + - @objectstack/service-feed@7.6.0 + - @objectstack/service-job@7.6.0 + - @objectstack/service-package@7.6.0 + - @objectstack/service-queue@7.6.0 + - @objectstack/service-realtime@7.6.0 + - @objectstack/service-storage@7.6.0 + - @objectstack/types@7.6.0 + - @objectstack/console@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/cli/package.json b/packages/cli/package.json index dfa03203b7..b006e6e01e 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/cli", - "version": "7.5.0", + "version": "7.6.0", "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 24d5723c16..39aa220ad9 100644 --- a/packages/client-react/CHANGELOG.md +++ b/packages/client-react/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/client-react +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/client@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/client-react/package.json b/packages/client-react/package.json index 2a0d73984b..1660058d90 100644 --- a/packages/client-react/package.json +++ b/packages/client-react/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/client-react", - "version": "7.5.0", + "version": "7.6.0", "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 8c7a4b078a..2b11cd83a9 100644 --- a/packages/client/CHANGELOG.md +++ b/packages/client/CHANGELOG.md @@ -1,5 +1,58 @@ # @objectstack/client +## 7.6.0 + +### Minor Changes + +- 2170ad9: client SDK: add `approvals` namespace; remove dead workflow approve/reject surface (ADR-0019) + + ADR-0019 collapsed approval into Flow: approval is no longer a workflow step but + a first-class **flow node** that opens a request and suspends the run, with a + human decision resuming the flow down the matching `approve` / `reject` edge. + The server already exposes this as a dedicated `/api/v1/approvals` surface + (`registerApprovalsEndpoints`), but the client SDK still carried the old + approval-on-`workflow` methods, which pointed at routes that never existed. + + - **`@objectstack/client`** gains a `client.approvals` namespace backed by the + real REST surface: + + - `listRequests(filter?)` → `GET /approvals/requests` (the "my approvals" + inbox; filter by `status` (single or array), `object`, `recordId`, + `approverId`, `submitterId`). + - `getRequest(id)` → `GET /approvals/requests/:id`. + - `approve(id, { actorId?, comment? })` / `reject(id, …)` → + `POST /approvals/requests/:id/{approve,reject}` (records a decision and + resumes the owning flow run). + - `listActions(id)` → `GET /approvals/requests/:id/actions` (audit trail). + + The approval runtime types (`ApprovalRequestRow`, `ApprovalActionRow`, + `ApprovalStatus`, `ApprovalDecisionInput`, `ApprovalDecisionResult`) are + re-exported so consumers can type the namespace without reaching into + `@objectstack/spec`. + + - **Removed the dead workflow approve/reject surface.** `client.workflow.approve` + / `client.workflow.reject` and the backing `WorkflowApprove*` / `WorkflowReject*` + protocol schemas, types, `IProtocolService` methods, and the `/approve` / + `/reject` entries in `DEFAULT_WORKFLOW_ROUTES` are gone — approval decisions + are no longer recorded on a workflow record. `workflow` is reclaimed for state + machines, so `getConfig` / `getState` / `transition` are unchanged. + + - Discovery advertises the new route key: `ApiRoutesSchema.approvals`. + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/client/package.json b/packages/client/package.json index 292dd05b37..7967015c77 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/client", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Official Client SDK for ObjectStack Protocol", "main": "dist/index.js", diff --git a/packages/connectors/connector-mcp/CHANGELOG.md b/packages/connectors/connector-mcp/CHANGELOG.md index 261f3a4e66..1bbacee1ed 100644 --- a/packages/connectors/connector-mcp/CHANGELOG.md +++ b/packages/connectors/connector-mcp/CHANGELOG.md @@ -1,5 +1,21 @@ # @objectstack/connector-mcp +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/connectors/connector-mcp/package.json b/packages/connectors/connector-mcp/package.json index 28bf444068..fa1507d313 100644 --- a/packages/connectors/connector-mcp/package.json +++ b/packages/connectors/connector-mcp/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/connector-mcp", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Model Context Protocol (MCP) connector for ObjectStack — a generic adapter that turns any MCP server's tools into a connector's actions on the automation engine's connector registry (ADR-0024).", "main": "dist/index.js", diff --git a/packages/connectors/connector-openapi/CHANGELOG.md b/packages/connectors/connector-openapi/CHANGELOG.md index 1af273dfc5..75c10a5cb0 100644 --- a/packages/connectors/connector-openapi/CHANGELOG.md +++ b/packages/connectors/connector-openapi/CHANGELOG.md @@ -1,5 +1,21 @@ # @objectstack/connector-openapi +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/connectors/connector-openapi/package.json b/packages/connectors/connector-openapi/package.json index 7f15a18172..db5d871ee6 100644 --- a/packages/connectors/connector-openapi/package.json +++ b/packages/connectors/connector-openapi/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/connector-openapi", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "OpenAPI 3.x connector generator for ObjectStack — turns a declarative OpenAPI document into connector actions on the automation engine's registry, with a self-contained static-auth HTTP transport (ADR-0023).", "main": "dist/index.js", diff --git a/packages/connectors/connector-rest/CHANGELOG.md b/packages/connectors/connector-rest/CHANGELOG.md index b89718de2d..0784f16a16 100644 --- a/packages/connectors/connector-rest/CHANGELOG.md +++ b/packages/connectors/connector-rest/CHANGELOG.md @@ -1,5 +1,21 @@ # @objectstack/connector-rest +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/connectors/connector-rest/package.json b/packages/connectors/connector-rest/package.json index 28bee42ba0..803f0c97f1 100644 --- a/packages/connectors/connector-rest/package.json +++ b/packages/connectors/connector-rest/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/connector-rest", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Generic REST connector for ObjectStack — the reference concrete connector that registers a `request` action on the automation engine's connector registry (ADR-0018 §Addendum).", "main": "dist/index.js", diff --git a/packages/connectors/connector-slack/CHANGELOG.md b/packages/connectors/connector-slack/CHANGELOG.md index 121cea94fd..57ca0eab13 100644 --- a/packages/connectors/connector-slack/CHANGELOG.md +++ b/packages/connectors/connector-slack/CHANGELOG.md @@ -1,5 +1,21 @@ # @objectstack/connector-slack +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/connectors/connector-slack/package.json b/packages/connectors/connector-slack/package.json index 703c1a3eca..5d1b60a8bd 100644 --- a/packages/connectors/connector-slack/package.json +++ b/packages/connectors/connector-slack/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/connector-slack", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Slack Web API connector for ObjectStack — registers `chat.postMessage` / `chat.update` / `call` actions on the automation engine's connector registry (ADR-0018 §Addendum, ADR-0022).", "main": "dist/index.js", diff --git a/packages/console/CHANGELOG.md b/packages/console/CHANGELOG.md index cc2cfbd0ab..9bc3a21a69 100644 --- a/packages/console/CHANGELOG.md +++ b/packages/console/CHANGELOG.md @@ -1,5 +1,7 @@ # @objectstack/console +## 7.6.0 + ## 7.5.0 ## 7.4.1 diff --git a/packages/console/package.json b/packages/console/package.json index cbb6401928..b49a099ec4 100644 --- a/packages/console/package.json +++ b/packages/console/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/console", - "version": "7.5.0", + "version": "7.6.0", "description": "Prebuilt Console SPA pinned to this @objectstack/framework release. Source of truth: @object-ui/console (https://github.com/objectstack-ai/objectui).", "license": "Apache-2.0", "homepage": "https://github.com/objectstack-ai/framework/tree/main/packages/console", diff --git a/packages/core/CHANGELOG.md b/packages/core/CHANGELOG.md index 0e511a5971..cdd0c220ae 100644 --- a/packages/core/CHANGELOG.md +++ b/packages/core/CHANGELOG.md @@ -1,5 +1,20 @@ # @objectstack/core +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/core/package.json b/packages/core/package.json index 078d6e76c9..d54add3eb1 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/core", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Microkernel Core for ObjectStack", "type": "module", diff --git a/packages/create-objectstack/CHANGELOG.md b/packages/create-objectstack/CHANGELOG.md index 4e8d2e3292..9ad3898f0c 100644 --- a/packages/create-objectstack/CHANGELOG.md +++ b/packages/create-objectstack/CHANGELOG.md @@ -1,5 +1,7 @@ # create-objectstack +## 7.6.0 + ## 7.5.0 ## 7.4.1 diff --git a/packages/create-objectstack/package.json b/packages/create-objectstack/package.json index 095b1f1abc..450779fd35 100644 --- a/packages/create-objectstack/package.json +++ b/packages/create-objectstack/package.json @@ -1,6 +1,6 @@ { "name": "create-objectstack", - "version": "7.5.0", + "version": "7.6.0", "description": "Create a new ObjectStack project — npx create-objectstack", "bin": { "create-objectstack": "./bin/create-objectstack.js" diff --git a/packages/formula/CHANGELOG.md b/packages/formula/CHANGELOG.md index edfe5a81e2..9cb5309a1d 100644 --- a/packages/formula/CHANGELOG.md +++ b/packages/formula/CHANGELOG.md @@ -1,5 +1,47 @@ # @objectstack/formula +## 7.6.0 + +### Minor Changes + +- c4a4cbd: ADR-0032 (phase 1): validate-by-default expression layer — no silent failure. + + Kills the #1491 class where a malformed predicate (e.g. the `{record.x}` + template-brace-in-CEL mistake) silently evaluated to `false` and made a flow + "fire" with no effect: + + - **service-automation**: flow `evaluateCondition` no longer swallows CEL + failures to `false` — it throws an attributed, corrective error; and + `registerFlow` now parse-validates every predicate (start/decision/edge + condition) at registration, failing loudly with the offending location + + source + the fix. + - **formula**: new shared validator — `validateExpression(role, src, schema?)`, + `introspectScope`, `CEL_STDLIB_FUNCTIONS` — with schema-aware field-existence + - did-you-mean. The `{{ }}` template engine gains a formatter whitelist + (`currency`/`number`/`percent`/`date`/`datetime`/`truncate`/`upper`/`lower`/ + `default`/…) with defined value→string semantics; arbitrary logic in holes is + rejected. Plain `{{ path }}` stays back-compatible. + - **cli**: `objectstack compile` validates every flow / validation-rule / + field-formula predicate against the resolved object schema and fails the + build with located, corrective messages. + - **service-ai**: new agent-callable `validate_expression` tool so authoring + agents self-correct before committing. + - **spec**: fix the `FlowSchema` JSDoc example that taught the bad + `condition: "{amount} < 500"` single-brace form. + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/formula/package.json b/packages/formula/package.json index 8b9ceb01ce..7d2584854b 100644 --- a/packages/formula/package.json +++ b/packages/formula/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/formula", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "ObjectStack canonical expression engine — CEL (cel-js) + ObjectStack stdlib + dialect registry", "main": "dist/index.js", diff --git a/packages/metadata-core/CHANGELOG.md b/packages/metadata-core/CHANGELOG.md index e9f706ceaa..15dcbf7c63 100644 --- a/packages/metadata-core/CHANGELOG.md +++ b/packages/metadata-core/CHANGELOG.md @@ -1,5 +1,7 @@ # @objectstack/metadata-core +## 7.6.0 + ## 7.5.0 ## 7.4.1 diff --git a/packages/metadata-core/package.json b/packages/metadata-core/package.json index d50737b2d4..4f60dc877f 100644 --- a/packages/metadata-core/package.json +++ b/packages/metadata-core/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/metadata-core", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Metadata Repository contracts: types, canonicalization, errors, interface (ADR-0008).", "type": "module", diff --git a/packages/metadata-fs/CHANGELOG.md b/packages/metadata-fs/CHANGELOG.md index e429bd10fa..fbf874af33 100644 --- a/packages/metadata-fs/CHANGELOG.md +++ b/packages/metadata-fs/CHANGELOG.md @@ -1,5 +1,11 @@ # @objectstack/metadata-fs +## 7.6.0 + +### Patch Changes + +- @objectstack/metadata-core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/metadata-fs/package.json b/packages/metadata-fs/package.json index e3ff782264..cf7da6b847 100644 --- a/packages/metadata-fs/package.json +++ b/packages/metadata-fs/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/metadata-fs", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "FileSystemRepository: Node-only Repository implementation backed by JSON files and a JSONL change log (ADR-0008).", "type": "module", diff --git a/packages/metadata/CHANGELOG.md b/packages/metadata/CHANGELOG.md index 22d8bd3f1a..f61285a80f 100644 --- a/packages/metadata/CHANGELOG.md +++ b/packages/metadata/CHANGELOG.md @@ -1,5 +1,26 @@ # @objectstack/metadata +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [7ae6abc] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/platform-objects@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/types@7.6.0 + - @objectstack/metadata-core@7.6.0 + - @objectstack/metadata-fs@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/metadata/package.json b/packages/metadata/package.json index 295ae15602..de0cc3a7f8 100644 --- a/packages/metadata/package.json +++ b/packages/metadata/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/metadata", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Metadata loading, saving, and persistence for ObjectStack", "type": "module", diff --git a/packages/objectql/CHANGELOG.md b/packages/objectql/CHANGELOG.md index 05b12d35f2..8384f70d48 100644 --- a/packages/objectql/CHANGELOG.md +++ b/packages/objectql/CHANGELOG.md @@ -1,5 +1,62 @@ # @objectstack/objectql +## 7.6.0 + +### Minor Changes + +- 7648242: Enforce every declared validation-rule type on the write path; trim the three that can't be (#1475). + + The `validations` union advertised nine rule types but only three (`state_machine`, + `cross_field`, `script`) ran on insert/update — the other six were accepted by the + schema yet silently did nothing. This closes that gap on both sides: implement the + synchronous types, and trim the ones that don't belong in a write-path rule. + + **`@objectstack/objectql` (additive):** the rule evaluator now enforces three more + types, all deterministic, synchronous, side-effect-free predicates over one record: + + - `format` — a field value against a `regex` and/or a named format + (`email` / `url` / `phone` / `json`). Runs only when the write touches the field + and the value is non-empty; a malformed regex fails open. + - `json_schema` — a JSON field validated against a JSON Schema via `ajv` (compiled + result memoised per schema). Accepts a parsed object or a JSON string; an + unparseable string is itself a violation; an uncompilable schema fails open. + - `conditional` — evaluates `when`, then recurses into `then` / `otherwise`. The + nested rule supplies the message; the outer conditional's `severity` decides + blocking. `needsPriorRecord` now recurses into conditional branches. + + Adds `ajv` as a dependency and three error codes (`invalid_format`, `invalid_json`, + `json_schema_violation`). + + **`@objectstack/spec` (breaking for unused declarations):** removes the + `unique`, `async`, and `custom` validation-rule variants (and the + `UniquenessValidationSchema` / `AsyncValidationSchema` / `CustomValidatorSchema` + exports). They were never enforced and each needs I/O or a handler model a + write-path rule must not carry. Use the layer that already does each correctly: + uniqueness → a unique index (`ObjectSchema.indexes`, `partial` for scope) or + field-level `unique: true`; async/remote → the client form layer; custom code → + a `beforeInsert` / `beforeUpdate` lifecycle hook. Field-level `unique: true` is + unaffected. + + `examples/app-showcase` demonstrates and verifies each newly-enforced type. See the + ADR-0020 addendum for the rationale. + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/formula@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/types@7.6.0 + - @objectstack/metadata-core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/objectql/package.json b/packages/objectql/package.json index cd090ab347..e08a5d0d8d 100644 --- a/packages/objectql/package.json +++ b/packages/objectql/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/objectql", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Isomorphic ObjectQL Engine for ObjectStack", "main": "dist/index.js", diff --git a/packages/observability/CHANGELOG.md b/packages/observability/CHANGELOG.md index 6d1535cd67..e9edc44b76 100644 --- a/packages/observability/CHANGELOG.md +++ b/packages/observability/CHANGELOG.md @@ -1,5 +1,20 @@ # @objectstack/observability +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/observability/package.json b/packages/observability/package.json index ce579055fa..e828d80376 100644 --- a/packages/observability/package.json +++ b/packages/observability/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/observability", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Observability contracts and exporters for ObjectStack — MetricsRegistry, ErrorReporter, Logger plus noop/console/OTLP-HTTP exporters. Deployment-target neutral; runtime and services depend on this so the same instrumentation works on Cloudflare Workers, Node, and self-hosted Kubernetes.", "type": "module", diff --git a/packages/platform-objects/CHANGELOG.md b/packages/platform-objects/CHANGELOG.md index 2058d2e84f..e8c5276d58 100644 --- a/packages/platform-objects/CHANGELOG.md +++ b/packages/platform-objects/CHANGELOG.md @@ -1,5 +1,34 @@ # @objectstack/platform-objects +## 7.6.0 + +### Patch Changes + +- 7ae6abc: Fix `sys_user` load failure after the validation-rule type trim (#1485) + + #1485 trimmed the unenforceable validation-rule types (`unique`, `async`, + `custom`) from the `ValidationRuleSchema` discriminated union, but `sys_user` + still declared an `email_unique` rule with `type: 'unique'`. Loading the object + then threw a `ZodError` ("Invalid discriminator value … at validations[0].type"), + failing `platform-objects.test.ts` and turning `main` red. + + The rule was redundant: `sys_user` already declares a unique index on `email` + (`indexes: [{ fields: ['email'], unique: true }]`), and the user table is + managed by better-auth which enforces email uniqueness at the source. Removed + the unenforceable validation rule; uniqueness remains enforced by the index. + No other object uses a trimmed validation type. + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/platform-objects/package.json b/packages/platform-objects/package.json index 0f19b3a285..bf59a6104e 100644 --- a/packages/platform-objects/package.json +++ b/packages/platform-objects/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/platform-objects", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Core platform object schemas for ObjectStack — identity, security, audit, tenant, and metadata objects", "main": "dist/index.js", diff --git a/packages/plugins/driver-memory/CHANGELOG.md b/packages/plugins/driver-memory/CHANGELOG.md index 9e8f34b147..c790f332cb 100644 --- a/packages/plugins/driver-memory/CHANGELOG.md +++ b/packages/plugins/driver-memory/CHANGELOG.md @@ -1,5 +1,21 @@ # @objectstack/driver-memory +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/driver-memory/package.json b/packages/plugins/driver-memory/package.json index 89a7a7539a..7b8f46853a 100644 --- a/packages/plugins/driver-memory/package.json +++ b/packages/plugins/driver-memory/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/driver-memory", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "In-Memory Driver for ObjectStack (Reference Implementation)", "main": "dist/index.js", diff --git a/packages/plugins/driver-mongodb/CHANGELOG.md b/packages/plugins/driver-mongodb/CHANGELOG.md index f469c430a4..7d8e58b700 100644 --- a/packages/plugins/driver-mongodb/CHANGELOG.md +++ b/packages/plugins/driver-mongodb/CHANGELOG.md @@ -1,5 +1,21 @@ # @objectstack/driver-mongodb +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/driver-mongodb/package.json b/packages/plugins/driver-mongodb/package.json index d58b8afb62..22ceaa8005 100644 --- a/packages/plugins/driver-mongodb/package.json +++ b/packages/plugins/driver-mongodb/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/driver-mongodb", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "MongoDB Driver for ObjectStack - Native document database driver via official mongodb client", "main": "dist/index.js", diff --git a/packages/plugins/driver-sql/CHANGELOG.md b/packages/plugins/driver-sql/CHANGELOG.md index 0dd61198ec..246e2518de 100644 --- a/packages/plugins/driver-sql/CHANGELOG.md +++ b/packages/plugins/driver-sql/CHANGELOG.md @@ -1,5 +1,21 @@ # @objectstack/driver-sql +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/driver-sql/package.json b/packages/plugins/driver-sql/package.json index 79e9bd6e60..25823f68c1 100644 --- a/packages/plugins/driver-sql/package.json +++ b/packages/plugins/driver-sql/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/driver-sql", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "SQL Driver for ObjectStack - Supports PostgreSQL, MySQL, SQLite via Knex", "main": "dist/index.js", diff --git a/packages/plugins/driver-sqlite-wasm/CHANGELOG.md b/packages/plugins/driver-sqlite-wasm/CHANGELOG.md index 2a939c0272..c600311ef7 100644 --- a/packages/plugins/driver-sqlite-wasm/CHANGELOG.md +++ b/packages/plugins/driver-sqlite-wasm/CHANGELOG.md @@ -1,5 +1,32 @@ # @objectstack/driver-sqlite-wasm +## 7.6.0 + +### Patch Changes + +- be20aa4: Fix `COMMIT; - cannot commit - no transaction is active` under `persist: 'on-write'` (#1494). + + sql.js's `Database.export()` closes and reopens the database (it has no in-place + serialize), which rolls back any open transaction. The fire-and-forget flush + triggered after a write inside a Knex transaction (e.g. the autonumber sequence + `BEGIN…COMMIT`) could therefore abort that transaction, leaving the trailing + `COMMIT` to fail. The connection is now transaction-aware: `flush()` is deferred + while a transaction is open and runs once it fully closes, so committed data is + still persisted without aborting in-flight transactions. + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/driver-sql@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/driver-sqlite-wasm/package.json b/packages/plugins/driver-sqlite-wasm/package.json index 6b969f6df0..04284e6fcc 100644 --- a/packages/plugins/driver-sqlite-wasm/package.json +++ b/packages/plugins/driver-sqlite-wasm/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/driver-sqlite-wasm", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "WASM SQLite Driver for ObjectStack — runs in browser/WebContainer (StackBlitz) without native bindings", "keywords": [ diff --git a/packages/plugins/embedder-openai/CHANGELOG.md b/packages/plugins/embedder-openai/CHANGELOG.md index 12ba7d5b10..594b41eab2 100644 --- a/packages/plugins/embedder-openai/CHANGELOG.md +++ b/packages/plugins/embedder-openai/CHANGELOG.md @@ -1,5 +1,20 @@ # @objectstack/embedder-openai +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/embedder-openai/package.json b/packages/plugins/embedder-openai/package.json index fbb609c227..a83d6ee271 100644 --- a/packages/plugins/embedder-openai/package.json +++ b/packages/plugins/embedder-openai/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/embedder-openai", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "OpenAI-compatible embedder for ObjectStack — works against OpenAI, 阿里通义 DashScope, 智谱 BigModel, 硅基流动 SiliconFlow, 火山引擎 Doubao, MiniMax, Ollama, and any drop-in OpenAI-shape endpoint.", "main": "dist/index.js", diff --git a/packages/plugins/knowledge-memory/CHANGELOG.md b/packages/plugins/knowledge-memory/CHANGELOG.md index a7a9b9a29c..f22fdaf010 100644 --- a/packages/plugins/knowledge-memory/CHANGELOG.md +++ b/packages/plugins/knowledge-memory/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/knowledge-memory +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/service-knowledge@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/knowledge-memory/package.json b/packages/plugins/knowledge-memory/package.json index db92066fa6..40db26beaf 100644 --- a/packages/plugins/knowledge-memory/package.json +++ b/packages/plugins/knowledge-memory/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/knowledge-memory", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "In-memory knowledge adapter for ObjectStack (dev / test reference implementation).", "main": "dist/index.js", diff --git a/packages/plugins/knowledge-ragflow/CHANGELOG.md b/packages/plugins/knowledge-ragflow/CHANGELOG.md index 4ce2e3836a..1eb3e7f3b8 100644 --- a/packages/plugins/knowledge-ragflow/CHANGELOG.md +++ b/packages/plugins/knowledge-ragflow/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/knowledge-ragflow +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/service-knowledge@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/knowledge-ragflow/package.json b/packages/plugins/knowledge-ragflow/package.json index 31d7ebecd3..b7fbd3cd32 100644 --- a/packages/plugins/knowledge-ragflow/package.json +++ b/packages/plugins/knowledge-ragflow/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/knowledge-ragflow", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "RAGFlow knowledge adapter for ObjectStack — production-grade RAG via the Apache 2.0 RAGFlow REST API.", "main": "dist/index.js", diff --git a/packages/plugins/plugin-approvals/CHANGELOG.md b/packages/plugins/plugin-approvals/CHANGELOG.md index d8cdfc49e4..ee2c342c95 100644 --- a/packages/plugins/plugin-approvals/CHANGELOG.md +++ b/packages/plugins/plugin-approvals/CHANGELOG.md @@ -1,5 +1,25 @@ # @objectstack/plugin-approvals +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [7ae6abc] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/formula@7.6.0 + - @objectstack/platform-objects@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/metadata-core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/plugin-approvals/package.json b/packages/plugins/plugin-approvals/package.json index 63c45c700d..e36b7a866a 100644 --- a/packages/plugins/plugin-approvals/package.json +++ b/packages/plugins/plugin-approvals/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/plugin-approvals", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Multi-step approval engine for ObjectStack — sys_approval_process + sys_approval_request + sys_approval_action + IApprovalService.", "main": "dist/index.js", diff --git a/packages/plugins/plugin-audit/CHANGELOG.md b/packages/plugins/plugin-audit/CHANGELOG.md index 2a25399f79..8eff6e7466 100644 --- a/packages/plugins/plugin-audit/CHANGELOG.md +++ b/packages/plugins/plugin-audit/CHANGELOG.md @@ -1,5 +1,23 @@ # @objectstack/plugin-audit +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [7ae6abc] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/platform-objects@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/plugin-audit/package.json b/packages/plugins/plugin-audit/package.json index c453c51362..6ecbbaa42a 100644 --- a/packages/plugins/plugin-audit/package.json +++ b/packages/plugins/plugin-audit/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/plugin-audit", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Audit Plugin for ObjectStack — System audit log object and audit trail", "main": "dist/index.js", diff --git a/packages/plugins/plugin-auth/CHANGELOG.md b/packages/plugins/plugin-auth/CHANGELOG.md index d2cad39e69..4a03b09c81 100644 --- a/packages/plugins/plugin-auth/CHANGELOG.md +++ b/packages/plugins/plugin-auth/CHANGELOG.md @@ -1,5 +1,65 @@ # Changelog +## 7.6.0 + +### Patch Changes + +- 8c01eea: fix(dev): seed the dev admin in-process and fix the port-drift seed failure. + + `os dev` (and `pnpm dev:showcase`) seeded the admin over HTTP against a + hard-coded `localhost:3000`. In dev, `serve` auto-shifts off a busy port, so + the seed POST hit the wrong server (or nothing) and the running instance never + got an admin. A second, divergent seed in `plugin-dev` inserted a + credential-less `sys_user` row that could not log in. + + Consolidate to a single in-process seed: + + - **`@objectstack/plugin-auth`** — `maybeSeedDevAdmin()` runs on `kernel:ready` + and creates `admin@objectos.ai` / `admin123` through better-auth's real + `signUpEmail` pipeline (hashed credential), so the account is loginable; + `plugin-security` then promotes it to platform admin. Empty-DB only + (excludes the system service account), idempotent, never overwrites an + existing account. Hard-gated to `NODE_ENV=development`; opt out with + `OS_SEED_ADMIN=0`. + - **`@objectstack/cli`** — removed the HTTP seed; `--seed-admin` now passes + `OS_SEED_ADMIN[_EMAIL|_PASSWORD]` to the serve child. `serve` publishes its + actually-bound port over IPC and to a `runtime..json` state file under + `OS_HOME`. + - **`@objectstack/plugin-dev`** — removed the credential-less raw insert; + `seedAdminUser` maps to the unified `OS_SEED_ADMIN` toggle. + +- b7a4f14: fix(dev): surface the seeded dev-admin credentials in the `serve` startup banner. + + When the runtime seeds the dev admin on an empty DB, the confirmation was + emitted via `ctx.logger` during `runtime.start()` — inside serve's boot-quiet + window — so it was swallowed and never reached the console. plugin-auth now + records the seed result on the `auth` service and `serve` prints it in the + ready banner (after stdout is restored), e.g.: + + ``` + 🔑 Dev admin: admin@objectos.ai / admin123 + seeded on empty DB · dev only — do not use in production + ``` + + Shown only when an admin was actually seeded this boot (empty DB) — never on a + DB that already had a user, so stale credentials are never displayed. Visible + in both `serve --dev` and `os dev` (the child's stdout is inherited). + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [7ae6abc] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/platform-objects@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/types@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/plugin-auth/package.json b/packages/plugins/plugin-auth/package.json index 30f92358b5..577c0b7b2c 100644 --- a/packages/plugins/plugin-auth/package.json +++ b/packages/plugins/plugin-auth/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/plugin-auth", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Authentication & Identity Plugin for ObjectStack", "main": "dist/index.js", diff --git a/packages/plugins/plugin-dev/CHANGELOG.md b/packages/plugins/plugin-dev/CHANGELOG.md index 83800831f5..900edbefdf 100644 --- a/packages/plugins/plugin-dev/CHANGELOG.md +++ b/packages/plugins/plugin-dev/CHANGELOG.md @@ -1,5 +1,78 @@ # @objectstack/plugin-dev +## 7.6.0 + +### Patch Changes + +- bb04824: fix(build): don't bundle lazily-imported optional drivers (fixes build break from #1524). + + After moving optional internal `@objectstack/*` peerDependencies off `peer` (to + stop the changesets fixed-group major cascade), tsup no longer auto-externalized + them and began bundling the lazily `await import()`-ed driver packages — pulling + in their optional native clients (`mysql` / `oracledb` via knex) and failing the + build. Fix: `service-datasource` externalizes `@objectstack/driver-*` in tsup + (kept as devDeps for tests); `plugin-dev` moves its framework packages to + `dependencies` (auto-externalized; it's a dev-only plugin). Full build green. + +- 8c01eea: fix(dev): seed the dev admin in-process and fix the port-drift seed failure. + + `os dev` (and `pnpm dev:showcase`) seeded the admin over HTTP against a + hard-coded `localhost:3000`. In dev, `serve` auto-shifts off a busy port, so + the seed POST hit the wrong server (or nothing) and the running instance never + got an admin. A second, divergent seed in `plugin-dev` inserted a + credential-less `sys_user` row that could not log in. + + Consolidate to a single in-process seed: + + - **`@objectstack/plugin-auth`** — `maybeSeedDevAdmin()` runs on `kernel:ready` + and creates `admin@objectos.ai` / `admin123` through better-auth's real + `signUpEmail` pipeline (hashed credential), so the account is loginable; + `plugin-security` then promotes it to platform admin. Empty-DB only + (excludes the system service account), idempotent, never overwrites an + existing account. Hard-gated to `NODE_ENV=development`; opt out with + `OS_SEED_ADMIN=0`. + - **`@objectstack/cli`** — removed the HTTP seed; `--seed-admin` now passes + `OS_SEED_ADMIN[_EMAIL|_PASSWORD]` to the serve child. `serve` publishes its + actually-bound port over IPC and to a `runtime..json` state file under + `OS_HOME`. + - **`@objectstack/plugin-dev`** — removed the credential-less raw insert; + `seedAdminUser` maps to the unified `OS_SEED_ADMIN` toggle. + +- 3377e38: fix(release): stop the fixed-group major cascade caused by internal `@objectstack/*` peerDependencies. + + These packages declared workspace peerDependencies on other framework packages + in the changesets `fixed` group. Inside a fixed group, changesets rewrites those + peer ranges on every release and treats a peer-range change as breaking → major, + which cascaded to **all 69 packages → 8.0.0** on _any_ minor changeset. Required + internal peers are now regular `dependencies`; optional ones move to + `devDependencies` (kept for in-workspace tests, no longer a published peer edge). + Releases now bump correctly (patch/minor) instead of a spurious major. + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8c01eea] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [8e539cc] +- Updated dependencies [b7a4f14] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/objectql@7.6.0 + - @objectstack/plugin-auth@7.6.0 + - @objectstack/runtime@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/driver-memory@7.6.0 + - @objectstack/plugin-hono-server@7.6.0 + - @objectstack/plugin-org-scoping@7.6.0 + - @objectstack/plugin-security@7.6.0 + - @objectstack/rest@7.6.0 + - @objectstack/service-i18n@7.6.0 + - @objectstack/types@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/plugin-dev/package.json b/packages/plugins/plugin-dev/package.json index a8711e9812..5fab768c5f 100644 --- a/packages/plugins/plugin-dev/package.json +++ b/packages/plugins/plugin-dev/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/plugin-dev", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Development Mode Plugin for ObjectStack — auto-enables all services with in-memory implementations", "main": "dist/index.js", diff --git a/packages/plugins/plugin-email/CHANGELOG.md b/packages/plugins/plugin-email/CHANGELOG.md index 99ebfd710a..90e92805ae 100644 --- a/packages/plugins/plugin-email/CHANGELOG.md +++ b/packages/plugins/plugin-email/CHANGELOG.md @@ -1,5 +1,39 @@ # @objectstack/plugin-email +## 7.6.0 + +### Patch Changes + +- d8aa11d: Harden `htmlToText` against double-escaping and incomplete tag stripping + + Fixes two CodeQL high-severity alerts in `template-engine.ts`: + + - `js/double-escaping`: the order-dependent chain of single-entity + `.replace()` calls could double-unescape (e.g. `&lt;` → `<` → `<`). + Entities are now decoded in a single left-to-right pass via one alternation + regex, so each entity decodes exactly once. + - `js/incomplete-multi-character-sanitization`: the single `<[^>]+>` strip + could leave a live tag behind on crafted/overlapping input + (e.g. `ipt>`). Tag stripping now loops until the string is + stable, and runs before entity decoding so decoding cannot re-introduce a + tag. + + Adds adversarial unit tests covering nested entities and overlapping tags. + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [7ae6abc] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/platform-objects@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/plugin-email/package.json b/packages/plugins/plugin-email/package.json index 8bf2d524cf..b456b444d0 100644 --- a/packages/plugins/plugin-email/package.json +++ b/packages/plugins/plugin-email/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/plugin-email", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Email service plugin for ObjectStack — IEmailService + transport-pluggable outbound delivery with sys_email persistence.", "main": "dist/index.js", diff --git a/packages/plugins/plugin-hono-server/CHANGELOG.md b/packages/plugins/plugin-hono-server/CHANGELOG.md index ea5851395c..3ac4327839 100644 --- a/packages/plugins/plugin-hono-server/CHANGELOG.md +++ b/packages/plugins/plugin-hono-server/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/plugin-hono-server +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/types@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/plugin-hono-server/package.json b/packages/plugins/plugin-hono-server/package.json index 12435a5cb4..ab04363601 100644 --- a/packages/plugins/plugin-hono-server/package.json +++ b/packages/plugins/plugin-hono-server/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/plugin-hono-server", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Standard Hono Server Adapter for ObjectStack Runtime", "main": "dist/index.js", diff --git a/packages/plugins/plugin-mcp-server/CHANGELOG.md b/packages/plugins/plugin-mcp-server/CHANGELOG.md index 30c308f8f3..1aed6f327a 100644 --- a/packages/plugins/plugin-mcp-server/CHANGELOG.md +++ b/packages/plugins/plugin-mcp-server/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/plugin-mcp-server +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/types@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/plugin-mcp-server/package.json b/packages/plugins/plugin-mcp-server/package.json index 9243337c70..ce9080adcd 100644 --- a/packages/plugins/plugin-mcp-server/package.json +++ b/packages/plugins/plugin-mcp-server/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/plugin-mcp-server", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "MCP Runtime Server Plugin for ObjectStack — exposes AI tools, data resources, and agent prompts via the Model Context Protocol", "type": "module", diff --git a/packages/plugins/plugin-msw/CHANGELOG.md b/packages/plugins/plugin-msw/CHANGELOG.md index 02cd4facde..6435935558 100644 --- a/packages/plugins/plugin-msw/CHANGELOG.md +++ b/packages/plugins/plugin-msw/CHANGELOG.md @@ -1,5 +1,35 @@ # @objectstack/plugin-msw +## 7.6.0 + +### Patch Changes + +- 3377e38: fix(release): stop the fixed-group major cascade caused by internal `@objectstack/*` peerDependencies. + + These packages declared workspace peerDependencies on other framework packages + in the changesets `fixed` group. Inside a fixed group, changesets rewrites those + peer ranges on every release and treats a peer-range change as breaking → major, + which cascaded to **all 69 packages → 8.0.0** on _any_ minor changeset. Required + internal peers are now regular `dependencies`; optional ones move to + `devDependencies` (kept for in-workspace tests, no longer a published peer edge). + Releases now bump correctly (patch/minor) instead of a spurious major. + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [8e539cc] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/objectql@7.6.0 + - @objectstack/runtime@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/types@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/plugin-msw/package.json b/packages/plugins/plugin-msw/package.json index 807a2f6837..43758388fc 100644 --- a/packages/plugins/plugin-msw/package.json +++ b/packages/plugins/plugin-msw/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/plugin-msw", - "version": "7.5.0", + "version": "7.6.0", "description": "MSW (Mock Service Worker) Plugin for ObjectStack Runtime", "license": "Apache-2.0", "main": "dist/index.js", diff --git a/packages/plugins/plugin-org-scoping/CHANGELOG.md b/packages/plugins/plugin-org-scoping/CHANGELOG.md index 183b2b1441..3d42b579b1 100644 --- a/packages/plugins/plugin-org-scoping/CHANGELOG.md +++ b/packages/plugins/plugin-org-scoping/CHANGELOG.md @@ -1,5 +1,23 @@ # @objectstack/plugin-org-scoping +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [7ae6abc] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/platform-objects@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/plugin-org-scoping/package.json b/packages/plugins/plugin-org-scoping/package.json index 08659ff2e5..abd686da7d 100644 --- a/packages/plugins/plugin-org-scoping/package.json +++ b/packages/plugins/plugin-org-scoping/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/plugin-org-scoping", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Organization-Scoping Plugin for ObjectStack — row-level Organization isolation, per-org seed replay, default-org bootstrap", "main": "dist/index.js", diff --git a/packages/plugins/plugin-reports/CHANGELOG.md b/packages/plugins/plugin-reports/CHANGELOG.md index 32356ad0be..10aef459ff 100644 --- a/packages/plugins/plugin-reports/CHANGELOG.md +++ b/packages/plugins/plugin-reports/CHANGELOG.md @@ -1,5 +1,23 @@ # @objectstack/plugin-reports +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [7ae6abc] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/platform-objects@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/plugin-reports/package.json b/packages/plugins/plugin-reports/package.json index 23663b2c82..db70ab4d8b 100644 --- a/packages/plugins/plugin-reports/package.json +++ b/packages/plugins/plugin-reports/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/plugin-reports", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Saved reports + scheduled email digests for ObjectStack — sys_saved_report + sys_report_schedule + IReportService.", "main": "dist/index.js", diff --git a/packages/plugins/plugin-security/CHANGELOG.md b/packages/plugins/plugin-security/CHANGELOG.md index b266b9bc0d..a872dafee0 100644 --- a/packages/plugins/plugin-security/CHANGELOG.md +++ b/packages/plugins/plugin-security/CHANGELOG.md @@ -1,5 +1,23 @@ # @objectstack/plugin-security +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [7ae6abc] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/platform-objects@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/plugin-security/package.json b/packages/plugins/plugin-security/package.json index d311d2cb3f..bb4c4ee8b0 100644 --- a/packages/plugins/plugin-security/package.json +++ b/packages/plugins/plugin-security/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/plugin-security", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Security Plugin for ObjectStack — RBAC, RLS, and Field-Level Security Runtime", "main": "dist/index.js", diff --git a/packages/plugins/plugin-sharing/CHANGELOG.md b/packages/plugins/plugin-sharing/CHANGELOG.md index 480d055939..e960239f42 100644 --- a/packages/plugins/plugin-sharing/CHANGELOG.md +++ b/packages/plugins/plugin-sharing/CHANGELOG.md @@ -1,5 +1,24 @@ # @objectstack/plugin-sharing +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [7ae6abc] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/objectql@7.6.0 + - @objectstack/platform-objects@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/plugin-sharing/package.json b/packages/plugins/plugin-sharing/package.json index 736641f92e..55e7f7e2c0 100644 --- a/packages/plugins/plugin-sharing/package.json +++ b/packages/plugins/plugin-sharing/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/plugin-sharing", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Record-level sharing for ObjectStack — sys_record_share + middleware that enforces sharingModel + ISharingService.", "main": "dist/index.js", diff --git a/packages/plugins/plugin-trigger-record-change/CHANGELOG.md b/packages/plugins/plugin-trigger-record-change/CHANGELOG.md index b5cc0c46be..4bd2a3959c 100644 --- a/packages/plugins/plugin-trigger-record-change/CHANGELOG.md +++ b/packages/plugins/plugin-trigger-record-change/CHANGELOG.md @@ -1,5 +1,21 @@ # @objectstack/plugin-trigger-record-change +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/plugin-trigger-record-change/package.json b/packages/plugins/plugin-trigger-record-change/package.json index 400f36b0fd..2ee323c070 100644 --- a/packages/plugins/plugin-trigger-record-change/package.json +++ b/packages/plugins/plugin-trigger-record-change/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/plugin-trigger-record-change", - "version": "7.5.0", + "version": "7.6.0", "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/plugins/plugin-trigger-schedule/CHANGELOG.md b/packages/plugins/plugin-trigger-schedule/CHANGELOG.md index 7abe27cf9e..446df92193 100644 --- a/packages/plugins/plugin-trigger-schedule/CHANGELOG.md +++ b/packages/plugins/plugin-trigger-schedule/CHANGELOG.md @@ -1,5 +1,21 @@ # @objectstack/plugin-trigger-schedule +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/plugin-trigger-schedule/package.json b/packages/plugins/plugin-trigger-schedule/package.json index 513554d93d..1c378b7097 100644 --- a/packages/plugins/plugin-trigger-schedule/package.json +++ b/packages/plugins/plugin-trigger-schedule/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/plugin-trigger-schedule", - "version": "7.5.0", + "version": "7.6.0", "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/plugins/plugin-webhooks/CHANGELOG.md b/packages/plugins/plugin-webhooks/CHANGELOG.md index a3ec179a5f..4b1b17e483 100644 --- a/packages/plugins/plugin-webhooks/CHANGELOG.md +++ b/packages/plugins/plugin-webhooks/CHANGELOG.md @@ -1,5 +1,54 @@ # @objectstack/plugin-webhooks +## 7.6.0 + +### Minor Changes + +- 11905fa: ADR-0018 M3 (Phase 5): `plugin-webhooks` now delivers through the shared + `service-messaging` HTTP outbox instead of its own. + + The webhook delivery substrate — durable outbox, cluster-coordinated dispatcher, + retry/backoff/dead-letter, retention — is removed from `plugin-webhooks` and + replaced by the generic `sys_http_delivery` outbox + `HttpDispatcher` in + `@objectstack/service-messaging`. Webhooks keep only their domain concerns: the + `sys_webhook` config object, the `AutoEnqueuer` (now enqueues `source: 'webhook'` + rows via `messaging.enqueueHttp`), and the redeliver admin endpoint (now backed + by `messaging.redeliverHttp`). + + **`@objectstack/service-messaging`:** `MessagingService` gains `redeliverHttp(id)` + and `listHttp(filter)` over the HTTP outbox. + + **`@objectstack/plugin-webhooks` — BREAKING:** + + - Now **requires** `MessagingServicePlugin` (declared as a plugin dependency). + - Removed exports: `WebhookDispatcher`, `MemoryWebhookOutbox`, `SqlWebhookOutbox` + (and the `./sql` subpath), `DeliveryRetentionSweeper`, `hashPartition`, + `sendOnce` / `classifyAttempt` / `nextRetryDelayMs`, and the `IWebhookOutbox` / + `WebhookDelivery` / `EnqueueInput` / `AckResult` / `RedeliverError` types. + - Removed the `sys_webhook_delivery` object — webhook deliveries are now rows in + `sys_http_delivery` (`source = 'webhook'`). The Setup nav points there. + - `AutoEnqueuer`'s constructor takes an `HttpEnqueueFn` instead of an + `IWebhookOutbox`. + - `WebhookOutboxPluginOptions` reduced to `{ autoEnqueue }` (dispatcher / outbox / + retention / nodeId options removed — those now live on `MessagingServicePlugin`). + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [11905fa] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [8e539cc] +- Updated dependencies [60f9c45] + - @objectstack/service-messaging@7.6.0 + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/plugins/plugin-webhooks/package.json b/packages/plugins/plugin-webhooks/package.json index cd292227e4..b5eb834616 100644 --- a/packages/plugins/plugin-webhooks/package.json +++ b/packages/plugins/plugin-webhooks/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/plugin-webhooks", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Persistent, cluster-aware webhook dispatcher. Durable outbox + per-partition cluster.lock for exactly-once-ish delivery across nodes. See content/docs/concepts/webhook-delivery.mdx.", "type": "module", diff --git a/packages/rest/CHANGELOG.md b/packages/rest/CHANGELOG.md index a907c17ebd..1015b02ace 100644 --- a/packages/rest/CHANGELOG.md +++ b/packages/rest/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/rest +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/service-package@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/rest/package.json b/packages/rest/package.json index 82d491901b..5e14431447 100644 --- a/packages/rest/package.json +++ b/packages/rest/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/rest", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "ObjectStack REST API Server - automatic REST endpoint generation from protocol", "type": "module", diff --git a/packages/runtime/CHANGELOG.md b/packages/runtime/CHANGELOG.md index ac107d6058..57b5dfd983 100644 --- a/packages/runtime/CHANGELOG.md +++ b/packages/runtime/CHANGELOG.md @@ -1,5 +1,72 @@ # @objectstack/runtime +## 7.6.0 + +### Minor Changes + +- 8e539cc: Implement the `/api/v1/notifications` REST surface (ADR-0030) + + The notification REST routes (`GET /notifications`, `POST /notifications/read`, + `POST /notifications/read/all`) were declared in the spec but never had a + server-side handler — no plugin registered the `notification` core service, so + the routes were never advertised in discovery and `client.notifications.*` + calls 404'd. (The Console bell works today only because it bypasses these + endpoints and reads the inbox via the generic data API.) + + This wires the surface end-to-end against the ADR-0030 L5 model: + + - **`MessagingService`** gains an inbox read API: `listInbox(userId, opts)` + reads `sys_inbox_message` joined with `sys_notification_receipt` for + read-state (a message is unread until its event has a `read`/`clicked`/ + `dismissed` receipt); `markRead(userId, ids)` and `markAllRead(userId)` + upsert the receipt to `read`, keyed `(notification_id, user_id, +channel:'inbox')` — updating the existing `delivered` receipt in place, + inserting only when absent. No reliance on the re-modeled `sys_notification` + L2 event (which carries no recipient/read columns). + - **`MessagingServicePlugin`** now also registers the messaging service under + the `notification` core service slot, so the dispatcher resolves + advertises + the routes. The legacy `INotificationService.send()` abstraction is unused and + unconsumed. + - **`HttpDispatcher`** gains `handleNotification` + a `/notifications` dispatch + branch: it takes the authenticated user from the execution context and maps + list / mark-read / mark-all-read to the service. Responses match the spec + schemas (`{ notifications, unreadCount }`, `{ success, readCount }`). + + Pairs with the objectui SDK consumer repoint (`useClientNotifications` → + `markRead`/`registerDevice` signatures). Device registration and preference + endpoints remain out of scope (unimplemented as before). + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8c01eea] +- Updated dependencies [8fa1e7f] +- Updated dependencies [be20aa4] +- Updated dependencies [55866f5] +- Updated dependencies [b7a4f14] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/formula@7.6.0 + - @objectstack/objectql@7.6.0 + - @objectstack/plugin-auth@7.6.0 + - @objectstack/driver-sqlite-wasm@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/metadata@7.6.0 + - @objectstack/observability@7.6.0 + - @objectstack/driver-memory@7.6.0 + - @objectstack/driver-sql@7.6.0 + - @objectstack/plugin-org-scoping@7.6.0 + - @objectstack/plugin-security@7.6.0 + - @objectstack/rest@7.6.0 + - @objectstack/service-cluster@7.6.0 + - @objectstack/service-i18n@7.6.0 + - @objectstack/types@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/runtime/package.json b/packages/runtime/package.json index 4d43e0247d..5543156334 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/runtime", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "ObjectStack Core Runtime & Query Engine", "type": "module", diff --git a/packages/services/service-ai/CHANGELOG.md b/packages/services/service-ai/CHANGELOG.md index b6cf636408..9ecd16b37b 100644 --- a/packages/services/service-ai/CHANGELOG.md +++ b/packages/services/service-ai/CHANGELOG.md @@ -1,5 +1,60 @@ # @objectstack/service-ai +## 7.6.0 + +### Minor Changes + +- c4a4cbd: ADR-0032 (phase 1): validate-by-default expression layer — no silent failure. + + Kills the #1491 class where a malformed predicate (e.g. the `{record.x}` + template-brace-in-CEL mistake) silently evaluated to `false` and made a flow + "fire" with no effect: + + - **service-automation**: flow `evaluateCondition` no longer swallows CEL + failures to `false` — it throws an attributed, corrective error; and + `registerFlow` now parse-validates every predicate (start/decision/edge + condition) at registration, failing loudly with the offending location + + source + the fix. + - **formula**: new shared validator — `validateExpression(role, src, schema?)`, + `introspectScope`, `CEL_STDLIB_FUNCTIONS` — with schema-aware field-existence + - did-you-mean. The `{{ }}` template engine gains a formatter whitelist + (`currency`/`number`/`percent`/`date`/`datetime`/`truncate`/`upper`/`lower`/ + `default`/…) with defined value→string semantics; arbitrary logic in holes is + rejected. Plain `{{ path }}` stays back-compatible. + - **cli**: `objectstack compile` validates every flow / validation-rule / + field-formula predicate against the resolved object schema and fails the + build with located, corrective messages. + - **service-ai**: new agent-callable `validate_expression` tool so authoring + agents self-correct before committing. + - **spec**: fix the `FlowSchema` JSDoc example that taught the bad + `condition: "{amount} < 500"` single-brace form. + +### Patch Changes + +- 3377e38: fix(release): stop the fixed-group major cascade caused by internal `@objectstack/*` peerDependencies. + + These packages declared workspace peerDependencies on other framework packages + in the changesets `fixed` group. Inside a fixed group, changesets rewrites those + peer ranges on every release and treats a peer-range change as breaking → major, + which cascaded to **all 69 packages → 8.0.0** on _any_ minor changeset. Required + internal peers are now regular `dependencies`; optional ones move to + `devDependencies` (kept for in-workspace tests, no longer a published peer edge). + Releases now bump correctly (patch/minor) instead of a spurious major. + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/formula@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/types@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-ai/package.json b/packages/services/service-ai/package.json index bb46eaa99e..9afca24ac5 100644 --- a/packages/services/service-ai/package.json +++ b/packages/services/service-ai/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-ai", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "AI Service for ObjectStack — implements IAIService with LLM adapter layer, conversation management, tool registry, and REST/SSE routes", "type": "module", diff --git a/packages/services/service-analytics/CHANGELOG.md b/packages/services/service-analytics/CHANGELOG.md index cf9597c525..5f625ca160 100644 --- a/packages/services/service-analytics/CHANGELOG.md +++ b/packages/services/service-analytics/CHANGELOG.md @@ -1,5 +1,21 @@ # Changelog — @objectstack/service-analytics +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-analytics/package.json b/packages/services/service-analytics/package.json index 9b01959626..aad3657359 100644 --- a/packages/services/service-analytics/package.json +++ b/packages/services/service-analytics/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-analytics", - "version": "7.5.0", + "version": "7.6.0", "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 4a6c929c74..b7b948858c 100644 --- a/packages/services/service-automation/CHANGELOG.md +++ b/packages/services/service-automation/CHANGELOG.md @@ -1,5 +1,175 @@ # @objectstack/service-automation +## 7.6.0 + +### Minor Changes + +- 955d4c8: ADR-0018 M3: unified `http` / `notify` executors backed by a generic HTTP outbox. + + Promotes a reliable outbound-HTTP delivery outbox into `service-messaging` (the + raw-callout counterpart to the notification outbox) and routes the Flow `http` + node through it — closing the "`http_request` is a bare `fetch()` with no retry" + gap. The five divergent outbound verbs collapse onto canonical `http` / `notify`. + + **`@objectstack/service-messaging` (additive):** + + - `IHttpOutbox` / `HttpDelivery` generic raw-callout shape + (`source` / `refId` / `dedupKey` / `label` / `signingSecret`), `SqlHttpOutbox` + over a new `sys_http_delivery` object, `MemoryHttpOutbox`, `HttpDispatcher` + (per-partition cluster lock, claim/ack/retry/dead-letter), and a shared + `sendOnce` + 7-step jittered retry schedule. + - `MessagingService` gains `setHttpOutbox()` / `isHttpDeliveryReady()` / + `enqueueHttp()`; the plugin wires the outbox + dispatcher at `kernel:ready`. + + **`@objectstack/service-automation`:** + + - Canonical `http` executor — `durable: true` enqueues onto the messaging HTTP + outbox (retry/dead-letter); otherwise an inline `fetch()` preserving + `http_request`'s request/response semantics. + - `engine.registerNodeAlias()` — registers a delegating executor + a + `deprecated` / `aliasOf` descriptor. `http_request` / `http_call` / `webhook` + are now deprecated aliases of `http`; existing flows keep running. + - `notify` descriptor marked `needsOutbox` (its delivery is outbox-backed). + + **`@objectstack/spec`:** `flow.zod` adds `http` to the builtin node-type seed set. + + `plugin-webhooks` cut-over to the shared outbox is a deliberate follow-up. + +- c4a4cbd: ADR-0032 (phase 1): validate-by-default expression layer — no silent failure. + + Kills the #1491 class where a malformed predicate (e.g. the `{record.x}` + template-brace-in-CEL mistake) silently evaluated to `false` and made a flow + "fire" with no effect: + + - **service-automation**: flow `evaluateCondition` no longer swallows CEL + failures to `false` — it throws an attributed, corrective error; and + `registerFlow` now parse-validates every predicate (start/decision/edge + condition) at registration, failing loudly with the offending location + + source + the fix. + - **formula**: new shared validator — `validateExpression(role, src, schema?)`, + `introspectScope`, `CEL_STDLIB_FUNCTIONS` — with schema-aware field-existence + - did-you-mean. The `{{ }}` template engine gains a formatter whitelist + (`currency`/`number`/`percent`/`date`/`datetime`/`truncate`/`upper`/`lower`/ + `default`/…) with defined value→string semantics; arbitrary logic in holes is + rejected. Plain `{{ path }}` stays back-compatible. + - **cli**: `objectstack compile` validates every flow / validation-rule / + field-formula predicate against the resolved object schema and fails the + build with located, corrective messages. + - **service-ai**: new agent-callable `validate_expression` tool so authoring + agents self-correct before committing. + - **spec**: fix the `FlowSchema` JSDoc example that taught the bad + `condition: "{amount} < 500"` single-brace form. + +- cf03ef2: Persist suspended flow runs so a durable pause survives a process restart (#1518). + + `service-automation` kept suspended runs in an in-memory `Map` only, so a flow + paused at an `approval` / `wait` / `screen` node could never be resumed after the + process restarted — a hard blocker on hibernating/serverless hosts (e.g. the + Cloudflare Workers control plane), where the approval record persists but + `resume(runId)` had nothing to continue. + + The engine now backs that map with a pluggable `SuspendedRunStore` (ADR-0019): + + - **`SuspendedRunStore`** interface + two implementations — `InMemorySuspendedRunStore` + (the default; JSON round-trips so it faithfully mirrors a DB boundary) and + `ObjectStoreSuspendedRunStore`, which persists to a new **`sys_automation_run`** + system object via the ObjectQL engine. `AutomationServicePlugin` registers the + object and auto-enables the DB-backed store when an ObjectQL engine is present + (opt out with `suspendedRunStore: 'memory'`). + - **Durable suspend/resume** — a run is persisted on suspend and deleted on + terminal completion. `resume(runId)` rehydrates from the store when the run is + not in memory (cold boot), so a fully restarted kernel can continue from the + paused node down the correct branch and run the downstream nodes. The resumable + state (`variables` / `steps` / `context` / `screen`) round-trips through the + store, including nested objects. + - **Idempotent resume** — the suspension is consumed before downstream work runs, + plus an in-process guard rejects a concurrent duplicate `resume`, so a repeated + resume after a partial restart can't double-run side effects. + - Run ids are now process-unique (random component) so they don't collide with a + still-suspended run persisted by a previous process lifetime. + + New exports: `SuspendedRun`, `SuspendedRunStore`, `StepLogEntry`, + `InMemorySuspendedRunStore`, `ObjectStoreSuspendedRunStore`, + `SuspendedRunStoreEngine`, `SysAutomationRun`, plus + `AutomationEngine.setSuspendedRunStore()` and `listSuspendedRunsDurable()`. + Existing service-automation and plugin-approvals tests pass unchanged. + +- 60f9c45: feat(automation): structured control-flow constructs (ADR-0031) — loop container + + Adopt structured control-flow as the native, AI-authored flow model (ADR-0031), + choosing representation **(B) nested sub-structure**: containers carry their body + as a self-contained single-entry/single-exit region in `config`. + + - **spec**: new `automation/control-flow.zod.ts` defining the `loop` container + (`config.body`), `parallel` block (`config.branches[]`, implicit join), and + `try/catch/retry` (`config.try`/`config.catch`/`config.retry`) configs, plus + region well-formedness analysis (`analyzeRegion`, `findRegionEntry`) and + `validateControlFlow` (single-entry/single-exit, acyclic; bounded loop). + - **engine**: `registerFlow()` now rejects malformed control-flow regions before + a flow can run; new `AutomationEngine.runRegion()` executes a body region in + the enclosing variable scope without touching the shared DAG traversal. + - **loop executor**: replaces the no-op `loop` stub with a real iteration + container — binds the iterator/index variables and runs the body once per item + under a hard max-iteration guard. Legacy flat-graph loops (no `config.body`) + keep working — the construct is additive. + + Parallel-block and try/catch _engine execution_ and BPMN interop mapping remain + follow-ups (issue #1479, tasks 3–5). + +- f06a6a5: feat(automation): structured parallel block (ADR-0031, task 3) + + Implement engine execution for the `parallel` block — a structured construct + with an **implicit join** (ADR-0031 §Decision 2). The `parallel` node declares N + branch regions in `config.branches[]`; the executor runs them concurrently in + the enclosing variable scope (via `AutomationEngine.runRegion`) and continues + once when all branches complete — no author-visible split/join gateway. + + - New `builtin/parallel-node.ts` executor (registered as a built-in). + - Branch failure fails the block (surfaced as a node failure → fault edge/error + handling); durable pause inside a branch is a clear error. + - Well-formedness (≥2 branches, single-entry/single-exit regions) is already + enforced at `registerFlow()` by `validateControlFlow` (shipped with the loop + container). + + Showcase `FanOutNotifyFlow` demonstrates the parallel block. Try/catch execution + and BPMN interop mapping remain follow-ups (#1479 tasks 4–5). + +- 4ee139d: feat(automation): structured try/catch/retry block (ADR-0031, task 4) + + Implement engine execution for the `try_catch` construct — structured error + handling (ADR-0031 §Decision 3). The node runs a protected `try` region; on + failure it retries with exponential backoff (`config.retry`), and if it still + fails the optional `catch` region runs with the caught error bound to + `config.errorVariable` (default `$error`). Both regions execute in the enclosing + variable scope via `AutomationEngine.runRegion`. + + - New `builtin/try-catch-node.ts` executor (registered as a built-in). + - `try` success (incl. a successful retry) → node succeeds; `catch` handling a + failure → node succeeds; no `catch` / failing `catch` → node fails to the + flow's fault edge / error handling. + - Well-formedness (single-entry/single-exit `try`/`catch` regions) is already + enforced at `registerFlow()` by `validateControlFlow` (shipped with the loop + container). + + Showcase `ResilientSyncFlow` demonstrates the construct. This completes the + native control-flow execution trio (loop / parallel / try-catch); BPMN interop + mapping remains a follow-up (#1479 task 5). + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/formula@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Minor Changes diff --git a/packages/services/service-automation/package.json b/packages/services/service-automation/package.json index 5ac89a65cf..9f129bcda0 100644 --- a/packages/services/service-automation/package.json +++ b/packages/services/service-automation/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-automation", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Automation Service for ObjectStack — implements IAutomationService with plugin-based DAG flow execution engine", "type": "module", diff --git a/packages/services/service-cache/CHANGELOG.md b/packages/services/service-cache/CHANGELOG.md index c97cada4a4..a9edefd264 100644 --- a/packages/services/service-cache/CHANGELOG.md +++ b/packages/services/service-cache/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/service-cache +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/observability@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-cache/package.json b/packages/services/service-cache/package.json index 99b9e7074f..07d399be7b 100644 --- a/packages/services/service-cache/package.json +++ b/packages/services/service-cache/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-cache", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Cache Service for ObjectStack — implements ICacheService with in-memory and Redis adapters", "type": "module", diff --git a/packages/services/service-cluster-redis/CHANGELOG.md b/packages/services/service-cluster-redis/CHANGELOG.md index f7f9d56941..1ab5f87e01 100644 --- a/packages/services/service-cluster-redis/CHANGELOG.md +++ b/packages/services/service-cluster-redis/CHANGELOG.md @@ -1,5 +1,21 @@ # @objectstack/service-cluster-redis +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/service-cluster@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-cluster-redis/package.json b/packages/services/service-cluster-redis/package.json index daab70c700..a215254b35 100644 --- a/packages/services/service-cluster-redis/package.json +++ b/packages/services/service-cluster-redis/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-cluster-redis", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Redis cluster driver for ObjectStack — implements IPubSub/ILock/IKV/ICounter against Redis using ioredis.", "type": "module", diff --git a/packages/services/service-cluster/CHANGELOG.md b/packages/services/service-cluster/CHANGELOG.md index a9ecfac253..e3f5b9d039 100644 --- a/packages/services/service-cluster/CHANGELOG.md +++ b/packages/services/service-cluster/CHANGELOG.md @@ -1,5 +1,21 @@ # @objectstack/service-cluster +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-cluster/package.json b/packages/services/service-cluster/package.json index 3451879bda..319c2c85b5 100644 --- a/packages/services/service-cluster/package.json +++ b/packages/services/service-cluster/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-cluster", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Cluster Service for ObjectStack — pluggable PubSub/Lock/KV/Counter primitives. Memory driver included; postgres/redis drivers ship separately.", "type": "module", diff --git a/packages/services/service-datasource/CHANGELOG.md b/packages/services/service-datasource/CHANGELOG.md index 81c1727775..45dc1b74f6 100644 --- a/packages/services/service-datasource/CHANGELOG.md +++ b/packages/services/service-datasource/CHANGELOG.md @@ -1,5 +1,41 @@ # @objectstack/service-external-datasource +## 7.6.0 + +### Patch Changes + +- bb04824: fix(build): don't bundle lazily-imported optional drivers (fixes build break from #1524). + + After moving optional internal `@objectstack/*` peerDependencies off `peer` (to + stop the changesets fixed-group major cascade), tsup no longer auto-externalized + them and began bundling the lazily `await import()`-ed driver packages — pulling + in their optional native clients (`mysql` / `oracledb` via knex) and failing the + build. Fix: `service-datasource` externalizes `@objectstack/driver-*` in tsup + (kept as devDeps for tests); `plugin-dev` moves its framework packages to + `dependencies` (auto-externalized; it's a dev-only plugin). Full build green. + +- 3377e38: fix(release): stop the fixed-group major cascade caused by internal `@objectstack/*` peerDependencies. + + These packages declared workspace peerDependencies on other framework packages + in the changesets `fixed` group. Inside a fixed group, changesets rewrites those + peer ranges on every release and treats a peer-range change as breaking → major, + which cascaded to **all 69 packages → 8.0.0** on _any_ minor changeset. Required + internal peers are now regular `dependencies`; optional ones move to + `devDependencies` (kept for in-workspace tests, no longer a published peer edge). + Releases now bump correctly (patch/minor) instead of a spurious major. + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-datasource/package.json b/packages/services/service-datasource/package.json index 93fe274ad0..455e42df25 100644 --- a/packages/services/service-datasource/package.json +++ b/packages/services/service-datasource/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-datasource", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "The datasource service (ADR-0015): external-table federation (introspect/draft/import/validate) + runtime UI datasource lifecycle (list/test/create/update/remove + REST routes). Open-source mechanism; the tier line falls on which ICryptoProvider / driver factory a host injects.", "type": "module", diff --git a/packages/services/service-feed/CHANGELOG.md b/packages/services/service-feed/CHANGELOG.md index c2c5575fef..4b422aedfe 100644 --- a/packages/services/service-feed/CHANGELOG.md +++ b/packages/services/service-feed/CHANGELOG.md @@ -1,5 +1,21 @@ # @objectstack/service-feed +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-feed/package.json b/packages/services/service-feed/package.json index 50d90e5a00..e19dd0b369 100644 --- a/packages/services/service-feed/package.json +++ b/packages/services/service-feed/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-feed", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Feed/Chatter Service for ObjectStack — implements IFeedService with in-memory adapter for comments, reactions, field changes, and record subscriptions", "type": "module", diff --git a/packages/services/service-i18n/CHANGELOG.md b/packages/services/service-i18n/CHANGELOG.md index 6181a14e8b..74b3ff95f1 100644 --- a/packages/services/service-i18n/CHANGELOG.md +++ b/packages/services/service-i18n/CHANGELOG.md @@ -1,5 +1,21 @@ # @objectstack/service-i18n +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-i18n/package.json b/packages/services/service-i18n/package.json index 6f81a46f28..6f2e9716d1 100644 --- a/packages/services/service-i18n/package.json +++ b/packages/services/service-i18n/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-i18n", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "I18n Service for ObjectStack — implements II18nService with file-based locale loading", "type": "module", diff --git a/packages/services/service-job/CHANGELOG.md b/packages/services/service-job/CHANGELOG.md index 8fcd97d33b..0d1fcfb4d5 100644 --- a/packages/services/service-job/CHANGELOG.md +++ b/packages/services/service-job/CHANGELOG.md @@ -1,5 +1,23 @@ # @objectstack/service-job +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [7ae6abc] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/platform-objects@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-job/package.json b/packages/services/service-job/package.json index 22d1d121cd..b0612a5217 100644 --- a/packages/services/service-job/package.json +++ b/packages/services/service-job/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-job", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Job Service for ObjectStack — implements IJobService with setInterval and cron scheduling", "type": "module", diff --git a/packages/services/service-knowledge/CHANGELOG.md b/packages/services/service-knowledge/CHANGELOG.md index 3350714b07..3744567b6c 100644 --- a/packages/services/service-knowledge/CHANGELOG.md +++ b/packages/services/service-knowledge/CHANGELOG.md @@ -1,5 +1,21 @@ # @objectstack/service-knowledge +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-knowledge/package.json b/packages/services/service-knowledge/package.json index 0f76b62536..cede2fce3e 100644 --- a/packages/services/service-knowledge/package.json +++ b/packages/services/service-knowledge/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-knowledge", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Knowledge Service for ObjectStack — orchestrator implementing IKnowledgeService over pluggable IKnowledgeAdapter backends (RAGFlow, LlamaIndex, Dify, in-memory).", "type": "module", diff --git a/packages/services/service-messaging/CHANGELOG.md b/packages/services/service-messaging/CHANGELOG.md index 8b87b27ce6..6971112487 100644 --- a/packages/services/service-messaging/CHANGELOG.md +++ b/packages/services/service-messaging/CHANGELOG.md @@ -1,5 +1,114 @@ # @objectstack/service-messaging +## 7.6.0 + +### Minor Changes + +- 955d4c8: ADR-0018 M3: unified `http` / `notify` executors backed by a generic HTTP outbox. + + Promotes a reliable outbound-HTTP delivery outbox into `service-messaging` (the + raw-callout counterpart to the notification outbox) and routes the Flow `http` + node through it — closing the "`http_request` is a bare `fetch()` with no retry" + gap. The five divergent outbound verbs collapse onto canonical `http` / `notify`. + + **`@objectstack/service-messaging` (additive):** + + - `IHttpOutbox` / `HttpDelivery` generic raw-callout shape + (`source` / `refId` / `dedupKey` / `label` / `signingSecret`), `SqlHttpOutbox` + over a new `sys_http_delivery` object, `MemoryHttpOutbox`, `HttpDispatcher` + (per-partition cluster lock, claim/ack/retry/dead-letter), and a shared + `sendOnce` + 7-step jittered retry schedule. + - `MessagingService` gains `setHttpOutbox()` / `isHttpDeliveryReady()` / + `enqueueHttp()`; the plugin wires the outbox + dispatcher at `kernel:ready`. + + **`@objectstack/service-automation`:** + + - Canonical `http` executor — `durable: true` enqueues onto the messaging HTTP + outbox (retry/dead-letter); otherwise an inline `fetch()` preserving + `http_request`'s request/response semantics. + - `engine.registerNodeAlias()` — registers a delegating executor + a + `deprecated` / `aliasOf` descriptor. `http_request` / `http_call` / `webhook` + are now deprecated aliases of `http`; existing flows keep running. + - `notify` descriptor marked `needsOutbox` (its delivery is outbox-backed). + + **`@objectstack/spec`:** `flow.zod` adds `http` to the builtin node-type seed set. + + `plugin-webhooks` cut-over to the shared outbox is a deliberate follow-up. + +- 11905fa: ADR-0018 M3 (Phase 5): `plugin-webhooks` now delivers through the shared + `service-messaging` HTTP outbox instead of its own. + + The webhook delivery substrate — durable outbox, cluster-coordinated dispatcher, + retry/backoff/dead-letter, retention — is removed from `plugin-webhooks` and + replaced by the generic `sys_http_delivery` outbox + `HttpDispatcher` in + `@objectstack/service-messaging`. Webhooks keep only their domain concerns: the + `sys_webhook` config object, the `AutoEnqueuer` (now enqueues `source: 'webhook'` + rows via `messaging.enqueueHttp`), and the redeliver admin endpoint (now backed + by `messaging.redeliverHttp`). + + **`@objectstack/service-messaging`:** `MessagingService` gains `redeliverHttp(id)` + and `listHttp(filter)` over the HTTP outbox. + + **`@objectstack/plugin-webhooks` — BREAKING:** + + - Now **requires** `MessagingServicePlugin` (declared as a plugin dependency). + - Removed exports: `WebhookDispatcher`, `MemoryWebhookOutbox`, `SqlWebhookOutbox` + (and the `./sql` subpath), `DeliveryRetentionSweeper`, `hashPartition`, + `sendOnce` / `classifyAttempt` / `nextRetryDelayMs`, and the `IWebhookOutbox` / + `WebhookDelivery` / `EnqueueInput` / `AckResult` / `RedeliverError` types. + - Removed the `sys_webhook_delivery` object — webhook deliveries are now rows in + `sys_http_delivery` (`source = 'webhook'`). The Setup nav points there. + - `AutoEnqueuer`'s constructor takes an `HttpEnqueueFn` instead of an + `IWebhookOutbox`. + - `WebhookOutboxPluginOptions` reduced to `{ autoEnqueue }` (dispatcher / outbox / + retention / nodeId options removed — those now live on `MessagingServicePlugin`). + +- 8e539cc: Implement the `/api/v1/notifications` REST surface (ADR-0030) + + The notification REST routes (`GET /notifications`, `POST /notifications/read`, + `POST /notifications/read/all`) were declared in the spec but never had a + server-side handler — no plugin registered the `notification` core service, so + the routes were never advertised in discovery and `client.notifications.*` + calls 404'd. (The Console bell works today only because it bypasses these + endpoints and reads the inbox via the generic data API.) + + This wires the surface end-to-end against the ADR-0030 L5 model: + + - **`MessagingService`** gains an inbox read API: `listInbox(userId, opts)` + reads `sys_inbox_message` joined with `sys_notification_receipt` for + read-state (a message is unread until its event has a `read`/`clicked`/ + `dismissed` receipt); `markRead(userId, ids)` and `markAllRead(userId)` + upsert the receipt to `read`, keyed `(notification_id, user_id, +channel:'inbox')` — updating the existing `delivered` receipt in place, + inserting only when absent. No reliance on the re-modeled `sys_notification` + L2 event (which carries no recipient/read columns). + - **`MessagingServicePlugin`** now also registers the messaging service under + the `notification` core service slot, so the dispatcher resolves + advertises + the routes. The legacy `INotificationService.send()` abstraction is unused and + unconsumed. + - **`HttpDispatcher`** gains `handleNotification` + a `/notifications` dispatch + branch: it takes the authenticated user from the execution context and maps + list / mark-read / mark-all-read to the service. Responses match the spec + schemas (`{ notifications, unreadCount }`, `{ success, readCount }`). + + Pairs with the objectui SDK consumer repoint (`useClientNotifications` → + `markRead`/`registerDevice` signatures). Device registration and preference + endpoints remain out of scope (unimplemented as before). + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-messaging/package.json b/packages/services/service-messaging/package.json index 65f99d089a..7028a305ae 100644 --- a/packages/services/service-messaging/package.json +++ b/packages/services/service-messaging/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-messaging", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Messaging Service for ObjectStack — outbound notification dispatch (ADR-0012). Ships the MessagingChannel registry, emit() fan-out, and the always-on inbox channel; other channels (email/webhook/push/IM) plug in.", "type": "module", diff --git a/packages/services/service-package/CHANGELOG.md b/packages/services/service-package/CHANGELOG.md index ec503c57ac..3ad1a630b5 100644 --- a/packages/services/service-package/CHANGELOG.md +++ b/packages/services/service-package/CHANGELOG.md @@ -1,5 +1,21 @@ # @objectstack/service-package +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-package/package.json b/packages/services/service-package/package.json index dff580796c..eacc0a7b2d 100644 --- a/packages/services/service-package/package.json +++ b/packages/services/service-package/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-package", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Package management service for ObjectStack — publish, install, and manage packages", "type": "module", diff --git a/packages/services/service-queue/CHANGELOG.md b/packages/services/service-queue/CHANGELOG.md index aee3d47e30..fb67b018ff 100644 --- a/packages/services/service-queue/CHANGELOG.md +++ b/packages/services/service-queue/CHANGELOG.md @@ -1,5 +1,23 @@ # @objectstack/service-queue +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [7ae6abc] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/platform-objects@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-queue/package.json b/packages/services/service-queue/package.json index 3e42384776..0d3da13f64 100644 --- a/packages/services/service-queue/package.json +++ b/packages/services/service-queue/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-queue", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Queue Service for ObjectStack — implements IQueueService with in-memory and BullMQ adapters", "type": "module", diff --git a/packages/services/service-realtime/CHANGELOG.md b/packages/services/service-realtime/CHANGELOG.md index d5bd555247..4ad776b499 100644 --- a/packages/services/service-realtime/CHANGELOG.md +++ b/packages/services/service-realtime/CHANGELOG.md @@ -1,5 +1,23 @@ # @objectstack/service-realtime +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [7ae6abc] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/platform-objects@7.6.0 + - @objectstack/core@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-realtime/package.json b/packages/services/service-realtime/package.json index e6f3c6974f..9c786b8d5e 100644 --- a/packages/services/service-realtime/package.json +++ b/packages/services/service-realtime/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-realtime", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Realtime Service for ObjectStack — implements IRealtimeService with WebSocket and in-memory pub/sub", "type": "module", diff --git a/packages/services/service-settings/CHANGELOG.md b/packages/services/service-settings/CHANGELOG.md index 277bfc4565..bdea5d53f0 100644 --- a/packages/services/service-settings/CHANGELOG.md +++ b/packages/services/service-settings/CHANGELOG.md @@ -1,5 +1,59 @@ # @objectstack/service-settings +## 7.6.0 + +### Minor Changes + +- 55866f5: Fail loud instead of silently minting an ephemeral encryption key; ship a persistent env-master-key provider as the default (#1507). + + The default `ICryptoProvider` backs every secret-at-rest in the platform — + encrypted settings (`sys_setting.value_enc`), ObjectQL `secret` fields, and + runtime datasource credentials. Its key resolution previously fell back, + **silently**, to a fresh per-process `randomBytes(32)` key (or auto-minted a + new on-disk key on every boot) when no stable key was available. In an + ephemeral-FS container or a multi-node cluster, each restart / each node then + encrypts under a different key, and every previously-written `sys_secret` value + becomes undecryptable. The failure was invisible at encrypt and boot time and + only surfaced later as "all my saved passwords / API keys / DB credentials + fail to decrypt". + + - **Renamed `InMemoryCryptoProvider` → `LocalCryptoProvider`.** The old name + implied an ephemeral key when the provider in fact persists one. + `InMemoryCryptoProvider` stays as a deprecated alias for backward + compatibility. + - **Added `OS_SECRET_KEY`** as the canonical production master key (32-byte + hex or base64), the documented production default. `OS_DEV_CRYPTO_KEY` + remains the dev convenience key. + - **Fail-loud in production.** When `NODE_ENV=production` and no stable key + source (env var or a pre-existing persisted file) is available, the provider + now throws an actionable error at construction instead of generating a key — + turning silent data-loss into a config error at boot. It never auto-mints a + key in production. Development and test keep the ergonomic fallback + (persisted dev key / ephemeral test key). + - `serve` surfaces the production-key error verbatim and refuses to wire an + unstable provider for `secret` fields. + + KMS / Vault providers (managed custody, per-tenant keys, automatic rotation) + remain future/enterprise plug-ins behind the same `ICryptoProvider` seam; + "your stored secret is still there after a reboot" stays open-source. + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [7ae6abc] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/platform-objects@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/types@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-settings/package.json b/packages/services/service-settings/package.json index 3aa1c06ed6..184abcc693 100644 --- a/packages/services/service-settings/package.json +++ b/packages/services/service-settings/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-settings", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Settings service for ObjectStack — manifest registry + K/V resolver (Env > Tenant > User > Default) + REST routes. See ADR-0007.", "type": "module", diff --git a/packages/services/service-storage/CHANGELOG.md b/packages/services/service-storage/CHANGELOG.md index 86b24c9257..55918791f0 100644 --- a/packages/services/service-storage/CHANGELOG.md +++ b/packages/services/service-storage/CHANGELOG.md @@ -1,5 +1,22 @@ # @objectstack/service-storage +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + - @objectstack/core@7.6.0 + - @objectstack/observability@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/services/service-storage/package.json b/packages/services/service-storage/package.json index c5aa26c39f..582508ab5a 100644 --- a/packages/services/service-storage/package.json +++ b/packages/services/service-storage/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/service-storage", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Storage Service for ObjectStack — implements IStorageService with local filesystem and S3 adapter skeleton", "type": "module", diff --git a/packages/spec/CHANGELOG.md b/packages/spec/CHANGELOG.md index 6fd4448bcd..d93b0e3abc 100644 --- a/packages/spec/CHANGELOG.md +++ b/packages/spec/CHANGELOG.md @@ -1,5 +1,228 @@ # @objectstack/spec +## 7.6.0 + +### Minor Changes + +- 955d4c8: ADR-0018 M3: unified `http` / `notify` executors backed by a generic HTTP outbox. + + Promotes a reliable outbound-HTTP delivery outbox into `service-messaging` (the + raw-callout counterpart to the notification outbox) and routes the Flow `http` + node through it — closing the "`http_request` is a bare `fetch()` with no retry" + gap. The five divergent outbound verbs collapse onto canonical `http` / `notify`. + + **`@objectstack/service-messaging` (additive):** + + - `IHttpOutbox` / `HttpDelivery` generic raw-callout shape + (`source` / `refId` / `dedupKey` / `label` / `signingSecret`), `SqlHttpOutbox` + over a new `sys_http_delivery` object, `MemoryHttpOutbox`, `HttpDispatcher` + (per-partition cluster lock, claim/ack/retry/dead-letter), and a shared + `sendOnce` + 7-step jittered retry schedule. + - `MessagingService` gains `setHttpOutbox()` / `isHttpDeliveryReady()` / + `enqueueHttp()`; the plugin wires the outbox + dispatcher at `kernel:ready`. + + **`@objectstack/service-automation`:** + + - Canonical `http` executor — `durable: true` enqueues onto the messaging HTTP + outbox (retry/dead-letter); otherwise an inline `fetch()` preserving + `http_request`'s request/response semantics. + - `engine.registerNodeAlias()` — registers a delegating executor + a + `deprecated` / `aliasOf` descriptor. `http_request` / `http_call` / `webhook` + are now deprecated aliases of `http`; existing flows keep running. + - `notify` descriptor marked `needsOutbox` (its delivery is outbox-backed). + + **`@objectstack/spec`:** `flow.zod` adds `http` to the builtin node-type seed set. + + `plugin-webhooks` cut-over to the shared outbox is a deliberate follow-up. + +- b046ec2: feat(automation): BPMN ⇄ structured-construct model mapping (ADR-0031, task 5) + + Add the semantic bridge between the structured control-flow constructs (the + native model) and the BPMN gateway/boundary/multi-instance vocabulary (kept for + interop only), at the **flow-model level** — independent of any wire format + (`automation/bpmn-mapping.ts`): + + - `exportConstructsToBpmn(flow)` expands each construct into its BPMN + interchange shape — `parallel` → `parallel_gateway` (AND-split) + branch + regions + `join_gateway` (AND-join); `try_catch` → the protected activity + + an error `boundary_event` + the handler region; `loop` → its body marked with + multi-instance loop characteristics — so external BPM tools see a well-formed + BPMN graph. Each expansion's anchor carries an `osConstruct` extension marker. + - `importBpmnToConstructs(flow)` folds that BPMN shape back into the constructs: + exact reconstruction from the `osConstruct` marker (so `construct → BPMN → +construct` is identity), and a best-effort structural fold of foreign + `parallel_gateway`/`join_gateway` pairs, with diagnostics for shapes it can't + safely fold. + + BPMN 2.0 **XML** (de)serialization layers on top of this mapping and remains a + plugin concern (per `bpmn-interop.zod.ts`), out of scope here. + +- 2170ad9: client SDK: add `approvals` namespace; remove dead workflow approve/reject surface (ADR-0019) + + ADR-0019 collapsed approval into Flow: approval is no longer a workflow step but + a first-class **flow node** that opens a request and suspends the run, with a + human decision resuming the flow down the matching `approve` / `reject` edge. + The server already exposes this as a dedicated `/api/v1/approvals` surface + (`registerApprovalsEndpoints`), but the client SDK still carried the old + approval-on-`workflow` methods, which pointed at routes that never existed. + + - **`@objectstack/client`** gains a `client.approvals` namespace backed by the + real REST surface: + + - `listRequests(filter?)` → `GET /approvals/requests` (the "my approvals" + inbox; filter by `status` (single or array), `object`, `recordId`, + `approverId`, `submitterId`). + - `getRequest(id)` → `GET /approvals/requests/:id`. + - `approve(id, { actorId?, comment? })` / `reject(id, …)` → + `POST /approvals/requests/:id/{approve,reject}` (records a decision and + resumes the owning flow run). + - `listActions(id)` → `GET /approvals/requests/:id/actions` (audit trail). + + The approval runtime types (`ApprovalRequestRow`, `ApprovalActionRow`, + `ApprovalStatus`, `ApprovalDecisionInput`, `ApprovalDecisionResult`) are + re-exported so consumers can type the namespace without reaching into + `@objectstack/spec`. + + - **Removed the dead workflow approve/reject surface.** `client.workflow.approve` + / `client.workflow.reject` and the backing `WorkflowApprove*` / `WorkflowReject*` + protocol schemas, types, `IProtocolService` methods, and the `/approve` / + `/reject` entries in `DEFAULT_WORKFLOW_ROUTES` are gone — approval decisions + are no longer recorded on a workflow record. `workflow` is reclaimed for state + machines, so `getConfig` / `getState` / `transition` are unchanged. + + - Discovery advertises the new route key: `ApiRoutesSchema.approvals`. + +- 7648242: Enforce every declared validation-rule type on the write path; trim the three that can't be (#1475). + + The `validations` union advertised nine rule types but only three (`state_machine`, + `cross_field`, `script`) ran on insert/update — the other six were accepted by the + schema yet silently did nothing. This closes that gap on both sides: implement the + synchronous types, and trim the ones that don't belong in a write-path rule. + + **`@objectstack/objectql` (additive):** the rule evaluator now enforces three more + types, all deterministic, synchronous, side-effect-free predicates over one record: + + - `format` — a field value against a `regex` and/or a named format + (`email` / `url` / `phone` / `json`). Runs only when the write touches the field + and the value is non-empty; a malformed regex fails open. + - `json_schema` — a JSON field validated against a JSON Schema via `ajv` (compiled + result memoised per schema). Accepts a parsed object or a JSON string; an + unparseable string is itself a violation; an uncompilable schema fails open. + - `conditional` — evaluates `when`, then recurses into `then` / `otherwise`. The + nested rule supplies the message; the outer conditional's `severity` decides + blocking. `needsPriorRecord` now recurses into conditional branches. + + Adds `ajv` as a dependency and three error codes (`invalid_format`, `invalid_json`, + `json_schema_violation`). + + **`@objectstack/spec` (breaking for unused declarations):** removes the + `unique`, `async`, and `custom` validation-rule variants (and the + `UniquenessValidationSchema` / `AsyncValidationSchema` / `CustomValidatorSchema` + exports). They were never enforced and each needs I/O or a handler model a + write-path rule must not carry. Use the layer that already does each correctly: + uniqueness → a unique index (`ObjectSchema.indexes`, `partial` for scope) or + field-level `unique: true`; async/remote → the client form layer; custom code → + a `beforeInsert` / `beforeUpdate` lifecycle hook. Field-level `unique: true` is + unaffected. + + `examples/app-showcase` demonstrates and verifies each newly-enforced type. See the + ADR-0020 addendum for the rationale. + +- 60f9c45: feat(automation): structured control-flow constructs (ADR-0031) — loop container + + Adopt structured control-flow as the native, AI-authored flow model (ADR-0031), + choosing representation **(B) nested sub-structure**: containers carry their body + as a self-contained single-entry/single-exit region in `config`. + + - **spec**: new `automation/control-flow.zod.ts` defining the `loop` container + (`config.body`), `parallel` block (`config.branches[]`, implicit join), and + `try/catch/retry` (`config.try`/`config.catch`/`config.retry`) configs, plus + region well-formedness analysis (`analyzeRegion`, `findRegionEntry`) and + `validateControlFlow` (single-entry/single-exit, acyclic; bounded loop). + - **engine**: `registerFlow()` now rejects malformed control-flow regions before + a flow can run; new `AutomationEngine.runRegion()` executes a body region in + the enclosing variable scope without touching the shared DAG traversal. + - **loop executor**: replaces the no-op `loop` stub with a real iteration + container — binds the iterator/index variables and runs the body once per item + under a hard max-iteration guard. Legacy flat-graph loops (no `config.body`) + keep working — the construct is additive. + + Parallel-block and try/catch _engine execution_ and BPMN interop mapping remain + follow-ups (issue #1479, tasks 3–5). + +### Patch Changes + +- c4a4cbd: ADR-0032 (phase 1): validate-by-default expression layer — no silent failure. + + Kills the #1491 class where a malformed predicate (e.g. the `{record.x}` + template-brace-in-CEL mistake) silently evaluated to `false` and made a flow + "fire" with no effect: + + - **service-automation**: flow `evaluateCondition` no longer swallows CEL + failures to `false` — it throws an attributed, corrective error; and + `registerFlow` now parse-validates every predicate (start/decision/edge + condition) at registration, failing loudly with the offending location + + source + the fix. + - **formula**: new shared validator — `validateExpression(role, src, schema?)`, + `introspectScope`, `CEL_STDLIB_FUNCTIONS` — with schema-aware field-existence + - did-you-mean. The `{{ }}` template engine gains a formatter whitelist + (`currency`/`number`/`percent`/`date`/`datetime`/`truncate`/`upper`/`lower`/ + `default`/…) with defined value→string semantics; arbitrary logic in holes is + rejected. Plain `{{ path }}` stays back-compatible. + - **cli**: `objectstack compile` validates every flow / validation-rule / + field-formula predicate against the resolved object schema and fails the + build with located, corrective messages. + - **service-ai**: new agent-callable `validate_expression` tool so authoring + agents self-correct before committing. + - **spec**: fix the `FlowSchema` JSDoc example that taught the bad + `condition: "{amount} < 500"` single-brace form. + +- 02d6359: docs(automation): document ADR-0031 control-flow constructs; fix dangling reference card + + - **guide**: `content/docs/guides/metadata/flow.mdx` now documents the structured + control-flow constructs — the `loop` container, `parallel` block (implicit + join), and `try_catch` (try/catch/retry) — with config examples and the + region/DAG model. The Node Types table is updated accordingly. + - **doc generator**: `build-docs.ts` now cards only reference pages that were + actually generated. Control-flow's schemas embed CEL-expression transforms + (like `Flow`/`FlowEdge`) and so have no JSON-Schema page; the index previously + carded every `.zod.ts`, producing a dangling "Control Flow" 404 link. Cards + now align with `meta.json` (generated pages only). + +- 8fa1e7f: Fix the docs generator (`build-docs.ts`) leaking an unmatched `<` / `{` into generated MDX, which broke the `apps/docs` Turbopack build (e.g. a SemVer range `">=4.0 <5"` in a `.describe()` string was read as the start of a JSX tag). Unmatched openers are now emitted as HTML entities (`<` / `{`); union-variant descriptions also go through the escaper. +- 55866f5: Fail loud instead of silently minting an ephemeral encryption key; ship a persistent env-master-key provider as the default (#1507). + + The default `ICryptoProvider` backs every secret-at-rest in the platform — + encrypted settings (`sys_setting.value_enc`), ObjectQL `secret` fields, and + runtime datasource credentials. Its key resolution previously fell back, + **silently**, to a fresh per-process `randomBytes(32)` key (or auto-minted a + new on-disk key on every boot) when no stable key was available. In an + ephemeral-FS container or a multi-node cluster, each restart / each node then + encrypts under a different key, and every previously-written `sys_secret` value + becomes undecryptable. The failure was invisible at encrypt and boot time and + only surfaced later as "all my saved passwords / API keys / DB credentials + fail to decrypt". + + - **Renamed `InMemoryCryptoProvider` → `LocalCryptoProvider`.** The old name + implied an ephemeral key when the provider in fact persists one. + `InMemoryCryptoProvider` stays as a deprecated alias for backward + compatibility. + - **Added `OS_SECRET_KEY`** as the canonical production master key (32-byte + hex or base64), the documented production default. `OS_DEV_CRYPTO_KEY` + remains the dev convenience key. + - **Fail-loud in production.** When `NODE_ENV=production` and no stable key + source (env var or a pre-existing persisted file) is available, the provider + now throws an actionable error at construction instead of generating a key — + turning silent data-loss into a config error at boot. It never auto-mints a + key in production. Development and test keep the ergonomic fallback + (persisted dev key / ephemeral test key). + - `serve` surfaces the production-key error verbatim and refuses to wire an + unstable provider for `secret` fields. + + KMS / Vault providers (managed custody, per-tenant keys, automatic rotation) + remain future/enterprise plug-ins behind the same `ICryptoProvider` seam; + "your stored secret is still there after a reboot" stays open-source. + ## 7.5.0 ## 7.4.1 diff --git a/packages/spec/package.json b/packages/spec/package.json index 2e2f7e524a..599cfd8439 100644 --- a/packages/spec/package.json +++ b/packages/spec/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/spec", - "version": "7.5.0", + "version": "7.6.0", "description": "ObjectStack Protocol & Specification - TypeScript Interfaces, JSON Schemas, and Convention Configurations", "license": "Apache-2.0", "main": "dist/index.js", diff --git a/packages/types/CHANGELOG.md b/packages/types/CHANGELOG.md index 574308c0cb..f80225f640 100644 --- a/packages/types/CHANGELOG.md +++ b/packages/types/CHANGELOG.md @@ -1,5 +1,20 @@ # @objectstack/types +## 7.6.0 + +### Patch Changes + +- Updated dependencies [955d4c8] +- Updated dependencies [c4a4cbd] +- Updated dependencies [b046ec2] +- Updated dependencies [2170ad9] +- Updated dependencies [02d6359] +- Updated dependencies [7648242] +- Updated dependencies [8fa1e7f] +- Updated dependencies [55866f5] +- Updated dependencies [60f9c45] + - @objectstack/spec@7.6.0 + ## 7.5.0 ### Patch Changes diff --git a/packages/types/package.json b/packages/types/package.json index b7d36269fa..69721dfb0f 100644 --- a/packages/types/package.json +++ b/packages/types/package.json @@ -1,6 +1,6 @@ { "name": "@objectstack/types", - "version": "7.5.0", + "version": "7.6.0", "license": "Apache-2.0", "description": "Shared interfaces describing the ObjectStack Runtime environment", "main": "dist/index.js", diff --git a/packages/vscode-objectstack/CHANGELOG.md b/packages/vscode-objectstack/CHANGELOG.md index 14f1f1868d..33a231e740 100644 --- a/packages/vscode-objectstack/CHANGELOG.md +++ b/packages/vscode-objectstack/CHANGELOG.md @@ -1,5 +1,7 @@ # objectstack-vscode +## 7.6.0 + ## 7.5.0 ## 7.4.1 diff --git a/packages/vscode-objectstack/package.json b/packages/vscode-objectstack/package.json index 55844d75a9..b85a2ff318 100644 --- a/packages/vscode-objectstack/package.json +++ b/packages/vscode-objectstack/package.json @@ -2,7 +2,7 @@ "name": "objectstack-vscode", "displayName": "ObjectStack", "description": "ObjectStack Protocol — Autocomplete, validation, and inline diagnostics for .object.ts, .view.ts, and objectstack.config.ts files", - "version": "7.5.0", + "version": "7.6.0", "publisher": "objectstack", "license": "Apache-2.0", "repository": {