From 68ecaec76c035a546f17988f1354191bdf94a63f Mon Sep 17 00:00:00 2001 From: "khalid@traclabs.com" Date: Thu, 23 Apr 2026 08:40:15 -0500 Subject: [PATCH] Add better messages for intent processing and update in progress --- server/src/live-reload.ts | 6 +++++- server/src/queue/edit-queue.ts | 1 - server/src/queue/process-edit-job.ts | 4 ++++ src/layouts/BaseLayout.astro | 3 ++- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/server/src/live-reload.ts b/server/src/live-reload.ts index e7c2e86..fd5fd86 100644 --- a/server/src/live-reload.ts +++ b/server/src/live-reload.ts @@ -43,7 +43,11 @@ export function broadcastReload(reason: string, data?: Record): } } -export type UpdateStatusPhase = 'request_received' | 'update_started' | 'update_done'; +export type UpdateStatusPhase = + | 'request_received' + | 'intent_processing' + | 'updating' + | 'update_done'; export function broadcastUpdateStatus(phase: UpdateStatusPhase, data?: Record): void { if (!wss) return; diff --git a/server/src/queue/edit-queue.ts b/server/src/queue/edit-queue.ts index fad5413..9ae1d70 100644 --- a/server/src/queue/edit-queue.ts +++ b/server/src/queue/edit-queue.ts @@ -25,7 +25,6 @@ export function createEditQueue(): EditQueue { while (jobs.length > 0 && !shuttingDown) { const job = jobs.shift()!; logger.info({ event: 'job.started', kind: job.kind, id: job.id }, 'Processing job'); - broadcastUpdateStatus('update_started', { jobKind: job.kind, jobId: job.id }); try { await processor!(job); logger.info({ event: 'job.completed', kind: job.kind, id: job.id }, 'Job completed'); diff --git a/server/src/queue/process-edit-job.ts b/server/src/queue/process-edit-job.ts index 58c5dff..fd31c2d 100644 --- a/server/src/queue/process-edit-job.ts +++ b/server/src/queue/process-edit-job.ts @@ -10,6 +10,7 @@ import { buildSectionManifest, type ManifestEntry } from './manifest.js'; import { sendSms } from '../sms/reply.js'; import { SMS_TEMPLATES } from '../sms/templates.js'; import { logger } from '../logger.js'; +import { broadcastUpdateStatus } from '../live-reload.js'; const REPO_ROOT = process.env.REPO_ROOT || '.'; const AUTO_APPLY = process.env.AUTO_APPLY_EDITS === 'true'; @@ -55,6 +56,7 @@ async function handlePropose(job: Extract) try { // Step 0: Classify message intent (edit, info, or help) + broadcastUpdateStatus('intent_processing', { jobKind: job.kind, jobId: job.id, source: job.source }); const classification = await classifyMessageIntent({ userMessage: job.message }); log.info({ event: 'classification.result', intent: classification.intent, reason: classification.reason }, 'Message classified'); @@ -77,6 +79,7 @@ async function handlePropose(job: Extract) } // ── EDIT intent: proceed with existing edit flow ── + broadcastUpdateStatus('updating', { jobKind: job.kind, jobId: job.id, source: job.source }); // Step 1: Route — determine which file the edit targets let repoRelativePath = job.repo_relative_path; @@ -190,6 +193,7 @@ async function handlePropose(job: Extract) async function handleApply(job: Extract) { const log = logger.child({ jobId: job.id, kind: 'apply', proposalId: job.proposal_id }); + broadcastUpdateStatus('updating', { jobKind: job.kind, jobId: job.id, source: job.source, proposalId: job.proposal_id }); const proposal = getProposal(job.proposal_id); if (!proposal) { diff --git a/src/layouts/BaseLayout.astro b/src/layouts/BaseLayout.astro index ad14bc0..ab60a3b 100644 --- a/src/layouts/BaseLayout.astro +++ b/src/layouts/BaseLayout.astro @@ -191,7 +191,8 @@ const wsUrl = (process.env.PUBLIC_LIVE_RELOAD_WS_URL ?? import.meta.env.PUBLIC_L if (msg.type === 'update_status') { if (msg.phase === 'request_received') setBanner(true, 'Processing update request'); - else if (msg.phase === 'update_started') setBanner(true, 'Updating website'); + else if (msg.phase === 'intent_processing') setBanner(true, 'Processing update request'); + else if (msg.phase === 'updating') setBanner(true, 'Updating website'); else if (msg.phase === 'update_done') setBanner(false); } } catch {