feat(FN-3243): add durable insight lifecycle with bounded executor and quic

This merge adds a durable insight lifecycle with bounded run executor to the core store layer, along with supporting database schema changes and comprehensive test coverage. It also restores type compatibility for list view detail callbacks and fixes QuickChatFAB CSS scope issues. Documentation acro

Fusion-Task-Id: FN-3243
This commit is contained in:
Fusion
2026-05-03 03:03:44 -07:00
committed by gsxdsm
parent 8806d7208a
commit a47f3192e8
3 changed files with 77 additions and 76 deletions

View File

@@ -0,0 +1,5 @@
---
"@runfusion/fusion": patch
---
Restore dashboard chat reply rendering for both full Chat and Quick Chat by fixing shared streaming response behavior and follow-up UX styling isolation regressions.

View File

@@ -37,6 +37,7 @@ Features:
Chat view provides project-scoped conversations with agents.
- Entering `/clear` (exact match after trimming) in the composer starts a fresh thread for the current chat target instead of sending the literal command to the model
- Full Chat and Quick Chat both consume the same streamed `/api/chat/sessions/:id/messages` response contract, so assistant text/chunk/done events are restored consistently across both surfaces
![Chat view](./screenshots/chat-view.png)

View File

@@ -555,7 +555,7 @@
min-width: 0;
}
.chat-skill-menu {
.quick-chat-panel .chat-skill-menu {
position: absolute;
left: var(--space-lg);
bottom: calc(100% + var(--space-xs));
@@ -570,7 +570,7 @@
z-index: 50;
}
.chat-skill-menu-item {
.quick-chat-panel .chat-skill-menu-item {
width: 100%;
border: none;
background: transparent;
@@ -584,24 +584,24 @@
transition: background var(--transition-fast);
}
.chat-skill-menu-item:hover,
.chat-skill-menu-item--highlighted {
.quick-chat-panel .chat-skill-menu-item:hover,
.quick-chat-panel .chat-skill-menu-item--highlighted {
background: var(--card-hover);
}
.chat-skill-menu-item:focus-visible {
.quick-chat-panel .chat-skill-menu-item:focus-visible {
outline: none;
box-shadow: var(--focus-ring-strong);
background: var(--card-hover);
}
.chat-skill-menu-item-name {
.quick-chat-panel .chat-skill-menu-item-name {
font-size: 0.8125rem;
color: var(--text);
font-family: var(--font-mono);
}
.chat-skill-menu-item-description {
.quick-chat-panel .chat-skill-menu-item-description {
font-size: 0.75rem;
color: var(--text-muted);
white-space: nowrap;
@@ -610,7 +610,7 @@
max-width: calc((var(--space-xl) * 10) + var(--space-lg) + var(--space-xs));
}
.chat-skill-menu-empty {
.quick-chat-panel .chat-skill-menu-empty {
padding: var(--space-sm) var(--space-md);
color: var(--text-muted);
font-size: 0.8125rem;
@@ -877,43 +877,38 @@
}
.chat-message-thinking-content {
font-size: 11px;
color: var(--text-tertiary);
margin-top: 4px;
.quick-chat-panel .chat-message-thinking {
margin-top: var(--space-xs);
}
.chat-message-thinking {
margin-top: 6px;
}
.chat-message-thinking summary {
font-size: 12px;
.quick-chat-panel .chat-message-thinking summary {
font-size: var(--space-md);
color: var(--text-secondary);
cursor: pointer;
}
.chat-message-thinking-content {
font-size: 13px;
.quick-chat-panel .chat-message-thinking-content {
font-size: var(--space-md);
color: var(--text-secondary);
padding: 8px;
padding: var(--space-sm);
background: var(--bg);
border-radius: 6px;
margin-top: 4px;
border-radius: var(--radius-sm);
margin-top: var(--space-xs);
white-space: pre-wrap;
font-family: var(--font-mono, monospace);
overflow-x: auto;
}
/* === Chat Tool Calls === */
.chat-tool-calls {
.quick-chat-panel .chat-tool-calls {
margin-top: var(--space-sm);
display: flex;
flex-direction: column;
gap: var(--space-xs);
}
.chat-tool-calls-header {
.quick-chat-panel .chat-tool-calls-header {
display: inline-flex;
align-items: center;
gap: var(--space-xs);
@@ -921,13 +916,13 @@
font-size: var(--space-md);
}
.chat-tool-calls-group {
.quick-chat-panel .chat-tool-calls-group {
border: var(--btn-border-width, 1px) solid color-mix(in srgb, var(--border) 85%, transparent);
border-radius: var(--radius-sm);
background: color-mix(in srgb, var(--surface) 35%, transparent);
}
.chat-tool-calls-group-summary {
.quick-chat-panel .chat-tool-calls-group-summary {
display: flex;
align-items: center;
gap: var(--space-sm);
@@ -941,25 +936,25 @@
white-space: nowrap;
}
.chat-tool-calls-group-summary::marker {
.quick-chat-panel .chat-tool-calls-group-summary::marker {
content: "";
}
.chat-tool-calls-group-summary::-webkit-details-marker {
.quick-chat-panel .chat-tool-calls-group-summary::-webkit-details-marker {
display: none;
}
.chat-tool-calls-group-summary:focus-visible {
.quick-chat-panel .chat-tool-calls-group-summary:focus-visible {
outline: none;
box-shadow: var(--focus-ring-strong);
}
.chat-tool-calls-count {
.quick-chat-panel .chat-tool-calls-count {
white-space: nowrap;
flex-shrink: 0;
}
.chat-tool-calls-names {
.quick-chat-panel .chat-tool-calls-names {
color: var(--text-dim);
font-family: var(--font-mono, monospace);
overflow: hidden;
@@ -970,7 +965,7 @@
font-size: 0.6875rem;
}
.chat-tool-calls-group-status {
.quick-chat-panel .chat-tool-calls-group-status {
margin-left: auto;
font-size: 0.6875rem;
color: var(--text-dim);
@@ -978,21 +973,21 @@
white-space: nowrap;
}
.chat-tool-calls-group > .chat-tool-call {
.quick-chat-panel .chat-tool-calls-group > .chat-tool-call {
margin: 0 var(--space-sm) var(--space-xs) var(--space-sm);
}
.chat-tool-calls-group > .chat-tool-call:last-child {
.quick-chat-panel .chat-tool-calls-group > .chat-tool-call:last-child {
margin-bottom: var(--space-sm);
}
.chat-tool-call {
.quick-chat-panel .chat-tool-call {
border: var(--btn-border-width, 1px) solid color-mix(in srgb, var(--border) 85%, transparent);
border-radius: var(--radius-sm);
background: color-mix(in srgb, var(--surface) 35%, transparent);
}
.chat-tool-call summary {
.quick-chat-panel .chat-tool-call summary {
display: flex;
align-items: center;
gap: var(--space-xs);
@@ -1006,20 +1001,20 @@
white-space: nowrap;
}
.chat-tool-call summary::marker {
.quick-chat-panel .chat-tool-call summary::marker {
content: "";
}
.chat-tool-call summary::-webkit-details-marker {
.quick-chat-panel .chat-tool-call summary::-webkit-details-marker {
display: none;
}
.chat-tool-call summary:focus-visible {
.quick-chat-panel .chat-tool-call summary:focus-visible {
outline: none;
box-shadow: var(--focus-ring-strong);
}
.chat-tool-call-status-dot {
.quick-chat-panel .chat-tool-call-status-dot {
width: calc((var(--space-xs) + var(--space-sm)) / 2);
height: calc((var(--space-xs) + var(--space-sm)) / 2);
border-radius: 50%;
@@ -1027,7 +1022,7 @@
flex-shrink: 0;
}
.chat-tool-call-name {
.quick-chat-panel .chat-tool-call-name {
font-family: var(--font-mono, monospace);
flex: 0 1 auto;
min-width: 0;
@@ -1036,7 +1031,7 @@
white-space: nowrap;
}
.chat-tool-call-preview {
.quick-chat-panel .chat-tool-call-preview {
color: var(--text-muted);
overflow: hidden;
text-overflow: ellipsis;
@@ -1046,7 +1041,7 @@
font-size: 0.6875rem;
}
.chat-tool-call-status-text {
.quick-chat-panel .chat-tool-call-status-text {
margin-left: auto;
font-size: 0.6875rem;
text-transform: lowercase;
@@ -1054,7 +1049,7 @@
flex-shrink: 0;
}
.chat-tool-call-content {
.quick-chat-panel .chat-tool-call-content {
margin: var(--space-xs) var(--space-sm) var(--space-sm);
padding: var(--space-sm);
border-radius: var(--radius-sm);
@@ -1065,55 +1060,55 @@
gap: var(--space-xs);
}
.chat-tool-call-row {
.quick-chat-panel .chat-tool-call-row {
display: grid;
grid-template-columns: auto 1fr;
gap: var(--space-xs);
align-items: start;
}
.chat-tool-call-label {
.quick-chat-panel .chat-tool-call-label {
color: var(--text-muted);
text-transform: uppercase;
letter-spacing: 0.04em;
font-size: 0.6875rem;
}
.chat-tool-call-value {
.quick-chat-panel .chat-tool-call-value {
color: var(--text);
word-break: break-word;
white-space: pre-wrap;
}
.chat-tool-call--running .chat-tool-call-status-dot {
.quick-chat-panel .chat-tool-call--running .chat-tool-call-status-dot {
background: var(--color-info);
animation: tool-call-pulse var(--transition-slow) infinite;
}
.chat-tool-call--error summary {
.quick-chat-panel .chat-tool-call--error summary {
color: var(--color-error);
}
.chat-tool-call--error .chat-tool-call-status-dot {
.quick-chat-panel .chat-tool-call--error .chat-tool-call-status-dot {
background: var(--color-error);
}
.chat-tool-call-row--error {
.quick-chat-panel .chat-tool-call-row--error {
background: color-mix(in srgb, var(--color-error) 10%, transparent);
border-radius: var(--radius-sm);
padding: var(--space-xs);
}
.chat-tool-calls--compact .chat-tool-calls-header,
.chat-tool-calls--compact .chat-tool-calls-group-summary,
.chat-tool-calls--compact .chat-tool-calls-names,
.chat-tool-calls--compact .chat-tool-calls-group-status,
.chat-tool-calls--compact .chat-tool-call summary,
.chat-tool-calls--compact .chat-tool-call-content,
.chat-tool-calls--compact .chat-tool-call-preview,
.chat-tool-calls--compact .chat-tool-call-value,
.chat-tool-calls-group--compact .chat-tool-calls-group-summary,
.chat-tool-calls-group--compact .chat-tool-calls-names {
.quick-chat-panel .chat-tool-calls--compact .chat-tool-calls-header,
.quick-chat-panel .chat-tool-calls--compact .chat-tool-calls-group-summary,
.quick-chat-panel .chat-tool-calls--compact .chat-tool-calls-names,
.quick-chat-panel .chat-tool-calls--compact .chat-tool-calls-group-status,
.quick-chat-panel .chat-tool-calls--compact .chat-tool-call summary,
.quick-chat-panel .chat-tool-calls--compact .chat-tool-call-content,
.quick-chat-panel .chat-tool-calls--compact .chat-tool-call-preview,
.quick-chat-panel .chat-tool-calls--compact .chat-tool-call-value,
.quick-chat-panel .chat-tool-calls-group--compact .chat-tool-calls-group-summary,
.quick-chat-panel .chat-tool-calls-group--compact .chat-tool-calls-names {
font-size: 0.6875rem;
}
@@ -1128,15 +1123,15 @@
}
/* Streaming indicator */
.chat-message--streaming {
.quick-chat-panel .chat-message--streaming {
align-self: flex-start;
background: var(--bg-elevated, var(--bg-secondary));
color: var(--text);
border-bottom-left-radius: 4px;
border-bottom-left-radius: var(--radius-sm);
opacity: 0.9;
}
.chat-pending-message {
.quick-chat-panel .chat-pending-message {
display: flex;
align-items: center;
gap: var(--space-sm);
@@ -1145,19 +1140,19 @@
border-radius: var(--radius-sm);
background: color-mix(in srgb, var(--todo) 10%, transparent);
color: var(--text-muted);
font-size: 12px;
font-size: var(--space-md);
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
.chat-pending-message span {
.quick-chat-panel .chat-pending-message span {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.chat-pending-message-dismiss {
.quick-chat-panel .chat-pending-message-dismiss {
background: none;
border: none;
color: var(--text-dim);
@@ -1165,26 +1160,26 @@
padding: var(--space-xs);
line-height: 1;
flex-shrink: 0;
font-size: 14px;
font-size: var(--space-lg);
}
.chat-pending-message-dismiss:hover {
.quick-chat-panel .chat-pending-message-dismiss:hover {
color: var(--text-muted);
}
/* === Rescued: classes referenced in QuickChatFAB/ChatView TSX but never defined ====== */
.chat-mention-chip {
.quick-chat-panel .chat-mention-chip {
display: inline-flex;
align-items: center;
gap: 2px;
padding: 1px 6px;
margin: 0 1px;
gap: var(--space-xs);
padding: var(--space-xs) var(--space-sm);
margin: 0 var(--space-xs);
background: color-mix(in srgb, var(--todo) 14%, transparent);
color: var(--todo);
border: 1px solid color-mix(in srgb, var(--todo) 30%, transparent);
border: var(--btn-border-width, 1px) solid color-mix(in srgb, var(--todo) 30%, transparent);
border-radius: var(--radius-pill);
font-size: 11px;
font-size: 0.6875rem;
font-weight: 500;
white-space: nowrap;
}