Skip to content

feat(apex-lsp-extension): Effect Platform multi-worker topology with enrichment offload - W-22007395#330

Draft
peternhale wants to merge 42 commits intomainfrom
phale/workers
Draft

feat(apex-lsp-extension): Effect Platform multi-worker topology with enrichment offload - W-22007395#330
peternhale wants to merge 42 commits intomainfrom
phale/workers

Conversation

@peternhale
Copy link
Copy Markdown
Contributor

Summary

  • Introduces multi-worker topology (data-owner, enrichment pool, resource-loader) using @effect/platform, offloading hover, definition, diagnostics, and references to enrichment workers
  • Fixes stdlib type resolution on enrichment workers by reconstructing SymbolTable from IPC wire format (JSON round-trip stripped class prototypes)
  • Adds cross-file dependency pre-fetch so enrichment workers resolve workspace class references (e.g. FileUtilities.createFile) in a single data-owner round trip
  • Refactors ApexSymbolManager into Effect services with fully async ISymbolManager interface

Test plan

  • Open an Apex file, hover on a stdlib type (e.g. String) — shows class info and goto-def navigates to stdlib source
  • Hover on a cross-file method call (e.g. FileUtilities.createFile) — shows method signature after artifact resolution
  • Goto-definition on cross-file class reference — navigates to the class file
  • Diagnostics appear on file open and update on edits
  • Worker topology logs visible in Output > Apex Language Server Extension (WorkerServer)
  • All 4207 tests pass (npm test)

What issues does this PR fix or reference?

@W-22007395@

- Add Claude/Cursor skills, hooks, agents, and rules updates
- Knip: e2e entries, vsce ignore; remove dead code
- apex-lsp-shared: @jest/globals; apex-ls: trim direct deps
- Remove unused CaseInsensitiveStringSet; drop e2e pages barrel
- pr-draft safety text; block-git-hook-bypass hook

Made-with: Cursor
Add foundational worker thread infrastructure for the Apex language
server using effect platform serialized worker system.

Steps completed:
- Step 0: Add effect platform dependencies
- Step 1: Define wire DTOs with Schema.TaggedRequest
- Step 2: Create worker.platform.ts entry with role guards
- Step 3: WorkerCoordinator vertical slice behind feature flag
- Step 4: Full pool topology with integration tests

Made-with: Cursor
Wire the worker topology with real dispatch infrastructure:
- Step 5: LSP priority queue manager with worker dispatch strategy
- Step 6: Worker topology dispatcher (executeEffect, batch ingestion)
- Step 7: Worker→coordinator assistance proxy (parentPort IPC)
- Step 8: Workspace batch ingestion offloaded to data-owner worker
- Step 9: ResourceLoader migrated to resource-loader worker with IPC proxy
- Step 10: Browser worker entry (BrowserWorkerRunner, polyfills, sanitization)

Made-with: Cursor
Replace worker handler stubs with actual processing service delegation:
- WorkerBackendBootstrap bootstraps role-specific services in workers
- Data-owner handlers parse documents via DocumentProcessingService
- Enrichment handlers delegate to hover/definition/references/etc services
- canDispatch gates opened for all types except completion/signatureHelp/rename
- QuerySymbolSubset returns real symbol table data from worker ISymbolManager

Made-with: Cursor
Step 12: WorkerTransport/WorkerPoolTransport interfaces in
lsp-compliant-services abstract @effect/platform Worker behind opaque
handles. EffectPlatformWorkerTransport is the concrete adapter.
TransportTopologyDispatcher routes through the transport interface.
MockWorkerTransport enables unit testing without real threads.

Step 13: Add apex.experimental.workers.{enabled,poolSize,resourceLoader}
settings to extension package.json. Create ADR documenting topology,
wire contract, sole-entry invariant, and coordinator-only exceptions.

Made-with: Cursor
- Disable WorkerLoggerLayer and WorkerLogLevelChange message posting
  via parentPort — custom messages collide with @effect/platform
  worker protocol, crashing worker fibers. Both need a dedicated
  MessageChannel (future work).
- Add enrichment types (hover, definition, references, etc.) to
  COORDINATOR_ONLY_TYPES — enrichment workers have no document data
  until Step 11 data sharing is implemented, so requests fall back
  to local handler processing.
- Guard worker topology initialization with require.resolve check
  for node:worker_threads to prevent browser bundle crashes.
- Wire worker log-level propagation via WorkerInit.logLevel at
  startup, add WorkerLogMessage/WorkerLogLevelChange schemas,
  and add coordinator-side log message forwarding.

Made-with: Cursor
- Unify LSPRequestType/WireLspRequestType into single LSP_REQUEST_TYPES
  const array in apex-lsp-shared, deriving both TS union and Schema literal
- Extract enrichmentHandler factory in worker.platform.ts, reducing 7
  copy-paste handlers to factory + one-liner configs
- Extract dataOwnerDocHandler factory for 4 document mutation handlers
- Add cloneForWire helper replacing 11 JSON.parse(JSON.stringify()) calls
- Define DISPATCH_ROUTING registry in WorkerCoordinator, deriving
  DATA_OWNER_TYPES and COORDINATOR_ONLY_TYPES automatically
- Share WorkerTopologyStatus type from WorkerDispatchStrategy instead of
  duplicating in WorkerCoordinator
- Share AssistanceRequestPayload/ResponsePayload and guards from
  workerWireSchemas instead of inline definitions in mediator and worker
- Add handleLspRequest helper in LCSAdapter, reducing 5 protocol handlers
  from ~20 lines each to ~7 lines
- Convert LSPQueueManager to typed Effect.Service with proper error
  handling via Fiber.join, removing manual Cause dissection
- Remove unsafe as-any casts, replace with proper interfaces
- Fix TypeScript parameter properties incompatible with Node strip-only mode

Made-with: Cursor
…e functions

Extract ApexSymbolManager/ApexSymbolRefManager monoliths into a layered
Effect architecture: 5 data service Tags with shim Layers
(SymbolIndexStore, ReferenceStore, CacheStore, FileStateStore,
ConcurrencyGuards), 7 standalone function modules (symbolLookup,
typeHierarchy, referenceOps, graphAnalysis, symbolProvider,
symbolMutation, symbolResolution, stdlibLoading), an IEffectSymbolManager
facade Layer, a Ref-based SymbolIndexStoreLive, and a shared mock
factory. Eliminate Ref-class-field sync bridges in ApexSymbolRefManager.

This enables worker proxy via Layer swap without interface changes.

Made-with: Cursor
All ~32 ISymbolManager/SymbolProvider methods now return Promise<T>,
enabling transparent IPC proxying for enrichment workers.

Cascaded async/await through ApexSymbolManager internals (~130 sites),
resolution rules, 19 validators (via yield* Effect.promise), 15
processing services, the Effect facade, all mocks, and ~200 test sites.

Made-with: Cursor
Extract ~5,300 lines from ApexSymbolManager into standalone async
functions, reducing the class from ~10,730 to ~6,094 lines. The class
now delegates to extracted ops modules via a SymbolManagerOps structural
interface.

- positionUtils.ts: pure position/location checking helpers
- resolutionContext.ts: fallback context and text-based helpers
- symbolRefResolution.ts: standard class/type resolution, qualifier
  extraction, stdlib loading
- chainResolution.ts: chain walking, member resolution, disambiguation,
  qualified reference resolution
- services/symbolResolver.ts: SymbolResolver Effect service tag and
  SymbolManagerOps interface to break mutual recursion
- addSymbolTableAsync wrapper to bridge Effect.Effect<void> return type
  with Promise-based ops interface

Made-with: Cursor
…over

- Remove scope-strategy fallback from no-references path: scope's
  containment result is the enclosing method/class, not the token the
  cursor is on, so it returns wrong results for keywords/whitespace.
- Remove scope-strategy fallback from references path for same reason;
  precise + enrichment handle chained-ref resolution correctly.
- DML keyword hover (insert/update AS SYSTEM) and SOQL keyword hover
  (WITH SYSTEM_MODE) now correctly return null.
- Add getEffectiveServerMode() for worker bundle mode detection.
- Remove dev-only metrics block that caused errors in worker graphs.

Made-with: Cursor
Enable enrichment workers to enrich symbol tables locally and write back
to data-owner with version validation.

Wire Protocol (Phase 1):
- Extend QuerySymbolSubset to return version and detailLevel metadata
- Add UpdateSymbolSubset schema with validation fields
- Data owner validates: version match, detail level strictly higher

Enrichment Worker Write-Back (Phase 2):
- Add worker ID tracking for telemetry
- Return version metadata from loadSymbolDataForEnrichment
- Implement writeBackEnrichedSymbols helper
- Integrate write-back in DispatchHover

Enrichment Level Detection (Phase 3):
- Add shouldEnrich utility using LayerEnrichmentService ordering
- Configure hover to require 'full' detail level
- Conditional write-back based on enrichment need

Coordinator Integration (Phase 4):
- Route UpdateSymbolSubset through queryDataOwner
- Export UpdateSymbolSubset from apex-lsp-shared
- Update web worker QuerySymbolSubset with version metadata

Testing & Observability (Phases 5-6):
- Unit tests for UpdateSymbolSubset validation
- Track write-back metrics: accepted, rejected (version/level/missing)
- Debug logging for data owner and enrichment workers

Documentation (Phase 8):
- Comprehensive doc: docs/architecture/version-aware-writeback.md
- Validation rules, flow, metrics, future optimizations

Pattern: Single data-owner (writer) + enrichment pool (readers/enrichers)
solves single-worker performance bottleneck via distributed enrichment.
…apping bug

Fix deadlock in UpdateSymbolSubset handler:
- addSymbolTable returns Effect, now yields directly
- Was double-wrapping with Effect.promise(Effect.runPromise(...))

Adds tests and guides:
- WriteBackProtocol.debug.test.ts: minimal test (PASSING)
- WriteBackProtocol.simple.test.ts: validation tests (2/4 pass)
- Debugging guide and manual test guide

Write-back protocol validation works correctly.
Enable Effect.logDebug messages from workers by fixing two issues:
1. Set Effect Logger.minimumLogLevel to Debug (was filtering at Info)
2. Route worker logs through dedicated assistance port (avoid protocol collision)
3. Simplify configuration by removing separate apex.worker.logLevel setting

Changes:
- WorkerLoggerLayer: Add Logger.minimumLogLevel(LogLevel.Debug) to allow debug messages through Effect's filter
- workerLogger: Use assistPort ?? parentPort to avoid colliding with @effect/platform protocol
- CoordinatorAssistanceMediator: Listen for WorkerLogMessage on assistance port
- LCSAdapter: Use main apex.logLevel for workers (no separate worker.logLevel)
- LSPConfigurationManager: Auto-sync worker log level with main log level
- package.json: Remove apex.worker.logLevel setting
- Add docs/debugging/enabling-worker-logs.md with architecture and troubleshooting

Now apex.logLevel="debug" shows write-back protocol logs:
  [worker:1] [DATA-OWNER] Write-back accepted: 74 symbols merged...
  [worker:2] [ENRICHMENT] Write-back accepted: 42 symbols, full level...

Tested: Worker logs appear in VS Code Extension Host Output panel
Route pull diagnostics requests to enrichment workers to enable:
- Parallel processing across worker pool
- Symbol table enrichment with write-back
- Consistent detail level progression with hover

Changes:
- WorkerCoordinator: Change diagnostics routing from 'coordinatorOnly' to 'enrichmentPool'
- Worker already has DispatchDiagnostic handler (no changes needed)
- buildEnrichmentMessage already supports diagnostics (no changes needed)

Now diagnostics and hover both benefit from:
- Worker-based enrichment (public-api → protected → private → full)
- Write-back protocol to share enriched symbols with data owner
- Parallel processing for better performance

Debug logs will show:
  [worker:2] [ENRICHMENT] Write-back accepted: 74 symbols, full level...
  [worker:0] [DATA-OWNER] Write-back accepted: 74 symbols merged...

This is a single-line routing change; infrastructure already in place.
The DispatchDiagnostic handler was missing the write-back logic that
DispatchHover has, causing diagnostics to run enrichment but not share
the results back to the data owner.

Changes:
- Add loadSymbolDataForEnrichment call to get current detail level
- Add shouldEnrich check to determine if enrichment is needed
- Add writeBackEnrichedSymbols call when enrichment occurs
- Match the pattern used in DispatchHover handler

Now diagnostics will:
1. Load current symbol data from data owner
2. Check if enrichment is needed (current < full)
3. Run diagnostics processing (which enriches symbols)
4. Write back enriched symbols to data owner

Debug logs will show:
  [WorkerDispatch] → enrichmentPool: diagnostics
  [worker:2] [ENRICHMENT] Write-back accepted: 74 symbols, full level...
  [worker:0] [DATA-OWNER] Write-back accepted: 74 symbols merged...
- Pass logLevel and serverMode to EffectPlatformWorkerTransport
- Add logLevel to WriteBackProtocol debug test config
- Remove excessive debug logs from CodeLensProcessingService
- Update WorkerCoordinator test to reflect diagnostics routing change
- Route definition to enrichmentPool in DISPATCH_ROUTING
- Add write-back logic to DispatchDefinition handler
- Update WorkerCoordinator test to reflect definition routing change

Definition requests now run on enrichment workers with write-back protocol,
matching the pattern used by hover and diagnostics.
… resolution

cloneForWire (JSON round-trip) strips class prototypes, so enrichment
workers received plain objects instead of SymbolTable instances when
requesting stdlib classes via IPC. This silently broke hover and
goto-definition on standard types like String.

Two fixes:
- SymbolTable.fromJSON now handles the toJSON wire format ({key,symbol}
  entries) by unwrapping inner symbol objects before reconstruction.
- The enrichment worker's remote getSymbolTable calls fromJSON to
  rebuild a proper SymbolTable instance from the IPC response.
…orker topology failures

The web jest config (setup-web.js) was missing the
APEX_LS_DISABLE_WORKER_TOPOLOGY_EXIT env var that jest-setup.ts
already sets for Node tests. Worker topology init failures in the
jsdom environment called process.exit(1), crashing 2 test suites.
…solution

When precise symbol resolution failed, hover fell back to the scope
strategy which returns the nearest containing symbol (e.g. the
enclosing method). This displayed misleading hover info for unresolved
types instead of showing nothing.
…ment workers

Enrichment workers only loaded the current file's symbols from the
data-owner, so cross-file references (e.g. FileUtilities.createFile)
could not resolve — hover and goto-def failed for workspace classes.

Adds a two-phase load in loadSymbolDataForEnrichment:
1. Load current file's symbol table (existing behavior)
2. Extract unresolved CLASS_REFERENCE/CONSTRUCTOR_CALL names from its
   references, send them to the data-owner via a new ResolveDepUris
   message, and ingest the returned dependency symbol tables

The data-owner resolves class names to file URIs via
findFilesForSymbol and returns the corresponding symbol tables in a
single round trip.
These are build artifacts already listed in .gitignore but were
previously committed. Removing from tracking so they stop appearing
in diffs.
…ce processing

The syncRefsToClassFields and syncClassFieldsFromRefs methods were
incorrectly marked as no-ops. This caused Effect Ref state to diverge
from class field state during deferred reference batch processing,
leading to stale data when queueing and retrieving deferred references.

Also adds shared AI skills for language server architecture.
Local Claude Code permission settings should not be tracked.
Resolved conflicts:
- 14 semantic validators: combined our async ISymbolManager wrappers
  with main's typed narrowing helpers (isClassSymbol, etc.)
- ApexSymbolManager.ts: kept our extracted ops delegation
- ResourceLoaderIntegration.test.ts: kept await + main's updated FQN
- package-lock.json: regenerated
Picks up CI dependabot automerge workflow change.
@peternhale peternhale requested a review from a team as a code owner April 17, 2026 19:55
@peternhale peternhale requested a review from gbockus-sf April 17, 2026 19:55
@peternhale peternhale requested review from kylewalke and removed request for gbockus-sf April 17, 2026 20:00
@peternhale peternhale marked this pull request as draft April 17, 2026 20:00
These generated files are already in .gitignore but were previously
committed. Removing from tracking.
Test runner download cache, not source.
@github-actions
Copy link
Copy Markdown

E2E Test Results Summary

Run: 441

No test results found

Searched for **/junit.xml and **/results.json under downloaded test-results/ artifacts.

Specs With No Results

The following specs did not produce test results. This usually means the job crashed before tests ran (e.g. build failure, infra error, dependency download timeout).

  • apex-extension-core.spec.ts: Did not run — check the job logs
  • apex-goto-definition.spec.ts: Did not run — check the job logs
  • apex-hover.spec.ts: Did not run — check the job logs
  • apex-lsp-integration.spec.ts: Did not run — check the job logs
  • apex-outline.spec.ts: Did not run — check the job logs

Artifacts

View detailed test reports in the Artifacts section.

peternhale and others added 11 commits April 20, 2026 09:14
Introduces a new compilation worker role that handles all public-api
compilation, keeping the data-owner responsive for read queries and the
enrichment interface clean of raw source handling.

Key changes:
- New CompileDocument and WorkspaceBatchCompile wire messages
- Compilation worker compiles files and writes back symbols to data-owner
  via the existing UpdateSymbolSubset assistance channel
- Dual dispatch for didOpen/didChange: data-owner stores content,
  compilation worker compiles in parallel
- Post-workspace-load batch compilation: 648 files in ~8s (81 files/sec)
- Data-owner DispatchDocumentOpen/Change slimmed to storage-only
- Queue state webview updated with Compilation worker card
- Fix: write-back detail level check treats missing cache entry as
  level 0 (no symbols) instead of defaulting to public-api
- Fix: inject real stdlib provider into coordinator symbol manager
  after ResourceLoader init, fixing web-mode hover for stdlib types
- Add test:web:debug npm script with --log-level override support
…hreads

Workers now inherit profiling (--cpu-prof, --heap-prof), debug (--inspect=0
for auto-assigned ports), and heap-size flags from the main LS process.

- Add WorkerExecArgvBuilder: pure utility that derives per-role execArgv
  from process.execArgv (profile dirs get role subdirectories, debug ports
  become port 0, passthrough flags kept as-is)
- Add workerLayerFactory to TopologyConfig with overloaded initializeTopology
  so per-role layers can provide custom WorkerOptions (execArgv, name)
- Name worker threads apex-worker-<role> for Chrome DevTools visibility
- Forward worker stderr with role labels for debug port discoverability
- Pre-create per-role profile subdirectories in the extension client
- Update ADR, worker logging docs, and architecture skill files
…ace symbol visibility

Add QueryGraphData IPC request and wire the apex/graphData LSP handler through
the worker dispatcher so graph queries execute against the data-owner's symbol
manager (populated by batch ingest + enrichment write-backs) rather than the
empty coordinator-side manager.

- workerWireSchemas: add QueryGraphData TaggedRequest, DataOwnerTags entry, union member
- worker.platform: handle QueryGraphData in data-owner using GraphDataProcessingService
- WorkerCoordinator: extend createDispatcher with queryGraphData() routing to data-owner
- LCSAdapter: route apex/graphData through workerDispatcher.queryGraphData() when topology active
- showGraph.ts: fix prettier lint on inline object literals
- WorkerCoordinator.test: add live-worker and transport-unit tests for queryGraphData routing

Made-with: Cursor
…ing details

- README: expand Language Server Implementation with full architecture section
  covering request pipeline, multi-worker topology diagram, worker roles,
  cross-worker IPC patterns, wire protocol, transport isolation, and settings
- ADR: add QueryGraphData to data-owner responsibilities; note graph visualization
  fix in Consequences; correct resource-loader count from 0-1 to always-1;
  clarify resourceLoader flag is test-only; add LCSAdapter and diagrams to refs

Made-with: Cursor
* chore: bump versions for release [skip ci]

* chore: bump versions for release [skip ci]

* chore: bump versions for release [skip ci]

* fix(security): initial security audit remediation - W-22109681 (#331)

* fix(apex-lsp-web): escape queue dashboard bootstrap errors

Escape initialization errors before rendering them into the queue dashboard empty state.

Made-with: Cursor

* fix(apex-lsp-web): escape inline webview json payloads

Escape serialized webview data before embedding it in script tags to prevent tag breaks.

Made-with: Cursor

* fix(apex-lsp-web): use secure webview csp nonces

Generate webview CSP nonces with Web Crypto so they are not derived from Math.random.

Made-with: Cursor

* fix(apex-lsp-web): validate webview message origins

Ignore webview messages whose origin does not match the current webview origin.

Made-with: Cursor

* fix(ci): move shell expressions into environment variables

Use env vars in ci.yml before shell evaluation.

Made-with: Cursor

* fix(ci): move nightly shell input into environment variables

Use an env var in nightly.yml before shell evaluation.

Made-with: Cursor

* fix(ci): disable checkout credential persistence

Set persist-credentials to false for ci.yml jobs that do not push.

Made-with: Cursor

* fix(ci): disable nightly checkout credential persistence

Set persist-credentials to false for the nightly get-extensions checkout.

Made-with: Cursor

* fix(deps): bump knip to 6.4.1

Update knip and refresh the lockfile to remove the smol-toml audit finding.

Made-with: Cursor

* fix(deps): update extension packaging tooling

Bump vscode-services and vsce to reduce audit findings in the extension toolchain.

Made-with: Cursor

* fix(deps): update browser test tooling

Bump @vscode/test-web and refresh path-to-regexp to clear that audit finding.

Made-with: Cursor

* fix(repo): remove stale Commitizen tooling

Drop the unused Commitizen workflow and refresh the lockfile to clear lodash and tmp findings.

Made-with: Cursor

* build(repo): upgrade semantic-release to v25

Update semantic-release and align the release config with installed plugins.

Made-with: Cursor

* fix(apex-lsp-web): remove browser crypto polyfill

Replace bundled crypto helpers so web builds no longer need crypto-browserify.

Made-with: Cursor

* docs(repo): update security audit report with remediation status

Made-with: Cursor

* fix(ci): remove orphaned eda gitlink and add explicit submodules: false

actions/checkout@v6 enumerates submodule configuration even when
submodules recursion is disabled, causing a fatal error when a gitlink
entry exists in the index without a matching .gitmodules URL.

- Remove dangling gitlink for packages/apex-parser-ast/test/fixtures/eda
  (no tests reference this path; no .gitmodules entry exists for it)
- Add explicit submodules: false to all checkout steps in ci.yml and
  nightly.yml to make the intent unambiguous and prevent future regressions

Made-with: Cursor

* test(ci): strengthen e2e assertions and remove silent-pass patterns - W-21451133 (#316)

* test(ci): strengthen vacuous assertions and remove silent-pass patterns - W-22032496

Replace 8 go-to-definition tests that only checked isApexFileOpen()
with content verification assertions that validate actual navigation.
Remove try-catch-return pattern in 9 tests that silently passed
when test data files failed to open.

Made-with: Cursor

* fix(ci): use method usage site for post-edit go-to-definition test - W-22032496

F12 on a class declaration can navigate cross-file; use sayHello
method reference instead for reliable same-file navigation.

Made-with: Cursor

* fix: removed open web on startup + gotodef fixes

* fix: web specific fixes

* build(deps-dev): bump knip from 6.0.1 to 6.4.1 (#328)

Bumps [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) from 6.0.1 to 6.4.1.
- [Release notes](https://github.com/webpro-nl/knip/releases)
- [Commits](https://github.com/webpro-nl/knip/commits/knip@6.4.1/packages/knip)

---
updated-dependencies:
- dependency-name: knip
  dependency-version: 6.4.1
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Kyle Walker <kylewalker19@hotmail.com>

* build(deps-dev): bump jscpd from 4.0.8 to 4.0.9 (#326)

Bumps [jscpd](https://github.com/kucherenko/jscpd) from 4.0.8 to 4.0.9.
- [Changelog](https://github.com/kucherenko/jscpd/blob/master/CHANGELOG.md)
- [Commits](https://github.com/kucherenko/jscpd/commits)

---
updated-dependencies:
- dependency-name: jscpd
  dependency-version: 4.0.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Kyle Walker <kylewalker19@hotmail.com>

* build(deps-dev): bump @typescript-eslint/parser from 8.58.1 to 8.58.2 (#325)

Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 8.58.1 to 8.58.2.
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.58.2/packages/parser)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.58.2
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Kyle Walker <kylewalker19@hotmail.com>

* build(deps): bump @salesforce/vscode-i18n from 66.5.2 to 66.7.0 (#324)

Bumps [@salesforce/vscode-i18n](https://github.com/forcedotcom/salesforcedx-vscode) from 66.5.2 to 66.7.0.
- [Release notes](https://github.com/forcedotcom/salesforcedx-vscode/releases)
- [Changelog](https://github.com/forcedotcom/salesforcedx-vscode/blob/develop/CHANGELOG.md)
- [Commits](forcedotcom/salesforcedx-vscode@v66.5.2...vscode-i18n-v66.7.0)

---
updated-dependencies:
- dependency-name: "@salesforce/vscode-i18n"
  dependency-version: 66.7.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Kyle Walker <kylewalker19@hotmail.com>

* build(deps-dev): bump @types/node from 20.19.37 to 20.19.39 (#323)

Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 20.19.37 to 20.19.39.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 20.19.39
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Kyle Walker <kylewalker19@hotmail.com>

* build(deps-dev): bump ts-jest from 29.4.6 to 29.4.9 (#322)

Bumps [ts-jest](https://github.com/kulshekhar/ts-jest) from 29.4.6 to 29.4.9.
- [Release notes](https://github.com/kulshekhar/ts-jest/releases)
- [Changelog](https://github.com/kulshekhar/ts-jest/blob/main/CHANGELOG.md)
- [Commits](kulshekhar/ts-jest@v29.4.6...v29.4.9)

---
updated-dependencies:
- dependency-name: ts-jest
  dependency-version: 29.4.9
  dependency-type: direct:development
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Kyle Walker <kylewalker19@hotmail.com>

* build(deps-dev): bump esbuild from 0.27.7 to 0.28.0 (#319)

Bumps [esbuild](https://github.com/evanw/esbuild) from 0.27.7 to 0.28.0.
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](evanw/esbuild@v0.27.7...v0.28.0)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-version: 0.28.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Kyle Walker <kylewalker19@hotmail.com>

* build(deps): co-locate playwright and @playwright/test in e2e-tests (#332)

Both packages belong exclusively to E2E testing. Keeping them in the
root package.json meant Dependabot bumped them in separate PRs, causing
node_modules/.bin/playwright (owned by @playwright/test) to install the
wrong Chromium revision while @vscode/test-web resolved a different
playwright version from the root. Co-locating both at the same ^1.58.2
constraint in e2e-tests/package.json ensures Dependabot bumps them
together and the binary/browser versions stay in sync.

Made-with: Cursor

* chore: bump versions for release [skip ci]

* fix: update pjson

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: GitHub Action <action@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
…sage filtering

Implement multi-worker topology for VS Code web extensions using Web Workers.
Browser workers share the main postMessage channel with Effect protocol;
filter non-array messages (WorkerLogMessage, WorkerAssistanceRequest) before
they reach the Effect runtime handler to prevent TypeError crashes.

- Add worker.platform.web.ts browser worker entry point with BrowserWorkerRunner
- Add makeBrowserWorkerLayer to WorkerCoordinator with array-gated filteredWorker
- Branch LCSAdapter topology init: Node vs browser
- Unminify browser bundles for debugging (minify: false)

Made-with: Cursor
… close

Replace single-channel AssistancePortInit (sent on self, colliding with
Effect's BrowserWorkerRunner.layer handlePort listener) with two dedicated
MessageChannels per worker: one for Effect protocol (returned to
BrowserWorker.layer), one for logs/assistance (side-channel). Worker
defers Effect launch until WorkerPortsInit arrives on self.

Remove AssistancePortInit interface and isAssistancePortInit from
apex-lsp-shared. Remove debug agent-log fetch instrumentation blocks from
HoverProcessingService, MissingArtifactResolutionService, and
PrerequisiteOrchestrationService.

Made-with: Cursor
…sLog

Ensure worker topology init messages (worker script URLs, per-role
initialized, topology active, mediator attached) are always visible
regardless of the configured log level. Update test mock loggers to
include alwaysLog.

Made-with: Cursor
…r spinner

Replace vscode.window.withProgress notification toast with updates to
the Apex language status bar item throughout workspace loading. The
spinner runs from file scanning through server-side batch ingestion,
clearing only when apex/workspaceIngestionComplete arrives from the
server. A new ingestion complete callback in WorkspaceBatchHandler
triggers the notification after the daemon fiber finishes processing.

Made-with: Cursor
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants