@fusebase/fusebase-gate-sdk 2.11.2 → 2.11.5

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, AddPortalBpmnDiagramBlockRequestContract, AddPortalBpmnDiagramBlockResponseContract, AddPortalCardBlockRequestContract, AddPortalCardBlockResponseContract, AddPortalCardGroupBlockRequestContract, AddPortalCardGroupBlockResponseContract, AddPortalCarouselBlockRequestContract, AddPortalCarouselBlockResponseContract, AddPortalChatBlockRequestContract, AddPortalChatBlockResponseContract, AddPortalChatsDashboardMenuItemRequestContract, AddPortalChatsDashboardMenuItemResponseContract, AddPortalCountdownBlockRequestContract, AddPortalCountdownBlockResponseContract, AddPortalCustomWidgetBlockRequestContract, AddPortalCustomWidgetBlockResponseContract, AddPortalDatabaseBlockRequestContract, AddPortalDatabaseBlockResponseContract, AddPortalDynamicTableBlockRequestContract, AddPortalDynamicTableBlockResponseContract, AddPortalEmbedBlockRequestContract, AddPortalEmbedBlockResponseContract, AddPortalFilesDashboardMenuItemRequestContract, AddPortalFilesDashboardMenuItemResponseContract, AddPortalFileUploaderBlockRequestContract, AddPortalFileUploaderBlockResponseContract, AddPortalFormBlockRequestContract, AddPortalFormBlockResponseContract, AddPortalHeadingBlockRequestContract, AddPortalHtmlCssBlockRequestContract, AddPortalHtmlCssBlockResponseContract, AddPortalImageBlockRequestContract, AddPortalInfoBlockRequestContract, AddPortalInfoBlockResponseContract, AddPortalInternalSpacePageRequestContract, AddPortalInternalSpacePageResponseContract, AddPortalKanbanBlockRequestContract, AddPortalKanbanBlockResponseContract, AddPortalLinkedBlockRequestContract, AddPortalLinkedBlockResponseContract, AddPortalNoteBlockRequestContract, AddPortalNoteBlockResponseContract, AddPortalRecentFilesBlockRequestContract, AddPortalRecentFilesBlockResponseContract, AddPortalTaskListBlockRequestContract, AddPortalTaskListBlockResponseContract, AddPortalTasksDashboardMenuItemRequestContract, AddPortalTasksDashboardMenuItemResponseContract, AddPortalTextBlockRequestContract, AddPortalTimelineBlockRequestContract, AddPortalTimelineBlockResponseContract, BulkInviteToPortalRequestContract, BulkInviteToPortalResponseContract, CreatePortalFolderRequestContract, CreatePortalFolderResponseContract, CreatePortalLinkRequestContract, CreatePortalLinkResponseContract, CreatePortalPageRequestContract, CreatePortalPageResponseContract, CreatePortalPageWithNoteRequestContract, CreatePortalPageWithNoteResponseContract, CreatePortalRequestContract, CreatePortalResponseContract, DeletePortalItemResponseContract, DuplicatePortalItemRequestContract, DuplicatePortalItemResponseContract, DuplicatePortalRequestContract, GetPortalBlockResponseContract, GetPortalPageBlockCountResponseContract, globalIdInPathRequired, InvitePortalManagerRequestContract, InvitePortalManagerResponseContract, InviteToPortalRequestContract, InviteToPortalResponseContract, ListPortalAiAgentsResponseContract, ListPortalChatChannelsResponseContract, ListPortalChatUsersResponseContract, ListPortalContentResponseContract, ListPortalDatabaseBlockSourcesResponseContract, ListPortalLinkableBlocksResponseContract, ListPortalPageBlocksResponseContract, MovePortalBlockRequestContract, orgIdInPathRequired, OrgPortalListResponseContract, PortalDetailContract, PortalStyleContractResponseContract, PortalTextAndMediaBlockResponseContract, PublishPortalDraftResponseContract, SearchPortalInfoBlockIconsResponseContract, SetDashboardViewReadonlyRequestContract, SetDashboardViewReadonlyResponseContract, StagedPortalBlockResponseContract, UpdatePortalAccessRequestContract, UpdatePortalAccessResponseContract, UpdatePortalAiAgentBlockRequestContract, UpdatePortalAppBlockRequestContract, UpdatePortalBpmnDiagramBlockRequestContract, UpdatePortalCardBlockRequestContract, UpdatePortalCardGroupBlockRequestContract, UpdatePortalCarouselBlockRequestContract, UpdatePortalChatBlockRequestContract, UpdatePortalContentPermissionsRequestContract, UpdatePortalContentPermissionsResponseContract, UpdatePortalCountdownBlockRequestContract, UpdatePortalCustomCodeRequestContract, UpdatePortalCustomCodeResponseContract, UpdatePortalCustomWidgetBlockRequestContract, UpdatePortalDatabaseBlockRequestContract, UpdatePortalDynamicTableBlockRequestContract, UpdatePortalEmbedBlockRequestContract, UpdatePortalFileUploaderBlockRequestContract, UpdatePortalFormBlockRequestContract, UpdatePortalHomepageRequestContract, UpdatePortalHomepageResponseContract, UpdatePortalHtmlCssBlockRequestContract, UpdatePortalImageBlockRequestContract, UpdatePortalInfoBlockRequestContract, UpdatePortalItemRequestContract, UpdatePortalItemResponseContract, UpdatePortalLinkedBlockRequestContract, UpdatePortalNoteBlockRequestContract, UpdatePortalRecentFilesBlockRequestContract, UpdatePortalStyleRequestContract, UpdatePortalStyleResponseContract, UpdatePortalTextBlockRequestContract, UpdatePortalTimelineBlockRequestContract } from "../types";
8
+ import type { AddPortalAiAgentBlockRequestContract, AddPortalAiAgentBlockResponseContract, AddPortalAppBlockRequestContract, AddPortalAppBlockResponseContract, AddPortalAppPageRequestContract, AddPortalAppPageResponseContract, AddPortalBlankNoteBlockRequestContract, AddPortalBlankNoteBlockResponseContract, AddPortalBpmnDiagramBlockRequestContract, AddPortalBpmnDiagramBlockResponseContract, AddPortalCardBlockRequestContract, AddPortalCardBlockResponseContract, AddPortalCardGroupBlockRequestContract, AddPortalCardGroupBlockResponseContract, AddPortalCarouselBlockRequestContract, AddPortalCarouselBlockResponseContract, AddPortalChatBlockRequestContract, AddPortalChatBlockResponseContract, AddPortalChatsDashboardMenuItemRequestContract, AddPortalChatsDashboardMenuItemResponseContract, AddPortalCountdownBlockRequestContract, AddPortalCountdownBlockResponseContract, AddPortalCustomWidgetBlockRequestContract, AddPortalCustomWidgetBlockResponseContract, AddPortalDatabaseBlockRequestContract, AddPortalDatabaseBlockResponseContract, AddPortalDynamicTableBlockRequestContract, AddPortalDynamicTableBlockResponseContract, AddPortalEmbedBlockRequestContract, AddPortalEmbedBlockResponseContract, AddPortalFilesDashboardMenuItemRequestContract, AddPortalFilesDashboardMenuItemResponseContract, AddPortalFileUploaderBlockRequestContract, AddPortalFileUploaderBlockResponseContract, AddPortalFormBlockRequestContract, AddPortalFormBlockResponseContract, AddPortalHeadingBlockRequestContract, AddPortalHtmlCssBlockRequestContract, AddPortalHtmlCssBlockResponseContract, AddPortalImageBlockRequestContract, AddPortalInfoBlockRequestContract, AddPortalInfoBlockResponseContract, AddPortalInternalSpacePageRequestContract, AddPortalInternalSpacePageResponseContract, AddPortalKanbanBlockRequestContract, AddPortalKanbanBlockResponseContract, AddPortalLinkedBlockRequestContract, AddPortalLinkedBlockResponseContract, AddPortalNoteBlockRequestContract, AddPortalNoteBlockResponseContract, AddPortalRecentFilesBlockRequestContract, AddPortalRecentFilesBlockResponseContract, AddPortalTaskListBlockRequestContract, AddPortalTaskListBlockResponseContract, AddPortalTasksDashboardMenuItemRequestContract, AddPortalTasksDashboardMenuItemResponseContract, AddPortalTextBlockRequestContract, AddPortalTimelineBlockRequestContract, AddPortalTimelineBlockResponseContract, BulkInviteToPortalRequestContract, BulkInviteToPortalResponseContract, CreatePortalFolderRequestContract, CreatePortalFolderResponseContract, CreatePortalLinkRequestContract, CreatePortalLinkResponseContract, CreatePortalPageRequestContract, CreatePortalPageResponseContract, CreatePortalPageWithNoteRequestContract, CreatePortalPageWithNoteResponseContract, CreatePortalRequestContract, CreatePortalResponseContract, DeletePortalItemResponseContract, DuplicatePortalItemRequestContract, DuplicatePortalItemResponseContract, DuplicatePortalRequestContract, GetPortalBlockResponseContract, GetPortalPageBlockCountResponseContract, globalIdInPathRequired, InvitePortalManagerRequestContract, InvitePortalManagerResponseContract, InviteToPortalRequestContract, InviteToPortalResponseContract, ListPortalAiAgentsResponseContract, ListPortalChatChannelsResponseContract, ListPortalChatUsersResponseContract, ListPortalContentResponseContract, ListPortalDatabaseBlockSourcesResponseContract, ListPortalLinkableBlocksResponseContract, ListPortalPageBlocksResponseContract, MovePortalBlockRequestContract, orgIdInPathRequired, OrgPortalListResponseContract, PortalDetailContract, PortalStyleContractResponseContract, PortalTextAndMediaBlockResponseContract, PublishPortalDraftResponseContract, SearchPortalInfoBlockIconsResponseContract, SetDashboardViewReadonlyRequestContract, SetDashboardViewReadonlyResponseContract, StagedPortalBlockResponseContract, UpdatePortalAccessRequestContract, UpdatePortalAccessResponseContract, UpdatePortalAiAgentBlockRequestContract, UpdatePortalAppBlockRequestContract, UpdatePortalBpmnDiagramBlockRequestContract, UpdatePortalCardBlockRequestContract, UpdatePortalCardGroupBlockRequestContract, UpdatePortalCarouselBlockRequestContract, UpdatePortalChatBlockRequestContract, UpdatePortalContentPermissionsRequestContract, UpdatePortalContentPermissionsResponseContract, UpdatePortalCountdownBlockRequestContract, UpdatePortalCustomCodeRequestContract, UpdatePortalCustomCodeResponseContract, UpdatePortalCustomWidgetBlockRequestContract, UpdatePortalDatabaseBlockRequestContract, UpdatePortalDynamicTableBlockRequestContract, UpdatePortalEmbedBlockRequestContract, UpdatePortalFileUploaderBlockRequestContract, UpdatePortalFormBlockRequestContract, UpdatePortalHeaderRequestContract, UpdatePortalHeaderResponseContract, UpdatePortalHomepageRequestContract, UpdatePortalHomepageResponseContract, UpdatePortalHtmlCssBlockRequestContract, UpdatePortalImageBlockRequestContract, UpdatePortalInfoBlockRequestContract, UpdatePortalItemRequestContract, UpdatePortalItemResponseContract, UpdatePortalLinkedBlockRequestContract, UpdatePortalNoteBlockRequestContract, UpdatePortalRecentFilesBlockRequestContract, UpdatePortalStyleRequestContract, UpdatePortalStyleResponseContract, UpdatePortalTextBlockRequestContract, UpdatePortalTimelineBlockRequestContract } from "../types";
9
9
  export declare class PortalsApi {
10
10
  private client;
11
11
  constructor(client: Client);
@@ -332,12 +332,13 @@ export declare class PortalsApi {
332
332
  }): Promise<AddPortalLinkedBlockResponseContract>;
333
333
  /**
334
334
  * Add an existing Fusebase note as a block to a portal page
335
- * Embeds an existing Fusebase note as a content block on an existing portal page (no new page or sidebar item is created). The note must already exist in the portal's workspace and be shared into the portal (e.g. created via createPortalPageWithNote). Pass pageId (the target page node id, obtained from listPortalContent) and noteId. The block is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending block, and publishes it. Returns the created block id and the draft branch/seqs. Requires portals.write access.
335
+ * Embeds an existing Fusebase note as a content block on an existing portal page (no new page or sidebar item is created). The note must already exist in the portal's workspace and be shared into the portal (e.g. created via createPortalPageWithNote). pageId is the target page node id, obtained from listPortalContent. Optional title sets the block header (default: the page's current title); renaming the note's sidebar item afterwards overwrites it. The block is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending block, and publishes it. Returns the created block id and the draft branch/seqs. Requires portals.write access.
336
336
  */
337
337
  addPortalNoteBlock(params: {
338
338
  path: {
339
339
  orgId: orgIdInPathRequired;
340
340
  portalId: globalIdInPathRequired;
341
+ pageId: globalIdInPathRequired;
341
342
  };
342
343
  headers?: Record<string, string>;
343
344
  body: AddPortalNoteBlockRequestContract;
@@ -455,7 +456,7 @@ export declare class PortalsApi {
455
456
  }): Promise<CreatePortalLinkResponseContract>;
456
457
  /**
457
458
  * Create an empty portal page
458
- * 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.
459
+ * 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. Pass slug to choose the page URL explicitly (e.g. slug 'pricing' → '/pricing'); omit it and the slug is derived from the title, which needs the explicit slug for titles in scripts that do not transliterate (Japanese, Chinese, Arabic, …). 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.
459
460
  */
460
461
  createPortalPage(params: {
461
462
  path: {
@@ -467,7 +468,7 @@ export declare class PortalsApi {
467
468
  }): Promise<CreatePortalPageResponseContract>;
468
469
  /**
469
470
  * Create a portal page backed by a Fusebase note
470
- * 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.
471
+ * 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. Pass slug to choose the page URL explicitly (e.g. slug 'pricing' → '/pricing'); omit it and the slug is derived from the title, which needs the explicit slug for titles in scripts that do not transliterate (Japanese, Chinese, Arabic, …). Returns the note/page/menu-item ids, the page url, and the draft branch/seqs. Requires portals.write access.
471
472
  */
472
473
  createPortalPageWithNote(params: {
473
474
  path: {
@@ -529,12 +530,12 @@ export declare class PortalsApi {
529
530
  }): Promise<DuplicatePortalItemResponseContract>;
530
531
  /**
531
532
  * Get portal details
532
- * Returns detailed information for a single portal by ID. Requires portals.read access.
533
+ * Returns detailed information for a single portal by ID, including the name given to createPortal. Requires portals.read access.
533
534
  */
534
535
  getPortal(params: {
535
536
  path: {
536
537
  orgId: orgIdInPathRequired;
537
- globalId: globalIdInPathRequired;
538
+ portalId: globalIdInPathRequired;
538
539
  };
539
540
  headers?: Record<string, string>;
540
541
  }): Promise<PortalDetailContract>;
@@ -987,6 +988,18 @@ export declare class PortalsApi {
987
988
  headers?: Record<string, string>;
988
989
  body: UpdatePortalFormBlockRequestContract;
989
990
  }): Promise<StagedPortalBlockResponseContract>;
991
+ /**
992
+ * Update portal header and homepage hero
993
+ * Sets the portal's header bar (background image, sticky, search button) and the greeting and search box on the homepage hero. Only the provided fields change; omitted fields keep their current value; backgroundImage: null drops the override and falls back to the theme's own. The background is an uploaded image or the theme's color — arbitrary hex colors and gradients are not part of the portal theme model; use updatePortalCustomCode for those. The background image shows on the homepage under every theme, but only light_purple, space_gray, light_orange and light_blue keep it on the inner pages; the other nine themes replace it there with a flat color. The greeting and hero search render only while the block-based hero is off; once the owner turns it on, the header hero area shows blocks instead. The change is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending change and publishes it. Returns the draft branch and the seqs of the staged events. Requires portals.write access.
994
+ */
995
+ updatePortalHeader(params: {
996
+ path: {
997
+ orgId: orgIdInPathRequired;
998
+ portalId: globalIdInPathRequired;
999
+ };
1000
+ headers?: Record<string, string>;
1001
+ body: UpdatePortalHeaderRequestContract;
1002
+ }): Promise<UpdatePortalHeaderResponseContract>;
990
1003
  /**
991
1004
  * Update a portal Heading block
992
1005
  * Edits ONE existing Text & Media Heading block and STAGES the change in the active customizer draft; nothing is published. Editable: `content` (text, colour, size, styles, alignment), `appearance` and `layout`. The block's wrapper title, HTML, CSS, image url and raw bricks are not accepted. This is a PATCH: an omitted field keeps its current value, and at least one field must be sent. `content` is a field-level patch — a size, style or alignment left out keeps what the block has today. `appearance` is NOT: it is a discriminated variant and must be sent complete, so read the current one with getPortalBlock first; under backdrop `custom` an omitted `background` keeps the block's current one, which is what getPortalBlock reports for a block still on the portal theme's surface colour. `layout.colspan` is 2 to 6 and `layout.height` is at least 50, or null for the automatic height. Rejected with 400: an empty patch, a block of another kind, and a patch the block already satisfies — the message names which. Requires portals.write access.
@@ -1112,7 +1125,7 @@ export declare class PortalsApi {
1112
1125
  }): Promise<StagedPortalBlockResponseContract>;
1113
1126
  /**
1114
1127
  * Update portal branding
1115
- * Sets the portal's branding, the same fields the customizer's Portal style panel writes: the color theme, the header logo and the favicon. Only the provided fields change; omitted fields keep their current value. Colors come from the named themes — arbitrary hex colors and web fonts are not part of the portal theme model; use updatePortalCustomCode for those. The change is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending change and publishes it. Returns the draft branch and the seq of the staged event. Requires portals.write access.
1128
+ * Sets the portal's branding: the color theme, the semantic color roles (primary, background, surface, text, accent), the web font, the header logo and the favicon. Only the provided fields change; omitted fields keep their current value. Color roles take Tailwind palette tokens such as `indigo-600` — the same tokens the customizer's own color pickers write, and the only values the portal can paint; hex is rejected. `font` is delivered through the portal's custom code as one marked style block that updatePortalCustomCode preserves; the block imports the family from Google Fonts, so every portal visitor's browser makes a request to fonts.googleapis.com. The change is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending change and publishes it. A body touching both the theme and the font stages two events; `seq` is the first of them. Requires portals.write access.
1116
1129
  */
1117
1130
  updatePortalStyle(params: {
1118
1131
  path: {
@@ -388,12 +388,12 @@ class PortalsApi {
388
388
  }
389
389
  /**
390
390
  * Add an existing Fusebase note as a block to a portal page
391
- * Embeds an existing Fusebase note as a content block on an existing portal page (no new page or sidebar item is created). The note must already exist in the portal's workspace and be shared into the portal (e.g. created via createPortalPageWithNote). Pass pageId (the target page node id, obtained from listPortalContent) and noteId. The block is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending block, and publishes it. Returns the created block id and the draft branch/seqs. Requires portals.write access.
391
+ * Embeds an existing Fusebase note as a content block on an existing portal page (no new page or sidebar item is created). The note must already exist in the portal's workspace and be shared into the portal (e.g. created via createPortalPageWithNote). pageId is the target page node id, obtained from listPortalContent. Optional title sets the block header (default: the page's current title); renaming the note's sidebar item afterwards overwrites it. The block is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending block, and publishes it. Returns the created block id and the draft branch/seqs. Requires portals.write access.
392
392
  */
393
393
  async addPortalNoteBlock(params) {
394
394
  return this.client.request({
395
395
  method: "POST",
396
- path: "/:orgId/portals/:portalId/blocks/note",
396
+ path: "/:orgId/portals/:portalId/pages/:pageId/blocks/note",
397
397
  pathParams: params.path,
398
398
  headers: params.headers,
399
399
  body: params.body,
@@ -538,7 +538,7 @@ class PortalsApi {
538
538
  }
539
539
  /**
540
540
  * Create an empty portal page
541
- * 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.
541
+ * 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. Pass slug to choose the page URL explicitly (e.g. slug 'pricing' → '/pricing'); omit it and the slug is derived from the title, which needs the explicit slug for titles in scripts that do not transliterate (Japanese, Chinese, Arabic, …). 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.
542
542
  */
543
543
  async createPortalPage(params) {
544
544
  return this.client.request({
@@ -553,7 +553,7 @@ class PortalsApi {
553
553
  }
554
554
  /**
555
555
  * Create a portal page backed by a Fusebase note
556
- * 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.
556
+ * 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. Pass slug to choose the page URL explicitly (e.g. slug 'pricing' → '/pricing'); omit it and the slug is derived from the title, which needs the explicit slug for titles in scripts that do not transliterate (Japanese, Chinese, Arabic, …). Returns the note/page/menu-item ids, the page url, and the draft branch/seqs. Requires portals.write access.
557
557
  */
558
558
  async createPortalPageWithNote(params) {
559
559
  return this.client.request({
@@ -626,12 +626,12 @@ class PortalsApi {
626
626
  }
627
627
  /**
628
628
  * Get portal details
629
- * Returns detailed information for a single portal by ID. Requires portals.read access.
629
+ * Returns detailed information for a single portal by ID, including the name given to createPortal. Requires portals.read access.
630
630
  */
631
631
  async getPortal(params) {
632
632
  return this.client.request({
633
633
  method: "GET",
634
- path: "/:orgId/portals/:globalId",
634
+ path: "/:orgId/portals/:portalId",
635
635
  pathParams: params.path,
636
636
  headers: params.headers,
637
637
  opId: "getPortal",
@@ -1139,6 +1139,21 @@ class PortalsApi {
1139
1139
  expectedContentType: "application/json",
1140
1140
  });
1141
1141
  }
1142
+ /**
1143
+ * Update portal header and homepage hero
1144
+ * Sets the portal's header bar (background image, sticky, search button) and the greeting and search box on the homepage hero. Only the provided fields change; omitted fields keep their current value; backgroundImage: null drops the override and falls back to the theme's own. The background is an uploaded image or the theme's color — arbitrary hex colors and gradients are not part of the portal theme model; use updatePortalCustomCode for those. The background image shows on the homepage under every theme, but only light_purple, space_gray, light_orange and light_blue keep it on the inner pages; the other nine themes replace it there with a flat color. The greeting and hero search render only while the block-based hero is off; once the owner turns it on, the header hero area shows blocks instead. The change is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending change and publishes it. Returns the draft branch and the seqs of the staged events. Requires portals.write access.
1145
+ */
1146
+ async updatePortalHeader(params) {
1147
+ return this.client.request({
1148
+ method: "POST",
1149
+ path: "/:orgId/portals/:portalId/header",
1150
+ pathParams: params.path,
1151
+ headers: params.headers,
1152
+ body: params.body,
1153
+ opId: "updatePortalHeader",
1154
+ expectedContentType: "application/json",
1155
+ });
1156
+ }
1142
1157
  /**
1143
1158
  * Update a portal Heading block
1144
1159
  * Edits ONE existing Text & Media Heading block and STAGES the change in the active customizer draft; nothing is published. Editable: `content` (text, colour, size, styles, alignment), `appearance` and `layout`. The block's wrapper title, HTML, CSS, image url and raw bricks are not accepted. This is a PATCH: an omitted field keeps its current value, and at least one field must be sent. `content` is a field-level patch — a size, style or alignment left out keeps what the block has today. `appearance` is NOT: it is a discriminated variant and must be sent complete, so read the current one with getPortalBlock first; under backdrop `custom` an omitted `background` keeps the block's current one, which is what getPortalBlock reports for a block still on the portal theme's surface colour. `layout.colspan` is 2 to 6 and `layout.height` is at least 50, or null for the automatic height. Rejected with 400: an empty patch, a block of another kind, and a patch the block already satisfies — the message names which. Requires portals.write access.
@@ -1276,7 +1291,7 @@ class PortalsApi {
1276
1291
  }
1277
1292
  /**
1278
1293
  * Update portal branding
1279
- * Sets the portal's branding, the same fields the customizer's Portal style panel writes: the color theme, the header logo and the favicon. Only the provided fields change; omitted fields keep their current value. Colors come from the named themes — arbitrary hex colors and web fonts are not part of the portal theme model; use updatePortalCustomCode for those. The change is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending change and publishes it. Returns the draft branch and the seq of the staged event. Requires portals.write access.
1294
+ * Sets the portal's branding: the color theme, the semantic color roles (primary, background, surface, text, accent), the web font, the header logo and the favicon. Only the provided fields change; omitted fields keep their current value. Color roles take Tailwind palette tokens such as `indigo-600` — the same tokens the customizer's own color pickers write, and the only values the portal can paint; hex is rejected. `font` is delivered through the portal's custom code as one marked style block that updatePortalCustomCode preserves; the block imports the family from Google Fonts, so every portal visitor's browser makes a request to fonts.googleapis.com. The change is staged in the portal's customizer draft (not published immediately): the portal owner opens the customizer, reviews the pending change and publishes it. A body touching both the theme and the font stages two events; `seq` is the first of them. Requires portals.write access.
1280
1295
  */
1281
1296
  async updatePortalStyle(params) {
1282
1297
  return this.client.request({
@@ -143,6 +143,15 @@ export interface CreatePortalPageRequestContract {
143
143
  * "footer". Ignored when `parentId` is set (the page inherits the parent's bar).
144
144
  */
145
145
  positionType?: PortalContentPositionType;
146
+ /**
147
+ * Explicit URL slug for the page, e.g. `pricing` for `/pricing`. Normalized to
148
+ * lowercase latin letters, digits and hyphens; a `-N` suffix is still appended
149
+ * when the slug is already taken. Omit it to derive the slug from the title —
150
+ * pass it when the title is in a script that does not transliterate (Japanese,
151
+ * Chinese, Arabic, …) and would otherwise fall back to `/page`.
152
+ * @maxLength 90
153
+ */
154
+ slug?: string;
146
155
  }
147
156
  export interface CreatePortalPageResponseContract {
148
157
  /** Id of the created sidebar menu item. */
@@ -271,6 +280,15 @@ export interface CreatePortalPageWithNoteRequestContract {
271
280
  * "footer". Ignored when `parentId` is set (the page inherits the parent's bar).
272
281
  */
273
282
  positionType?: PortalContentPositionType;
283
+ /**
284
+ * Explicit URL slug for the page, e.g. `pricing` for `/pricing`. Normalized to
285
+ * lowercase latin letters, digits and hyphens; a `-N` suffix is still appended
286
+ * when the slug is already taken. Omit it to derive the slug from the title —
287
+ * pass it when the title is in a script that does not transliterate (Japanese,
288
+ * Chinese, Arabic, …) and would otherwise fall back to `/page`.
289
+ * @maxLength 90
290
+ */
291
+ slug?: string;
274
292
  }
275
293
  export interface CreatePortalPageWithNoteResponseContract {
276
294
  /** Global id of the created Fusebase note backing the page. */
@@ -345,11 +363,12 @@ export interface AddPortalInternalSpacePageResponseContract {
345
363
  staged: boolean;
346
364
  }
347
365
  export interface AddPortalNoteBlockRequestContract {
348
- /** Id of the existing portal page node to add the note block to. */
349
- pageId: string;
350
366
  /** Global id of the existing Fusebase note to embed as a block. */
351
367
  noteId: string;
352
- /** Optional block title (defaults to the page's current title). */
368
+ /**
369
+ * Block header text (defaults to the target page's current title). Renaming
370
+ * the note's sidebar item later overwrites it.
371
+ */
353
372
  title?: string;
354
373
  }
355
374
  export interface AddPortalBlankNoteBlockRequestContract {
@@ -2907,6 +2926,11 @@ export interface DuplicatePortalItemResponseContract {
2907
2926
  }
2908
2927
  export interface PortalDetailContract {
2909
2928
  id: string;
2929
+ /**
2930
+ * Portal name as given to createPortal. Omitted when portal-service does not
2931
+ * return settings for the portal.
2932
+ */
2933
+ name?: string;
2910
2934
  orgId: string;
2911
2935
  workspaceId: string;
2912
2936
  domain: string;
@@ -2923,6 +2947,71 @@ export interface PortalDetailContract {
2923
2947
  * portal-service does not return theme settings for the portal.
2924
2948
  */
2925
2949
  style?: PortalStyleContract;
2950
+ /**
2951
+ * Published header and homepage-hero settings, the read analogue of
2952
+ * updatePortalHeader. Omitted when portal-service does not return settings for
2953
+ * the portal.
2954
+ */
2955
+ header?: PortalHeaderContract;
2956
+ }
2957
+ /** Published header and homepage-hero settings of a portal. */
2958
+ export interface PortalHeaderContract {
2959
+ /**
2960
+ * URL of the header background image, when the portal overrides its theme's
2961
+ * own. Absent when the theme's default image (or plain header color) is used.
2962
+ */
2963
+ backgroundImageUrl?: string;
2964
+ /** Header stays pinned to the top while the visitor scrolls. */
2965
+ sticky?: boolean;
2966
+ /** The search button is shown in the header bar. */
2967
+ showSearchButton?: boolean;
2968
+ /**
2969
+ * Greeting shown on the homepage hero. portal-service substitutes a random
2970
+ * welcome message when the portal never had one set, so a value here is not
2971
+ * proof that one was stored.
2972
+ */
2973
+ greeting?: string;
2974
+ /** The greeting is shown on the homepage hero. */
2975
+ showGreeting?: boolean;
2976
+ /** The large search box is shown on the homepage hero. */
2977
+ showHeroSearch?: boolean;
2978
+ }
2979
+ export interface UpdatePortalHeaderRequestContract {
2980
+ /**
2981
+ * Background image for the portal header. Pass null to drop the override and
2982
+ * fall back to the image (or plain color) the portal's theme defines. Shows on
2983
+ * the homepage under every theme; only light_purple, space_gray, light_orange
2984
+ * and light_blue keep it on the inner pages — the other nine themes replace it
2985
+ * there with a flat color.
2986
+ */
2987
+ backgroundImage?: PortalStyleImageContract | null;
2988
+ /** Pin the header to the top of the viewport while the visitor scrolls. */
2989
+ sticky?: boolean;
2990
+ /** Show the search button in the header bar. */
2991
+ showSearchButton?: boolean;
2992
+ /**
2993
+ * Greeting shown on the homepage hero (portal-service `greetingMessage`).
2994
+ * Pass an empty string to clear it.
2995
+ */
2996
+ greeting?: string;
2997
+ /** Show the greeting on the homepage hero (`greetingEnabled`). */
2998
+ showGreeting?: boolean;
2999
+ /** Show the large search box on the homepage hero (`searchEnabled`). */
3000
+ showHeroSearch?: boolean;
3001
+ }
3002
+ export interface UpdatePortalHeaderResponseContract {
3003
+ /** Draft branch the change was staged on. */
3004
+ branchId: string;
3005
+ /**
3006
+ * Sequence numbers assigned to the staged change events — one per affected
3007
+ * area (header theme, homepage hero), staged together. At most two.
3008
+ */
3009
+ seqs: number[];
3010
+ /**
3011
+ * Always true: the change is staged in the portal's customizer draft, not yet
3012
+ * live. The portal owner reviews and publishes it from the customizer.
3013
+ */
3014
+ staged: boolean;
2926
3015
  }
2927
3016
  /** Published branding of a portal, as stored in its theme. */
2928
3017
  export interface PortalStyleContract {
@@ -2938,6 +3027,13 @@ export interface PortalStyleContract {
2938
3027
  logoUrl?: string;
2939
3028
  /** Favicon image URL, used as the portal's browser tab icon. */
2940
3029
  faviconUrl?: string;
3030
+ /**
3031
+ * Semantic color roles overridden on top of the theme. Only roles the portal
3032
+ * actually overrides appear; the rest come from the named theme.
3033
+ */
3034
+ colors?: PortalStyleColorsContract;
3035
+ /** Web font family applied to the portal, when one was set. */
3036
+ fontFamily?: string;
2941
3037
  }
2942
3038
  /**
2943
3039
  * The portal styling contract: the stable hooks custom CSS may target. Mirrors
@@ -2970,11 +3066,81 @@ export interface PortalStyleContractResponseContract {
2970
3066
  export interface UpdatePortalStyleRequestContract {
2971
3067
  /** Color theme to apply, the same picker the customizer's Theme screen shows. */
2972
3068
  theme?: PortalThemeKey;
3069
+ /**
3070
+ * Semantic color roles, applied on top of the theme. Sent together with
3071
+ * `theme`, they override the theme's own slots.
3072
+ */
3073
+ colors?: PortalStyleColorsContract;
3074
+ /** Web font for the portal text. */
3075
+ font?: PortalStyleFontContract;
2973
3076
  /** Logo image, shown in the portal header. */
2974
3077
  logo?: PortalStyleImageContract;
2975
3078
  /** Favicon image, used as the portal's browser tab icon. */
2976
3079
  favicon?: PortalStyleImageContract;
2977
3080
  }
3081
+ /**
3082
+ * The portal's semantic color roles. Each role writes the theme color slots the
3083
+ * portal renderer reads, so a recolor stays consistent across every page and
3084
+ * works on any domain, unlike custom CSS.
3085
+ *
3086
+ * Values are Tailwind palette tokens — the same tokens the customizer's own
3087
+ * color pickers write, and the only values the renderer can paint: it
3088
+ * interpolates the token straight into a class name (`bg-neutral-900`). Hex,
3089
+ * `rgb()`, CSS variables and `bg-*` classes are rejected.
3090
+ *
3091
+ * Narrower than PortalColorToken: `stone` and `violet` are missing from the
3092
+ * portal build's Tailwind safelist, so they would compile to nothing.
3093
+ */
3094
+ export interface PortalStyleColorsContract {
3095
+ /**
3096
+ * Buttons, links and other primary surfaces (`bg_primary`,
3097
+ * `bg_primary_hover`, `primary`).
3098
+ * @pattern ^(transparent|white|black|(slate|gray|zinc|neutral|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|purple|fuchsia|pink|rose)-(50|100|200|300|400|500|600|700|800|900|950))$
3099
+ */
3100
+ primary?: PortalColorToken;
3101
+ /**
3102
+ * Page background behind the content (`bg_body`).
3103
+ * @pattern ^(transparent|white|black|(slate|gray|zinc|neutral|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|purple|fuchsia|pink|rose)-(50|100|200|300|400|500|600|700|800|900|950))$
3104
+ */
3105
+ background?: PortalColorToken;
3106
+ /**
3107
+ * Cards and panels sitting on the background (`bg_surface`).
3108
+ * @pattern ^(transparent|white|black|(slate|gray|zinc|neutral|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|purple|fuchsia|pink|rose)-(50|100|200|300|400|500|600|700|800|900|950))$
3109
+ */
3110
+ surface?: PortalColorToken;
3111
+ /**
3112
+ * Body text on a surface (`text_surface`).
3113
+ * @pattern ^(transparent|white|black|(slate|gray|zinc|neutral|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|purple|fuchsia|pink|rose)-(50|100|200|300|400|500|600|700|800|900|950))$
3114
+ */
3115
+ text?: PortalColorToken;
3116
+ /**
3117
+ * Secondary highlight surfaces (`bg_secondary`, `bg_secondary_hover`).
3118
+ * @pattern ^(transparent|white|black|(slate|gray|zinc|neutral|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|purple|fuchsia|pink|rose)-(50|100|200|300|400|500|600|700|800|900|950))$
3119
+ */
3120
+ accent?: PortalColorToken;
3121
+ }
3122
+ /**
3123
+ * A web font for the portal. The portal theme model has no font field, so the
3124
+ * font is delivered through the portal's custom code: gate stages one marked
3125
+ * `<style>` block that imports the family and applies it to the portal
3126
+ * container. The block is replaced (not appended) on every call, and
3127
+ * updatePortalCustomCode preserves it.
3128
+ *
3129
+ * The block imports the family from Google Fonts, so every portal visitor's
3130
+ * browser requests it from `fonts.googleapis.com` (and the files themselves
3131
+ * from `fonts.gstatic.com`) — a third-party request from the portal's own
3132
+ * domain, which a portal serving a CSP has to allow.
3133
+ */
3134
+ export interface PortalStyleFontContract {
3135
+ /**
3136
+ * Family name exactly as Google Fonts spells it, e.g. `Fraunces`. Letters,
3137
+ * digits and spaces only.
3138
+ * @pattern ^[A-Za-z0-9][A-Za-z0-9 ]{0,63}$
3139
+ */
3140
+ family: string;
3141
+ /** Where the family is loaded from. Only Google Fonts is supported. */
3142
+ source?: "google";
3143
+ }
2978
3144
  /** An image for portal branding, referenced by its uploaded stored file. */
2979
3145
  export interface PortalStyleImageContract {
2980
3146
  /** `storedFileUUID` of an already uploaded image file. */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fusebase/fusebase-gate-sdk",
3
- "version": "2.11.2",
3
+ "version": "2.11.5",
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",
@@ -0,0 +1,116 @@
1
+ # Release Notes 2.11.3
2
+
3
+ - Current ref: `HEAD`
4
+ - Previous tag: `v2.11.3`
5
+ - Generated at: 2026-09-03T11:31:56.879Z
6
+
7
+ ## Included Drafts
8
+
9
+ - `docs/release-notes/2026-09-02-portal-style-colors-font.md` - Portal branding: color roles and web font (NIM-42204)
10
+ - `docs/release-notes/2026-09-03-firecrawl-proxy-forwarding.md` - Firecrawl proxy settings forwarding
11
+
12
+ ## Summary
13
+
14
+ ### Portal branding: color roles and web font (NIM-42204)
15
+
16
+ `updatePortalStyle` now also takes `colors` and `font`, the two field groups the
17
+ first round left out. Colors are expressed the way the portal actually renders
18
+ them — as **Tailwind palette tokens** written into the theme's own color slots,
19
+ not as hex. The font is delivered through the portal's custom code, since the
20
+ theme model has no font field.
21
+
22
+ ### Firecrawl proxy settings forwarding
23
+
24
+ Fusebase Gate now exposes the organization-scoped Paperclip Services routes
25
+ needed to read and update Firecrawl proxy settings.
26
+
27
+
28
+ ## API / SDK Changes
29
+
30
+ ### Portal branding: color roles and web font (NIM-42204)
31
+
32
+ - `updatePortalStyle` body gained:
33
+ - `colors` — five semantic roles, each one palette token (`transparent`,
34
+ `white`, `black` or `<hue>-<shade>`, e.g. `indigo-600`):
35
+
36
+ | Role | Theme slots written |
37
+ | --- | --- |
38
+ | `primary` | `bg_primary`, `bg_primary_hover`, `primary` |
39
+ | `background` | `bg_body` |
40
+ | `surface` | `bg_surface` |
41
+ | `text` | `text_surface` |
42
+ | `accent` | `bg_secondary`, `bg_secondary_hover` |
43
+
44
+ - `font` — `{ family, source: "google" }`. The family is spelled as Google
45
+ Fonts spells it; letters, digits and spaces only.
46
+ - `getPortal` → `style` gained `colors` (the roles the portal overrides) and
47
+ `fontFamily`.
48
+ - A body touching both the theme fields and `font` stages **two** events (one
49
+ `updateThemeSettings`, one `updateCustomCodeSettings`); `seq` is the first.
50
+ - The error for an empty body is now
51
+ `At least one of theme, colors, font, logo, or favicon is required`.
52
+
53
+ ### Firecrawl proxy settings forwarding
54
+
55
+ - Added `GET /:orgId/paperclip-services/installations/:appKey/proxy`.
56
+ - Added `PUT /:orgId/paperclip-services/installations/:appKey/proxy`.
57
+ - Added typed redacted settings and write-only configuration contracts for
58
+ direct, custom gateway, uploaded list, and HTTPS list/API modes.
59
+ - Added `firecrawlProxyManagement` to the Paperclip Services capabilities
60
+ contract.
61
+ - The `paperclip-services` tag remains excluded from the public SDK surface.
62
+
63
+
64
+ ## Consumer Impact
65
+
66
+ ### Portal branding: color roles and web font (NIM-42204)
67
+
68
+ An agent can now recolor a portal past the 13 named themes without writing
69
+ custom CSS, and the recolor works on any domain.
70
+
71
+ **Hex is still rejected, on purpose.** The renderer interpolates the stored
72
+ token straight into a class name (`bg-neutral-900`), and
73
+ `apps/portals/tailwind.config.js` safelists palette names only, so `#2563eb`
74
+ would be stored, published, and style nothing. `stone` and `violet` are rejected
75
+ for the same reason: they are missing from that safelist. Convert a hex to the
76
+ nearest token before calling.
77
+
78
+ **Where the font lives.** The theme DTO has no font field, so `font` stages one
79
+ marked `<style>` block inside the portal's `customStyle`:
80
+
81
+ ```html
82
+ <!--fusebase-font--><style>@import url("https://fonts.googleapis.com/css2?family=Fraunces&display=swap");#main-scrolling-container{font-family:'Fraunces',sans-serif}</style><!--/fusebase-font-->
83
+ ```
84
+
85
+ The markers make it replaceable: a second `font` call swaps the block rather
86
+ than appending one, and `updatePortalCustomCode` carries it through when the
87
+ agent rewrites the surrounding CSS. Because it is custom code, it renders
88
+ wherever custom code renders — the customizer only offers the custom-code editor
89
+ on portals served from a custom CNAME domain.
90
+
91
+ **Hover slots take the same token as their base.** No shade is derived, so a
92
+ recolored hover never lands on an unrelated preset color. An agent that wants a
93
+ distinct hover uses `updatePortalCustomCode`.
94
+
95
+ ### Firecrawl proxy settings forwarding
96
+
97
+ Deployed Paperclip instances can open and save Firecrawl proxy settings through
98
+ Fusebase Gate. Reads require `paperclip_services.read`; updates require
99
+ `paperclip_services.write`. Credentials and proxy-list contents are forwarded
100
+ only in the request body and are not included in responses.
101
+
102
+
103
+ ## Verification
104
+
105
+ ### Firecrawl proxy settings forwarding
106
+
107
+ - Paperclip Services route authorization tests.
108
+ - Nimbus AI client forwarding tests for GET and PUT.
109
+ - Generated contract/OpenAPI validation and service build.
110
+
111
+
112
+ ## Follow-ups
113
+
114
+ ### Firecrawl proxy settings forwarding
115
+
116
+ - Verify the dev Gate rollout before running Firecrawl proxy acceptance tests.
@@ -0,0 +1,9 @@
1
+ # Release Notes 2.11.5
2
+
3
+ - Current ref: `HEAD`
4
+ - Previous tag: `v2.11.5`
5
+ - Generated at: 2026-09-04T07:08:20.261Z
6
+
7
+ ## Included Drafts
8
+
9
+ - None
@@ -1,8 +1,8 @@
1
- # Release Notes 2.11.2
1
+ # Release Notes 2.11.5
2
2
 
3
3
  - Current ref: `HEAD`
4
- - Previous tag: `v2.11.2`
5
- - Generated at: 2026-08-31T09:13:21.180Z
4
+ - Previous tag: `v2.11.5`
5
+ - Generated at: 2026-09-04T07:08:20.261Z
6
6
 
7
7
  ## Included Drafts
8
8
 
@@ -1,80 +0,0 @@
1
- # Release Notes 2.11.0
2
-
3
- - Current ref: `HEAD`
4
- - Previous tag: `v2.11.0`
5
- - Generated at: 2026-08-27T10:06:16.345Z
6
-
7
- ## Included Drafts
8
-
9
- - `docs/release-notes/2026-08-26-owner-delegated-private-app-apis.md` - Owner-delegated private App APIs
10
- - `docs/release-notes/2026-08-27-fusebase-app-work-agent-calls.md` - FuseBase Apps can invoke Work agents
11
-
12
- ## Summary
13
-
14
- ### Owner-delegated private App APIs
15
-
16
- FuseBase Work connections may invoke a private AI App API operation when the
17
- stored Gate token is bound to a user who currently has access to private App API
18
- operations.
19
-
20
- ### FuseBase Apps can invoke Work agents
21
-
22
- Adds an organization-scoped asynchronous bridge for FuseBase App backends to list FuseBase Work agents, create assigned tasks, and poll task results. The bridge is disabled unless the `app_agent_invocation` Gate feature flag is enabled.
23
-
24
-
25
- ## API / SDK Changes
26
-
27
- ### Owner-delegated private App APIs
28
-
29
- No request or response contracts changed. The App API call endpoint now accepts
30
- a private operation after Nimbus AI's user-aware operation lookup authorizes it.
31
- The lower-level runtime call service remains fail-closed without that explicit
32
- authorization result.
33
-
34
- ### FuseBase Apps can invoke Work agents
35
-
36
- - Added `listPaperclipCallableAgents` (`GET /:orgId/paperclip-agents`).
37
- - Added `createPaperclipAgentTask` (`POST /:orgId/paperclip-agents/tasks`).
38
- - Added `getPaperclipAgentTask` (`GET /:orgId/paperclip-agents/tasks/:taskId`).
39
- - Added backend permissions `paperclip_agents.read` and `paperclip_agents.execute`.
40
- - Regenerated OpenAPI and TypeScript SDK artifacts.
41
-
42
-
43
- ## Consumer Impact
44
-
45
- ### Owner-delegated private App APIs
46
-
47
- Owners can connect private AI App APIs to FuseBase Work without changing their
48
- OpenAPI visibility to `org`. Non-owner and cross-organization callers continue
49
- to be denied by Nimbus AI's operation lookup.
50
-
51
- ### FuseBase Apps can invoke Work agents
52
-
53
- App backends must use a user-bound Gate token for the same organization and explicitly request the new permissions. Supplying `externalRef` when creating a task makes retries idempotent. Browser clients should not receive tokens carrying `paperclip_agents.execute`.
54
-
55
-
56
- ## Verification
57
-
58
- ### Owner-delegated private App APIs
59
-
60
- - Unit coverage confirms an authorized private operation reaches the runtime.
61
- - Unit coverage confirms a denied private-operation lookup never reaches the runtime.
62
- - Existing service coverage confirms direct low-level private calls remain denied.
63
-
64
- ### FuseBase Apps can invoke Work agents
65
-
66
- - Gate TypeScript build passes.
67
- - Nimbus AI forwarding routes compile; its repository-wide build remains blocked by pre-existing database config and stale coupon-test type errors.
68
- - Paperclip server typecheck passes; its embedded PostgreSQL integration test is skipped where embedded PostgreSQL is unavailable.
69
-
70
-
71
- ## Follow-ups
72
-
73
- ### Owner-delegated private App APIs
74
-
75
- None.
76
-
77
- ### FuseBase Apps can invoke Work agents
78
-
79
- - Add optional signed webhook delivery after polling behavior is proven in dev.
80
- - Add the permissions to selected App backend manifests; do not add them to browser/default client token sets.
@@ -1,9 +0,0 @@
1
- # Release Notes 2.11.2
2
-
3
- - Current ref: `HEAD`
4
- - Previous tag: `v2.11.2`
5
- - Generated at: 2026-08-31T09:13:21.180Z
6
-
7
- ## Included Drafts
8
-
9
- - None