Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,6 @@
# deepevents.ai
deepevents.ai main codebase

## Modules

- [`ai-assisted-research-tools`](./ai-assisted-research-tools) - runnable prototype for AI paper summaries, peer review diagnostics, and citation recommendations for scientific manuscripts.
68 changes: 68 additions & 0 deletions ai-assisted-research-tools/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
# AI-Assisted Research Tools

This module is a self-contained implementation for SCIBASE.AI issue #13. It provides a runnable MVP for three AI-assisted research workflows: paper summarization, peer review diagnostics, and citation recommendation.

## What It Covers

- AI Paper Summarizer
- Abstract, executive, and layperson summary modes.
- Domain-aware keyword extraction and manuscript profiling.
- Key findings, implications, and recommended next steps.
- AI Peer Review Aid
- Diagnostic report for similarity, grammar/clarity, statistical reporting, and compliance gaps.
- Domain templates for biology, physics, and social science.
- Checklist output for ethics, consent, data availability, uncertainty, and related statements.
- AI Citation Tool
- Context-aware citation retrieval from a local open-corpus fixture.
- APA, MLA, and Nature formatting.
- Similar-paper suggestions and manuscript insertion snippets.
- Browser demo and JSON API
- Static dashboard for reviewers.
- No external services, keys, seed funding, or paid APIs required.

## Run Locally

```bash
cd ai-assisted-research-tools
npm test
npm start
```

Then open `http://localhost:4128`.

## API Surface

- `GET /api/dashboard` returns the full manuscript profile, all summary modes, peer review report, and citation recommendations.
- `GET /api/summarize?mode=abstract|executive|layperson` returns one summary mode.
- `GET /api/review` returns the diagnostic peer review report.
- `GET /api/citations?style=APA|MLA|Nature` returns formatted citation recommendations.

## Requirement Mapping

- Concise summaries of repositories, preprints, or uploaded PDFs: implemented as manuscript section summarization in `src/research-ai.js`.
- Abstract, executive, and layperson modes: implemented by `summarizePaper`.
- Domain-aware output: implemented through keyword extraction, domain inference, and review templates.
- Key findings, implications, and next steps: returned by `summarizePaper`.
- Peer review diagnostic reports: implemented by `peerReviewAid`.
- Plagiarism/similarity, grammar/clarity, statistical, and compliance checks: implemented by dedicated detector functions in `src/research-ai.js`.
- Custom templates for biology, physics, and social science: configured in `src/data/open-corpus.js`.
- Citation recommendations from open corpora: implemented by `recommendCitations` using a local Semantic Scholar/arXiv/PubMed-style corpus fixture.
- APA, MLA, and Nature citation formatting: implemented by `formatCitation`.
- Similar papers widget and insert text: returned by `recommendCitations` and rendered in the browser dashboard.

## Verification

```bash
npm test
node src/server.js
```

Optional smoke checks:

```bash
curl -s http://localhost:4128/api/dashboard
curl -s "http://localhost:4128/api/summarize?mode=layperson"
curl -s "http://localhost:4128/api/citations?style=Nature"
```

Demo artifacts are committed under `docs/demo/`, including `dashboard.png`, `ai-assisted-research-tools.svg`, and `ai-assisted-research-tools-demo.mp4`.
8 changes: 8 additions & 0 deletions ai-assisted-research-tools/docs/demo-script.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# Demo Script

1. Run `npm test` to verify summarization, peer review, citation, and dashboard logic.
2. Run `npm start` and open `http://localhost:4128`.
3. Switch between Abstract, Executive, and Layperson summary modes.
4. Review the diagnostic report for similarity, statistics, compliance, and clarity findings.
5. Change the citation style selector and verify formatted APA, MLA, or Nature references.
6. Use the citation insert text shown on each recommendation as the manuscript insertion preview.
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
14 changes: 14 additions & 0 deletions ai-assisted-research-tools/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
{
"name": "@scibase/ai-assisted-research-tools",
"version": "0.1.0",
"private": true,
"description": "Self-contained AI-assisted research tooling prototype for SCIBASE.AI issue #13.",
"type": "module",
"scripts": {
"start": "node src/server.js",
"test": "node --test test/*.test.js"
},
"engines": {
"node": ">=20"
}
}
98 changes: 98 additions & 0 deletions ai-assisted-research-tools/public/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
let dashboard;

const elements = {
title: document.querySelector("#title"),
profile: document.querySelector("#profile"),
highlighted: document.querySelector("#highlighted"),
score: document.querySelector("#score"),
summary: document.querySelector("#summary"),
findings: document.querySelector("#findings"),
nextSteps: document.querySelector("#nextSteps"),
template: document.querySelector("#template"),
issues: document.querySelector("#issues"),
citations: document.querySelector("#citations"),
style: document.querySelector("#style")
};

async function loadDashboard() {
dashboard = await fetchJson("/api/dashboard");
elements.title.textContent = dashboard.profile.title;
elements.profile.innerHTML = profileItem("Domain", dashboard.profile.domain) + profileItem("Words", dashboard.profile.wordCount) + profileItem("Keywords", dashboard.profile.keywords.slice(0, 5).join(", "));
elements.highlighted.textContent = dashboard.citations.highlightedText;
elements.score.textContent = dashboard.review.score;
renderSummary("abstract");
renderReview();
renderCitations(dashboard.citations);
}

function renderSummary(mode) {
const summary = dashboard.summaries[mode];
elements.summary.textContent = summary.summary;
elements.findings.innerHTML = summary.keyFindings.map((item) => `<li>${escapeHtml(item)}</li>`).join("");
elements.nextSteps.innerHTML = summary.nextSteps.map((item) => `<li>${escapeHtml(item)}</li>`).join("");
}

function renderReview() {
elements.template.textContent = dashboard.review.template;
elements.issues.innerHTML = dashboard.review.issues
.map(
(issue) => `
<article class="issue ${issue.severity}">
<div>
<span>${issue.type}</span>
<strong>${issue.severity}</strong>
</div>
<p>${escapeHtml(issue.message)}</p>
<small>${escapeHtml(issue.evidence)}</small>
</article>
`
)
.join("");
}

function renderCitations(citationPayload) {
elements.citations.innerHTML = citationPayload.recommendations
.map(
(paper) => `
<article class="citation">
<div>
<strong>${escapeHtml(paper.title)}</strong>
<span>${paper.score.toFixed(2)}</span>
</div>
<p>${escapeHtml(paper.reason)}</p>
<code>${escapeHtml(paper.formatted)}</code>
<button data-insert="${escapeHtml(paper.insertText)}">${escapeHtml(paper.insertText)}</button>
</article>
`
)
.join("");
}

function profileItem(label, value) {
return `<div><span>${label}</span><strong>${escapeHtml(String(value))}</strong></div>`;
}

async function fetchJson(path) {
const response = await fetch(path);
if (!response.ok) throw new Error(`Request failed: ${response.status}`);
return response.json();
}

function escapeHtml(value) {
return value.replace(/[&<>"']/g, (char) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#039;" })[char]);
}

document.querySelectorAll("[data-mode]").forEach((button) => {
button.addEventListener("click", () => {
document.querySelectorAll("[data-mode]").forEach((item) => item.classList.toggle("active", item === button));
renderSummary(button.dataset.mode);
});
});

elements.style.addEventListener("change", async () => {
renderCitations(await fetchJson(`/api/citations?style=${encodeURIComponent(elements.style.value)}`));
});

loadDashboard().catch((error) => {
document.body.innerHTML = `<pre>${escapeHtml(error.stack || error.message)}</pre>`;
});
87 changes: 87 additions & 0 deletions ai-assisted-research-tools/public/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>SCIBASE AI-Assisted Research Tools</title>
<link rel="stylesheet" href="/styles.css" />
</head>
<body>
<main class="shell">
<header class="topbar">
<div>
<p class="eyebrow">SCIBASE.AI / issue #13</p>
<h1>AI-Assisted Research Tools</h1>
</div>
<div class="score" aria-label="review quality score">
<span id="score">--</span>
<small>review score</small>
</div>
</header>

<section class="workspace">
<aside class="panel manuscript">
<p class="label">Manuscript</p>
<h2 id="title">Loading manuscript...</h2>
<div id="profile" class="profile-grid"></div>
<div class="highlight">
<p class="label">Highlighted text</p>
<p id="highlighted"></p>
</div>
</aside>

<section class="panel summaries">
<div class="section-heading">
<div>
<p class="label">AI Paper Summarizer</p>
<h2>Domain-aware summaries</h2>
</div>
<div class="segmented" role="tablist" aria-label="summary modes">
<button class="active" data-mode="abstract">Abstract</button>
<button data-mode="executive">Executive</button>
<button data-mode="layperson">Layperson</button>
</div>
</div>
<p id="summary" class="summary-text"></p>
<div class="columns">
<div>
<p class="label">Key findings</p>
<ul id="findings"></ul>
</div>
<div>
<p class="label">Next steps</p>
<ul id="nextSteps"></ul>
</div>
</div>
</section>

<section class="panel review">
<div class="section-heading">
<div>
<p class="label">AI Peer Review Aid</p>
<h2>Diagnostic manuscript report</h2>
</div>
<span id="template" class="tag"></span>
</div>
<div id="issues" class="issue-list"></div>
</section>

<section class="panel citations">
<div class="section-heading">
<div>
<p class="label">AI Citation Tool</p>
<h2>Recommendations and insert text</h2>
</div>
<select id="style" aria-label="citation style">
<option>Nature</option>
<option>APA</option>
<option>MLA</option>
</select>
</div>
<div id="citations" class="citation-list"></div>
</section>
</section>
</main>
<script src="/app.js" type="module"></script>
</body>
</html>
Loading