Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
7a4eb45
chore: rename worm error handling to mask proofreading
akgohain Feb 10, 2026
43833b6
fix: allow cmd+a in text inputs
akgohain Feb 10, 2026
e920faf
WIP: instance-first proofreading backend
akgohain Feb 17, 2026
41edd23
WIP: instance-first proofreading UI
akgohain Feb 17, 2026
045edf8
ehtool: add blob instance views and sparse masks
akgohain Feb 17, 2026
3ccfe66
mask proofreading: stream views with previews, axis, and cursor
akgohain Feb 17, 2026
f8021d0
mask proofreading: tidy sidebar labels
akgohain Feb 17, 2026
1d5f8c4
mask proofreading: persist overlays and add axis hints
akgohain Feb 17, 2026
683388c
ehtool: persist instance review progress
akgohain Feb 17, 2026
7b3ca6a
ehtool: accelerate instance slice loading and stabilize proofreading …
akgohain Mar 8, 2026
250f6fc
ehtool: harden instance edits and persist proofreading schema v2
akgohain Mar 9, 2026
b8eef08
ehtool: enable all-axis proofreading and smoother slice commits
akgohain Mar 9, 2026
0654039
ehtool: stabilize minimap and viewport interactions in editor
akgohain Mar 9, 2026
1d84bd9
ehtool: harden persistence and extend proofreading image APIs
akgohain Mar 9, 2026
e3029ba
ehtool: streamline proofreading UI and slice traversal workflow
akgohain Mar 9, 2026
8f4a52a
ehtool: accelerate slice traversal and reduce render hot-path overhead
akgohain Mar 10, 2026
c935a11
style: format ehtool data manager with black
akgohain Mar 10, 2026
36a54e5
style: apply prettier to ehtool traversal updates
akgohain Mar 10, 2026
36be130
style: align ehtool data manager with super-linter black
akgohain Mar 10, 2026
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
5 changes: 3 additions & 2 deletions client/main.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ function createMenu() {
label: "Electron",
submenu: [{ role: "toggleDevTools" }, { role: "quit" }],
},
{ role: "editMenu" },
{
label: "Edit",
submenu: [
Expand Down Expand Up @@ -140,13 +141,13 @@ function createMenu() {
),
},
{
label: "Worm Error Handling",
label: "Mask Proofreading",
type: "checkbox",
checked: false,
click: (menuItem) =>
mainWindow.webContents.send(
"toggle-tab",
"worm-error-handling",
"mask-proofreading",
menuItem.checked,
),
},
Expand Down
1 change: 1 addition & 0 deletions client/src/components/FilePickerModal.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import { apiClient } from "../api";

const HIDDEN_SYSTEM_FILES = new Set([
"workflow_preference.json",
".pytc_proofreading.json",
".ds_store",
"thumbs.db",
]);
Expand Down
4 changes: 2 additions & 2 deletions client/src/components/WorkflowSelector.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,8 +36,8 @@ const WorkflowSelector = ({ visible, onSelect, onCancel }) => {
{ label: "Tensorboard", value: "monitoring", icon: <DashboardOutlined /> },
{ label: "SynAnno", value: "synanno", icon: <ApartmentOutlined /> },
{
label: "Worm Error Handling",
value: "worm-error-handling",
label: "Mask Proofreading",
value: "mask-proofreading",
icon: <BugOutlined />,
},
];
Expand Down
17 changes: 3 additions & 14 deletions client/src/views/EHTool.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import React, { useState, useEffect } from "react";
import { Layout } from "antd";
import { BugOutlined } from "@ant-design/icons";
import DetectionWorkflow from "./ehtool/DetectionWorkflow";

const { Content } = Layout;

/**
* EHTool Main Component
* Error Handling Tool for detecting and classifying errors in image stacks
* Mask proofreading workflow for reviewing slices in image stacks
*/
function EHTool({
onStartProofreading,
Expand All @@ -33,18 +32,8 @@ function EHTool({
}, [sessionId, onSessionChange]);

return (
<Layout style={{ height: "100%", background: "#fff" }}>
<Content style={{ padding: "16px" }}>
<div style={{ marginBottom: "16px" }}>
<h2 style={{ margin: 0 }}>
<BugOutlined style={{ marginRight: "8px" }} />
Error Handling Tool
</h2>
<p style={{ color: "#666", marginTop: "4px" }}>
Detect and classify errors in image stacks
</p>
</div>

<Layout style={{ height: "100%", background: "#f6f8fb" }}>
<Content style={{ padding: "20px 24px" }}>
<DetectionWorkflow
sessionId={sessionId}
setSessionId={setSessionId}
Expand Down
36 changes: 10 additions & 26 deletions client/src/views/FilesManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import FileTreeSidebar from "../components/FileTreeSidebar";

const HIDDEN_SYSTEM_FILES = new Set([
"workflow_preference.json",
".pytc_proofreading.json",
".ds_store",
"thumbs.db",
]);
Expand Down Expand Up @@ -150,7 +151,6 @@ function FilesManager() {
setServerUnavailable(true);
if (!hasShownServerWarning && !silentNetworkError) {
setHasShownServerWarning(true);
message.warning("API server is not available yet. Retrying...");
}
}
if (!err.isAuthError && !isNetworkError) {
Expand Down Expand Up @@ -797,12 +797,19 @@ function FilesManager() {
}
return;
}
if (e.target.tagName === "INPUT") return;
const target = e.target;
if (
target &&
(target.tagName === "INPUT" ||
target.tagName === "TEXTAREA" ||
target.isContentEditable)
)
return;
if (e.key === "Delete") handleDelete();
if (e.ctrlKey && e.key === "c") handleCopy();
if (e.ctrlKey && e.key === "x") handleCut();
if (e.ctrlKey && e.key === "v") handlePaste();
if (e.ctrlKey && e.key === "a") {
if ((e.ctrlKey || e.metaKey) && e.key === "a") {
e.preventDefault();
const allKeys = [
...folders
Expand Down Expand Up @@ -1251,29 +1258,6 @@ function FilesManager() {
position: "relative",
}}
>
{serverUnavailable && (
<div
style={{
position: "absolute",
top: 80,
left: 24,
right: 24,
zIndex: 10,
}}
>
<div
style={{
padding: 12,
background: "#fffbe6",
border: "1px solid #ffe58f",
borderRadius: 8,
}}
>
API server is not ready yet. File list will load automatically when
it comes online.
</div>
</div>
)}
{isSidebarVisible && (
<>
<FileTreeSidebar
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { useState } from "react";
import EHTool from "./EHTool";

function WormErrorHandling() {
function MaskProofreading() {
const [ehToolSession, setEhToolSession] = useState(null);
const [refreshTrigger, setRefreshTrigger] = useState(0);

Expand All @@ -20,4 +20,4 @@ function WormErrorHandling() {
);
}

export default WormErrorHandling;
export default MaskProofreading;
9 changes: 8 additions & 1 deletion client/src/views/ProofReading.js
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,14 @@ function ProofReading() {
useEffect(() => {
const handleKeyPress = (e) => {
// Don't trigger shortcuts when typing in input fields
if (e.target.tagName === "INPUT") return;
const target = e.target;
if (
target &&
(target.tagName === "INPUT" ||
target.tagName === "TEXTAREA" ||
target.isContentEditable)
)
return;

switch (e.key.toLowerCase()) {
case "c":
Expand Down
8 changes: 4 additions & 4 deletions client/src/views/Views.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ import ModelTraining from "./ModelTraining";
import ModelInference from "./ModelInference";
import Monitoring from "./Monitoring";
import ProofReading from "./ProofReading";
import WormErrorHandling from "./WormErrorHandling";
import MaskProofreading from "./MaskProofreading";
import WorkflowSelector from "../components/WorkflowSelector";
import Chatbot from "../components/Chatbot";

Expand Down Expand Up @@ -48,8 +48,8 @@ function Views() {
{ label: "Tensorboard", key: "monitoring", icon: <DashboardOutlined /> },
{ label: "SynAnno", key: "synanno", icon: <ApartmentOutlined /> },
{
label: "Worm Error Handling",
key: "worm-error-handling",
label: "Mask Proofreading",
key: "mask-proofreading",
icon: <BugOutlined />,
},
];
Expand Down Expand Up @@ -224,7 +224,7 @@ function Views() {
/>,
)}
{renderTabContent("synanno", <ProofReading />)}
{renderTabContent("worm-error-handling", <WormErrorHandling />)}
{renderTabContent("mask-proofreading", <MaskProofreading />)}
</Content>
<Drawer
placement="right"
Expand Down
37 changes: 26 additions & 11 deletions client/src/views/ehtool/ClassificationPanel.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import React from "react";
import { Card, Button, Space, Divider, Tag } from "antd";
import { Card, Button, Space, Divider, Tag, Typography } from "antd";
import {
CheckCircleOutlined,
CloseCircleOutlined,
Expand All @@ -10,24 +10,30 @@ import {

/**
* Classification Panel Component
* Controls for classifying selected layers
* Controls for classifying selected slices
*/
function ClassificationPanel({
selectedCount,
onClassify,
onSelectAll,
onClearSelection,
}) {
const { Text } = Typography;

return (
<div style={{ padding: "16px" }}>
<Card
title="Classification"
size="small"
style={{ marginBottom: "16px" }}
style={{
marginBottom: "12px",
background: "#fff",
boxShadow: "0 6px 20px rgba(15, 23, 42, 0.06)",
}}
>
<div style={{ marginBottom: "16px" }}>
<Tag color={selectedCount > 0 ? "blue" : "default"}>
{selectedCount} layer{selectedCount !== 1 ? "s" : ""} selected
{selectedCount} slice{selectedCount !== 1 ? "s" : ""} selected
</Tag>
</div>

Expand All @@ -38,7 +44,7 @@ function ClassificationPanel({
onClick={() => onClassify("correct")}
disabled={selectedCount === 0}
block
style={{ background: "#52c41a", borderColor: "#52c41a" }}
style={{ background: "#22c55e", borderColor: "#22c55e" }}
>
Correct (C)
</Button>
Expand All @@ -59,17 +65,24 @@ function ClassificationPanel({
disabled={selectedCount === 0}
block
style={{
background: "#faad14",
borderColor: "#faad14",
color: "#fff",
background: "#f59e0b",
borderColor: "#f59e0b",
color: "#1f2937",
}}
>
Unsure (U)
</Button>
</Space>
</Card>

<Card title="Selection" size="small">
<Card
title="Selection"
size="small"
style={{
background: "#fff",
boxShadow: "0 6px 20px rgba(15, 23, 42, 0.06)",
}}
>
<Space direction="vertical" style={{ width: "100%" }} size="small">
<Button icon={<SelectOutlined />} onClick={onSelectAll} block>
Select All (Ctrl+A)
Expand All @@ -91,12 +104,14 @@ function ClassificationPanel({
<div
style={{
padding: "12px",
background: "#f5f5f5",
background: "#f8fafc",
borderRadius: "4px",
fontSize: "12px",
}}
>
<h4 style={{ marginTop: 0, fontSize: "13px" }}>Keyboard Shortcuts:</h4>
<Text strong style={{ fontSize: 12 }}>
Keyboard shortcuts
</Text>
<ul style={{ marginBottom: 0, paddingLeft: "20px" }}>
<li>
<kbd>C</kbd> - Mark as Correct
Expand Down
Loading
Loading