@fusebase/fusebase-gate-sdk 2.11.1 → 2.11.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/apis/PortalsApi.d.ts +20 -7
- package/dist/apis/PortalsApi.js +22 -7
- package/dist/index.d.ts +0 -1
- package/dist/index.js +1 -3
- package/dist/types/index.d.ts +0 -1
- package/dist/types/index.js +0 -1
- package/dist/types/portals/portals.d.ts +169 -3
- package/package.json +1 -1
- package/release-notes/2.11.3.md +77 -0
- package/release-notes/latest.md +72 -4
- package/dist/apis/PaperclipServicesApi.d.ts +0 -124
- package/dist/apis/PaperclipServicesApi.js +0 -161
- package/dist/types/paperclip-services/paperclip-services.d.ts +0 -142
- package/dist/types/paperclip-services/paperclip-services.js +0 -34
- package/release-notes/2.11.0.md +0 -80
- package/release-notes/2.11.1.md +0 -9
|
@@ -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).
|
|
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
|
-
|
|
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
|
|
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: {
|
package/dist/apis/PortalsApi.js
CHANGED
|
@@ -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).
|
|
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/:
|
|
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
|
|
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({
|
package/dist/index.d.ts
CHANGED
|
@@ -21,7 +21,6 @@ export { OrgGroupsApi } from "./apis/OrgGroupsApi";
|
|
|
21
21
|
export { OrgUsersApi } from "./apis/OrgUsersApi";
|
|
22
22
|
export { OrgsApi } from "./apis/OrgsApi";
|
|
23
23
|
export { PaperclipAgentsApi } from "./apis/PaperclipAgentsApi";
|
|
24
|
-
export { PaperclipServicesApi } from "./apis/PaperclipServicesApi";
|
|
25
24
|
export { PortalFeatureContextApi } from "./apis/PortalFeatureContextApi";
|
|
26
25
|
export { PortalsApi } from "./apis/PortalsApi";
|
|
27
26
|
export { SystemApi } from "./apis/SystemApi";
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
19
19
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
20
20
|
};
|
|
21
21
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
-
exports.WorkspacesApi = exports.TokensApi = exports.SystemApi = exports.PortalsApi = exports.PortalFeatureContextApi = exports.
|
|
22
|
+
exports.WorkspacesApi = exports.TokensApi = exports.SystemApi = exports.PortalsApi = exports.PortalFeatureContextApi = exports.PaperclipAgentsApi = exports.OrgsApi = exports.OrgUsersApi = exports.OrgGroupsApi = exports.NotesApi = exports.McpManagerApi = exports.IsolatedStoresApi = exports.HealthApi = exports.FusebaseAuthApi = exports.FilesApi = exports.EmailsApi = exports.BillingApi = exports.AppMagicLinksApi = exports.AppEmbedTargetsApi = exports.AppApisApi = exports.AccessApi = void 0;
|
|
23
23
|
__exportStar(require("./runtime"), exports);
|
|
24
24
|
__exportStar(require("./types"), exports);
|
|
25
25
|
var AccessApi_1 = require("./apis/AccessApi");
|
|
@@ -54,8 +54,6 @@ var OrgsApi_1 = require("./apis/OrgsApi");
|
|
|
54
54
|
Object.defineProperty(exports, "OrgsApi", { enumerable: true, get: function () { return OrgsApi_1.OrgsApi; } });
|
|
55
55
|
var PaperclipAgentsApi_1 = require("./apis/PaperclipAgentsApi");
|
|
56
56
|
Object.defineProperty(exports, "PaperclipAgentsApi", { enumerable: true, get: function () { return PaperclipAgentsApi_1.PaperclipAgentsApi; } });
|
|
57
|
-
var PaperclipServicesApi_1 = require("./apis/PaperclipServicesApi");
|
|
58
|
-
Object.defineProperty(exports, "PaperclipServicesApi", { enumerable: true, get: function () { return PaperclipServicesApi_1.PaperclipServicesApi; } });
|
|
59
57
|
var PortalFeatureContextApi_1 = require("./apis/PortalFeatureContextApi");
|
|
60
58
|
Object.defineProperty(exports, "PortalFeatureContextApi", { enumerable: true, get: function () { return PortalFeatureContextApi_1.PortalFeatureContextApi; } });
|
|
61
59
|
var PortalsApi_1 = require("./apis/PortalsApi");
|
package/dist/types/index.d.ts
CHANGED
|
@@ -21,7 +21,6 @@ export * from "./org-group/org-group";
|
|
|
21
21
|
export type { ClientAccountScheduledDeletionRequestContract, ClientAccountScheduledDeletionResponseContract, CreateWorkspaceRequestContract, OrgInviteContract, OrgMagicLinkContract, OrgMemberExpectedJoinedAfterInQueryOptional, OrgMemberExpectedRoleInQueryOptional, OrgMemberRemoveResponseContract, OrgPortalContract, OrgPortalListResponseContract, OrgUserAddRequestContract, OrgUserAddResponseContract, OrgUserContract, OrgUserIdInPathRequired, OrgUserListResponseContract, OrgUserWorkspaceIdInPathRequired, OrgWorkspaceContract, OrgWorkspaceInviteContract, OrgWorkspaceListResponseContract, OrgWorkspaceMemberContract, OrgWorkspaceMemberListResponseContract, WorkspaceMemberRemoveResponseContract } from "./org-user/org-user";
|
|
22
22
|
export * from "./orgs/orgs";
|
|
23
23
|
export type { CreatePaperclipAgentTaskRequestContract, PaperclipAgentRunContract, PaperclipAgentTaskAcceptedContract, PaperclipAgentTaskContract, PaperclipAgentTaskIdInPathRequired, PaperclipAgentTaskStatusContract, PaperclipCallableAgentContract, PaperclipCallableAgentListContract } from "./paperclip-agents/paperclip-agents";
|
|
24
|
-
export * from "./paperclip-services/paperclip-services";
|
|
25
24
|
export type { VerifyPortalFeatureContextTokenRequestContract, VerifyPortalFeatureContextTokenResponseContract } from "./portal-feature-context/portal-feature-context";
|
|
26
25
|
export * from "./portals/portals";
|
|
27
26
|
export * from "./shared/common";
|
package/dist/types/index.js
CHANGED
|
@@ -27,7 +27,6 @@ __exportStar(require("./mcp-manager/mcp-manager"), exports);
|
|
|
27
27
|
__exportStar(require("./note/note"), exports);
|
|
28
28
|
__exportStar(require("./org-group/org-group"), exports);
|
|
29
29
|
__exportStar(require("./orgs/orgs"), exports);
|
|
30
|
-
__exportStar(require("./paperclip-services/paperclip-services"), exports);
|
|
31
30
|
__exportStar(require("./portals/portals"), exports);
|
|
32
31
|
__exportStar(require("./shared/common"), exports);
|
|
33
32
|
__exportStar(require("./shared/enums"), exports);
|
|
@@ -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
|
-
/**
|
|
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
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Release Notes 2.11.3
|
|
2
|
+
|
|
3
|
+
- Current ref: `HEAD`
|
|
4
|
+
- Previous tag: `v2.11.3`
|
|
5
|
+
- Generated at: 2026-09-03T04:13:04.983Z
|
|
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
|
+
|
|
11
|
+
## Summary
|
|
12
|
+
|
|
13
|
+
### Portal branding: color roles and web font (NIM-42204)
|
|
14
|
+
|
|
15
|
+
`updatePortalStyle` now also takes `colors` and `font`, the two field groups the
|
|
16
|
+
first round left out. Colors are expressed the way the portal actually renders
|
|
17
|
+
them — as **Tailwind palette tokens** written into the theme's own color slots,
|
|
18
|
+
not as hex. The font is delivered through the portal's custom code, since the
|
|
19
|
+
theme model has no font field.
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
## API / SDK Changes
|
|
23
|
+
|
|
24
|
+
### Portal branding: color roles and web font (NIM-42204)
|
|
25
|
+
|
|
26
|
+
- `updatePortalStyle` body gained:
|
|
27
|
+
- `colors` — five semantic roles, each one palette token (`transparent`,
|
|
28
|
+
`white`, `black` or `<hue>-<shade>`, e.g. `indigo-600`):
|
|
29
|
+
|
|
30
|
+
| Role | Theme slots written |
|
|
31
|
+
| --- | --- |
|
|
32
|
+
| `primary` | `bg_primary`, `bg_primary_hover`, `primary` |
|
|
33
|
+
| `background` | `bg_body` |
|
|
34
|
+
| `surface` | `bg_surface` |
|
|
35
|
+
| `text` | `text_surface` |
|
|
36
|
+
| `accent` | `bg_secondary`, `bg_secondary_hover` |
|
|
37
|
+
|
|
38
|
+
- `font` — `{ family, source: "google" }`. The family is spelled as Google
|
|
39
|
+
Fonts spells it; letters, digits and spaces only.
|
|
40
|
+
- `getPortal` → `style` gained `colors` (the roles the portal overrides) and
|
|
41
|
+
`fontFamily`.
|
|
42
|
+
- A body touching both the theme fields and `font` stages **two** events (one
|
|
43
|
+
`updateThemeSettings`, one `updateCustomCodeSettings`); `seq` is the first.
|
|
44
|
+
- The error for an empty body is now
|
|
45
|
+
`At least one of theme, colors, font, logo, or favicon is required`.
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
## Consumer Impact
|
|
49
|
+
|
|
50
|
+
### Portal branding: color roles and web font (NIM-42204)
|
|
51
|
+
|
|
52
|
+
An agent can now recolor a portal past the 13 named themes without writing
|
|
53
|
+
custom CSS, and the recolor works on any domain.
|
|
54
|
+
|
|
55
|
+
**Hex is still rejected, on purpose.** The renderer interpolates the stored
|
|
56
|
+
token straight into a class name (`bg-neutral-900`), and
|
|
57
|
+
`apps/portals/tailwind.config.js` safelists palette names only, so `#2563eb`
|
|
58
|
+
would be stored, published, and style nothing. `stone` and `violet` are rejected
|
|
59
|
+
for the same reason: they are missing from that safelist. Convert a hex to the
|
|
60
|
+
nearest token before calling.
|
|
61
|
+
|
|
62
|
+
**Where the font lives.** The theme DTO has no font field, so `font` stages one
|
|
63
|
+
marked `<style>` block inside the portal's `customStyle`:
|
|
64
|
+
|
|
65
|
+
```html
|
|
66
|
+
<!--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-->
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The markers make it replaceable: a second `font` call swaps the block rather
|
|
70
|
+
than appending one, and `updatePortalCustomCode` carries it through when the
|
|
71
|
+
agent rewrites the surrounding CSS. Because it is custom code, it renders
|
|
72
|
+
wherever custom code renders — the customizer only offers the custom-code editor
|
|
73
|
+
on portals served from a custom CNAME domain.
|
|
74
|
+
|
|
75
|
+
**Hover slots take the same token as their base.** No shade is derived, so a
|
|
76
|
+
recolored hover never lands on an unrelated preset color. An agent that wants a
|
|
77
|
+
distinct hover uses `updatePortalCustomCode`.
|
package/release-notes/latest.md
CHANGED
|
@@ -1,9 +1,77 @@
|
|
|
1
|
-
# Release Notes 2.11.
|
|
1
|
+
# Release Notes 2.11.3
|
|
2
2
|
|
|
3
3
|
- Current ref: `HEAD`
|
|
4
|
-
- Previous tag: `v2.11.
|
|
5
|
-
- Generated at: 2026-
|
|
4
|
+
- Previous tag: `v2.11.3`
|
|
5
|
+
- Generated at: 2026-09-03T04:13:04.983Z
|
|
6
6
|
|
|
7
7
|
## Included Drafts
|
|
8
8
|
|
|
9
|
-
-
|
|
9
|
+
- `docs/release-notes/2026-09-02-portal-style-colors-font.md` - Portal branding: color roles and web font (NIM-42204)
|
|
10
|
+
|
|
11
|
+
## Summary
|
|
12
|
+
|
|
13
|
+
### Portal branding: color roles and web font (NIM-42204)
|
|
14
|
+
|
|
15
|
+
`updatePortalStyle` now also takes `colors` and `font`, the two field groups the
|
|
16
|
+
first round left out. Colors are expressed the way the portal actually renders
|
|
17
|
+
them — as **Tailwind palette tokens** written into the theme's own color slots,
|
|
18
|
+
not as hex. The font is delivered through the portal's custom code, since the
|
|
19
|
+
theme model has no font field.
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
## API / SDK Changes
|
|
23
|
+
|
|
24
|
+
### Portal branding: color roles and web font (NIM-42204)
|
|
25
|
+
|
|
26
|
+
- `updatePortalStyle` body gained:
|
|
27
|
+
- `colors` — five semantic roles, each one palette token (`transparent`,
|
|
28
|
+
`white`, `black` or `<hue>-<shade>`, e.g. `indigo-600`):
|
|
29
|
+
|
|
30
|
+
| Role | Theme slots written |
|
|
31
|
+
| --- | --- |
|
|
32
|
+
| `primary` | `bg_primary`, `bg_primary_hover`, `primary` |
|
|
33
|
+
| `background` | `bg_body` |
|
|
34
|
+
| `surface` | `bg_surface` |
|
|
35
|
+
| `text` | `text_surface` |
|
|
36
|
+
| `accent` | `bg_secondary`, `bg_secondary_hover` |
|
|
37
|
+
|
|
38
|
+
- `font` — `{ family, source: "google" }`. The family is spelled as Google
|
|
39
|
+
Fonts spells it; letters, digits and spaces only.
|
|
40
|
+
- `getPortal` → `style` gained `colors` (the roles the portal overrides) and
|
|
41
|
+
`fontFamily`.
|
|
42
|
+
- A body touching both the theme fields and `font` stages **two** events (one
|
|
43
|
+
`updateThemeSettings`, one `updateCustomCodeSettings`); `seq` is the first.
|
|
44
|
+
- The error for an empty body is now
|
|
45
|
+
`At least one of theme, colors, font, logo, or favicon is required`.
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
## Consumer Impact
|
|
49
|
+
|
|
50
|
+
### Portal branding: color roles and web font (NIM-42204)
|
|
51
|
+
|
|
52
|
+
An agent can now recolor a portal past the 13 named themes without writing
|
|
53
|
+
custom CSS, and the recolor works on any domain.
|
|
54
|
+
|
|
55
|
+
**Hex is still rejected, on purpose.** The renderer interpolates the stored
|
|
56
|
+
token straight into a class name (`bg-neutral-900`), and
|
|
57
|
+
`apps/portals/tailwind.config.js` safelists palette names only, so `#2563eb`
|
|
58
|
+
would be stored, published, and style nothing. `stone` and `violet` are rejected
|
|
59
|
+
for the same reason: they are missing from that safelist. Convert a hex to the
|
|
60
|
+
nearest token before calling.
|
|
61
|
+
|
|
62
|
+
**Where the font lives.** The theme DTO has no font field, so `font` stages one
|
|
63
|
+
marked `<style>` block inside the portal's `customStyle`:
|
|
64
|
+
|
|
65
|
+
```html
|
|
66
|
+
<!--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-->
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
The markers make it replaceable: a second `font` call swaps the block rather
|
|
70
|
+
than appending one, and `updatePortalCustomCode` carries it through when the
|
|
71
|
+
agent rewrites the surrounding CSS. Because it is custom code, it renders
|
|
72
|
+
wherever custom code renders — the customizer only offers the custom-code editor
|
|
73
|
+
on portals served from a custom CNAME domain.
|
|
74
|
+
|
|
75
|
+
**Hover slots take the same token as their base.** No shade is derived, so a
|
|
76
|
+
recolored hover never lands on an unrelated preset color. An agent that wants a
|
|
77
|
+
distinct hover uses `updatePortalCustomCode`.
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* PaperclipServices API
|
|
3
|
-
*
|
|
4
|
-
* Generated from contract introspection
|
|
5
|
-
* Domain: paperclip-services
|
|
6
|
-
*/
|
|
7
|
-
import type { Client } from "../runtime/transport";
|
|
8
|
-
import type { orgIdInPathRequired, PaperclipServiceAppKeyInPathRequired, PaperclipServiceBackupRequestContract, PaperclipServiceInstallRequestContract, PaperclipServiceInstallResultContract, PaperclipServiceOperationContract, PaperclipServiceOperationIdInPathRequired, PaperclipServiceOperationRequestContract, PaperclipServiceRestoreRequestContract, PaperclipServiceRetryRequestContract, PaperclipServicesCapabilitiesContract, PaperclipServicesCapacityContract, PaperclipServicesHealthContract, PaperclipServiceUpgradeRequestContract } from "../types";
|
|
9
|
-
export declare class PaperclipServicesApi {
|
|
10
|
-
private client;
|
|
11
|
-
constructor(client: Client);
|
|
12
|
-
/**
|
|
13
|
-
* Back up a Paperclip Service
|
|
14
|
-
* Starts an idempotent retained backup operation.
|
|
15
|
-
*/
|
|
16
|
-
backupPaperclipService(params: {
|
|
17
|
-
path: {
|
|
18
|
-
orgId: orgIdInPathRequired;
|
|
19
|
-
appKey: PaperclipServiceAppKeyInPathRequired;
|
|
20
|
-
};
|
|
21
|
-
headers?: Record<string, string>;
|
|
22
|
-
body: PaperclipServiceBackupRequestContract;
|
|
23
|
-
}): Promise<PaperclipServiceOperationContract>;
|
|
24
|
-
/**
|
|
25
|
-
* Delete a Paperclip Service
|
|
26
|
-
* Starts an idempotent Nimbus-backed deletion operation for an installed service.
|
|
27
|
-
*/
|
|
28
|
-
deletePaperclipService(params: {
|
|
29
|
-
path: {
|
|
30
|
-
orgId: orgIdInPathRequired;
|
|
31
|
-
appKey: PaperclipServiceAppKeyInPathRequired;
|
|
32
|
-
};
|
|
33
|
-
headers?: Record<string, string>;
|
|
34
|
-
body: PaperclipServiceOperationRequestContract;
|
|
35
|
-
}): Promise<PaperclipServiceOperationContract>;
|
|
36
|
-
/**
|
|
37
|
-
* Get a Paperclip Service operation
|
|
38
|
-
* Returns the durable Nimbus lifecycle operation state.
|
|
39
|
-
*/
|
|
40
|
-
getPaperclipServiceOperation(params: {
|
|
41
|
-
path: {
|
|
42
|
-
orgId: orgIdInPathRequired;
|
|
43
|
-
operationId: PaperclipServiceOperationIdInPathRequired;
|
|
44
|
-
};
|
|
45
|
-
headers?: Record<string, string>;
|
|
46
|
-
}): Promise<PaperclipServiceOperationContract>;
|
|
47
|
-
/**
|
|
48
|
-
* Get Paperclip Services capabilities
|
|
49
|
-
* Returns Nimbus-backed service availability and entitlement for an org-scoped Paperclip service token.
|
|
50
|
-
*/
|
|
51
|
-
getPaperclipServicesCapabilities(params: {
|
|
52
|
-
path: {
|
|
53
|
-
orgId: orgIdInPathRequired;
|
|
54
|
-
};
|
|
55
|
-
headers?: Record<string, string>;
|
|
56
|
-
}): Promise<PaperclipServicesCapabilitiesContract>;
|
|
57
|
-
/**
|
|
58
|
-
* Get Paperclip Services capacity
|
|
59
|
-
* Returns reserved, used, and available service capacity for the token-scoped organization.
|
|
60
|
-
*/
|
|
61
|
-
getPaperclipServicesCapacity(params: {
|
|
62
|
-
path: {
|
|
63
|
-
orgId: orgIdInPathRequired;
|
|
64
|
-
};
|
|
65
|
-
headers?: Record<string, string>;
|
|
66
|
-
}): Promise<PaperclipServicesCapacityContract>;
|
|
67
|
-
/**
|
|
68
|
-
* Get Paperclip Services health
|
|
69
|
-
* Returns observed workloads, alerts, and reconciliation state for the token-scoped organization.
|
|
70
|
-
*/
|
|
71
|
-
getPaperclipServicesHealth(params: {
|
|
72
|
-
path: {
|
|
73
|
-
orgId: orgIdInPathRequired;
|
|
74
|
-
};
|
|
75
|
-
headers?: Record<string, string>;
|
|
76
|
-
}): Promise<PaperclipServicesHealthContract>;
|
|
77
|
-
/**
|
|
78
|
-
* Install a Paperclip Service
|
|
79
|
-
* Starts an idempotent Nimbus-backed installation operation for the token-scoped organization.
|
|
80
|
-
*/
|
|
81
|
-
installPaperclipService(params: {
|
|
82
|
-
path: {
|
|
83
|
-
orgId: orgIdInPathRequired;
|
|
84
|
-
};
|
|
85
|
-
headers?: Record<string, string>;
|
|
86
|
-
body: PaperclipServiceInstallRequestContract;
|
|
87
|
-
}): Promise<PaperclipServiceInstallResultContract>;
|
|
88
|
-
/**
|
|
89
|
-
* Restore a Paperclip Service
|
|
90
|
-
* Starts an idempotent restore from a verified retained backup.
|
|
91
|
-
*/
|
|
92
|
-
restorePaperclipService(params: {
|
|
93
|
-
path: {
|
|
94
|
-
orgId: orgIdInPathRequired;
|
|
95
|
-
appKey: PaperclipServiceAppKeyInPathRequired;
|
|
96
|
-
};
|
|
97
|
-
headers?: Record<string, string>;
|
|
98
|
-
body: PaperclipServiceRestoreRequestContract;
|
|
99
|
-
}): Promise<PaperclipServiceOperationContract>;
|
|
100
|
-
/**
|
|
101
|
-
* Retry a Paperclip Service operation
|
|
102
|
-
* Starts an idempotent retry for the requested lifecycle action.
|
|
103
|
-
*/
|
|
104
|
-
retryPaperclipService(params: {
|
|
105
|
-
path: {
|
|
106
|
-
orgId: orgIdInPathRequired;
|
|
107
|
-
appKey: PaperclipServiceAppKeyInPathRequired;
|
|
108
|
-
};
|
|
109
|
-
headers?: Record<string, string>;
|
|
110
|
-
body: PaperclipServiceRetryRequestContract;
|
|
111
|
-
}): Promise<PaperclipServiceOperationContract>;
|
|
112
|
-
/**
|
|
113
|
-
* Upgrade a Paperclip Service
|
|
114
|
-
* Starts an idempotent upgrade to an approved manifest revision.
|
|
115
|
-
*/
|
|
116
|
-
upgradePaperclipService(params: {
|
|
117
|
-
path: {
|
|
118
|
-
orgId: orgIdInPathRequired;
|
|
119
|
-
appKey: PaperclipServiceAppKeyInPathRequired;
|
|
120
|
-
};
|
|
121
|
-
headers?: Record<string, string>;
|
|
122
|
-
body: PaperclipServiceUpgradeRequestContract;
|
|
123
|
-
}): Promise<PaperclipServiceOperationContract>;
|
|
124
|
-
}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* PaperclipServices API
|
|
4
|
-
*
|
|
5
|
-
* Generated from contract introspection
|
|
6
|
-
* Domain: paperclip-services
|
|
7
|
-
*/
|
|
8
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
-
exports.PaperclipServicesApi = void 0;
|
|
10
|
-
class PaperclipServicesApi {
|
|
11
|
-
constructor(client) {
|
|
12
|
-
this.client = client;
|
|
13
|
-
}
|
|
14
|
-
/**
|
|
15
|
-
* Back up a Paperclip Service
|
|
16
|
-
* Starts an idempotent retained backup operation.
|
|
17
|
-
*/
|
|
18
|
-
async backupPaperclipService(params) {
|
|
19
|
-
return this.client.request({
|
|
20
|
-
method: "POST",
|
|
21
|
-
path: "/:orgId/paperclip-services/installations/:appKey/backup",
|
|
22
|
-
pathParams: params.path,
|
|
23
|
-
headers: params.headers,
|
|
24
|
-
body: params.body,
|
|
25
|
-
opId: "backupPaperclipService",
|
|
26
|
-
expectedContentType: "application/json",
|
|
27
|
-
});
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* Delete a Paperclip Service
|
|
31
|
-
* Starts an idempotent Nimbus-backed deletion operation for an installed service.
|
|
32
|
-
*/
|
|
33
|
-
async deletePaperclipService(params) {
|
|
34
|
-
return this.client.request({
|
|
35
|
-
method: "DELETE",
|
|
36
|
-
path: "/:orgId/paperclip-services/installations/:appKey",
|
|
37
|
-
pathParams: params.path,
|
|
38
|
-
headers: params.headers,
|
|
39
|
-
body: params.body,
|
|
40
|
-
opId: "deletePaperclipService",
|
|
41
|
-
expectedContentType: "application/json",
|
|
42
|
-
});
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* Get a Paperclip Service operation
|
|
46
|
-
* Returns the durable Nimbus lifecycle operation state.
|
|
47
|
-
*/
|
|
48
|
-
async getPaperclipServiceOperation(params) {
|
|
49
|
-
return this.client.request({
|
|
50
|
-
method: "GET",
|
|
51
|
-
path: "/:orgId/paperclip-services/operations/:operationId",
|
|
52
|
-
pathParams: params.path,
|
|
53
|
-
headers: params.headers,
|
|
54
|
-
opId: "getPaperclipServiceOperation",
|
|
55
|
-
expectedContentType: "application/json",
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Get Paperclip Services capabilities
|
|
60
|
-
* Returns Nimbus-backed service availability and entitlement for an org-scoped Paperclip service token.
|
|
61
|
-
*/
|
|
62
|
-
async getPaperclipServicesCapabilities(params) {
|
|
63
|
-
return this.client.request({
|
|
64
|
-
method: "GET",
|
|
65
|
-
path: "/:orgId/paperclip-services/capabilities",
|
|
66
|
-
pathParams: params.path,
|
|
67
|
-
headers: params.headers,
|
|
68
|
-
opId: "getPaperclipServicesCapabilities",
|
|
69
|
-
expectedContentType: "application/json",
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* Get Paperclip Services capacity
|
|
74
|
-
* Returns reserved, used, and available service capacity for the token-scoped organization.
|
|
75
|
-
*/
|
|
76
|
-
async getPaperclipServicesCapacity(params) {
|
|
77
|
-
return this.client.request({
|
|
78
|
-
method: "GET",
|
|
79
|
-
path: "/:orgId/paperclip-services/capacity",
|
|
80
|
-
pathParams: params.path,
|
|
81
|
-
headers: params.headers,
|
|
82
|
-
opId: "getPaperclipServicesCapacity",
|
|
83
|
-
expectedContentType: "application/json",
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
/**
|
|
87
|
-
* Get Paperclip Services health
|
|
88
|
-
* Returns observed workloads, alerts, and reconciliation state for the token-scoped organization.
|
|
89
|
-
*/
|
|
90
|
-
async getPaperclipServicesHealth(params) {
|
|
91
|
-
return this.client.request({
|
|
92
|
-
method: "GET",
|
|
93
|
-
path: "/:orgId/paperclip-services/health",
|
|
94
|
-
pathParams: params.path,
|
|
95
|
-
headers: params.headers,
|
|
96
|
-
opId: "getPaperclipServicesHealth",
|
|
97
|
-
expectedContentType: "application/json",
|
|
98
|
-
});
|
|
99
|
-
}
|
|
100
|
-
/**
|
|
101
|
-
* Install a Paperclip Service
|
|
102
|
-
* Starts an idempotent Nimbus-backed installation operation for the token-scoped organization.
|
|
103
|
-
*/
|
|
104
|
-
async installPaperclipService(params) {
|
|
105
|
-
return this.client.request({
|
|
106
|
-
method: "POST",
|
|
107
|
-
path: "/:orgId/paperclip-services/installations",
|
|
108
|
-
pathParams: params.path,
|
|
109
|
-
headers: params.headers,
|
|
110
|
-
body: params.body,
|
|
111
|
-
opId: "installPaperclipService",
|
|
112
|
-
expectedContentType: "application/json",
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Restore a Paperclip Service
|
|
117
|
-
* Starts an idempotent restore from a verified retained backup.
|
|
118
|
-
*/
|
|
119
|
-
async restorePaperclipService(params) {
|
|
120
|
-
return this.client.request({
|
|
121
|
-
method: "POST",
|
|
122
|
-
path: "/:orgId/paperclip-services/installations/:appKey/restore",
|
|
123
|
-
pathParams: params.path,
|
|
124
|
-
headers: params.headers,
|
|
125
|
-
body: params.body,
|
|
126
|
-
opId: "restorePaperclipService",
|
|
127
|
-
expectedContentType: "application/json",
|
|
128
|
-
});
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Retry a Paperclip Service operation
|
|
132
|
-
* Starts an idempotent retry for the requested lifecycle action.
|
|
133
|
-
*/
|
|
134
|
-
async retryPaperclipService(params) {
|
|
135
|
-
return this.client.request({
|
|
136
|
-
method: "POST",
|
|
137
|
-
path: "/:orgId/paperclip-services/installations/:appKey/retry",
|
|
138
|
-
pathParams: params.path,
|
|
139
|
-
headers: params.headers,
|
|
140
|
-
body: params.body,
|
|
141
|
-
opId: "retryPaperclipService",
|
|
142
|
-
expectedContentType: "application/json",
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Upgrade a Paperclip Service
|
|
147
|
-
* Starts an idempotent upgrade to an approved manifest revision.
|
|
148
|
-
*/
|
|
149
|
-
async upgradePaperclipService(params) {
|
|
150
|
-
return this.client.request({
|
|
151
|
-
method: "POST",
|
|
152
|
-
path: "/:orgId/paperclip-services/installations/:appKey/upgrade",
|
|
153
|
-
pathParams: params.path,
|
|
154
|
-
headers: params.headers,
|
|
155
|
-
body: params.body,
|
|
156
|
-
opId: "upgradePaperclipService",
|
|
157
|
-
expectedContentType: "application/json",
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
exports.PaperclipServicesApi = PaperclipServicesApi;
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
export type PaperclipServicesEntitlementSourceContract = "advanced_subscription" | "ltd_coupons" | "ineligible";
|
|
2
|
-
export type PaperclipServicesEntitlementErrorCodeContract = "ltd_coupons_below_minimum" | "ineligible" | "unavailable";
|
|
3
|
-
export interface PaperclipServicesEntitlementContract {
|
|
4
|
-
eligible: boolean;
|
|
5
|
-
source: PaperclipServicesEntitlementSourceContract;
|
|
6
|
-
couponCount: number | null;
|
|
7
|
-
evaluatedAt: string;
|
|
8
|
-
errorCode?: PaperclipServicesEntitlementErrorCodeContract;
|
|
9
|
-
message?: string;
|
|
10
|
-
}
|
|
11
|
-
export interface PaperclipServicesCapabilitiesContract {
|
|
12
|
-
provider: string;
|
|
13
|
-
providerVersion: string;
|
|
14
|
-
architecture: string;
|
|
15
|
-
featureAvailable: boolean;
|
|
16
|
-
entitlement?: PaperclipServicesEntitlementContract;
|
|
17
|
-
}
|
|
18
|
-
export interface PaperclipServicesResourceUsageContract {
|
|
19
|
-
cpu: string;
|
|
20
|
-
memory: string;
|
|
21
|
-
storage: string;
|
|
22
|
-
pods: number;
|
|
23
|
-
persistentVolumeClaims: number;
|
|
24
|
-
}
|
|
25
|
-
export interface PaperclipServicesCapacityContract {
|
|
26
|
-
currentProfile: string;
|
|
27
|
-
reserved: PaperclipServicesResourceUsageContract;
|
|
28
|
-
used: PaperclipServicesResourceUsageContract;
|
|
29
|
-
available: PaperclipServicesResourceUsageContract;
|
|
30
|
-
eligibleNextProfiles: string[];
|
|
31
|
-
}
|
|
32
|
-
export type PaperclipServicesComponentKindContract = "Deployment" | "StatefulSet";
|
|
33
|
-
export type PaperclipServicesComponentStatusContract = "healthy" | "degraded" | "unhealthy" | "unknown";
|
|
34
|
-
export interface PaperclipServicesComponentHealthContract {
|
|
35
|
-
appKey: string;
|
|
36
|
-
component: string;
|
|
37
|
-
kind: PaperclipServicesComponentKindContract;
|
|
38
|
-
status: PaperclipServicesComponentStatusContract;
|
|
39
|
-
desiredReplicas: number;
|
|
40
|
-
readyReplicas: number;
|
|
41
|
-
restartCount: number;
|
|
42
|
-
manifestRevision?: string;
|
|
43
|
-
reason?: string;
|
|
44
|
-
}
|
|
45
|
-
export interface PaperclipServicesHealthAlertContract {
|
|
46
|
-
code: string;
|
|
47
|
-
severity: "warning" | "critical";
|
|
48
|
-
message: string;
|
|
49
|
-
appKey?: string;
|
|
50
|
-
component?: string;
|
|
51
|
-
}
|
|
52
|
-
export interface PaperclipServicesHealthContract {
|
|
53
|
-
status: "healthy" | "degraded" | "unavailable";
|
|
54
|
-
checkedAt: string;
|
|
55
|
-
components: PaperclipServicesComponentHealthContract[];
|
|
56
|
-
alerts: PaperclipServicesHealthAlertContract[];
|
|
57
|
-
operations: {
|
|
58
|
-
pending: number;
|
|
59
|
-
running: number;
|
|
60
|
-
staleClaims: number;
|
|
61
|
-
needsManualReview: number;
|
|
62
|
-
};
|
|
63
|
-
reconciliation: {
|
|
64
|
-
orphanedWorkloads: number;
|
|
65
|
-
outdatedManifests: number;
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
export type PaperclipServiceAppKeyContract = "n8n" | "firecrawl";
|
|
69
|
-
export type PaperclipServiceAppKeyInPathRequired = string;
|
|
70
|
-
export type PaperclipServiceOperationIdInPathRequired = string;
|
|
71
|
-
export interface PaperclipServiceOperationRequestContract {
|
|
72
|
-
orgRuntimeIdentity: string;
|
|
73
|
-
managedCompanyId: string;
|
|
74
|
-
operationId: string;
|
|
75
|
-
idempotencyKey: string;
|
|
76
|
-
providerRef?: string;
|
|
77
|
-
}
|
|
78
|
-
export interface PaperclipServiceInstallRequestContract extends PaperclipServiceOperationRequestContract {
|
|
79
|
-
appKey: PaperclipServiceAppKeyContract;
|
|
80
|
-
approvedManifestRevision: string;
|
|
81
|
-
}
|
|
82
|
-
export interface PaperclipServiceUpgradeRequestContract extends PaperclipServiceOperationRequestContract {
|
|
83
|
-
appKey: PaperclipServiceAppKeyContract;
|
|
84
|
-
approvedManifestRevision: string;
|
|
85
|
-
}
|
|
86
|
-
export interface PaperclipServiceBackupRequestContract extends PaperclipServiceOperationRequestContract {
|
|
87
|
-
manifestRevision: string;
|
|
88
|
-
}
|
|
89
|
-
export interface PaperclipServiceRestoreRequestContract extends PaperclipServiceOperationRequestContract {
|
|
90
|
-
backupProviderRequestId: string;
|
|
91
|
-
}
|
|
92
|
-
export interface PaperclipServiceRetryRequestContract extends PaperclipServiceOperationRequestContract {
|
|
93
|
-
action: "install" | "delete" | "upgrade" | "backup" | "restore";
|
|
94
|
-
}
|
|
95
|
-
export type PaperclipServiceOperationStatusContract = "pending" | "running" | "succeeded" | "failed" | "needs_manual_review";
|
|
96
|
-
export interface PaperclipServiceOperationContract {
|
|
97
|
-
providerRequestId: string;
|
|
98
|
-
status: PaperclipServiceOperationStatusContract;
|
|
99
|
-
providerRef?: string;
|
|
100
|
-
providerRouteRef?: string;
|
|
101
|
-
observedState: Record<string, unknown>;
|
|
102
|
-
error?: string;
|
|
103
|
-
}
|
|
104
|
-
export interface PaperclipServiceInstallResultContract {
|
|
105
|
-
outcome: "accepted" | "insufficient_capacity";
|
|
106
|
-
operation?: PaperclipServiceOperationContract;
|
|
107
|
-
requested?: PaperclipServicesResourceUsageContract;
|
|
108
|
-
available?: PaperclipServicesResourceUsageContract;
|
|
109
|
-
requiredProfile?: string;
|
|
110
|
-
eligibleProfiles?: string[];
|
|
111
|
-
}
|
|
112
|
-
export declare const PaperclipServicesEntitlementSourceContract: {
|
|
113
|
-
readonly AdvancedSubscription: "advanced_subscription";
|
|
114
|
-
readonly LtdCoupons: "ltd_coupons";
|
|
115
|
-
readonly Ineligible: "ineligible";
|
|
116
|
-
};
|
|
117
|
-
export declare const PaperclipServicesEntitlementErrorCodeContract: {
|
|
118
|
-
readonly LtdCouponsBelowMinimum: "ltd_coupons_below_minimum";
|
|
119
|
-
readonly Ineligible: "ineligible";
|
|
120
|
-
readonly Unavailable: "unavailable";
|
|
121
|
-
};
|
|
122
|
-
export declare const PaperclipServicesComponentKindContract: {
|
|
123
|
-
readonly Deployment: "Deployment";
|
|
124
|
-
readonly Statefulset: "StatefulSet";
|
|
125
|
-
};
|
|
126
|
-
export declare const PaperclipServicesComponentStatusContract: {
|
|
127
|
-
readonly Healthy: "healthy";
|
|
128
|
-
readonly Degraded: "degraded";
|
|
129
|
-
readonly Unhealthy: "unhealthy";
|
|
130
|
-
readonly Unknown: "unknown";
|
|
131
|
-
};
|
|
132
|
-
export declare const PaperclipServiceAppKeyContract: {
|
|
133
|
-
readonly N8n: "n8n";
|
|
134
|
-
readonly Firecrawl: "firecrawl";
|
|
135
|
-
};
|
|
136
|
-
export declare const PaperclipServiceOperationStatusContract: {
|
|
137
|
-
readonly Pending: "pending";
|
|
138
|
-
readonly Running: "running";
|
|
139
|
-
readonly Succeeded: "succeeded";
|
|
140
|
-
readonly Failed: "failed";
|
|
141
|
-
readonly NeedsManualReview: "needs_manual_review";
|
|
142
|
-
};
|
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.PaperclipServiceOperationStatusContract = exports.PaperclipServiceAppKeyContract = exports.PaperclipServicesComponentStatusContract = exports.PaperclipServicesComponentKindContract = exports.PaperclipServicesEntitlementErrorCodeContract = exports.PaperclipServicesEntitlementSourceContract = void 0;
|
|
4
|
-
exports.PaperclipServicesEntitlementSourceContract = {
|
|
5
|
-
AdvancedSubscription: "advanced_subscription",
|
|
6
|
-
LtdCoupons: "ltd_coupons",
|
|
7
|
-
Ineligible: "ineligible"
|
|
8
|
-
};
|
|
9
|
-
exports.PaperclipServicesEntitlementErrorCodeContract = {
|
|
10
|
-
LtdCouponsBelowMinimum: "ltd_coupons_below_minimum",
|
|
11
|
-
Ineligible: "ineligible",
|
|
12
|
-
Unavailable: "unavailable"
|
|
13
|
-
};
|
|
14
|
-
exports.PaperclipServicesComponentKindContract = {
|
|
15
|
-
Deployment: "Deployment",
|
|
16
|
-
Statefulset: "StatefulSet"
|
|
17
|
-
};
|
|
18
|
-
exports.PaperclipServicesComponentStatusContract = {
|
|
19
|
-
Healthy: "healthy",
|
|
20
|
-
Degraded: "degraded",
|
|
21
|
-
Unhealthy: "unhealthy",
|
|
22
|
-
Unknown: "unknown"
|
|
23
|
-
};
|
|
24
|
-
exports.PaperclipServiceAppKeyContract = {
|
|
25
|
-
N8n: "n8n",
|
|
26
|
-
Firecrawl: "firecrawl"
|
|
27
|
-
};
|
|
28
|
-
exports.PaperclipServiceOperationStatusContract = {
|
|
29
|
-
Pending: "pending",
|
|
30
|
-
Running: "running",
|
|
31
|
-
Succeeded: "succeeded",
|
|
32
|
-
Failed: "failed",
|
|
33
|
-
NeedsManualReview: "needs_manual_review"
|
|
34
|
-
};
|
package/release-notes/2.11.0.md
DELETED
|
@@ -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.invoke`.
|
|
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.invoke`.
|
|
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.
|