Built-in tools are application code. The lean release has no dynamic runtime integrations.
Definition
Fella’s standard registry contains seven built-in tools. Adding one requires an application code change. Each has a JSON schema and produces an evidence record. The experimental MCP boundary is documented separately, but/mcp is inert in
the shipped application. No remote tools can enter the default registry.
The extension point is a Rust trait, not a dynamic plugin ABI:
ToolOutput keeps the model-facing text separate from the data shown in the evidence panel:
inspect_table is the current combined interface; older commits had separate describe_schema and sample_rows concepts. PR #52 merged that surface so schema statistics and sample rows travel through one tool.
Architecture
The built-ins are offered when a workspace is open. With no workspace, the model
receives no data tools.
Every successful call is translated into a
ToolOutput and then an EvidenceItem with a stable ordered ID for that answer. SQL-backed evidence also maps referenced tables to catalogued files or workbook sheets and retains source-level ingest notes when present. The output has a human-facing summary, compact model text, and optional SQL, columns, rows, text output, or structured chart data. make_chart derives its chart values from its own read-only query, so the chart evidence retains the SQL, result rows, and source mapping; it never accepts or emits SVG/HTML. ChartData is rendered by the Svelte client. Failed calls are also recorded with an error, summary, and elapsed time rather than disappearing from the run.
Flow
For tables, the expected path is inspection when needed followed byrun_sql. For documents, the model uses grep_files to locate text and read_file for context; read_file accepts either name or a names array and labels combined documents. make_chart receives a query, executes it through the guarded data path, and derives the chart values itself. The first query column becomes labels; the next one or two become series.
run_python provides sql(query), which returns a bounded list of dictionaries from the host’s read-only data engine. The built-in median, stdev, pearsonr, and linregress helpers cover the small calculations SQL handles poorly. The embedded guest has no pandas, NumPy, SciPy, package installer, or system Python dependency.
Behavior
SQL is preferred because the query and rows are straightforward to display and rerun.run_sql accepts a single guarded read-only query, and the SQLite query connection is opened read-only. Direct file-reading SQL functions are blocked.
There is no MCP execution path in the personal release. A future connector
must preserve the fixed evidence and verification boundary before it can become
an official feature.
Limits
- Python runs in a fresh embedded WASM guest with no filesystem, network, environment, or subprocess capability. Wasmi fuel, memory, stack, source, output, SQL-row, and SQL-response limits bound the calculation; Wasmi, RustPython, and the checked-in guest remain part of the trusted computing base.
- The Python guest’s fuel, memory, stack, source, output, SQL-row, and SQL-response limits are cross-platform; the host SQL watchdog applies to each SQL call.
- Tool outputs are capped, so evidence can contain a sample rather than every returned row or character.
/sql is deliberately outside this registry path: it calls the engine directly, prints a system result, and does not create an assistant evidence fold or invoke post-answer verification.
Next steps
The harness
Follow tool selection, execution, caching, and stopping.
Experimental MCP
Read the inert extension boundary for future forks.
Verification
See which results can be checked after the answer.
The engine
Understand the local SQL and document paths behind the tools.