Major refactoring cleanup: - Add new controller architecture (class-controller-*.php) - Add new settings-v2 UI (views/settings-v2/) - Add new CSS architecture (agentic-sidebar.css, tokens) - Add esbuild build pipeline (scripts/build.js, package.json) - Add composer dependencies (vendor/) - Add frontend src directory (assets/js/src/index.jsx) - Add documentation files - Remove old/obsolete files (class-settings.php, old CSS) This commits all pending changes from previous refactoring efforts.
7.0 KiB
Defect Analysis: Refactored index.jsx vs Legacy sidebar.js
Date: 2026-06-16
Files Compared:
- Legacy:
wp-agentic-writer/assets/js/sidebar.js(12,347 lines) - Refactored:
wp-agentic-writer/assets/js/src/index.jsx(11,773 lines)
Executive Summary
The refactored React version (index.jsx) contains 2 critical behavioral defects compared to the legacy version (sidebar.js). These defects change the user experience when starting a new conversation from the welcome screen.
🔴 CRITICAL DEFECT #1: handleWelcomeStart Behavioral Change
Location
- Legacy: Lines 1176-1192
- Refactored: Lines 1176-1187
Description
The handleWelcomeStart function has been fundamentally changed from a synchronous state-updating function to an async function that calls startNewConversation() with API side effects.
Legacy Code (sidebar.js)
const handleWelcomeStart = () => {
// Set focus keyword if provided (but don't add to AI suggestions - it's user input)
if (welcomeKeywordInput.trim()) {
const keyword = welcomeKeywordInput.trim();
handleFocusKeywordChange(keyword);
}
// Set mode and hide welcome
setAgentMode(welcomeStartMode);
setShowWelcome(false);
// Focus the input
setTimeout(() => {
if (inputRef.current) {
inputRef.current.focus();
}
}, 100);
};
Refactored Code (index.jsx)
const handleWelcomeStart = async () => {
// Set focus keyword if provided (but don't add to AI suggestions - it's user input)
const keyword = welcomeKeywordInput.trim();
if (welcomeKeywordInput.trim()) {
handleFocusKeywordChange(keyword);
}
await startNewConversation({
focusKeyword: keyword,
mode: welcomeStartMode,
});
};
Impact
| Behavior | Legacy | Refactored |
|---|---|---|
| Function type | Synchronous | async |
Calls startNewConversation() API |
❌ NO | ✅ YES |
| Focuses input after start | ✅ YES | ❌ NO |
| Creates new session via API | ❌ NO | ✅ YES |
| Hides welcome screen | ✅ YES | ❌ NO (hidden inside startNewConversation) |
User Experience Change
- Legacy: Clicking "Start Writing" instantly hides the welcome screen, sets the agent mode, and focuses the input field for immediate typing.
- Refactored: Clicking "Start Writing" triggers an API call to create a new conversation session, which adds latency and changes the session management behavior.
Recommended Fix
const handleWelcomeStart = () => {
// Set focus keyword if provided (but don't add to AI suggestions - it's user input)
if (welcomeKeywordInput.trim()) {
const keyword = welcomeKeywordInput.trim();
handleFocusKeywordChange(keyword);
}
// Set mode and hide welcome
setAgentMode(welcomeStartMode);
setShowWelcome(false);
// Focus the input
setTimeout(() => {
if (inputRef.current) {
inputRef.current.focus();
}
}, 100);
};
🔴 CRITICAL DEFECT #2: startNewConversation API Signature Change
Location
- Legacy: Lines 8830-8915
- Refactored: Lines 8765-8851
Description
The startNewConversation function signature changed to accept an options parameter, which alters internal behavior.
Legacy Code (sidebar.js)
const startNewConversation = async () => {
// ... existing code ...
setAgentMode("chat"); // Always chat mode
// ... existing code ...
};
Refactored Code (index.jsx)
const startNewConversation = async (options = {}) => {
const { focusKeyword = "", mode = "chat" } = options;
// ... existing code ...
setAgentMode(mode); // Uses passed mode
setSelectedFocusKeyword(focusKeyword); // Sets focus keyword
// ... existing code ...
};
Impact
| Aspect | Legacy | Refactored |
|---|---|---|
| Function parameters | None | options = {} |
| Agent mode setting | Hardcoded "chat" |
From options.mode |
| Focus keyword | Not set | Set from options.focusKeyword |
Note
This defect is a consequence of DEFECT #1. If handleWelcomeStart is fixed to not call startNewConversation(), this becomes a non-issue. However, if the new API is intentional, the legacy sidebar.js should be updated to match.
🟡 Minor Differences (Informational)
These differences do not constitute bugs but are worth documenting for completeness:
1. JSX vs createElement Syntax
- Legacy: Uses
wp.element.createElement("div", { className: "..." }) - Refactored: Uses JSX
<div className="...">
2. Variable Extraction Timing in handleWelcomeStart
- Legacy:
const keywordextracted inside theifblock - Refactored:
const keywordextracted before theifcheck
3. File Length Difference
- Legacy: 12,347 lines
- Refactored: 11,773 lines
- Difference: ~574 lines (JSX is more concise than
createElement)
✅ Verified Identical Functions
The following functions appear to be identical between both versions:
renderRefineAllConfirmModal(L6389-6432)renderWelcomeScreen(L9005-9182)renderChatTab(L11586-12018)renderFocusKeywordBar(L9254-9458)renderMessages(L9997-10913)handleFocusKeywordChange(L1072-1078)renderConfigTab(L10918-11433)renderGlobalStatusBar(L11449-11583)renderCostTab(L12058-12304)- All state initialization hooks
- All ref declarations (
useRefpatterns) - API endpoint calls and response handling
Recommendations
Option A: Fix Refactored Version (Recommended)
Revert handleWelcomeStart to match legacy behavior and remove the startNewConversation call:
const handleWelcomeStart = () => {
if (welcomeKeywordInput.trim()) {
const keyword = welcomeKeywordInput.trim();
handleFocusKeywordChange(keyword);
}
setAgentMode(welcomeStartMode);
setShowWelcome(false);
setTimeout(() => {
if (inputRef.current) {
inputRef.current.focus();
}
}, 100);
};
Option B: Update Both Files
If the new behavior (calling startNewConversation on welcome start) is intentional, update the legacy sidebar.js to match:
- Make
handleWelcomeStartasync and callstartNewConversation - Update
startNewConversationto accept options - Add
setSelectedFocusKeywordcall
Files
| File | Path |
|---|---|
| Legacy | /Users/dwindown/Local Sites/bricks/app/public/wp-content/plugins/wp-agentic-writer/assets/js/sidebar.js |
| Refactored | /Users/dwindown/Local Sites/bricks/app/public/wp-content/plugins/wp-agentic-writer/assets/js/src/index.jsx |
| Dist (correct behavior) | /Users/dwindown/Local Sites/bricks/app/public/wp-content/plugins/wp-agentic-writer/assets/js/dist/sidebar.js |
Appendix: Diff Summary
handleWelcomeStart:
- Legacy: synchronous, no API call, focuses input
- Refactored: async, calls startNewConversation(), no focus
startNewConversation:
- Legacy: no parameters, hardcoded mode="chat"
- Refactored: options parameter, dynamic mode and focusKeyword
Generated by Zed Agent during code review