From 123eb1c26e7530ab59addf6dff7be05f4949d15a Mon Sep 17 00:00:00 2001 From: Grant Fletcher Date: Sat, 9 May 2026 05:52:49 -0400 Subject: [PATCH] feat: add enterprise tooling --- README.md | 4 + enterprise-tooling/README.md | 57 ++++++++ enterprise-tooling/docs/demo-script.md | 6 + enterprise-tooling/docs/demo/dashboard.png | Bin 0 -> 71845 bytes .../docs/demo/enterprise-tooling-demo.mp4 | Bin 0 -> 42984 bytes enterprise-tooling/package.json | 14 ++ enterprise-tooling/public/app.js | 28 ++++ enterprise-tooling/public/index.html | 40 +++++ enterprise-tooling/public/styles.css | 110 ++++++++++++++ enterprise-tooling/src/enterprise-core.js | 138 ++++++++++++++++++ enterprise-tooling/src/server.js | 54 +++++++ .../test/enterprise-core.test.js | 37 +++++ 12 files changed, 488 insertions(+) create mode 100644 enterprise-tooling/README.md create mode 100644 enterprise-tooling/docs/demo-script.md create mode 100644 enterprise-tooling/docs/demo/dashboard.png create mode 100644 enterprise-tooling/docs/demo/enterprise-tooling-demo.mp4 create mode 100644 enterprise-tooling/package.json create mode 100644 enterprise-tooling/public/app.js create mode 100644 enterprise-tooling/public/index.html create mode 100644 enterprise-tooling/public/styles.css create mode 100644 enterprise-tooling/src/enterprise-core.js create mode 100644 enterprise-tooling/src/server.js create mode 100644 enterprise-tooling/test/enterprise-core.test.js diff --git a/README.md b/README.md index d338cf6..3665781 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,6 @@ # deepevents.ai deepevents.ai main codebase + +## Modules + +- [`enterprise-tooling`](./enterprise-tooling) - runnable prototype for institutional dashboards, enterprise integrations, webhooks, compliance analytics, and export pipelines. diff --git a/enterprise-tooling/README.md b/enterprise-tooling/README.md new file mode 100644 index 0000000..c0d7867 --- /dev/null +++ b/enterprise-tooling/README.md @@ -0,0 +1,57 @@ +# Enterprise Tooling + +This module is a self-contained implementation for SCIBASE.AI issue #19. It models enterprise admin dashboards, institutional APIs/webhooks, and export pipelines for research organizations. + +## What It Covers + +- Organization-wide admin dashboard with project, storage, compute, submission, review, and reproducibility metrics. +- Contributor analytics with activity and collaboration signals. +- Compliance tracking for funder mandates, open-access status, reproducibility scores, and internal tags. +- Secure REST API catalog for institutional repositories, LMS, ELN, inventory, HRIS, and ORCID-style integrations. +- Webhook payloads for project publication and review events. +- Export pipelines for Zenodo, PubMed, arXiv, bioRxiv, journal, and funder-style handoffs. +- Formatting plugin metadata that preserves DOI, ORCID, citations, and version history. + +## Run Locally + +```bash +cd enterprise-tooling +npm test +npm start +``` + +Then open `http://localhost:4132`. + +## API Surface + +- `GET /api/dashboard` +- `GET /api/enterprise/analytics` +- `GET /api/enterprise/catalog` +- `GET /api/enterprise/webhook-preview` +- `GET /api/enterprise/export-preview?target=Zenodo&format=JATS` + +## Requirement Mapping + +- Admin dashboards: implemented by `buildAdminDashboard`. +- Contributor analytics, usage stats, productivity metrics, compliance tracking, and tags: returned in the dashboard payload. +- API and webhooks: implemented by `buildRestApiCatalog` and `createWebhookEvent`. +- Institutional integrations: represented by DSpace, Canvas, Benchling, and ORCID sync metadata. +- Export pipelines: implemented by `buildExportPipeline`. +- Formatting plugins and preserved metadata: represented by pipeline plugin lists and preserved DOI/ORCID/citation/version fields. + +## Verification + +```bash +npm test +node src/server.js +``` + +Optional smoke checks: + +```bash +curl -s http://localhost:4132/api/dashboard +curl -s http://localhost:4132/api/enterprise/webhook-preview +curl -s "http://localhost:4132/api/enterprise/export-preview?target=Zenodo&format=JATS" +``` + +Demo artifacts are committed under `docs/demo/`, including `dashboard.png` and `enterprise-tooling-demo.mp4`. diff --git a/enterprise-tooling/docs/demo-script.md b/enterprise-tooling/docs/demo-script.md new file mode 100644 index 0000000..0a22d99 --- /dev/null +++ b/enterprise-tooling/docs/demo-script.md @@ -0,0 +1,6 @@ +# Demo Script + +1. Run `npm test` to verify dashboard metrics, API catalog, webhooks, and export pipelines. +2. Run `npm start` and open `http://localhost:4132`. +3. Confirm the dashboard shows enterprise metrics, integrations, compliance rows, and export metadata. +4. Smoke-test `/api/enterprise/webhook-preview` and `/api/enterprise/export-preview?target=Zenodo&format=JATS`. diff --git a/enterprise-tooling/docs/demo/dashboard.png b/enterprise-tooling/docs/demo/dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..63dd67a7bca5769fbd4804db5b77df5f3f279870 GIT binary patch literal 71845 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 V{U4Q|i2{J8hcVFfV0pGY{y!-paF751 literal 0 HcmV?d00001 diff --git a/enterprise-tooling/package.json b/enterprise-tooling/package.json new file mode 100644 index 0000000..0d3ca7c --- /dev/null +++ b/enterprise-tooling/package.json @@ -0,0 +1,14 @@ +{ + "name": "@scibase/enterprise-tooling", + "version": "0.1.0", + "private": true, + "description": "Self-contained enterprise tooling prototype for SCIBASE.AI issue #19.", + "type": "module", + "scripts": { + "start": "node src/server.js", + "test": "node --test test/*.test.js" + }, + "engines": { + "node": ">=20" + } +} diff --git a/enterprise-tooling/public/app.js b/enterprise-tooling/public/app.js new file mode 100644 index 0000000..1120354 --- /dev/null +++ b/enterprise-tooling/public/app.js @@ -0,0 +1,28 @@ +const payload = await fetch("/api/dashboard").then((response) => response.json()); + +document.querySelector("#orgName").textContent = payload.dashboard.organization; +document.querySelector("#overview").innerHTML = [ + row("Projects", payload.dashboard.overview.projects), + row("Storage", `${payload.dashboard.overview.storageGb} GB`), + row("Compute", `${payload.dashboard.overview.computeHours} hours`), + row("Average reproducibility", payload.dashboard.overview.averageReproducibility) +].join(""); + +document.querySelector("#api").innerHTML = payload.api.integrations + .map((integration) => `

${integration.name}${integration.type} · ${integration.enabled ? "enabled" : "disabled"}
`) + .join(""); + +document.querySelector("#compliance").innerHTML = payload.dashboard.compliance + .map((item) => `
${item.projectId}${item.mandate} · ${item.status} · score ${item.reproducibilityScore}
`) + .join(""); + +document.querySelector("#export").innerHTML = [ + row("Target", payload.exportPipeline.target), + row("Format", payload.exportPipeline.format), + row("Compliance", payload.exportPipeline.complianceStatus), + row("Preserves", payload.exportPipeline.preservedMetadata.join(", ")) +].join(""); + +function row(label, value) { + return `
${label}${String(value)}
`; +} diff --git a/enterprise-tooling/public/index.html b/enterprise-tooling/public/index.html new file mode 100644 index 0000000..c1d416e --- /dev/null +++ b/enterprise-tooling/public/index.html @@ -0,0 +1,40 @@ + + + + + + SCIBASE Enterprise Tooling + + + +
+
+

SCIBASE.AI / issue #19

+

Enterprise Tooling

+
+
+
+

Admin Dashboard

+

Loading...

+
+
+
+

API & Webhooks

+

Institutional integrations

+
+
+
+

Compliance

+

Funder and open-access status

+
+
+
+

Export Pipeline

+

Publication handoff

+
+
+
+
+ + + diff --git a/enterprise-tooling/public/styles.css b/enterprise-tooling/public/styles.css new file mode 100644 index 0000000..997428b --- /dev/null +++ b/enterprise-tooling/public/styles.css @@ -0,0 +1,110 @@ +:root { + --ink: #141816; + --muted: #63706b; + --line: #d8dfda; + --paper: #f5f4ed; + --panel: #ffffff; + --green: #17664c; + --blue: #285f8e; +} + +* { + box-sizing: border-box; +} + +body { + margin: 0; + background: var(--paper); + color: var(--ink); + font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; +} + +.shell { + max-width: 1280px; + margin: 0 auto; + padding: 32px; +} + +header { + display: flex; + align-items: end; + justify-content: space-between; + gap: 24px; + margin-bottom: 24px; +} + +p, +h1, +h2 { + margin: 0; +} + +header p, +.label { + color: var(--muted); + font-size: 12px; + font-weight: 900; + letter-spacing: 0.08em; + text-transform: uppercase; +} + +h1 { + max-width: 760px; + font-size: clamp(38px, 6vw, 76px); + line-height: 0.95; +} + +h2 { + margin-top: 8px; + font-size: 24px; +} + +.grid { + display: grid; + grid-template-columns: 1.05fr 0.95fr; + gap: 16px; +} + +.panel { + min-height: 260px; + border: 1px solid var(--line); + background: var(--panel); + padding: 24px; +} + +.hero { + grid-row: span 2; +} + +.row { + border-top: 1px solid var(--line); + padding-top: 12px; + margin-top: 14px; +} + +.row span { + display: block; + color: var(--muted); +} + +.row strong { + display: block; + color: var(--green); + overflow-wrap: anywhere; +} + +.hero .row strong { + color: var(--blue); +} + +@media (max-width: 820px) { + .shell { + padding: 18px; + } + + header, + .grid { + display: grid; + grid-template-columns: 1fr; + } +} diff --git a/enterprise-tooling/src/enterprise-core.js b/enterprise-tooling/src/enterprise-core.js new file mode 100644 index 0000000..6ef622e --- /dev/null +++ b/enterprise-tooling/src/enterprise-core.js @@ -0,0 +1,138 @@ +export const organization = { + id: "org-university-research", + name: "University Research Office", + departments: ["Oncology", "Neuroscience", "Materials Science"], + projects: [ + { id: "proj-organoid", title: "Organoid response atlas", department: "Oncology", visibility: "public", storageGb: 42, computeHours: 18, submissions: 3, aiReviews: 7, peerReviews: 5, reproducibilityScore: 94, openAccess: true, funderMandate: "NIH", tags: ["GRANT-TRACKED"] }, + { id: "proj-neuro", title: "CRISPR neural clustering", department: "Neuroscience", visibility: "private", storageGb: 28, computeHours: 31, submissions: 1, aiReviews: 4, peerReviews: 2, reproducibilityScore: 87, openAccess: false, funderMandate: "Horizon EU", tags: ["DOCTORAL WORK"] }, + { id: "proj-materials", title: "Polymer catalyst screening", department: "Materials Science", visibility: "institutional", storageGb: 64, computeHours: 44, submissions: 2, aiReviews: 6, peerReviews: 4, reproducibilityScore: 91, openAccess: true, funderMandate: "UKRI", tags: ["INDUSTRY"] } + ], + contributors: [ + { id: "user-alice", name: "Alice Chen", lab: "Oncology", logins: 42, commits: 18, collaborations: ["Neuroscience"], orcid: "0000-0002-1825-0097" }, + { id: "user-mateo", name: "Mateo Rivera", lab: "Open Reproducibility", logins: 33, commits: 21, collaborations: ["Oncology", "Materials Science"], orcid: "0000-0003-2201-4120" }, + { id: "user-sam", name: "Sam Okafor", lab: "Materials Science", logins: 24, commits: 11, collaborations: ["Oncology"], orcid: "0000-0001-9911-4412" } + ], + integrations: [ + { id: "dspace", name: "DSpace", type: "institutional-repository", endpoint: "https://repo.example/api", enabled: true }, + { id: "canvas", name: "Canvas", type: "lms", endpoint: "https://canvas.example/api", enabled: true }, + { id: "benchling", name: "Benchling", type: "eln", endpoint: "https://benchling.example/api", enabled: false }, + { id: "orcid", name: "ORCID Sync", type: "personnel", endpoint: "https://orcid.org/api", enabled: true } + ] +}; + +export function buildAdminDashboard(org = organization) { + const totals = org.projects.reduce( + (acc, project) => { + acc.projects += 1; + acc.storageGb += project.storageGb; + acc.computeHours += project.computeHours; + acc.submissions += project.submissions; + acc.aiReviews += project.aiReviews; + acc.peerReviews += project.peerReviews; + acc.publicProjects += project.visibility === "public" ? 1 : 0; + acc.openAccess += project.openAccess ? 1 : 0; + acc.reproducibility += project.reproducibilityScore; + return acc; + }, + { projects: 0, storageGb: 0, computeHours: 0, submissions: 0, aiReviews: 0, peerReviews: 0, publicProjects: 0, openAccess: 0, reproducibility: 0 } + ); + return { + organization: org.name, + overview: { ...totals, averageReproducibility: Math.round(totals.reproducibility / totals.projects) }, + departmentMetrics: org.departments.map((department) => summarizeDepartment(org, department)), + contributorAnalytics: org.contributors.map((contributor) => ({ + ...contributor, + productivityScore: contributor.commits * 2 + contributor.logins + contributor.collaborations.length * 8 + })), + compliance: org.projects.map((project) => ({ + projectId: project.id, + mandate: project.funderMandate, + openAccess: project.openAccess, + reproducibilityScore: project.reproducibilityScore, + status: project.openAccess && project.reproducibilityScore >= 90 ? "compliant" : "attention" + })), + tags: [...new Set(org.projects.flatMap((project) => project.tags))] + }; +} + +export function buildRestApiCatalog(org = organization) { + return { + auth: "Bearer token scoped to institution", + routes: [ + "GET /api/enterprise/projects", + "GET /api/enterprise/contributors", + "GET /api/enterprise/compliance", + "POST /api/enterprise/webhooks", + "POST /api/enterprise/exports" + ], + integrations: org.integrations, + scopes: ["read:projects", "read:analytics", "write:webhooks", "write:exports"] + }; +} + +export function createWebhookEvent(type, projectId, org = organization) { + const project = org.projects.find((item) => item.id === projectId); + if (!project) throw new Error(`Unknown project: ${projectId}`); + return { + id: `evt-${type}-${projectId}`, + type, + createdAt: "2026-05-09T00:00:00.000Z", + deliveryTargets: org.integrations.filter((integration) => integration.enabled).map((integration) => integration.endpoint), + payload: { + projectId, + title: project.title, + department: project.department, + visibility: project.visibility, + reproducibilityScore: project.reproducibilityScore, + tags: project.tags + } + }; +} + +export function buildExportPipeline({ projectId, target = "Zenodo", format = "JATS" }, org = organization) { + const project = org.projects.find((item) => item.id === projectId); + if (!project) throw new Error(`Unknown project: ${projectId}`); + const plugins = { + arXiv: ["LaTeX", "BibTeX", "PDF"], + bioRxiv: ["Docx", "JATS", "Figures"], + PubMed: ["JATS", "NIH metadata", "ORCID"], + Zenodo: ["DataCite DOI", "metadata.json", "version history"], + "NIH RePORTER": ["grant metadata", "public access compliance"] + }; + return { + projectId, + target, + format, + steps: [ + "validate project metadata", + `render manuscript as ${format}`, + "attach DOI, ORCID, citations, and version history", + `package repository for ${target}`, + "emit export.completed webhook" + ], + preservedMetadata: ["DOI", "ORCID", "citations", "version history", "funder mandate"], + plugins: plugins[target] || ["Docx", "metadata"], + complianceStatus: project.openAccess ? "ready" : "requires open-access review" + }; +} + +export function buildEnterprisePayload() { + return { + dashboard: buildAdminDashboard(), + api: buildRestApiCatalog(), + webhook: createWebhookEvent("project.published", "proj-organoid"), + exportPipeline: buildExportPipeline({ projectId: "proj-organoid", target: "Zenodo", format: "JATS" }) + }; +} + +function summarizeDepartment(org, department) { + const projects = org.projects.filter((project) => project.department === department); + return { + department, + projectCount: projects.length, + computeHours: projects.reduce((sum, project) => sum + project.computeHours, 0), + storageGb: projects.reduce((sum, project) => sum + project.storageGb, 0), + aiReviews: projects.reduce((sum, project) => sum + project.aiReviews, 0), + peerReviews: projects.reduce((sum, project) => sum + project.peerReviews, 0) + }; +} diff --git a/enterprise-tooling/src/server.js b/enterprise-tooling/src/server.js new file mode 100644 index 0000000..0cb8b2b --- /dev/null +++ b/enterprise-tooling/src/server.js @@ -0,0 +1,54 @@ +import http from "node:http"; +import { readFile } from "node:fs/promises"; +import { extname, join, resolve, sep } from "node:path"; +import { fileURLToPath } from "node:url"; +import { buildAdminDashboard, buildEnterprisePayload, buildExportPipeline, buildRestApiCatalog, createWebhookEvent } from "./enterprise-core.js"; + +const root = join(fileURLToPath(new URL("..", import.meta.url)), "public"); +const port = Number(process.env.PORT || 4132); +const contentTypes = { ".html": "text/html; charset=utf-8", ".css": "text/css; charset=utf-8", ".js": "text/javascript; charset=utf-8" }; + +const server = http.createServer(async (request, response) => { + try { + const url = new URL(request.url, `http://${request.headers.host}`); + if (url.pathname === "/api/dashboard") return json(response, buildEnterprisePayload()); + if (url.pathname === "/api/enterprise/analytics") return json(response, buildAdminDashboard()); + if (url.pathname === "/api/enterprise/catalog") return json(response, buildRestApiCatalog()); + if (url.pathname === "/api/enterprise/webhook-preview") return json(response, createWebhookEvent("project.published", "proj-organoid")); + if (url.pathname === "/api/enterprise/export-preview") return json(response, buildExportPipeline({ projectId: "proj-organoid", target: url.searchParams.get("target") || "Zenodo", format: url.searchParams.get("format") || "JATS" })); + return await serveStatic(url.pathname === "/" ? "/index.html" : url.pathname, response); + } catch (error) { + response.writeHead(500, { "content-type": "application/json; charset=utf-8" }); + response.end(JSON.stringify({ error: error.message })); + } +}); + +server.listen(port, () => { + console.log(`Enterprise tooling demo running at http://localhost:${port}`); +}); + +function json(response, body) { + response.writeHead(200, { "content-type": "application/json; charset=utf-8" }); + response.end(JSON.stringify(body, null, 2)); +} + +async function serveStatic(pathname, response) { + const filePath = resolve(root, pathname.replace(/^\/+/, "")); + if (!filePath.startsWith(`${root}${sep}`)) { + response.writeHead(403, { "content-type": "text/plain; charset=utf-8" }); + response.end("Forbidden"); + return; + } + try { + const body = await readFile(filePath); + response.writeHead(200, { "content-type": contentTypes[extname(filePath)] || "application/octet-stream" }); + response.end(body); + } catch (error) { + if (error.code === "ENOENT") { + response.writeHead(404, { "content-type": "text/plain; charset=utf-8" }); + response.end("Not found"); + return; + } + throw error; + } +} diff --git a/enterprise-tooling/test/enterprise-core.test.js b/enterprise-tooling/test/enterprise-core.test.js new file mode 100644 index 0000000..021bad0 --- /dev/null +++ b/enterprise-tooling/test/enterprise-core.test.js @@ -0,0 +1,37 @@ +import test from "node:test"; +import assert from "node:assert/strict"; +import { buildAdminDashboard, buildEnterprisePayload, buildExportPipeline, buildRestApiCatalog, createWebhookEvent } from "../src/enterprise-core.js"; + +test("builds enterprise admin dashboard metrics", () => { + const dashboard = buildAdminDashboard(); + + assert.equal(dashboard.overview.projects, 3); + assert.ok(dashboard.overview.storageGb > 100); + assert.ok(dashboard.departmentMetrics.some((item) => item.department === "Oncology")); + assert.ok(dashboard.compliance.some((item) => item.status === "attention")); +}); + +test("exposes secure API catalog and enabled integrations", () => { + const catalog = buildRestApiCatalog(); + + assert.match(catalog.auth, /Bearer token/); + assert.ok(catalog.routes.includes("POST /api/enterprise/webhooks")); + assert.ok(catalog.integrations.some((integration) => integration.type === "lms")); +}); + +test("creates structured webhook events", () => { + const event = createWebhookEvent("project.published", "proj-organoid"); + + assert.equal(event.type, "project.published"); + assert.ok(event.deliveryTargets.length >= 2); + assert.equal(event.payload.reproducibilityScore, 94); +}); + +test("builds export pipeline preserving scholarly metadata", () => { + const pipeline = buildExportPipeline({ projectId: "proj-organoid", target: "Zenodo", format: "JATS" }); + const payload = buildEnterprisePayload(); + + assert.ok(pipeline.plugins.includes("DataCite DOI")); + assert.ok(pipeline.preservedMetadata.includes("ORCID")); + assert.equal(payload.exportPipeline.complianceStatus, "ready"); +});