@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 +202 -31
- package/dist/index.js +782 -19
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/business-developer.yaml +24 -6
- package/src/content-os.yaml +19 -0
- package/src/crm.yaml +94 -2
- package/src/define.primary-surface.test.ts +183 -0
- package/src/define.ts +142 -19
- package/src/index.ts +26 -3
- package/src/marketing.yaml +19 -0
- package/src/templates.ts +186 -8
- package/src/types.ts +111 -32
- package/src/validate-flow.drift.test.ts +83 -0
- package/src/validate-flow.ts +555 -0
- package/src/validate-onboarding.test.ts +88 -0
- package/src/validate.test.ts +121 -0
- package/src/validate.ts +247 -12
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 =
|
|
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?:
|
|
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,
|
|
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?:
|
|
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:
|
|
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?:
|
|
127
|
-
placement?:
|
|
128
|
-
displayMode?:
|
|
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:
|
|
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
|
-
/**
|
|
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:
|
|
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 =
|
|
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?:
|
|
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:
|
|
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?:
|
|
245
|
-
inputStrategy?:
|
|
302
|
+
executor?: "is-agent" | "external-agent" | "hybrid";
|
|
303
|
+
inputStrategy?: "none" | "static" | "rotating" | "query";
|
|
246
304
|
channelSpec?: {
|
|
247
|
-
type:
|
|
305
|
+
type: "GROUP" | "AGENT_COLLAB" | "THREAD";
|
|
248
306
|
members?: string[];
|
|
249
|
-
aiReactionMode?:
|
|
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?:
|
|
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:
|
|
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?:
|
|
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:
|
|
359
|
+
surface: "entity-detail" | string;
|
|
302
360
|
/** What the action does when clicked. */
|
|
303
|
-
kind:
|
|
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?:
|
|
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?:
|
|
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?:
|
|
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
|
-
*
|
|
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 };
|