Skip to content

Releases: objectstack-ai/framework

@objectstack/metadata@4.1.1

22 May 06:29
c3b6713

Choose a tag to compare

Patch Changes

  • @objectstack/spec@4.1.1
  • @objectstack/core@4.1.1
  • @objectstack/types@4.1.1
  • @objectstack/platform-objects@4.1.1

@objectstack/metadata-fs@5.1.0

22 May 16:02
3ec28b4

Choose a tag to compare

Patch Changes

  • 75f4ee6: feat(metadata): introduce executionPinned capability for runtime version pinning (ADR-0009)

    Adds a new capability flag on the metadata type registry so that types whose runtime
    transaction rows reference a specific historical version (flow, workflow, approval)
    get unified pinning behavior — instead of every business table re-implementing its
    own snapshot column.

    • MetadataTypeRegistryEntrySchema gains executionPinned: boolean, enforced
      invariant executionPinned ⇒ supportsVersioning.
    • flow, workflow, approval flipped to executionPinned: true. approval
      also corrected to supportsVersioning: true (it was wrongly false).
    • MetadataRepository.getByHash(ref, hash) added to the interface. Production
      implementation in SysMetadataRepository resolves historical bodies through
      sys_metadata_history keyed by (organization_id, type, name, checksum).
      In-memory and FS repositories serve HEAD-only matches.
    • sys_metadata_history gains an index on (organization_id, type, name, checksum)
      to keep hash lookups O(log n).
    • HistoryCleanupManager skips pinned types entirely (both age-based and
      count-based retention) — pinned-type history must never be GC'd.

    See docs/adr/0009-execution-pinned-metadata.md for full rationale and the
    list of rejected alternatives (no shared snapshot table, no inlined snapshot column).

  • Updated dependencies [75f4ee6]

    • @objectstack/metadata-core@5.1.0

@objectstack/metadata-fs@5.0.0

22 May 15:31
378e5ef

Choose a tag to compare

Minor Changes

  • 5e9dcb4: BREAKING — metadata: remove project and branch from MetaRef

    The metadata layer no longer models project or branch. Customisation is now
    scoped purely to organisation. Project remains exclusively as an artifact
    packaging concept (the objectstack.json bundle envelope); branching is left
    to Git.

    What changed:

    • MetaRef is now { org, type, name, version? } (was
      { org, project, branch, type, name, version? }). refKey() is the two
      segment string ${org}/${type}/${name} (was five segments).
    • MetadataItem.seq is monotonic per org (was per branch).
    • BranchRef, MergeStrategy, MergeResult types and the optional
      fork/merge methods on MetadataRepository are removed.
    • ListFilter / WatchFilter / HistoryOptions no longer accept project
      or branch.
    • FileSystemRepository disk layout simplified to
      <root>/<type>/<name>.json (was <root>/<project>/<branch>/<type>/<name>.json);
      change-log path is now .objectstack/.log/main.jsonl regardless of any
      branch concept. Constructor no longer accepts project / branch.
    • SysMetadataRepository: removed projectLabel / branchLabel options;
      the sys_metadata schema's project_id / branch columns (if present)
      are ignored. A future major release will DROP them.
    • MetadataManager.setRepository(repo, opts) no longer takes an opts object
      with branch.

    Migration:

    -const ref = { org: 'acme', project: 'crm', branch: 'main', type: 'view', name: 'home' };
    +const ref = { org: 'acme', type: 'view', name: 'home' };
    
    -new FileSystemRepository({ root, org: 'acme', project: 'crm', branch: 'main' });
    +new FileSystemRepository({ root, org: 'acme' });

    Existing sys_metadata rows continue to load; the deprecated columns are
    ignored at read time.

  • 32ce912: Add @objectstack/metadata-fs — Node-only FileSystemRepository
    implementation of the M0 Repository contract.

    Layout:

    <root>/
      <type>/<name>.json          # canonical body (atomic rename writes)
      .objectstack/.log/<branch>.jsonl   # append-only change log
    

    Features:

    • All 17 contract tests pass (singleBranch: true).
    • Per-key serialization via KeyedMutex.
    • Atomic writes via tmpfile + rename.
    • Heads and seq recovered from the JSONL log on start() — survives
      process restart.
    • chokidar watcher translates external edits (e.g. VSCode saves) into
      MetadataEvents with source: 'fs'.
    • Self-write suppression: 200ms window prevents the watcher from
      re-emitting events for files we wrote ourselves.
    • Manual AsyncIterator for watch() to mirror the in-memory pattern.

    Also (metadata-core):

    • Add singleBranch option to runRepositoryContractTests so
      single-branch backends (like the FS one) skip the cross-branch test.
    • Switch tsup splitting: true so index.js and testing.js share a
      single ConflictError class identity (was double-bundled before).

    See ADR-0008 §10 PR-4.

Patch Changes

  • 96ad4df: Fix dev-mode HMR data-reload for *.view.ts / *.flow.ts source-file edits.

    Three coordinated fixes close the long-standing gap where editing a
    declarative-metadata source file in dev (e.g. case.view.ts) would
    recompile dist/objectstack.json but the running server kept serving
    the stale boot-time value:

    1. @objectstack/objectqlObjectStackProtocolImplementation.getMetaItem
      now consults MetadataService (HMR-aware) before the in-memory
      SchemaRegistry (boot-time cache). Previously the registry shadowed
      freshly-registered values: manager.register('view','case',newDef)
      updated MetadataManager but getMetaItem returned the stale registry
      copy because step 2 (registry) ran before step 3 (service). Reordered
      to "1. sys_metadata overlay → 2. MetadataService → 3. SchemaRegistry".

    2. @objectstack/runtimecreateStandaloneStack now enables the
      MetadataPlugin artifact-file watcher in non-production environments
      (NODE_ENV !== 'production'). Previously hard-coded to watch: false,
      leaving nothing watching dist/objectstack.json when the CLI dev mode
      recompiled it.

    3. @objectstack/metadata & @objectstack/metadata-fs — Both
      chokidar watchers now use usePolling: true to avoid fs.watch
      EMFILE on macOS / busy dev hosts where the native file-descriptor
      pool can be exhausted by other long-running node processes.

    With these three changes:

    • CLI edits source → recompile artifact (~400ms)
    • Server's polling chokidar detects artifact change → _loadFromLocalFile
    • _loadFromLocalFile calls manager.register(type, name, item)
    • MetadataService now has the fresh value
    • Read path returns the fresh value via the new step-2 lookup
    • Studio SSE listeners re-render
  • Updated dependencies [5e9dcb4]

  • Updated dependencies [4150fe4]

  • Updated dependencies [8337cdb]

  • Updated dependencies [58835a6]

  • Updated dependencies [8cc30b4]

  • Updated dependencies [32ce912]

    • @objectstack/metadata-core@5.0.0

@objectstack/metadata-core@5.1.0

22 May 16:02
3ec28b4

Choose a tag to compare

Minor Changes

  • 75f4ee6: feat(metadata): introduce executionPinned capability for runtime version pinning (ADR-0009)

    Adds a new capability flag on the metadata type registry so that types whose runtime
    transaction rows reference a specific historical version (flow, workflow, approval)
    get unified pinning behavior — instead of every business table re-implementing its
    own snapshot column.

    • MetadataTypeRegistryEntrySchema gains executionPinned: boolean, enforced
      invariant executionPinned ⇒ supportsVersioning.
    • flow, workflow, approval flipped to executionPinned: true. approval
      also corrected to supportsVersioning: true (it was wrongly false).
    • MetadataRepository.getByHash(ref, hash) added to the interface. Production
      implementation in SysMetadataRepository resolves historical bodies through
      sys_metadata_history keyed by (organization_id, type, name, checksum).
      In-memory and FS repositories serve HEAD-only matches.
    • sys_metadata_history gains an index on (organization_id, type, name, checksum)
      to keep hash lookups O(log n).
    • HistoryCleanupManager skips pinned types entirely (both age-based and
      count-based retention) — pinned-type history must never be GC'd.

    See docs/adr/0009-execution-pinned-metadata.md for full rationale and the
    list of rejected alternatives (no shared snapshot table, no inlined snapshot column).

@objectstack/metadata-core@5.0.0

22 May 15:30
378e5ef

Choose a tag to compare

Minor Changes

  • 5e9dcb4: BREAKING — metadata: remove project and branch from MetaRef

    The metadata layer no longer models project or branch. Customisation is now
    scoped purely to organisation. Project remains exclusively as an artifact
    packaging concept (the objectstack.json bundle envelope); branching is left
    to Git.

    What changed:

    • MetaRef is now { org, type, name, version? } (was
      { org, project, branch, type, name, version? }). refKey() is the two
      segment string ${org}/${type}/${name} (was five segments).
    • MetadataItem.seq is monotonic per org (was per branch).
    • BranchRef, MergeStrategy, MergeResult types and the optional
      fork/merge methods on MetadataRepository are removed.
    • ListFilter / WatchFilter / HistoryOptions no longer accept project
      or branch.
    • FileSystemRepository disk layout simplified to
      <root>/<type>/<name>.json (was <root>/<project>/<branch>/<type>/<name>.json);
      change-log path is now .objectstack/.log/main.jsonl regardless of any
      branch concept. Constructor no longer accepts project / branch.
    • SysMetadataRepository: removed projectLabel / branchLabel options;
      the sys_metadata schema's project_id / branch columns (if present)
      are ignored. A future major release will DROP them.
    • MetadataManager.setRepository(repo, opts) no longer takes an opts object
      with branch.

    Migration:

    -const ref = { org: 'acme', project: 'crm', branch: 'main', type: 'view', name: 'home' };
    +const ref = { org: 'acme', type: 'view', name: 'home' };
    
    -new FileSystemRepository({ root, org: 'acme', project: 'crm', branch: 'main' });
    +new FileSystemRepository({ root, org: 'acme' });

    Existing sys_metadata rows continue to load; the deprecated columns are
    ignored at read time.

  • 4150fe4: Add MetadataCache — bounded, event-invalidated LRU sitting in front of
    any MetadataRepository. Features:

    • Bounded by maxEntries and maxBytes (default 1024 / 8 MiB).
    • LRU eviction with touch-on-read.
    • Lazy fill on read miss; negative caching for known-absent items.
    • Subscribes to repo.watch(filter) and invalidates affected entries
      (including rename: both old and new keys).
    • Coalesces concurrent reads for the same key onto a single backend
      fetch (thundering-herd safe).
    • Generation counter discards in-flight fetches that race an
      invalidation, preventing stale-cache poisoning.
    • Diagnostics via getStats() (entries, bytes, hits, misses,
      invalidations, coalesced).

    Includes a property-based test that verifies cache→repo convergence
    under randomly-generated update sequences.

    See ADR-0008 §10 PR-3.

  • 8337cdb: Add InMemoryRepository (reference implementation) and a parameterised
    Repository contract test suite. The contract suite, exposed at
    @objectstack/metadata-core/testing, verifies the seven invariants every
    backend must satisfy (atomic put, monotonic seq per branch, optimistic
    locking, canonical hashing, event ordering, watch resumability,
    tombstones).

    Includes implementation-specific tests covering the injected clock,
    canonical-hash insertion-order independence, and deep-copy isolation
    between caller and store.

    See ADR-0008 §10 PR-2.

  • 58835a6: Add LayeredRepository — composes N MetadataRepositorys into a
    read-through stack. Reads walk top-to-bottom; writes route to the
    topmost writable layer; list() deduplicates by refKey preferring
    the top; history() and watch() merge events from all layers,
    tagging each event's source with <layer>:<original-source>. The
    multiplexed watch() correctly cancels all child iterators when the
    consumer calls return().

    Enables the canonical "system built-ins under user overlay" pattern
    described in ADR-0008.

    See ADR-0008 §10 PR-5.

  • 8cc30b4: New package: Repository contracts for the metadata lifecycle (ADR-0008).

    Definitions only — no I/O. Exports Zod schemas, the
    MetadataRepository interface, canonical-form helpers
    (canonicalize, hashSpec), and typed errors (ConflictError,
    NotFoundError, SchemaValidationError).

    This is M0 PR-1 of the four-layer metadata refactor. Subsequent PRs
    add InMemoryRepository, MetadataCache, FileSystemRepository
    and migrate the existing MetadataManager / HMR plumbing onto the
    new contracts.

Patch Changes

  • 32ce912: Add @objectstack/metadata-fs — Node-only FileSystemRepository
    implementation of the M0 Repository contract.

    Layout:

    <root>/
      <type>/<name>.json          # canonical body (atomic rename writes)
      .objectstack/.log/<branch>.jsonl   # append-only change log
    

    Features:

    • All 17 contract tests pass (singleBranch: true).
    • Per-key serialization via KeyedMutex.
    • Atomic writes via tmpfile + rename.
    • Heads and seq recovered from the JSONL log on start() — survives
      process restart.
    • chokidar watcher translates external edits (e.g. VSCode saves) into
      MetadataEvents with source: 'fs'.
    • Self-write suppression: 200ms window prevents the watcher from
      re-emitting events for files we wrote ourselves.
    • Manual AsyncIterator for watch() to mirror the in-memory pattern.

    Also (metadata-core):

    • Add singleBranch option to runRepositoryContractTests so
      single-branch backends (like the FS one) skip the cross-branch test.
    • Switch tsup splitting: true so index.js and testing.js share a
      single ConflictError class identity (was double-bundled before).

    See ADR-0008 §10 PR-4.

@objectstack/hono@5.1.0

22 May 16:01
3ec28b4

Choose a tag to compare

Patch Changes

  • @objectstack/plugin-hono-server@5.1.0

@objectstack/hono@5.0.0

22 May 15:30
378e5ef

Choose a tag to compare

Patch Changes

  • Updated dependencies [5e9dcb4]
  • Updated dependencies [96ad4df]
  • Updated dependencies [df18ae9]
    • @objectstack/runtime@5.0.0
    • @objectstack/plugin-hono-server@5.0.0

@objectstack/hono@4.2.0

22 May 08:48
bcdae40

Choose a tag to compare

Patch Changes

  • @objectstack/plugin-hono-server@4.2.0

@objectstack/hono@4.1.1

22 May 06:29
c3b6713

Choose a tag to compare

Patch Changes

  • @objectstack/plugin-hono-server@4.1.1

@objectstack/formula@5.1.0

22 May 16:02
3ec28b4

Choose a tag to compare

Patch Changes

  • Updated dependencies [75f4ee6]
  • Updated dependencies [823d559]
    • @objectstack/spec@5.1.0