Skip to content

Commit 5bbfbdc

Browse files
committed
fix(web): stage owned builtin extensions under /vscode/extensions
Owned esbuild workbench loads system extension resources from /vscode/extensions (relative to FILE_ROOT). Stage vendor/vscode/.build/web/extensions when keeping or packaging the owned tree so TS/JSON/language features stop 404ing.
1 parent 68df161 commit 5bbfbdc

3 files changed

Lines changed: 85 additions & 2 deletions

File tree

docs/vscode-web.md

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,27 @@ Dual mode (workbench):
2626

2727
### Dogfood (fast)
2828

29+
### Owned web + system extensions
30+
31+
Owned `dist/vscode-web` (esbuild) sets `_VSCODE_FILE_ROOT` to `/vscode/out/`. VS Code loads
32+
**system** extension files from `/vscode/extensions/*` (path `vs/../../extensions`).
33+
34+
`scripts/fetch-vscode-web.sh` and `build-web.sh --package` stage
35+
`vendor/vscode/.build/web/extensions``dist/vscode-web/extensions`.
36+
37+
Without that folder you get console errors like:
38+
39+
- `ExtensionResourceLoaderService.readExtensionResource … Not Found`
40+
- `Activating extension 'vscode.typescript-language-features' failed: Not Found`
41+
- 404 on `/vscode/node_modules/...` (dogfood AMD only; owned ESM usually ignores these)
42+
43+
**Harmless noise in pure browser mode:** `file:///.copilot`, `file:///.claude`, `file:///.agents`
44+
— VS Code agent/prompt discovery using the HTML File System API. No local disk handle is
45+
registered; safe to ignore.
46+
47+
Product (ZCode) extensions stay at **`/extensions/zcode-*`** (separate from system
48+
`/vscode/extensions`).
49+
2950
Third-party npm package packaging Microsoft’s web compile (not our pin; labeled dogfood):
3051

3152
```bash
@@ -91,7 +112,7 @@ Bootstrap injects `location.host` so extension URIs are absolute same-origin.
91112
| Load VS Code Web workbench |`/vscode` + `/` |
92113
| ZCode product.json ||
93114
| Dual-mode product payload ||
94-
| Built-in extensions served |`/extensions/*` |
115+
| Built-in extensions served |`/vscode/extensions/*` (owned web) + `/extensions/zcode-*` (product) |
95116
| `zcode-opfs` FileSystemProvider | ✅ seeded sample workspace |
96117
| Owned 1.129 web compile in CI | ⏳ scripts ready (`build-web.sh --package`); dogfood until staged |
97118
| Browser SCM (`zcode-git`) | ✅ status / commit / push over IDB |

scripts/build-web.sh

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,27 @@ package_web() {
245245
fi
246246
[[ "${entry}" != "unknown" ]] || die "staged tree missing workbench entry under ${OUT_DIR}/out/vs"
247247

248+
# Workbench loads system extension files from /vscode/extensions (not only packageJSON embeds).
249+
local web_ext_src=""
250+
for c in "${VSCODE}/.build/web/extensions" "${VSCODE}/.build/extensions"; do
251+
if [[ -d "${c}/typescript-language-features" ]] || [[ -d "${c}/json-language-features" ]]; then
252+
web_ext_src="${c}"
253+
break
254+
fi
255+
done
256+
if [[ -n "${web_ext_src}" ]]; then
257+
log "Staging builtin web extensions from ${web_ext_src}"
258+
rm -rf "${OUT_DIR}/extensions"
259+
mkdir -p "${OUT_DIR}/extensions"
260+
if command -v rsync >/dev/null 2>&1; then
261+
rsync -a "${web_ext_src}/" "${OUT_DIR}/extensions/"
262+
else
263+
cp -R "${web_ext_src}/." "${OUT_DIR}/extensions/"
264+
fi
265+
else
266+
log "WARN: missing ${VSCODE}/.build/web/extensions — language features will 404 at runtime"
267+
fi
268+
248269
cat > "${OUT_DIR}/.zcode-vscode-web.json" <<EOF
249270
{
250271
"source": "owned",
@@ -254,7 +275,8 @@ package_web() {
254275
"vscodeCommit": "$(cd "${VSCODE}" && git rev-parse HEAD)",
255276
"vscodeTag": "$(cd "${VSCODE}" && git describe --tags --always 2>/dev/null || echo unknown)",
256277
"builtAt": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
257-
"node": "$(node -v)"
278+
"node": "$(node -v)",
279+
"webExtensions": "$( [[ -d "${OUT_DIR}/extensions/typescript-language-features" ]] && echo yes || echo no )"
258280
}
259281
EOF
260282
mkdir -p "${ROOT}/dist/web"

scripts/fetch-vscode-web.sh

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,51 @@ TARBALL_URL="${VSCODE_WEB_TARBALL_URL:-https://registry.npmjs.org/vscode-web/-/v
1414
log() { printf '==> %s\n' "$*"; }
1515
die() { echo "error: $*" >&2; exit 1; }
1616

17+
# Owned esbuild/gulp workbench embeds builtin extension *metadata* in the bundle, but
18+
# loads language configs / extension files from /vscode/extensions/* (see
19+
# builtinExtensionsPath = vs/../../extensions relative to _VSCODE_FILE_ROOT=/vscode/out/).
20+
# Stage web-built extensions next to out/ so TS/JSON/language features activate.
21+
stage_owned_web_extensions() {
22+
local dest="${OUT}/extensions"
23+
local candidates=(
24+
"${ROOT}/vendor/vscode/.build/web/extensions"
25+
"${ROOT}/vendor/vscode/.build/extensions"
26+
)
27+
local src=""
28+
for c in "${candidates[@]}"; do
29+
if [[ -d "${c}/typescript-language-features" ]] || [[ -d "${c}/json-language-features" ]]; then
30+
src="${c}"
31+
break
32+
fi
33+
done
34+
if [[ -z "${src}" ]]; then
35+
log "WARN: no vendor/vscode/.build/web/extensions — TS/JSON language features will 404"
36+
log " rebuild with: cd vendor/vscode && npm run gulp compile-web-extensions-build"
37+
return 0
38+
fi
39+
if [[ -d "${dest}/typescript-language-features" ]] && [[ -d "${dest}/json-language-features" ]]; then
40+
log "Builtin web extensions already present at dist/vscode-web/extensions"
41+
return 0
42+
fi
43+
log "Staging builtin web extensions from ${src}"
44+
rm -rf "${dest}"
45+
mkdir -p "${OUT}"
46+
if command -v rsync >/dev/null 2>&1; then
47+
rsync -a "${src}/" "${dest}/"
48+
else
49+
mkdir -p "${dest}"
50+
cp -R "${src}/." "${dest}/"
51+
fi
52+
log "Staged $(ls -1 "${dest}" 2>/dev/null | wc -l | tr -d ' ') builtin web extensions → dist/vscode-web/extensions"
53+
}
54+
1755
# Keep already-staged owned tree (do not clobber with dogfood npm)
1856
if [[ -f "${OUT}/.zcode-vscode-web.json" ]] \
1957
&& grep -q '"source": "owned"' "${OUT}/.zcode-vscode-web.json" 2>/dev/null \
2058
&& { [[ -f "${OUT}/out/vs/workbench/workbench.web.main.internal.js" ]] \
2159
|| [[ -f "${OUT}/out/vs/loader.js" ]]; }; then
2260
log "Keeping existing owned dist/vscode-web"
61+
stage_owned_web_extensions
2362
exit 0
2463
fi
2564

@@ -48,6 +87,7 @@ for c in "${OWNED_CANDIDATES[@]}"; do
4887
"stagedAt": "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
4988
}
5089
EOF
90+
stage_owned_web_extensions
5191
log "Staged owned build → dist/vscode-web"
5292
exit 0
5393
fi

0 commit comments

Comments
 (0)