* initialize * expand tool result text limit | add syntax highlighting and json formatting to tool result rendering * fix onError jsdoc * lint * fix unread icon * route protection * improve form handling for NewJobModal * safeJsonParse * remove unneeded comments * remove trycatch * add truncateText helper * add explicit fallback value tos safeJsonParse * add shared cron constant and helpers * reduce frontend indirection * use isLight to compute syntax highlighting theme * remove dead code * remove forJob and make job limit to 50 * create recomputeNextRunAt helper method * add comment about nextRunAt recomputation * add job queue and concurrency control to scheduled jobs * use p-queue * change default max concurrent value to 1 * add comment explaining internal scheduling system * add recomputeNextRunAt on boot * add generated documents to run details * Modify toolsOverride functionality where no tools selected means no tools are given to the agent add a select all/deselect all toggle button for easily selecting all tools in the cerate job form * create usePolling hook * add polling to scheduled jobs and scheduled job runs pages * add cron generation feature in job form * remove cron generation feature | add cron builder feature | add max active scheduled jobs limit * set MAX_ACTIVE to null * replace hour and minute input fields with input with type time * simplify * organize components * move components to bottom of page component * change Generated Documents to Generated Files * add i18n to cronstrue * add i18n * add type="button" to button elements * refactor fileSource retrieval logic * one scheduled job run can have status "running" * add protection of file retrieveal from scheduled job in multiuser mode * fix comments * make job status default to queued * add queued status * fix bug with result trace rendering * store timeout ref and clearTimeout once race settles * remove unneeded handlerPromise tracking * move imports to top level * refactor hardcoded paths to path resolve functions * implement new job form design * simplify * fix button styles * fix runJob bug * implement styles for scheduled jobs page * apply dark mode figma styles * delete unused translation key * implement light mode for new new job modal, run history, and run details * lint * fix light mode scroll bar in tool call card * adjust table header contrast * fix type in subtitle * kill workers when job is in-flight before deleting job * add border-none to buttons * change locale time to iso string * import BackgroundService module level | instatiate backgroundService singltone once and reuse across handlers * add p-queue, @breejs/later and cron-validate as core deps * parse cron expression to a builder state once * add theme to day buttons in cron builder * fix stale tools selection caption * flip popover when popover clips screen height * make ScheduleJob.trigger() await the run insertion | disable run now button if job is in flight * regen table * refactor generated file card * refactor frontend * remove logs * major refactor for tool picking, fix bree/later bug * combine action endpoints, move contine to method * fix unoptimized query with include + take + order * fix dangerous use, refactor job to utils * add copy content to text response * improve notification system subscription for browser * remove unused translations * prevent gen-file cleanup job from deleting active job file generated references * rich text copy * Scheduled Jobs: Translations (#5482) * add locales for scheduled jobs * i18n --------- Co-authored-by: Timothy Carambat <rambat1010@gmail.com> * add config flag with UI notice * update README * telemetry datapoints * Always use UTC on backend, convert to local in frontend * fix tz render * Add job killing * cleanup thinking text in job notifications and break out reasoning in response text. Also hide zero metrics since that is useless * Port generatedFile schema to the normalized workspace chat `outputs` file format so porting to thread is simple and implem between chats <> jobs is 1:1 * what the fuck * compiled bug * fixed thinking oddity in complied frontend * supress multi-toast * fix duration call * Revert "fix duration call" This reverts commit 0491bc71f4223e65ea4046561b15b268fefb8da2. * revert and reapply fix --------- Co-authored-by: Timothy Carambat <rambat1010@gmail.com>
175 lines
5.9 KiB
JavaScript
175 lines
5.9 KiB
JavaScript
process.env.NODE_ENV === "development"
|
|
? require("dotenv").config({ path: `.env.${process.env.NODE_ENV}` })
|
|
: require("dotenv").config();
|
|
|
|
require("./utils/logger")();
|
|
const express = require("express");
|
|
const bodyParser = require("body-parser");
|
|
const cors = require("cors");
|
|
const path = require("path");
|
|
const { reqBody } = require("./utils/http");
|
|
const { systemEndpoints } = require("./endpoints/system");
|
|
const { workspaceEndpoints } = require("./endpoints/workspaces");
|
|
const { chatEndpoints } = require("./endpoints/chat");
|
|
const { embeddedEndpoints } = require("./endpoints/embed");
|
|
const { embedManagementEndpoints } = require("./endpoints/embedManagement");
|
|
const { getVectorDbClass } = require("./utils/helpers");
|
|
const { adminEndpoints } = require("./endpoints/admin");
|
|
const { inviteEndpoints } = require("./endpoints/invite");
|
|
const { utilEndpoints } = require("./endpoints/utils");
|
|
const { developerEndpoints } = require("./endpoints/api");
|
|
const { extensionEndpoints } = require("./endpoints/extensions");
|
|
const { bootHTTP, bootSSL } = require("./utils/boot");
|
|
const { workspaceThreadEndpoints } = require("./endpoints/workspaceThreads");
|
|
const { documentEndpoints } = require("./endpoints/document");
|
|
const { agentWebsocket } = require("./endpoints/agentWebsocket");
|
|
const {
|
|
agentSkillWhitelistEndpoints,
|
|
} = require("./endpoints/agentSkillWhitelist");
|
|
const { agentFileServerEndpoints } = require("./endpoints/agentFileServer");
|
|
const { experimentalEndpoints } = require("./endpoints/experimental");
|
|
const { browserExtensionEndpoints } = require("./endpoints/browserExtension");
|
|
const { communityHubEndpoints } = require("./endpoints/communityHub");
|
|
const { agentFlowEndpoints } = require("./endpoints/agentFlows");
|
|
const { mcpServersEndpoints } = require("./endpoints/mcpServers");
|
|
const { mobileEndpoints } = require("./endpoints/mobile");
|
|
const { webPushEndpoints } = require("./endpoints/webPush");
|
|
const { telegramEndpoints } = require("./endpoints/telegram");
|
|
const { scheduledJobEndpoints } = require("./endpoints/scheduledJobs");
|
|
const {
|
|
outlookAgentEndpoints,
|
|
} = require("./endpoints/utils/outlookAgentUtils");
|
|
const {
|
|
googleAgentSkillEndpoints,
|
|
} = require("./endpoints/utils/googleAgentSkillEndpoints");
|
|
const { httpLogger } = require("./middleware/httpLogger");
|
|
const app = express();
|
|
const apiRouter = express.Router();
|
|
const FILE_LIMIT = "3GB";
|
|
|
|
// Only log HTTP requests in development mode and if the ENABLE_HTTP_LOGGER environment variable is set to true
|
|
if (
|
|
process.env.NODE_ENV === "development" &&
|
|
!!process.env.ENABLE_HTTP_LOGGER
|
|
) {
|
|
app.use(
|
|
httpLogger({
|
|
enableTimestamps: !!process.env.ENABLE_HTTP_LOGGER_TIMESTAMPS,
|
|
})
|
|
);
|
|
}
|
|
app.use(cors({ origin: true }));
|
|
app.use(bodyParser.text({ limit: FILE_LIMIT }));
|
|
app.use(bodyParser.json({ limit: FILE_LIMIT }));
|
|
app.use(
|
|
bodyParser.urlencoded({
|
|
limit: FILE_LIMIT,
|
|
extended: true,
|
|
})
|
|
);
|
|
|
|
if (!!process.env.ENABLE_HTTPS) {
|
|
bootSSL(app, process.env.SERVER_PORT || 3001);
|
|
} else {
|
|
require("@mintplex-labs/express-ws").default(app); // load WebSockets in non-SSL mode.
|
|
}
|
|
|
|
app.use("/api", apiRouter);
|
|
systemEndpoints(apiRouter);
|
|
extensionEndpoints(apiRouter);
|
|
workspaceEndpoints(apiRouter);
|
|
workspaceThreadEndpoints(apiRouter);
|
|
chatEndpoints(apiRouter);
|
|
adminEndpoints(apiRouter);
|
|
inviteEndpoints(apiRouter);
|
|
embedManagementEndpoints(apiRouter);
|
|
utilEndpoints(apiRouter);
|
|
documentEndpoints(apiRouter);
|
|
agentWebsocket(apiRouter);
|
|
agentSkillWhitelistEndpoints(apiRouter);
|
|
agentFileServerEndpoints(apiRouter);
|
|
experimentalEndpoints(apiRouter);
|
|
developerEndpoints(app, apiRouter);
|
|
communityHubEndpoints(apiRouter);
|
|
agentFlowEndpoints(apiRouter);
|
|
mcpServersEndpoints(apiRouter);
|
|
mobileEndpoints(apiRouter);
|
|
webPushEndpoints(apiRouter);
|
|
telegramEndpoints(apiRouter);
|
|
scheduledJobEndpoints(apiRouter);
|
|
outlookAgentEndpoints(apiRouter);
|
|
googleAgentSkillEndpoints(apiRouter);
|
|
// Externally facing embedder endpoints
|
|
embeddedEndpoints(apiRouter);
|
|
|
|
// Externally facing browser extension endpoints
|
|
browserExtensionEndpoints(apiRouter);
|
|
|
|
if (process.env.NODE_ENV !== "development") {
|
|
const { MetaGenerator } = require("./utils/boot/MetaGenerator");
|
|
const IndexPage = new MetaGenerator();
|
|
|
|
app.use(
|
|
express.static(path.resolve(__dirname, "public"), {
|
|
extensions: ["js"],
|
|
setHeaders: (res) => {
|
|
// Disable I-framing of entire site UI
|
|
res.removeHeader("X-Powered-By");
|
|
res.setHeader("X-Frame-Options", "DENY");
|
|
},
|
|
})
|
|
);
|
|
|
|
app.get("/robots.txt", function (_, response) {
|
|
response.type("text/plain");
|
|
response.send("User-agent: *\nDisallow: /").end();
|
|
});
|
|
|
|
app.get("/manifest.json", async function (_, response) {
|
|
IndexPage.generateManifest(response);
|
|
return;
|
|
});
|
|
|
|
app.use("/", function (_, response) {
|
|
IndexPage.generate(response);
|
|
return;
|
|
});
|
|
} else {
|
|
// Debug route for development connections to vectorDBs
|
|
apiRouter.post("/v/:command", async (request, response) => {
|
|
try {
|
|
const VectorDb = getVectorDbClass();
|
|
const { command } = request.params;
|
|
if (!Object.getOwnPropertyNames(VectorDb).includes(command)) {
|
|
response.status(500).json({
|
|
message: "invalid interface command",
|
|
commands: Object.getOwnPropertyNames(VectorDb),
|
|
});
|
|
return;
|
|
}
|
|
|
|
try {
|
|
const body = reqBody(request);
|
|
const resBody = await VectorDb[command](body);
|
|
response.status(200).json({ ...resBody });
|
|
} catch (e) {
|
|
// console.error(e)
|
|
console.error(JSON.stringify(e));
|
|
response.status(500).json({ error: e.message });
|
|
}
|
|
return;
|
|
} catch (e) {
|
|
console.error(e.message, e);
|
|
response.sendStatus(500).end();
|
|
}
|
|
});
|
|
}
|
|
|
|
app.all("*", function (_, response) {
|
|
response.sendStatus(404);
|
|
});
|
|
|
|
// In non-https mode we need to boot at the end since the server has not yet
|
|
// started and is `.listen`ing.
|
|
if (!process.env.ENABLE_HTTPS) bootHTTP(app, process.env.SERVER_PORT || 3001);
|