lsp
Public Luau surface over the `__lsp` Internal FFI namespace — the engine-embedded Luau language server.
lsp Module
Public Luau surface over the __lsp Internal FFI namespace — the
engine-embedded Luau language server.
Purpose
Wrap the raw __lsp.* FFI namespace in a typed Luau table that gets
auto-injected as _G.lsp via the prelude. Same engine-embedded
language server that backs /zero/docs/api/* and the editor's
diagnostic surface — checks sources for diagnostics, enumerates
documented namespaces / methods / modules, infers expression types,
lists registered tools, and toggles the pre-execute strict gate.
Usage
-- Diagnostics
local diags = lsp.check("/zero/source/main.luau")
local diags2 = lsp.checkCode("local x = unknown_global", { severity = "error" })
local summary = lsp.checkAll({ scope = "user" })
-- Discovery
for _, ns in ipairs(lsp.namespaces()) do print(ns.name, ns.methodCount) end
for _, m in ipairs(lsp.methods("entity")) do print(m.signature) end
local doc = lsp.describe("asset/resolve")
for _, hit in ipairs(lsp.search("raycast")) do print(hit.path) end
-- Type inference
local td = lsp.typeOf("Transform.lookAt", "/zero/source/main.luau")
print(td.kind, td.display)
-- Strict gate
lsp.setStrictMode("soft")
print(lsp.getStrictMode())
What discovery answers with
namespaces, methods, search and describe answer with the surface
content calls. Most engine capabilities are registered as an FFI namespace at
ApiLevel::Internal — installed under __<name> — with a Luau module
published over it, and it is the module's surface a caller writes. So a
namespace holding no public entry is not listed, an entry whose signature
spells the __ call is left out of a listing, and one a module publishes at
globals/<ns>/<method> is listed once, at the published spelling. describe
answers an entry as registered, except where its signature spells the __
call and a module publishes over it — then the published entry answers.
{ includeInternal = true } on any of the four returns every registered
entry, exactly as registered:
lsp.methods("jobs") --> jobs.register(descriptor: table) -> JobHandle?
lsp.methods("jobs", { includeInternal = true }) --> also __jobs.register(descriptor) -> number
lsp.describe("jobs/register") --> the published entry
lsp.describe("jobs/register", { includeInternal = true }) --> the primitive's own
A namespace registered only internally — no module publishes over it — answers a listing request in full, so naming one deliberately still reports what it holds.
Reading a check result
Every check returns the diagnostics as an array plus the counts describing
them. A check that read no code — a path naming no file, a path holding no
Luau code body, or any path at all while lsp.enabled is false — returns one
error diagnostic carrying an lsp-check-* code, the path it reached, and the
reason:
local r = lsp.check("/zero/lib/modules/api/engine/lsp.module/init.luau")
print(r.errors) --> 1
print(r[1].code) --> lsp-check-unreadable
print(r[1].message) --> no code was checked: '…' returned no bytes from this VFS …
The code names which reason applied: lsp-check-unreadable for a path the VFS
returned no bytes for, lsp-check-unresolved for an argument that named no
file, lsp-check-no-code-body for one that named something with no Luau body,
lsp-check-not-utf8 for bytes that hold no source, lsp-check-no-path for a
call carrying no path, and lsp-check-disabled while lsp.enabled is false.
The checker analyses a source of at most 2 MiB (2097152 bytes). A larger file
is read and not analysed: every route that checks Luau (lsp.check,
lsp.checkCode, the diagnostics of the report vfs.write returns, the MCP
write_file result) answers it with one source-too-large warning naming its
size and the bound, lsp.check and lsp.checkCode report checked = false,
and the write itself lands as written. Splitting the file into modules under
the bound puts them back in front of the checker.
So errors > 0 means either the code has problems or nothing was read, and the
diagnostics say which. checked is true when the file's code was analysed, so
checked with errors == 0 means a code body was read and is clean.
checkedPath names the path the check reached.
Exports
- Diagnostics:
check,checkCode,checkAll,summary,checkDirty,lastCheckGen. - Discovery:
namespaces,methods,describe,search,modules,docsByKind. - Code-mode tools:
tools,describeTool. - Type inference:
typeOf. - Strict gate:
isStrict,setStrict,getStrictMode,setStrictMode,readDirectives. - Analysis configuration:
analysisFlags, the flag values upstream Luau's analysis library runs under, beside the ones upstream ships, with the reason for each one that differs. - Upstream type checking:
upstreamCheck, upstream Luau's own type checker run on a file and every module it requires, each require resolved to the filecheckholds it to (the file the runtime loads wherever it loads one), returned as data beside the engine's own checks. Upstream reads every module through its analysis view, in which eachtypeddeclaration reads as the plain Luau function it declares with its annotations kept and every line and column as in the file, so its findings point at the file as written; the result'sviewlists where the view of the checked file differs. The phases of a module's check whose work grows with the types they meet stop at its time limit, each module checked comes back with its outcome and duration, and the modules held between calls stay within a stated amount of source.checkandcheckAlltakeopts.upstreamto run the same check beside their own and report each module's outcome, andcheckAll's upstream pass counts its findings by kind. - The engine's API as Luau definitions:
definitions, the documented members, published aliases and asset-category shapes as upstream Luau's.d.luauform (declarestatements andexport typealiases), generated from the live registry and holding the globals the calling script has.upstreamCheckloads it into every module, so upstream checks a call against its signature and a member against its namespace.exportDefinitions(dir)writeszero.d.luau,zero.docs.jsonand.luaurcfor an external editor running luau-lsp; the guidetopics/external-editorwalks through the editor setup. A*.d.luaufile is checked by loading it as upstream does.
Interface
What this asset declares: the schema it conforms to, what it exposes, and the rendered structured payload.
conforms to
zero/source-extract/v2global lsp global-types module lsp Embedded Luau language server — check / search / inspect Public Luau surface over the `__lsp` Internal FFI namespace. require modules/api/engine/lsp
check(path: string, opts: CheckFileOpts?) → DiagnosticsResult
Validate a single `.luau` file in the VFS and return its diagnostics. A path the check could not read comes back as one `lsp-check-*` error naming the path and the reason, and a file past the 2 MiB analysis bound as one `source-too-large` warning with `checked = false`, so `checked` with `errors == 0` means a code body was analysed and is clean. `opts.upstream` (true, or the options of `lsp.upstreamCheck`) also checks the file with upstream Luau's type checker and sets `upstream` to what `lsp.upstreamCheck` returns for it, whose `modules` say how the check of each module it reached ended and how long it took; the diagnostics and counts stay the engine checker's.
| arg | type | description |
|---|---|---|
| path | string | VFS path. |
| opts | CheckFileOpts? | `{ severity?, limit?, context?, upstream? }`. |
examples
local diags = lsp.check("/zero/source/main.luau")checkCode(source: string, opts: CheckOpts?) → DiagnosticsResult
Validate inline Luau source without a backing file. Useful for checking code before writing it to disk. A source past the 2 MiB analysis bound comes back as one `source-too-large` warning with `checked = false`.
| arg | type | description |
|---|---|---|
| source | string | Luau source. |
| opts | CheckOpts? | `{ severity?, limit?, context? }`. |
checkAll(opts: CheckAllOpts?) → CheckAllResult
Validate the user's Luau scripts and return an aggregate summary plus diagnostic list. `opts.scope = "user"` (default) skips library mounts; `"all"` includes them. The sweep is time-budgeted (ZERO_EXECUTE_INLINE_BUDGET_MS, ~20s by default): if the budget elapses it returns the partial result gathered so far with `budgetExceeded = true` rather than blocking the engine. `opts.budgetMs` sets the budget for the call and `opts.maxFiles` caps the files it checks. `opts.upstream` (true, or the options of `lsp.upstreamCheck`) also checks each file with upstream Luau's type checker once the engine's own pass is done, within the same budget, and sets `upstream` to what that pass found: every module it reached, once, with how its check ended ("completed", "timedOut", "internal", or "notAnalysable" with the reason) and how long it took, `reused` marking a module checked before the pass reached it and unchanged since. The pass starts no file once the budget is spent, so it ends within the budget plus the check of the one file in progress.
| arg | type | description |
|---|---|---|
| opts | CheckAllOpts? | `{ scope?, severity?, limit?, budgetMs?, maxFiles?, upstream? }`. |
summary( ) → Summary
Counts only — does not re-run validation.
checkDirty( ) → DiagnosticsResult
Drain the dirty-file set populated by the hot-reload hook, validate each, and return the combined diagnostic list.
lastCheckGen( ) → number
Generation counter — bumped each time the cache is rebuilt. UI polls this to know when to redraw.
analysisFlags( ) → AnalysisFlags
The feature-flag configuration upstream Luau's analysis library (the linter and `.luaurc` parser behind these checks) runs under, read back from Luau's flag registry. It is upstream's own: every `Luau*` flag the analysis sources declare is on unless upstream's experimental list names it, and every other flag they declare keeps the value Luau registers it at. The flags the analysis library reads from the parser and the VM are `shared`: they run at the value the engine's runtime gives them, and one that differs from upstream's carries its `deviation`. `flags` lists every flag those sources declare or read, sorted by name; `atUpstream` counts the linked ones whose value is upstream's. `available` is false, with `reason`, on a build that does not link the analysis library.
upstreamCheck(path: string, opts: UpstreamCheckOpts?) → UpstreamCheck
Type-check a .luau file with upstream Luau's own type checker (its Frontend), and every module the file requires, and return what upstream reports as data. What `lsp.check`, the `execute` gate and the play gate report is unchanged by it. Each `require` literal resolves to the source file `lsp.check`'s `require-unresolved` pass holds it to, which is the file the runtime loads wherever the runtime loads one, in whichever form it is written (`@builtin::a.b`, `@ns::`, `@root::`, a bare dotted `a.b`, `.x`, `..x`, `./x`, `../x`, `~.x`, `~pkg.x`, an absolute path, a folder asset), and `requires` lists each literal of the file with the file it reached (`module`) and the file the runtime's `require` loads for it from this file (`runtimeModule`), nil where either reaches none. `findings` carry upstream's error kind or lint rule, the module they are in and 1-based positions in that module as written; they cover the file, and with `opts.includeRequired` the type errors of every module it reaches come back as well. Upstream reads every module through its analysis view: the engine's `typed` declarations read as the plain Luau functions they declare, their generic, parameter and return annotations kept, a return type written after `->` read after `:`, and every line and column as in the source; `view` lists where the view of the file differs from it as `{ line, col, written, reads }`. A module whose findings come back that upstream cannot parse through its view or past the 2 MiB analysis bound is listed in `notAnalysable` with the reason, and when that is the file itself `analysable` is false. The checked modules are kept between calls: `checkedModules` names the ones this call type-checked, empty when nothing the file reaches changed, and a write to a source re-checks that module and the modules depending on it. The phases of a module's check whose work grows with the types they meet stop at `opts.timeLimitMs`, and `modules` says of each module the call reached how its check ended ("completed", "timedOut" or "internal") and how long it took, `reused` marking one an earlier call checked that is unchanged since. The modules held between calls are bounded: once a call returns their sources sum to at most `held.limitBytes`, the modules the least recent calls reached going first, and `held` and `evicted` report it. A failure inside the analysis library comes back as an "internal" finding with `completed` false, and the internal errors upstream reports for a module come back as one "internal" finding whose `count` says how many. `opts.typeCheck = false` reads the file and every module it reaches and resolves their requires without checking types. `available` is false, with `reason`, on a build that does not link the analysis library.
| arg | type | description |
|---|---|---|
| path | string | VFS path of a .luau file, a module identity, or a `@scope::path`. |
| opts | UpstreamCheckOpts? | `{ solver?, mode?, timeLimitMs?, includeRequired?, typeCheck? }`. |
examples
local r = lsp.upstreamCheck("@builtin::modules.boids", { mode = "strict" })definitions(opts: DefinitionsOpts?) → Definitions
The engine's API as a Luau definitions source, upstream Luau's `.d.luau` form (`declare` statements and `export type` aliases), generated from the live API registry: the documented members, the `--!global-types` aliases and the asset-category shapes `lsp.check` types against, bound under the same names. It declares each global the calling script's globals hold, so a user script, a trusted script and a worker each get the globals they have; a name upstream's builtin environment declares keeps upstream's type and is left out. `lsp.upstreamCheck` loads the same source into every module it checks, and an external editor running luau-lsp reads it as a definitions file (`lsp.exportDefinitions` writes it out). It is generated again whenever the registry changes, a library hot reload included. `package` (`@zero`) keys each global's documentation symbol (`@zero/global/<name>`, `@zero/global/<name>.<member>`). Each type string the registry holds is declared as written, or listed in `unrepresented` with the reason and declared `any`; a declaration upstream refuses to load (an alias that reaches itself through aliases alone) is listed with upstream's reason, so the rest of the source loads. `opts.documentation = true` also returns `documentation`, the JSON documentation file luau-lsp reads beside the definitions: each symbol's signature and description. `available` is false, with `reason`, on a build that does not link the analysis library.
| arg | type | description |
|---|---|---|
| opts | DefinitionsOpts? | `{ documentation? }`. |
examples
local d = lsp.definitions()
print(d.bytes, #d.globals, #d.unrepresented)
exportDefinitions(dir: string) → ExportDefinitionsResult
Write the engine's API out for an external editor (VS Code, Neovim, or any editor running luau-lsp), so it types the engine's globals: `<dir>/zero.d.luau` (the definitions `lsp.definitions` returns), `<dir>/zero.docs.json` (the documentation file naming each global's and member's signature and description) and `<dir>/.luaurc` (nonstrict mode). Point luau-lsp at the first two (its `types.definitionFiles` and `types.documentationFiles` settings) and it types the engine's globals: `entity.spawn("x")` checks against its signature and `entity.spwan("x")` is an unknown member. The files hold the globals the calling script's globals hold; call it from the tier whose globals the editor should know. The files land in the VFS: `userfile.save(path)` (the Files panel's "Save to this device") puts each one on the machine of the person at the screen, and over HTTP the engine's `GET /engine/vfs/<path>` reads it. The engine's own checker reads a `*.d.luau` file the way upstream does, by loading it, so the files can stay in a world's content. Writing again replaces them. `globals`, `types` and `unrepresented` are the lists `lsp.definitions` returns; the guide `topics/external-editor` walks through the editor setup.
| arg | type | description |
|---|---|---|
| dir | string | VFS directory to write into, such as `/zero/source/editor`. |
examples
local r = lsp.exportDefinitions("/zero/source/editor")print(r.files[1], r.bytes, #r.globals)
isInternalEntry(entry: any) → boolean
An entry the engine registered at `ApiLevel::Internal` documents a binding installed under `__<namespace>`, which a public Luau module wraps and calls. Two facts decide whether a listing hands one back: the call form its own signature spells, and whether a module publishes the same member. A module declaring `--!global <ns>` registers its surface at `globals/<ns>/<method>`, so that path is where the published spelling of an entry lives.
| arg | type | description |
|---|---|---|
| entry | any |
spellsInternalCall(entry: any) → boolean
| arg | type | description |
|---|---|---|
| entry | any |
publishedOver(entry: any) → any
The published entry covering what `entry` documents, or nil.
| arg | type | description |
|---|---|---|
| entry | any |
withheldFromListing(entry: any) → boolean
Whether a listing withholds `entry` from a caller who asked for the surface they can call.
| arg | type | description |
|---|---|---|
| entry | any |
namespaces(opts: NamespacesOpts?) →
List the documentation namespaces reachable from Luau. By default only namespaces exposing at least one PUBLIC method are returned, so the list matches what you can actually call — internal FFI plumbing (e.g. `pause`, `native_entity`), whose public surface lives elsewhere (`engine.paused`, the `entity` proxy, …), is left out. Pass `{ includeInternal = true }` to list every namespace, internal ones included.
| arg | type | description |
|---|---|---|
| opts | NamespacesOpts? | Optional `{ includeInternal? }` — default lists public only. |
examples
for _, ns in ipairs(lsp.namespaces()) do print(ns.name) end
callableEntries(all: { MethodSummary }) → void
The entries of `all` a caller can call: an internal entry goes when its signature spells the `__` form or a module publishes the same member. A namespace whose every entry is internal is one `lsp.namespaces()` never advertised, so a caller naming it asked for the primitives themselves and gets what the namespace holds.
| arg | type | description |
|---|---|---|
| all | { MethodSummary } |
methods(namespace: string, opts: MethodsOpts?) →
List every documented method / entry under a namespace. A broad namespace (`ui`, `renderer`) returns a large dump by default, so two options narrow it: `opts.filter` keeps only methods whose name (or doc path) contains the substring, case-insensitively; `opts.namesOnly` per-method summary tables, which is much smaller and leaves nothing to unwrap. A name, in either form (a summary's `name` field or a `namesOnly` string), is the member's path below the namespace, dot-joined (`texture.create` under `renderer`, `proxy.component.get` under `entity`), so each one names a single member and `lsp.describe(namespace .. "." .. name)` answers for it. The listing answers with the surface content calls: an entry registered internally is left out where its signature spells the `__` binding or a Luau module publishes the same member, and `opts.includeInternal` lists every registered entry instead. `namesOnly` is set (empty when the namespace is unknown or nothing matches the filter).
| arg | type | description |
|---|---|---|
| namespace | string | Namespace name (e.g. `"entity"`, `"modules/Transform"`). |
| opts | MethodsOpts? | Optional `{ filter?, namesOnly?, includeInternal? }`. |
examples
for _, name in ipairs(lsp.methods("ui", { namesOnly = true })) do print(name) endlsp.methods("renderer", { filter = "shadow" })memberName(m: MethodSummary) → string
The name a member answers to under this namespace: its path below the root the namespace lists it from, dot-joined, so a member nested under a sub-table keeps the sub-table in its name. A member listed by its parent segment (a `--!members` surface, rooted elsewhere) is named by its last segment, which `namespace/name` reaches as the tail of its path.
| arg | type | description |
|---|---|---|
| m | MethodSummary |
normalizeDocPath(path: string) → string
Doc paths are registered under several roots (`entity/spawn`, `globals/renderer/texture/create`, `modules/renderer/texture.create`), and separators vary between `/` and `.`. Reduce a path to a comparable form so one spelling can be matched against another regardless of root or separator style.
| arg | type | description |
|---|---|---|
| path | string |
sortByCanonicalPath(matches: { string }) → void
| arg | type | description |
|---|---|---|
| matches | { string } |
docPathCandidates(want: string) → void
Registered paths related to the requested one, most canonical first. The second return says whether they NAME the requested entry: true for paths that end with it (the same entry under another root), false for paths merely registered UNDER it (the request names a namespace, so its members are reported without any of them standing in for the request).
| arg | type | description |
|---|---|---|
| want | string |
describe(path: string, opts: DescribeOpts?) → DocEntry
Inspect a single documented entry. Returns the full doc table (signature, args, returns, examples, level), or nil. The path is resolved independently of which root the doc is registered under and of separator style, so the spelling that reads off the API surface (`renderer.texture.create`) finds the entry registered as `globals/renderer/texture/create`. A path naming a binding the engine registered internally answers with the entry a Luau module publishes over it where there is one, so the signature is the call content makes; `opts.includeInternal` answers with the internally registered entry itself. When a path does not resolve, `lsp.describePaths` says what the registry holds near it.
| arg | type | description |
|---|---|---|
| path | string | Doc path (e.g. `"asset/resolve"`, `"renderer.texture.create"`). |
| opts | DescribeOpts? | Optional `{ includeInternal? }` — default prefers the published entry. |
examples
local doc = lsp.describe("renderer.texture.create")answer(entry: any) → any
An entry is answered as registered unless its signature spells the `__` call, which names the binding a module wraps rather than the call a caller writes. Then the entry published over it answers, where there is one.
| arg | type | description |
|---|---|---|
| entry | any |
describePaths(path: string) →
List the registered doc paths related to `path`. A path that names an entry returns every root it is registered under (the first is what `lsp.describe` resolves to); a path that names a namespace returns the entries registered under it. Empty when the registry holds nothing near the path — so a lookup that returns nil can always be turned into the list of what does exist.
| arg | type | description |
|---|---|---|
| path | string | Doc path in any spelling (`"renderer.texture"`, `"ecs/query"`). |
examples
for _, p in ipairs(lsp.describePaths("renderer.texture")) do print(p) endsearch(query: string, opts: SearchOpts?) →
Case-insensitive substring search across every registered doc's path, signature, and description. Hits answer with the surface content calls: an entry registered internally is left out where its signature spells the `__` binding or a Luau module publishes the same member, and `opts.includeInternal` searches every registered entry.
| arg | type | description |
|---|---|---|
| query | string | Substring to search for. |
| opts | SearchOpts? | `{ limit? = 50, includeInternal? }`. |
callableHits(hits: { MethodSummary }) → void
| arg | type | description |
|---|---|---|
| hits | { MethodSummary } |
modules( ) →
List every Luau library module the engine currently knows about — discovered via `--!module` headers, library scans, and manually-recorded docs.
docsByKind(kind: string) →
List every doc whose registration kind matches `kind`. Valid: `"binding"`, `"runtime_tool"`, `"module"`, `"component"`, `"library"`, `"lua_export"`.
| arg | type | description |
|---|---|---|
| kind | string | Registration kind. |
tools( ) →
List every code-mode tool registered in the VFS under `/zero/docs/tools/<category>/<tool>`.
describeTool(path: string) → string
Return the full documentation text for a code-mode tool.
| arg | type | description |
|---|---|---|
| path | string | Tool path (e.g. `"scene/spawnLight"`). |
typeOf(expr_source: string, context_path: string?) → TypeDescriptor
Infer the static type of a Luau expression. When `context_path` is given, the file is loaded and walked so the inference env contains every local + alias in scope at its end. An expression past the 2 MiB analysis bound answers kind `unknown`, and a context file past it adds nothing to the env.
| arg | type | description |
|---|---|---|
| expr_source | string | Luau expression source (no surrounding chunk). |
| context_path | string? | VFS path whose scope should be visible. |
examples
local td = lsp.typeOf("Transform.lookAt", "/zero/source/main.luau")symbolAt(path: string, line: number, col: number, name: string, chain: string?) → SymbolHit
The identifier `name` where it stands in `path` at `line`:`col` (1-based, the file's own columns), with the static type it resolves to THERE — a local inside a function body, a parameter, a field, a global — and, for a name a statement in the file introduced, `declaredAt = {line, col}`. The answer a hover shows and a go-to-definition jumps to. `nil` when nothing at that position is a reference to `name`: a word in a comment or a string, a keyword. for a pointer on `add` — which is where its API page is filed. function its `params` and `returns`), with `name`, `symbolKind` (local, parameter, function, field, global, namespace, module), `declaredAt` when the file introduced the name, `members` and `memberCount` for a table, `modulePath` and `moduleFile` for a required module, and `doc` — the comment block above the declaration (`--!desc`, `--!arg`, `--!return`, `--!example`), the required module's header, or the API page under `chain`. nil when nothing there is a reference to `name`.
| arg | type | description |
|---|---|---|
| path | string | VFS path of the file. |
| line | number | 1-based line. |
| col | number | 1-based column in the file's own text. |
| name | string | The identifier at that position. |
| chain | string? | The access path the identifier ends — `entity.component.add` |
examples
local hit = lsp.symbolAt("/zero/source/main.luau", 12, 9, "add", "entity.component.add")isStrict( ) → boolean
Is the pre-execute LSP gate fully strict? False when off or in soft mode.
setStrict(enabled: boolean) → boolean
Toggle the pre-execute LSP gate. Returns true when the change was persisted to `.world_settings`, false when the play-mode write lock blocked the write.
| arg | type | description |
|---|---|---|
| enabled | boolean | True = strict, false = off. |
getStrictMode( ) → StrictMode
Return the current strict mode.
setStrictMode(mode: StrictMode) → boolean
Set the pre-execute strict gate's mode. Returns true when the change was persisted to `.world_settings`, false when the play-mode write lock blocked the write.
| arg | type | description |
|---|---|---|
| mode | StrictMode | `"off"` | `"soft"` | `"strict"`. |
readDirectives(source: string) → DirectiveBlock
Parse the leading `--!` directive block of a Luau source string. Used by UIs that audit which files have skip directives and what they suppress.
| arg | type | description |
|---|---|---|
| source | string | Luau source text. |
Severity = "error" | "warning" | "info" | "hint"CheckOpts = {CheckFileOpts = {CheckAllOpts = {Diagnostic = {DiagnosticsResult = {CheckAllResult = {Summary = {NamespaceEntry = {NamespacesOpts = { includeInternal: boolean? }MethodSummary = {DocEntry = {SearchOpts = { limit: number?, includeInternal: boolean? }MethodsOpts = {DescribeOpts = { includeInternal: boolean? }ToolEntry = { category: string, name: string, path: string }TypeDescriptor = {SymbolDoc = {SymbolHit = {ModuleEntry = {StrictMode = "off" | "soft" | "strict"DirectiveBlock = {AnalysisFlag = {AnalysisFlags = {UpstreamSolver = "old" | "new"UpstreamMode = "nonstrict" | "strict" | "nocheck"UpstreamCheckOpts = {UpstreamFinding = {UpstreamOutcome = "completed" | "timedOut" | "internal"UpstreamModule = {UpstreamHeld = {UpstreamSweptModule = {UpstreamSweep = {UpstreamNotAnalysable = {UpstreamRequire = {UpstreamViewEdit = {UpstreamCheck = {DefinitionsUnrepresented = {DefinitionsOpts = {Definitions = {ExportDefinitionsResult = {Sub-parts
Everything contained inside this part. Assets are composite children (clickable cards). Files are leaf payloads. Expand any row to view its source.
Showing up to 3 levels deep. Open a part to see what it holds further down.
Problems
Everything affecting this asset right now: its own problems, anything wrong inside it, and problems on its direct dependencies.
agent_score is exposed.+ quality × 0.35
+ performance × 0.25
± compat factor
Usability ratings
Did the part work as advertised when consumers tried to drop it in. Separate from upvotes: those are taste; this is "did it function".
Scoped to this part · feeds back into the world's score.