Implement terminal approval UI system
Phase 1: Backend approval tracking - Add PendingApprovalsManager class to track pending approvals - Add approval-request, approval-response, approval-expired WebSocket handlers - Add requestApproval() method to ClaudeCodeService - Add event forwarding for approval requests Phase 2: Frontend approval card component - Create approval-card.js with interactive UI - Create approval-card.css with styled component - Add Approve, Custom Instructions, Reject buttons - Add expandable custom command input Phase 3: Wire up approval flow end-to-end - Add handleApprovalRequest, handleApprovalConfirmed, handleApprovalExpired handlers - Add detectApprovalRequest() to parse AI approval request patterns - Integrate approval card into WebSocket message flow - Route approval responses based on source (server vs AI conversational) This allows the AI agent to request command approval through a clean UI instead of confusing conversational text responses. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -14,6 +14,12 @@
|
||||
activityLog: [], // New: stores AI activity stream
|
||||
|
||||
addError(error) {
|
||||
// Skip 'info' type errors - they're for learning, not bugs
|
||||
if (error.type === 'info') {
|
||||
console.log('[BugTracker] Skipping info-type error:', error.message);
|
||||
return null;
|
||||
}
|
||||
|
||||
const errorId = this.generateErrorId(error);
|
||||
const existingError = this.errors.find(e => e.id === errorId);
|
||||
|
||||
@@ -221,17 +227,43 @@
|
||||
|
||||
triggerManualFix(errorId) {
|
||||
const error = this.errors.find(e => e.id === errorId);
|
||||
if (error) {
|
||||
// Report to server to trigger fix
|
||||
fetch('/claude/api/log-error', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
...error,
|
||||
manualTrigger: true
|
||||
})
|
||||
});
|
||||
if (!error) {
|
||||
console.error('[BugTracker] Error not found:', errorId);
|
||||
return;
|
||||
}
|
||||
|
||||
// Report to server to trigger fix
|
||||
fetch('/claude/api/log-error', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({
|
||||
...error,
|
||||
manualTrigger: true
|
||||
})
|
||||
})
|
||||
.then(res => {
|
||||
if (!res.ok) {
|
||||
throw new Error(`HTTP ${res.status}: ${res.statusText}`);
|
||||
}
|
||||
return res.json();
|
||||
})
|
||||
.then(data => {
|
||||
console.log('[BugTracker] Manual fix triggered:', data);
|
||||
|
||||
// Update error status to 'fixing'
|
||||
this.startFix(errorId);
|
||||
|
||||
// Show success feedback
|
||||
if (typeof showToast === 'function') {
|
||||
showToast('Auto-fix agent triggered', 'success');
|
||||
}
|
||||
})
|
||||
.catch(err => {
|
||||
console.error('[BugTracker] Failed to trigger fix:', err);
|
||||
if (typeof showToast === 'function') {
|
||||
showToast('Failed to trigger auto-fix', 'error');
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
getTimeAgo(timestamp) {
|
||||
|
||||
Reference in New Issue
Block a user