Releases: objectstack-ai/framework
objectstack-vscode@7.4.1
objectstack-vscode@7.4.1
objectstack-vscode@7.4.0
objectstack-vscode@7.4.0
create-objectstack@7.4.1
create-objectstack@7.4.1
create-objectstack@7.4.0
create-objectstack@7.4.0
@objectstack/types@7.4.1
Patch Changes
- @objectstack/spec@7.4.1
@objectstack/types@7.4.0
Patch Changes
- Updated dependencies [23c7107]
- Updated dependencies [c72daad]
- Updated dependencies [f115182]
- Updated dependencies [2faf9f2]
- Updated dependencies [2faf9f2]
- Updated dependencies [2faf9f2]
- Updated dependencies [58b450b]
- Updated dependencies [82eb6cf]
- Updated dependencies [13d8653]
- Updated dependencies [ff3d006]
- Updated dependencies [5e831de]
- @objectstack/spec@7.4.0
@objectstack/sveltekit@7.4.1
@objectstack/sveltekit@7.4.1
@objectstack/sveltekit@7.4.0
@objectstack/sveltekit@7.4.0
@objectstack/spec@7.4.1
@objectstack/spec@7.4.1
@objectstack/spec@7.4.0
Minor Changes
-
23c7107: ADR-0020 — converge the three "state machine" declaration shapes to one
enforcedstate_machinevalidation rule.Before this change a record state machine could be declared three ways (a
workflowmetadata type, anobject.stateMachinesmap, or astate_machine
validation rule) and none of them were enforced at runtime — a declarative
guardrail that was pure decoration, and a hallucination trap for AI authors.Enforcement (
@objectstack/objectql)- New
validation/rule-validator.tsevaluates the object'svalidationsunion
on the write path:evaluateValidationRules,needsPriorRecord, and the
legalNextStatesintrospection helper (all exported from the package root). state_machinerules reject illegalfieldtransitions on update (with the
rule'smessage);script/cross_fieldpredicate rules now also fire
(they were silently broken on PATCH updates because only the patch, not the
prior record, was available). The engine plumbs the prior record into
rule evaluation on single-row update; multi-row (updateMany) updates log a
warning and skip rule evaluation rather than enforce on incomplete data.
Convergence / retirement (
@objectstack/spec) — breaking- Retires the
workflowmetadata type (removed from the metadata-type enum,
the registry, the schema map, theworkflowscollection key, and the
plural→singular mapping). - Removes the
object.stateMachinesmap and thestack.workflowsarray. The
state_machinevalidation rule is the single canonical home. - The XState-style
StateMachineSchemafile is kept (still used by the
agent conversation lifecycle and the discovery protocol); only its role as
theworkflowmetadata-type backing schema was removed. The optional
workflowRPC service surface (CoreServiceName.workflow,
/api/v1/workflow,IWorkflowService) is kept as a documented follow-up.
Introspection (
@objectstack/runtime)- Adds
GET /metadata/objects/:name/state/:field?from=:state, returning the
legal next states for a field (next: nullwhen no FSM governs the field,
[]for a declared dead-end) so UIs/agents read the transition table instead
of re-deriving it.
Surfaces (
@objectstack/platform-objects,@objectstack/cli)- Studio drops the standalone "Workflow Rules" nav (state machines are edited
alongside the object's other validation rules). explainno longer listsworkflowas a related metadata type.
Migration: replace a
workflow/StateMachineConfigdeclaration with a
state_machinevalidation rule on the object (field+{ from: [allowedTo] }
transition table), and move any side-effecting actions (emails, task creation)
into a record-triggered or scheduled Flow (ADR-0019). See the migrated
examples/app-crmflows for the pattern. - New
-
c72daad: ADR-0029 D7 — Setup app navigation contributions.
Adds the UI-layer analog of object
own/extend: a package can contribute
navigation items into an app it does not own, so a shared admin app can be a
thin shell while each capability plugin ships the menu for the objects it owns.-
@objectstack/spec— newNavigationContributionSchema({ app, group?, priority, items }) and an optionalnavigationContributionsfield on the
manifest. -
@objectstack/objectql—SchemaRegistry.registerAppNavContribution()
plus lazy merge ingetApp/getAllApps(by target group id + priority,
cloning so the stored app is never mutated); the engine wires
manifest.navigationContributionsduring app registration. -
@objectstack/platform-objects— the Setup app becomes a shell of
empty group anchors; its entries for platform-objects-owned objects move to
SETUP_NAV_CONTRIBUTIONS. -
@objectstack/plugin-auth— registersSETUP_NAV_CONTRIBUTIONSalongside
the Setup app it already registers. -
@objectstack/plugin-webhooks— contributes itsWebhooks/
Webhook Deliveriesentries into the Setupgroup_integrationsslot (it owns
sys_webhook/sys_webhook_deliveryper K2.a), demonstrating end-to-end
cross-plugin contribution.The rendered Setup nav is identical to the former static artifact — just
assembled from its owners. A disabled/absent capability contributes nothing and
its slot stays empty (in addition to the existingrequiresObjectgating).
This unblocks moving each remaining K2 domain's menu out of the monolith with
its objects.
-
-
f115182: ADR-0019 — App as the consumer-facing unit. The consumer Marketplace surfaces
exactly one user-visible noun, the App.- Adds
CONSUMER_INSTALLABLE_TYPESandisConsumerInstallable(type)(the single
source of truth for "what a consumer can install"). - Constrains
MarketplaceListingSchema.packageTypetoCONSUMER_INSTALLABLE_TYPES
(defaultapp) so a non-App (driver/server/plugin/…) listing cannot be
represented — the "consumers see only Apps" guarantee is enforced in the data
contract, not a forgettable query filter. defineStack()now enforces at most one App per package: a package with
manifest.type === 'app'may not define more than one app — the banned "suite
contains apps" shape throws with a clear fix (fold into one app with multiple
tabs, or split into separate packages). Zero apps is allowed; non-app
package types are unconstrained. Non-breaking for existing stacks.
The package
typeenum is unchanged; the additions are non-breaking. No
runtime/registry/execution changes. - Adds
-
2faf9f2: External Datasource Federation (ADR-0015) — Phase 1.
Adds the spec foundation and the DDL gate for federating mature external
databases without ObjectStack ever mutating their schema:Datasource.schemaMode(managed|external|validate-only) and
Datasource.externalsettings, with a cross-field invariant.Object.externalbinding (remote table/schema, writability, column map).- Shared error contract:
ExternalSchemaMismatchError,
ExternalWriteForbiddenError,ExternalSchemaModeViolationError
(stablecodes) + structuredSchemaDiffEntryrendering. driver-sqlDDL gate: schema-mutating DDL (initObjects/syncSchema/
dropTable) is rejected whenschemaMode !== 'managed'.
All changes are additive and backward-compatible (
schemaModedefaults to
'managed'). -
2faf9f2: External Datasource Federation (ADR-0015) — Phase 2 (service core).
Adds the federation service contract, the type-compatibility matrix, and a
new service package that introspects, drafts, and validates federated
objects:@objectstack/spec:data/type-compat.ts— dialect-aware SQL↔field-type matrix
(canonicalizeSqlType,suggestFieldType,isCompatible) for
postgres/mysql/sqlite/snowflake/bigquery/mongo.contracts/external-datasource-service.ts—IExternalDatasourceService
plusRemoteTable,GenerateDraftOpts,ObjectDraft,
SchemaValidationResult/Report.
@objectstack/service-external-datasource(new): implements the service —
listRemoteTables,generateObjectDraft(renders a reviewable
*.object.tswith// REVIEW:markers),validateObject/validateAll
(structuredSchemaDiffEntrydiffs), andrefreshCatalog. Decoupled from
the kernel via injected I/O; kernel plugin registers it as the
external-datasourceservice.
REST routes and the
os datasourceCLI commands follow in a subsequent
slice. -
2faf9f2: External Datasource Federation (ADR-0015) — Phase 3 spec:
external_catalog
metadata type.- Registers
external_cataloginMetadataTypeSchemaand
DEFAULT_METADATA_TYPE_REGISTRY(system domain,allowRuntimeCreate: true,
not org-overridable). - Adds
data/external-catalog.zod.ts—ExternalCatalogSchema/
ExternalTableSchema/ExternalColumnSchemafor persisting a cached
remote-schema snapshot of a federated datasource (consumed by
refreshCatalog, the boot-validation gate, and Studio's schema browser).
- Registers
-
ff3d006: Screen-flow runtime — interactive
screennodes (suspend → render → resume).A
screennode that declares input fields now suspends the run on entry
(reusing the ADR-0019 durable pause), surfaces aScreenSpecdescribing the
form, and resumes with the collected values applied as bare flow variables
so downstream nodes read them via{var}. (waitForInput: falseforces the
old server pass-through.)- spec:
AutomationResult.screen?: ScreenSpec,ResumeSignal.variables?
(bare vars),IAutomationService.getSuspendedScreen?(runId). - service-automation: the
screenexecutor builds theScreenSpecand
suspends when fields are present; the suspend/resume plumbing threads the
screen throughFlowSuspendSignal→SuspendedRun→ the paused result;
resume()setssignal.variablesas bare flow variables;getSuspendedScreen. - runtime:
POST /api/v1/automation/:name/runs/:runId/resume(body
{ inputs }) andGET …/runs/:runId/screen, wired through both the
dispatcher route table andhandleAutomation.
Verified end-to-end headlessly: the showcase Reassign Wizard launches → pauses
at the "New Assignee" screen → resumes with the input → the task is reassigned.
The obje... - spec: