@synap-core/workspace-templates 0.9.2 → 0.9.4

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.d.ts CHANGED
@@ -5,22 +5,74 @@
5
5
  * YAML source files validate against these types.
6
6
  * Every consumer (browser, backend, CLI, marketplace) imports from here.
7
7
  */
8
- type TemplateAppKind = 'native' | 'stored' | 'url';
8
+ type TemplateAppKind = "native" | "stored" | "url";
9
9
  interface TemplateAppRef {
10
10
  kind: TemplateAppKind;
11
11
  /** For kind='native': the appId registered in the browser manifest */
12
12
  appId?: string;
13
13
  /** For kind='native': how the platform renders the app */
14
- rendererType?: 'native' | 'external' | 'iframe-srcdoc';
14
+ rendererType?: "native" | "external" | "iframe-srcdoc";
15
15
  /** For kind='stored': the cell key registered in the cell registry */
16
16
  cellKey?: string;
17
17
  /** For kind='stored': default props passed to the cell */
18
- props?: Record<string, unknown>;
18
+ props?: Record<string, WorkspaceJsonValue>;
19
19
  /** For kind='url': external URL to open */
20
20
  url?: string;
21
21
  /** Human label */
22
22
  title?: string;
23
23
  }
24
+ type WorkspaceJsonValue = string | number | boolean | null | WorkspaceJsonValue[] | {
25
+ [key: string]: WorkspaceJsonValue;
26
+ };
27
+ type WorkspacePrimarySurface = {
28
+ kind: "app";
29
+ appId: string;
30
+ rendererType: "native";
31
+ title?: string;
32
+ props?: Record<string, WorkspaceJsonValue>;
33
+ } | {
34
+ kind: "app";
35
+ appId: string;
36
+ rendererType: "external";
37
+ url: string;
38
+ title?: string;
39
+ props?: Record<string, WorkspaceJsonValue>;
40
+ } | {
41
+ kind: "cell";
42
+ cellKey: string;
43
+ title?: string;
44
+ props?: Record<string, WorkspaceJsonValue>;
45
+ } | {
46
+ /**
47
+ * Ordinary website. Unlike an external `app`, this has no trusted app
48
+ * identity and is always opened through the Browser's unprivileged URL
49
+ * surface.
50
+ */
51
+ kind: "url";
52
+ url: string;
53
+ title?: string;
54
+ } | {
55
+ kind: "view";
56
+ viewId: string;
57
+ title?: string;
58
+ };
59
+ /**
60
+ * Authoring-time view reference. View IDs do not exist until provisioning, so
61
+ * templates and packages address a view by its stable authored name and/or
62
+ * slug. The pod resolves this to `WorkspacePrimarySurface` before persistence.
63
+ */
64
+ type WorkspacePrimarySurfaceViewReference = {
65
+ kind: "view";
66
+ viewName: string;
67
+ viewSlug?: string;
68
+ title?: string;
69
+ } | {
70
+ kind: "view";
71
+ viewName?: string;
72
+ viewSlug: string;
73
+ title?: string;
74
+ };
75
+ type TemplatePrimarySurface = WorkspacePrimarySurface | WorkspacePrimarySurfaceViewReference;
24
76
  interface TemplateProperty {
25
77
  slug: string;
26
78
  label: string;
@@ -41,8 +93,7 @@ interface TemplateProfile {
41
93
  * Visibility of the profile DEFINITION — who can USE this vocabulary.
42
94
  * `system` = pod-wide; `shared` = ONE row reachable from other workspaces via
43
95
  * a `profile_workspace_access` grant; omit or `workspace` = this workspace
44
- * only. Orthogonal to `entityScope` below — do not conflate the two axes.
45
- */
96
+ * only. Orthogonal to `entityScope` below — do not conflate the two axes. */
46
97
  scope?: string;
47
98
  /**
48
99
  * Placement of the profile's ENTITY ROWS — where the data LANDS.
@@ -60,7 +111,7 @@ interface TemplateProfile {
60
111
  * `entity_scope` of an existing profile (a divergence is reported as an
61
112
  * advisory `scopeConflict` and the live row is left alone).
62
113
  */
63
- entityScope?: 'pod' | 'workspace';
114
+ entityScope?: "pod" | "workspace";
64
115
  /** Semantic slug for system profiles. */
65
116
  semanticSlug?: string;
66
117
  /** Kind vs role profile. Omit for default ('kind'). */
@@ -117,21 +168,21 @@ interface TemplateDisplayTemplate {
117
168
  config: Record<string, unknown>;
118
169
  }
119
170
  interface TemplateSidebarSurface {
120
- kind: 'cell' | 'view' | 'entity' | 'document' | 'channel' | 'app' | 'url';
171
+ kind: "cell" | "view" | "entity" | "document" | "channel" | "app" | "url";
121
172
  cellKey?: string;
122
173
  viewId?: string;
123
174
  viewName?: string;
124
175
  appId?: string;
125
176
  url?: string;
126
- rendererType?: 'native' | 'external' | 'iframe-srcdoc';
127
- placement?: 'main' | 'side' | 'floating' | 'modal' | 'popover' | 'embed';
128
- displayMode?: 'compact' | 'medium' | 'full';
177
+ rendererType?: "native" | "external" | "iframe-srcdoc";
178
+ placement?: "main" | "side" | "floating" | "modal" | "popover" | "embed";
179
+ displayMode?: "compact" | "medium" | "full";
129
180
  props?: Record<string, unknown>;
130
181
  title?: string;
131
182
  meta?: Record<string, unknown>;
132
183
  }
133
184
  interface TemplateSidebarItem {
134
- kind: 'app' | 'view' | 'profile' | 'external' | 'cell';
185
+ kind: "app" | "view" | "profile" | "external" | "cell";
135
186
  appId?: string;
136
187
  viewName?: string;
137
188
  viewId?: string;
@@ -149,13 +200,20 @@ interface TemplateSidebarItem {
149
200
  interface TemplateLayoutConfig {
150
201
  pinnedApps?: string[];
151
202
  defaultView?: string;
152
- /** The first-screen app — auto-opened on workspace switch */
203
+ /**
204
+ * Canonical first screen for this workspace.
205
+ *
206
+ * `undefined` means the template has no opinion during reconciliation,
207
+ * `null` explicitly returns the workspace to its home surface, and a
208
+ * descriptor replaces the current primary surface. */
209
+ primarySurface?: TemplatePrimarySurface | null;
210
+ /** Compatibility input only. New templates should use `app:` or `primarySurface`. */
153
211
  defaultApp?: string | null;
154
212
  theme?: string;
155
213
  sidebarItems?: TemplateSidebarItem[];
156
214
  }
157
215
  interface TemplateBentoBlock {
158
- kind: 'view' | 'widget';
216
+ kind: "view" | "widget";
159
217
  viewName?: string;
160
218
  widgetType?: string;
161
219
  pos: {
@@ -173,7 +231,7 @@ interface TemplateProfileEntityBentoTemplates {
173
231
  };
174
232
  }
175
233
  /** Mirrors `WorkspaceSourceRole` in synap-backend `schema/workspaces.ts`. */
176
- type TemplateSourceRole = 'provider' | 'consumer' | 'provider-consumer';
234
+ type TemplateSourceRole = "provider" | "consumer" | "provider-consumer";
177
235
  /** Mirrors `WorkspaceDefaultSource` in synap-backend `schema/workspaces.ts`. */
178
236
  interface TemplateDefaultSource {
179
237
  /** The workspace id that supplies this capability domain. */
@@ -191,7 +249,7 @@ interface TemplateOnboardingCollectTarget {
191
249
  /** Human description of what to capture for this target. */
192
250
  what: string;
193
251
  /** Roughly how many to expect — guides interview depth. */
194
- cardinality?: 'one' | 'few' | 'several';
252
+ cardinality?: "one" | "few" | "several";
195
253
  /** Key fields the agent should make sure to fill. */
196
254
  keyFields?: string[];
197
255
  }
@@ -231,7 +289,7 @@ interface TemplateOnboarding {
231
289
  }
232
290
  interface TemplatePlaybookParam {
233
291
  name: string;
234
- type: 'text' | 'number' | 'entity' | 'choice' | 'boolean';
292
+ type: "text" | "number" | "entity" | "choice" | "boolean";
235
293
  label?: string;
236
294
  required?: boolean;
237
295
  defaultValue?: unknown;
@@ -241,12 +299,12 @@ interface TemplatePlaybook {
241
299
  description?: string;
242
300
  goalTemplate: string;
243
301
  params?: TemplatePlaybookParam[];
244
- executor?: 'is-agent' | 'external-agent' | 'hybrid';
245
- inputStrategy?: 'none' | 'static' | 'rotating' | 'query';
302
+ executor?: "is-agent" | "external-agent" | "hybrid";
303
+ inputStrategy?: "none" | "static" | "rotating" | "query";
246
304
  channelSpec?: {
247
- type: 'GROUP' | 'AGENT_COLLAB' | 'THREAD';
305
+ type: "GROUP" | "AGENT_COLLAB" | "THREAD";
248
306
  members?: string[];
249
- aiReactionMode?: 'on_mention' | 'always' | 'never';
307
+ aiReactionMode?: "on_mention" | "always" | "never";
250
308
  };
251
309
  /**
252
310
  * A cron schedule that maintains ONE backing cron automation (a single
@@ -278,29 +336,29 @@ interface TemplatePlaybook {
278
336
  profileSlug: string;
279
337
  filter?: Record<string, unknown>;
280
338
  };
281
- status?: 'draft' | 'active' | 'paused';
339
+ status?: "draft" | "active" | "paused";
282
340
  }
283
341
  interface TemplateAutomation {
284
342
  /** Stable local key (unused on the wire today — reserved for dedup/refs). */
285
343
  key?: string;
286
344
  name: string;
287
345
  description?: string;
288
- triggerType: 'event' | 'cron' | 'webhook' | 'manual';
346
+ triggerType: "event" | "cron" | "webhook" | "manual";
289
347
  triggerConfig?: Record<string, unknown>;
290
348
  flow: {
291
349
  nodes: unknown[];
292
350
  edges: unknown[];
293
351
  precondition?: string;
294
352
  };
295
- status?: 'draft' | 'active' | 'paused';
353
+ status?: "draft" | "active" | "paused";
296
354
  }
297
355
  interface TemplateActionPlacement {
298
356
  /** Entity kind whose detail surface this action appears on. */
299
357
  profileSlug: string;
300
358
  /** Where the action renders. Only "entity-detail" is consumed today. */
301
- surface: 'entity-detail' | string;
359
+ surface: "entity-detail" | string;
302
360
  /** What the action does when clicked. */
303
- kind: 'capability' | 'playbook' | 'automation';
361
+ kind: "capability" | "playbook" | "automation";
304
362
  /**
305
363
  * Reference to the thing to run: a capability verb key, or a playbook /
306
364
  * automation NAME (resolved to a row id at apply time).
@@ -332,7 +390,7 @@ interface TemplateIntegration {
332
390
  /** Override default params with {{var}} interpolation. */
333
391
  params?: Record<string, string>;
334
392
  /** "apply" (create+update) or "install" (create only). */
335
- mode?: 'apply' | 'install';
393
+ mode?: "apply" | "install";
336
394
  }
337
395
  interface TemplateExtendsRef {
338
396
  source: string;
@@ -416,7 +474,7 @@ interface TemplateDependency {
416
474
  * - `'require'` (default): the dependency must be present on the pod as its
417
475
  * own artifact, but this template does not merge into it.
418
476
  */
419
- relation?: 'compose' | 'require';
477
+ relation?: "compose" | "require";
420
478
  /**
421
479
  * Short human reason shown in the install-time "this also installs…" prompt.
422
480
  */
@@ -453,7 +511,7 @@ interface WorkspaceYaml {
453
511
  * Workspace classifier — consumed by createFromDefinition (settings.workspaceType,
454
512
  * creator-role + agent-workspace behavior). Mirrors the backend union.
455
513
  */
456
- workspaceType?: 'personal' | 'agent' | 'project' | 'operational';
514
+ workspaceType?: "personal" | "agent" | "project" | "operational";
457
515
  visibility?: string;
458
516
  /** Capabilities this workspace provides (e.g. "brand.library", "content.pipeline") */
459
517
  capabilities?: string[];
@@ -1036,8 +1094,8 @@ declare function groupByDomain<T>(items: readonly T[], domainOf: (item: T) => st
1036
1094
  * • `scripts/check-converters.mjs` — injects the real converters, exits non-zero.
1037
1095
  * • CP / pod / CLI (from dist) — import `validateTemplate` + `SYSTEM_PROFILES`.
1038
1096
  *
1039
- * ZERO RUNTIME IMPORTS BY DESIGN. `build.mjs` loads this file directly under
1040
- * Node's type-stripping BEFORE `tsup` builds `dist/`. A static
1097
+ * NO RUNTIME IMPORT THAT FAILS AT STRIP-TIME. `build.mjs` loads this file
1098
+ * directly under Node's type-stripping BEFORE `tsup` builds `dist/`. A static
1041
1099
  * `import { toWorkspaceDefinition } from "./define.js"` would fail to resolve at
1042
1100
  * that moment (define → templates.js does not exist pre-build, and Node's
1043
1101
  * type-stripper does not remap a `.js` specifier to its `.ts` source). So the
@@ -1045,6 +1103,14 @@ declare function groupByDomain<T>(items: readonly T[], domainOf: (item: T) => st
1045
1103
  * YAML/bento rules run everywhere; the converter-parity rules run wherever the
1046
1104
  * caller can supply the compiled converters (check-converters.mjs, from dist).
1047
1105
  * `import type` lines are fully erased by the type-stripper, so they are safe.
1106
+ *
1107
+ * THE ONE RUNTIME IMPORT: `./validate-flow.ts` (the pure automation-flow
1108
+ * validator). It is imported with the `.ts` extension SPECIFICALLY so it resolves
1109
+ * under Node's type-stripper at build.mjs time (a `.js` specifier would NOT — see
1110
+ * above), and it has NO generated dependency (unlike `./define.js` → templates)
1111
+ * so it is always present. It is DB-free (only `import type` internally), so it
1112
+ * needs no injection: the flow-node contract check runs for every caller
1113
+ * (build / check-converters / CLI / CP) automatically.
1048
1114
  */
1049
1115
 
1050
1116
  interface ValidationError {
@@ -1159,6 +1225,103 @@ declare function collectBaseProfileSlugs(data: WorkspaceYaml, resolveDep: (slug:
1159
1225
  */
1160
1226
  declare function validateTemplate(tpl: WorkspaceYaml, opts?: ValidateOptions): ValidateResult;
1161
1227
 
1228
+ /**
1229
+ * Node-contract validation for automation flow definitions.
1230
+ *
1231
+ * The persist doors and the install/apply doors validate flow SHAPE only
1232
+ * (`{ nodes: [], edges: [] }`). A semantically-broken flow — a `channel_message`
1233
+ * output with a typo'd `channelType`, a `capability` node with no `verbId`, an
1234
+ * edge to a nonexistent node, a cycle, an unknown `node.type` — passes the shape
1235
+ * check and only fails at RUNTIME (automation-executor.ts throws mid-run). For a
1236
+ * template automation this is worse: it validates green at author time and then
1237
+ * SILENTLY never fires on a live pod.
1238
+ *
1239
+ * `validateFlowDefinition` closes that gap: a PURE, synchronous, DB-free function
1240
+ * that rejects malformed flows with actionable per-node errors. It is called by
1241
+ * `validateTemplate` (this package) so `synap market validate` / the build gate /
1242
+ * the CP publish door all run the same contract check, and by the pod's persist
1243
+ * doors.
1244
+ *
1245
+ * ── SSOT-IN-WAITING — temporary duplicate ────────────────────────────────────
1246
+ * This is a PURE copy of synap-backend's
1247
+ * `packages/api/src/services/automations/validate-flow.ts` (the current runtime
1248
+ * SSOT, which carries the `@synap/database` COMPILE-TIME drift guard). This copy
1249
+ * exists so `validateTemplate` — which runs in THIS published, backend-independent
1250
+ * package (CLI `synap market validate` / build gate / CP publish) — can catch
1251
+ * broken automation flows at AUTHOR time. It is intentionally free of any
1252
+ * `@synap/database` import (this package depends only on zod + js-yaml), so the
1253
+ * compile-time drift guard cannot live here; it stays in backend.
1254
+ *
1255
+ * The two copies are kept byte-identical (logic) by `validate-flow.drift.test.ts`
1256
+ * in this package, which reads BOTH files and fails if they diverge.
1257
+ *
1258
+ * CUTOVER (collapse to ONE SSOT): publish `@synap-core/workspace-templates`, bump
1259
+ * synap-backend (`^0.7.1`) and CP (`^0.9.2`) deps to that version, then replace
1260
+ * backend's validate-flow.ts body with a re-export FROM HERE (keeping backend's
1261
+ * `AssertExact` guard binding these arrays to the `@synap/database` unions).
1262
+ * Until then: keep the constant arrays below identical to `@synap/database`
1263
+ * `schema/automations.ts`.
1264
+ */
1265
+ /** The 21 node types — `AutomationNodeBase.type` union (schema/automations.ts). */
1266
+ declare const FLOW_NODE_TYPES: readonly ["trigger", "command", "condition", "delay", "output", "loop", "transform", "fetch", "query", "entity_read", "related_entities", "guard", "compute", "select", "claim", "messages_query", "switch", "skill", "capability", "sub_automation", "playbook_run"];
1267
+ /** The 11 output types — `OutputNodeDef.data.outputType` (schema/automations.ts). */
1268
+ declare const FLOW_OUTPUT_TYPES: readonly ["notification", "entity_create", "entity_update", "facet_attach", "facet_update", "facet_detach", "relation_create", "webhook", "channel_message", "session_update", "set_state"];
1269
+ /**
1270
+ * The known `config.channelType` values for a `channel_message` output. Mirrors
1271
+ * the executor's channel_message resolution (automation-executor.ts). The output
1272
+ * channel is CONTEXT-DERIVED — a channel_message is valid with `channelId`, OR
1273
+ * `channelEntityRef` (an entity-id expression → that entity's internal channel),
1274
+ * OR a `channelType` from this set, OR NOTHING (the executor defaults a targetless
1275
+ * channel_message to the automation's own run channel). A `channelType` that is
1276
+ * PRESENT but not one of these is still a typo → still an error.
1277
+ */
1278
+ declare const CHANNEL_MESSAGE_CHANNEL_TYPES: readonly ["personal_thread", "proactive", "subjectEntity"];
1279
+ interface FlowValidationError {
1280
+ /** Node the error is about (absent for graph-level / edge-level errors). */
1281
+ nodeId?: string;
1282
+ /** Edge the error is about (for dangling-reference / bad-handle errors). */
1283
+ edgeId?: string;
1284
+ /** Stable machine code — see the `code` literals below. */
1285
+ code: string;
1286
+ /** Human-actionable message naming what is wrong and how to fix it. */
1287
+ message: string;
1288
+ }
1289
+ interface FlowValidationResult {
1290
+ valid: boolean;
1291
+ errors: FlowValidationError[];
1292
+ }
1293
+ /**
1294
+ * Optional catalog resolvers. When provided, existence checks run; when omitted,
1295
+ * those checks are SKIPPED (structural + contract checks always run). Kept
1296
+ * synchronous so the whole function stays pure — the caller pre-loads whatever
1297
+ * it needs and passes predicates.
1298
+ */
1299
+ interface FlowValidationResolvers {
1300
+ /** Does this capability verb (skill name) exist in the workspace catalog? */
1301
+ verbExists?: (verbId: string) => boolean;
1302
+ /** Does the referenced skill exist (by id OR by name)? */
1303
+ skillExists?: (ref: {
1304
+ skillId?: string;
1305
+ skillName?: string;
1306
+ }) => boolean;
1307
+ /** Does the referenced playbook exist? */
1308
+ playbookExists?: (ref: {
1309
+ playbookId?: string;
1310
+ playbookName?: string;
1311
+ }) => boolean;
1312
+ }
1313
+ /**
1314
+ * Validate an automation flow definition against the node contract.
1315
+ * Pure and synchronous. `resolvers` gate the catalog-existence checks only.
1316
+ */
1317
+ declare function validateFlowDefinition(flow: unknown, resolvers?: FlowValidationResolvers): FlowValidationResult;
1318
+ /**
1319
+ * Convenience helper for the persist doors: run the validator and, if invalid,
1320
+ * return a single joined actionable message (else null). Keeps the door code a
1321
+ * one-liner and the message format consistent across create/update.
1322
+ */
1323
+ declare function flowValidationErrorMessage(flow: unknown, resolvers?: FlowValidationResolvers): string | null;
1324
+
1162
1325
  /**
1163
1326
  * @synap-core/workspace-templates — Definition adapter
1164
1327
  *
@@ -1207,6 +1370,14 @@ interface SplitBentoBlocks {
1207
1370
  bentoLayout: BentoWidgetBlockWire[];
1208
1371
  bentoViewBlocks: BentoViewBlockWire[];
1209
1372
  }
1373
+ /**
1374
+ * Produce the canonical persisted layout. A template may author either the
1375
+ * top-level `app:` shorthand or an explicit `layout.primarySurface`, never both.
1376
+ * Legacy `defaultApp` is the final compatibility fallback. Keeping the property
1377
+ * absent preserves a live workspace value during reconciliation; an authored
1378
+ * null is retained as an explicit clear.
1379
+ */
1380
+ declare function normalizeTemplateLayout(layout: TemplateLayoutConfig | undefined, app: TemplateAppRef | undefined): TemplateLayoutConfig | undefined;
1210
1381
  declare function splitBentoBlocks(blocks: TemplateBentoBlock[] | undefined): SplitBentoBlocks;
1211
1382
  /** The flat definition object accepted by createFromDefinition. */
1212
1383
  interface WorkspaceDefinitionInput {
@@ -1362,4 +1533,4 @@ interface PackageDefinitionOutput {
1362
1533
  */
1363
1534
  declare function toPackageDefinition(slugOrYaml: string | WorkspaceYaml): PackageDefinitionOutput;
1364
1535
 
1365
- export { type AssembleCatalogInput, type BentoViewBlockWire, type BentoWidgetBlockWire, type BundledCatalogEntry, type BundledEntry, type CatalogEntry, type CompositionEdge, type CompositionGraph, type CompositionInstalledEntry, type CompositionNode, type CompositionOverlay, type ConceptViolation, type CpPackageRow, DECLARED_DIVERGENCES, type DomainGroup, type InstalledTemplate, type LayerTemplateGraphInput, type MergeCatalogInput, type MergeCatalogResult, OTHER_DOMAIN_ID, OTHER_DOMAIN_LABEL, PACKAGE_DEPENDENCY_KINDS, type PackageDefinitionOutput, type PackageDependencyKind, REQUIRED_META_FIELDS, REQUIRED_WORKSPACE_FIELDS, type RemoteCatalogEntry, type RemoteEntry, type RemoteSourceStatus, SYSTEM_PROFILES, type SplitBentoBlocks, TEMPLATE_DOMAINS, type TemplateActionPlacement, type TemplateAppKind, type TemplateAppRef, type TemplateAutomation, type TemplateBentoBlock, type TemplateConverters, type TemplateDefaultSource, type TemplateDependency, type TemplateDisplayTemplate, type TemplateDomain, type TemplateEntityLink, type TemplateExtendsRef, type TemplateIntegration, type TemplateLayoutConfig, type TemplateMeta, type TemplateOnboarding, type TemplateOnboardingCollectTarget, type TemplatePlaybook, type TemplatePlaybookParam, type TemplateProfile, type TemplateProfileEntityBentoTemplates, type TemplateProperty, type TemplateSeedEntity, type TemplateSidebarItem, type TemplateSidebarSurface, type TemplateSourceRole, type TemplateSuggestedRelation, type TemplateUpdateCheck, type TemplateView, type ToDefinitionResult, type ValidateOptions, type ValidateResult, type ValidationError, WORKSPACE_TEMPLATES, type WorkspaceDefinitionInput, type WorkspaceTemplateSlug, type WorkspaceYaml, assembleCatalog, bundledEdgesOf, collectBaseProfileSlugs, computeTemplateUpdates, conceptTerm, domainLabel, findConceptViolations, formatConceptViolations, getWorkspaceTemplate, groupByDomain, isHashVersion, isKnownDomain, layerTemplateGraph, listPublicTemplates, listWorkspaceTemplates, mergeCatalog, rowToRemoteEntry, splitBentoBlocks, toPackageDefinition, toWorkspaceDefinition, validateTemplate };
1536
+ export { type AssembleCatalogInput, type BentoViewBlockWire, type BentoWidgetBlockWire, type BundledCatalogEntry, type BundledEntry, CHANNEL_MESSAGE_CHANNEL_TYPES, type CatalogEntry, type CompositionEdge, type CompositionGraph, type CompositionInstalledEntry, type CompositionNode, type CompositionOverlay, type ConceptViolation, type CpPackageRow, DECLARED_DIVERGENCES, type DomainGroup, FLOW_NODE_TYPES, FLOW_OUTPUT_TYPES, type FlowValidationError, type FlowValidationResolvers, type FlowValidationResult, type InstalledTemplate, type LayerTemplateGraphInput, type MergeCatalogInput, type MergeCatalogResult, OTHER_DOMAIN_ID, OTHER_DOMAIN_LABEL, PACKAGE_DEPENDENCY_KINDS, type PackageDefinitionOutput, type PackageDependencyKind, REQUIRED_META_FIELDS, REQUIRED_WORKSPACE_FIELDS, type RemoteCatalogEntry, type RemoteEntry, type RemoteSourceStatus, SYSTEM_PROFILES, type SplitBentoBlocks, TEMPLATE_DOMAINS, type TemplateActionPlacement, type TemplateAppKind, type TemplateAppRef, type TemplateAutomation, type TemplateBentoBlock, type TemplateConverters, type TemplateDefaultSource, type TemplateDependency, type TemplateDisplayTemplate, type TemplateDomain, type TemplateEntityLink, type TemplateExtendsRef, type TemplateIntegration, type TemplateLayoutConfig, type TemplateMeta, type TemplateOnboarding, type TemplateOnboardingCollectTarget, type TemplatePlaybook, type TemplatePlaybookParam, type TemplatePrimarySurface, type TemplateProfile, type TemplateProfileEntityBentoTemplates, type TemplateProperty, type TemplateSeedEntity, type TemplateSidebarItem, type TemplateSidebarSurface, type TemplateSourceRole, type TemplateSuggestedRelation, type TemplateUpdateCheck, type TemplateView, type ToDefinitionResult, type ValidateOptions, type ValidateResult, type ValidationError, WORKSPACE_TEMPLATES, type WorkspaceDefinitionInput, type WorkspaceJsonValue, type WorkspacePrimarySurface, type WorkspacePrimarySurfaceViewReference, type WorkspaceTemplateSlug, type WorkspaceYaml, assembleCatalog, bundledEdgesOf, collectBaseProfileSlugs, computeTemplateUpdates, conceptTerm, domainLabel, findConceptViolations, flowValidationErrorMessage, formatConceptViolations, getWorkspaceTemplate, groupByDomain, isHashVersion, isKnownDomain, layerTemplateGraph, listPublicTemplates, listWorkspaceTemplates, mergeCatalog, normalizeTemplateLayout, rowToRemoteEntry, splitBentoBlocks, toPackageDefinition, toWorkspaceDefinition, validateFlowDefinition, validateTemplate };