@fusebase/fusebase-gate-sdk 2.13.1-sdk.0 → 2.13.1
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/FilesApi.d.ts +6 -4
- package/dist/apis/FilesApi.js +4 -4
- package/dist/apis/NotesApi.d.ts +17 -1
- package/dist/apis/NotesApi.js +15 -0
- package/dist/types/note/note.d.ts +18 -0
- package/package.json +1 -1
- package/release-notes/2.13.1-sdk.0.md +82 -3
- package/release-notes/2.13.1.md +90 -0
- package/release-notes/latest.md +84 -3
package/dist/apis/FilesApi.d.ts
CHANGED
|
@@ -45,7 +45,7 @@ export declare class FilesApi {
|
|
|
45
45
|
}): Promise<CreateTempStoredFileUploadResponseContract>;
|
|
46
46
|
/**
|
|
47
47
|
* Delete file
|
|
48
|
-
* Deletes a file-service stored file by stored-file UUID. Gate never handles the file bytes.
|
|
48
|
+
* Deletes a file-service stored file by stored-file UUID. Gate never handles the file bytes. Not available to organization clients: they remove the files they uploaded with `removeBucketAttachment`.
|
|
49
49
|
*/
|
|
50
50
|
deleteFile(params: {
|
|
51
51
|
path: {
|
|
@@ -56,7 +56,7 @@ export declare class FilesApi {
|
|
|
56
56
|
}): Promise<DeleteFileResponseContract>;
|
|
57
57
|
/**
|
|
58
58
|
* List bucket attachments
|
|
59
|
-
* Lists the organization's files from every source in one list: files uploaded into an app (`app`), note attachments (`note`) and portal files (`portalPage`, `portalGlobal`, `portalFiles`, `portalBlock`). Each item carries its source `target`, its file `kind` (`image`, `video`, `audio`, `doc`, `archive` or `file`, detected from the mime type), the uploader `userId` (resolve the email and role with the org-users operations), the `size` in bytes, the custom `attributes` and the `accessPrincipals`. Filter by source with `targets`, keep only some apps or other sources with `targetIds` (matched against the item `targetId`; a bare app id needs `targets` set to `app`), drop small files with `sizeFrom`, keep only the files one user uploaded with `uploaderId`, keep only some file types with `kinds`, and match custom metadata with `attributes`, a JSON object of strings sent as a string, such as `{"source":"file-manager"}`, where every given pair must match exactly (`total` follows the same filter). Clients only receive files their access principals or the bucket permissions allow.
|
|
59
|
+
* Lists the organization's files from every source in one list: files uploaded into an app (`app`), note attachments (`note`) and portal files (`portalPage`, `portalGlobal`, `portalFiles`, `portalBlock`). Each item carries its source `target`, its file `kind` (`image`, `video`, `audio`, `doc`, `archive` or `file`, detected from the mime type), the uploader `userId` (resolve the email and role with the org-users operations), the `size` in bytes, the custom `attributes` and the `accessPrincipals`. Filter by source with `targets`, keep only some apps or other sources with `targetIds` (matched against the item `targetId`; a bare app id needs `targets` set to `app`), drop small files with `sizeFrom`, keep only the files added in a date range with `createdFrom` and `createdTo` (unix seconds like `createdAt`, both inclusive, either alone), keep only the files one user uploaded with `uploaderId`, keep only some file types with `kinds`, and match custom metadata with `attributes`, a JSON object of strings sent as a string, such as `{"source":"file-manager"}`, where every given pair must match exactly (`total` follows the same filter). Clients only receive files their access principals or the bucket permissions allow.
|
|
60
60
|
*/
|
|
61
61
|
listBucketAttachments(params: {
|
|
62
62
|
path: {
|
|
@@ -66,6 +66,8 @@ export declare class FilesApi {
|
|
|
66
66
|
targets?: unknown[];
|
|
67
67
|
targetIds?: unknown[];
|
|
68
68
|
sizeFrom?: number;
|
|
69
|
+
createdFrom?: number;
|
|
70
|
+
createdTo?: number;
|
|
69
71
|
uploaderId?: number;
|
|
70
72
|
kinds?: unknown[];
|
|
71
73
|
attributes?: string;
|
|
@@ -78,7 +80,7 @@ export declare class FilesApi {
|
|
|
78
80
|
}): Promise<ListBucketAttachmentsResponseContract>;
|
|
79
81
|
/**
|
|
80
82
|
* Remove bucket attachment
|
|
81
|
-
* Removes a file of the organization from the organization file listing, whatever its source (app, note or portal). Only the uploader or an organization manager or owner may remove it.
|
|
83
|
+
* Removes a file of the organization from the organization file listing, whatever its source (app, note or portal). Only the uploader or an organization manager or owner may remove it, so an organization client removes only the files it uploaded.
|
|
82
84
|
*/
|
|
83
85
|
removeBucketAttachment(params: {
|
|
84
86
|
path: {
|
|
@@ -100,7 +102,7 @@ export declare class FilesApi {
|
|
|
100
102
|
}): Promise<StartMultipartFileUploadResponseContract>;
|
|
101
103
|
/**
|
|
102
104
|
* Update bucket attachment
|
|
103
|
-
* Renames a bucket attachment or replaces its attributes and accessPrincipals. Works on any file of the organization; `accessPrincipals` only on app files. Only the uploader or an organization manager or owner may change `attributes` or `accessPrincipals
|
|
105
|
+
* Renames a bucket attachment or replaces its attributes and accessPrincipals. Works on any file of the organization; `accessPrincipals` only on app files. Only the uploader or an organization manager or owner may change `attributes` or `accessPrincipals`; an organization client may change only the files it uploaded, the name included. Send `accessPrincipals: null` to drop every restriction and show the file to everyone who can see the organization bucket.
|
|
104
106
|
*/
|
|
105
107
|
updateBucketAttachment(params: {
|
|
106
108
|
path: {
|
package/dist/apis/FilesApi.js
CHANGED
|
@@ -58,7 +58,7 @@ class FilesApi {
|
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
60
60
|
* Delete file
|
|
61
|
-
* Deletes a file-service stored file by stored-file UUID. Gate never handles the file bytes.
|
|
61
|
+
* Deletes a file-service stored file by stored-file UUID. Gate never handles the file bytes. Not available to organization clients: they remove the files they uploaded with `removeBucketAttachment`.
|
|
62
62
|
*/
|
|
63
63
|
async deleteFile(params) {
|
|
64
64
|
return this.client.request({
|
|
@@ -73,7 +73,7 @@ class FilesApi {
|
|
|
73
73
|
}
|
|
74
74
|
/**
|
|
75
75
|
* List bucket attachments
|
|
76
|
-
* Lists the organization's files from every source in one list: files uploaded into an app (`app`), note attachments (`note`) and portal files (`portalPage`, `portalGlobal`, `portalFiles`, `portalBlock`). Each item carries its source `target`, its file `kind` (`image`, `video`, `audio`, `doc`, `archive` or `file`, detected from the mime type), the uploader `userId` (resolve the email and role with the org-users operations), the `size` in bytes, the custom `attributes` and the `accessPrincipals`. Filter by source with `targets`, keep only some apps or other sources with `targetIds` (matched against the item `targetId`; a bare app id needs `targets` set to `app`), drop small files with `sizeFrom`, keep only the files one user uploaded with `uploaderId`, keep only some file types with `kinds`, and match custom metadata with `attributes`, a JSON object of strings sent as a string, such as `{"source":"file-manager"}`, where every given pair must match exactly (`total` follows the same filter). Clients only receive files their access principals or the bucket permissions allow.
|
|
76
|
+
* Lists the organization's files from every source in one list: files uploaded into an app (`app`), note attachments (`note`) and portal files (`portalPage`, `portalGlobal`, `portalFiles`, `portalBlock`). Each item carries its source `target`, its file `kind` (`image`, `video`, `audio`, `doc`, `archive` or `file`, detected from the mime type), the uploader `userId` (resolve the email and role with the org-users operations), the `size` in bytes, the custom `attributes` and the `accessPrincipals`. Filter by source with `targets`, keep only some apps or other sources with `targetIds` (matched against the item `targetId`; a bare app id needs `targets` set to `app`), drop small files with `sizeFrom`, keep only the files added in a date range with `createdFrom` and `createdTo` (unix seconds like `createdAt`, both inclusive, either alone), keep only the files one user uploaded with `uploaderId`, keep only some file types with `kinds`, and match custom metadata with `attributes`, a JSON object of strings sent as a string, such as `{"source":"file-manager"}`, where every given pair must match exactly (`total` follows the same filter). Clients only receive files their access principals or the bucket permissions allow.
|
|
77
77
|
*/
|
|
78
78
|
async listBucketAttachments(params) {
|
|
79
79
|
return this.client.request({
|
|
@@ -88,7 +88,7 @@ class FilesApi {
|
|
|
88
88
|
}
|
|
89
89
|
/**
|
|
90
90
|
* Remove bucket attachment
|
|
91
|
-
* Removes a file of the organization from the organization file listing, whatever its source (app, note or portal). Only the uploader or an organization manager or owner may remove it.
|
|
91
|
+
* Removes a file of the organization from the organization file listing, whatever its source (app, note or portal). Only the uploader or an organization manager or owner may remove it, so an organization client removes only the files it uploaded.
|
|
92
92
|
*/
|
|
93
93
|
async removeBucketAttachment(params) {
|
|
94
94
|
return this.client.request({
|
|
@@ -117,7 +117,7 @@ class FilesApi {
|
|
|
117
117
|
}
|
|
118
118
|
/**
|
|
119
119
|
* Update bucket attachment
|
|
120
|
-
* Renames a bucket attachment or replaces its attributes and accessPrincipals. Works on any file of the organization; `accessPrincipals` only on app files. Only the uploader or an organization manager or owner may change `attributes` or `accessPrincipals
|
|
120
|
+
* Renames a bucket attachment or replaces its attributes and accessPrincipals. Works on any file of the organization; `accessPrincipals` only on app files. Only the uploader or an organization manager or owner may change `attributes` or `accessPrincipals`; an organization client may change only the files it uploaded, the name included. Send `accessPrincipals: null` to drop every restriction and show the file to everyone who can see the organization bucket.
|
|
121
121
|
*/
|
|
122
122
|
async updateBucketAttachment(params) {
|
|
123
123
|
return this.client.request({
|
package/dist/apis/NotesApi.d.ts
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Domain: notes
|
|
6
6
|
*/
|
|
7
7
|
import type { Client } from "../runtime/transport";
|
|
8
|
-
import type { AddWorkspaceMarkdownNoteAttachmentRequestContract, AddWorkspaceMarkdownNoteAttachmentResponseContract, AddWorkspaceNoteAttachmentRequestContract, AddWorkspaceNoteAttachmentResponseContract, AppendWorkspaceMarkdownNoteContentRequestContract, AppendWorkspaceNoteContentRequestContract, CreateWorkspaceMarkdownNoteRequestContract, CreateWorkspaceNoteFolderRequestContract, CreateWorkspaceNoteFolderResponseContract, CreateWorkspaceNoteRequestContract, CreateWorkspaceNoteResponseContract, orgIdInPathRequired, ShareWorkspaceMarkdownNoteRequestContract, ShareWorkspaceMarkdownNoteResponseContract, UnshareWorkspaceMarkdownNoteResponseContract, UpdateWorkspaceMarkdownNoteContentRequestContract, WorkspaceIdInPathRequired, WorkspaceMarkdownNoteResponseContract, WorkspaceNoteContentResponseContract, WorkspaceNoteFolderListResponseContract, WorkspaceNoteIdInPathRequired, WorkspaceNoteListResponseContract, WorkspaceNoteParentIdInQueryOptional } from "../types";
|
|
8
|
+
import type { AddWorkspaceMarkdownNoteAttachmentRequestContract, AddWorkspaceMarkdownNoteAttachmentResponseContract, AddWorkspaceNoteAttachmentRequestContract, AddWorkspaceNoteAttachmentResponseContract, AppendWorkspaceMarkdownNoteContentRequestContract, AppendWorkspaceNoteContentRequestContract, CreateWorkspaceMarkdownNoteRequestContract, CreateWorkspaceNoteFolderRequestContract, CreateWorkspaceNoteFolderResponseContract, CreateWorkspaceNoteRequestContract, CreateWorkspaceNoteResponseContract, orgIdInPathRequired, ShareWorkspaceMarkdownNoteRequestContract, ShareWorkspaceMarkdownNoteResponseContract, UnshareWorkspaceMarkdownNoteResponseContract, UpdateWorkspaceMarkdownNoteContentRequestContract, WorkspaceIdInPathRequired, WorkspaceMarkdownNoteResponseContract, WorkspaceNoteContentResponseContract, WorkspaceNoteFolderListResponseContract, WorkspaceNoteIdInPathRequired, WorkspaceNoteListResponseContract, WorkspaceNoteParentIdInQueryOptional, WorkspaceNoteSearchResponseContract } from "../types";
|
|
9
9
|
export declare class NotesApi {
|
|
10
10
|
private client;
|
|
11
11
|
constructor(client: Client);
|
|
@@ -146,6 +146,22 @@ export declare class NotesApi {
|
|
|
146
146
|
};
|
|
147
147
|
headers?: Record<string, string>;
|
|
148
148
|
}): Promise<WorkspaceNoteListResponseContract>;
|
|
149
|
+
/**
|
|
150
|
+
* Search workspace notes by text
|
|
151
|
+
* Full-text search over note titles and text in one workspace, covering both classic (v2) and markdown (v3) notes. Each hit carries `contentVersion` (`v2` or `markdown_v3`) so the caller knows whether to read it with getWorkspaceNote or getWorkspaceMarkdownNote, plus a `snippet` around the matched words. Pass `parentId` to search only inside that folder and its subfolders. Folders, trashed, encrypted and portal-shared notes are never returned; v3 hits are returned only when the caller also holds `notes.markdown.read`. Ranking is keyword full-text, not semantic. Prefer a real workspace id; when the path workspaceId is `default`, gate resolves it to the organization's default workspace.
|
|
152
|
+
*/
|
|
153
|
+
searchWorkspaceNotes(params: {
|
|
154
|
+
path: {
|
|
155
|
+
orgId: orgIdInPathRequired;
|
|
156
|
+
workspaceId: WorkspaceIdInPathRequired;
|
|
157
|
+
};
|
|
158
|
+
query?: {
|
|
159
|
+
query?: string;
|
|
160
|
+
parentId?: WorkspaceNoteParentIdInQueryOptional;
|
|
161
|
+
limit?: number;
|
|
162
|
+
};
|
|
163
|
+
headers?: Record<string, string>;
|
|
164
|
+
}): Promise<WorkspaceNoteSearchResponseContract>;
|
|
149
165
|
/**
|
|
150
166
|
* Share markdown (v3) note
|
|
151
167
|
* Publishes a v3 markdown note through the existing note-service share flow and returns the share links for the three read-only modes: `ui` (full share page), `rendered` (markdown only) and `raw` (the markdown source as `text/markdown`). note-service creates the security key and enforces the caller's own note access, password and access-control rules — gate mints nothing. Calling it again on an already shared note updates that same share instead of creating a second one. v2 notes are not accepted here; they keep their existing sharing flow.
|
package/dist/apis/NotesApi.js
CHANGED
|
@@ -173,6 +173,21 @@ class NotesApi {
|
|
|
173
173
|
expectedContentType: "application/json",
|
|
174
174
|
});
|
|
175
175
|
}
|
|
176
|
+
/**
|
|
177
|
+
* Search workspace notes by text
|
|
178
|
+
* Full-text search over note titles and text in one workspace, covering both classic (v2) and markdown (v3) notes. Each hit carries `contentVersion` (`v2` or `markdown_v3`) so the caller knows whether to read it with getWorkspaceNote or getWorkspaceMarkdownNote, plus a `snippet` around the matched words. Pass `parentId` to search only inside that folder and its subfolders. Folders, trashed, encrypted and portal-shared notes are never returned; v3 hits are returned only when the caller also holds `notes.markdown.read`. Ranking is keyword full-text, not semantic. Prefer a real workspace id; when the path workspaceId is `default`, gate resolves it to the organization's default workspace.
|
|
179
|
+
*/
|
|
180
|
+
async searchWorkspaceNotes(params) {
|
|
181
|
+
return this.client.request({
|
|
182
|
+
method: "GET",
|
|
183
|
+
path: "/:orgId/workspaces/:workspaceId/notes/search",
|
|
184
|
+
pathParams: params.path,
|
|
185
|
+
query: params.query,
|
|
186
|
+
headers: params.headers,
|
|
187
|
+
opId: "searchWorkspaceNotes",
|
|
188
|
+
expectedContentType: "application/json",
|
|
189
|
+
});
|
|
190
|
+
}
|
|
176
191
|
/**
|
|
177
192
|
* Share markdown (v3) note
|
|
178
193
|
* Publishes a v3 markdown note through the existing note-service share flow and returns the share links for the three read-only modes: `ui` (full share page), `rendered` (markdown only) and `raw` (the markdown source as `text/markdown`). note-service creates the security key and enforces the caller's own note access, password and access-control rules — gate mints nothing. Calling it again on an already shared note updates that same share instead of creating a second one. v2 notes are not accepted here; they keep their existing sharing flow.
|
|
@@ -25,6 +25,24 @@ export interface WorkspaceNoteListQueryContract {
|
|
|
25
25
|
*/
|
|
26
26
|
parentId?: WorkspaceNoteParentIdInQueryOptional;
|
|
27
27
|
}
|
|
28
|
+
export interface WorkspaceNoteSearchHitContract {
|
|
29
|
+
globalId: string;
|
|
30
|
+
title?: string | null;
|
|
31
|
+
parentId?: string | null;
|
|
32
|
+
workspaceId: string;
|
|
33
|
+
/**
|
|
34
|
+
* `markdown_v3` for v3 markdown notes (read them with getWorkspaceMarkdownNote),
|
|
35
|
+
* `v2` for classic notes (read them with getWorkspaceNote).
|
|
36
|
+
*/
|
|
37
|
+
contentVersion: "v2" | "markdown_v3";
|
|
38
|
+
/**
|
|
39
|
+
* Text around the matched words, when the search index returned one.
|
|
40
|
+
*/
|
|
41
|
+
snippet?: string | null;
|
|
42
|
+
}
|
|
43
|
+
export interface WorkspaceNoteSearchResponseContract {
|
|
44
|
+
notes: WorkspaceNoteSearchHitContract[];
|
|
45
|
+
}
|
|
28
46
|
export interface CreateWorkspaceNoteFolderRequestContract {
|
|
29
47
|
title: string;
|
|
30
48
|
/**
|
package/package.json
CHANGED
|
@@ -1,9 +1,88 @@
|
|
|
1
1
|
# Release Notes 2.13.1-sdk.0
|
|
2
2
|
|
|
3
3
|
- Current ref: `HEAD`
|
|
4
|
-
- Previous tag: `v2.13.
|
|
5
|
-
- Generated at: 2026-09-29T14:
|
|
4
|
+
- Previous tag: `v2.13.0`
|
|
5
|
+
- Generated at: 2026-09-29T14:28:28.394Z
|
|
6
6
|
|
|
7
7
|
## Included Drafts
|
|
8
8
|
|
|
9
|
-
-
|
|
9
|
+
- `docs/release-notes/2026-09-25-dashboard-custom-columns.md` - Custom columns on client, member, workspace, and portal lists (NIM-44852)
|
|
10
|
+
- `docs/release-notes/2026-09-29-dashboard-metadata-values.md` - Custom column values on client, member, workspace, and portal lists (NIM-44852)
|
|
11
|
+
|
|
12
|
+
## Summary
|
|
13
|
+
|
|
14
|
+
### Custom columns on client, member, workspace, and portal lists (NIM-44852)
|
|
15
|
+
|
|
16
|
+
`listOrgUsers`, `listWorkspaces`, and `listPortals` now include user-added
|
|
17
|
+
custom columns from the matching existing dashboards. System and template
|
|
18
|
+
columns are omitted. A missing dashboard yields an empty column list and does
|
|
19
|
+
not fail the list.
|
|
20
|
+
|
|
21
|
+
Clients and members are both users, so `listOrgUsers` carries both dashboards:
|
|
22
|
+
`metadata.clients` and `metadata.members`. Workspaces and portals carry
|
|
23
|
+
`metadata.columns` from aliases `workspaces` and `portals`.
|
|
24
|
+
|
|
25
|
+
### Custom column values on client, member, workspace, and portal lists (NIM-44852)
|
|
26
|
+
|
|
27
|
+
`listOrgUsers`, `listWorkspaces`, and `listPortals` now include the cell
|
|
28
|
+
values of user-added dashboard columns. Column descriptions stay in
|
|
29
|
+
`metadata`. Values sit on each entity as `metadataValues`, keyed by column
|
|
30
|
+
`key`. A missing cell is `null`.
|
|
31
|
+
|
|
32
|
+
Clients read the clients dashboard. Every other role on `listOrgUsers` reads
|
|
33
|
+
the members dashboard.
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
## API / SDK Changes
|
|
37
|
+
|
|
38
|
+
### Custom columns on client, member, workspace, and portal lists (NIM-44852)
|
|
39
|
+
|
|
40
|
+
- `OrgUserListResponse.metadata.clients.columns` and `.members.columns`.
|
|
41
|
+
- `OrgWorkspaceListResponse.metadata.columns`.
|
|
42
|
+
- `OrgPortalListResponse.metadata.columns`.
|
|
43
|
+
- Column shape: `{ key, alias, name, customType, hidden, readonly, required }`.
|
|
44
|
+
- No new operation. Existing list fields are unchanged.
|
|
45
|
+
|
|
46
|
+
### Custom column values on client, member, workspace, and portal lists (NIM-44852)
|
|
47
|
+
|
|
48
|
+
- `OrgUserListItem.metadataValues`, `OrgWorkspaceListItem.metadataValues`,
|
|
49
|
+
`OrgPortalListItem.metadataValues`.
|
|
50
|
+
- Create-workspace and nested org-member payloads are unchanged.
|
|
51
|
+
- No new operation.
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
## Consumer Impact
|
|
55
|
+
|
|
56
|
+
### Custom columns on client, member, workspace, and portal lists (NIM-44852)
|
|
57
|
+
|
|
58
|
+
Callers that ignore unknown fields are unaffected. Callers that need extra
|
|
59
|
+
dashboard fields read `metadata` on the list they already call.
|
|
60
|
+
|
|
61
|
+
### Custom column values on client, member, workspace, and portal lists (NIM-44852)
|
|
62
|
+
|
|
63
|
+
Callers that ignore unknown fields are unaffected. Callers that compare list
|
|
64
|
+
items field-for-field now see `metadataValues`.
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
## Verification
|
|
68
|
+
|
|
69
|
+
### Custom columns on client, member, workspace, and portal lists (NIM-44852)
|
|
70
|
+
|
|
71
|
+
- Unit tests cover custom-only filtering and a missing dashboard.
|
|
72
|
+
|
|
73
|
+
### Custom column values on client, member, workspace, and portal lists (NIM-44852)
|
|
74
|
+
|
|
75
|
+
- Unit test maps a wrapped dashboard cell onto `metadataValues` and fills a
|
|
76
|
+
missing cell with `null`.
|
|
77
|
+
- Live dev check of a filled client cell is still pending a deploy.
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
## Follow-ups
|
|
81
|
+
|
|
82
|
+
### Custom columns on client, member, workspace, and portal lists (NIM-44852)
|
|
83
|
+
|
|
84
|
+
- Cell values shipped later as `metadataValues` on each listed entity.
|
|
85
|
+
|
|
86
|
+
### Custom column values on client, member, workspace, and portal lists (NIM-44852)
|
|
87
|
+
|
|
88
|
+
- None.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Release Notes 2.13.1
|
|
2
|
+
|
|
3
|
+
- Current ref: `HEAD`
|
|
4
|
+
- Previous tag: `v2.13.1-sdk.0`
|
|
5
|
+
- Generated at: 2026-09-29T21:24:25.497Z
|
|
6
|
+
|
|
7
|
+
## Included Drafts
|
|
8
|
+
|
|
9
|
+
- `docs/release-notes/2026-09-29-client-files-write.md` - Portal clients can upload files
|
|
10
|
+
- `docs/release-notes/2026-09-29-notes-search.md` - Search notes by their text
|
|
11
|
+
|
|
12
|
+
## Summary
|
|
13
|
+
|
|
14
|
+
### Portal clients can upload files
|
|
15
|
+
|
|
16
|
+
A portal client could not upload through a FuseBase app: the first upload call answered 403
|
|
17
|
+
"Missing required permission: files.write". The client role now holds `files.write`. A client
|
|
18
|
+
may upload and create bucket attachments, and may rename, change or remove only the files it
|
|
19
|
+
uploaded. `deleteFile` is not available to clients.
|
|
20
|
+
|
|
21
|
+
### Search notes by their text
|
|
22
|
+
|
|
23
|
+
MCP clients and AI agents could read and edit notes but had no way to find one by its content.
|
|
24
|
+
`searchWorkspaceNotes` searches note titles and text in one workspace, for classic (v2) and
|
|
25
|
+
markdown (v3) notes, using the full-text search note-service already has.
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
## API / SDK Changes
|
|
29
|
+
|
|
30
|
+
### Portal clients can upload files
|
|
31
|
+
|
|
32
|
+
- Client role permissions: `files.write` added. Visitor stays read-only.
|
|
33
|
+
- `deleteFile` answers 403 when the caller's organization role is client. A stored-file UUID has
|
|
34
|
+
no organization and no uploader to check a client against.
|
|
35
|
+
- `updateBucketAttachment` and `removeBucketAttachment`: no change in Gate. bucket-service
|
|
36
|
+
decides whether the client uploaded the file and its 403 reaches the caller as 403.
|
|
37
|
+
- Op descriptions, MCP `files` prompt (1.15.0), SDK and the Gate files skill reference updated.
|
|
38
|
+
|
|
39
|
+
### Search notes by their text
|
|
40
|
+
|
|
41
|
+
- New op `searchWorkspaceNotes`, `GET /:orgId/workspaces/:workspaceId/notes/search` (`notes.read`).
|
|
42
|
+
Query: `query` (required), `parentId` (search that folder and its subfolders), `limit`
|
|
43
|
+
(1 to 100, default 20; other values answer 400). `workspaceId` accepts `default`.
|
|
44
|
+
- Each hit: `globalId`, `title`, `parentId`, `workspaceId`, `contentVersion` (`v2` or
|
|
45
|
+
`markdown_v3`) and `snippet` around the matched words.
|
|
46
|
+
- Never returned: folders, trashed notes (also notes inside a trashed folder), portal-shared and
|
|
47
|
+
encrypted notes, notes the user cannot read. `markdown_v3` hits need `notes.markdown.read` too.
|
|
48
|
+
- Ranking is keyword full-text, not semantic. No new index.
|
|
49
|
+
- MCP `notes` prompt, SDK `NotesApi`, manifest, OpenAPI and the Gate notes skill reference
|
|
50
|
+
cover the new op.
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
## Consumer Impact
|
|
54
|
+
|
|
55
|
+
### Portal clients can upload files
|
|
56
|
+
|
|
57
|
+
- Same permission name, so deployed apps need no redeploy; an app that lists `files.write` gets
|
|
58
|
+
it for its client users too.
|
|
59
|
+
- Nothing is tightened for owner, manager, member, guest or app service tokens. Clients never
|
|
60
|
+
held `files.write`, so the `deleteFile` refusal takes nothing away from a working app.
|
|
61
|
+
- Client uploads work end to end only with the bucket-service release that lets a client create
|
|
62
|
+
app files (NIM-45207). Before it, a client passes Gate and gets bucket-service's 403, as today.
|
|
63
|
+
|
|
64
|
+
### Search notes by their text
|
|
65
|
+
|
|
66
|
+
- New op; nothing changes for existing callers.
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
## Verification
|
|
70
|
+
|
|
71
|
+
### Portal clients can upload files
|
|
72
|
+
|
|
73
|
+
- Unit: `tests/unit/permissions.test.ts` (client has `files.write`, visitor does not),
|
|
74
|
+
`tests/unit/files-controller.test.ts` (client refused on `deleteFile`, member allowed).
|
|
75
|
+
|
|
76
|
+
### Search notes by their text
|
|
77
|
+
|
|
78
|
+
- Unit: `tests/unit/notes-controller.test.ts` (trash and portal filtering, `root` search scope,
|
|
79
|
+
v3 permission rule, limit applied after filtering, invalid limit). Full unit suite green.
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
## Follow-ups
|
|
83
|
+
|
|
84
|
+
### Portal clients can upload files
|
|
85
|
+
|
|
86
|
+
- NIM-45213: `deleteFile` has no organization or owner check for any caller.
|
|
87
|
+
|
|
88
|
+
### Search notes by their text
|
|
89
|
+
|
|
90
|
+
- Semantic or hybrid ranking, if agents need it, is a separate task.
|
package/release-notes/latest.md
CHANGED
|
@@ -1,9 +1,90 @@
|
|
|
1
|
-
# Release Notes 2.13.1
|
|
1
|
+
# Release Notes 2.13.1
|
|
2
2
|
|
|
3
3
|
- Current ref: `HEAD`
|
|
4
4
|
- Previous tag: `v2.13.1-sdk.0`
|
|
5
|
-
- Generated at: 2026-09-
|
|
5
|
+
- Generated at: 2026-09-29T21:24:25.497Z
|
|
6
6
|
|
|
7
7
|
## Included Drafts
|
|
8
8
|
|
|
9
|
-
-
|
|
9
|
+
- `docs/release-notes/2026-09-29-client-files-write.md` - Portal clients can upload files
|
|
10
|
+
- `docs/release-notes/2026-09-29-notes-search.md` - Search notes by their text
|
|
11
|
+
|
|
12
|
+
## Summary
|
|
13
|
+
|
|
14
|
+
### Portal clients can upload files
|
|
15
|
+
|
|
16
|
+
A portal client could not upload through a FuseBase app: the first upload call answered 403
|
|
17
|
+
"Missing required permission: files.write". The client role now holds `files.write`. A client
|
|
18
|
+
may upload and create bucket attachments, and may rename, change or remove only the files it
|
|
19
|
+
uploaded. `deleteFile` is not available to clients.
|
|
20
|
+
|
|
21
|
+
### Search notes by their text
|
|
22
|
+
|
|
23
|
+
MCP clients and AI agents could read and edit notes but had no way to find one by its content.
|
|
24
|
+
`searchWorkspaceNotes` searches note titles and text in one workspace, for classic (v2) and
|
|
25
|
+
markdown (v3) notes, using the full-text search note-service already has.
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
## API / SDK Changes
|
|
29
|
+
|
|
30
|
+
### Portal clients can upload files
|
|
31
|
+
|
|
32
|
+
- Client role permissions: `files.write` added. Visitor stays read-only.
|
|
33
|
+
- `deleteFile` answers 403 when the caller's organization role is client. A stored-file UUID has
|
|
34
|
+
no organization and no uploader to check a client against.
|
|
35
|
+
- `updateBucketAttachment` and `removeBucketAttachment`: no change in Gate. bucket-service
|
|
36
|
+
decides whether the client uploaded the file and its 403 reaches the caller as 403.
|
|
37
|
+
- Op descriptions, MCP `files` prompt (1.15.0), SDK and the Gate files skill reference updated.
|
|
38
|
+
|
|
39
|
+
### Search notes by their text
|
|
40
|
+
|
|
41
|
+
- New op `searchWorkspaceNotes`, `GET /:orgId/workspaces/:workspaceId/notes/search` (`notes.read`).
|
|
42
|
+
Query: `query` (required), `parentId` (search that folder and its subfolders), `limit`
|
|
43
|
+
(1 to 100, default 20; other values answer 400). `workspaceId` accepts `default`.
|
|
44
|
+
- Each hit: `globalId`, `title`, `parentId`, `workspaceId`, `contentVersion` (`v2` or
|
|
45
|
+
`markdown_v3`) and `snippet` around the matched words.
|
|
46
|
+
- Never returned: folders, trashed notes (also notes inside a trashed folder), portal-shared and
|
|
47
|
+
encrypted notes, notes the user cannot read. `markdown_v3` hits need `notes.markdown.read` too.
|
|
48
|
+
- Ranking is keyword full-text, not semantic. No new index.
|
|
49
|
+
- MCP `notes` prompt, SDK `NotesApi`, manifest, OpenAPI and the Gate notes skill reference
|
|
50
|
+
cover the new op.
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
## Consumer Impact
|
|
54
|
+
|
|
55
|
+
### Portal clients can upload files
|
|
56
|
+
|
|
57
|
+
- Same permission name, so deployed apps need no redeploy; an app that lists `files.write` gets
|
|
58
|
+
it for its client users too.
|
|
59
|
+
- Nothing is tightened for owner, manager, member, guest or app service tokens. Clients never
|
|
60
|
+
held `files.write`, so the `deleteFile` refusal takes nothing away from a working app.
|
|
61
|
+
- Client uploads work end to end only with the bucket-service release that lets a client create
|
|
62
|
+
app files (NIM-45207). Before it, a client passes Gate and gets bucket-service's 403, as today.
|
|
63
|
+
|
|
64
|
+
### Search notes by their text
|
|
65
|
+
|
|
66
|
+
- New op; nothing changes for existing callers.
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
## Verification
|
|
70
|
+
|
|
71
|
+
### Portal clients can upload files
|
|
72
|
+
|
|
73
|
+
- Unit: `tests/unit/permissions.test.ts` (client has `files.write`, visitor does not),
|
|
74
|
+
`tests/unit/files-controller.test.ts` (client refused on `deleteFile`, member allowed).
|
|
75
|
+
|
|
76
|
+
### Search notes by their text
|
|
77
|
+
|
|
78
|
+
- Unit: `tests/unit/notes-controller.test.ts` (trash and portal filtering, `root` search scope,
|
|
79
|
+
v3 permission rule, limit applied after filtering, invalid limit). Full unit suite green.
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
## Follow-ups
|
|
83
|
+
|
|
84
|
+
### Portal clients can upload files
|
|
85
|
+
|
|
86
|
+
- NIM-45213: `deleteFile` has no organization or owner check for any caller.
|
|
87
|
+
|
|
88
|
+
### Search notes by their text
|
|
89
|
+
|
|
90
|
+
- Semantic or hybrid ranking, if agents need it, is a separate task.
|