diff --git a/README.md b/README.md index 4fb95ad..0428500 100644 --- a/README.md +++ b/README.md @@ -487,7 +487,7 @@ Flynn includes a built-in web control dashboard served by the WebSocket gateway. | Page | Description | |------|-------------| -| **Dashboard** | System health cards, channel status, usage stats, assistant-health quick actions, playbook presets with rollback, and daily briefing preview/test-send. Auto-refreshes every 10s | +| **Dashboard** | System health cards, channel status, usage stats, assistant-health quick actions, playbook presets with rollback, activation checklist, and daily briefing preview/test-send. Auto-refreshes every 10s | | **Chat** | Session selector, streaming tool events, markdown rendering with syntax highlighting | | **Sessions** | Browse all sessions, view message history, delete sessions | | **Usage** | Token usage summary cards, per-session breakdown table, auto-refresh | diff --git a/docs/plans/state.json b/docs/plans/state.json index 6481758..5019438 100644 --- a/docs/plans/state.json +++ b/docs/plans/state.json @@ -5506,6 +5506,25 @@ "docs/plans/state.json" ], "test_status": "pnpm typecheck passing" + }, + "assistant-activation-checklist-and-setup-defaults": { + "status": "completed", + "date": "2026-02-18", + "updated": "2026-02-18", + "summary": "Completed assistant productization pass: Dashboard now includes a 3-step activation checklist with briefing output save controls, playbook/test-send integration, and persisted assistant status cues; runtime config.patch now supports daily briefing output/schedule/prompt/tier updates; setup/operator-pack defaults now enable announce delivery plus memory daily/proactive extraction cadence for assistant-first behavior out of the box.", + "files_modified": [ + "src/gateway/ui/pages/dashboard.js", + "src/gateway/ui/style.css", + "src/gateway/ui/pages/settings.js", + "src/gateway/handlers/config.ts", + "src/gateway/handlers/handlers.test.ts", + "src/cli/setup/config.ts", + "src/cli/setup/config.test.ts", + "src/cli/setup/automation.test.ts", + "README.md", + "docs/plans/state.json" + ], + "test_status": "pnpm test:run src/gateway/handlers/handlers.test.ts src/cli/setup/config.test.ts src/cli/setup/automation.test.ts + pnpm typecheck passing" } }, "overall_progress": { diff --git a/src/gateway/ui/pages/dashboard.js b/src/gateway/ui/pages/dashboard.js index 43b7221..3f6c11f 100644 --- a/src/gateway/ui/pages/dashboard.js +++ b/src/gateway/ui/pages/dashboard.js @@ -9,6 +9,7 @@ let _fastTimer = null; let _slowTimer = null; let _dashboardClient = null; let _lastPlaybookRollbackPatches = null; +let _lastBriefingTestAt = null; function formatUptime(seconds) { const d = Math.floor(seconds / 86400); @@ -537,18 +538,21 @@ async function triggerDailyBriefingTest(jobName, statusEl) { statusEl.textContent = output; statusEl.className = 'text-sm text-success'; } - return; + _lastBriefingTestAt = Date.now(); + return true; } if (statusEl) { statusEl.textContent = result?.error ?? 'Failed to trigger briefing.'; statusEl.className = 'text-sm text-error'; } + return false; } catch (error) { if (statusEl) { statusEl.textContent = `Trigger error: ${error instanceof Error ? error.message : String(error)}`; statusEl.className = 'text-sm text-error'; } + return false; } } @@ -580,6 +584,12 @@ function updateAssistantHealth(configData) { ? `${briefingOutput.channel}/${briefingOutput.peer}` : 'not configured'; const briefingReady = dailyBriefing && Boolean(briefingOutput?.channel && briefingOutput?.peer); + const playbookLikeReady = announce || (memoryDaily && memoryProactive); + const checklistRows = [ + { label: 'Set briefing output channel + peer', done: Boolean(briefingOutput?.channel && briefingOutput?.peer) }, + { label: 'Enable assistant behavior profile', done: playbookLikeReady }, + { label: 'Send a test morning briefing', done: _lastBriefingTestAt !== null }, + ]; const chip = (label, value) => `