feat: improve task execution, verification and packaging

Add execution incidents, action bursts and shared Flash history.

Expose verification and Explorer settings with streamed check results.

Support graceful cancellation, recording recovery and bundled UI resources.

Add CI quality checks and clean up comments and documentation.
This commit is contained in:
somew1nd committed 2026-09-02 21:45:51 -07:00
1 parent 5ccf06d677
commit 67248c887e
289 files changed
+15883 -6919

No files matched your search

@@ -277,7 +277,7 @@ limitations under the License.
}
</div>
}
<!-- Verification Box (Pulled out into a minimalist framed card) -->
<!-- Verification result -->
@if (milestone.checks.length > 0) {
<div class="milestone-checks-container">
@for (check of milestone.checks; track trackMarkdownLine($index, check)) {
@@ -505,7 +505,7 @@ limitations under the License.
class="phase-header"
[class.first-phase]="first && startupWorkItems().length === 0"
>
<span class="phase-worked-time">Worked for {{ phase.durationSeconds }}s</span>
<span class="phase-worked-time">{{ isCheckerPhase(phase) ? 'Checked' : 'Worked' }} for {{ phase.durationSeconds }}s</span>
@if (phase.tokens) {
<span class="phase-token-usage" [title]="getTokenTooltip(phase)">
<span class="token-dot">·</span>
@@ -524,12 +524,68 @@ limitations under the License.
>
<!-- Unified Step / Stream Body -->
<div class="step-body">
<!-- Check block (verifier lane): header, then the declared check items
and how each is judged; the chronological stream follows, and the
result rows close the block (see check-result below). -->
@if (isCheckerBlock(block)) {
<div class="check-lane" [ngClass]="'tone-' + getCheckerTone(block)">
<div class="check-header">
<span class="stream-status-dot" [class.streaming]="isBlockRunning(block)"></span>
<span class="check-title">{{ getCheckerPhaseLabel(block) }}</span>
@if (block.data.phase !== 'outcome' && block.data.subgoal_text) {
<span class="check-subject" [title]="block.data.subgoal_text">{{ block.data.subgoal_text }}</span>
}
<span class="check-status">{{ getCheckerStatusLabel(block) }}</span>
</div>
@if (!isCheckerMuted(block) && getCheckerItems(block).length > 0) {
<ol class="check-items">
@for (item of getCheckerItems(block); track $index) {
<li class="check-item">
<span class="check-index">{{ $index + 1 }}</span>
<span class="check-text">{{ item.text }}</span>
<span class="check-method">{{ getCheckMethodLabel(item, block) }}</span>
</li>
}
</ol>
}
</div>
}
<!-- Text, tool calls, and actions share one chronological timeline. -->
@if (getSortedStepEvents(block.data).length > 0) {
<div class="step-actions-container">
@for (item of getSortedStepEvents(block.data); track trackStepEvent(itemIdx, item); let itemIdx = $index) {
<!-- Check block: one Thought / Work entry per streamed turn, in time order with its tool calls -->
@if (isCheckerBlock(block) && item.type === 'thinking') {
<div
class="thinking-stream-details native-thinking-details"
[class.is-running]="isCheckerSegmentRunning(block, itemIdx)"
[class.collapsed]="isCheckerSegmentCollapsed(block, itemIdx)">
<div class="details-summary" (click)="toggleCheckerSegment(block, itemIdx)">
<span class="stream-status-dot" [class.streaming]="isCheckerSegmentRunning(block, itemIdx)"></span>
Thought
</div>
<div class="details-content-wrapper">
<div class="details-content stream-box">
<div class="stream-text" [innerHTML]="renderMarkdown(item.data.text, block.id + '-seg-' + itemIdx)"></div>
</div>
</div>
</div>
}
@if (isCheckerBlock(block) && item.type === 'text' && isCheckerTextVisible(item)) {
<div
class="step-raw-thinking-message"
[class.is-running]="isCheckerSegmentRunning(block, itemIdx)">
<div class="report-header">
<span class="stream-status-dot" [class.streaming]="isCheckerSegmentRunning(block, itemIdx)"></span>
Work
</div>
<div class="report-content stream-box">
<div class="stream-text" [innerHTML]="renderMarkdown(item.data.text, block.id + '-seg-' + itemIdx)"></div>
</div>
</div>
}
<!-- Native Thinking (Thought) -->
@if (item.type === 'thinking') {
@if (!isCheckerBlock(block) && item.type === 'thinking') {
<div
class="thinking-stream-details native-thinking-details"
[class.is-running]="isBlockRunning(block)"
@@ -546,7 +602,7 @@ limitations under the License.
</div>
}
<!-- Raw Thinking / Plan / Message (Work) -->
@if (item.type === 'text' && getRawThinking(block)) {
@if (!isCheckerBlock(block) && item.type === 'text' && getRawThinking(block)) {
<div
class="step-raw-thinking-message"
[class.is-running]="isBlockRunning(block)">
@@ -1093,6 +1149,26 @@ limitations under the License.
}
</div>
}
<!-- Check block result: one row per check item, keyed by its number above -->
@if (hasCheckerResult(block)) {
<div class="check-result" [ngClass]="'tone-' + getCheckerTone(block)">
@for (verdict of getCheckerVerdicts(block); track $index) {
<div class="check-verdict" [ngClass]="verdict.status">
<span class="check-index">{{ getVerdictItemNumber(block, verdict, $index) }}</span>
<span class="material-symbols-outlined verdict-icon">{{ getVerdictIcon(verdict.status) }}</span>
<span class="verdict-body">
<span class="verdict-evidence">{{ verdict.evidence || getVerdictStatusText(verdict.status) }}</span>
@if (verdict.suggestion) {
<span class="verdict-suggestion">{{ verdict.suggestion }}</span>
}
</span>
</div>
}
@for (note of getCheckerNotes(block); track note) {
<div class="check-note">{{ note }}</div>
}
</div>
}
</div>
</div>
}