Go to file
Henrik Jess Nielsen d7db53a482
All checks were successful
Build and Deploy iLSP / test (push) Successful in 22s
Build and Deploy iLSP / build-and-deploy (push) Successful in 1m26s
feat(bicep): implement signatureHelp, foldingRange, workspace/symbol locally
Bicep.LangServer 0.46.1 (latest release) does not implement these three LSP
features, so iLSP now answers them itself directly in the proxy instead of
forwarding to the underlying LS:

- textDocument/signatureHelp: curated database of ~50 commonly used Bicep
  built-in functions (resourceId, guid, concat, take, format, ...) with a
  simple bracket-depth call-context detector (ilsp/bicep_lsp/bicep_functions.py,
  ilsp/bicep_lsp/local_features.py:compute_signature_help).
- textDocument/foldingRange: stack-based bracket matcher over {}/[]/() plus
  contiguous // comment-block folding (compute_folding_ranges).
- workspace/symbol: best-effort search over documents currently open in the
  editor session (iLSP has no full-workspace index, only what's been opened),
  matching top-level resource/module/var/param/output/func/type declarations
  (compute_workspace_symbols).

The proxy now advertises these in the initialize response capabilities
(signatureHelpProvider, foldingRangeProvider, workspaceSymbolProvider) so
editors actually send the requests, and intercepts them in _client_to_ls
before they'd otherwise be silently dropped/errored by the real Bicep LS.
A send lock (_LockedConn) prevents interleaved frames now that both
_client_to_ls and _ls_to_client can write responses to the client socket.

13 new unit tests in tests/test_local_features.py. Closes the last 3 gaps
found in the full LSP capability audit.
2026-08-14 17:54:34 +02:00

iLSP — Internal LSP Proxy

Self-hosted Language Server Protocol proxy for LRU's internal tooling. Runs at https://ilsp.i80.dk (Nomad/Docker, autobox.i80.dk).

Provides smart autocomplete on top of standard LSPs:

Language Endpoint Extra completions
Bicep wss://ilsp.i80.dk/bicep Internal ACR modules, versions, params
YAML wss://ilsp.i80.dk/yaml AzDO pipeline templates, GHA reusable workflows
Python wss://ilsp.i80.dk/python Jedi (standard)

→ See EDITOR_SETUP.md for editor configuration and a full feature overview.

Quick start

# Check service health
curl https://ilsp.i80.dk/health

# Run smoke tests
python3 scripts/smoke_test_completions.py

# Local dev
make run        # build + start + health check
make run-quick  # start without rebuilding
make logs       # tail container logs
make health     # curl health endpoint

Updating catalogs

Catalogs are baked into the Docker image at build time — commit + push to update production (see EDITOR_SETUP.md for the full workflow and a note on why push_catalogs.sh / /reload don't take effect in prod).

python3 scripts/sync_pipeline_templates.py  # scan AzDO + GHA template repos
python3 scripts/sync_bicep_modules.py       # from DevOpsMCP repo — needs az CLI + ACR access
git add *_catalog.json && git commit -m "chore: refresh catalogs" && git push

Deploy

Push to main → Gitea Actions builds image → Nomad deploys automatically.

# Manual deploy (if CI is down)
git push
ssh autobox.i80.dk 'nomad job run /opt/nomad/jobs/ilsp.nomad'
Description
No description provided
Readme 441 KiB
Languages
Python 91%
Shell 3.7%
Makefile 2.5%
HCL 1.5%
Dockerfile 1.3%