{% extends "components/_cc_shell.html" %} {% block title %}fs-report · Settings{% endblock %} {% block head %} {% endblock %} {% block content %} {% set cfg_ft = state.get('finding_types', 'cve') %} {# Normalize tokens so a hand-edited "cve, sast" (with spaces) still matches the checkboxes and persists cleanly. #} {% set cfg_ft_set = cfg_ft.split(',') | map('trim') | reject('equalto', '') | list %}
~/.fs-report/config.yaml

Settings

Connection, report defaults, AI providers, and cache.

Connection

Finite State platform API credentials (from environment / setup).
{% if state.has_config %}
Configured
{% else %}
Not configured
{% endif %}

Report defaults

Applied to every run unless overridden.
Overwrite existing
Replace output files with the same name.
Verbose logging
Stream per-recipe progress + API trace.

AI enrichment

Provider auto-detected from environment. Deep analysis runs when AI depth is full.
Enable AI
AI enrichment on findings — guidance + summaries.
Export AI prompts
Write the prompts used to disk alongside results.
{% if ai_detected.detected %}
Provider: {{ ai_detected.provider_label }} · {{ ai_detected.env_var }} detected
{% else %}
{{ ai_detected.hint }}
{% endif %}
{% if ai_detected.detected %}
{% endif %}

Assessment defaults

Default scope + finding types applied to assessments.
{% set sf = state.get('folder_filter', '') %}
{% set sp = state.get('project_filter', '') %}
{% set sv = state.get('version_filter', '') %}
Current version only
Assess the latest version of each project (disables version filter).

Deployment context

Operating context that shapes AI risk guidance.
{{ state.get('deployment_notes', '') | length }}/500
{# SP3: global default uploaded files (apply to every run unless overridden) #}
{{ state.get('context_file','').rsplit('/', 1)[-1] or 'none' }}
{{ state.get('scoring_file','').rsplit('/', 1)[-1] or 'none' }}

Cache

Persistent SQLite cache — crash recovery + faster reruns.
{% if not cache_info.get('available', True) %}
Cache stats unavailable — directory not readable. Clear still works.
{% endif %} {# #cache-rows always present so the delegated Clear handler is wired and the maintenance action stays reachable even when stats can't be read. #}
{% if cache_info.get('available', True) %} {% include "components/_cache_rows.html" %} {% else %} {% for c in [('api', 'API'), ('nvd', 'NVD'), ('ai', 'AI')] %}
{{ c[1] }} stats unavailable
{% endfor %} {% endif %}
{% if nvd_mirror %}NVD mirror: {{ nvd_mirror }}{% else %}NVD source: default{% endif %}
{% endblock %} {% block scripts %} {% include "components/_dir_browser.html" %} {% include "components/_scope_dropdowns.html" %} {% endblock %}