mirror of
https://github.com/morluto/rea.git
synced 2026-11-15 19:23:24 +00:00
* feat(javascript)!: require the runtime parse-failure count and active Electron execution paths The V8 Inspector projection always writes scripts.parse_failed_total and the active Electron service always commits parameters.resolved_paths, so both are now required. Runtime reconciliation reads the admitted execution paths only and no longer falls back to request-spelled paths in parameters, and checks the observed executable path against them on every capture. JavaScriptStaticAnalysis.routes and module_runtime keep their omission, which current producers still make (a checkpoint that cannot retain route facts; no recovered factory runtime); their comments now say so instead of naming historical analyses. BREAKING CHANGE: JavaScript runtime observations without scripts.parse_failed_total, and active Electron Evidence without parameters.resolved_paths, are refused as malformed; recreate the observation. * test(javascript): give the shared Node reconciliation fixture the required parse-failure count * feat(browser)!: require browser observation facts their producers always write (#10991) * feat(browser)!: require browser observation facts their producers always write The source-map fetcher always writes effective_url (string or null), the web bundle analyzer always writes schema_property_names_coverage, and the CDP storage fingerprinter always marks IndexedDB schema fingerprints with projection_version 2. Each is now required. The IndexedDB marker is tied to its scope by a discriminated union and derived from the scope in the producer, so compare_web_captures no longer carries the store-only projection branch. response_identity and the WebMCP consequential hint keep their omission, which current producers still make (a body not fully read; an invalid annotation); the guide no longer attributes it to historical captures. BREAKING CHANGE: source-map items without effective_url, WebMCP declarations without schema_property_names_coverage, and IndexedDB schema fingerprints without projection_version are refused as malformed; recreate the capture. * feat(managed)!: refuse members beside a null signature resolution (#10992) * feat(managed)!: refuse members beside a null signature resolution signature_resolution is null only when member decoding exceeded capacity, and the capacity-recovery producer then examines no members. The managed member inspection schema now enforces that: a null resolution with any field, method, member reference, call edge or field access is malformed. With that rule, every admitted inspection with members attests type-name resolution, so the raw-digest fallback is unreachable and is deleted: comparableSides, hasSignatureResolution, the comparison's signatureResolutionExamined flag and the "does not attest" limitation. The shared workflow example that carried resolved digests beside a null attestation now attests resolution. BREAKING CHANGE: managed member Evidence with a null signature_resolution and any examined member is refused as malformed; recreate the observation. * docs: describe historical Evidence by what the format revision now refuses (#10993) SQLite worker_timeout_ms is required, so the SQLite guide no longer reads a missing value as unknown settings. The IL2CPP, ESP image and process capture guides now say that bundles exported without evidence_format are refused, while a standalone record from an earlier release is still read with the stated omission semantics (records carry no format marker yet). The route inventory guide describes a parent without route_inventory by its meaning rather than by its age. * refactor(javascript): require static analysis coverage from the JavaScript worker (#11001) * refactor(javascript): require static analysis coverage from the JavaScript worker Both JavaScript static producers always write analysis_coverage: the analyzer measures it on every parsed source and the failed-parse result carries an unexamined coverage. The worker schema and the static analysis type therefore require it, the preload-discovery checkpoint copies it unconditionally, and ElectronBoundaryAnalysis reads Electron applicability and examination limits from it alone. The fallback that re-derived Electron use from semantic module links and retained references for analyses without coverage is deleted, as are the graph and builder branches for a missing coverage. Retained Evidence graph observations are unchanged: the analysis view still counts a stored JavaScript observation without analysis_coverage as unmeasured, since standalone records carry no format marker yet. The worker runs from the same build as its parent, so no external caller sees the stricter reply schema. * feat(browser)!: require storage fingerprint, Link context, mapping index and invalid-map identity facts (#11002) * feat(browser)!: require storage fingerprint, Link context, mapping index and invalid-map identity facts Each field is written by its only producer on every capture: - The CDP storage capture always writes content_fingerprints, fingerprint_algorithm and fingerprints_complete, so their schema defaults are removed. - The CDP Link header projection always writes context_url and context_scope, so they are required. - The source-map fetcher writes source_index and declaration_index on every mapping row, so they are required. - The fetcher judges a map invalid only after reading its complete body. A separate invalidSourceMapItem builder now takes the response identity as a required argument, and the schema's invalid member requires response_identity; fetch_failed keeps it optional because those rows can come from a body that was not fully read. The browser and source-location guides no longer describe these fields as optional for older saved captures. BREAKING CHANGE: page inspections without the storage fingerprint fields or Link context fields, source-map mapping rows without their indexes, and invalid source-map items without response_identity are refused as malformed; recreate the capture. * test(browser): keep source-omission coverage on a still-defaulted field and refuse a missing fingerprint algorithm * feat(browser)!: require web-bundle target origin, inspection producer facts, scenario redirect state and exclusion kind (#11014) feat(browser)!: require web-bundle target origin, page inspection producer facts, scenario redirect state and exclusion kind Each field is written by its only producer on every record: - buildCaptureObservation always writes capture.target_origin (the validated origin or null), so analyze_web_bundle Evidence and both web-bundle view results require it; the view's conditional spread is gone. - The CDP page capture always writes accessibility node states, script frame_id (null when unattributed) and worker opener_target_id and parent_frame_id, so their schema defaults are removed. - PlaywrightScenarioNetwork writes redirected_from_transaction_state exactly when the predecessor ID is null, so request events now require it there and still refuse it on linked events. - The reference-source importer writes entry_kind on every exclusion (unknown when the kind was not observed), so it is required. The browser scenario contract and CLI guide no longer describe older captures or exclusions without these fields. BREAKING CHANGE: web-bundle analyses without capture.target_origin, page inspections without these script, accessibility or worker fields, scenario network events with a null predecessor and no redirect state, and reference source graphs whose exclusions lack entry_kind are refused as malformed; recreate the capture or re-import the source.
230 lines
13 KiB
Markdown
230 lines
13 KiB
Markdown
# SQLite database snapshots
|
|
|
|
`inspect_sqlite_database` / `inspect-sqlite-database` inspects one explicitly
|
|
selected local SQLite database snapshot without an active native analysis
|
|
target. Use it to understand application storage, configuration or retained
|
|
database evidence. No separate SQLite installation is required.
|
|
|
|
This operation requires Node.js 24.x >=24.15 or 26+ with the native
|
|
`DatabaseSync.limits` API. The worker verifies that capability before querying
|
|
the copied database. Other REA features retain their published Node.js 22.x,
|
|
24.x or 26+ requirements.
|
|
|
|
`rea capabilities` reports `inspect_sqlite_database` availability and the
|
|
runtime requirement without opening a database. Unsupported runtimes show
|
|
`available: false`, `availability_code: "unsupported_version"`, and an upgrade
|
|
note while the inventory command still succeeds.
|
|
|
|
```sh
|
|
rea capabilities --json
|
|
rea inspect-sqlite-database ./application.sqlite --json
|
|
rea inspect-sqlite-database ./application.sqlite --table settings --column key --column value --row-limit 20 --json
|
|
```
|
|
|
|
```json
|
|
{
|
|
"name": "inspect_sqlite_database",
|
|
"arguments": {
|
|
"path": "/artifacts/application.sqlite",
|
|
"table": "settings",
|
|
"columns": ["key", "value"],
|
|
"row_limit": 20
|
|
}
|
|
}
|
|
```
|
|
|
|
MCP paths must be absolute filesystem paths on the current host. CLI paths
|
|
resolve against the operator's working directory. Select a quiescent snapshot:
|
|
stop the writer or obtain a consistent database/WAL pair using the application's
|
|
backup workflow before inspection. A file copy of a live pair does not establish
|
|
an atomic SQLite snapshot, even if no change is detected during inspection.
|
|
|
|
## Returned evidence
|
|
|
|
Without a table selection, the default `schema_scope` is `inventory`: compact
|
|
table metadata and index, view and trigger names, without SQL declarations or
|
|
column details. Selecting a table defaults to `selected_table`, which expands
|
|
that table and its indexes and triggers. Explicit `schema_scope: "database"`
|
|
(or CLI `--schema-scope database`) expands all stored declarations and supported
|
|
columns. `schema.completeness` refers to the reported scope; omitted column
|
|
details are marked `not_requested`. SQL declarations retain the original text. Virtual and
|
|
shadow tables are identified as such; their supported metadata coverage is
|
|
reported. If a virtual table cannot be resolved, possible backing tables have
|
|
`kind: "unknown"` and an explicit limitation; their rows are refused. Unrelated
|
|
ordinary tables remain selectable. Schema inventory does not execute views,
|
|
triggers or arbitrary SQL.
|
|
|
|
The exact table name `sqlite_schema` is also a supported read-only row source.
|
|
SQLite's [`table_list`](https://www.sqlite.org/pragma.html#pragma_table_list)
|
|
and `table_xinfo` pragmas establish its row-source type and columns. The
|
|
[schema catalog](https://www.sqlite.org/schematab.html) has no self-entry for
|
|
`sqlite_schema`, so REA does not invent a declaration, SQL statement or root
|
|
page for it in `schema.tables`.
|
|
|
|
Rows are optional. `table` selects one exact ordinary-table name. `columns`
|
|
(CLI repeated `--column`) selects exact visible column names in the requested
|
|
order; omission selects all visible columns, including generated columns.
|
|
Unselected cells are not evaluated or projected. A selected virtual generated
|
|
column whose expression needs a function REA's connection lacks (extensions and
|
|
application functions are not loaded), or raises an SQL error for a sampled
|
|
row, is refused as `capability_unavailable`. The error names the table and
|
|
each failing selected column with SQLite's message, and recommends only columns
|
|
whose sampled values were read; stored and other generated cells stay readable. Malformed column-name bytes
|
|
cause a format refusal when all columns are requested. In inventory scope, an explicit valid subset can
|
|
still be sampled without decoding unrelated malformed column names.
|
|
|
|
An unavailable row source, including a `WITHOUT ROWID` primary key requiring an
|
|
application collation, is also refused as `capability_unavailable`. The error
|
|
retains the selected table and SQLite's reason without identifying unproven
|
|
dependencies or diagnosing file corruption. Such a source does not provide
|
|
readable-column recommendations. Omit `table` and select `schema_scope: "database"`
|
|
to read stored declarations without requesting rows; the application's supported
|
|
consistent export may be needed to obtain those values.
|
|
|
|
Column selection requires a
|
|
table and at least one name; empty-string identifiers are valid. SQLite counts
|
|
every projected name, including a repeated name, against its native
|
|
result-column capacity; a wider projection is refused as `resource_constraint`
|
|
with `resource: "capacity"`, reporting the selected count and this connection's
|
|
column limit. The selected database is readable and is not reported as
|
|
malformed; request fewer columns per call instead. `row_limit`
|
|
requires `table`, defaults to 20 and accepts positive safe integers. Samples
|
|
remain subject to the byte and worker resource limits below, regardless of row count. The result reports
|
|
the selected limit, returned count and whether more rows were observed.
|
|
|
|
Rows are read in a stated unique order reported as `rows.order`: `rowid` for
|
|
rowid tables, and `primary_key` for `WITHOUT ROWID` tables, reusing the
|
|
primary-key index's own direction and declared collation. `rows.row_offset`
|
|
reports the rows skipped before the window and `rows.next_row_offset` the offset
|
|
to request for the following page; it is `null` once the window reaches the end.
|
|
Pass `row_offset` (CLI `--row-offset`, requires `table`, default 0) to skip into
|
|
a table rather than repeating earlier rows. A table that declares all of
|
|
`rowid`, `_rowid_` and `oid` as columns and has no primary key reports
|
|
`order: "unspecified"` and refuses a non-zero `row_offset`, because the skipped
|
|
prefix would be arbitrary. Pages compose only while the reported database and
|
|
WAL SHA-256 match; re-inspecting a changed snapshot restarts the sequence.
|
|
View, virtual-table and shadow-table row reads are unsupported.
|
|
|
|
SQLite integers are decimal strings so every signed 64-bit value survives JSON
|
|
serialization. Real values retain their numbers; `"Infinity"`, `"-Infinity"`
|
|
and `"-0"` explicitly preserve infinities and negative zero through JSON.
|
|
Text returns the decoded string together with its bytes as hex and the database
|
|
encoding, preserving malformed text that the SQLite binding may replace for
|
|
display. Blobs are hex, and SQL NULL is a distinct tagged value.
|
|
|
|
Database and existing sibling `-wal` files have separate original SHA-256 and
|
|
byte counts. The Evidence subject identifies the original database file;
|
|
the WAL identity is also necessary to interpret pending committed data. The
|
|
SQLite engine version is reported with the observed result. Neither digest is
|
|
a claim that the database is healthy, complete or trusted.
|
|
|
|
## Source files and failures
|
|
|
|
REA copies the selected database and existing sibling WAL to an owned private
|
|
temporary directory before SQLite opens them. Source files are not opened by
|
|
SQLite, so its locks or shared-memory sidecars cannot modify the original
|
|
snapshot. Temporary copies and the owned worker are cleaned up on success,
|
|
failure and cancellation. Extension loading and schema trust are disabled.
|
|
Empty rollback journals and fully zeroed journal headers left by successful
|
|
`TRUNCATE` and `PERSIST` commits are accepted after stable identity checks.
|
|
Journal headers are checked both before and after acquisition; unchanged file
|
|
metadata alone does not establish that a journal remains inactive.
|
|
Other retained rollback journals are refused because recovery is outside this
|
|
profile. Journal files are never modified or copied into the worker snapshot.
|
|
|
|
A provider admits at most two inspections through acquisition, worker execution
|
|
and cleanup. Additional requests receive a typed capacity error before reading
|
|
files or creating workers; retry after an active inspection finishes. This
|
|
bounds simultaneous input buffering and private snapshot/worker counts.
|
|
|
|
The database and WAL together are limited to 256 MiB. SQLite values/records,
|
|
SQL statements and the complete worker JSON reply each have a 16 MiB limit.
|
|
Schema names count by their returned JSON text, including escaping, for UTF-8,
|
|
UTF-16le and UTF-16be databases. Internal raw-byte lookup keys do not consume
|
|
the reply allowance; exact name identity still comes from those stored bytes.
|
|
Actual row byte/hex expansion still counts toward the reply.
|
|
The owned worker has a 256 MiB JavaScript heap limit and defaults to a 30,000 ms
|
|
deadline. Select optional MCP `worker_timeout_ms`, or CLI
|
|
`--worker-timeout-ms <milliseconds>`, to change the budget for that call. Values
|
|
must be integer milliseconds from 1 to 2,147,483,647 (the runtime timer range).
|
|
It covers worker startup, queries and reply writing, **not** DB/WAL snapshot
|
|
acquisition, final reply reads, cleanup or delivery. Allow corresponding headroom
|
|
in the MCP client's whole-call deadline; increasing only that deadline does not
|
|
change the worker budget. No server restart is needed.
|
|
|
|
The result's `worker_timeout_ms` reports the actual parent-supervised budget,
|
|
including the default, and Evidence without it is malformed. Explicit input selection is also
|
|
retained in Evidence parameters; omission stays omitted. Completed observations
|
|
retained under cancellation or cleanup failure keep the same budget facts.
|
|
Timeout errors name the selected milliseconds, exact CLI/MCP controls, and
|
|
cleanup-before-retry requirements. Incomplete cleanup remains a blocker even
|
|
when a larger budget is available.
|
|
|
|
For example, `rea inspect-sqlite-database ./application.sqlite
|
|
--worker-timeout-ms 60000 --json` selects 60 seconds; equivalent MCP input is
|
|
`{"path":"/artifacts/application.sqlite","worker_timeout_ms":60000}`.
|
|
|
|
SQLite native allocations are separate from the JavaScript heap;
|
|
overall native heap and total resident memory are not capped. Row limits do not
|
|
override these byte and resource limits. Resource-limit failures do not return
|
|
an incomplete schema as successful complete evidence.
|
|
|
|
If the combined database and WAL exceed the snapshot budget, the refusal is a
|
|
`resource_constraint` and reports both the configured byte limit and the exact
|
|
observed combined size as a decimal string. The remediation directs callers to
|
|
create a smaller consistent offline snapshot containing only relevant data
|
|
through the application's supported export workflow. A generic backup or copy
|
|
does not guarantee a smaller result; REA does not truncate or modify the
|
|
selected source.
|
|
|
|
On hosts that cannot address the derived WAL or rollback-journal path for a
|
|
long selected database name, REA reports that the SQLite capability is
|
|
unavailable. It does not assume an inaccessible sidecar is absent. Use the
|
|
application's supported consistent offline export or copy workflow to place
|
|
the complete known file set at a shorter path.
|
|
|
|
MCP also applies its configured response budget to the complete Evidence
|
|
envelope. If delivery exceeds that budget, it reports a transport constraint
|
|
with guidance for exporting retained Evidence, requesting a matching larger
|
|
client/server response budget or using complete CLI JSON output.
|
|
|
|
A cancellation received after the worker has completed does not erase the
|
|
completed observation. If subsequent private-root cleanup fails, the error
|
|
retains the completed Evidence and the resource owner for cleanup retry. MCP
|
|
records that Evidence before delivering the error, which carries its retained
|
|
evidence ID for later retrieval or export.
|
|
|
|
If a worker fails and cleanup remains incomplete, the error retains the original
|
|
cancellation, timeout, diagnostic overflow or memory failure. Successful cleanup
|
|
retry restores that failure's classification; it does not make the inspection
|
|
successful.
|
|
|
|
Changed input identities, special files, malformed databases, unsupported
|
|
formats and resource failures are reported as errors with the selected path and
|
|
meaningful reason. Worker resource refusals expose the caller-selected file in
|
|
`details.diagnostics.selected_path`. Encrypted databases, database repair, arbitrary SQL,
|
|
cross-database queries and live capture are outside this inspection's coverage.
|
|
|
|
## Compatibility verification
|
|
|
|
Run `npm run test:sqlite` after changing the SQLite adapter or its shared
|
|
process, filesystem, CLI or MCP boundaries. It prepares the compiled runtime
|
|
and runs SQLite service, snapshot, inspection, cleanup and public CLI/MCP
|
|
tests. Directory-based selection includes new SQLite service and boundary
|
|
tests automatically. `npm run test:sqlite:run` runs the same cases when the
|
|
compiled runtime and generated test artifacts are already current.
|
|
|
|
The reusable SQLite CI workflow consumes the shared build artifact and tests
|
|
Node 22.x unavailable-runtime diagnostics, the repository-pinned 24.x release,
|
|
and the latest 24.x and 26.x releases; `.github/workflows/sqlite-runtime.yml`
|
|
owns the exact versions. The repository-pinned runtime also runs the full
|
|
suite. CI's required gate waits for every selected
|
|
SQLite matrix job; a failed, cancelled, skipped or missing selected lane blocks
|
|
the gate. Workflow changes themselves select the build and compatibility lane.
|
|
|
|
PR checks run against GitHub's merge with the current base branch. A later
|
|
change to `main` can introduce failures outside SQLite; inspect the failing
|
|
job and recheck the updated merge before treating an earlier green run as
|
|
current verification. Compatibility checks detect regressions, but cannot
|
|
guarantee that an arbitrary future upstream change remains compatible.
|