- Fixed 280px sidebar with glassmorphism - Full-width max-w-7xl main content (no single column) - 4 KPI cards in grid-cols-2 md:grid-cols-4 layout - 3-column service grid (grid-cols-1 md:grid-cols-2 lg:grid-cols-3) - shadcn Card, Badge, Progress, Button components - Sparklines using recharts - Hover scale + shadow effects - No tables, no single-column stacking
144 lines
29 KiB
JavaScript
144 lines
29 KiB
JavaScript
/*
|
|
* ATTENTION: An "eval-source-map" devtool has been used.
|
|
* This devtool is neither made for production nor for readable output files.
|
|
* It uses "eval()" calls to create a separate source file with attached SourceMaps in the browser devtools.
|
|
* If you are trying to read the output file, select a different devtool (https://webpack.js.org/configuration/devtool/)
|
|
* or disable the default devtool with "devtool: false".
|
|
* If you are looking for production-ready output files, see mode: "production" (https://webpack.js.org/configuration/mode/).
|
|
*/
|
|
(() => {
|
|
var exports = {};
|
|
exports.id = "app/api/monitor/route";
|
|
exports.ids = ["app/api/monitor/route"];
|
|
exports.modules = {
|
|
|
|
/***/ "next/dist/compiled/next-server/app-page.runtime.dev.js":
|
|
/*!*************************************************************************!*\
|
|
!*** external "next/dist/compiled/next-server/app-page.runtime.dev.js" ***!
|
|
\*************************************************************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("next/dist/compiled/next-server/app-page.runtime.dev.js");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "next/dist/compiled/next-server/app-route.runtime.dev.js":
|
|
/*!**************************************************************************!*\
|
|
!*** external "next/dist/compiled/next-server/app-route.runtime.dev.js" ***!
|
|
\**************************************************************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("next/dist/compiled/next-server/app-route.runtime.dev.js");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "../app-render/after-task-async-storage.external":
|
|
/*!***********************************************************************************!*\
|
|
!*** external "next/dist/server/app-render/after-task-async-storage.external.js" ***!
|
|
\***********************************************************************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("next/dist/server/app-render/after-task-async-storage.external.js");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "../app-render/work-async-storage.external":
|
|
/*!*****************************************************************************!*\
|
|
!*** external "next/dist/server/app-render/work-async-storage.external.js" ***!
|
|
\*****************************************************************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("next/dist/server/app-render/work-async-storage.external.js");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "./work-unit-async-storage.external":
|
|
/*!**********************************************************************************!*\
|
|
!*** external "next/dist/server/app-render/work-unit-async-storage.external.js" ***!
|
|
\**********************************************************************************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("next/dist/server/app-render/work-unit-async-storage.external.js");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "fs":
|
|
/*!*********************!*\
|
|
!*** external "fs" ***!
|
|
\*********************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("fs");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "path":
|
|
/*!***********************!*\
|
|
!*** external "path" ***!
|
|
\***********************/
|
|
/***/ ((module) => {
|
|
|
|
"use strict";
|
|
module.exports = require("path");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Fmonitor%2Froute&page=%2Fapi%2Fmonitor%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fmonitor%2Froute.ts&appDir=%2FUsers%2Fmattbruce%2FDocuments%2FProjects%2FOpenClaw%2FWeb%2Fheartbeat-monitor%2Fsrc%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fmattbruce%2FDocuments%2FProjects%2FOpenClaw%2FWeb%2Fheartbeat-monitor&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!":
|
|
/*!*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
|
!*** ./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Fmonitor%2Froute&page=%2Fapi%2Fmonitor%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fmonitor%2Froute.ts&appDir=%2FUsers%2Fmattbruce%2FDocuments%2FProjects%2FOpenClaw%2FWeb%2Fheartbeat-monitor%2Fsrc%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fmattbruce%2FDocuments%2FProjects%2FOpenClaw%2FWeb%2Fheartbeat-monitor&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D! ***!
|
|
\*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ patchFetch: () => (/* binding */ patchFetch),\n/* harmony export */ routeModule: () => (/* binding */ routeModule),\n/* harmony export */ serverHooks: () => (/* binding */ serverHooks),\n/* harmony export */ workAsyncStorage: () => (/* binding */ workAsyncStorage),\n/* harmony export */ workUnitAsyncStorage: () => (/* binding */ workUnitAsyncStorage)\n/* harmony export */ });\n/* harmony import */ var next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next/dist/server/route-modules/app-route/module.compiled */ \"(rsc)/./node_modules/next/dist/server/route-modules/app-route/module.compiled.js\");\n/* harmony import */ var next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__);\n/* harmony import */ var next_dist_server_route_kind__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! next/dist/server/route-kind */ \"(rsc)/./node_modules/next/dist/server/route-kind.js\");\n/* harmony import */ var next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! next/dist/server/lib/patch-fetch */ \"(rsc)/./node_modules/next/dist/server/lib/patch-fetch.js\");\n/* harmony import */ var next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__);\n/* harmony import */ var _Users_mattbruce_Documents_Projects_OpenClaw_Web_heartbeat_monitor_src_app_api_monitor_route_ts__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./src/app/api/monitor/route.ts */ \"(rsc)/./src/app/api/monitor/route.ts\");\n\n\n\n\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new next_dist_server_route_modules_app_route_module_compiled__WEBPACK_IMPORTED_MODULE_0__.AppRouteRouteModule({\n definition: {\n kind: next_dist_server_route_kind__WEBPACK_IMPORTED_MODULE_1__.RouteKind.APP_ROUTE,\n page: \"/api/monitor/route\",\n pathname: \"/api/monitor\",\n filename: \"route\",\n bundlePath: \"app/api/monitor/route\"\n },\n resolvedPagePath: \"/Users/mattbruce/Documents/Projects/OpenClaw/Web/heartbeat-monitor/src/app/api/monitor/route.ts\",\n nextConfigOutput,\n userland: _Users_mattbruce_Documents_Projects_OpenClaw_Web_heartbeat_monitor_src_app_api_monitor_route_ts__WEBPACK_IMPORTED_MODULE_3__\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return (0,next_dist_server_lib_patch_fetch__WEBPACK_IMPORTED_MODULE_2__.patchFetch)({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\n\n\n//# sourceMappingURL=app-route.js.map//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiKHJzYykvLi9ub2RlX21vZHVsZXMvbmV4dC9kaXN0L2J1aWxkL3dlYnBhY2svbG9hZGVycy9uZXh0LWFwcC1sb2FkZXIvaW5kZXguanM/bmFtZT1hcHAlMkZhcGklMkZtb25pdG9yJTJGcm91dGUmcGFnZT0lMkZhcGklMkZtb25pdG9yJTJGcm91dGUmYXBwUGF0aHM9JnBhZ2VQYXRoPXByaXZhdGUtbmV4dC1hcHAtZGlyJTJGYXBpJTJGbW9uaXRvciUyRnJvdXRlLnRzJmFwcERpcj0lMkZVc2VycyUyRm1hdHRicnVjZSUyRkRvY3VtZW50cyUyRlByb2plY3RzJTJGT3BlbkNsYXclMkZXZWIlMkZoZWFydGJlYXQtbW9uaXRvciUyRnNyYyUyRmFwcCZwYWdlRXh0ZW5zaW9ucz10c3gmcGFnZUV4dGVuc2lvbnM9dHMmcGFnZUV4dGVuc2lvbnM9anN4JnBhZ2VFeHRlbnNpb25zPWpzJnJvb3REaXI9JTJGVXNlcnMlMkZtYXR0YnJ1Y2UlMkZEb2N1bWVudHMlMkZQcm9qZWN0cyUyRk9wZW5DbGF3JTJGV2ViJTJGaGVhcnRiZWF0LW1vbml0b3ImaXNEZXY9dHJ1ZSZ0c2NvbmZpZ1BhdGg9dHNjb25maWcuanNvbiZiYXNlUGF0aD0mYXNzZXRQcmVmaXg9Jm5leHRDb25maWdPdXRwdXQ9JnByZWZlcnJlZFJlZ2lvbj0mbWlkZGxld2FyZUNvbmZpZz1lMzAlM0QhIiwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7O0FBQStGO0FBQ3ZDO0FBQ3FCO0FBQytDO0FBQzVIO0FBQ0E7QUFDQTtBQUNBLHdCQUF3Qix5R0FBbUI7QUFDM0M7QUFDQSxjQUFjLGtFQUFTO0FBQ3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQ0E7QUFDQSxZQUFZO0FBQ1osQ0FBQztBQUNEO0FBQ0E7QUFDQTtBQUNBLFFBQVEsc0RBQXNEO0FBQzlEO0FBQ0EsV0FBVyw0RUFBVztBQUN0QjtBQUNBO0FBQ0EsS0FBSztBQUNMO0FBQzBGOztBQUUxRiIsInNvdXJjZXMiOlsiIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFwcFJvdXRlUm91dGVNb2R1bGUgfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9yb3V0ZS1tb2R1bGVzL2FwcC1yb3V0ZS9tb2R1bGUuY29tcGlsZWRcIjtcbmltcG9ydCB7IFJvdXRlS2luZCB9IGZyb20gXCJuZXh0L2Rpc3Qvc2VydmVyL3JvdXRlLWtpbmRcIjtcbmltcG9ydCB7IHBhdGNoRmV0Y2ggYXMgX3BhdGNoRmV0Y2ggfSBmcm9tIFwibmV4dC9kaXN0L3NlcnZlci9saWIvcGF0Y2gtZmV0Y2hcIjtcbmltcG9ydCAqIGFzIHVzZXJsYW5kIGZyb20gXCIvVXNlcnMvbWF0dGJydWNlL0RvY3VtZW50cy9Qcm9qZWN0cy9PcGVuQ2xhdy9XZWIvaGVhcnRiZWF0LW1vbml0b3Ivc3JjL2FwcC9hcGkvbW9uaXRvci9yb3V0ZS50c1wiO1xuLy8gV2UgaW5qZWN0IHRoZSBuZXh0Q29uZmlnT3V0cHV0IGhlcmUgc28gdGhhdCB3ZSBjYW4gdXNlIHRoZW0gaW4gdGhlIHJvdXRlXG4vLyBtb2R1bGUuXG5jb25zdCBuZXh0Q29uZmlnT3V0cHV0ID0gXCJcIlxuY29uc3Qgcm91dGVNb2R1bGUgPSBuZXcgQXBwUm91dGVSb3V0ZU1vZHVsZSh7XG4gICAgZGVmaW5pdGlvbjoge1xuICAgICAgICBraW5kOiBSb3V0ZUtpbmQuQVBQX1JPVVRFLFxuICAgICAgICBwYWdlOiBcIi9hcGkvbW9uaXRvci9yb3V0ZVwiLFxuICAgICAgICBwYXRobmFtZTogXCIvYXBpL21vbml0b3JcIixcbiAgICAgICAgZmlsZW5hbWU6IFwicm91dGVcIixcbiAgICAgICAgYnVuZGxlUGF0aDogXCJhcHAvYXBpL21vbml0b3Ivcm91dGVcIlxuICAgIH0sXG4gICAgcmVzb2x2ZWRQYWdlUGF0aDogXCIvVXNlcnMvbWF0dGJydWNlL0RvY3VtZW50cy9Qcm9qZWN0cy9PcGVuQ2xhdy9XZWIvaGVhcnRiZWF0LW1vbml0b3Ivc3JjL2FwcC9hcGkvbW9uaXRvci9yb3V0ZS50c1wiLFxuICAgIG5leHRDb25maWdPdXRwdXQsXG4gICAgdXNlcmxhbmRcbn0pO1xuLy8gUHVsbCBvdXQgdGhlIGV4cG9ydHMgdGhhdCB3ZSBuZWVkIHRvIGV4cG9zZSBmcm9tIHRoZSBtb2R1bGUuIFRoaXMgc2hvdWxkXG4vLyBiZSBlbGltaW5hdGVkIHdoZW4gd2UndmUgbW92ZWQgdGhlIG90aGVyIHJvdXRlcyB0byB0aGUgbmV3IGZvcm1hdC4gVGhlc2Vcbi8vIGFyZSB1c2VkIHRvIGhvb2sgaW50byB0aGUgcm91dGUuXG5jb25zdCB7IHdvcmtBc3luY1N0b3JhZ2UsIHdvcmtVbml0QXN5bmNTdG9yYWdlLCBzZXJ2ZXJIb29rcyB9ID0gcm91dGVNb2R1bGU7XG5mdW5jdGlvbiBwYXRjaEZldGNoKCkge1xuICAgIHJldHVybiBfcGF0Y2hGZXRjaCh7XG4gICAgICAgIHdvcmtBc3luY1N0b3JhZ2UsXG4gICAgICAgIHdvcmtVbml0QXN5bmNTdG9yYWdlXG4gICAgfSk7XG59XG5leHBvcnQgeyByb3V0ZU1vZHVsZSwgd29ya0FzeW5jU3RvcmFnZSwgd29ya1VuaXRBc3luY1N0b3JhZ2UsIHNlcnZlckhvb2tzLCBwYXRjaEZldGNoLCAgfTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YXBwLXJvdXRlLmpzLm1hcCJdLCJuYW1lcyI6W10sImlnbm9yZUxpc3QiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Fmonitor%2Froute&page=%2Fapi%2Fmonitor%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fmonitor%2Froute.ts&appDir=%2FUsers%2Fmattbruce%2FDocuments%2FProjects%2FOpenClaw%2FWeb%2Fheartbeat-monitor%2Fsrc%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fmattbruce%2FDocuments%2FProjects%2FOpenClaw%2FWeb%2Fheartbeat-monitor&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!\n");
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true!":
|
|
/*!******************************************************************************************************!*\
|
|
!*** ./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true! ***!
|
|
\******************************************************************************************************/
|
|
/***/ (() => {
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(ssr)/./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true!":
|
|
/*!******************************************************************************************************!*\
|
|
!*** ./node_modules/next/dist/build/webpack/loaders/next-flight-client-entry-loader.js?server=true! ***!
|
|
\******************************************************************************************************/
|
|
/***/ (() => {
|
|
|
|
|
|
|
|
/***/ }),
|
|
|
|
/***/ "(rsc)/./src/app/api/monitor/route.ts":
|
|
/*!**************************************!*\
|
|
!*** ./src/app/api/monitor/route.ts ***!
|
|
\**************************************/
|
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
|
|
"use strict";
|
|
eval("__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ GET: () => (/* binding */ GET),\n/* harmony export */ POST: () => (/* binding */ POST)\n/* harmony export */ });\n/* harmony import */ var next_server__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! next/server */ \"(rsc)/./node_modules/next/dist/api/server.js\");\n/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ \"fs\");\n/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__);\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! path */ \"path\");\n/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_2__);\n\n\n\nconst APPS_FILE = (0,path__WEBPACK_IMPORTED_MODULE_2__.join)(process.cwd(), \"data\", \"apps.json\");\nconst STATUS_FILE = (0,path__WEBPACK_IMPORTED_MODULE_2__.join)(process.cwd(), \"data\", \"status.json\");\nfunction getApps() {\n if (!(0,fs__WEBPACK_IMPORTED_MODULE_1__.existsSync)(APPS_FILE)) return [];\n try {\n const data = JSON.parse((0,fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync)(APPS_FILE, \"utf-8\"));\n return data.apps || [];\n } catch {\n return [];\n }\n}\nfunction saveApps(apps) {\n const dir = (0,path__WEBPACK_IMPORTED_MODULE_2__.join)(process.cwd(), \"data\");\n if (!(0,fs__WEBPACK_IMPORTED_MODULE_1__.existsSync)(dir)) (__webpack_require__(/*! fs */ \"fs\").mkdirSync)(dir, {\n recursive: true\n });\n (0,fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync)(APPS_FILE, JSON.stringify({\n apps\n }, null, 2));\n}\nfunction getStatus() {\n if (!(0,fs__WEBPACK_IMPORTED_MODULE_1__.existsSync)(STATUS_FILE)) return [];\n try {\n const data = JSON.parse((0,fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync)(STATUS_FILE, \"utf-8\"));\n return data.entries || [];\n } catch {\n return [];\n }\n}\nfunction saveStatus(entries) {\n const dir = (0,path__WEBPACK_IMPORTED_MODULE_2__.join)(process.cwd(), \"data\");\n if (!(0,fs__WEBPACK_IMPORTED_MODULE_1__.existsSync)(dir)) (__webpack_require__(/*! fs */ \"fs\").mkdirSync)(dir, {\n recursive: true\n });\n (0,fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync)(STATUS_FILE, JSON.stringify({\n entries\n }, null, 2));\n}\nasync function GET(request) {\n const { searchParams } = new URL(request.url);\n const type = searchParams.get(\"type\");\n if (type === \"apps\") {\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n apps: getApps()\n });\n }\n if (type === \"status\") {\n const appId = searchParams.get(\"appId\");\n const entries = getStatus();\n if (appId) {\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n entries: entries.filter((e)=>e.appId === appId).slice(-100)\n });\n }\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n entries: entries.slice(-500)\n });\n }\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n apps: getApps(),\n status: getStatus().slice(-100)\n });\n}\nasync function POST(request) {\n const body = await request.json();\n if (body.action === \"addApp\") {\n const apps = getApps();\n const newApp = {\n ...body.app,\n id: body.app.id || Date.now().toString()\n };\n apps.push(newApp);\n saveApps(apps);\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json(newApp);\n }\n if (body.action === \"updateApp\") {\n const apps = getApps();\n const index = apps.findIndex((a)=>a.id === body.id);\n if (index >= 0) {\n apps[index] = {\n ...apps[index],\n ...body.updates\n };\n saveApps(apps);\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json(apps[index]);\n }\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n error: \"App not found\"\n }, {\n status: 404\n });\n }\n if (body.action === \"deleteApp\") {\n const apps = getApps().filter((a)=>a.id !== body.id);\n saveApps(apps);\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n success: true\n });\n }\n if (body.action === \"recordStatus\") {\n const entries = getStatus();\n entries.push(body.entry);\n // Keep last 1000 entries\n if (entries.length > 1000) entries.shift();\n saveStatus(entries);\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n success: true\n });\n }\n return next_server__WEBPACK_IMPORTED_MODULE_0__.NextResponse.json({\n error: \"Unknown action\"\n }, {\n status: 400\n });\n}\n//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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LHFEQUFZQSxDQUFDOEIsSUFBSSxDQUFDO1FBQUVvQixPQUFPO0lBQWlCLEdBQUc7UUFBRWYsUUFBUTtJQUFJO0FBQ3RFIiwic291cmNlcyI6WyIvVXNlcnMvbWF0dGJydWNlL0RvY3VtZW50cy9Qcm9qZWN0cy9PcGVuQ2xhdy9XZWIvaGVhcnRiZWF0LW1vbml0b3Ivc3JjL2FwcC9hcGkvbW9uaXRvci9yb3V0ZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZXh0UmVzcG9uc2UgfSBmcm9tIFwibmV4dC9zZXJ2ZXJcIjtcbmltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYywgZXhpc3RzU3luYyB9IGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gXCJwYXRoXCI7XG5cbmNvbnN0IEFQUFNfRklMRSA9IGpvaW4ocHJvY2Vzcy5jd2QoKSwgXCJkYXRhXCIsIFwiYXBwcy5qc29uXCIpO1xuY29uc3QgU1RBVFVTX0ZJTEUgPSBqb2luKHByb2Nlc3MuY3dkKCksIFwiZGF0YVwiLCBcInN0YXR1cy5qc29uXCIpO1xuXG5pbnRlcmZhY2UgQXBwIHtcbiAgaWQ6IHN0cmluZztcbiAgbmFtZTogc3RyaW5nO1xuICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgcG9ydDogbnVtYmVyO1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbW1hbmQ6IHN0cmluZztcbiAgY2F0ZWdvcnk6IHN0cmluZztcbiAgY29sb3I6IHN0cmluZztcbiAgZW5hYmxlZDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIFN0YXR1c0VudHJ5IHtcbiAgYXBwSWQ6IHN0cmluZztcbiAgdGltZXN0YW1wOiBzdHJpbmc7XG4gIHN0YXR1czogXCJ1cFwiIHwgXCJkb3duXCI7XG4gIHJlc3BvbnNlVGltZT86IG51bWJlcjtcbiAgZXJyb3I/OiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBBcHBzRGF0YSB7XG4gIGFwcHM6IEFwcFtdO1xufVxuXG5pbnRlcmZhY2UgU3RhdHVzRGF0YSB7XG4gIGVudHJpZXM6IFN0YXR1c0VudHJ5W107XG59XG5cbmZ1bmN0aW9uIGdldEFwcHMoKTogQXBwW10ge1xuICBpZiAoIWV4aXN0c1N5bmMoQVBQU19GSUxFKSkgcmV0dXJuIFtdO1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhBUFBTX0ZJTEUsIFwidXRmLThcIikpO1xuICAgIHJldHVybiBkYXRhLmFwcHMgfHwgW107XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG5mdW5jdGlvbiBzYXZlQXBwcyhhcHBzOiBBcHBbXSkge1xuICBjb25zdCBkaXIgPSBqb2luKHByb2Nlc3MuY3dkKCksIFwiZGF0YVwiKTtcbiAgaWYgKCFleGlzdHNTeW5jKGRpcikpIHJlcXVpcmUoXCJmc1wiKS5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgd3JpdGVGaWxlU3luYyhBUFBTX0ZJTEUsIEpTT04uc3RyaW5naWZ5KHsgYXBwcyB9LCBudWxsLCAyKSk7XG59XG5cbmZ1bmN0aW9uIGdldFN0YXR1cygpOiBTdGF0dXNFbnRyeVtdIHtcbiAgaWYgKCFleGlzdHNTeW5jKFNUQVRVU19GSUxFKSkgcmV0dXJuIFtdO1xuICB0cnkge1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhTVEFUVVNfRklMRSwgXCJ1dGYtOFwiKSk7XG4gICAgcmV0dXJuIGRhdGEuZW50cmllcyB8fCBbXTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG59XG5cbmZ1bmN0aW9uIHNhdmVTdGF0dXMoZW50cmllczogU3RhdHVzRW50cnlbXSkge1xuICBjb25zdCBkaXIgPSBqb2luKHByb2Nlc3MuY3dkKCksIFwiZGF0YVwiKTtcbiAgaWYgKCFleGlzdHNTeW5jKGRpcikpIHJlcXVpcmUoXCJmc1wiKS5ta2RpclN5bmMoZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgd3JpdGVGaWxlU3luYyhTVEFUVVNfRklMRSwgSlNPTi5zdHJpbmdpZnkoeyBlbnRyaWVzIH0sIG51bGwsIDIpKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIEdFVChyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gIGNvbnN0IHsgc2VhcmNoUGFyYW1zIH0gPSBuZXcgVVJMKHJlcXVlc3QudXJsKTtcbiAgY29uc3QgdHlwZSA9IHNlYXJjaFBhcmFtcy5nZXQoXCJ0eXBlXCIpO1xuXG4gIGlmICh0eXBlID09PSBcImFwcHNcIikge1xuICAgIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbih7IGFwcHM6IGdldEFwcHMoKSB9KTtcbiAgfVxuXG4gIGlmICh0eXBlID09PSBcInN0YXR1c1wiKSB7XG4gICAgY29uc3QgYXBwSWQgPSBzZWFyY2hQYXJhbXMuZ2V0KFwiYXBwSWRcIik7XG4gICAgY29uc3QgZW50cmllcyA9IGdldFN0YXR1cygpO1xuICAgIGlmIChhcHBJZCkge1xuICAgICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKHtcbiAgICAgICAgZW50cmllczogZW50cmllcy5maWx0ZXIoKGUpID0+IGUuYXBwSWQgPT09IGFwcElkKS5zbGljZSgtMTAwKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oeyBlbnRyaWVzOiBlbnRyaWVzLnNsaWNlKC01MDApIH0pO1xuICB9XG5cbiAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKHsgYXBwczogZ2V0QXBwcygpLCBzdGF0dXM6IGdldFN0YXR1cygpLnNsaWNlKC0xMDApIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gUE9TVChyZXF1ZXN0OiBSZXF1ZXN0KSB7XG4gIGNvbnN0IGJvZHkgPSBhd2FpdCByZXF1ZXN0Lmpzb24oKTtcblxuICBpZiAoYm9keS5hY3Rpb24gPT09IFwiYWRkQXBwXCIpIHtcbiAgICBjb25zdCBhcHBzID0gZ2V0QXBwcygpO1xuICAgIGNvbnN0IG5ld0FwcDogQXBwID0ge1xuICAgICAgLi4uYm9keS5hcHAsXG4gICAgICBpZDogYm9keS5hcHAuaWQgfHwgRGF0ZS5ub3coKS50b1N0cmluZygpLFxuICAgIH07XG4gICAgYXBwcy5wdXNoKG5ld0FwcCk7XG4gICAgc2F2ZUFwcHMoYXBwcyk7XG4gICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKG5ld0FwcCk7XG4gIH1cblxuICBpZiAoYm9keS5hY3Rpb24gPT09IFwidXBkYXRlQXBwXCIpIHtcbiAgICBjb25zdCBhcHBzID0gZ2V0QXBwcygpO1xuICAgIGNvbnN0IGluZGV4ID0gYXBwcy5maW5kSW5kZXgoKGEpID0+IGEuaWQgPT09IGJvZHkuaWQpO1xuICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICBhcHBzW2luZGV4XSA9IHsgLi4uYXBwc1tpbmRleF0sIC4uLmJvZHkudXBkYXRlcyB9O1xuICAgICAgc2F2ZUFwcHMoYXBwcyk7XG4gICAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oYXBwc1tpbmRleF0pO1xuICAgIH1cbiAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oeyBlcnJvcjogXCJBcHAgbm90IGZvdW5kXCIgfSwgeyBzdGF0dXM6IDQwNCB9KTtcbiAgfVxuXG4gIGlmIChib2R5LmFjdGlvbiA9PT0gXCJkZWxldGVBcHBcIikge1xuICAgIGNvbnN0IGFwcHMgPSBnZXRBcHBzKCkuZmlsdGVyKChhKSA9PiBhLmlkICE9PSBib2R5LmlkKTtcbiAgICBzYXZlQXBwcyhhcHBzKTtcbiAgICByZXR1cm4gTmV4dFJlc3BvbnNlLmpzb24oeyBzdWNjZXNzOiB0cnVlIH0pO1xuICB9XG5cbiAgaWYgKGJvZHkuYWN0aW9uID09PSBcInJlY29yZFN0YXR1c1wiKSB7XG4gICAgY29uc3QgZW50cmllcyA9IGdldFN0YXR1cygpO1xuICAgIGVudHJpZXMucHVzaChib2R5LmVudHJ5KTtcbiAgICAvLyBLZWVwIGxhc3QgMTAwMCBlbnRyaWVzXG4gICAgaWYgKGVudHJpZXMubGVuZ3RoID4gMTAwMCkgZW50cmllcy5zaGlmdCgpO1xuICAgIHNhdmVTdGF0dXMoZW50cmllcyk7XG4gICAgcmV0dXJuIE5leHRSZXNwb25zZS5qc29uKHsgc3VjY2VzczogdHJ1ZSB9KTtcbiAgfVxuXG4gIHJldHVybiBOZXh0UmVzcG9uc2UuanNvbih7IGVycm9yOiBcIlVua25vd24gYWN0aW9uXCIgfSwgeyBzdGF0dXM6IDQwMCB9KTtcbn1cbiJdLCJuYW1lcyI6WyJOZXh0UmVzcG9uc2UiLCJyZWFkRmlsZVN5bmMiLCJ3cml0ZUZpbGVTeW5jIiwiZXhpc3RzU3luYyIsImpvaW4iLCJBUFBTX0ZJTEUiLCJwcm9jZXNzIiwiY3dkIiwiU1RBVFVTX0ZJTEUiLCJnZXRBcHBzIiwiZGF0YSIsIkpTT04iLCJwYXJzZSIsImFwcHMiLCJzYXZlQXBwcyIsImRpciIsInJlcXVpcmUiLCJta2RpclN5bmMiLCJyZWN1cnNpdmUiLCJzdHJpbmdpZnkiLCJnZXRTdGF0dXMiLCJlbnRyaWVzIiwic2F2ZVN0YXR1cyIsIkdFVCIsInJlcXVlc3QiLCJzZWFyY2hQYXJhbXMiLCJVUkwiLCJ1cmwiLCJ0eXBlIiwiZ2V0IiwianNvbiIsImFwcElkIiwiZmlsdGVyIiwiZSIsInNsaWNlIiwic3RhdHVzIiwiUE9TVCIsImJvZHkiLCJhY3Rpb24iLCJuZXdBcHAiLCJhcHAiLCJpZCIsIkRhdGUiLCJub3ciLCJ0b1N0cmluZyIsInB1c2giLCJpbmRleCIsImZpbmRJbmRleCIsImEiLCJ1cGRhdGVzIiwiZXJyb3IiLCJzdWNjZXNzIiwiZW50cnkiLCJsZW5ndGgiLCJzaGlmdCJdLCJpZ25vcmVMaXN0IjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///(rsc)/./src/app/api/monitor/route.ts\n");
|
|
|
|
/***/ })
|
|
|
|
};
|
|
;
|
|
|
|
// load runtime
|
|
var __webpack_require__ = require("../../../webpack-runtime.js");
|
|
__webpack_require__.C(exports);
|
|
var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
|
|
var __webpack_exports__ = __webpack_require__.X(0, ["vendor-chunks/next"], () => (__webpack_exec__("(rsc)/./node_modules/next/dist/build/webpack/loaders/next-app-loader/index.js?name=app%2Fapi%2Fmonitor%2Froute&page=%2Fapi%2Fmonitor%2Froute&appPaths=&pagePath=private-next-app-dir%2Fapi%2Fmonitor%2Froute.ts&appDir=%2FUsers%2Fmattbruce%2FDocuments%2FProjects%2FOpenClaw%2FWeb%2Fheartbeat-monitor%2Fsrc%2Fapp&pageExtensions=tsx&pageExtensions=ts&pageExtensions=jsx&pageExtensions=js&rootDir=%2FUsers%2Fmattbruce%2FDocuments%2FProjects%2FOpenClaw%2FWeb%2Fheartbeat-monitor&isDev=true&tsconfigPath=tsconfig.json&basePath=&assetPrefix=&nextConfigOutput=&preferredRegion=&middlewareConfig=e30%3D!")));
|
|
module.exports = __webpack_exports__;
|
|
|
|
})(); |