@objectstack/metadata 7.2.1 → 7.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -206,6 +206,7 @@ __export(index_exports, {
206
206
  module.exports = __toCommonJS(index_exports);
207
207
 
208
208
  // src/metadata-manager.ts
209
+ var import_kernel = require("@objectstack/spec/kernel");
209
210
  var import_core = require("@objectstack/core");
210
211
 
211
212
  // src/serializers/json-serializer.ts
@@ -1487,6 +1488,22 @@ var _MetadataManager = class _MetadataManager {
1487
1488
  }
1488
1489
  }
1489
1490
  }
1491
+ /**
1492
+ * Register a metadata item into the in-memory registry ONLY, never persisting
1493
+ * to a writable loader. Used for GitOps-managed artefacts that must be
1494
+ * *listable* (so `list(type)` returns them) but must never leak into the
1495
+ * runtime DB store — e.g. code-defined datasources (`origin:'code'`, ADR-0015
1496
+ * Addendum) declared in `*.datasource.ts` and owned by source control. Writing
1497
+ * them through `register()` would persist them to `sys_metadata` and create
1498
+ * drift between the artefact and the DB; this method avoids that.
1499
+ */
1500
+ registerInMemory(type, name, data) {
1501
+ if (!this.registry.has(type)) {
1502
+ this.registry.set(type, /* @__PURE__ */ new Map());
1503
+ }
1504
+ this.registry.get(type).set(name, data);
1505
+ this.invalidateListCache(type);
1506
+ }
1490
1507
  /**
1491
1508
  * Get a metadata item by type and name.
1492
1509
  * Checks in-memory registry first, then falls back to loaders.
@@ -1641,6 +1658,26 @@ var _MetadataManager = class _MetadataManager {
1641
1658
  }
1642
1659
  return views;
1643
1660
  }
1661
+ /**
1662
+ * List the independent ViewItems bound to an object, sorted for the runtime
1663
+ * view switcher / Studio left rail ("Object has-many View").
1664
+ *
1665
+ * Returns only expanded ViewItems (those carrying a `viewKind`) — never the
1666
+ * legacy aggregated container kept under the bare `<object>` key — so callers
1667
+ * get exactly one entry per named view. Sorted by `order`, then `name`.
1668
+ *
1669
+ * Runtime-authored `shared` / `personal` views (`sys_view_definition`) are
1670
+ * merged in by the REST layer; this method returns the `package` layer that
1671
+ * was registered from source.
1672
+ */
1673
+ async getViewsByObject(object) {
1674
+ const views = await this.list("view");
1675
+ return views.filter(
1676
+ (v) => v && typeof v === "object" && v.viewKind && v.object === object
1677
+ ).sort(
1678
+ (a, b) => (a.order ?? 0) - (b.order ?? 0) || String(a.name).localeCompare(String(b.name))
1679
+ );
1680
+ }
1644
1681
  /**
1645
1682
  * Convenience: get a dashboard definition by name
1646
1683
  */
@@ -2190,13 +2227,18 @@ var _MetadataManager = class _MetadataManager {
2190
2227
  async getTypeInfo(type) {
2191
2228
  const entry = this.typeRegistry.find((e) => e.type === type);
2192
2229
  if (!entry) return void 0;
2230
+ const byName = /* @__PURE__ */ new Map();
2231
+ for (const a of entry.actions ?? []) byName.set(a.name, a);
2232
+ for (const a of (0, import_kernel.getMetadataTypeActions)(type)) byName.set(a.name, a);
2233
+ const actions = Array.from(byName.values());
2193
2234
  return {
2194
2235
  type: entry.type,
2195
2236
  label: entry.label,
2196
2237
  description: entry.description,
2197
2238
  filePatterns: entry.filePatterns,
2198
2239
  supportsOverlay: entry.supportsOverlay,
2199
- domain: entry.domain
2240
+ domain: entry.domain,
2241
+ ...actions.length > 0 ? { actions } : {}
2200
2242
  };
2201
2243
  }
2202
2244
  // ==========================================
@@ -3144,13 +3186,19 @@ var MemoryLoader = class {
3144
3186
  };
3145
3187
 
3146
3188
  // src/plugin.ts
3147
- var import_kernel = require("@objectstack/spec/kernel");
3189
+ var import_kernel2 = require("@objectstack/spec/kernel");
3148
3190
  var import_shared = require("@objectstack/spec/shared");
3149
3191
  var import_metadata2 = require("@objectstack/platform-objects/metadata");
3192
+ var import_spec = require("@objectstack/spec");
3193
+ var import_spec2 = require("@objectstack/spec");
3150
3194
  var queryableMetadataObjects = [
3151
3195
  import_metadata2.SysMetadataObject,
3152
3196
  import_metadata2.SysMetadataHistoryObject,
3153
- import_metadata2.SysMetadataAuditObject
3197
+ import_metadata2.SysMetadataAuditObject,
3198
+ // Runtime view storage (shared / personal). Must always be provisioned so
3199
+ // end-user view creation via the generic data API has a place to write —
3200
+ // mirroring why sys_metadata is always provisioned for PUT /meta.
3201
+ import_metadata2.SysViewDefinitionObject
3154
3202
  ];
3155
3203
  var REPO_SUBDIR = ".objectstack/metadata";
3156
3204
  var ARTIFACT_FIELD_TO_TYPE = {
@@ -3164,7 +3212,6 @@ var ARTIFACT_FIELD_TO_TYPE = {
3164
3212
  actions: "action",
3165
3213
  themes: "theme",
3166
3214
  workflows: "workflow",
3167
- approvals: "approval",
3168
3215
  flows: "flow",
3169
3216
  roles: "role",
3170
3217
  permissions: "permission",
@@ -3173,6 +3220,7 @@ var ARTIFACT_FIELD_TO_TYPE = {
3173
3220
  apis: "api",
3174
3221
  webhooks: "webhook",
3175
3222
  agents: "agent",
3223
+ tools: "tool",
3176
3224
  skills: "skill",
3177
3225
  ragPipelines: "rag_pipeline",
3178
3226
  hooks: "hook",
@@ -3396,7 +3444,7 @@ var MetadataPlugin = class {
3396
3444
  watch: effectiveWatch,
3397
3445
  formats: ["yaml", "json", "typescript", "javascript"]
3398
3446
  });
3399
- this.manager.setTypeRegistry(import_kernel.DEFAULT_METADATA_TYPE_REGISTRY);
3447
+ this.manager.setTypeRegistry(import_kernel2.DEFAULT_METADATA_TYPE_REGISTRY);
3400
3448
  }
3401
3449
  /**
3402
3450
  * Fetch JSON content from a URL with configurable timeout.
@@ -3461,6 +3509,27 @@ var MetadataPlugin = class {
3461
3509
  const items = metadata[field];
3462
3510
  if (!Array.isArray(items) || items.length === 0) continue;
3463
3511
  for (const item of items) {
3512
+ if (metaType === "view" && (0, import_spec2.isAggregatedViewContainer)(item)) {
3513
+ const viewObject = item?.list?.data?.object ?? item?.form?.data?.object;
3514
+ if (!viewObject) continue;
3515
+ (0, import_shared.applyProtection)(item, {
3516
+ packageId: manifestPackageId,
3517
+ packageVersion: manifestVersion
3518
+ });
3519
+ await memLoader.save("view", viewObject, item);
3520
+ await this.manager.register("view", viewObject, item);
3521
+ totalRegistered++;
3522
+ for (const vi of (0, import_spec2.expandViewContainer)(viewObject, item)) {
3523
+ (0, import_shared.applyProtection)(vi, {
3524
+ packageId: manifestPackageId,
3525
+ packageVersion: manifestVersion
3526
+ });
3527
+ await memLoader.save("view", vi.name, vi);
3528
+ await this.manager.register("view", vi.name, vi);
3529
+ totalRegistered++;
3530
+ }
3531
+ continue;
3532
+ }
3464
3533
  let name = item?.name;
3465
3534
  if (!name) {
3466
3535
  if (metaType === "view") {
@@ -3526,7 +3595,7 @@ var MetadataPlugin = class {
3526
3595
  }
3527
3596
  async _loadFromFileSystem(ctx) {
3528
3597
  ctx.logger.info("Loading metadata from file system...");
3529
- const sortedTypes = [...import_kernel.DEFAULT_METADATA_TYPE_REGISTRY].sort((a, b) => a.loadOrder - b.loadOrder);
3598
+ const sortedTypes = [...import_kernel2.DEFAULT_METADATA_TYPE_REGISTRY].sort((a, b) => a.loadOrder - b.loadOrder);
3530
3599
  let totalLoaded = 0;
3531
3600
  for (const entry of sortedTypes) {
3532
3601
  try {
@@ -3656,9 +3725,9 @@ var RemoteLoader = class {
3656
3725
  var import_metadata3 = require("@objectstack/platform-objects/metadata");
3657
3726
 
3658
3727
  // src/utils/history-cleanup.ts
3659
- var import_kernel2 = require("@objectstack/spec/kernel");
3728
+ var import_kernel3 = require("@objectstack/spec/kernel");
3660
3729
  function executionPinnedTypes() {
3661
- return import_kernel2.DEFAULT_METADATA_TYPE_REGISTRY.filter((entry) => entry.executionPinned).map((entry) => entry.type);
3730
+ return import_kernel3.DEFAULT_METADATA_TYPE_REGISTRY.filter((entry) => entry.executionPinned).map((entry) => entry.type);
3662
3731
  }
3663
3732
  var HistoryCleanupManager = class {
3664
3733
  constructor(policy, dbLoader) {