2023-07-25 19:37:04 +02:00
const { reqBody , multiUserMode , userFromSession } = require ( "../utils/http" ) ;
2023-06-08 06:31:35 +02:00
const { Workspace } = require ( "../models/workspace" ) ;
const { Document } = require ( "../models/documents" ) ;
const { DocumentVectors } = require ( "../models/vectors" ) ;
const { WorkspaceChats } = require ( "../models/workspaceChats" ) ;
const { getVectorDbClass } = require ( "../utils/helpers" ) ;
2023-06-17 01:01:27 +02:00
const { setupMulter } = require ( "../utils/files/multer" ) ;
2023-07-25 19:37:04 +02:00
const { validatedRequest } = require ( "../utils/middleware/validatedRequest" ) ;
2023-08-15 02:42:17 +02:00
const { Telemetry } = require ( "../models/telemetry" ) ;
2024-01-22 23:14:01 +01:00
const {
flexUserRoleValid ,
ROLES ,
} = require ( "../utils/middleware/multiUserProtected" ) ;
[FEAT] Automated audit logging (#667)
* WIP event logging - new table for events and new settings view for viewing
* WIP add logging
* UI for log rows
* rename files to Logging to prevent getting gitignore
* add metadata for all logging events and colored badges in logs page
* remove unneeded comment
* cleanup namespace for logging
* clean up backend calls
* update logging to show to => from settings changes
* add logging for invitations, created, deleted, and accepted
* add logging for user created, updated, suspended, or removed
* add logging for workspace deleted
* add logging for chat logs exported
* add logging for API keys, LLM, embedder, vector db, embed chat, and reset button
* modify event logs
* update to event log types
* simplify rendering of event badges
---------
Co-authored-by: timothycarambat <rambat1010@gmail.com>
2024-02-07 00:21:40 +01:00
const { EventLogs } = require ( "../models/eventLogs" ) ;
2024-02-06 20:24:33 +01:00
const {
WorkspaceSuggestedMessages ,
} = require ( "../models/workspacesSuggestedMessages" ) ;
2024-02-13 20:33:05 +01:00
const { validWorkspaceSlug } = require ( "../utils/middleware/validWorkspace" ) ;
2024-02-14 21:32:07 +01:00
const { convertToChatHistory } = require ( "../utils/helpers/chat/responses" ) ;
2024-02-17 01:32:25 +01:00
const { CollectorApi } = require ( "../utils/collectorApi" ) ;
2023-06-17 01:01:27 +02:00
const { handleUploads } = setupMulter ( ) ;
2024-03-12 19:36:59 +01:00
const { setupPfpUploads } = require ( "../utils/files/multer" ) ;
const { normalizePath } = require ( "../utils/files" ) ;
const { handlePfpUploads } = setupPfpUploads ( ) ;
const path = require ( "path" ) ;
const fs = require ( "fs" ) ;
const {
determineWorkspacePfpFilepath ,
fetchPfp ,
} = require ( "../utils/files/pfp" ) ;
2023-06-04 04:28:07 +02:00
function workspaceEndpoints ( app ) {
if ( ! app ) return ;
2024-03-12 19:36:59 +01:00
const responseCache = new Map ( ) ;
2023-11-13 23:51:16 +01:00
app . post (
"/workspace/new" ,
2024-01-22 23:14:01 +01:00
[ validatedRequest , flexUserRoleValid ( [ ROLES . admin , ROLES . manager ] ) ] ,
2023-11-13 23:51:16 +01:00
async ( request , response ) => {
try {
const user = await userFromSession ( request , response ) ;
const { name = null , onboardingComplete = false } = reqBody ( request ) ;
const { workspace , message } = await Workspace . new ( name , user ? . id ) ;
await Telemetry . sendTelemetry (
"workspace_created" ,
{
multiUserMode : multiUserMode ( response ) ,
LLMSelection : process . env . LLM _PROVIDER || "openai" ,
2023-12-07 17:53:37 +01:00
Embedder : process . env . EMBEDDING _ENGINE || "inherit" ,
2023-11-13 23:51:16 +01:00
VectorDbSelection : process . env . VECTOR _DB || "pinecone" ,
} ,
user ? . id
) ;
[FEAT] Automated audit logging (#667)
* WIP event logging - new table for events and new settings view for viewing
* WIP add logging
* UI for log rows
* rename files to Logging to prevent getting gitignore
* add metadata for all logging events and colored badges in logs page
* remove unneeded comment
* cleanup namespace for logging
* clean up backend calls
* update logging to show to => from settings changes
* add logging for invitations, created, deleted, and accepted
* add logging for user created, updated, suspended, or removed
* add logging for workspace deleted
* add logging for chat logs exported
* add logging for API keys, LLM, embedder, vector db, embed chat, and reset button
* modify event logs
* update to event log types
* simplify rendering of event badges
---------
Co-authored-by: timothycarambat <rambat1010@gmail.com>
2024-02-07 00:21:40 +01:00
await EventLogs . logEvent (
"workspace_created" ,
{
workspaceName : workspace ? . name || "Unknown Workspace" ,
} ,
user ? . id
) ;
2023-11-13 23:51:16 +01:00
if ( onboardingComplete === true )
await Telemetry . sendTelemetry ( "onboarding_complete" ) ;
2023-10-26 22:49:01 +02:00
2023-11-13 23:51:16 +01:00
response . status ( 200 ) . json ( { workspace , message } ) ;
} catch ( e ) {
console . log ( e . message , e ) ;
response . sendStatus ( 500 ) . end ( ) ;
}
2023-06-08 22:13:48 +02:00
}
2023-11-13 23:51:16 +01:00
) ;
2023-06-04 04:28:07 +02:00
2023-07-25 19:37:04 +02:00
app . post (
"/workspace/:slug/update" ,
2024-01-22 23:14:01 +01:00
[ validatedRequest , flexUserRoleValid ( [ ROLES . admin , ROLES . manager ] ) ] ,
2023-07-25 19:37:04 +02:00
async ( request , response ) => {
try {
const user = await userFromSession ( request , response ) ;
const { slug = null } = request . params ;
const data = reqBody ( request ) ;
const currWorkspace = multiUserMode ( response )
2023-09-28 23:00:03 +02:00
? await Workspace . getWithUser ( user , { slug } )
: await Workspace . get ( { slug } ) ;
2023-07-25 19:37:04 +02:00
if ( ! currWorkspace ) {
response . sendStatus ( 400 ) . end ( ) ;
return ;
}
2024-03-19 07:33:09 +01:00
if (
! currWorkspace . metaResponse &&
! currWorkspace . metaResponseSettings
) {
metaResponseDefaultSettings . inputs . config . systemPrompt . openAiPrompt =
currWorkspace . openAiPrompt || "" ;
data . metaResponseSettings = JSON . stringify (
metaResponseDefaultSettings
) ;
await EventLogs . logEvent (
"workspace_meta_response_enabled" ,
{
workspaceName : currWorkspace ? . name || "Unknown Workspace" ,
} ,
user ? . id
) ;
}
2023-07-25 19:37:04 +02:00
const { workspace , message } = await Workspace . update (
currWorkspace . id ,
data
) ;
response . status ( 200 ) . json ( { workspace , message } ) ;
} catch ( e ) {
console . log ( e . message , e ) ;
response . sendStatus ( 500 ) . end ( ) ;
2023-06-15 08:12:59 +02:00
}
}
2023-07-25 19:37:04 +02:00
) ;
2023-06-15 08:12:59 +02:00
2023-06-17 01:01:27 +02:00
app . post (
"/workspace/:slug/upload" ,
2024-01-22 23:14:01 +01:00
[ validatedRequest , flexUserRoleValid ( [ ROLES . admin , ROLES . manager ] ) ] ,
2023-06-17 01:01:27 +02:00
handleUploads . single ( "file" ) ,
2023-08-23 04:18:47 +02:00
async function ( request , response ) {
2024-02-17 01:32:25 +01:00
const Collector = new CollectorApi ( ) ;
2023-06-17 01:01:27 +02:00
const { originalname } = request . file ;
2024-02-17 01:32:25 +01:00
const processingOnline = await Collector . online ( ) ;
2023-06-17 01:01:27 +02:00
if ( ! processingOnline ) {
2023-08-23 04:18:47 +02:00
response
. status ( 500 )
. json ( {
success : false ,
2023-12-15 00:14:56 +01:00
error : ` Document processing API is not online. Document ${ originalname } will not be processed automatically. ` ,
2023-08-23 04:18:47 +02:00
} )
. end ( ) ;
2023-08-25 02:57:35 +02:00
return ;
2023-06-17 01:01:27 +02:00
}
2024-02-17 01:32:25 +01:00
const { success , reason } = await Collector . processDocument ( originalname ) ;
2023-06-17 01:01:27 +02:00
if ( ! success ) {
2023-08-23 04:18:47 +02:00
response . status ( 500 ) . json ( { success : false , error : reason } ) . end ( ) ;
2023-08-25 02:57:35 +02:00
return ;
2023-06-17 01:01:27 +02:00
}
2024-02-17 01:32:25 +01:00
Collector . log (
2023-06-17 01:01:27 +02:00
` Document ${ originalname } uploaded processed and successfully. It is now available in documents. `
) ;
2023-08-15 02:42:17 +02:00
await Telemetry . sendTelemetry ( "document_uploaded" ) ;
[FEAT] Automated audit logging (#667)
* WIP event logging - new table for events and new settings view for viewing
* WIP add logging
* UI for log rows
* rename files to Logging to prevent getting gitignore
* add metadata for all logging events and colored badges in logs page
* remove unneeded comment
* cleanup namespace for logging
* clean up backend calls
* update logging to show to => from settings changes
* add logging for invitations, created, deleted, and accepted
* add logging for user created, updated, suspended, or removed
* add logging for workspace deleted
* add logging for chat logs exported
* add logging for API keys, LLM, embedder, vector db, embed chat, and reset button
* modify event logs
* update to event log types
* simplify rendering of event badges
---------
Co-authored-by: timothycarambat <rambat1010@gmail.com>
2024-02-07 00:21:40 +01:00
await EventLogs . logEvent (
"document_uploaded" ,
{
documentName : originalname ,
} ,
response . locals ? . user ? . id
) ;
2023-08-23 04:18:47 +02:00
response . status ( 200 ) . json ( { success : true , error : null } ) ;
2023-11-17 02:15:01 +01:00
}
) ;
app . post (
"/workspace/:slug/upload-link" ,
2024-01-22 23:14:01 +01:00
[ validatedRequest , flexUserRoleValid ( [ ROLES . admin , ROLES . manager ] ) ] ,
2023-11-17 02:15:01 +01:00
async ( request , response ) => {
2024-02-17 01:32:25 +01:00
const Collector = new CollectorApi ( ) ;
2023-11-17 02:15:01 +01:00
const { link = "" } = reqBody ( request ) ;
2024-02-17 01:32:25 +01:00
const processingOnline = await Collector . online ( ) ;
2023-11-17 02:15:01 +01:00
if ( ! processingOnline ) {
response
. status ( 500 )
. json ( {
success : false ,
2023-12-15 00:14:56 +01:00
error : ` Document processing API is not online. Link ${ link } will not be processed automatically. ` ,
2023-11-17 02:15:01 +01:00
} )
. end ( ) ;
return ;
}
2024-02-17 01:32:25 +01:00
const { success , reason } = await Collector . processLink ( link ) ;
2023-11-17 02:15:01 +01:00
if ( ! success ) {
response . status ( 500 ) . json ( { success : false , error : reason } ) . end ( ) ;
return ;
}
2024-02-17 01:32:25 +01:00
Collector . log (
2023-11-17 02:15:01 +01:00
` Link ${ link } uploaded processed and successfully. It is now available in documents. `
) ;
await Telemetry . sendTelemetry ( "link_uploaded" ) ;
[FEAT] Automated audit logging (#667)
* WIP event logging - new table for events and new settings view for viewing
* WIP add logging
* UI for log rows
* rename files to Logging to prevent getting gitignore
* add metadata for all logging events and colored badges in logs page
* remove unneeded comment
* cleanup namespace for logging
* clean up backend calls
* update logging to show to => from settings changes
* add logging for invitations, created, deleted, and accepted
* add logging for user created, updated, suspended, or removed
* add logging for workspace deleted
* add logging for chat logs exported
* add logging for API keys, LLM, embedder, vector db, embed chat, and reset button
* modify event logs
* update to event log types
* simplify rendering of event badges
---------
Co-authored-by: timothycarambat <rambat1010@gmail.com>
2024-02-07 00:21:40 +01:00
await EventLogs . logEvent (
"link_uploaded" ,
{ link } ,
response . locals ? . user ? . id
) ;
2023-11-17 02:15:01 +01:00
response . status ( 200 ) . json ( { success : true , error : null } ) ;
2023-06-17 01:01:27 +02:00
}
) ;
2023-07-25 19:37:04 +02:00
app . post (
"/workspace/:slug/update-embeddings" ,
2024-01-22 23:14:01 +01:00
[ validatedRequest , flexUserRoleValid ( [ ROLES . admin , ROLES . manager ] ) ] ,
2023-07-25 19:37:04 +02:00
async ( request , response ) => {
try {
const user = await userFromSession ( request , response ) ;
const { slug = null } = request . params ;
const { adds = [ ] , deletes = [ ] } = reqBody ( request ) ;
const currWorkspace = multiUserMode ( response )
2023-09-28 23:00:03 +02:00
? await Workspace . getWithUser ( user , { slug } )
: await Workspace . get ( { slug } ) ;
2023-07-25 19:37:04 +02:00
if ( ! currWorkspace ) {
response . sendStatus ( 400 ) . end ( ) ;
return ;
}
[FEAT] Automated audit logging (#667)
* WIP event logging - new table for events and new settings view for viewing
* WIP add logging
* UI for log rows
* rename files to Logging to prevent getting gitignore
* add metadata for all logging events and colored badges in logs page
* remove unneeded comment
* cleanup namespace for logging
* clean up backend calls
* update logging to show to => from settings changes
* add logging for invitations, created, deleted, and accepted
* add logging for user created, updated, suspended, or removed
* add logging for workspace deleted
* add logging for chat logs exported
* add logging for API keys, LLM, embedder, vector db, embed chat, and reset button
* modify event logs
* update to event log types
* simplify rendering of event badges
---------
Co-authored-by: timothycarambat <rambat1010@gmail.com>
2024-02-07 00:21:40 +01:00
await Document . removeDocuments (
currWorkspace ,
deletes ,
response . locals ? . user ? . id
) ;
2024-01-18 20:40:48 +01:00
const { failedToEmbed = [ ] , errors = [ ] } = await Document . addDocuments (
2023-10-26 19:57:37 +02:00
currWorkspace ,
[FEAT] Automated audit logging (#667)
* WIP event logging - new table for events and new settings view for viewing
* WIP add logging
* UI for log rows
* rename files to Logging to prevent getting gitignore
* add metadata for all logging events and colored badges in logs page
* remove unneeded comment
* cleanup namespace for logging
* clean up backend calls
* update logging to show to => from settings changes
* add logging for invitations, created, deleted, and accepted
* add logging for user created, updated, suspended, or removed
* add logging for workspace deleted
* add logging for chat logs exported
* add logging for API keys, LLM, embedder, vector db, embed chat, and reset button
* modify event logs
* update to event log types
* simplify rendering of event badges
---------
Co-authored-by: timothycarambat <rambat1010@gmail.com>
2024-02-07 00:21:40 +01:00
adds ,
response . locals ? . user ? . id
2023-10-26 19:57:37 +02:00
) ;
2023-09-28 23:00:03 +02:00
const updatedWorkspace = await Workspace . get ( { id : currWorkspace . id } ) ;
2023-10-26 19:57:37 +02:00
response . status ( 200 ) . json ( {
workspace : updatedWorkspace ,
message :
2024-01-18 20:40:48 +01:00
failedToEmbed . length > 0
? ` ${ failedToEmbed . length } documents failed to add. \n \n ${ errors
2024-03-19 07:33:09 +01:00
. map ( ( msg ) => ` ${ msg } ` )
. join ( "\n\n" ) } `
2023-10-26 19:57:37 +02:00
: null ,
} ) ;
2023-07-25 19:37:04 +02:00
} catch ( e ) {
console . log ( e . message , e ) ;
response . sendStatus ( 500 ) . end ( ) ;
2023-06-08 22:13:48 +02:00
}
}
2023-07-25 19:37:04 +02:00
) ;
2023-06-04 04:28:07 +02:00
2023-07-25 19:37:04 +02:00
app . delete (
"/workspace/:slug" ,
2024-01-22 23:14:01 +01:00
[ validatedRequest , flexUserRoleValid ( [ ROLES . admin , ROLES . manager ] ) ] ,
2023-07-25 19:37:04 +02:00
async ( request , response ) => {
2023-06-08 22:13:48 +02:00
try {
2023-07-25 19:37:04 +02:00
const { slug = "" } = request . params ;
const user = await userFromSession ( request , response ) ;
const VectorDb = getVectorDbClass ( ) ;
const workspace = multiUserMode ( response )
2023-09-28 23:00:03 +02:00
? await Workspace . getWithUser ( user , { slug } )
: await Workspace . get ( { slug } ) ;
2023-07-25 19:37:04 +02:00
if ( ! workspace ) {
response . sendStatus ( 400 ) . end ( ) ;
return ;
}
2023-09-28 23:00:03 +02:00
await WorkspaceChats . delete ( { workspaceId : Number ( workspace . id ) } ) ;
2023-07-25 19:37:04 +02:00
await DocumentVectors . deleteForWorkspace ( workspace . id ) ;
2023-09-28 23:00:03 +02:00
await Document . delete ( { workspaceId : Number ( workspace . id ) } ) ;
await Workspace . delete ( { id : Number ( workspace . id ) } ) ;
[FEAT] Automated audit logging (#667)
* WIP event logging - new table for events and new settings view for viewing
* WIP add logging
* UI for log rows
* rename files to Logging to prevent getting gitignore
* add metadata for all logging events and colored badges in logs page
* remove unneeded comment
* cleanup namespace for logging
* clean up backend calls
* update logging to show to => from settings changes
* add logging for invitations, created, deleted, and accepted
* add logging for user created, updated, suspended, or removed
* add logging for workspace deleted
* add logging for chat logs exported
* add logging for API keys, LLM, embedder, vector db, embed chat, and reset button
* modify event logs
* update to event log types
* simplify rendering of event badges
---------
Co-authored-by: timothycarambat <rambat1010@gmail.com>
2024-02-07 00:21:40 +01:00
await EventLogs . logEvent (
"workspace_deleted" ,
{
workspaceName : workspace ? . name || "Unknown Workspace" ,
} ,
response . locals ? . user ? . id
) ;
2023-07-25 19:37:04 +02:00
try {
await VectorDb [ "delete-namespace" ] ( { namespace : slug } ) ;
} catch ( e ) {
console . error ( e . message ) ;
}
response . sendStatus ( 200 ) . end ( ) ;
2023-06-08 22:13:48 +02:00
} catch ( e ) {
2023-07-25 19:37:04 +02:00
console . log ( e . message , e ) ;
response . sendStatus ( 500 ) . end ( ) ;
2023-06-08 22:13:48 +02:00
}
2023-06-08 06:31:35 +02:00
}
2023-07-25 19:37:04 +02:00
) ;
2023-06-04 04:28:07 +02:00
2024-01-22 23:14:01 +01:00
app . get (
"/workspaces" ,
[ validatedRequest , flexUserRoleValid ( [ ROLES . all ] ) ] ,
async ( request , response ) => {
try {
const user = await userFromSession ( request , response ) ;
const workspaces = multiUserMode ( response )
? await Workspace . whereWithUser ( user )
: await Workspace . where ( ) ;
2023-07-25 19:37:04 +02:00
2024-01-22 23:14:01 +01:00
response . status ( 200 ) . json ( { workspaces } ) ;
} catch ( e ) {
console . log ( e . message , e ) ;
response . sendStatus ( 500 ) . end ( ) ;
}
2023-06-08 22:13:48 +02:00
}
2024-01-22 23:14:01 +01:00
) ;
2023-06-04 04:28:07 +02:00
2024-01-22 23:14:01 +01:00
app . get (
"/workspace/:slug" ,
[ validatedRequest , flexUserRoleValid ( [ ROLES . all ] ) ] ,
async ( request , response ) => {
try {
const { slug } = request . params ;
const user = await userFromSession ( request , response ) ;
const workspace = multiUserMode ( response )
? await Workspace . getWithUser ( user , { slug } )
: await Workspace . get ( { slug } ) ;
2023-07-25 19:37:04 +02:00
2024-01-22 23:14:01 +01:00
response . status ( 200 ) . json ( { workspace } ) ;
} catch ( e ) {
console . log ( e . message , e ) ;
response . sendStatus ( 500 ) . end ( ) ;
}
2023-06-08 22:13:48 +02:00
}
2024-01-22 23:14:01 +01:00
) ;
2023-06-04 04:28:07 +02:00
2023-07-25 19:37:04 +02:00
app . get (
"/workspace/:slug/chats" ,
2024-01-22 23:14:01 +01:00
[ validatedRequest , flexUserRoleValid ( [ ROLES . all ] ) ] ,
2023-07-25 19:37:04 +02:00
async ( request , response ) => {
try {
const { slug } = request . params ;
const user = await userFromSession ( request , response ) ;
const workspace = multiUserMode ( response )
2023-09-28 23:00:03 +02:00
? await Workspace . getWithUser ( user , { slug } )
: await Workspace . get ( { slug } ) ;
2023-07-25 19:37:04 +02:00
if ( ! workspace ) {
response . sendStatus ( 400 ) . end ( ) ;
return ;
}
const history = multiUserMode ( response )
? await WorkspaceChats . forWorkspaceByUser ( workspace . id , user . id )
: await WorkspaceChats . forWorkspace ( workspace . id ) ;
response . status ( 200 ) . json ( { history : convertToChatHistory ( history ) } ) ;
} catch ( e ) {
console . log ( e . message , e ) ;
response . sendStatus ( 500 ) . end ( ) ;
2023-06-08 22:13:48 +02:00
}
}
2023-07-25 19:37:04 +02:00
) ;
2024-02-06 20:24:33 +01:00
2024-02-13 20:33:05 +01:00
app . post (
"/workspace/:slug/chat-feedback/:chatId" ,
[ validatedRequest , flexUserRoleValid ( [ ROLES . all ] ) , validWorkspaceSlug ] ,
async ( request , response ) => {
try {
const { chatId } = request . params ;
const { feedback = null } = reqBody ( request ) ;
const existingChat = await WorkspaceChats . get ( {
id : Number ( chatId ) ,
workspaceId : response . locals . workspace . id ,
} ) ;
if ( ! existingChat ) {
response . status ( 404 ) . end ( ) ;
return ;
}
const result = await WorkspaceChats . updateFeedbackScore (
chatId ,
feedback
) ;
response . status ( 200 ) . json ( { success : result } ) ;
} catch ( error ) {
console . error ( "Error updating chat feedback:" , error ) ;
response . status ( 500 ) . end ( ) ;
}
}
) ;
2024-02-06 20:24:33 +01:00
app . get (
"/workspace/:slug/suggested-messages" ,
[ validatedRequest , flexUserRoleValid ( [ ROLES . all ] ) ] ,
async function ( request , response ) {
try {
const { slug } = request . params ;
const suggestedMessages =
await WorkspaceSuggestedMessages . getMessages ( slug ) ;
response . status ( 200 ) . json ( { success : true , suggestedMessages } ) ;
} catch ( error ) {
console . error ( "Error fetching suggested messages:" , error ) ;
response
. status ( 500 )
. json ( { success : false , message : "Internal server error" } ) ;
}
}
) ;
app . post (
"/workspace/:slug/suggested-messages" ,
[ validatedRequest , flexUserRoleValid ( [ ROLES . admin , ROLES . manager ] ) ] ,
async ( request , response ) => {
try {
const { messages = [ ] } = reqBody ( request ) ;
const { slug } = request . params ;
if ( ! Array . isArray ( messages ) ) {
return response . status ( 400 ) . json ( {
success : false ,
message : "Invalid message format. Expected an array of messages." ,
} ) ;
}
await WorkspaceSuggestedMessages . saveAll ( messages , slug ) ;
return response . status ( 200 ) . json ( {
success : true ,
message : "Suggested messages saved successfully." ,
} ) ;
} catch ( error ) {
console . error ( "Error processing the suggested messages:" , error ) ;
response . status ( 500 ) . json ( {
success : true ,
message : "Error saving the suggested messages." ,
} ) ;
}
}
) ;
2024-02-21 22:15:45 +01:00
app . post (
"/workspace/:slug/update-pin" ,
[
validatedRequest ,
flexUserRoleValid ( [ ROLES . admin , ROLES . manager ] ) ,
validWorkspaceSlug ,
] ,
async ( request , response ) => {
try {
const { docPath , pinStatus = false } = reqBody ( request ) ;
const workspace = response . locals . workspace ;
const document = await Document . get ( {
workspaceId : workspace . id ,
docpath : docPath ,
} ) ;
if ( ! document ) return response . sendStatus ( 404 ) . end ( ) ;
await Document . update ( document . id , { pinned : pinStatus } ) ;
return response . status ( 200 ) . end ( ) ;
} catch ( error ) {
console . error ( "Error processing the pin status update:" , error ) ;
return response . status ( 500 ) . end ( ) ;
}
}
) ;
2024-03-12 19:36:59 +01:00
app . get (
"/workspace/:slug/pfp" ,
[ validatedRequest , flexUserRoleValid ( [ ROLES . all ] ) ] ,
async function ( request , response ) {
try {
const { slug } = request . params ;
const cachedResponse = responseCache . get ( slug ) ;
if ( cachedResponse ) {
response . writeHead ( 200 , {
"Content-Type" : cachedResponse . mime || "image/png" ,
} ) ;
response . end ( cachedResponse . buffer ) ;
return ;
}
const pfpPath = await determineWorkspacePfpFilepath ( slug ) ;
if ( ! pfpPath ) {
response . sendStatus ( 204 ) . end ( ) ;
return ;
}
const { found , buffer , mime } = fetchPfp ( pfpPath ) ;
if ( ! found ) {
response . sendStatus ( 204 ) . end ( ) ;
return ;
}
responseCache . set ( slug , { buffer , mime } ) ;
response . writeHead ( 200 , {
"Content-Type" : mime || "image/png" ,
} ) ;
response . end ( buffer ) ;
return ;
} catch ( error ) {
console . error ( "Error processing the logo request:" , error ) ;
response . status ( 500 ) . json ( { message : "Internal server error" } ) ;
}
}
) ;
app . post (
"/workspace/:slug/upload-pfp" ,
[ validatedRequest , flexUserRoleValid ( [ ROLES . admin , ROLES . manager ] ) ] ,
handlePfpUploads . single ( "file" ) ,
async function ( request , response ) {
try {
const { slug } = request . params ;
const uploadedFileName = request . randomFileName ;
if ( ! uploadedFileName ) {
return response . status ( 400 ) . json ( { message : "File upload failed." } ) ;
}
const workspaceRecord = await Workspace . get ( {
slug ,
} ) ;
const oldPfpFilename = workspaceRecord . pfpFilename ;
if ( oldPfpFilename ) {
const oldPfpPath = path . join (
_ _dirname ,
` ../storage/assets/pfp/ ${ normalizePath (
workspaceRecord . pfpFilename
) } `
) ;
if ( fs . existsSync ( oldPfpPath ) ) fs . unlinkSync ( oldPfpPath ) ;
}
const { workspace , message } = await Workspace . update (
workspaceRecord . id ,
{
pfpFilename : uploadedFileName ,
}
) ;
return response . status ( workspace ? 200 : 500 ) . json ( {
message : workspace
? "Profile picture uploaded successfully."
: message ,
} ) ;
} catch ( error ) {
console . error ( "Error processing the profile picture upload:" , error ) ;
response . status ( 500 ) . json ( { message : "Internal server error" } ) ;
}
}
) ;
app . delete (
"/workspace/:slug/remove-pfp" ,
[ validatedRequest , flexUserRoleValid ( [ ROLES . admin , ROLES . manager ] ) ] ,
async function ( request , response ) {
try {
const { slug } = request . params ;
const workspaceRecord = await Workspace . get ( {
slug ,
} ) ;
const oldPfpFilename = workspaceRecord . pfpFilename ;
if ( oldPfpFilename ) {
const oldPfpPath = path . join (
_ _dirname ,
` ../storage/assets/pfp/ ${ normalizePath ( oldPfpFilename ) } `
) ;
if ( fs . existsSync ( oldPfpPath ) ) fs . unlinkSync ( oldPfpPath ) ;
}
const { workspace , message } = await Workspace . update (
workspaceRecord . id ,
{
pfpFilename : null ,
}
) ;
// Clear the cache
responseCache . delete ( slug ) ;
return response . status ( workspace ? 200 : 500 ) . json ( {
message : workspace
? "Profile picture removed successfully."
: message ,
} ) ;
} catch ( error ) {
console . error ( "Error processing the profile picture removal:" , error ) ;
response . status ( 500 ) . json ( { message : "Internal server error" } ) ;
}
}
) ;
2023-06-04 04:28:07 +02:00
}
2024-03-19 07:33:09 +01:00
const metaResponseDefaultSettings = {
inputs : {
isEnabled : false ,
config : {
systemPrompt : {
isEnabled : false ,
content : "" ,
openAiPrompt : "" ,
overrideSystemPrompt : false ,
suggestionsList : [
{
title : "" ,
content : "" ,
} ,
] ,
canEdit : [ "admin" , "manager" ] ,
} ,
promptSchema : {
content : "" ,
suggestionsList : [
{
title : "" ,
content : "" ,
} ,
] ,
overrideWorkspacePrompt : false ,
canEdit : [ "admin" , "manager" ] ,
} ,
components : {
dropDownMenu : {
isEnabled : false ,
options : [ ] ,
2024-03-21 06:59:22 +01:00
description : "Drop Down menu best to select between functional derisions, ie: continue, Repeat or Move to a new sequence.. etc" ,
infoLink : "https://docs.anythingllm.com/docs/meta-response/inputs/dropdown-menu" ,
2024-03-19 07:33:09 +01:00
} ,
optionsList : {
isEnabled : false ,
options : [ ] ,
2024-03-21 06:59:22 +01:00
description : "Best suited for expansion on a topic" ,
infoLink : "https://docs.anythingllm.com/docs/meta-response/inputs/options-list" ,
2024-03-19 07:33:09 +01:00
} ,
optionsButtons : {
isEnabled : false ,
options : [ ] ,
2024-03-21 06:59:22 +01:00
description : "Chat will provide answers with the LLM's general knowledge and document context that is found." ,
infoLink : "https://docs.anythingllm.com/docs/meta-response/inputs/options-buttons" ,
2024-03-19 07:33:09 +01:00
} ,
multiSelectCheckboxes : {
isEnabled : false ,
options : [ ] ,
2024-03-21 06:59:22 +01:00
description : "Chat will provide answers with the LLM's general knowledge and document context that is found." ,
infoLink : "https://docs.anythingllm.com/docs/meta-response/inputs/multi-select-checkboxes" ,
2024-03-19 07:33:09 +01:00
} ,
} ,
} ,
permissions : [ "user" ] ,
2024-03-20 01:37:38 +01:00
description : "Traditionally, interaction with AnythingLLM occurs through a text area. Meta Inputs enhance this by offering alternative interaction methods, including option buttons, multi-select checkboxes, sliders, drop-down menus, and date/time selectors. To utilize these components, you'll need to guide the LLM on incorporating them into its responses with a specific schema" ,
2024-03-21 06:59:22 +01:00
infoLink : "https://docs.anythingllm.com/docs/meta-response/inputs" ,
2024-03-19 07:33:09 +01:00
} ,
sentiments : {
isEnabled : false ,
config : {
2024-03-20 01:37:38 +01:00
systemPrompt : {
2024-03-19 07:33:09 +01:00
isEnabled : false ,
2024-03-20 01:37:38 +01:00
content : "" ,
openAiPrompt : "" ,
overrideSystemPrompt : false ,
suggestionsList : [
{
title : "" ,
content : "" ,
} ,
] ,
canEdit : [ "admin" , "manager" ] ,
} ,
promptSchema : {
content : "" ,
suggestionsList : [
{
title : "" ,
content : "" ,
} ,
] ,
overrideWorkspacePrompt : false ,
canEdit : [ "admin" , "manager" ] ,
} ,
components : {
dropDownMenu : {
isEnabled : false ,
options : [ ] ,
2024-03-19 07:33:09 +01:00
2024-03-20 01:37:38 +01:00
} ,
optionsList : {
isEnabled : false ,
options : [ ] ,
} ,
optionsButtons : {
isEnabled : false ,
options : [ ] ,
} ,
multiSelectCheckboxes : {
isEnabled : false ,
options : [ ] ,
} ,
2024-03-19 07:33:09 +01:00
} ,
} ,
permissions : [ "user" ] ,
2024-03-20 01:37:38 +01:00
description : "Activate to enable the AI to analyze and adapt its responses based on the emotional tone of the conversation, enhancing interaction personalization" ,
2024-03-21 06:59:22 +01:00
infoLink : "https://docs.anythingllm.com/docs/meta-response/sentiments" ,
2024-03-19 07:33:09 +01:00
} ,
avatars : {
isEnabled : false ,
config : {
2024-03-20 01:37:38 +01:00
systemPrompt : {
isEnabled : false ,
content : "" ,
openAiPrompt : "" ,
overrideSystemPrompt : false ,
suggestionsList : [
{
title : "" ,
content : "" ,
} ,
] ,
canEdit : [ "admin" , "manager" ] ,
} ,
promptSchema : {
content : "" ,
suggestionsList : [
{
title : "" ,
content : "" ,
} ,
] ,
overrideWorkspacePrompt : false ,
canEdit : [ "admin" , "manager" ] ,
} ,
components : {
dropDownMenu : {
isEnabled : false ,
options : [ ] ,
} ,
optionsList : {
isEnabled : false ,
options : [ ] ,
} ,
optionsButtons : {
isEnabled : false ,
options : [ ] ,
} ,
multiSelectCheckboxes : {
isEnabled : false ,
options : [ ] ,
} ,
} ,
2024-03-19 07:33:09 +01:00
} ,
permissions : [ "user" ] ,
2024-03-20 01:37:38 +01:00
description : "Enable avatars to reflect user sentiments, allowing the AI to visually empathize and convey understanding through changes in its profile image based on the meta object's sentiment data." ,
2024-03-21 06:59:22 +01:00
infoLink : "https://docs.anythingllm.com/docs/meta-response/avatars" ,
2024-03-19 07:33:09 +01:00
} ,
} ;
2023-06-08 06:31:35 +02:00
module . exports = { workspaceEndpoints } ;