@urateam/dashboard 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/audit.test.d.ts +2 -0
- package/dist/__tests__/audit.test.d.ts.map +1 -0
- package/dist/__tests__/audit.test.js +219 -0
- package/dist/__tests__/audit.test.js.map +1 -0
- package/dist/__tests__/auth-routes.test.d.ts +2 -0
- package/dist/__tests__/auth-routes.test.d.ts.map +1 -0
- package/dist/__tests__/auth-routes.test.js +116 -0
- package/dist/__tests__/auth-routes.test.js.map +1 -0
- package/dist/__tests__/bootstrap-integration.test.d.ts +2 -0
- package/dist/__tests__/bootstrap-integration.test.d.ts.map +1 -0
- package/dist/__tests__/bootstrap-integration.test.js +75 -0
- package/dist/__tests__/bootstrap-integration.test.js.map +1 -0
- package/dist/__tests__/cost-chart.test.d.ts +2 -0
- package/dist/__tests__/cost-chart.test.d.ts.map +1 -0
- package/dist/__tests__/cost-chart.test.js +51 -0
- package/dist/__tests__/cost-chart.test.js.map +1 -0
- package/dist/__tests__/cost.test.d.ts +2 -0
- package/dist/__tests__/cost.test.d.ts.map +1 -0
- package/dist/__tests__/cost.test.js +197 -0
- package/dist/__tests__/cost.test.js.map +1 -0
- package/dist/__tests__/helpers/license.d.ts +8 -0
- package/dist/__tests__/helpers/license.d.ts.map +1 -0
- package/dist/__tests__/helpers/license.js +71 -0
- package/dist/__tests__/helpers/license.js.map +1 -0
- package/dist/__tests__/rbac-middleware.test.d.ts +2 -0
- package/dist/__tests__/rbac-middleware.test.d.ts.map +1 -0
- package/dist/__tests__/rbac-middleware.test.js +59 -0
- package/dist/__tests__/rbac-middleware.test.js.map +1 -0
- package/dist/__tests__/retry-route.test.d.ts +2 -0
- package/dist/__tests__/retry-route.test.d.ts.map +1 -0
- package/dist/__tests__/retry-route.test.js +115 -0
- package/dist/__tests__/retry-route.test.js.map +1 -0
- package/dist/__tests__/sso-integration.test.d.ts +2 -0
- package/dist/__tests__/sso-integration.test.d.ts.map +1 -0
- package/dist/__tests__/sso-integration.test.js +91 -0
- package/dist/__tests__/sso-integration.test.js.map +1 -0
- package/dist/__tests__/sso-middleware.test.d.ts +2 -0
- package/dist/__tests__/sso-middleware.test.d.ts.map +1 -0
- package/dist/__tests__/sso-middleware.test.js +66 -0
- package/dist/__tests__/sso-middleware.test.js.map +1 -0
- package/dist/__tests__/users-routes.test.d.ts +2 -0
- package/dist/__tests__/users-routes.test.d.ts.map +1 -0
- package/dist/__tests__/users-routes.test.js +127 -0
- package/dist/__tests__/users-routes.test.js.map +1 -0
- package/dist/middleware/rbac.d.ts +4 -0
- package/dist/middleware/rbac.d.ts.map +1 -0
- package/dist/middleware/rbac.js +21 -0
- package/dist/middleware/rbac.js.map +1 -0
- package/dist/middleware/sso.d.ts +9 -0
- package/dist/middleware/sso.d.ts.map +1 -0
- package/dist/middleware/sso.js +47 -0
- package/dist/middleware/sso.js.map +1 -0
- package/dist/routes/audit.d.ts +4 -0
- package/dist/routes/audit.d.ts.map +1 -0
- package/dist/routes/audit.js +123 -0
- package/dist/routes/audit.js.map +1 -0
- package/dist/routes/auth.d.ts +10 -0
- package/dist/routes/auth.d.ts.map +1 -0
- package/dist/routes/auth.js +105 -0
- package/dist/routes/auth.js.map +1 -0
- package/dist/routes/config.d.ts.map +1 -1
- package/dist/routes/config.js +4 -2
- package/dist/routes/config.js.map +1 -1
- package/dist/routes/coordination.d.ts.map +1 -1
- package/dist/routes/coordination.js +5 -3
- package/dist/routes/coordination.js.map +1 -1
- package/dist/routes/cost.d.ts +10 -0
- package/dist/routes/cost.d.ts.map +1 -0
- package/dist/routes/cost.js +104 -0
- package/dist/routes/cost.js.map +1 -0
- package/dist/routes/errors.d.ts.map +1 -1
- package/dist/routes/errors.js +4 -2
- package/dist/routes/errors.js.map +1 -1
- package/dist/routes/runs.d.ts +9 -1
- package/dist/routes/runs.d.ts.map +1 -1
- package/dist/routes/runs.js +82 -9
- package/dist/routes/runs.js.map +1 -1
- package/dist/routes/tokens.d.ts.map +1 -1
- package/dist/routes/tokens.js +4 -2
- package/dist/routes/tokens.js.map +1 -1
- package/dist/routes/users.d.ts +8 -0
- package/dist/routes/users.d.ts.map +1 -0
- package/dist/routes/users.js +64 -0
- package/dist/routes/users.js.map +1 -0
- package/dist/server.d.ts +13 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +65 -7
- package/dist/server.js.map +1 -1
- package/dist/static/style.css +648 -0
- package/dist/views/audit.d.ts +29 -0
- package/dist/views/audit.d.ts.map +1 -0
- package/dist/views/audit.js +144 -0
- package/dist/views/audit.js.map +1 -0
- package/dist/views/cost.d.ts +28 -0
- package/dist/views/cost.d.ts.map +1 -0
- package/dist/views/cost.js +173 -0
- package/dist/views/cost.js.map +1 -0
- package/dist/views/forbidden.d.ts +7 -0
- package/dist/views/forbidden.d.ts.map +1 -0
- package/dist/views/forbidden.js +18 -0
- package/dist/views/forbidden.js.map +1 -0
- package/dist/views/layout.d.ts +11 -1
- package/dist/views/layout.d.ts.map +1 -1
- package/dist/views/layout.js +12 -18
- package/dist/views/layout.js.map +1 -1
- package/dist/views/run-detail.d.ts +1 -1
- package/dist/views/run-detail.d.ts.map +1 -1
- package/dist/views/run-detail.js +6 -1
- package/dist/views/run-detail.js.map +1 -1
- package/dist/views/users.d.ts +16 -0
- package/dist/views/users.d.ts.map +1 -0
- package/dist/views/users.js +44 -0
- package/dist/views/users.js.map +1 -0
- package/package.json +7 -5
- package/LICENSE +0 -27
package/dist/server.js
CHANGED
|
@@ -1,12 +1,20 @@
|
|
|
1
|
+
// SPDX-License-Identifier: BUSL-1.1
|
|
1
2
|
import { Hono } from "hono";
|
|
2
3
|
import { basicAuth } from "hono/basic-auth";
|
|
3
4
|
import { serveStatic } from "@hono/node-server/serve-static";
|
|
4
|
-
import {
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { dirname, join } from "node:path";
|
|
7
|
+
import { createLogger, isFeatureLicensed } from "@urateam/core";
|
|
5
8
|
import { createRunsRouter } from "./routes/runs.js";
|
|
6
9
|
import { createTokensRouter } from "./routes/tokens.js";
|
|
7
10
|
import { createErrorsRouter } from "./routes/errors.js";
|
|
8
11
|
import { createConfigRouter } from "./routes/config.js";
|
|
9
12
|
import { createCoordinationRouter } from "./routes/coordination.js";
|
|
13
|
+
import { createAuditRouter } from "./routes/audit.js";
|
|
14
|
+
import { createUsersRouter } from "./routes/users.js";
|
|
15
|
+
import { createAuthRouter } from "./routes/auth.js";
|
|
16
|
+
import { createSsoMiddleware } from "./middleware/sso.js";
|
|
17
|
+
import { createCostRouter } from "./routes/cost.js";
|
|
10
18
|
const logger = createLogger({ component: "dashboard" });
|
|
11
19
|
// Rate limiter constants
|
|
12
20
|
const RATE_LIMIT_MAX = 10; // requests per window
|
|
@@ -59,7 +67,15 @@ export function createDashboard(config) {
|
|
|
59
67
|
// CSRF / Origin validation for state-changing requests
|
|
60
68
|
app.use("*", async (c, next) => {
|
|
61
69
|
const method = c.req.method;
|
|
62
|
-
|
|
70
|
+
// /auth/login and /auth/callback are GET-based OAuth handoffs with no
|
|
71
|
+
// body — they cannot be targets of CSRF. /auth/logout is POST and MUST
|
|
72
|
+
// go through CSRF (either HX-Request or a token) so an attacker can't
|
|
73
|
+
// embed a <form action="/auth/logout"> on a third-party site and force
|
|
74
|
+
// a logout.
|
|
75
|
+
const path = c.req.path;
|
|
76
|
+
const csrfExempt = path === "/auth/login" || path === "/auth/callback";
|
|
77
|
+
if (["POST", "PUT", "DELETE", "PATCH"].includes(method) &&
|
|
78
|
+
!csrfExempt) {
|
|
63
79
|
// Require HX-Request header on HTMX-driven state-changing endpoints
|
|
64
80
|
if (!c.req.header("HX-Request")) {
|
|
65
81
|
return c.text("Forbidden: HTMX header required", 403);
|
|
@@ -75,9 +91,31 @@ export function createDashboard(config) {
|
|
|
75
91
|
}
|
|
76
92
|
await next();
|
|
77
93
|
});
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
|
|
94
|
+
// Authentication: SSO (Enterprise) takes priority over basic auth when
|
|
95
|
+
// licensed AND enabled. Otherwise fall back to basic auth, or 503 if no
|
|
96
|
+
// credentials are configured.
|
|
97
|
+
const ssoActive = isFeatureLicensed("sso") && config.sso?.enabled === true;
|
|
98
|
+
// Warn when sso config is present but the feature is not licensed —
|
|
99
|
+
// operators with `sso.enabled: true` in their config but no enterprise
|
|
100
|
+
// license would otherwise silently get basicAuth with no clue why.
|
|
101
|
+
if (config.sso?.enabled === true && !isFeatureLicensed("sso")) {
|
|
102
|
+
logger.warn("SSO is configured (sso.enabled=true) but the 'sso' feature is not licensed — falling back to basic auth");
|
|
103
|
+
}
|
|
104
|
+
if (ssoActive) {
|
|
105
|
+
if (!config.workos) {
|
|
106
|
+
throw new Error("SSO is licensed and enabled, but no WorkosClient was provided to createDashboard(). " +
|
|
107
|
+
"Pass `workos: await getDefaultWorkosClient(sso.workosApiKey)`.");
|
|
108
|
+
}
|
|
109
|
+
logger.info("Mounting SSO auth router and session middleware");
|
|
110
|
+
const authRouter = createAuthRouter({
|
|
111
|
+
db: config.db,
|
|
112
|
+
sso: config.sso,
|
|
113
|
+
workos: config.workos,
|
|
114
|
+
});
|
|
115
|
+
app.route("/", authRouter);
|
|
116
|
+
app.use("*", createSsoMiddleware({ db: config.db, sso: config.sso }));
|
|
117
|
+
}
|
|
118
|
+
else if (config.auth?.username && config.auth?.password) {
|
|
81
119
|
app.use("*", basicAuth({
|
|
82
120
|
username: config.auth.username,
|
|
83
121
|
password: config.auth.password,
|
|
@@ -89,8 +127,17 @@ export function createDashboard(config) {
|
|
|
89
127
|
"Set DASHBOARD_USER and DASHBOARD_PASSWORD environment variables and restart.", 503);
|
|
90
128
|
});
|
|
91
129
|
}
|
|
92
|
-
// Static files
|
|
93
|
-
|
|
130
|
+
// Static files. Resolve `static/` relative to this module's installed
|
|
131
|
+
// location, not the consumer's cwd. Without this, npm-installed users
|
|
132
|
+
// (every operator running from a `.urateam/` sidecar) hit a startup
|
|
133
|
+
// warning because `./packages/dashboard/src/` is repo-relative and
|
|
134
|
+
// doesn't exist outside the urateam monorepo. See urateam#101.
|
|
135
|
+
//
|
|
136
|
+
// After build, `import.meta.url` resolves to dist/server.js, so the
|
|
137
|
+
// join lands at dist/static/ — where the build script copies src/static/
|
|
138
|
+
// before publishing.
|
|
139
|
+
const dashboardModuleDir = dirname(fileURLToPath(import.meta.url));
|
|
140
|
+
app.use("/static/*", serveStatic({ root: join(dashboardModuleDir, "static") }));
|
|
94
141
|
// Mount routes — pass basePath so every layout() call uses the correct prefix.
|
|
95
142
|
const runsRouter = createRunsRouter(config.db, basePath);
|
|
96
143
|
app.route("/", runsRouter);
|
|
@@ -102,6 +149,17 @@ export function createDashboard(config) {
|
|
|
102
149
|
app.route("/", configRouter);
|
|
103
150
|
const coordinationRouter = createCoordinationRouter(config.db, basePath);
|
|
104
151
|
app.route("/", coordinationRouter);
|
|
152
|
+
const auditRouter = createAuditRouter(config.db, basePath);
|
|
153
|
+
app.route("/", auditRouter);
|
|
154
|
+
const costRouter = createCostRouter({
|
|
155
|
+
db: config.db,
|
|
156
|
+
costs: config.costs,
|
|
157
|
+
pipelineConfigs: config.pipelineConfigs,
|
|
158
|
+
basePath,
|
|
159
|
+
});
|
|
160
|
+
app.route("/", costRouter);
|
|
161
|
+
const usersRouter = createUsersRouter({ db: config.db, basePath });
|
|
162
|
+
app.route("/", usersRouter);
|
|
105
163
|
return app;
|
|
106
164
|
}
|
|
107
165
|
//# sourceMappingURL=server.js.map
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|