@fusebase/fusebase-gate-sdk 2.5.1-sdk.2 → 2.5.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.
@@ -5,7 +5,7 @@
5
5
  * Domain: portals
6
6
  */
7
7
  import type { Client } from "../runtime/transport";
8
- import type { AddPortalAiAgentBlockRequestContract, AddPortalAiAgentBlockResponseContract, AddPortalAppBlockRequestContract, AddPortalAppBlockResponseContract, AddPortalAppPageRequestContract, AddPortalAppPageResponseContract, AddPortalBlankNoteBlockRequestContract, AddPortalBlankNoteBlockResponseContract, AddPortalBlockRequestContract, AddPortalBlockResponseContract, AddPortalCardBlockRequestContract, AddPortalCardBlockResponseContract, AddPortalCardGroupBlockRequestContract, AddPortalCardGroupBlockResponseContract, AddPortalCarouselBlockRequestContract, AddPortalCarouselBlockResponseContract, AddPortalChatBlockRequestContract, AddPortalChatBlockResponseContract, AddPortalCountdownBlockRequestContract, AddPortalCountdownBlockResponseContract, AddPortalCustomWidgetBlockRequestContract, AddPortalCustomWidgetBlockResponseContract, AddPortalDatabaseBlockRequestContract, AddPortalDatabaseBlockResponseContract, AddPortalEmbedBlockRequestContract, AddPortalEmbedBlockResponseContract, AddPortalFileUploaderBlockRequestContract, AddPortalFileUploaderBlockResponseContract, AddPortalFormBlockRequestContract, AddPortalFormBlockResponseContract, AddPortalHeadingBlockRequestContract, AddPortalHtmlCssBlockRequestContract, AddPortalHtmlCssBlockResponseContract, AddPortalImageBlockRequestContract, AddPortalInfoBlockRequestContract, AddPortalInfoBlockResponseContract, AddPortalKanbanBlockRequestContract, AddPortalKanbanBlockResponseContract, AddPortalLinkedBlockRequestContract, AddPortalLinkedBlockResponseContract, AddPortalNoteBlockRequestContract, AddPortalNoteBlockResponseContract, AddPortalTaskListBlockRequestContract, AddPortalTaskListBlockResponseContract, AddPortalTextBlockRequestContract, AddPortalTimelineBlockRequestContract, AddPortalTimelineBlockResponseContract, BulkInviteToPortalRequestContract, BulkInviteToPortalResponseContract, CreatePortalFolderRequestContract, CreatePortalFolderResponseContract, CreatePortalPageRequestContract, CreatePortalPageResponseContract, CreatePortalPageWithNoteRequestContract, CreatePortalPageWithNoteResponseContract, CreatePortalRequestContract, CreatePortalResponseContract, DuplicatePortalItemRequestContract, DuplicatePortalItemResponseContract, DuplicatePortalRequestContract, GetPortalPageBlockCountResponseContract, globalIdInPathRequired, InvitePortalManagerRequestContract, InvitePortalManagerResponseContract, InviteToPortalRequestContract, InviteToPortalResponseContract, ListPortalAiAgentsResponseContract, ListPortalChatChannelsResponseContract, ListPortalChatUsersResponseContract, ListPortalContentResponseContract, ListPortalDatabaseBlockSourcesResponseContract, ListPortalLinkableBlocksResponseContract, orgIdInPathRequired, OrgPortalListResponseContract, PortalDetailContract, PortalTextAndMediaBlockResponseContract, PublishPortalDraftResponseContract, SearchPortalInfoBlockIconsResponseContract, SetDashboardViewReadonlyRequestContract, SetDashboardViewReadonlyResponseContract, UpdatePortalAccessRequestContract, UpdatePortalAccessResponseContract, UpdatePortalCustomCodeRequestContract, UpdatePortalCustomCodeResponseContract } from "../types";
8
+ import type { AddPortalAiAgentBlockRequestContract, AddPortalAiAgentBlockResponseContract, AddPortalAppBlockRequestContract, AddPortalAppBlockResponseContract, AddPortalAppPageRequestContract, AddPortalAppPageResponseContract, AddPortalBlankNoteBlockRequestContract, AddPortalBlankNoteBlockResponseContract, AddPortalBlockRequestContract, AddPortalBlockResponseContract, AddPortalBpmnDiagramBlockRequestContract, AddPortalBpmnDiagramBlockResponseContract, AddPortalCardBlockRequestContract, AddPortalCardBlockResponseContract, AddPortalCardGroupBlockRequestContract, AddPortalCardGroupBlockResponseContract, AddPortalCarouselBlockRequestContract, AddPortalCarouselBlockResponseContract, AddPortalChatBlockRequestContract, AddPortalChatBlockResponseContract, AddPortalCountdownBlockRequestContract, AddPortalCountdownBlockResponseContract, AddPortalCustomWidgetBlockRequestContract, AddPortalCustomWidgetBlockResponseContract, AddPortalDatabaseBlockRequestContract, AddPortalDatabaseBlockResponseContract, AddPortalDynamicTableBlockRequestContract, AddPortalDynamicTableBlockResponseContract, AddPortalEmbedBlockRequestContract, AddPortalEmbedBlockResponseContract, AddPortalFileUploaderBlockRequestContract, AddPortalFileUploaderBlockResponseContract, AddPortalFormBlockRequestContract, AddPortalFormBlockResponseContract, AddPortalHeadingBlockRequestContract, AddPortalHtmlCssBlockRequestContract, AddPortalHtmlCssBlockResponseContract, AddPortalImageBlockRequestContract, AddPortalInfoBlockRequestContract, AddPortalInfoBlockResponseContract, AddPortalKanbanBlockRequestContract, AddPortalKanbanBlockResponseContract, AddPortalLinkedBlockRequestContract, AddPortalLinkedBlockResponseContract, AddPortalNoteBlockRequestContract, AddPortalNoteBlockResponseContract, AddPortalRecentFilesBlockRequestContract, AddPortalRecentFilesBlockResponseContract, AddPortalTaskListBlockRequestContract, AddPortalTaskListBlockResponseContract, AddPortalTextBlockRequestContract, AddPortalTimelineBlockRequestContract, AddPortalTimelineBlockResponseContract, BulkInviteToPortalRequestContract, BulkInviteToPortalResponseContract, CreatePortalFolderRequestContract, CreatePortalFolderResponseContract, CreatePortalLinkRequestContract, CreatePortalLinkResponseContract, CreatePortalPageRequestContract, CreatePortalPageResponseContract, CreatePortalPageWithNoteRequestContract, CreatePortalPageWithNoteResponseContract, CreatePortalRequestContract, CreatePortalResponseContract, DuplicatePortalItemRequestContract, DuplicatePortalItemResponseContract, DuplicatePortalRequestContract, GetPortalPageBlockCountResponseContract, globalIdInPathRequired, InvitePortalManagerRequestContract, InvitePortalManagerResponseContract, InviteToPortalRequestContract, InviteToPortalResponseContract, ListPortalAiAgentsResponseContract, ListPortalChatChannelsResponseContract, ListPortalChatUsersResponseContract, ListPortalContentResponseContract, ListPortalDatabaseBlockSourcesResponseContract, ListPortalLinkableBlocksResponseContract, orgIdInPathRequired, OrgPortalListResponseContract, PortalDetailContract, PortalTextAndMediaBlockResponseContract, PublishPortalDraftResponseContract, SearchPortalInfoBlockIconsResponseContract, SetDashboardViewReadonlyRequestContract, SetDashboardViewReadonlyResponseContract, UpdatePortalAccessRequestContract, UpdatePortalAccessResponseContract, UpdatePortalCustomCodeRequestContract, UpdatePortalCustomCodeResponseContract } from "../types";
9
9
  export declare class PortalsApi {
10
10
  private client;
11
11
  constructor(client: Client);
@@ -37,7 +37,7 @@ export declare class PortalsApi {
37
37
  }): Promise<AddPortalAppBlockResponseContract>;
38
38
  /**
39
39
  * Add a published app as a portal page (embed)
40
- * Creates a new sidebar page in the portal that embeds a published Fusebase app (a flexible block with an app-feature brick). Pass productId (the product that owns the app) and appId (the app to embed) — typically the app you just built and published via the CLI. For a managed product (Customizer "Managed Products") also pass productType='managed' and productOrgId from findPublishedApps. The app's URL is resolved by the portal at render time from these ids; nothing is hard-coded. Pass parentId to nest the page under an existing folder. The page is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending page, and publishes it. Returns the page/menu-item/block ids, the page url, and the draft branch/seqs. Requires portals.write access.
40
+ * Creates a new sidebar page in the portal that embeds a published Fusebase app (a flexible block with an app-feature brick). Pass productId (the product that owns the app) and appId (the app to embed) — typically the app you just built and published via the CLI. For a managed product (Customizer "Managed Products") also pass productType='managed' and productOrgId from findPublishedApps. The app's URL is resolved by the portal at render time from these ids; nothing is hard-coded. Pass parentId to nest the page under an existing folder, or positionType ('sidebar' default, 'top', 'footer') to place a root page in a specific menu bar. The page is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending page, and publishes it. Returns the page/menu-item/block ids, the page url, and the draft branch/seqs. Requires portals.write access.
41
41
  */
42
42
  addPortalAppPage(params: {
43
43
  path: {
@@ -62,7 +62,7 @@ export declare class PortalsApi {
62
62
  }): Promise<AddPortalBlankNoteBlockResponseContract>;
63
63
  /**
64
64
  * Add a block of any palette type to a portal page
65
- * Stages a single block of any supported type onto an existing portal page — the universal building block behind the customizer's 'Add new block' palette (no new page or sidebar item is created). Pass pageId (the target page node id from listPortalContent) and type. Supported types: note, content, docs, help, request, meetings, links, files-dashboard, tasks-dashboard, chats-dashboard, files-recent, flexible. Type-specific fields: note/content require noteId; flexible requires template (e.g. {type:'text'|'image'|'title'|'dashboard'|'app-feature'|...}) and may carry bricks; the link cards (docs/help/request/meetings/links) and others take their fields via the free-form `properties` object (e.g. image/link). It does NOT accept type='projection' — use addPortalLinkedBlock for a Linked block. This op does NOT accept type='embed', a flexible block with template.type='timeline' or a timeline brick (use addPortalTimelineBlock), a flexible block with template.type='dashboard' or a dashboard brick (use addPortalDatabaseBlock) or type='chat' — use addPortalEmbedBlock for Embed blocks and addPortalChatBlock for Chat blocks. It also does NOT accept type='files-bucket': use addPortalFileUploaderBlock for File uploader blocks. It does NOT accept a flexible ai-agent template or an ai-agent brick: use addPortalAiAgentBlock, which binds the agent to the caller. It does NOT accept a flexible `form` template or a `form` brick either: use addPortalFormBlock, which owns the canonical Form block and its fields. It does NOT accept type='info': use addPortalInfoBlock, which owns the canonical Info block, its icon catalog and its destination resolution. It does NOT accept type='task-list' or a note/content block with properties.templateKey='task-list': use addPortalTaskListBlock, which creates the note and its task list. Use addPortalNoteBlock for the common note case or addPortalAppPage for an app on its own page. Note: a `content` block renames the page to its title, so leave title empty for content blocks. The block is staged in the portal's customizer draft (not published immediately); the owner reviews and publishes it. Returns the block id and the draft branch/seqs. Requires portals.write access.
65
+ * Stages a single block of any supported type onto an existing portal page — the universal building block behind the customizer's 'Add new block' palette (no new page or sidebar item is created). Pass pageId (the target page node id from listPortalContent) and type. Supported types: note, content, docs, help, request, meetings, links, files-dashboard, tasks-dashboard, chats-dashboard, flexible. Type-specific fields: note/content require noteId; flexible requires template (e.g. {type:'text'|'image'|'title'|'dashboard'|'app-feature'|...}) and may carry bricks; the link cards (docs/help/request/meetings/links) and others take their fields via the free-form `properties` object (e.g. image/link). It does NOT accept type='projection' — use addPortalLinkedBlock for a Linked block. This op does NOT accept type='embed', a flexible block with template.type='timeline' or a timeline brick (use addPortalTimelineBlock), a flexible block with template.type='dashboard' or a dashboard brick (use addPortalDatabaseBlock), a flexible block with template.type='integration' or an integration brick (use addPortalDynamicTableBlock), a flexible block with template.type='diagram' or a diagram brick (use addPortalBpmnDiagramBlock) or type='chat' — use addPortalEmbedBlock for Embed blocks and addPortalChatBlock for Chat blocks. It also does NOT accept type='files-bucket': use addPortalFileUploaderBlock for File uploader blocks. It does NOT accept type='files-recent': use addPortalRecentFilesBlock for Recent files blocks. It does NOT accept a flexible ai-agent template or an ai-agent brick: use addPortalAiAgentBlock, which binds the agent to the caller. It does NOT accept a flexible `form` template or a `form` brick either: use addPortalFormBlock, which owns the canonical Form block and its fields. It does NOT accept type='info': use addPortalInfoBlock, which owns the canonical Info block, its icon catalog and its destination resolution. It does NOT accept type='task-list' or a note/content block with properties.templateKey='task-list': use addPortalTaskListBlock, which creates the note and its task list. Use addPortalNoteBlock for the common note case or addPortalAppPage for an app on its own page. Note: a `content` block renames the page to its title, so leave title empty for content blocks. The block is staged in the portal's customizer draft (not published immediately); the owner reviews and publishes it. Returns the block id and the draft branch/seqs. Requires portals.write access.
66
66
  */
67
67
  addPortalBlock(params: {
68
68
  path: {
@@ -72,6 +72,19 @@ export declare class PortalsApi {
72
72
  headers?: Record<string, string>;
73
73
  body: AddPortalBlockRequestContract;
74
74
  }): Promise<AddPortalBlockResponseContract>;
75
+ /**
76
+ * Add a BPMN Diagram block to a portal page
77
+ * Stages one Customizer-compatible BPMN Diagram block on an EXISTING portal page — the programmatic equivalent of the customizer's Experimental "BPMN Diagram" tile. It creates exactly one flexible block with a single BPMN diagram brick; no page, sidebar item or menu icon change comes with it. The diagram is created EMPTY, exactly as the Customizer creates it: the process itself is drawn or imported from a `.bpmn` file in Portal Customizer. BPMN XML, `.bpmn` file uploads, task ids, persisted data/details and links for BPMN Task elements are rejected. This is not a Mermaid diagram, a generic flowchart, a Timeline or an image. The body may be empty, which reproduces the Customizer default: the title "BPMN Diagram", a 500px canvas, a blank backdrop with the title shown, width 6 and automatic height. `title` is the block title (plain text, only the `{{ClientName}}` and `{{ClientLastName}}` variables). `content.diagramHeight` is the BPMN canvas height in pixels (integer 150-5000, default 500) and is distinct from the block Layout height. `appearance` sets Customizer Backdrop `none`, `blank` or `custom`; a custom backdrop takes a background, padding (default `s`) and `showTitle` (default true). `layout` sets Width (2-6, default 6) and Height (Auto by default, a manual value is at least 50px). The block is staged in the portal's customizer draft (not published immediately). Requires portals.write access.
78
+ */
79
+ addPortalBpmnDiagramBlock(params: {
80
+ path: {
81
+ orgId: orgIdInPathRequired;
82
+ portalId: globalIdInPathRequired;
83
+ pageId: globalIdInPathRequired;
84
+ };
85
+ headers?: Record<string, string>;
86
+ body: AddPortalBpmnDiagramBlockRequestContract;
87
+ }): Promise<AddPortalBpmnDiagramBlockResponseContract>;
75
88
  /**
76
89
  * Add a Card block to a portal page
77
90
  * Stages one Customizer-compatible Card on an EXISTING portal page — the programmatic equivalent of the customizer's Content display "Card" tile. It creates exactly one flexible block with the five canonical bricks (Image, Heading, Description, Button, Destination URL); no page, sidebar item or media asset is created. `view` is the Card Type: `top-image`, `left-image`, `right-image` or `fill-image` (default `top-image`; `fill-image` defaults the text to white). `content` configures the bricks: `image.visible` only — the Card always uses the built-in template image and an `src`/URL/asset id/upload is rejected —, `heading` and `description` (plain text plus one palette colour token such as `cyan-700`, size `s`/`m`/`l`/`xl`, a unique set of `bold`/`italic`/`underline`/`lineThrough` styles and alignment), `button` (plain label sent as `button.text` — there is no `label` field and sending one is rejected — with no dynamic variables) and `destination`. `visible` defaults to `true`, so a visible item does NOT need `visible: true`: send `content.button: {text: "Open"}` to set an enabled Button label. Any of Image, Heading, Description and Button can be hidden with `visible: false`, which then must be the item's only field. `destination` is shared by the whole Card and its Button: an exact `pageId` of a page in THIS portal, an absolute https URL, an email address, or `null` for no link — a raw DynamicLink, `javascript:`/`data:` URL or caller-supplied internal title/targetId is rejected, and the link target (new tab) is not configurable. `appearance` is optional; omitting it keeps the Card's canonical bare wrapper, and a `custom` backdrop takes a colour, gradient or one of the five preset background images (`azure`, `mira`, `solis`, `serenity`, `glow`). `layout` sets Customizer Width (2-6, default 3) and Height (Auto by default, a manual value is at least 50px). HTML, Markdown, CSS, Tailwind classes, a wrapper title and raw bricks are not accepted. The block is staged in the portal's customizer draft (not published immediately). Requires portals.write access.
@@ -163,6 +176,19 @@ export declare class PortalsApi {
163
176
  headers?: Record<string, string>;
164
177
  body: AddPortalDatabaseBlockRequestContract;
165
178
  }): Promise<AddPortalDatabaseBlockResponseContract>;
179
+ /**
180
+ * Add a Dynamic Table block to a portal page
181
+ * Stages one Customizer-compatible Dynamic Table block on an EXISTING portal page — the programmatic equivalent of the customizer's Dynamic "Table" tile. It creates exactly one flexible block with a single integration brick; no page, sidebar item or OAuth connection is created. This is NOT addPortalDatabaseBlock: Database shows a Fusebase Database table/view, while Dynamic Table reads records from a HubSpot, Asana or monday.com connection. The block is created UNCONFIGURED, exactly as the Customizer creates it before a Data source is picked: the response carries `configured: false` and the Data source, table fields, filters, sorting and pagination are still chosen in Portal Customizer. `tokenId`, provider source ids, mappings, filters, order, pagination, template and bricks are rejected. The body may be empty, which reproduces the Customizer default: the title "Dynamic Table", a blank backdrop with the title shown, width 6 and automatic height. `title` is the block title (plain text, only the `{{ClientName}}` and `{{ClientLastName}}` variables). `appearance` sets Customizer Backdrop `none`, `blank` or `custom`; a custom backdrop takes a background, padding (default `s`) and `showTitle` (default true). `layout` sets Width (2-6, default 6) and Height (Auto by default, a manual value is at least 50px). The block is staged in the portal's customizer draft (not published immediately). Requires portals.write access.
182
+ */
183
+ addPortalDynamicTableBlock(params: {
184
+ path: {
185
+ orgId: orgIdInPathRequired;
186
+ portalId: globalIdInPathRequired;
187
+ pageId: globalIdInPathRequired;
188
+ };
189
+ headers?: Record<string, string>;
190
+ body: AddPortalDynamicTableBlockRequestContract;
191
+ }): Promise<AddPortalDynamicTableBlockResponseContract>;
166
192
  /**
167
193
  * Add an Embeds & Integrations block to a portal page
168
194
  * Stages one Customizer-compatible Embed block on an EXISTING portal page — the programmatic equivalent of the customizer's "Embeds & Integrations" action. No new page and no sidebar menu item is created. embedType is one of the 11 chooser variants (custom, youtube, google-drive, ms-doc, calendly, hubspot, airtable, loom, data-studio, figma, miro). For `custom` pass `content` (URL or embed code) and NOT `url`; for every named variant pass `url` and NOT `content` — the service builds the canonical iframe. hubspot here is an iframe Embed block, not a Flexible Block integration brick. For a published page resolve pageId from listPortalContent; for a page created earlier in the active draft use the pageId that operation returned. The block is staged in the portal's customizer draft (not published immediately). Returns the block id and the draft branch/seqs. Requires portals.write access.
@@ -292,6 +318,19 @@ export declare class PortalsApi {
292
318
  headers?: Record<string, string>;
293
319
  body: AddPortalNoteBlockRequestContract;
294
320
  }): Promise<AddPortalNoteBlockResponseContract>;
321
+ /**
322
+ * Add a Recent files block to a portal page
323
+ * Stages one Customizer-compatible Recent files block on an EXISTING portal page — the programmatic equivalent of the customizer's File management "Recent files" tile. The block lists the five most recently created files of the whole portal or of exactly one portal page; no page, sidebar item, file or bucket is created and no file access is widened (the File Manager applies the viewer's own access at render time). The body may be empty, which reproduces the Customizer default: the title "Recent files" scoped to the entire portal. `title` is at most 100 characters. `source` is either `{type:'entirePortal'}` or `{type:'portalPage', pageId}` with an exact page id of THIS portal — a page title, path, URL, file or bucket id is rejected. `layout` sets Width (3-6, default 3) and Height (Auto by default, a manual value is at least 50px). Sort order (createdAt descending), the item count of 5, the offset, raw query/link data, Appearance and Rows are fixed and not configurable. The block is staged in the portal's customizer draft (not published immediately). Requires portals.write access.
324
+ */
325
+ addPortalRecentFilesBlock(params: {
326
+ path: {
327
+ orgId: orgIdInPathRequired;
328
+ portalId: globalIdInPathRequired;
329
+ pageId: globalIdInPathRequired;
330
+ };
331
+ headers?: Record<string, string>;
332
+ body: AddPortalRecentFilesBlockRequestContract;
333
+ }): Promise<AddPortalRecentFilesBlockResponseContract>;
295
334
  /**
296
335
  * Add a task list as a block to a portal page
297
336
  * Creates a new Fusebase note, shares it into the portal, initialises a task list inside it and adds the note as a block to an existing portal page — the programmatic equivalent of the customizer's Project management "Task list" tile. No new page and no sidebar menu item is created. For a published page resolve pageId from listPortalContent; for a page created earlier in the active draft use the pageId that operation returned. Optional body: title (block and task list title, at most 100 characters, default "Task list") and layout (colspan 3-6, default 6; height in pixels or null for Auto, default null). The list starts empty — tasks are added by portal users, not by this operation, and an existing task list cannot be attached. Use addPortalBlankNoteBlock when an empty note is wanted instead. The block is appended after the last block of the page body and is staged in the portal's customizer draft (not published immediately). Returns the note/task list/block ids and the draft branch/seqs. Requires portals.write access.
@@ -356,7 +395,7 @@ export declare class PortalsApi {
356
395
  }): Promise<CreatePortalResponseContract>;
357
396
  /**
358
397
  * Create a root folder in a portal
359
- * Creates a new empty root folder (a portalSection) in the portal's sidebar navigation. The folder is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending folder, and publishes it. Returns the created folder/page ids, its url, and the draft branch/seqs. Requires portals.write access.
398
+ * Creates a new empty root folder (a portalSection) in a portal menu bar. Pass positionType to choose the bar: 'sidebar' (default), 'top' (topbar), or 'footer'. The folder is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending folder, and publishes it. Returns the created folder/page ids, its url, and the draft branch/seqs. Requires portals.write access.
360
399
  */
361
400
  createPortalFolder(params: {
362
401
  path: {
@@ -366,9 +405,21 @@ export declare class PortalsApi {
366
405
  headers?: Record<string, string>;
367
406
  body: CreatePortalFolderRequestContract;
368
407
  }): Promise<CreatePortalFolderResponseContract>;
408
+ /**
409
+ * Create an external link menu item in a portal
410
+ * Creates a menu item that opens an external URL (no page is created). Use it to build a topbar or footer nav of external links (e.g. Chat / Case Studies / Contact). Pass name and url; positionType chooses the bar: 'sidebar' (default), 'top' (topbar), or 'footer'. Optionally pass icon, openInNewTab (default true), and parentId to nest under a folder. The link is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending link, and publishes it. Returns the created menu-item id and the draft branch/seqs. Requires portals.write access.
411
+ */
412
+ createPortalLink(params: {
413
+ path: {
414
+ orgId: orgIdInPathRequired;
415
+ portalId: globalIdInPathRequired;
416
+ };
417
+ headers?: Record<string, string>;
418
+ body: CreatePortalLinkRequestContract;
419
+ }): Promise<CreatePortalLinkResponseContract>;
369
420
  /**
370
421
  * Create an empty portal page
371
- * Creates a new EMPTY sidebar page in the portal — a page node plus its sidebar menu item, with no Fusebase note and no block. The page is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending page, and publishes it. Pass parentId to nest the page under an existing published or active-draft folder. The returned pageId can immediately be passed to semantic block operations to add content before publishing. Use createPortalPageWithNote instead when a page backed by a new Fusebase note is wanted. Returns the page/menu-item ids, the page url, and the draft branch/seqs. Requires portals.write access.
422
+ * Creates a new EMPTY page in the portal — a page node plus its menu item, with no Fusebase note and no block. The page is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending page, and publishes it. Pass positionType ('sidebar' default, 'top' or 'footer') to choose the menu bar. Pass parentId to nest the page under an existing published or active-draft folder. The returned pageId can immediately be passed to semantic block operations to add content before publishing. Use createPortalPageWithNote instead when a page backed by a new Fusebase note is wanted. Returns the page/menu-item ids, the page url, and the draft branch/seqs. Requires portals.write access.
372
423
  */
373
424
  createPortalPage(params: {
374
425
  path: {
@@ -380,7 +431,7 @@ export declare class PortalsApi {
380
431
  }): Promise<CreatePortalPageResponseContract>;
381
432
  /**
382
433
  * Create a portal page backed by a Fusebase note
383
- * Creates a new sidebar page in the portal backed by a freshly created Fusebase note. The note is created in the portal's workspace and shared into the portal; optional initial text or html can be appended to it. The page (page node + note menu item + note content block) is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending page, and publishes it. Pass parentId to nest the page under an existing folder. Returns the note/page/menu-item ids, the page url, and the draft branch/seqs. Requires portals.write access.
434
+ * Creates a new sidebar page in the portal backed by a freshly created Fusebase note. The note is created in the portal's workspace and shared into the portal; optional initial text or html can be appended to it. The page (page node + note menu item + note content block) is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending page, and publishes it. Pass parentId to nest the page under an existing folder, or positionType ('sidebar' default, 'top', 'footer') to place a root page in a specific menu bar. Returns the note/page/menu-item ids, the page url, and the draft branch/seqs. Requires portals.write access.
384
435
  */
385
436
  createPortalPageWithNote(params: {
386
437
  path: {
@@ -43,7 +43,7 @@ class PortalsApi {
43
43
  }
44
44
  /**
45
45
  * Add a published app as a portal page (embed)
46
- * Creates a new sidebar page in the portal that embeds a published Fusebase app (a flexible block with an app-feature brick). Pass productId (the product that owns the app) and appId (the app to embed) — typically the app you just built and published via the CLI. For a managed product (Customizer "Managed Products") also pass productType='managed' and productOrgId from findPublishedApps. The app's URL is resolved by the portal at render time from these ids; nothing is hard-coded. Pass parentId to nest the page under an existing folder. The page is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending page, and publishes it. Returns the page/menu-item/block ids, the page url, and the draft branch/seqs. Requires portals.write access.
46
+ * Creates a new sidebar page in the portal that embeds a published Fusebase app (a flexible block with an app-feature brick). Pass productId (the product that owns the app) and appId (the app to embed) — typically the app you just built and published via the CLI. For a managed product (Customizer "Managed Products") also pass productType='managed' and productOrgId from findPublishedApps. The app's URL is resolved by the portal at render time from these ids; nothing is hard-coded. Pass parentId to nest the page under an existing folder, or positionType ('sidebar' default, 'top', 'footer') to place a root page in a specific menu bar. The page is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending page, and publishes it. Returns the page/menu-item/block ids, the page url, and the draft branch/seqs. Requires portals.write access.
47
47
  */
48
48
  async addPortalAppPage(params) {
49
49
  return this.client.request({
@@ -73,7 +73,7 @@ class PortalsApi {
73
73
  }
74
74
  /**
75
75
  * Add a block of any palette type to a portal page
76
- * Stages a single block of any supported type onto an existing portal page — the universal building block behind the customizer's 'Add new block' palette (no new page or sidebar item is created). Pass pageId (the target page node id from listPortalContent) and type. Supported types: note, content, docs, help, request, meetings, links, files-dashboard, tasks-dashboard, chats-dashboard, files-recent, flexible. Type-specific fields: note/content require noteId; flexible requires template (e.g. {type:'text'|'image'|'title'|'dashboard'|'app-feature'|...}) and may carry bricks; the link cards (docs/help/request/meetings/links) and others take their fields via the free-form `properties` object (e.g. image/link). It does NOT accept type='projection' — use addPortalLinkedBlock for a Linked block. This op does NOT accept type='embed', a flexible block with template.type='timeline' or a timeline brick (use addPortalTimelineBlock), a flexible block with template.type='dashboard' or a dashboard brick (use addPortalDatabaseBlock) or type='chat' — use addPortalEmbedBlock for Embed blocks and addPortalChatBlock for Chat blocks. It also does NOT accept type='files-bucket': use addPortalFileUploaderBlock for File uploader blocks. It does NOT accept a flexible ai-agent template or an ai-agent brick: use addPortalAiAgentBlock, which binds the agent to the caller. It does NOT accept a flexible `form` template or a `form` brick either: use addPortalFormBlock, which owns the canonical Form block and its fields. It does NOT accept type='info': use addPortalInfoBlock, which owns the canonical Info block, its icon catalog and its destination resolution. It does NOT accept type='task-list' or a note/content block with properties.templateKey='task-list': use addPortalTaskListBlock, which creates the note and its task list. Use addPortalNoteBlock for the common note case or addPortalAppPage for an app on its own page. Note: a `content` block renames the page to its title, so leave title empty for content blocks. The block is staged in the portal's customizer draft (not published immediately); the owner reviews and publishes it. Returns the block id and the draft branch/seqs. Requires portals.write access.
76
+ * Stages a single block of any supported type onto an existing portal page — the universal building block behind the customizer's 'Add new block' palette (no new page or sidebar item is created). Pass pageId (the target page node id from listPortalContent) and type. Supported types: note, content, docs, help, request, meetings, links, files-dashboard, tasks-dashboard, chats-dashboard, flexible. Type-specific fields: note/content require noteId; flexible requires template (e.g. {type:'text'|'image'|'title'|'dashboard'|'app-feature'|...}) and may carry bricks; the link cards (docs/help/request/meetings/links) and others take their fields via the free-form `properties` object (e.g. image/link). It does NOT accept type='projection' — use addPortalLinkedBlock for a Linked block. This op does NOT accept type='embed', a flexible block with template.type='timeline' or a timeline brick (use addPortalTimelineBlock), a flexible block with template.type='dashboard' or a dashboard brick (use addPortalDatabaseBlock), a flexible block with template.type='integration' or an integration brick (use addPortalDynamicTableBlock), a flexible block with template.type='diagram' or a diagram brick (use addPortalBpmnDiagramBlock) or type='chat' — use addPortalEmbedBlock for Embed blocks and addPortalChatBlock for Chat blocks. It also does NOT accept type='files-bucket': use addPortalFileUploaderBlock for File uploader blocks. It does NOT accept type='files-recent': use addPortalRecentFilesBlock for Recent files blocks. It does NOT accept a flexible ai-agent template or an ai-agent brick: use addPortalAiAgentBlock, which binds the agent to the caller. It does NOT accept a flexible `form` template or a `form` brick either: use addPortalFormBlock, which owns the canonical Form block and its fields. It does NOT accept type='info': use addPortalInfoBlock, which owns the canonical Info block, its icon catalog and its destination resolution. It does NOT accept type='task-list' or a note/content block with properties.templateKey='task-list': use addPortalTaskListBlock, which creates the note and its task list. Use addPortalNoteBlock for the common note case or addPortalAppPage for an app on its own page. Note: a `content` block renames the page to its title, so leave title empty for content blocks. The block is staged in the portal's customizer draft (not published immediately); the owner reviews and publishes it. Returns the block id and the draft branch/seqs. Requires portals.write access.
77
77
  */
78
78
  async addPortalBlock(params) {
79
79
  return this.client.request({
@@ -86,6 +86,21 @@ class PortalsApi {
86
86
  expectedContentType: "application/json",
87
87
  });
88
88
  }
89
+ /**
90
+ * Add a BPMN Diagram block to a portal page
91
+ * Stages one Customizer-compatible BPMN Diagram block on an EXISTING portal page — the programmatic equivalent of the customizer's Experimental "BPMN Diagram" tile. It creates exactly one flexible block with a single BPMN diagram brick; no page, sidebar item or menu icon change comes with it. The diagram is created EMPTY, exactly as the Customizer creates it: the process itself is drawn or imported from a `.bpmn` file in Portal Customizer. BPMN XML, `.bpmn` file uploads, task ids, persisted data/details and links for BPMN Task elements are rejected. This is not a Mermaid diagram, a generic flowchart, a Timeline or an image. The body may be empty, which reproduces the Customizer default: the title "BPMN Diagram", a 500px canvas, a blank backdrop with the title shown, width 6 and automatic height. `title` is the block title (plain text, only the `{{ClientName}}` and `{{ClientLastName}}` variables). `content.diagramHeight` is the BPMN canvas height in pixels (integer 150-5000, default 500) and is distinct from the block Layout height. `appearance` sets Customizer Backdrop `none`, `blank` or `custom`; a custom backdrop takes a background, padding (default `s`) and `showTitle` (default true). `layout` sets Width (2-6, default 6) and Height (Auto by default, a manual value is at least 50px). The block is staged in the portal's customizer draft (not published immediately). Requires portals.write access.
92
+ */
93
+ async addPortalBpmnDiagramBlock(params) {
94
+ return this.client.request({
95
+ method: "POST",
96
+ path: "/:orgId/portals/:portalId/pages/:pageId/blocks/bpmn-diagram",
97
+ pathParams: params.path,
98
+ headers: params.headers,
99
+ body: params.body,
100
+ opId: "addPortalBpmnDiagramBlock",
101
+ expectedContentType: "application/json",
102
+ });
103
+ }
89
104
  /**
90
105
  * Add a Card block to a portal page
91
106
  * Stages one Customizer-compatible Card on an EXISTING portal page — the programmatic equivalent of the customizer's Content display "Card" tile. It creates exactly one flexible block with the five canonical bricks (Image, Heading, Description, Button, Destination URL); no page, sidebar item or media asset is created. `view` is the Card Type: `top-image`, `left-image`, `right-image` or `fill-image` (default `top-image`; `fill-image` defaults the text to white). `content` configures the bricks: `image.visible` only — the Card always uses the built-in template image and an `src`/URL/asset id/upload is rejected —, `heading` and `description` (plain text plus one palette colour token such as `cyan-700`, size `s`/`m`/`l`/`xl`, a unique set of `bold`/`italic`/`underline`/`lineThrough` styles and alignment), `button` (plain label sent as `button.text` — there is no `label` field and sending one is rejected — with no dynamic variables) and `destination`. `visible` defaults to `true`, so a visible item does NOT need `visible: true`: send `content.button: {text: "Open"}` to set an enabled Button label. Any of Image, Heading, Description and Button can be hidden with `visible: false`, which then must be the item's only field. `destination` is shared by the whole Card and its Button: an exact `pageId` of a page in THIS portal, an absolute https URL, an email address, or `null` for no link — a raw DynamicLink, `javascript:`/`data:` URL or caller-supplied internal title/targetId is rejected, and the link target (new tab) is not configurable. `appearance` is optional; omitting it keeps the Card's canonical bare wrapper, and a `custom` backdrop takes a colour, gradient or one of the five preset background images (`azure`, `mira`, `solis`, `serenity`, `glow`). `layout` sets Customizer Width (2-6, default 3) and Height (Auto by default, a manual value is at least 50px). HTML, Markdown, CSS, Tailwind classes, a wrapper title and raw bricks are not accepted. The block is staged in the portal's customizer draft (not published immediately). Requires portals.write access.
@@ -191,6 +206,21 @@ class PortalsApi {
191
206
  expectedContentType: "application/json",
192
207
  });
193
208
  }
209
+ /**
210
+ * Add a Dynamic Table block to a portal page
211
+ * Stages one Customizer-compatible Dynamic Table block on an EXISTING portal page — the programmatic equivalent of the customizer's Dynamic "Table" tile. It creates exactly one flexible block with a single integration brick; no page, sidebar item or OAuth connection is created. This is NOT addPortalDatabaseBlock: Database shows a Fusebase Database table/view, while Dynamic Table reads records from a HubSpot, Asana or monday.com connection. The block is created UNCONFIGURED, exactly as the Customizer creates it before a Data source is picked: the response carries `configured: false` and the Data source, table fields, filters, sorting and pagination are still chosen in Portal Customizer. `tokenId`, provider source ids, mappings, filters, order, pagination, template and bricks are rejected. The body may be empty, which reproduces the Customizer default: the title "Dynamic Table", a blank backdrop with the title shown, width 6 and automatic height. `title` is the block title (plain text, only the `{{ClientName}}` and `{{ClientLastName}}` variables). `appearance` sets Customizer Backdrop `none`, `blank` or `custom`; a custom backdrop takes a background, padding (default `s`) and `showTitle` (default true). `layout` sets Width (2-6, default 6) and Height (Auto by default, a manual value is at least 50px). The block is staged in the portal's customizer draft (not published immediately). Requires portals.write access.
212
+ */
213
+ async addPortalDynamicTableBlock(params) {
214
+ return this.client.request({
215
+ method: "POST",
216
+ path: "/:orgId/portals/:portalId/pages/:pageId/blocks/dynamic-table",
217
+ pathParams: params.path,
218
+ headers: params.headers,
219
+ body: params.body,
220
+ opId: "addPortalDynamicTableBlock",
221
+ expectedContentType: "application/json",
222
+ });
223
+ }
194
224
  /**
195
225
  * Add an Embeds & Integrations block to a portal page
196
226
  * Stages one Customizer-compatible Embed block on an EXISTING portal page — the programmatic equivalent of the customizer's "Embeds & Integrations" action. No new page and no sidebar menu item is created. embedType is one of the 11 chooser variants (custom, youtube, google-drive, ms-doc, calendly, hubspot, airtable, loom, data-studio, figma, miro). For `custom` pass `content` (URL or embed code) and NOT `url`; for every named variant pass `url` and NOT `content` — the service builds the canonical iframe. hubspot here is an iframe Embed block, not a Flexible Block integration brick. For a published page resolve pageId from listPortalContent; for a page created earlier in the active draft use the pageId that operation returned. The block is staged in the portal's customizer draft (not published immediately). Returns the block id and the draft branch/seqs. Requires portals.write access.
@@ -341,6 +371,21 @@ class PortalsApi {
341
371
  expectedContentType: "application/json",
342
372
  });
343
373
  }
374
+ /**
375
+ * Add a Recent files block to a portal page
376
+ * Stages one Customizer-compatible Recent files block on an EXISTING portal page — the programmatic equivalent of the customizer's File management "Recent files" tile. The block lists the five most recently created files of the whole portal or of exactly one portal page; no page, sidebar item, file or bucket is created and no file access is widened (the File Manager applies the viewer's own access at render time). The body may be empty, which reproduces the Customizer default: the title "Recent files" scoped to the entire portal. `title` is at most 100 characters. `source` is either `{type:'entirePortal'}` or `{type:'portalPage', pageId}` with an exact page id of THIS portal — a page title, path, URL, file or bucket id is rejected. `layout` sets Width (3-6, default 3) and Height (Auto by default, a manual value is at least 50px). Sort order (createdAt descending), the item count of 5, the offset, raw query/link data, Appearance and Rows are fixed and not configurable. The block is staged in the portal's customizer draft (not published immediately). Requires portals.write access.
377
+ */
378
+ async addPortalRecentFilesBlock(params) {
379
+ return this.client.request({
380
+ method: "POST",
381
+ path: "/:orgId/portals/:portalId/pages/:pageId/blocks/recent-files",
382
+ pathParams: params.path,
383
+ headers: params.headers,
384
+ body: params.body,
385
+ opId: "addPortalRecentFilesBlock",
386
+ expectedContentType: "application/json",
387
+ });
388
+ }
344
389
  /**
345
390
  * Add a task list as a block to a portal page
346
391
  * Creates a new Fusebase note, shares it into the portal, initialises a task list inside it and adds the note as a block to an existing portal page — the programmatic equivalent of the customizer's Project management "Task list" tile. No new page and no sidebar menu item is created. For a published page resolve pageId from listPortalContent; for a page created earlier in the active draft use the pageId that operation returned. Optional body: title (block and task list title, at most 100 characters, default "Task list") and layout (colspan 3-6, default 6; height in pixels or null for Auto, default null). The list starts empty — tasks are added by portal users, not by this operation, and an existing task list cannot be attached. Use addPortalBlankNoteBlock when an empty note is wanted instead. The block is appended after the last block of the page body and is staged in the portal's customizer draft (not published immediately). Returns the note/task list/block ids and the draft branch/seqs. Requires portals.write access.
@@ -418,7 +463,7 @@ class PortalsApi {
418
463
  }
419
464
  /**
420
465
  * Create a root folder in a portal
421
- * Creates a new empty root folder (a portalSection) in the portal's sidebar navigation. The folder is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending folder, and publishes it. Returns the created folder/page ids, its url, and the draft branch/seqs. Requires portals.write access.
466
+ * Creates a new empty root folder (a portalSection) in a portal menu bar. Pass positionType to choose the bar: 'sidebar' (default), 'top' (topbar), or 'footer'. The folder is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending folder, and publishes it. Returns the created folder/page ids, its url, and the draft branch/seqs. Requires portals.write access.
422
467
  */
423
468
  async createPortalFolder(params) {
424
469
  return this.client.request({
@@ -431,9 +476,24 @@ class PortalsApi {
431
476
  expectedContentType: "application/json",
432
477
  });
433
478
  }
479
+ /**
480
+ * Create an external link menu item in a portal
481
+ * Creates a menu item that opens an external URL (no page is created). Use it to build a topbar or footer nav of external links (e.g. Chat / Case Studies / Contact). Pass name and url; positionType chooses the bar: 'sidebar' (default), 'top' (topbar), or 'footer'. Optionally pass icon, openInNewTab (default true), and parentId to nest under a folder. The link is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending link, and publishes it. Returns the created menu-item id and the draft branch/seqs. Requires portals.write access.
482
+ */
483
+ async createPortalLink(params) {
484
+ return this.client.request({
485
+ method: "POST",
486
+ path: "/:orgId/portals/:portalId/links",
487
+ pathParams: params.path,
488
+ headers: params.headers,
489
+ body: params.body,
490
+ opId: "createPortalLink",
491
+ expectedContentType: "application/json",
492
+ });
493
+ }
434
494
  /**
435
495
  * Create an empty portal page
436
- * Creates a new EMPTY sidebar page in the portal — a page node plus its sidebar menu item, with no Fusebase note and no block. The page is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending page, and publishes it. Pass parentId to nest the page under an existing published or active-draft folder. The returned pageId can immediately be passed to semantic block operations to add content before publishing. Use createPortalPageWithNote instead when a page backed by a new Fusebase note is wanted. Returns the page/menu-item ids, the page url, and the draft branch/seqs. Requires portals.write access.
496
+ * Creates a new EMPTY page in the portal — a page node plus its menu item, with no Fusebase note and no block. The page is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending page, and publishes it. Pass positionType ('sidebar' default, 'top' or 'footer') to choose the menu bar. Pass parentId to nest the page under an existing published or active-draft folder. The returned pageId can immediately be passed to semantic block operations to add content before publishing. Use createPortalPageWithNote instead when a page backed by a new Fusebase note is wanted. Returns the page/menu-item ids, the page url, and the draft branch/seqs. Requires portals.write access.
437
497
  */
438
498
  async createPortalPage(params) {
439
499
  return this.client.request({
@@ -448,7 +508,7 @@ class PortalsApi {
448
508
  }
449
509
  /**
450
510
  * Create a portal page backed by a Fusebase note
451
- * Creates a new sidebar page in the portal backed by a freshly created Fusebase note. The note is created in the portal's workspace and shared into the portal; optional initial text or html can be appended to it. The page (page node + note menu item + note content block) is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending page, and publishes it. Pass parentId to nest the page under an existing folder. Returns the note/page/menu-item ids, the page url, and the draft branch/seqs. Requires portals.write access.
511
+ * Creates a new sidebar page in the portal backed by a freshly created Fusebase note. The note is created in the portal's workspace and shared into the portal; optional initial text or html can be appended to it. The page (page node + note menu item + note content block) is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending page, and publishes it. Pass parentId to nest the page under an existing folder, or positionType ('sidebar' default, 'top', 'footer') to place a root page in a specific menu bar. Returns the note/page/menu-item ids, the page url, and the draft branch/seqs. Requires portals.write access.
452
512
  */
453
513
  async createPortalPageWithNote(params) {
454
514
  return this.client.request({
@@ -54,6 +54,48 @@ export interface CreatePortalFolderRequestContract {
54
54
  name: string;
55
55
  /** Optional icon key for the folder (default: "folder"). */
56
56
  icon?: string;
57
+ /**
58
+ * Menu bar to place the folder in: "sidebar" (default), "top" (topbar), or
59
+ * "footer".
60
+ */
61
+ positionType?: PortalContentPositionType;
62
+ }
63
+ export interface CreatePortalLinkRequestContract {
64
+ /**
65
+ * Display name of the link menu item.
66
+ * @maxLength 100
67
+ */
68
+ name: string;
69
+ /** Absolute http(s) URL the link opens (e.g. "https://example.com/contact"). */
70
+ url: string;
71
+ /**
72
+ * Menu bar to place the link in: "sidebar" (default), "top" (topbar), or
73
+ * "footer". Use "top" for a topbar nav (e.g. Chat / Case Studies / Contact).
74
+ * Ignored when `parentId` is set (the link inherits the parent's bar).
75
+ */
76
+ positionType?: PortalContentPositionType;
77
+ /** Optional icon key for the link (default: "custom_link"). */
78
+ icon?: string;
79
+ /** Whether the link opens in a new tab (default: true). */
80
+ openInNewTab?: boolean;
81
+ /**
82
+ * Optional id of an existing folder menu item to nest the link under.
83
+ * When omitted the link is added at the root of its menu bar.
84
+ */
85
+ parentId?: string;
86
+ }
87
+ export interface CreatePortalLinkResponseContract {
88
+ /** Id of the created link menu item. */
89
+ menuItemId: string;
90
+ /** Draft branch the change was staged on. */
91
+ branchId: string;
92
+ /** Sequence numbers assigned to the staged change events (addMenuItem). */
93
+ seqs: number[];
94
+ /**
95
+ * Always true: the link is staged in the portal's customizer draft, not yet
96
+ * live. The portal owner reviews and publishes it from the customizer.
97
+ */
98
+ staged: boolean;
57
99
  }
58
100
  export interface CreatePortalFolderResponseContract {
59
101
  /** Id of the created folder (the portalSection menu item). */
@@ -96,6 +138,11 @@ export interface CreatePortalPageRequestContract {
96
138
  * created at the portal root.
97
139
  */
98
140
  parentId?: string;
141
+ /**
142
+ * Menu bar to place the page in: "sidebar" (default), "top" (topbar), or
143
+ * "footer". Ignored when `parentId` is set (the page inherits the parent's bar).
144
+ */
145
+ positionType?: PortalContentPositionType;
99
146
  }
100
147
  export interface CreatePortalPageResponseContract {
101
148
  /** Id of the created sidebar menu item. */
@@ -131,6 +178,11 @@ export interface CreatePortalPageWithNoteRequestContract {
131
178
  content?: string;
132
179
  /** Content format used with `content`. Defaults to `text`. */
133
180
  format?: WorkspaceNoteContentFormatContract;
181
+ /**
182
+ * Menu bar to place the page in: "sidebar" (default), "top" (topbar), or
183
+ * "footer". Ignored when `parentId` is set (the page inherits the parent's bar).
184
+ */
185
+ positionType?: PortalContentPositionType;
134
186
  }
135
187
  export interface CreatePortalPageWithNoteResponseContract {
136
188
  /** Global id of the created Fusebase note backing the page. */
@@ -772,6 +824,165 @@ export interface AddPortalCountdownBlockResponseContract {
772
824
  /** Always true: the block is staged in the customizer draft, not yet live. */
773
825
  staged: boolean;
774
826
  }
827
+ export interface PortalBpmnDiagramContentContract {
828
+ /**
829
+ * Height in pixels of the BPMN canvas INSIDE the block — the Customizer's
830
+ * "Diagram height" field. This is not the block's Layout height.
831
+ * Default: 500.
832
+ * @minimum 150
833
+ * @maximum 5000
834
+ */
835
+ diagramHeight?: number;
836
+ }
837
+ /**
838
+ * Customizer Appearance section of a BPMN Diagram. Omitting `appearance` keeps
839
+ * the factory `blank` wrapper with the block title shown.
840
+ */
841
+ export type PortalBpmnDiagramAppearanceContract = {
842
+ backdrop: "none" | "blank";
843
+ } | {
844
+ backdrop: "custom";
845
+ background: PortalCardBackgroundContract;
846
+ /** Default: `s`. */
847
+ padding?: "none" | "s" | "m" | "l";
848
+ /** Default: true. */
849
+ showTitle?: boolean;
850
+ };
851
+ /** Customizer Layout section of a BPMN Diagram. */
852
+ export interface PortalBpmnDiagramLayoutContract {
853
+ /** Customizer Width. Default: 6. */
854
+ colspan?: 2 | 3 | 4 | 5 | 6;
855
+ /**
856
+ * Customizer Height: null = Auto; a manual value is at least 50px. Default: null.
857
+ * @minimum 50
858
+ */
859
+ height?: number | null;
860
+ }
861
+ export interface AddPortalBpmnDiagramBlockRequestContract {
862
+ /**
863
+ * Block title shown above the diagram. Plain text; only `{{ClientName}}` and
864
+ * `{{ClientLastName}}` are variables. Default: `BPMN Diagram`.
865
+ * @minLength 1
866
+ * @maxLength 100
867
+ */
868
+ title?: string;
869
+ content?: PortalBpmnDiagramContentContract;
870
+ /** Omitted keeps the canonical blank backdrop with the title shown. */
871
+ appearance?: PortalBpmnDiagramAppearanceContract;
872
+ /** Default: width 6 columns and automatic height. */
873
+ layout?: PortalBpmnDiagramLayoutContract;
874
+ }
875
+ export interface AddPortalBpmnDiagramBlockResponseContract {
876
+ /** Id of the created block. */
877
+ blockId: string;
878
+ /** Id of the page the block was added to. */
879
+ pageId: string;
880
+ /** Draft branch the change was staged on. */
881
+ branchId: string;
882
+ /** Sequence numbers assigned to the staged change events (addBlock). */
883
+ seqs: number[];
884
+ /** Always true: the block is staged in the customizer draft, not yet live. */
885
+ staged: boolean;
886
+ }
887
+ /**
888
+ * Customizer Appearance section of a Dynamic Table. Omitting `appearance` keeps
889
+ * the factory `blank` wrapper with the block title shown.
890
+ */
891
+ export type PortalDynamicTableAppearanceContract = {
892
+ backdrop: "none" | "blank";
893
+ } | {
894
+ backdrop: "custom";
895
+ background: PortalCardBackgroundContract;
896
+ /** Default: `s`. */
897
+ padding?: "none" | "s" | "m" | "l";
898
+ /** Default: true. */
899
+ showTitle?: boolean;
900
+ };
901
+ /** Customizer Layout section of a Dynamic Table. */
902
+ export interface PortalDynamicTableLayoutContract {
903
+ /** Customizer Width. Default: 6. */
904
+ colspan?: 2 | 3 | 4 | 5 | 6;
905
+ /**
906
+ * Customizer Height: null = Auto; a manual value is at least 50px. Default: null.
907
+ * @minimum 50
908
+ */
909
+ height?: number | null;
910
+ }
911
+ export interface AddPortalDynamicTableBlockRequestContract {
912
+ /**
913
+ * Block title shown above the table. Plain text; only `{{ClientName}}` and
914
+ * `{{ClientLastName}}` are variables. Default: `Dynamic Table`.
915
+ * @minLength 1
916
+ * @maxLength 100
917
+ */
918
+ title?: string;
919
+ /** Omitted keeps the canonical blank backdrop with the title shown. */
920
+ appearance?: PortalDynamicTableAppearanceContract;
921
+ /** Default: width 6 columns and automatic height. */
922
+ layout?: PortalDynamicTableLayoutContract;
923
+ }
924
+ export interface AddPortalDynamicTableBlockResponseContract {
925
+ /** Id of the created block. */
926
+ blockId: string;
927
+ /** Id of the page the block was added to. */
928
+ pageId: string;
929
+ /** Draft branch the change was staged on. */
930
+ branchId: string;
931
+ /** Sequence numbers assigned to the staged change events (addBlock). */
932
+ seqs: number[];
933
+ /** Always true: the block is staged in the customizer draft, not yet live. */
934
+ staged: boolean;
935
+ /**
936
+ * Always false: the block is the unconfigured shell the Customizer creates
937
+ * before a Data source is picked. The OAuth connection, provider source and
938
+ * table fields are still chosen in Portal Customizer.
939
+ */
940
+ configured: boolean;
941
+ }
942
+ /**
943
+ * Data scope of a Recent files block: the whole portal, or exactly one of its
944
+ * pages. `pageId` belongs to `portalPage` only.
945
+ */
946
+ export type PortalRecentFilesSourceContract = {
947
+ type: "entirePortal";
948
+ } | {
949
+ type: "portalPage";
950
+ pageId: string;
951
+ };
952
+ /** Customizer Layout section of a Recent files block. */
953
+ export interface PortalRecentFilesLayoutContract {
954
+ /** Customizer Width. Default: 3. */
955
+ colspan?: 3 | 4 | 5 | 6;
956
+ /**
957
+ * Customizer Height: null = Auto; a manual value is at least 50px. Default: null.
958
+ * @minimum 50
959
+ */
960
+ height?: number | null;
961
+ }
962
+ export interface AddPortalRecentFilesBlockRequestContract {
963
+ /**
964
+ * Block title shown above the file list. Plain text. Default: `Recent files`.
965
+ * @minLength 1
966
+ * @maxLength 100
967
+ */
968
+ title?: string;
969
+ /** Default: the entire portal. */
970
+ source?: PortalRecentFilesSourceContract;
971
+ /** Default: width 3 columns and automatic height. */
972
+ layout?: PortalRecentFilesLayoutContract;
973
+ }
974
+ export interface AddPortalRecentFilesBlockResponseContract {
975
+ /** Id of the created block. */
976
+ blockId: string;
977
+ /** Id of the page the block was added to. */
978
+ pageId: string;
979
+ /** Draft branch the change was staged on. */
980
+ branchId: string;
981
+ /** Sequence numbers assigned to the staged change events (addBlock). */
982
+ seqs: number[];
983
+ /** Always true: the block is staged in the customizer draft, not yet live. */
984
+ staged: boolean;
985
+ }
775
986
  /** One block a Linked block may point at. */
776
987
  export interface PortalLinkableBlockContract {
777
988
  /** Exact id to send as `source.blockId`. Never invent one. */
@@ -1656,7 +1867,7 @@ export interface ListPortalChatUsersResponseContract {
1656
1867
  * Any other value is rejected with 400 (the reducer throws on unknown types,
1657
1868
  * which would otherwise fail the whole draft at publish time).
1658
1869
  */
1659
- export type PortalBlockType = "note" | "content" | "docs" | "help" | "request" | "meetings" | "links" | "files-dashboard" | "tasks-dashboard" | "chats-dashboard" | "files-recent" | "flexible";
1870
+ export type PortalBlockType = "note" | "content" | "docs" | "help" | "request" | "meetings" | "links" | "files-dashboard" | "tasks-dashboard" | "chats-dashboard" | "flexible";
1660
1871
  export interface AddPortalBlockRequestContract {
1661
1872
  /** Id of the existing portal page node to add the block to. */
1662
1873
  pageId: string;
@@ -1731,6 +1942,11 @@ export interface AddPortalAppPageRequestContract {
1731
1942
  parentId?: string;
1732
1943
  /** Optional icon key for the menu item (default: "note"). */
1733
1944
  icon?: string;
1945
+ /**
1946
+ * Menu bar to place the page in: "sidebar" (default), "top" (topbar), or
1947
+ * "footer". Ignored when `parentId` is set (the page inherits the parent's bar).
1948
+ */
1949
+ positionType?: PortalContentPositionType;
1734
1950
  }
1735
1951
  export interface AddPortalAppPageResponseContract {
1736
1952
  /** Id of the created portal page node hosting the app embed. */
@@ -2076,6 +2292,20 @@ export declare const PortalCountdownAppearanceContract: {
2076
2292
  readonly Blank: "blank";
2077
2293
  readonly Custom: "custom";
2078
2294
  };
2295
+ export declare const PortalBpmnDiagramAppearanceContract: {
2296
+ readonly None: "none";
2297
+ readonly Blank: "blank";
2298
+ readonly Custom: "custom";
2299
+ };
2300
+ export declare const PortalDynamicTableAppearanceContract: {
2301
+ readonly None: "none";
2302
+ readonly Blank: "blank";
2303
+ readonly Custom: "custom";
2304
+ };
2305
+ export declare const PortalRecentFilesSourceContract: {
2306
+ readonly Entireportal: "entirePortal";
2307
+ readonly Portalpage: "portalPage";
2308
+ };
2079
2309
  export declare const PortalFormAppearanceContract: {
2080
2310
  readonly None: "none";
2081
2311
  readonly Blank: "blank";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PortalTimelineAppearanceContract = exports.PortalTimelineViewContract = exports.PortalCustomWidgetAppearanceContract = exports.PortalCustomWidgetBrickContract = exports.PortalCustomWidgetDestinationContract = exports.PortalInfoDestinationContract = exports.PortalInfoImageContract = exports.PortalCardGroupAppearanceContract = exports.PortalCardGroupImageContract = exports.PortalFormFieldWidthContract = exports.PortalFormFieldTypeContract = exports.PortalFormAppearanceContract = exports.PortalCountdownAppearanceContract = exports.PortalCardDestinationContract = exports.PortalCardAppearanceContract = exports.PortalCardViewContract = exports.PortalCardBackgroundContract = exports.PortalFlexibleTextAppearanceContract = exports.PortalTextBackgroundContract = exports.PortalDatabaseBlockAppearanceContract = exports.PortalBackgroundContract = exports.PortalDatabaseBlockTargetContract = void 0;
3
+ exports.PortalTimelineAppearanceContract = exports.PortalTimelineViewContract = exports.PortalCustomWidgetAppearanceContract = exports.PortalCustomWidgetBrickContract = exports.PortalCustomWidgetDestinationContract = exports.PortalInfoDestinationContract = exports.PortalInfoImageContract = exports.PortalCardGroupAppearanceContract = exports.PortalCardGroupImageContract = exports.PortalFormFieldWidthContract = exports.PortalFormFieldTypeContract = exports.PortalFormAppearanceContract = exports.PortalRecentFilesSourceContract = exports.PortalDynamicTableAppearanceContract = exports.PortalBpmnDiagramAppearanceContract = exports.PortalCountdownAppearanceContract = exports.PortalCardDestinationContract = exports.PortalCardAppearanceContract = exports.PortalCardViewContract = exports.PortalCardBackgroundContract = exports.PortalFlexibleTextAppearanceContract = exports.PortalTextBackgroundContract = exports.PortalDatabaseBlockAppearanceContract = exports.PortalBackgroundContract = exports.PortalDatabaseBlockTargetContract = void 0;
4
4
  exports.PortalDatabaseBlockTargetContract = {
5
5
  Database: "database"
6
6
  };
@@ -42,6 +42,20 @@ exports.PortalCountdownAppearanceContract = {
42
42
  Blank: "blank",
43
43
  Custom: "custom"
44
44
  };
45
+ exports.PortalBpmnDiagramAppearanceContract = {
46
+ None: "none",
47
+ Blank: "blank",
48
+ Custom: "custom"
49
+ };
50
+ exports.PortalDynamicTableAppearanceContract = {
51
+ None: "none",
52
+ Blank: "blank",
53
+ Custom: "custom"
54
+ };
55
+ exports.PortalRecentFilesSourceContract = {
56
+ Entireportal: "entirePortal",
57
+ Portalpage: "portalPage"
58
+ };
45
59
  exports.PortalFormAppearanceContract = {
46
60
  None: "none",
47
61
  Blank: "blank",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusebase/fusebase-gate-sdk",
3
- "version": "2.5.1-sdk.2",
3
+ "version": "2.5.4",
4
4
  "description": "TypeScript SDK for Fusebase Gate APIs - Generated from contract introspection",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -1,8 +1,8 @@
1
- # Release Notes 2.5.1-sdk.2
1
+ # Release Notes 2.5.1-sdk.3
2
2
 
3
3
  - Current ref: `HEAD`
4
4
  - Previous tag: `v2.5.1-sdk.2`
5
- - Generated at: 2026-08-03T11:23:10.295Z
5
+ - Generated at: 2026-08-03T11:21:58.855Z
6
6
 
7
7
  ## Included Drafts
8
8
 
@@ -0,0 +1,9 @@
1
+ # Release Notes 2.5.4
2
+
3
+ - Current ref: `HEAD`
4
+ - Previous tag: `v2.5.4`
5
+ - Generated at: 2026-08-05T12:30:28.686Z
6
+
7
+ ## Included Drafts
8
+
9
+ - None
@@ -1,8 +1,8 @@
1
- # Release Notes 2.5.1-sdk.2
1
+ # Release Notes 2.5.4
2
2
 
3
3
  - Current ref: `HEAD`
4
- - Previous tag: `v2.5.1-sdk.2`
5
- - Generated at: 2026-08-03T11:23:10.295Z
4
+ - Previous tag: `v2.5.4`
5
+ - Generated at: 2026-08-05T12:30:28.686Z
6
6
 
7
7
  ## Included Drafts
8
8