@synap-core/workspace-templates 0.4.0 → 0.6.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.d.ts CHANGED
@@ -1,24 +1,498 @@
1
1
  /**
2
- * @synap-core/workspace-templates
2
+ * @synap-core/workspace-templates — Types
3
3
  *
4
- * Canonical workspace template definitions.
5
- * ==========================================
6
- *
7
- * Usage (browser / backend / CLI):
4
+ * Canonical shape of a workspace template.
5
+ * YAML source files validate against these types.
6
+ * Every consumer (browser, backend, CLI, marketplace) imports from here.
7
+ */
8
+ type TemplateAppKind = 'native' | 'stored' | 'url';
9
+ interface TemplateAppRef {
10
+ kind: TemplateAppKind;
11
+ /** For kind='native': the appId registered in the browser manifest */
12
+ appId?: string;
13
+ /** For kind='native': how the platform renders the app */
14
+ rendererType?: 'native' | 'external' | 'iframe-srcdoc';
15
+ /** For kind='stored': the cell key registered in the cell registry */
16
+ cellKey?: string;
17
+ /** For kind='stored': default props passed to the cell */
18
+ props?: Record<string, unknown>;
19
+ /** For kind='url': external URL to open */
20
+ url?: string;
21
+ /** Human label */
22
+ title?: string;
23
+ }
24
+ interface TemplateProperty {
25
+ slug: string;
26
+ label: string;
27
+ valueType: string;
28
+ inputType?: string;
29
+ placeholder?: string;
30
+ enumValues?: string[];
31
+ constraints?: Record<string, unknown>;
32
+ targetProfileSlug?: string;
33
+ }
34
+ interface TemplateProfile {
35
+ slug: string;
36
+ displayName: string;
37
+ icon?: string;
38
+ color?: string;
39
+ description?: string;
40
+ /** Visibility scope. Omit or "WORKSPACE" for workspace-scoped. */
41
+ scope?: string;
42
+ /** Semantic slug for system profiles. */
43
+ semanticSlug?: string;
44
+ /** Kind vs role profile. Omit for default ('kind'). */
45
+ profileKind?: "kind" | "role";
46
+ /** For profileKind='role': which base-kind profile slugs this role can attach to. */
47
+ applicableKinds?: string[];
48
+ properties: TemplateProperty[];
49
+ }
50
+ interface TemplateView {
51
+ name: string;
52
+ slug?: string;
53
+ type: string;
54
+ scopeProfileSlug?: string;
55
+ scopeProfileSlugs?: string[];
56
+ config?: Record<string, unknown>;
57
+ /** If true, this view auto-selected as the default view for this workspace */
58
+ defaultView?: boolean;
59
+ description?: string;
60
+ groupBy?: string;
61
+ }
62
+ interface TemplateEntityLink {
63
+ sourceProfileSlug: string;
64
+ targetProfileSlug: string;
65
+ type: string;
66
+ label?: string;
67
+ }
68
+ interface TemplateSeedEntity {
69
+ profileSlug: string;
70
+ title: string;
71
+ properties?: Record<string, unknown>;
72
+ content?: string;
73
+ }
74
+ /**
75
+ * Relations between seed entities, created on provisioning. `sourceRef`/
76
+ * `targetRef` reference seed-entity titles (or refs) defined in `seedEntities`.
77
+ * Mirrors `suggestedRelations` in synap-backend `create-workspace-from-definition.ts`.
78
+ */
79
+ interface TemplateSuggestedRelation {
80
+ sourceRef: string;
81
+ targetRef: string;
82
+ type: string;
83
+ metadata?: Record<string, unknown>;
84
+ }
85
+ /**
86
+ * Entity-card display templates. Mirrors `displayTemplates` in synap-backend
87
+ * `create-workspace-from-definition.ts`.
88
+ */
89
+ interface TemplateDisplayTemplate {
90
+ name: string;
91
+ description?: string;
92
+ entityType?: string;
93
+ targetType?: string;
94
+ isDefault?: boolean;
95
+ config: Record<string, unknown>;
96
+ }
97
+ interface TemplateSidebarSurface {
98
+ kind: 'cell' | 'view' | 'entity' | 'document' | 'channel' | 'app' | 'url';
99
+ cellKey?: string;
100
+ viewId?: string;
101
+ viewName?: string;
102
+ appId?: string;
103
+ url?: string;
104
+ rendererType?: 'native' | 'external' | 'iframe-srcdoc';
105
+ placement?: 'main' | 'side' | 'floating' | 'modal' | 'popover' | 'embed';
106
+ displayMode?: 'compact' | 'medium' | 'full';
107
+ props?: Record<string, unknown>;
108
+ title?: string;
109
+ meta?: Record<string, unknown>;
110
+ }
111
+ interface TemplateSidebarItem {
112
+ kind: 'app' | 'view' | 'profile' | 'external' | 'cell';
113
+ appId?: string;
114
+ viewName?: string;
115
+ viewId?: string;
116
+ profileSlug?: string;
117
+ url?: string;
118
+ cellKey?: string;
119
+ cellProps?: Record<string, unknown>;
120
+ /** When present, bypasses kind-based dispatch — full surface control */
121
+ surface?: TemplateSidebarSurface;
122
+ label?: string;
123
+ icon?: string;
124
+ section?: string;
125
+ matchUrls?: string[];
126
+ }
127
+ interface TemplateLayoutConfig {
128
+ pinnedApps?: string[];
129
+ defaultView?: string;
130
+ /** The first-screen app — auto-opened on workspace switch */
131
+ defaultApp?: string | null;
132
+ theme?: string;
133
+ sidebarItems?: TemplateSidebarItem[];
134
+ }
135
+ interface TemplateBentoBlock {
136
+ kind: 'view' | 'widget';
137
+ viewName?: string;
138
+ widgetType?: string;
139
+ pos: {
140
+ x: number;
141
+ y: number;
142
+ w: number;
143
+ h: number;
144
+ };
145
+ config?: Record<string, unknown>;
146
+ overrides?: Record<string, unknown>;
147
+ }
148
+ interface TemplateProfileEntityBentoTemplates {
149
+ [profileSlug: string]: {
150
+ blocks: Array<Record<string, unknown>>;
151
+ };
152
+ }
153
+ interface TemplateAutomation {
154
+ name: string;
155
+ description?: string;
156
+ trigger: string;
157
+ action: string;
158
+ config?: Record<string, unknown>;
159
+ }
160
+ /** Mirrors `WorkspaceSourceRole` in synap-backend `schema/workspaces.ts`. */
161
+ type TemplateSourceRole = 'provider' | 'consumer' | 'provider-consumer';
162
+ /** Mirrors `WorkspaceDefaultSource` in synap-backend `schema/workspaces.ts`. */
163
+ interface TemplateDefaultSource {
164
+ /** The workspace id that supplies this capability domain. */
165
+ workspaceId: string;
166
+ /** The capability domain this source satisfies (e.g. "brand", "strategy"). */
167
+ capability?: string;
168
+ /** Optional profile slug the source resolves to. */
169
+ profileSlug?: string;
170
+ /** Human label for the source. */
171
+ label?: string;
172
+ }
173
+ interface TemplateOnboardingCollectTarget {
174
+ /** Profile slug to populate (e.g. "audience", "competitor"). */
175
+ profileSlug: string;
176
+ /** Human description of what to capture for this target. */
177
+ what: string;
178
+ /** Roughly how many to expect — guides interview depth. */
179
+ cardinality?: 'one' | 'few' | 'several';
180
+ /** Key fields the agent should make sure to fill. */
181
+ keyFields?: string[];
182
+ }
183
+ interface TemplateOnboardingExpertise {
184
+ /**
185
+ * Concrete starting points the agent PROPOSES instead of asking blank —
186
+ * "most X do Y, want that as a starting point?". Grounds the agent's
187
+ * proposals in real domain knowledge (never fabricates strategy — for
188
+ * mission/positioning these FRAME, they don't invent the answer).
189
+ */
190
+ starters?: string[];
191
+ /**
192
+ * Blind spots founders in this domain commonly miss. The agent proactively
193
+ * surfaces these if the founder hasn't — catching what they don't say.
194
+ */
195
+ blindSpots?: string[];
196
+ /** What a GREAT result looks like here — the bar the agent pushes toward. */
197
+ bar?: string;
198
+ }
199
+ interface TemplateOnboarding {
200
+ /** The outcome this onboarding achieves, in one sentence. */
201
+ goal: string;
202
+ /** Domain framing/voice the agent adopts for THIS workspace (the persona). */
203
+ framing: string;
204
+ /**
205
+ * Authored domain expertise the agent leads with (optional). Turns the
206
+ * interview from "extract what the founder knows" into "resolve what they
207
+ * lack". See the `onboard` skill's "Lead with your expertise" step.
208
+ */
209
+ expertise?: TemplateOnboardingExpertise;
210
+ /** What structured data to collect (entities to create + their key fields). */
211
+ collect: TemplateOnboardingCollectTarget[];
212
+ /** A few opening questions — the agent adapts from here, never rigid. */
213
+ openingQuestions?: string[];
214
+ /** "Done" signal the agent self-evaluates against. */
215
+ doneWhen?: string;
216
+ }
217
+ interface TemplatePlaybookParam {
218
+ name: string;
219
+ type: 'text' | 'number' | 'entity' | 'choice' | 'boolean';
220
+ label?: string;
221
+ required?: boolean;
222
+ defaultValue?: unknown;
223
+ }
224
+ interface TemplatePlaybook {
225
+ name: string;
226
+ description?: string;
227
+ goalTemplate: string;
228
+ params?: TemplatePlaybookParam[];
229
+ executor?: 'is-agent' | 'external-agent' | 'hybrid';
230
+ inputStrategy?: 'none' | 'static' | 'rotating' | 'query';
231
+ channelSpec?: {
232
+ type: 'GROUP' | 'AGENT_COLLAB' | 'THREAD';
233
+ members?: string[];
234
+ aiReactionMode?: 'on_mention' | 'always' | 'never';
235
+ };
236
+ schedule?: {
237
+ cron: string;
238
+ } | null;
239
+ /** tool/skill keys this playbook grants. */
240
+ grants?: string[];
241
+ status?: 'draft' | 'active' | 'paused';
242
+ }
243
+ interface TemplateIntegration {
244
+ /** Capability template key to install (matches a capability template). */
245
+ templateKey: string;
246
+ /** Override default params with {{var}} interpolation. */
247
+ params?: Record<string, string>;
248
+ /** "apply" (create+update) or "install" (create only). */
249
+ mode?: 'apply' | 'install';
250
+ }
251
+ interface TemplateExtendsRef {
252
+ source: string;
253
+ import?: {
254
+ profiles?: string[];
255
+ views?: string[];
256
+ };
257
+ }
258
+ /**
259
+ * A dependency this template declares on ANOTHER template/package. The install
260
+ * resolver (backend `POST /api/hub/packages/apply`) reads these to build the
261
+ * pod's template graph: every dependency is ensured present before this
262
+ * template is applied — missing ones install first (topologically) — and a
263
+ * `compose` dependency LAYERS this template's schema additively onto the
264
+ * dependency's workspace instead of creating a second workspace.
8
265
  *
9
- * import { getWorkspaceTemplate, listPublicTemplates } from '@synap-core/workspace-templates';
266
+ * This is the general composition primitive: a BASE template carries the
267
+ * agnostic data model; an OVERLAY template `compose`s onto it and adds the
268
+ * use-case-specific data (e.g. `blockchain-ecosystem` → `ecosystem`,
269
+ * `grants` → `operations`). Distinct from `extends` (which imports from a live
270
+ * workspace, tRPC-only) — `dependencies` is template→template.
271
+ */
272
+ interface TemplateDependency {
273
+ /** Slug of the template/package this one depends on. */
274
+ slug: string;
275
+ /**
276
+ * What the dependency is. Default `'workspace'`. Only `'workspace'`
277
+ * dependencies can be `compose`d; `'capability'`/`'automation'` are always
278
+ * `require`d present without merging.
279
+ */
280
+ kind?: 'workspace' | 'capability' | 'automation';
281
+ /**
282
+ * How this template relates to the dependency:
283
+ * - `'compose'`: this template is an OVERLAY on the dependency's workspace.
284
+ * The base is installed first if absent, then this template's profiles /
285
+ * roles / relations / views are applied ADDITIVELY onto the base workspace
286
+ * — no separate workspace is created for this template.
287
+ * - `'require'` (default): the dependency must be present on the pod as its
288
+ * own artifact, but this template does not merge into it.
289
+ */
290
+ relation?: 'compose' | 'require';
291
+ /**
292
+ * Short human reason shown in the install-time "this also installs…" prompt.
293
+ */
294
+ reason?: string;
295
+ }
296
+ interface TemplateMeta {
297
+ slug: string;
298
+ name: string;
299
+ description: string;
300
+ icon: string;
301
+ color: string;
302
+ tags?: string[];
303
+ isPublic?: boolean;
304
+ }
305
+ interface WorkspaceYaml {
306
+ /** Template metadata — not sent to backend, used for listing/UI */
307
+ meta: TemplateMeta;
308
+ /** The workspace definition sent to createFromDefinition */
309
+ workspace: {
310
+ name: string;
311
+ description: string;
312
+ proposalId?: string;
313
+ subtype?: string;
314
+ /**
315
+ * Workspace classifier — consumed by createFromDefinition (settings.workspaceType,
316
+ * creator-role + agent-workspace behavior). Mirrors the backend union.
317
+ */
318
+ workspaceType?: 'personal' | 'agent' | 'project' | 'operational';
319
+ visibility?: string;
320
+ /** Capabilities this workspace provides (e.g. "brand.library", "content.pipeline") */
321
+ capabilities?: string[];
322
+ /**
323
+ * Cross-workspace dependency roles.
324
+ * E.g. { brand: "consumer", content: "provider" }
325
+ * "consumer" = this workspace reads from another workspace of that capability
326
+ * "provider" = this workspace provides that capability to others
327
+ */
328
+ sourceRoles?: Record<string, TemplateSourceRole>;
329
+ /**
330
+ * Pins which workspace supplies each capability domain for this workspace.
331
+ * E.g. { brand: { workspaceId: "..." } } — read by the IS source resolver
332
+ * (resolveBrandWorkspaceId / resolveFoundationWorkspaceId) before falling
333
+ * back to provider role. Usually set at runtime, not in a template, but
334
+ * carried here so it round-trips through the canonical seam.
335
+ */
336
+ defaultSources?: Record<string, TemplateDefaultSource>;
337
+ };
338
+ /** Entity profiles — the data schema */
339
+ profiles: TemplateProfile[];
340
+ /** Curated views — only the ones that add value */
341
+ views?: TemplateView[];
342
+ /** Schema-level links between entity types */
343
+ entityLinks?: TemplateEntityLink[];
344
+ /** Initial data to seed on workspace creation */
345
+ seedEntities?: TemplateSeedEntity[];
346
+ /** Relations between seed entities, created on provisioning */
347
+ suggestedRelations?: TemplateSuggestedRelation[];
348
+ /** Entity-card display templates */
349
+ displayTemplates?: TemplateDisplayTemplate[];
350
+ /** App reference — what opens as first screen */
351
+ app?: TemplateAppRef;
352
+ /** Browser sidebar + layout config */
353
+ layout?: TemplateLayoutConfig;
354
+ /** Bento dashboard */
355
+ bento?: {
356
+ viewName?: string;
357
+ blocks?: TemplateBentoBlock[];
358
+ };
359
+ /** Per-profile entity bento layouts */
360
+ profileEntityBentoTemplates?: TemplateProfileEntityBentoTemplates;
361
+ /** Automations to install on workspace creation */
362
+ automations?: TemplateAutomation[];
363
+ /** Playbooks (session templates) seeded with the workspace */
364
+ playbooks?: TemplatePlaybook[];
365
+ /** Capability templates (tools/connectors) to install on provisioning */
366
+ integrations?: TemplateIntegration[];
367
+ /**
368
+ * Per-workspace onboarding context. Written to workspace.settings.onboarding
369
+ * and read by the shared `onboard` skill to run a domain-specific adaptive
370
+ * interview — no per-domain skill file needed.
371
+ */
372
+ onboarding?: TemplateOnboarding;
373
+ /** Inherit profiles/views from other workspaces */
374
+ extends?: TemplateExtendsRef[];
375
+ /**
376
+ * Template-composition dependencies — other templates this one needs. The
377
+ * install resolver installs missing dependencies first and, for a `compose`
378
+ * dependency, layers this template additively onto the dependency's
379
+ * workspace. See {@link TemplateDependency}.
380
+ */
381
+ dependencies?: TemplateDependency[];
382
+ }
383
+
384
+ declare const WORKSPACE_TEMPLATES: Record<string, WorkspaceYaml>;
385
+ type WorkspaceTemplateSlug = keyof typeof WORKSPACE_TEMPLATES;
386
+ declare function getWorkspaceTemplate(slug: string): WorkspaceYaml | undefined;
387
+ declare function listWorkspaceTemplates(): WorkspaceYaml[];
388
+ declare function listPublicTemplates(): WorkspaceYaml[];
389
+
390
+ /**
391
+ * @synap-core/workspace-templates — Definition adapter
10
392
  *
11
- * const template = getWorkspaceTemplate('brand-library');
12
- * // template.workspace.name === 'Brand Library'
13
- * // template.app.kind === 'native'
14
- * // template.layout.defaultApp === 'brandLibrary'
393
+ * Converts a YAML template (WorkspaceYaml) into the flat payload shape that
394
+ * the backend `workspaces.createFromDefinition` mutation + Hub REST
395
+ * `/workspaces/from-definition` endpoint expect.
15
396
  *
16
- * YAML source files live in src/*.yaml — AI-friendly, commentable, mergeable.
17
- * Run `pnpm build` to regenerate src/templates.ts from YAML.
18
- */
19
- export type { WorkspaceYaml, TemplateMeta, TemplateAppRef, TemplateAppKind, TemplateProfile, TemplateProperty, TemplateView, TemplateSidebarItem, TemplateSidebarSurface, TemplateLayoutConfig, TemplateBentoBlock, TemplateEntityLink, TemplateSeedEntity, TemplateSuggestedRelation, TemplateDisplayTemplate, TemplateIntegration, TemplateAutomation, TemplateExtendsRef, TemplateProfileEntityBentoTemplates, TemplateDefaultSource, TemplateSourceRole, TemplateOnboarding, TemplateOnboardingCollectTarget, TemplatePlaybook, TemplatePlaybookParam, } from './types.js';
20
- export { WORKSPACE_TEMPLATES, getWorkspaceTemplate, listWorkspaceTemplates, listPublicTemplates, } from './templates.js';
21
- export type { WorkspaceTemplateSlug } from './templates.js';
22
- export { toWorkspaceDefinition, toPackageDefinition } from './define.js';
23
- export type { WorkspaceDefinitionInput, ToDefinitionResult, PackageDefinitionOutput, } from './define.js';
24
- //# sourceMappingURL=index.d.ts.map
397
+ * This is the single canonical seam: every consumer (browser app, onboarding,
398
+ * CLI, marketplace) provisions a workspace through this function so the wire
399
+ * shape never drifts per call-site.
400
+ */
401
+
402
+ /** The flat definition object accepted by createFromDefinition. */
403
+ interface WorkspaceDefinitionInput {
404
+ workspaceName: string;
405
+ description: string;
406
+ proposalId?: string;
407
+ profiles: WorkspaceYaml['profiles'];
408
+ views: NonNullable<WorkspaceYaml['views']>;
409
+ entityLinks: NonNullable<WorkspaceYaml['entityLinks']>;
410
+ seedEntities: NonNullable<WorkspaceYaml['seedEntities']>;
411
+ suggestedRelations?: WorkspaceYaml['suggestedRelations'];
412
+ displayTemplates?: WorkspaceYaml['displayTemplates'];
413
+ layoutConfig: WorkspaceYaml['layout'] | undefined;
414
+ bentoViewName?: string;
415
+ bentoViewBlocks?: NonNullable<WorkspaceYaml['bento']>['blocks'];
416
+ profileEntityBentoTemplates?: WorkspaceYaml['profileEntityBentoTemplates'];
417
+ workspaceSubtype?: string;
418
+ workspaceType?: NonNullable<WorkspaceYaml['workspace']>['workspaceType'];
419
+ workspaceVisibility?: string;
420
+ workspaceCapabilities?: string[];
421
+ sourceRoles?: NonNullable<WorkspaceYaml['workspace']>['sourceRoles'];
422
+ defaultSources?: NonNullable<WorkspaceYaml['workspace']>['defaultSources'];
423
+ /** Per-workspace onboarding context — written to settings.onboarding. */
424
+ onboarding?: WorkspaceYaml['onboarding'];
425
+ /**
426
+ * Template-composition dependencies. MUST be forwarded: the backend resolves
427
+ * these BEFORE materializing this workspace (`workspaces.createFromDefinition`
428
+ * → `materializeWorkspaceCore` Step 0 → `resolvePackageDependencies`), which
429
+ * is what installs a `require`d base FIRST and makes shared-profile base
430
+ * seeding deterministic. Dropping this field silently de-orders provisioning
431
+ * on the tRPC/UI door — see the note in `toWorkspaceDefinition`.
432
+ */
433
+ dependencies?: WorkspaceYaml['dependencies'];
434
+ }
435
+ interface ToDefinitionResult {
436
+ definition: WorkspaceDefinitionInput;
437
+ /** Stable idempotency key — the template's proposalId or slug. */
438
+ proposalId: string;
439
+ /** Display name for the new workspace. */
440
+ workspaceName: string;
441
+ /** Template id for telemetry / dedup. */
442
+ templateId: string;
443
+ }
444
+ /**
445
+ * Resolve a template (by slug or YAML object) into the createFromDefinition
446
+ * payload. Pass `nameOverride` to rename the workspace at creation time.
447
+ */
448
+ declare function toWorkspaceDefinition(slugOrYaml: string | WorkspaceYaml, nameOverride?: string): ToDefinitionResult;
449
+ /**
450
+ * The unified `PackageDefinition` shape consumed by `POST /api/hub/packages/apply`
451
+ * (CLI `synap launch`) and the CP package registry seeder. It composes the
452
+ * workspace definition with the capability/playbook/onboarding layers. Mirrors
453
+ * `PackageDefinition` in synap-backend `package-definition.ts`. Typed loosely on
454
+ * the layered fields to avoid a backend import; the wire validation lives in the
455
+ * apply endpoint.
456
+ */
457
+ interface PackageDefinitionOutput {
458
+ _meta: {
459
+ slug: string;
460
+ icon?: string;
461
+ color?: string;
462
+ tags?: string[];
463
+ isPublic?: boolean;
464
+ requiredTier?: string | null;
465
+ };
466
+ workspaceName: string;
467
+ description: string;
468
+ workspaceType?: WorkspaceYaml['workspace']['workspaceType'];
469
+ workspaceSubtype?: string;
470
+ workspaceVisibility?: string;
471
+ workspaceCapabilities?: string[];
472
+ sourceRoles?: WorkspaceYaml['workspace']['sourceRoles'];
473
+ defaultSources?: WorkspaceYaml['workspace']['defaultSources'];
474
+ profiles: WorkspaceYaml['profiles'];
475
+ views: NonNullable<WorkspaceYaml['views']>;
476
+ suggestedEntities: NonNullable<WorkspaceYaml['seedEntities']>;
477
+ suggestedRelations?: WorkspaceYaml['suggestedRelations'];
478
+ displayTemplates?: WorkspaceYaml['displayTemplates'];
479
+ entityLinks?: WorkspaceYaml['entityLinks'];
480
+ bentoLayout?: NonNullable<WorkspaceYaml['bento']>['blocks'];
481
+ bentoViewName?: string;
482
+ profileEntityBentoTemplates?: WorkspaceYaml['profileEntityBentoTemplates'];
483
+ layoutConfig?: WorkspaceYaml['layout'];
484
+ capabilities?: WorkspaceYaml['integrations'];
485
+ playbooks?: WorkspaceYaml['playbooks'];
486
+ onboarding?: WorkspaceYaml['onboarding'];
487
+ /** Template-composition dependencies — resolved by the apply endpoint. */
488
+ dependencies?: WorkspaceYaml['dependencies'];
489
+ }
490
+ /**
491
+ * Resolve a template (by slug or YAML object) into the full `PackageDefinition`
492
+ * accepted by `POST /api/hub/packages/apply` and the CP registry seeder. This is
493
+ * the single seam the CLI and control-plane use so they read from the canonical
494
+ * package instead of disk-stored JSON.
495
+ */
496
+ declare function toPackageDefinition(slugOrYaml: string | WorkspaceYaml): PackageDefinitionOutput;
497
+
498
+ export { type PackageDefinitionOutput, type TemplateAppKind, type TemplateAppRef, type TemplateAutomation, type TemplateBentoBlock, type TemplateDefaultSource, type TemplateDependency, type TemplateDisplayTemplate, 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 TemplateView, type ToDefinitionResult, WORKSPACE_TEMPLATES, type WorkspaceDefinitionInput, type WorkspaceTemplateSlug, type WorkspaceYaml, getWorkspaceTemplate, listPublicTemplates, listWorkspaceTemplates, toPackageDefinition, toWorkspaceDefinition };