@nurama/sdk 0.0.0-stage → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/NOTICE +5 -0
- package/README.md +1080 -2
- package/dist/BotClient.d.ts +66 -0
- package/dist/BotClient.d.ts.map +1 -0
- package/dist/BotClient.js +68 -0
- package/dist/BotClient.js.map +1 -0
- package/dist/NuramaClient.d.ts +448 -0
- package/dist/NuramaClient.d.ts.map +1 -0
- package/dist/NuramaClient.js +864 -0
- package/dist/NuramaClient.js.map +1 -0
- package/dist/browser/nurama-bot-sdk.js +11780 -0
- package/dist/browser/nurama-bot-sdk.min.js +1 -0
- package/dist/browser/nurama-sdk.js +11732 -0
- package/dist/browser/nurama-sdk.min.js +1 -0
- package/dist/routes/ai.d.ts +280 -0
- package/dist/routes/ai.d.ts.map +1 -0
- package/dist/routes/ai.js +173 -0
- package/dist/routes/ai.js.map +1 -0
- package/dist/routes/asset.d.ts +493 -0
- package/dist/routes/asset.d.ts.map +1 -0
- package/dist/routes/asset.js +848 -0
- package/dist/routes/asset.js.map +1 -0
- package/dist/routes/auth.d.ts +218 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +454 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/blogPosts.d.ts +17 -0
- package/dist/routes/blogPosts.d.ts.map +1 -0
- package/dist/routes/blogPosts.js +29 -0
- package/dist/routes/blogPosts.js.map +1 -0
- package/dist/routes/board.d.ts +187 -0
- package/dist/routes/board.d.ts.map +1 -0
- package/dist/routes/board.js +270 -0
- package/dist/routes/board.js.map +1 -0
- package/dist/routes/bot.d.ts +147 -0
- package/dist/routes/bot.d.ts.map +1 -0
- package/dist/routes/bot.js +157 -0
- package/dist/routes/bot.js.map +1 -0
- package/dist/routes/chat.d.ts +842 -0
- package/dist/routes/chat.d.ts.map +1 -0
- package/dist/routes/chat.js +863 -0
- package/dist/routes/chat.js.map +1 -0
- package/dist/routes/chatAi.d.ts +51 -0
- package/dist/routes/chatAi.d.ts.map +1 -0
- package/dist/routes/chatAi.js +109 -0
- package/dist/routes/chatAi.js.map +1 -0
- package/dist/routes/config.d.ts +11 -0
- package/dist/routes/config.d.ts.map +1 -0
- package/dist/routes/config.js +24 -0
- package/dist/routes/config.js.map +1 -0
- package/dist/routes/convo.d.ts +169 -0
- package/dist/routes/convo.d.ts.map +1 -0
- package/dist/routes/convo.js +284 -0
- package/dist/routes/convo.js.map +1 -0
- package/dist/routes/credits.d.ts +82 -0
- package/dist/routes/credits.d.ts.map +1 -0
- package/dist/routes/credits.js +49 -0
- package/dist/routes/credits.js.map +1 -0
- package/dist/routes/device.d.ts +74 -0
- package/dist/routes/device.d.ts.map +1 -0
- package/dist/routes/device.js +122 -0
- package/dist/routes/device.js.map +1 -0
- package/dist/routes/folder.d.ts +75 -0
- package/dist/routes/folder.d.ts.map +1 -0
- package/dist/routes/folder.js +99 -0
- package/dist/routes/folder.js.map +1 -0
- package/dist/routes/invite.d.ts +61 -0
- package/dist/routes/invite.d.ts.map +1 -0
- package/dist/routes/invite.js +86 -0
- package/dist/routes/invite.js.map +1 -0
- package/dist/routes/joinLink.d.ts +38 -0
- package/dist/routes/joinLink.d.ts.map +1 -0
- package/dist/routes/joinLink.js +81 -0
- package/dist/routes/joinLink.js.map +1 -0
- package/dist/routes/membership.d.ts +116 -0
- package/dist/routes/membership.d.ts.map +1 -0
- package/dist/routes/membership.js +183 -0
- package/dist/routes/membership.js.map +1 -0
- package/dist/routes/notification.d.ts +103 -0
- package/dist/routes/notification.d.ts.map +1 -0
- package/dist/routes/notification.js +89 -0
- package/dist/routes/notification.js.map +1 -0
- package/dist/routes/payment.d.ts +56 -0
- package/dist/routes/payment.d.ts.map +1 -0
- package/dist/routes/payment.js +78 -0
- package/dist/routes/payment.js.map +1 -0
- package/dist/routes/product.d.ts +43 -0
- package/dist/routes/product.d.ts.map +1 -0
- package/dist/routes/product.js +53 -0
- package/dist/routes/product.js.map +1 -0
- package/dist/routes/project.d.ts +821 -0
- package/dist/routes/project.d.ts.map +1 -0
- package/dist/routes/project.js +1153 -0
- package/dist/routes/project.js.map +1 -0
- package/dist/routes/public.d.ts +269 -0
- package/dist/routes/public.d.ts.map +1 -0
- package/dist/routes/public.js +412 -0
- package/dist/routes/public.js.map +1 -0
- package/dist/routes/scratch.d.ts +70 -0
- package/dist/routes/scratch.d.ts.map +1 -0
- package/dist/routes/scratch.js +67 -0
- package/dist/routes/scratch.js.map +1 -0
- package/dist/routes/settings.d.ts +102 -0
- package/dist/routes/settings.d.ts.map +1 -0
- package/dist/routes/settings.js +94 -0
- package/dist/routes/settings.js.map +1 -0
- package/dist/routes/shortlink.d.ts +79 -0
- package/dist/routes/shortlink.d.ts.map +1 -0
- package/dist/routes/shortlink.js +25 -0
- package/dist/routes/shortlink.js.map +1 -0
- package/dist/routes/socket.d.ts +108 -0
- package/dist/routes/socket.d.ts.map +1 -0
- package/dist/routes/socket.js +555 -0
- package/dist/routes/socket.js.map +1 -0
- package/dist/routes/storage.d.ts +44 -0
- package/dist/routes/storage.d.ts.map +1 -0
- package/dist/routes/storage.js +49 -0
- package/dist/routes/storage.js.map +1 -0
- package/dist/routes/subscription.d.ts +184 -0
- package/dist/routes/subscription.d.ts.map +1 -0
- package/dist/routes/subscription.js +219 -0
- package/dist/routes/subscription.js.map +1 -0
- package/dist/routes/supportChat.d.ts +40 -0
- package/dist/routes/supportChat.d.ts.map +1 -0
- package/dist/routes/supportChat.js +53 -0
- package/dist/routes/supportChat.js.map +1 -0
- package/dist/routes/supportTicket.d.ts +89 -0
- package/dist/routes/supportTicket.d.ts.map +1 -0
- package/dist/routes/supportTicket.js +54 -0
- package/dist/routes/supportTicket.js.map +1 -0
- package/dist/routes/tag.d.ts +72 -0
- package/dist/routes/tag.d.ts.map +1 -0
- package/dist/routes/tag.js +81 -0
- package/dist/routes/tag.js.map +1 -0
- package/dist/routes/task.d.ts +252 -0
- package/dist/routes/task.d.ts.map +1 -0
- package/dist/routes/task.js +284 -0
- package/dist/routes/task.js.map +1 -0
- package/dist/routes/taskRelation.d.ts +80 -0
- package/dist/routes/taskRelation.d.ts.map +1 -0
- package/dist/routes/taskRelation.js +71 -0
- package/dist/routes/taskRelation.js.map +1 -0
- package/dist/routes/token.d.ts +75 -0
- package/dist/routes/token.d.ts.map +1 -0
- package/dist/routes/token.js +51 -0
- package/dist/routes/token.js.map +1 -0
- package/dist/routes/user.d.ts +112 -0
- package/dist/routes/user.d.ts.map +1 -0
- package/dist/routes/user.js +151 -0
- package/dist/routes/user.js.map +1 -0
- package/dist/routes/version.d.ts +42 -0
- package/dist/routes/version.d.ts.map +1 -0
- package/dist/routes/version.js +38 -0
- package/dist/routes/version.js.map +1 -0
- package/dist/routes/webhook.d.ts +170 -0
- package/dist/routes/webhook.d.ts.map +1 -0
- package/dist/routes/webhook.js +173 -0
- package/dist/routes/webhook.js.map +1 -0
- package/dist/routes/workspace.d.ts +120 -0
- package/dist/routes/workspace.d.ts.map +1 -0
- package/dist/routes/workspace.js +199 -0
- package/dist/routes/workspace.js.map +1 -0
- package/dist/utils/uploadSessionManager.d.ts +133 -0
- package/dist/utils/uploadSessionManager.d.ts.map +1 -0
- package/dist/utils/uploadSessionManager.js +321 -0
- package/dist/utils/uploadSessionManager.js.map +1 -0
- package/dist/utils/urlParams.d.ts +35 -0
- package/dist/utils/urlParams.d.ts.map +1 -0
- package/dist/utils/urlParams.js +146 -0
- package/dist/utils/urlParams.js.map +1 -0
- package/dist/version.d.ts +15 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +12 -0
- package/dist/version.js.map +1 -0
- package/package.json +87 -3
- package/src/BotClient.ts +113 -0
- package/src/NuramaClient.ts +1193 -0
- package/src/bot-browser-entry.js +15 -0
- package/src/browser-entry.js +20 -0
- package/src/routes/ai.ts +378 -0
- package/src/routes/asset.ts +1104 -0
- package/src/routes/auth.ts +587 -0
- package/src/routes/blogPosts.ts +29 -0
- package/src/routes/board.ts +403 -0
- package/src/routes/bot.ts +257 -0
- package/src/routes/chat.ts +1292 -0
- package/src/routes/chatAi.ts +125 -0
- package/src/routes/config.ts +31 -0
- package/src/routes/convo.ts +321 -0
- package/src/routes/credits.ts +112 -0
- package/src/routes/device.ts +133 -0
- package/src/routes/folder.ts +154 -0
- package/src/routes/invite.ts +133 -0
- package/src/routes/joinLink.ts +100 -0
- package/src/routes/membership.ts +237 -0
- package/src/routes/notification.ts +166 -0
- package/src/routes/payment.ts +104 -0
- package/src/routes/product.ts +67 -0
- package/src/routes/project.ts +1528 -0
- package/src/routes/public.ts +496 -0
- package/src/routes/scratch.ts +94 -0
- package/src/routes/settings.ts +152 -0
- package/src/routes/shortlink.ts +90 -0
- package/src/routes/socket.ts +739 -0
- package/src/routes/storage.ts +83 -0
- package/src/routes/subscription.ts +307 -0
- package/src/routes/supportChat.ts +62 -0
- package/src/routes/supportTicket.ts +114 -0
- package/src/routes/tag.ts +131 -0
- package/src/routes/task.ts +431 -0
- package/src/routes/taskRelation.ts +125 -0
- package/src/routes/token.ts +113 -0
- package/src/routes/user.ts +214 -0
- package/src/routes/version.ts +62 -0
- package/src/routes/webhook.ts +295 -0
- package/src/routes/workspace.ts +223 -0
- package/src/utils/uploadSessionManager.ts +407 -0
- package/src/utils/urlParams.ts +181 -0
- package/src/version.ts +22 -0
|
@@ -0,0 +1,412 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Defines public route methods for unauthenticated access to public file systems.
|
|
3
|
+
*/
|
|
4
|
+
export default function createPublicMethods(client) {
|
|
5
|
+
return {
|
|
6
|
+
/**
|
|
7
|
+
* Gets public file system details by token.
|
|
8
|
+
* This endpoint does not require authentication - access is controlled by the token.
|
|
9
|
+
*
|
|
10
|
+
* @param {string} token - The 10-character alphanumeric public access token.
|
|
11
|
+
* @returns {Promise<PublicFileSystemDetailsResponse>} The public file system details.
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* ```typescript
|
|
15
|
+
* const publicFileSystem = await nuramaClient.public.getPublicFileSystem('abc123def4');
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
async getPublicFileSystem(token) {
|
|
19
|
+
if (!token)
|
|
20
|
+
throw new Error('token is required.');
|
|
21
|
+
if (token.length !== 10)
|
|
22
|
+
throw new Error('token must be exactly 10 characters long.');
|
|
23
|
+
if (!/^[a-zA-Z0-9]{10}$/.test(token))
|
|
24
|
+
throw new Error('token must contain only alphanumeric characters.');
|
|
25
|
+
return client._request({
|
|
26
|
+
endpoint: `/v1/public/${token}`,
|
|
27
|
+
method: 'GET',
|
|
28
|
+
sendJWT: false, // This is a public endpoint
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
/**
|
|
32
|
+
* Gets public items at the root level of a public file system.
|
|
33
|
+
* This endpoint does not require authentication - access is controlled by the token.
|
|
34
|
+
*
|
|
35
|
+
* @param {string} token - The 10-character alphanumeric public access token.
|
|
36
|
+
* @param {PublicPaginationParams} params - Optional pagination and filtering parameters.
|
|
37
|
+
* @returns {Promise<PublicFileSystemResponse>} Paginated list of public file system items.
|
|
38
|
+
*
|
|
39
|
+
* @example
|
|
40
|
+
* ```typescript
|
|
41
|
+
* const publicItems = await nuramaClient.public.getPublicItems('abc123def4');
|
|
42
|
+
* ```
|
|
43
|
+
*/
|
|
44
|
+
async getPublicItems(token, params) {
|
|
45
|
+
if (!token)
|
|
46
|
+
throw new Error('token is required.');
|
|
47
|
+
if (token.length !== 10)
|
|
48
|
+
throw new Error('token must be exactly 10 characters long.');
|
|
49
|
+
if (!/^[a-zA-Z0-9]{10}$/.test(token))
|
|
50
|
+
throw new Error('token must contain only alphanumeric characters.');
|
|
51
|
+
// Convert arrays to proper format for query params
|
|
52
|
+
const queryParams = params ? {
|
|
53
|
+
...params,
|
|
54
|
+
resourceIds: Array.isArray(params.resourceIds) ? params.resourceIds : (params.resourceIds ? [params.resourceIds] : []),
|
|
55
|
+
resourceSlugs: Array.isArray(params.resourceSlugs) ? params.resourceSlugs : (params.resourceSlugs ? [params.resourceSlugs] : []),
|
|
56
|
+
resourceTags: Array.isArray(params.resourceTags) ? params.resourceTags : (params.resourceTags ? [params.resourceTags] : []),
|
|
57
|
+
mediaTypes: Array.isArray(params.mediaTypes) ? params.mediaTypes : (params.mediaTypes ? [params.mediaTypes] : []),
|
|
58
|
+
} : {};
|
|
59
|
+
return client._request({
|
|
60
|
+
endpoint: `/v1/public/${token}/files`,
|
|
61
|
+
method: 'GET',
|
|
62
|
+
params: queryParams,
|
|
63
|
+
sendJWT: false, // This is a public endpoint
|
|
64
|
+
});
|
|
65
|
+
},
|
|
66
|
+
/**
|
|
67
|
+
* Gets public items at a specific path within a public file system.
|
|
68
|
+
* This endpoint does not require authentication - access is controlled by the token.
|
|
69
|
+
*
|
|
70
|
+
* @param {string} token - The 10-character alphanumeric public access token.
|
|
71
|
+
* @param {string} path - The path within the public file system to retrieve items from.
|
|
72
|
+
* @param {PublicPaginationParams} params - Optional pagination and filtering parameters.
|
|
73
|
+
* @returns {Promise<PublicFileSystemResponse>} Paginated list of public file system items.
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```typescript
|
|
77
|
+
* const items = await nuramaClient.public.getPublicItemsAtPath('abc123def4', 'folder1/subfolder');
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
async getPublicItemsAtPath(token, path, params) {
|
|
81
|
+
if (!token)
|
|
82
|
+
throw new Error('token is required.');
|
|
83
|
+
if (token.length !== 10)
|
|
84
|
+
throw new Error('token must be exactly 10 characters long.');
|
|
85
|
+
if (!/^[a-zA-Z0-9]{10}$/.test(token))
|
|
86
|
+
throw new Error('token must contain only alphanumeric characters.');
|
|
87
|
+
if (path === null || path === undefined)
|
|
88
|
+
throw new Error('path is required.');
|
|
89
|
+
// Remove leading slash if present
|
|
90
|
+
const cleanPath = path.startsWith('/') ? path.substring(1) : path;
|
|
91
|
+
// Convert arrays to proper format for query params
|
|
92
|
+
const queryParams = params ? {
|
|
93
|
+
...params,
|
|
94
|
+
resourceIds: Array.isArray(params.resourceIds) ? params.resourceIds : (params.resourceIds ? [params.resourceIds] : []),
|
|
95
|
+
resourceSlugs: Array.isArray(params.resourceSlugs) ? params.resourceSlugs : (params.resourceSlugs ? [params.resourceSlugs] : []),
|
|
96
|
+
resourceTags: Array.isArray(params.resourceTags) ? params.resourceTags : (params.resourceTags ? [params.resourceTags] : []),
|
|
97
|
+
mediaTypes: Array.isArray(params.mediaTypes) ? params.mediaTypes : (params.mediaTypes ? [params.mediaTypes] : []),
|
|
98
|
+
} : {};
|
|
99
|
+
return client._request({
|
|
100
|
+
endpoint: `/v1/public/${token}/files/${cleanPath}`,
|
|
101
|
+
method: 'GET',
|
|
102
|
+
params: queryParams,
|
|
103
|
+
sendJWT: false, // This is a public endpoint
|
|
104
|
+
});
|
|
105
|
+
},
|
|
106
|
+
/**
|
|
107
|
+
* Downloads public assets by generating signed URLs for the original files.
|
|
108
|
+
* This endpoint does not require authentication - access is controlled by the token.
|
|
109
|
+
*
|
|
110
|
+
* @param {string} token - The 10-character alphanumeric public access token.
|
|
111
|
+
* @param {DownloadPublicAssetsData} downloadData - The asset IDs to download.
|
|
112
|
+
* @returns {Promise<DownloadSignedUrlData[]>} Array of signed download URLs for the requested assets.
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```typescript
|
|
116
|
+
* const downloadUrls = await nuramaClient.public.downloadAssets('abc123def4', {
|
|
117
|
+
* assetIds: ['507f1f77bcf86cd799439011', '507f191e810c19729de860ea']
|
|
118
|
+
* });
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
async downloadAssets(token, downloadData) {
|
|
122
|
+
if (!token)
|
|
123
|
+
throw new Error('token is required.');
|
|
124
|
+
if (token.length !== 10)
|
|
125
|
+
throw new Error('token must be exactly 10 characters long.');
|
|
126
|
+
if (!/^[a-zA-Z0-9]{10}$/.test(token))
|
|
127
|
+
throw new Error('token must contain only alphanumeric characters.');
|
|
128
|
+
if (!downloadData)
|
|
129
|
+
throw new Error('downloadData is required.');
|
|
130
|
+
if (!downloadData.assetIds || !Array.isArray(downloadData.assetIds) || downloadData.assetIds.length === 0) {
|
|
131
|
+
throw new Error('downloadData.assetIds must be a non-empty array.');
|
|
132
|
+
}
|
|
133
|
+
return client._request({
|
|
134
|
+
endpoint: `/v1/public/${token}/download`,
|
|
135
|
+
method: 'POST',
|
|
136
|
+
body: downloadData,
|
|
137
|
+
sendJWT: false, // This is a public endpoint
|
|
138
|
+
});
|
|
139
|
+
},
|
|
140
|
+
// ============================================================================
|
|
141
|
+
// Public Chat Methods
|
|
142
|
+
// ============================================================================
|
|
143
|
+
/**
|
|
144
|
+
* Gets the main public file system chat or a specific chat by ID.
|
|
145
|
+
* This endpoint does not require authentication for read access.
|
|
146
|
+
*
|
|
147
|
+
* @param {string} token - The 10-character alphanumeric public access token.
|
|
148
|
+
* @param {string} [chatId] - Optional specific chat ID to retrieve.
|
|
149
|
+
* @returns {Promise<Chat | null>} The chat object, or null if no main chat exists yet.
|
|
150
|
+
*
|
|
151
|
+
* @example
|
|
152
|
+
* ```typescript
|
|
153
|
+
* // Get main public file system chat
|
|
154
|
+
* const mainChat = await nuramaClient.public.getPublicChat('abc123def4');
|
|
155
|
+
*
|
|
156
|
+
* // Get specific chat by ID
|
|
157
|
+
* const chat = await nuramaClient.public.getPublicChat('abc123def4', 'chat-id-here');
|
|
158
|
+
* ```
|
|
159
|
+
*/
|
|
160
|
+
async getPublicChat(token, chatId) {
|
|
161
|
+
if (!token)
|
|
162
|
+
throw new Error('token is required.');
|
|
163
|
+
if (token.length !== 10)
|
|
164
|
+
throw new Error('token must be exactly 10 characters long.');
|
|
165
|
+
if (!/^[a-zA-Z0-9]{10}$/.test(token))
|
|
166
|
+
throw new Error('token must contain only alphanumeric characters.');
|
|
167
|
+
const endpoint = chatId ? `/v1/public/${token}/chat/${chatId}` : `/v1/public/${token}/chat`;
|
|
168
|
+
return client._request({
|
|
169
|
+
endpoint,
|
|
170
|
+
method: 'GET',
|
|
171
|
+
sendJWT: false, // Read access is public
|
|
172
|
+
});
|
|
173
|
+
},
|
|
174
|
+
/**
|
|
175
|
+
* Gets paginated messages for a public chat.
|
|
176
|
+
* This endpoint does not require authentication for read access.
|
|
177
|
+
*
|
|
178
|
+
* @param {string} token - The 10-character alphanumeric public access token.
|
|
179
|
+
* @param {string} chatId - The ID of the chat to get messages from.
|
|
180
|
+
* @param {GetPublicChatMessagesParams} [params] - Optional pagination parameters.
|
|
181
|
+
* @returns {Promise<PublicChatMessagesResponse>} Paginated list of chat messages.
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```typescript
|
|
185
|
+
* const messages = await nuramaClient.public.getPublicChatMessages('abc123def4', 'chat-id', {
|
|
186
|
+
* limit: 20,
|
|
187
|
+
* paginateReverse: false,
|
|
188
|
+
* });
|
|
189
|
+
* ```
|
|
190
|
+
*/
|
|
191
|
+
async getPublicChatMessages(token, chatId, params) {
|
|
192
|
+
if (!token)
|
|
193
|
+
throw new Error('token is required.');
|
|
194
|
+
if (token.length !== 10)
|
|
195
|
+
throw new Error('token must be exactly 10 characters long.');
|
|
196
|
+
if (!/^[a-zA-Z0-9]{10}$/.test(token))
|
|
197
|
+
throw new Error('token must contain only alphanumeric characters.');
|
|
198
|
+
if (!chatId)
|
|
199
|
+
throw new Error('chatId is required.');
|
|
200
|
+
return client._request({
|
|
201
|
+
endpoint: `/v1/public/${token}/chat/${chatId}/messages`,
|
|
202
|
+
method: 'GET',
|
|
203
|
+
params: params || {},
|
|
204
|
+
sendJWT: false, // Read access is public
|
|
205
|
+
});
|
|
206
|
+
},
|
|
207
|
+
/**
|
|
208
|
+
* Creates a message in an existing public chat.
|
|
209
|
+
* Requires authentication.
|
|
210
|
+
*
|
|
211
|
+
* @param {string} token - The 10-character alphanumeric public access token.
|
|
212
|
+
* @param {string} chatId - The ID of the chat to post to.
|
|
213
|
+
* @param {CreatePublicChatMessageRequest} data - The message data.
|
|
214
|
+
* @returns {Promise<ChatMessage>} The created message.
|
|
215
|
+
*
|
|
216
|
+
* @example
|
|
217
|
+
* ```typescript
|
|
218
|
+
* const message = await nuramaClient.public.createPublicChatMessage('abc123def4', 'chat-id', {
|
|
219
|
+
* content: 'Hello world!',
|
|
220
|
+
* });
|
|
221
|
+
* ```
|
|
222
|
+
*/
|
|
223
|
+
async createPublicChatMessage(token, chatId, data) {
|
|
224
|
+
if (!token)
|
|
225
|
+
throw new Error('token is required.');
|
|
226
|
+
if (token.length !== 10)
|
|
227
|
+
throw new Error('token must be exactly 10 characters long.');
|
|
228
|
+
if (!/^[a-zA-Z0-9]{10}$/.test(token))
|
|
229
|
+
throw new Error('token must contain only alphanumeric characters.');
|
|
230
|
+
if (!chatId)
|
|
231
|
+
throw new Error('chatId is required.');
|
|
232
|
+
if (!data)
|
|
233
|
+
throw new Error('data is required.');
|
|
234
|
+
return client._request({
|
|
235
|
+
endpoint: `/v1/public/${token}/chat/${chatId}/messages`,
|
|
236
|
+
method: 'POST',
|
|
237
|
+
body: data,
|
|
238
|
+
sendJWT: 'optional', // Authenticated caller keeps identity; anonymous allowed when the release opts in
|
|
239
|
+
});
|
|
240
|
+
},
|
|
241
|
+
/**
|
|
242
|
+
* Creates a message on the main public topic chat.
|
|
243
|
+
* If no main chat exists for this public file system, one is created (lazy creation).
|
|
244
|
+
* Requires authentication.
|
|
245
|
+
*
|
|
246
|
+
* @param {string} token - The 10-character alphanumeric public access token.
|
|
247
|
+
* @param {CreatePublicChatMessageRequest} data - The message data.
|
|
248
|
+
* @returns {Promise<CreatePublicAssetChatMessageResponse>} The chat and created message.
|
|
249
|
+
*
|
|
250
|
+
* @example
|
|
251
|
+
* ```typescript
|
|
252
|
+
* // This creates the main chat if it doesn't exist and posts the first message
|
|
253
|
+
* const { chat, message } = await nuramaClient.public.createPublicTopicChatMessage('abc123def4', {
|
|
254
|
+
* content: 'First comment on this public file system!',
|
|
255
|
+
* });
|
|
256
|
+
* ```
|
|
257
|
+
*/
|
|
258
|
+
async createPublicTopicChatMessage(token, data) {
|
|
259
|
+
if (!token)
|
|
260
|
+
throw new Error('token is required.');
|
|
261
|
+
if (token.length !== 10)
|
|
262
|
+
throw new Error('token must be exactly 10 characters long.');
|
|
263
|
+
if (!/^[a-zA-Z0-9]{10}$/.test(token))
|
|
264
|
+
throw new Error('token must contain only alphanumeric characters.');
|
|
265
|
+
if (!data)
|
|
266
|
+
throw new Error('data is required.');
|
|
267
|
+
return client._request({
|
|
268
|
+
endpoint: `/v1/public/${token}/chat/messages`,
|
|
269
|
+
method: 'POST',
|
|
270
|
+
body: data,
|
|
271
|
+
sendJWT: 'optional', // Authenticated caller keeps identity; anonymous allowed when the release opts in
|
|
272
|
+
});
|
|
273
|
+
},
|
|
274
|
+
/**
|
|
275
|
+
* Gets an asset with its public chat in the context of a public file system.
|
|
276
|
+
* This endpoint does not require authentication for read access.
|
|
277
|
+
*
|
|
278
|
+
* @param {string} token - The 10-character alphanumeric public access token.
|
|
279
|
+
* @param {string} assetId - The ID of the asset to retrieve.
|
|
280
|
+
* @returns {Promise<PublicAssetResponse>} The asset with its public chat (or null if no chat exists).
|
|
281
|
+
*
|
|
282
|
+
* @example
|
|
283
|
+
* ```typescript
|
|
284
|
+
* const asset = await nuramaClient.public.getPublicAsset('abc123def4', 'asset-id');
|
|
285
|
+
* if (asset.chats.public) {
|
|
286
|
+
* console.log('Asset has public chat:', asset.chats.public.id);
|
|
287
|
+
* }
|
|
288
|
+
* ```
|
|
289
|
+
*/
|
|
290
|
+
async getPublicAsset(token, assetId) {
|
|
291
|
+
if (!token)
|
|
292
|
+
throw new Error('token is required.');
|
|
293
|
+
if (token.length !== 10)
|
|
294
|
+
throw new Error('token must be exactly 10 characters long.');
|
|
295
|
+
if (!/^[a-zA-Z0-9]{10}$/.test(token))
|
|
296
|
+
throw new Error('token must contain only alphanumeric characters.');
|
|
297
|
+
if (!assetId)
|
|
298
|
+
throw new Error('assetId is required.');
|
|
299
|
+
return client._request({
|
|
300
|
+
endpoint: `/v1/public/${token}/assets/${assetId}`,
|
|
301
|
+
method: 'GET',
|
|
302
|
+
sendJWT: false, // Read access is public
|
|
303
|
+
});
|
|
304
|
+
},
|
|
305
|
+
/**
|
|
306
|
+
* Creates a message on an asset's public chat.
|
|
307
|
+
* If no public chat exists for this asset in this public file system, one is created (lazy creation).
|
|
308
|
+
* Requires authentication.
|
|
309
|
+
*
|
|
310
|
+
* @param {string} token - The 10-character alphanumeric public access token.
|
|
311
|
+
* @param {string} assetId - The ID of the asset to post to.
|
|
312
|
+
* @param {CreatePublicChatMessageRequest} data - The message data.
|
|
313
|
+
* @returns {Promise<CreatePublicAssetChatMessageResponse>} The chat and created message.
|
|
314
|
+
*
|
|
315
|
+
* @example
|
|
316
|
+
* ```typescript
|
|
317
|
+
* // This creates the chat if it doesn't exist and posts the first message
|
|
318
|
+
* const { chat, message } = await nuramaClient.public.createPublicAssetChatMessage('abc123def4', 'asset-id', {
|
|
319
|
+
* content: 'First comment on this asset!',
|
|
320
|
+
* });
|
|
321
|
+
* ```
|
|
322
|
+
*/
|
|
323
|
+
async createPublicAssetChatMessage(token, assetId, data) {
|
|
324
|
+
if (!token)
|
|
325
|
+
throw new Error('token is required.');
|
|
326
|
+
if (token.length !== 10)
|
|
327
|
+
throw new Error('token must be exactly 10 characters long.');
|
|
328
|
+
if (!/^[a-zA-Z0-9]{10}$/.test(token))
|
|
329
|
+
throw new Error('token must contain only alphanumeric characters.');
|
|
330
|
+
if (!assetId)
|
|
331
|
+
throw new Error('assetId is required.');
|
|
332
|
+
if (!data)
|
|
333
|
+
throw new Error('data is required.');
|
|
334
|
+
return client._request({
|
|
335
|
+
endpoint: `/v1/public/${token}/assets/${assetId}/messages`,
|
|
336
|
+
method: 'POST',
|
|
337
|
+
body: data,
|
|
338
|
+
sendJWT: 'optional', // Authenticated caller keeps identity; anonymous allowed when the release opts in
|
|
339
|
+
});
|
|
340
|
+
},
|
|
341
|
+
// ========================================================================
|
|
342
|
+
// Public asset links (/public-download)
|
|
343
|
+
// ========================================================================
|
|
344
|
+
/**
|
|
345
|
+
* Resolve a public asset-link token to the minimal file info the download page shows.
|
|
346
|
+
* Public endpoint; no authentication.
|
|
347
|
+
* @param {string} token - The public asset-link token.
|
|
348
|
+
* @returns {Promise<ResolvePublicDownloadResponse>} File name, media type and link status.
|
|
349
|
+
* @throws {Error} 'token is required.' when `token` is falsy.
|
|
350
|
+
*/
|
|
351
|
+
async resolvePublicDownload(token) {
|
|
352
|
+
if (!token)
|
|
353
|
+
throw new Error('token is required.');
|
|
354
|
+
return client._request({
|
|
355
|
+
method: 'GET',
|
|
356
|
+
endpoint: `/v1/public-download/${token}`,
|
|
357
|
+
sendJWT: false,
|
|
358
|
+
});
|
|
359
|
+
},
|
|
360
|
+
/**
|
|
361
|
+
* Get a short-lived signed download URL for a public asset-link token.
|
|
362
|
+
* Public endpoint; fails with 403 for embed-only links.
|
|
363
|
+
* @param {string} token - The public asset-link token.
|
|
364
|
+
* @returns {Promise<PublicDownloadUrlResponse>} The signed URL and its expiry.
|
|
365
|
+
* @throws {Error} 'token is required.' when `token` is falsy.
|
|
366
|
+
*/
|
|
367
|
+
async getPublicDownloadUrl(token) {
|
|
368
|
+
if (!token)
|
|
369
|
+
throw new Error('token is required.');
|
|
370
|
+
return client._request({
|
|
371
|
+
method: 'GET',
|
|
372
|
+
endpoint: `/v1/public-download/${token}/download`,
|
|
373
|
+
sendJWT: false,
|
|
374
|
+
});
|
|
375
|
+
},
|
|
376
|
+
/**
|
|
377
|
+
* Get the HLS stream and fallback media key paths for the embeddable player.
|
|
378
|
+
* Public endpoint; fails with 403 for download-only links.
|
|
379
|
+
* @param {string} token - The public asset-link token.
|
|
380
|
+
* @returns {Promise<PublicEmbedFilesResponse>} Stream and fallback key paths.
|
|
381
|
+
* @throws {Error} 'token is required.' when `token` is falsy.
|
|
382
|
+
*/
|
|
383
|
+
async getPublicEmbedFiles(token) {
|
|
384
|
+
if (!token)
|
|
385
|
+
throw new Error('token is required.');
|
|
386
|
+
return client._request({
|
|
387
|
+
method: 'GET',
|
|
388
|
+
endpoint: `/v1/public-download/${token}/embed-files`,
|
|
389
|
+
sendJWT: false,
|
|
390
|
+
});
|
|
391
|
+
},
|
|
392
|
+
/**
|
|
393
|
+
* Record a play event from the embed player for a public asset link.
|
|
394
|
+
* Public endpoint; no authentication. The API responds 204.
|
|
395
|
+
* @param {string} token - The public asset-link token.
|
|
396
|
+
* @param {object} body - `{ eventType: 'play_started' | 'play_completed' }`.
|
|
397
|
+
* @returns {Promise<void>} Resolves once recorded.
|
|
398
|
+
* @throws {Error} 'token is required.' when `token` is falsy.
|
|
399
|
+
*/
|
|
400
|
+
async recordAccessActivity(token, body) {
|
|
401
|
+
if (!token)
|
|
402
|
+
throw new Error('token is required.');
|
|
403
|
+
await client._request({
|
|
404
|
+
method: 'POST',
|
|
405
|
+
endpoint: `/v1/public-download/${token}/access-activity`,
|
|
406
|
+
body,
|
|
407
|
+
sendJWT: false,
|
|
408
|
+
});
|
|
409
|
+
},
|
|
410
|
+
};
|
|
411
|
+
}
|
|
412
|
+
//# sourceMappingURL=public.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public.js","sourceRoot":"","sources":["../../src/routes/public.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import NuramaClient from '../NuramaClient.js';
|
|
2
|
+
export interface CompleteUploadBody {
|
|
3
|
+
uploadId: string;
|
|
4
|
+
parts: Array<{
|
|
5
|
+
ETag: string;
|
|
6
|
+
PartNumber: number;
|
|
7
|
+
}>;
|
|
8
|
+
}
|
|
9
|
+
export interface CompleteUploadResponse {
|
|
10
|
+
id: string;
|
|
11
|
+
url: string | null;
|
|
12
|
+
}
|
|
13
|
+
export interface PromoteBody {
|
|
14
|
+
/** Optional rename — lands on `Asset.name`. Defaults to a row-id-derived name. */
|
|
15
|
+
fileName?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface PromoteResponse {
|
|
18
|
+
asset: unknown;
|
|
19
|
+
/**
|
|
20
|
+
* `true` when the scratch row was already promoted on a prior call
|
|
21
|
+
* (e.g. the same revision was Attached-to-chat earlier and the
|
|
22
|
+
* chat-send pipeline ran the promote synchronously). The returned
|
|
23
|
+
* `asset` is the existing one. The FE should treat this as a no-op
|
|
24
|
+
* for "newly added" UX (toast copy, list-refresh side effects) while
|
|
25
|
+
* still surfacing the asset.
|
|
26
|
+
*/
|
|
27
|
+
alreadyPromoted: boolean;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Scratch — platform-wide temporary object-storage with explicit lifecycle.
|
|
31
|
+
*
|
|
32
|
+
* There is NO public surface for creating scratch rows or minting
|
|
33
|
+
* upload URLs. Parent processes (e.g. AI Revision) initiate the
|
|
34
|
+
* multipart upload server-side and return the
|
|
35
|
+
* `{ scratchId, uploadId, key, urls[] }` bundle in their own response
|
|
36
|
+
* payload. The FE uploads each part directly against its signed URL
|
|
37
|
+
* (same pattern as asset uploads), then calls `completeUpload` here to
|
|
38
|
+
* finalise.
|
|
39
|
+
*
|
|
40
|
+
* `completeUpload` mirrors `nuramaClient.asset.completeUpload`:
|
|
41
|
+
* the body is the same `{ uploadId, parts }` shape, the server runs the
|
|
42
|
+
* S3-compatible `CompleteMultipartUploadCommand`, and (for scratch
|
|
43
|
+
* specifically) HEADs the resulting object, increments workspace
|
|
44
|
+
* storage usage, and writes the audit row.
|
|
45
|
+
*/
|
|
46
|
+
export default function createScratchMethods(client: NuramaClient): {
|
|
47
|
+
/**
|
|
48
|
+
* Finish a multipart upload for a scratch row. Same `{ uploadId,
|
|
49
|
+
* parts }` body the asset complete-upload route accepts. Server
|
|
50
|
+
* runs `CompleteMultipartUploadCommand` against the media bucket,
|
|
51
|
+
* HEADs the object for size, increments workspace storage usage,
|
|
52
|
+
* writes the audit row, and flips status pendingUpload → active.
|
|
53
|
+
* Creator-only.
|
|
54
|
+
*/
|
|
55
|
+
completeUpload(scratchId: string, data: CompleteUploadBody): Promise<CompleteUploadResponse>;
|
|
56
|
+
/**
|
|
57
|
+
* Promote a scratch row to a real Asset. Creator-only — only the
|
|
58
|
+
* user who created the scratch row can call this. Destination is
|
|
59
|
+
* derived server-side from the row itself:
|
|
60
|
+
* - row has `projectId` → asset created in that project
|
|
61
|
+
* - row has only workspace → asset created at the workspace
|
|
62
|
+
*
|
|
63
|
+
* No body fields for destination on purpose: the FE doesn't get to
|
|
64
|
+
* claim a scratch belongs to a different workspace / project. The
|
|
65
|
+
* only optional input is `fileName` to override the asset's
|
|
66
|
+
* user-facing name.
|
|
67
|
+
*/
|
|
68
|
+
promote(scratchId: string, data?: PromoteBody): Promise<PromoteResponse>;
|
|
69
|
+
};
|
|
70
|
+
//# sourceMappingURL=scratch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch.d.ts","sourceRoot":"","sources":["../../src/routes/scratch.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,oBAAoB,CAAC;AAE9C,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpD;AAED,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,OAAO,CAAC;IACf;;;;;;;OAOG;IACH,eAAe,EAAE,OAAO,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,MAAM,EAAE,YAAY;IAE7D;;;;;;;OAOG;8BAC6B,MAAM,QAAQ,kBAAkB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAclG;;;;;;;;;;;OAWG;uBACsB,MAAM,SAAQ,WAAW,GAAQ,OAAO,CAAC,eAAe,CAAC;EAUrF"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scratch — platform-wide temporary object-storage with explicit lifecycle.
|
|
3
|
+
*
|
|
4
|
+
* There is NO public surface for creating scratch rows or minting
|
|
5
|
+
* upload URLs. Parent processes (e.g. AI Revision) initiate the
|
|
6
|
+
* multipart upload server-side and return the
|
|
7
|
+
* `{ scratchId, uploadId, key, urls[] }` bundle in their own response
|
|
8
|
+
* payload. The FE uploads each part directly against its signed URL
|
|
9
|
+
* (same pattern as asset uploads), then calls `completeUpload` here to
|
|
10
|
+
* finalise.
|
|
11
|
+
*
|
|
12
|
+
* `completeUpload` mirrors `nuramaClient.asset.completeUpload`:
|
|
13
|
+
* the body is the same `{ uploadId, parts }` shape, the server runs the
|
|
14
|
+
* S3-compatible `CompleteMultipartUploadCommand`, and (for scratch
|
|
15
|
+
* specifically) HEADs the resulting object, increments workspace
|
|
16
|
+
* storage usage, and writes the audit row.
|
|
17
|
+
*/
|
|
18
|
+
export default function createScratchMethods(client) {
|
|
19
|
+
return {
|
|
20
|
+
/**
|
|
21
|
+
* Finish a multipart upload for a scratch row. Same `{ uploadId,
|
|
22
|
+
* parts }` body the asset complete-upload route accepts. Server
|
|
23
|
+
* runs `CompleteMultipartUploadCommand` against the media bucket,
|
|
24
|
+
* HEADs the object for size, increments workspace storage usage,
|
|
25
|
+
* writes the audit row, and flips status pendingUpload → active.
|
|
26
|
+
* Creator-only.
|
|
27
|
+
*/
|
|
28
|
+
async completeUpload(scratchId, data) {
|
|
29
|
+
if (!scratchId)
|
|
30
|
+
throw new Error('scratchId is required.');
|
|
31
|
+
if (!data?.uploadId)
|
|
32
|
+
throw new Error('uploadId is required.');
|
|
33
|
+
if (!Array.isArray(data?.parts) || data.parts.length === 0) {
|
|
34
|
+
throw new Error('parts is required.');
|
|
35
|
+
}
|
|
36
|
+
return client._request({
|
|
37
|
+
endpoint: `/v1/scratch/${encodeURIComponent(scratchId)}/complete-upload`,
|
|
38
|
+
method: 'POST',
|
|
39
|
+
body: data,
|
|
40
|
+
sendJWT: true,
|
|
41
|
+
});
|
|
42
|
+
},
|
|
43
|
+
/**
|
|
44
|
+
* Promote a scratch row to a real Asset. Creator-only — only the
|
|
45
|
+
* user who created the scratch row can call this. Destination is
|
|
46
|
+
* derived server-side from the row itself:
|
|
47
|
+
* - row has `projectId` → asset created in that project
|
|
48
|
+
* - row has only workspace → asset created at the workspace
|
|
49
|
+
*
|
|
50
|
+
* No body fields for destination on purpose: the FE doesn't get to
|
|
51
|
+
* claim a scratch belongs to a different workspace / project. The
|
|
52
|
+
* only optional input is `fileName` to override the asset's
|
|
53
|
+
* user-facing name.
|
|
54
|
+
*/
|
|
55
|
+
async promote(scratchId, data = {}) {
|
|
56
|
+
if (!scratchId)
|
|
57
|
+
throw new Error('scratchId is required.');
|
|
58
|
+
return client._request({
|
|
59
|
+
endpoint: `/v1/scratch/${encodeURIComponent(scratchId)}/promote`,
|
|
60
|
+
method: 'POST',
|
|
61
|
+
body: data,
|
|
62
|
+
sendJWT: true,
|
|
63
|
+
});
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=scratch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scratch.js","sourceRoot":"","sources":["../../src/routes/scratch.ts"],"names":[],"mappings":"AA8BA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,OAAO,UAAU,oBAAoB,CAAC,MAAoB;IAC/D,OAAO;QACL;;;;;;;WAOG;QACH,KAAK,CAAC,cAAc,CAAC,SAAiB,EAAE,IAAwB;YAC9D,IAAI,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC1D,IAAI,CAAC,IAAI,EAAE,QAAQ;gBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAC;YAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3D,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;YACxC,CAAC;YACD,OAAO,MAAM,CAAC,QAAQ,CAAC;gBACrB,QAAQ,EAAE,eAAe,kBAAkB,CAAC,SAAS,CAAC,kBAAkB;gBACxE,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED;;;;;;;;;;;WAWG;QACH,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,OAAoB,EAAE;YACrD,IAAI,CAAC,SAAS;gBAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;YAC1D,OAAO,MAAM,CAAC,QAAQ,CAAC;gBACrB,QAAQ,EAAE,eAAe,kBAAkB,CAAC,SAAS,CAAC,UAAU;gBAChE,MAAM,EAAE,MAAM;gBACd,IAAI,EAAE,IAAI;gBACV,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|