Editor intelligence
The script editor talks to a real language server for every language — the same kind a desktop IDE uses. It suggests names as you type, shows a function’s signature and documentation on hover, underlines mistakes before you run, and jumps to a definition, even into another script of your project. Packages you import are installed for the editor as you type, so their types and completions show up at once.
- Use completions, hover cards and go-to-definition
- Read the error marks before you run
- Know what the import pills and the engine badge tell you
A language server per language
When you open a script, the editor connects to a language-server service over a WebSocket and keeps a private session for your tab. Each language has its own server:
| Language | Server | Good at |
|---|---|---|
| Python | pylsp (Jedi) | Completions from type hints and installed packages, undefined names, unused imports |
| TypeScript | typescript-language-server | Full type checking, package types, path completion |
| JavaScript | typescript-language-server | Types inferred from code and JSDoc |
| C / C++ | clangd | Completions and diagnostics against the worker’s gcc headers and waiso.h |
The platform SDK is known too: import waiso (or from 'waiso') completes its functions, and calls that run another script or flow complete the project’s script paths and their parameters.
Complete, hover, jump
- Complete
Start typing a name, or type a . after one. Pick with the arrow keys and Enter; Esc closes the list.
- Hover
Rest the mouse on a function, variable or package to see one card with its signature, its kind and its documentation.
- Go to definition
F12 or Ctrl/⌘+click moves to where a name is defined. When the definition is in another script of the project — a library you import — that script opens in the editor.
Error marks
Mistakes are underlined while you type — errors in red, warnings in amber — and hovering the mark shows the message. Every mark is also a row in the Problems tab under the code. A typo the server catches before you run:
def main(items: list[float] = [10.0, 2.5]):
total = sum(items)
return {"total": totl} # marked: undefined name 'totl'undefined name 'totl' pyflakes 3:22
Imports while you type
For Python, TypeScript and JavaScript, each package import line wears a small pill at its end: installing, installed or failed. The editor installs the package into its own language-server session as you type — that is what makes the package’s types, completions and hover docs appear. Hover the pill to see the version it resolved; click it to open a version picker with the release history (filter with Filter versions…). waiso wears a pill that says it is built in — nothing to install.
Project imports are checked on the server
Imports of your own scripts are checked by the same resolver a run uses, and the editor gets your project’s scripts of the same language written into its session, so completion knows their functions. An import that would fail is underlined with the very words the run would fail with — import "utils.mony": no script at utils/mony in this project — and shows in Problems with the source imports.
The engine badge
At the foot of the code, the engine badge shows the runtime and the language server’s state. Hover it to read the state in words:
| State | Means |
|---|---|
| Connecting to language server… | The session is starting; completions arrive in a moment |
| Language server connected | Completions, hover and marks are live |
| Language server disconnected | You can still edit, save and run — just without completions or marks |
| Language server not configured | The installation has no language-server service |
The same badge holds the runtime version selector — see Runtime versions.
Limits
- The language server only reads your code; it never runs it. A clean editor does not guarantee a clean run — inputs, data and packages can still fail.
- C and C++ have no package pills: they install nothing.
- Messages come from each language’s own server and are in English.