From 7a60cef298c34fbc28a9956a34541d5e8a309ce8 Mon Sep 17 00:00:00 2001 From: arkleselect Date: Mon, 26 Oct 2026 22:22:09 -0700 Subject: [PATCH 1/5] fix(macos): stabilize Java startup and plugin launch (#1523, #1524) --- ...module-runtime-boundaries-and-lifecycle.md | 15 +++ ...a-language-server-as-declarative-plugin.md | 4 + ...LanguageServerPreparationCoordinator.swift | 4 +- ...anguageIntelligenceModuleCoordinator.swift | 17 ++- .../ModuleSessionCoordinator.swift | 2 + .../RustLanguageServerRuntimeAdapter.swift | 17 ++- .../Models/AppModel/AppModel+JavaIndex.swift | 4 +- .../Lithe/Models/AppModel/AppModel.swift | 18 ++- .../LanguageServerRuntimeContracts.swift | 28 +++- .../Runtime/LanguageServerSession.swift | 22 +--- .../LanguageToolingSessionManager.swift | 15 +++ .../JavaLanguageServerRuntimeTests.swift | 18 +++ ...geIntelligenceModuleCoordinatorTests.swift | 123 ++++++++++++++++++ .../ModuleSessionCoordinatorTests.swift | 3 + .../RunConfigurationIntegrationTests.swift | 49 +++++++ .../features/lsp-lifecycle.json | 11 +- 16 files changed, 317 insertions(+), 33 deletions(-) create mode 100644 macos/Tests/LitheTests/LanguageIntelligenceModuleCoordinatorTests.swift diff --git a/.agents/notes/implemented/architecture/2026-09-13-module-runtime-boundaries-and-lifecycle.md b/.agents/notes/implemented/architecture/2026-09-13-module-runtime-boundaries-and-lifecycle.md index c0a4201b7..fbf51f583 100644 --- a/.agents/notes/implemented/architecture/2026-09-13-module-runtime-boundaries-and-lifecycle.md +++ b/.agents/notes/implemented/architecture/2026-09-13-module-runtime-boundaries-and-lifecycle.md @@ -96,6 +96,21 @@ MacServiceContainer 查询全部为空。不要用睡眠或反复重新注入能力掩盖这个顺序;搜索排除回归与插件页面 生命周期测试都使用同一个明确的完成边界。 +### 语言服务恢复必须等待工作区清理 + +macOS 打开项目时会异步清理上一轮模块图;清理结束前,语言能力仍可能留在缓存中。 +#1524 曾让 Java 预热拿到旧能力,接着旧清理才执行到 Java 插件,取消刚启动的会话。 +`LanguageIntelligenceModuleCoordinator` 与执行、调试协调器共用 +`awaitModuleRuntimeShutdown()`:先等待整轮清理,再检查调用方取消状态,最后读取能力缓存或激活模块。 +后台维护入口也必须经过这个顺序,不能提前捕获 session 然后在等待后返回旧对象。 +同步文档入口在清理期间延后启动,恢复时重新检查工作区身份和文档是否仍打开;等待不会阻塞界面线程。 + +Java 的准备状态是应用操作的投影。当前 operation ID 对应的 `.stopped` 到达后, +取消该准备 owner 并回到 idle;旧 operation 的迟到事件不得清除较新准备状态。 +不能通过删除导航的就绪检查、增加固定延时或无限重试来掩盖清理顺序错误。 +`LanguageIntelligenceModuleCoordinatorTests` 用有截止的异步闸门暂停清理,覆盖普通激活、 +后台维护、缓存复用和等待期间取消;`JavaLanguageServerRuntimeTests` 覆盖停止后的状态收尾及迟到事件。 + ### 数据库视图在模块释放后的刷新 退出应用或休眠数据库模块时,SwiftUI(macOS 的声明式界面框架)可能先刷新 diff --git a/.agents/notes/implemented/architecture/2026-10-13-java-language-server-as-declarative-plugin.md b/.agents/notes/implemented/architecture/2026-10-13-java-language-server-as-declarative-plugin.md index 657e05ee2..e178ddbd4 100644 --- a/.agents/notes/implemented/architecture/2026-10-13-java-language-server-as-declarative-plugin.md +++ b/.agents/notes/implemented/architecture/2026-10-13-java-language-server-as-declarative-plugin.md @@ -63,6 +63,10 @@ JDK 也一样:`ProjectRuntimeService` 不再问“app 内置的 JDK 在哪” 新增一个集成时,只需要新增一个实现协议的类型并在注册处加一行;Rust Core 的契约校验仍然决定哪些 ID 可以被声明。 +插件身份与宿主集成必须同时传入 Core(#1523):`StdioLanguageServerSession` 的插件启动入口携带 `hostIntegrationLaunch`、平台缓存目录、工作区指纹、Maven/Gradle 上下文,以及插件配置和 host services。不能因为存在 `pluginID` 就退回只传可执行文件和静态参数的入口,否则 JDT 会把 Equinox jar 当包装脚本,缺少 `-configuration`,随后退出并在发行目录写日志。继续复用 Core 的 `prepare_jdt_configuration_area`,从包内只读配置生成宿主缓存中的可写副本;没有新增资源目录或缓存所有者,也不改变应用签名和增量更新的发行基线。 + +同一工作区的服务连续三次启动失败后,自动同步直接返回已有失败,直到显式停止/重启或切换工作区;进入 ready 后清零。这保留短暂故障后的重试,但阻止每次编辑器同步重新创建 JVM。这里选择有限尝试而非增加定时器和无限退避;代价是持续失败需要用户修复环境后重新启动服务。 + ### 4. 运行、测试、调试由插件声明后交还宿主 插件一旦声明某个语言,宿主就认为这个语言的进程类能力归插件所有:能力目录(`PluginLanguageProviderCatalogSource`)去掉运行、测试、调试标记,语言包注册表(`LanguagePackRegistry`)不再创建内置的测试提供方,运行和测试服务要求必须有插件的执行模块。这条规则是为 PHP、Go 这类整套由插件提供的语言定的,目的是插件缺失或停用时宿主不偷偷退回内置工具。 diff --git a/macos/Sources/Lithe/Application/Composition/JavaLanguageServerPreparationCoordinator.swift b/macos/Sources/Lithe/Application/Composition/JavaLanguageServerPreparationCoordinator.swift index 85c9ff0d8..65fdb9a73 100644 --- a/macos/Sources/Lithe/Application/Composition/JavaLanguageServerPreparationCoordinator.swift +++ b/macos/Sources/Lithe/Application/Composition/JavaLanguageServerPreparationCoordinator.swift @@ -251,7 +251,9 @@ final class JavaLanguageServerPreparationCoordinator { ? .timedOut(message: failure.message ?? "JDTLS failed to start.") : .failed(message: failure.message ?? "JDTLS failed to start.") ) - case .startingProcess, .initializing, .stopping, .stopped: + case .stopped: + javaFeature.cancelLanguageServerPreparation() + case .startingProcess, .initializing, .stopping: break } } diff --git a/macos/Sources/Lithe/Application/Composition/LanguageIntelligenceModuleCoordinator.swift b/macos/Sources/Lithe/Application/Composition/LanguageIntelligenceModuleCoordinator.swift index 9581f1eb4..d3b1e1b38 100644 --- a/macos/Sources/Lithe/Application/Composition/LanguageIntelligenceModuleCoordinator.swift +++ b/macos/Sources/Lithe/Application/Composition/LanguageIntelligenceModuleCoordinator.swift @@ -9,22 +9,28 @@ import LitheModuleAPI final class LanguageIntelligenceModuleCoordinator { private let runtime: ModuleRuntime private let store: ModuleCapabilityStore + private let awaitShutdown: () async -> Void private let bind: (LanguageIntelligenceCapability) -> Void private let notify: @MainActor (String) -> Void init( runtime: ModuleRuntime, store: ModuleCapabilityStore, + awaitShutdown: @escaping () async -> Void, bind: @escaping (LanguageIntelligenceCapability) -> Void, notify: @escaping @MainActor (String) -> Void ) { self.runtime = runtime self.store = store + self.awaitShutdown = awaitShutdown self.bind = bind self.notify = notify } func activate() async throws -> LanguageIntelligenceCapability { + // A cached capability can still belong to the graph being torn down. + await awaitShutdown() + try Task.checkCancellation() if let cached: LanguageIntelligenceCapability = store.capability(.languageIntelligence) { return cached } @@ -58,13 +64,8 @@ final class LanguageIntelligenceModuleCoordinator { resetWorkspaceState(feature) } - func sessionsForMaintenance( - current: LanguageToolingSessionManager? - ) async throws -> LanguageToolingSessionManager { - if let current { - return current - } - return try await activate().sessions + func sessionsForMaintenance() async throws -> LanguageToolingSessionManager { + try await activate().sessions } /// Activates the testing extension for every language support that claims @@ -76,6 +77,8 @@ final class LanguageIntelligenceModuleCoordinator { testService: LanguageTestService, supports: @MainActor ([URL]) -> [LanguageSupportDeclaration] ) async -> Bool { + await awaitShutdown() + guard !Task.isCancelled else { return false } for support in supports(files) where support.testingModuleID != nil { do { let value = try await runtime.activateCapability( diff --git a/macos/Sources/Lithe/Application/Composition/ModuleSessionCoordinator.swift b/macos/Sources/Lithe/Application/Composition/ModuleSessionCoordinator.swift index 8ce5f514b..020bdbec9 100644 --- a/macos/Sources/Lithe/Application/Composition/ModuleSessionCoordinator.swift +++ b/macos/Sources/Lithe/Application/Composition/ModuleSessionCoordinator.swift @@ -38,6 +38,8 @@ final class ModuleSessionCoordinator { onModuleReleased(moduleID) } + var isShuttingDown: Bool { shutdownTask != nil } + func beginShutdown() { guard shutdownTask == nil else { return } workbench.endLayoutSession() diff --git a/macos/Sources/Lithe/Core/Rust/RustLanguageServerRuntimeAdapter.swift b/macos/Sources/Lithe/Core/Rust/RustLanguageServerRuntimeAdapter.swift index 5047c42e6..a888da5c1 100644 --- a/macos/Sources/Lithe/Core/Rust/RustLanguageServerRuntimeAdapter.swift +++ b/macos/Sources/Lithe/Core/Rust/RustLanguageServerRuntimeAdapter.swift @@ -250,7 +250,9 @@ extension RustCoreBridge: LanguageServerRuntimeCore { startPluginLanguageServer( pluginID: pluginID, providerID: providerID, executableURL: executableURL, arguments: arguments, environment: environment, rootURL: rootURL, initializationOptions: initializationOptions, - workspaceConfiguration: nil, initializeTimeout: initializeTimeout, + workspaceConfiguration: nil, hostServices: [], hostIntegrationLaunch: nil, + cacheDirectoryURL: nil, workspaceFingerprint: nil, mavenContext: nil, javaGradle: nil, + initializeTimeout: initializeTimeout, requestTimeout: requestTimeout, shutdownTimeout: shutdownTimeout ) } @@ -264,6 +266,12 @@ extension RustCoreBridge: LanguageServerRuntimeCore { rootURL: URL, initializationOptions: ToolingJSONValue?, workspaceConfiguration: ToolingJSONValue?, + hostServices: [String], + hostIntegrationLaunch: LanguageServerHostIntegrationLaunch?, + cacheDirectoryURL: URL?, + workspaceFingerprint: String?, + mavenContext: MavenLaunchContext?, + javaGradle: JavaGradleImportConfiguration?, initializeTimeout: TimeInterval, requestTimeout: TimeInterval, shutdownTimeout: TimeInterval @@ -278,6 +286,13 @@ extension RustCoreBridge: LanguageServerRuntimeCore { workingDirectoryURL: rootURL, initializationOptions: initializationOptions, workspaceConfiguration: workspaceConfiguration, + hostServices: hostServices, + runtimeExecutableURL: hostIntegrationLaunch?.runtimeExecutableURL, + jdtlsLaunchResources: hostIntegrationLaunch?.coreLaunch?.jdtlsLaunchResources, + cacheDirectoryURL: cacheDirectoryURL, + workspaceFingerprint: workspaceFingerprint, + mavenContext: mavenContext, + javaGradle: javaGradle, initializeTimeout: initializeTimeout, requestTimeout: requestTimeout, shutdownTimeout: shutdownTimeout diff --git a/macos/Sources/Lithe/Models/AppModel/AppModel+JavaIndex.swift b/macos/Sources/Lithe/Models/AppModel/AppModel+JavaIndex.swift index 97aeff3ab..d88cd247f 100644 --- a/macos/Sources/Lithe/Models/AppModel/AppModel+JavaIndex.swift +++ b/macos/Sources/Lithe/Models/AppModel/AppModel+JavaIndex.swift @@ -66,9 +66,7 @@ extension AppModel { { guard let identity = expectedIdentity ?? currentWorkspaceIdentity, isCurrentWorkspace(identity), !Task.isCancelled else { throw CancellationError() } - let sessions = try await languageIntelligenceModuleCoordinator.sessionsForMaintenance( - current: languageToolingSessionsIfActive - ) + let sessions = try await languageIntelligenceModuleCoordinator.sessionsForMaintenance() try Task.checkCancellation() guard isCurrentWorkspace(identity) else { throw CancellationError() } await registerPluginLanguageServers(in: sessions) diff --git a/macos/Sources/Lithe/Models/AppModel/AppModel.swift b/macos/Sources/Lithe/Models/AppModel/AppModel.swift index d5b695202..c0adaf1d3 100644 --- a/macos/Sources/Lithe/Models/AppModel/AppModel.swift +++ b/macos/Sources/Lithe/Models/AppModel/AppModel.swift @@ -227,6 +227,7 @@ final class AppModel: ObservableObject, Identifiable, UnsavedDocumentHandling { lazy var languageIntelligenceModuleCoordinator = LanguageIntelligenceModuleCoordinator( runtime: services.moduleRuntime, store: moduleCapabilityStore, + awaitShutdown: { [weak self] in await self?.awaitModuleRuntimeShutdown() }, bind: { [weak self] in self?.bindLanguageIntelligenceCapability($0) }, notify: { [weak self] in self?.showNotification($0) } ) @@ -1359,6 +1360,16 @@ final class AppModel: ObservableObject, Identifiable, UnsavedDocumentHandling { ) return false } + if moduleSessionCoordinator?.isShuttingDown == true { + Task { @MainActor [weak self, weak document] in + guard let self else { return } + await self.awaitModuleRuntimeShutdown() + guard let document, !Task.isCancelled, self.isCurrentWorkspace(identity), + self.openDocuments.contains(where: { $0 === document }) else { return } + _ = self.activateLanguageServerIfAvailable(for: document) + } + return false + } if descriptor.id == "java" { switch prepareJavaLanguageServerRuntimeIfNeeded(for: document) { case .ready: break @@ -1379,6 +1390,9 @@ final class AppModel: ObservableObject, Identifiable, UnsavedDocumentHandling { Task { [weak self, weak document] in guard let self, let document else { return } do { + await self.awaitModuleRuntimeShutdown() + guard !Task.isCancelled, self.isCurrentWorkspace(identity), + self.openDocuments.contains(where: { $0 === document }) else { return } _ = try await self.services.moduleRuntime.activateCapability(capabilityID) guard self.isCurrentWorkspace(identity), !Task.isCancelled, self.openDocuments.contains(where: { $0 === document }) else { return } @@ -1439,9 +1453,7 @@ final class AppModel: ObservableObject, Identifiable, UnsavedDocumentHandling { Task { [weak self] in guard let self else { return } do { - let value = try await self.services.moduleRuntime.activateCapability(.languageIntelligence) - guard let capability = value as? LitheLanguageIntelligenceModule.LanguageIntelligenceCapability else { return } - self.bindLanguageIntelligenceCapability(capability) + _ = try await self.languageIntelligenceModuleCoordinator.activate() guard self.isCurrentWorkspace(identity), !Task.isCancelled, self.openDocuments.contains(where: { $0 === document }) else { return } _ = self.activateLanguageServerIfAvailable(for: document) diff --git a/macos/Sources/LitheCoreContracts/Language/LanguageServerRuntimeContracts.swift b/macos/Sources/LitheCoreContracts/Language/LanguageServerRuntimeContracts.swift index 6b5633a84..b24f8aad3 100644 --- a/macos/Sources/LitheCoreContracts/Language/LanguageServerRuntimeContracts.swift +++ b/macos/Sources/LitheCoreContracts/Language/LanguageServerRuntimeContracts.swift @@ -502,6 +502,12 @@ package protocol LanguageServerRuntimeCore: Sendable { rootURL: URL, initializationOptions: ToolingJSONValue?, workspaceConfiguration: ToolingJSONValue?, + hostServices: [String], + hostIntegrationLaunch: LanguageServerHostIntegrationLaunch?, + cacheDirectoryURL: URL?, + workspaceFingerprint: String?, + mavenContext: MavenLaunchContext?, + javaGradle: JavaGradleImportConfiguration?, initializeTimeout: TimeInterval, requestTimeout: TimeInterval, shutdownTimeout: TimeInterval @@ -712,13 +718,33 @@ package extension LanguageServerRuntimeCore { rootURL: URL, initializationOptions: ToolingJSONValue?, workspaceConfiguration _: ToolingJSONValue?, + hostServices: [String], + hostIntegrationLaunch: LanguageServerHostIntegrationLaunch?, + cacheDirectoryURL: URL?, + workspaceFingerprint: String?, + mavenContext: MavenLaunchContext?, + javaGradle: JavaGradleImportConfiguration?, initializeTimeout: TimeInterval, requestTimeout: TimeInterval, shutdownTimeout: TimeInterval ) -> Result { - startPluginLanguageServer( + if let hostIntegrationLaunch, hostServices.isEmpty { + return startLanguageServer( + providerID: providerID, executableURL: executableURL, arguments: arguments, + environment: environment, rootURL: rootURL, workingDirectoryURL: rootURL, + initializationOptions: initializationOptions, + runtimeExecutableURL: hostIntegrationLaunch.runtimeExecutableURL, + jdtlsLaunchResources: hostIntegrationLaunch.coreLaunch?.jdtlsLaunchResources, + cacheDirectoryURL: cacheDirectoryURL, workspaceFingerprint: workspaceFingerprint, + mavenContext: mavenContext, javaGradle: javaGradle, + initializeTimeout: initializeTimeout, requestTimeout: requestTimeout, + shutdownTimeout: shutdownTimeout + ) + } + return startPluginLanguageServer( pluginID: pluginID, providerID: providerID, executableURL: executableURL, arguments: arguments, environment: environment, rootURL: rootURL, initializationOptions: initializationOptions, + hostServices: hostServices, initializeTimeout: initializeTimeout, requestTimeout: requestTimeout, shutdownTimeout: shutdownTimeout ) } diff --git a/macos/Sources/LitheLanguageIntelligenceModule/Runtime/LanguageServerSession.swift b/macos/Sources/LitheLanguageIntelligenceModule/Runtime/LanguageServerSession.swift index 3f65d3974..f7d5e6d5d 100644 --- a/macos/Sources/LitheLanguageIntelligenceModule/Runtime/LanguageServerSession.swift +++ b/macos/Sources/LitheLanguageIntelligenceModule/Runtime/LanguageServerSession.swift @@ -201,21 +201,7 @@ package final class LanguageServerRuntimeSession: LanguageServerSession { ([executableURL.path] + arguments).joined(separator: " "), nil ) - let started = if let pluginID, !hostServices.isEmpty { - core.startPluginLanguageServer( - pluginID: pluginID, - providerID: providerID, - executableURL: executableURL, - arguments: arguments, - environment: environment, - rootURL: normalizedRoot, - initializationOptions: initializationOptions, - hostServices: hostServices, - initializeTimeout: initializeTimeout, - requestTimeout: requestTimeout, - shutdownTimeout: shutdownTimeout - ) - } else if let pluginID { + let started = if let pluginID { core.startPluginLanguageServer( pluginID: pluginID, providerID: providerID, @@ -225,6 +211,12 @@ package final class LanguageServerRuntimeSession: LanguageServerSession { rootURL: normalizedRoot, initializationOptions: initializationOptions, workspaceConfiguration: workspaceConfiguration, + hostServices: hostServices, + hostIntegrationLaunch: hostIntegrationLaunch, + cacheDirectoryURL: cacheDirectoryURL, + workspaceFingerprint: workspaceFingerprint, + mavenContext: mavenContext, + javaGradle: javaGradle, initializeTimeout: initializeTimeout, requestTimeout: requestTimeout, shutdownTimeout: shutdownTimeout diff --git a/macos/Sources/LitheLanguageIntelligenceModule/Services/LanguageToolingSessionManager.swift b/macos/Sources/LitheLanguageIntelligenceModule/Services/LanguageToolingSessionManager.swift index cdb291db3..4517a2075 100644 --- a/macos/Sources/LitheLanguageIntelligenceModule/Services/LanguageToolingSessionManager.swift +++ b/macos/Sources/LitheLanguageIntelligenceModule/Services/LanguageToolingSessionManager.swift @@ -65,6 +65,8 @@ package final class LanguageToolingSessionManager: ObservableObject, private let runtimeFactory: (any LanguageProviderRuntimeFactory)? private var languageServers: [String: any LanguageServerSession] = [:] private var languageServerRoots: [String: URL] = [:] + private static let maximumStartupAttempts = 3 + private var languageServerStartupAttempts: [String: (root: URL, count: Int)] = [:] /// Core can clear Maven settings only for a session launched with Maven /// inputs. Keep this with the session so a pure Gradle start stays nil. private var languageServerMavenContexts: [String: MavenLaunchContext] = [:] @@ -1104,6 +1106,7 @@ package final class LanguageToolingSessionManager: ObservableObject, } package func stopLanguageServer(providerID: String) { + languageServerStartupAttempts[providerID] = nil if providerID == "java" { projectPreparation = nil } if providerID == "java" { javaDependencyChangeTask?.cancel() @@ -1166,6 +1169,7 @@ package final class LanguageToolingSessionManager: ObservableObject, languageServerSessionIdentities = [:] languageServerFeatureProviders = [:] languageServerStates = [:] + languageServerStartupAttempts = [:] languageServerOperationIDs = [:] } @@ -1594,6 +1598,15 @@ package final class LanguageToolingSessionManager: ObservableObject, return active } + let previousAttempt = languageServerStartupAttempts[descriptor.id] + let attempts = previousAttempt?.root == rootURL ? previousAttempt?.count ?? 0 : 0 + // Document synchronization must not turn a persistent startup failure + // into an unbounded process loop. Explicit stop/restart clears the budget. + if attempts >= Self.maximumStartupAttempts, + case .failed(let failure) = languageServerStates[descriptor.id] { + throw LanguageServerSessionStartError(failure: failure) + } + if extensionLifecycles[descriptor.id]?.value?.isRetired == true { // Stopped by its module before any server was started for it. unregisterLanguageServerExtension(languageID: descriptor.id) @@ -1617,6 +1630,7 @@ package final class LanguageToolingSessionManager: ObservableObject, if languageServers[descriptor.id] != nil || languageServerRoots[descriptor.id] != nil { stopLanguageServer(providerID: descriptor.id) } + languageServerStartupAttempts[descriptor.id] = (rootURL, attempts + 1) let operationID = requestedOperationID ?? UUID() languageServerOperationIDs[descriptor.id] = operationID recordLanguageServerLog( @@ -2121,6 +2135,7 @@ package final class LanguageToolingSessionManager: ObservableObject, languageServerFeatures[providerID] = nil languageServerInfos[providerID] = nil case .ready: + languageServerStartupAttempts[providerID] = nil languageServerFeatures[providerID] = session.features languageServerInfos[providerID] = session.serverInfo recordLanguageServerLog( diff --git a/macos/Tests/LitheTests/JavaLanguageServerRuntimeTests.swift b/macos/Tests/LitheTests/JavaLanguageServerRuntimeTests.swift index d69db0cd9..b22de5168 100644 --- a/macos/Tests/LitheTests/JavaLanguageServerRuntimeTests.swift +++ b/macos/Tests/LitheTests/JavaLanguageServerRuntimeTests.swift @@ -198,6 +198,24 @@ struct JavaLanguageServerRuntimeTests { #expect(!state.belongs(to: URL(fileURLWithPath: "/other", isDirectory: true))) } + @Test(arguments: [false, true]) + @MainActor + func stoppedSessionClearsOnlyItsOwnPreparation(stale: Bool) { + let root = URL(fileURLWithPath: "/workspace/java-stop", isDirectory: true) + let feature = JavaFeatureModel(operations: NoProjectJavaOperations()) + let owner = feature.beginLanguageServerPreparation(workspaceURL: root, operationID: UUID()) + JavaLanguageServerPreparationCoordinator().handleSessionState( + .stopped, operationID: stale ? UUID() : owner.operationID, + javaFeature: feature, workspaceURL: root, + onReady: { Issue.record("A stopped session cannot become ready") }, + onFailure: { _ in Issue.record("An intentional stop is not a startup failure") } + ) + #expect(feature.isLanguageServerPreparing == stale) + #expect(feature.languageServerOperationID == (stale ? owner.operationID : nil)) + #expect(feature.languageServerStateBelongs(to: root) == stale) + feature.cancelLanguageServerPreparation() + } + @Test @MainActor func startupRechecksImportInvalidatedDuringRuntimePreparation() async throws { diff --git a/macos/Tests/LitheTests/LanguageIntelligenceModuleCoordinatorTests.swift b/macos/Tests/LitheTests/LanguageIntelligenceModuleCoordinatorTests.swift new file mode 100644 index 000000000..72830f2fb --- /dev/null +++ b/macos/Tests/LitheTests/LanguageIntelligenceModuleCoordinatorTests.swift @@ -0,0 +1,123 @@ +import Foundation +import LitheApplicationKernel +import LitheCoreContracts +import LitheLanguageIntelligenceModule +import LitheModuleAPI +import Testing +@testable import Lithe + +@MainActor +struct LanguageIntelligenceModuleCoordinatorTests { + @Test(arguments: [false, true], [false, true]) + func languageActivationWaitsForWorkspaceTeardown(maintenance: Bool, cancel: Bool) async throws { + let runtime = ModuleRuntime() + let store = ModuleCapabilityStore() + let started = TestGate(), release = TestGate(), joined = TestGate(), finished = TestGate() + var graphs: [StartupLanguageGraph] = [] + let workspace = ModuleManifest(id: .workspace, displayName: "Workspace", scope: .workspace) + try runtime.register(ModuleFactory(manifest: workspace) { StartupWorkspaceModule(manifest: workspace) }) + try runtime.register(ModuleFactory(manifest: LanguageIntelligenceModule.moduleManifest, + contributions: LanguageIntelligenceModule.moduleContributions) { + LanguageIntelligenceModule(makeGraph: { + let graph = StartupLanguageGraph() + graphs.append(graph) + return graph + }) + }) + let session = ModuleSessionCoordinator( + runtime: runtime, capabilities: store, workbench: WorkbenchFeatureModel(), + onModuleReleased: { _ in }, onChange: {}, + shutdownRuntime: { + started.open() + #expect(await release.waitUntilOpen(timeout: .seconds(5)), "Workspace cleanup was not released") + await runtime.shutdownAll() + } + ) + var teardownPending = false + let coordinator = LanguageIntelligenceModuleCoordinator( + runtime: runtime, store: store, + awaitShutdown: { + if teardownPending { joined.open() } + await session.awaitShutdown() + }, + bind: { store.cache($0, id: .languageIntelligence, moduleID: .languageIntelligence) }, + notify: { Issue.record("\($0)") } + ) + var request: Task? + try await WorkbenchTestScope.withCleanup({ + release.open() + request?.cancel() + _ = try? await request?.value + await session.awaitShutdown() + await runtime.shutdownAll() + session.stopObserving() + }) { _ in + let old = try await coordinator.activate().sessions + teardownPending = true + session.beginShutdown() + try #require(await started.waitUntilOpen()) + // Keep old capabilities cached while cleanup is suspended, as on + // startup. Neither the cache nor the maintenance path may bypass it. + request = Task { @MainActor in + defer { finished.open() } + if maintenance { return try await coordinator.sessionsForMaintenance() } + return try await coordinator.activate().sessions + } + #expect(await joined.waitUntilOpen(), "Language activation bypassed workspace cleanup") + #expect(!finished.isOpen) + #expect(graphs.count == 1) + if cancel { request?.cancel() } + release.open() + let request = try #require(request) + if cancel { + await #expect(throws: CancellationError.self) { try await request.value } + #expect(graphs.count == 1) + } else { + let current = try await request.value + #expect(current !== old) + #expect(graphs.count == 2) + #expect(graphs[0].stopped) + #expect(try #require(graphs.last).stopped == false) + #expect(store.capability(.languageIntelligence, as: LanguageIntelligenceCapability.self)?.sessions === current) + } + } + } +} + +@MainActor +private final class StartupWorkspaceModule: LitheModule { + let manifest: ModuleManifest + init(manifest: ModuleManifest) { self.manifest = manifest } + func activate(context: ModuleContext) async throws {} + func prepareForSleep() async throws {} + func sleep() async {} + func shutdown() async {} + func exportedCapabilities() -> [ModuleCapabilityID: AnyObject] { [:] } +} + +@MainActor +private final class StartupLanguageGraph: LanguageIntelligenceServiceGraph, LanguageToolRuntimePort { + let sessions = LanguageToolingSessionManager() + lazy var tools = LanguageServerToolService( + runtimeService: self, commandRunner: StartupLanguageTools(), settingsStore: StartupLanguageTools() + ) + var stopped = false + var hasActiveLanguageServers: Bool { false } + func activate(context: ModuleContext) {} + func prepareForSleep() async throws {} + func stop() async { stopped = true; sessions.stopAllLanguageServers() } + func executableOnPath(_: String) -> URL? { nil } + func executableURL(at _: String) -> URL? { nil } + func executableCandidates(_: String) -> [RuntimeToolCandidate] { [] } + func languageToolProcessEnvironment(runtimeTools: [String]) -> [String: String] { [:] } + func missingLanguageToolMessage(_ name: String) -> String { name } +} + +private final class StartupLanguageTools: LanguageToolCommandRunning, LanguageToolSettingsStoring, @unchecked Sendable { + func loadLanguageToolExecutablePaths() -> [String: String] { [:] } + func saveLanguageToolExecutablePaths(_: [String: String]) {} + func runLanguageToolCommand(operationID: String, executableURL: URL, arguments: [String], + environment: [String: String], timeoutMilliseconds: Int) -> LanguageToolCommandResult { + LanguageToolCommandResult(output: "", exitCode: 0) + } +} diff --git a/macos/Tests/LitheTests/ModuleSessionCoordinatorTests.swift b/macos/Tests/LitheTests/ModuleSessionCoordinatorTests.swift index d21f55a4b..cc6e59bba 100644 --- a/macos/Tests/LitheTests/ModuleSessionCoordinatorTests.swift +++ b/macos/Tests/LitheTests/ModuleSessionCoordinatorTests.swift @@ -89,13 +89,16 @@ struct ModuleSessionCoordinatorTests { release.open() coordinator.stopObserving() } + #expect(!coordinator.isShuttingDown) coordinator.beginShutdown() coordinator.beginShutdown() + #expect(coordinator.isShuttingDown) #expect(await started.waitUntilOpen()) #expect(shutdowns == 1) release.open() await coordinator.awaitShutdown() + #expect(!coordinator.isShuttingDown) #expect(shutdowns == 1) // A finished shutdown no longer counts as running. diff --git a/macos/Tests/LitheTests/RunConfigurationIntegrationTests.swift b/macos/Tests/LitheTests/RunConfigurationIntegrationTests.swift index b15f176a9..b500259ab 100644 --- a/macos/Tests/LitheTests/RunConfigurationIntegrationTests.swift +++ b/macos/Tests/LitheTests/RunConfigurationIntegrationTests.swift @@ -2475,6 +2475,55 @@ struct RunConfigurationIntegrationTests { #expect(await Self.waitForMainActorCondition { core.destroyedSessionIDs.count == 1 }) } + @Test + func repeatedStartupFailuresStopUntilExplicitRestart() async throws { + let harness = makeLanguageServerHarness() + defer { harness.manager.stopAll() } + for _ in 0..<3 { + let failed = TestGate() + harness.manager.onLanguageServerStateChange = { _, state, _ in + if case .failed = state { failed.open() } + } + try harness.manager.synchronizeLanguageServer(for: harness.source, text: "struct App {}", rootURL: harness.root) + harness.core.enqueueFailure(code: "serverExited", message: "startup failed") + #expect(await failed.waitUntilOpen()) + } + #expect(harness.core.startCalls.count == 3) + for _ in 0..<5 { + #expect(throws: LanguageServerSessionStartError.self) { + try harness.manager.synchronizeLanguageServer(for: harness.source, text: "struct App {}", rootURL: harness.root) + } + } + #expect(harness.core.startCalls.count == 3) + harness.manager.stopLanguageServer(providerID: "swift") + try harness.manager.synchronizeLanguageServer(for: harness.source, text: "struct App {}", rootURL: harness.root) + #expect(harness.core.startCalls.count == 4) + } + + @Test + func pluginSessionPreservesHostIntegrationLaunchResources() throws { + let core = TestLanguageServerRuntimeCore(providerID: "java") + let resources = JDTLSLaunchResources( + launcherJarURL: URL(fileURLWithPath: "/test-plugin/equinox.jar"), + configurationDirectoryURL: URL(fileURLWithPath: "/test-plugin/configuration/arm64"), + lombokAgentURL: URL(fileURLWithPath: "/test-plugin/lombok.jar") + ) + let java = URL(fileURLWithPath: "/test-plugin/runtime/bin/java") + let cache = URL(fileURLWithPath: "/test-cache/language-servers") + let session = StdioLanguageServerSession( + providerID: "java", executableURL: java, arguments: ["-jar", resources.launcherJarURL.path], + environment: [:], hostIntegrationLaunch: .init(runtimeExecutableURL: java, coreLaunch: .jdt(resources)), + cacheDirectoryURL: cache, core: core, pluginID: "test.java-support" + ) + defer { session.stop() } + try session.start(rootURL: URL(fileURLWithPath: "/test-workspace"), workspaceFingerprint: "workspace-v1") + let launch = try #require(core.startCalls.first) + #expect(launch.runtimeExecutableURL == java) + #expect(launch.jdtlsLaunchResources == resources) + #expect(launch.cacheDirectoryURL == cache) + #expect(launch.workspaceFingerprint == "workspace-v1") + } + @Test func virtualDocumentContentProjectsFromRustEvents() async throws { let core = TestLanguageServerRuntimeCore(providerID: "java") diff --git a/shared/platform-feature-matrix/features/lsp-lifecycle.json b/shared/platform-feature-matrix/features/lsp-lifecycle.json index efe80b0ba..5410ef89c 100644 --- a/shared/platform-feature-matrix/features/lsp-lifecycle.json +++ b/shared/platform-feature-matrix/features/lsp-lifecycle.json @@ -11,7 +11,14 @@ "rust/lithe-core/src/lsp/languages/jdt_configuration.rs", "rust/lithe-core/src/lsp/languages/jdt_progress.rs", "shared/fixtures/lsp/jdt-readiness-v1.json", - ".agents/notes/implemented/bug-fix/2026-10-09-jdtls-heap-ceiling-and-duplicate-maven-coordinates.md" + ".agents/notes/implemented/bug-fix/2026-10-09-jdtls-heap-ceiling-and-duplicate-maven-coordinates.md", + "macos/Sources/Lithe/Application/Composition/LanguageIntelligenceModuleCoordinator.swift", + "macos/Sources/Lithe/Application/Composition/JavaLanguageServerPreparationCoordinator.swift", + "macos/Tests/LitheTests/LanguageIntelligenceModuleCoordinatorTests.swift", + "macos/Tests/LitheTests/JavaLanguageServerRuntimeTests.swift", + "macos/Sources/LitheLanguageIntelligenceModule/Runtime/LanguageServerSession.swift", + "macos/Sources/Lithe/Core/Rust/RustLanguageServerRuntimeAdapter.swift", + "macos/Tests/LitheTests/RunConfigurationIntegrationTests.swift" ], "implementationStatus": "implemented", "verificationStatus": "pending" @@ -31,6 +38,6 @@ "verificationStatus": "pending" }, "owner": "Language Tooling", - "verification": "在两端启动真实 JDTLS,验证项目准备、重启、超时、取消和资源清理,并确认典型工作流后已安装程序包(macOS app bundle、Windows 安装目录)的文件清单不变。 验证 Maven 导入连续 45 秒无进度只警告、之后 ServiceReady 可正常就绪,且 10 分钟总期限、显式失败和取消仍有效。 检查 JDT LS 启动参数的最大堆高于 1.5 GB,并在待导入模块超过 50 个、且子模块 Maven 坐标重复的聚合工程中确认工作区准备不再以 serviceReadyFailed 终止整个 Java 服务。", + "verification": "在两端启动真实 JDTLS,验证项目准备、重启、超时、取消和资源清理,并确认典型工作流后已安装程序包(macOS app bundle、Windows 安装目录)的文件清单不变。 验证 Maven 导入连续 45 秒无进度只警告、之后 ServiceReady 可正常就绪,且 10 分钟总期限、显式失败和取消仍有效。 检查 JDT LS 启动参数的最大堆高于 1.5 GB,并在待导入模块超过 50 个、且子模块 Maven 坐标重复的聚合工程中确认工作区准备不再以 serviceReadyFailed 终止整个 Java 服务。 macOS #1524:暂停旧模块图清理后请求普通语言能力、后台 Java 维护及文档激活,确认等待结束后才读取缓存或启动新会话;等待期间取消不得重新激活;匹配 operation 的停止应清除 preparing,旧 operation 的停止不得影响新准备。 macOS #1523:通过插件入口启动 Java,确认宿主集成、Maven/Gradle 与缓存参数不丢失,连续失败最多自动启动三次,显式重启可恢复,且包内文件哈希保持不变。", "notes": "JDT LS 统一以 -Xmx2048m 启动(#1156):打包的 1.61.0 在待导入模块超过 50 个且最大堆不超过 1.5 GB 时会走带缺陷的分批导入,重复 Maven 坐标会让 null 工程进入 IProject.open 并终止整个 Java 服务;上游修复进入下个里程碑前用这条堆上限规避。代价是语言服务 JVM 的堆上限从 1 GB 提到 2 GB,-Xms 仍为 256m。坐标完全相同的模块仍只有第一个成为 Java 工程,其余由 m2e 跳过。" } From d579fe1e7ccc6644f478b419249d56c7997d85b5 Mon Sep 17 00:00:00 2001 From: arkleselect Date: Mon, 26 Oct 2026 23:31:25 -0700 Subject: [PATCH 2/5] test(macos): bound language startup regression task waits --- ...geIntelligenceModuleCoordinatorTests.swift | 57 ++++++++++--------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/macos/Tests/LitheTests/LanguageIntelligenceModuleCoordinatorTests.swift b/macos/Tests/LitheTests/LanguageIntelligenceModuleCoordinatorTests.swift index 72830f2fb..e831222e3 100644 --- a/macos/Tests/LitheTests/LanguageIntelligenceModuleCoordinatorTests.swift +++ b/macos/Tests/LitheTests/LanguageIntelligenceModuleCoordinatorTests.swift @@ -51,34 +51,37 @@ struct LanguageIntelligenceModuleCoordinatorTests { await session.awaitShutdown() await runtime.shutdownAll() session.stopObserving() - }) { _ in - let old = try await coordinator.activate().sessions - teardownPending = true - session.beginShutdown() - try #require(await started.waitUntilOpen()) - // Keep old capabilities cached while cleanup is suspended, as on - // startup. Neither the cache nor the maintenance path may bypass it. - request = Task { @MainActor in - defer { finished.open() } - if maintenance { return try await coordinator.sessionsForMaintenance() } - return try await coordinator.activate().sessions - } - #expect(await joined.waitUntilOpen(), "Language activation bypassed workspace cleanup") - #expect(!finished.isOpen) - #expect(graphs.count == 1) - if cancel { request?.cancel() } - release.open() - let request = try #require(request) - if cancel { - await #expect(throws: CancellationError.self) { try await request.value } + }) { scope in + defer { release.open(); request?.cancel() } + try await scope.run("language activation across workspace teardown") { + let old = try await coordinator.activate().sessions + teardownPending = true + session.beginShutdown() + try #require(await started.waitUntilOpen()) + // Keep old capabilities cached while cleanup is suspended, as on + // startup. Neither the cache nor the maintenance path may bypass it. + request = Task { @MainActor in + defer { finished.open() } + if maintenance { return try await coordinator.sessionsForMaintenance() } + return try await coordinator.activate().sessions + } + #expect(await joined.waitUntilOpen(), "Language activation bypassed workspace cleanup") + #expect(!finished.isOpen) #expect(graphs.count == 1) - } else { - let current = try await request.value - #expect(current !== old) - #expect(graphs.count == 2) - #expect(graphs[0].stopped) - #expect(try #require(graphs.last).stopped == false) - #expect(store.capability(.languageIntelligence, as: LanguageIntelligenceCapability.self)?.sessions === current) + if cancel { request?.cancel() } + release.open() + let request = try #require(request) + if cancel { + await #expect(throws: CancellationError.self) { try await request.value } + #expect(graphs.count == 1) + } else { + let current = try await request.value + #expect(current !== old) + #expect(graphs.count == 2) + #expect(graphs[0].stopped) + #expect(try #require(graphs.last).stopped == false) + #expect(store.capability(.languageIntelligence, as: LanguageIntelligenceCapability.self)?.sessions === current) + } } } } From 09eca0904b1f0617bf8cba58d408e419c6e15603 Mon Sep 17 00:00:00 2001 From: arkleselect Date: Tue, 27 Oct 2026 05:00:18 -0700 Subject: [PATCH 3/5] test(macos): allow disk image creation margin within integration budget --- .../LitheTests/StableRollbackDiskImageIntegrationTests.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/macos/Tests/LitheTests/StableRollbackDiskImageIntegrationTests.swift b/macos/Tests/LitheTests/StableRollbackDiskImageIntegrationTests.swift index 729db7501..813a81410 100644 --- a/macos/Tests/LitheTests/StableRollbackDiskImageIntegrationTests.swift +++ b/macos/Tests/LitheTests/StableRollbackDiskImageIntegrationTests.swift @@ -33,8 +33,10 @@ struct StableRollbackDiskImageIntegrationTests { // signed payload. This avoids a second test-only mount/copy/unmount // cycle; StableRollbackPackage.prepare still exercises the production // hdiutil mount and validates the complete disk-image contract. + // CI reached 98% before the 20s creation deadline; allow margin while + // reserving 15s of the isolated 45s test budget for mount and validation. try await runFixtureTool("/usr/sbin/diskutil", ["image", "create", "from", "--format", "UDRW", - root.appendingPathComponent("payload").path, dmg.path], timeoutMilliseconds: 20_000) + root.appendingPathComponent("payload").path, dmg.path], timeoutMilliseconds: 30_000) let archiveData = try Data(contentsOf: dmg) let checksum = SHA256.hash(data: archiveData).map { String(format: "%02x", $0) }.joined() let publisher = try Curve25519.Signing.PrivateKey(rawRepresentation: Data(repeating: 1, count: 32)) From 04ff2fe7b7650e72f1334a6f0cf654dae79532ef Mon Sep 17 00:00:00 2001 From: arkleselect Date: Tue, 27 Oct 2026 07:33:25 -0700 Subject: [PATCH 4/5] fix(macos): revoke deferred language activation when project session closes --- ...module-runtime-boundaries-and-lifecycle.md | 1 + ...anguageIntelligenceModuleCoordinator.swift | 15 +- .../AppModel/AppModel+RunConfiguration.swift | 2 +- .../Lithe/Models/AppModel/AppModel.swift | 7 +- ...AppModelLanguageSessionShutdownTests.swift | 129 ++++++++++++++++++ .../features/lsp-lifecycle.json | 5 +- 6 files changed, 150 insertions(+), 9 deletions(-) create mode 100644 macos/Tests/LitheTests/AppModelLanguageSessionShutdownTests.swift diff --git a/.agents/notes/implemented/architecture/2026-09-13-module-runtime-boundaries-and-lifecycle.md b/.agents/notes/implemented/architecture/2026-09-13-module-runtime-boundaries-and-lifecycle.md index fbf51f583..d0bacb4f6 100644 --- a/.agents/notes/implemented/architecture/2026-09-13-module-runtime-boundaries-and-lifecycle.md +++ b/.agents/notes/implemented/architecture/2026-09-13-module-runtime-boundaries-and-lifecycle.md @@ -103,6 +103,7 @@ macOS 打开项目时会异步清理上一轮模块图;清理结束前,语 `LanguageIntelligenceModuleCoordinator` 与执行、调试协调器共用 `awaitModuleRuntimeShutdown()`:先等待整轮清理,再检查调用方取消状态,最后读取能力缓存或激活模块。 后台维护入口也必须经过这个顺序,不能提前捕获 session 然后在等待后返回旧对象。 +最终关闭项目会话时,`shutdownProjectSession()` 在首次挂起前标记会话已关闭,并使工作区身份失效;Settings 即使继续持有工作区 URL 和文档,延后启动也不得恢复。语言协调器等待清理后再次检查关闭状态并以取消结束,覆盖能力激活和测试扩展入口。不能用窗口是否前台作为关闭标记,因为后台项目仍可合法运行语言服务。 同步文档入口在清理期间延后启动,恢复时重新检查工作区身份和文档是否仍打开;等待不会阻塞界面线程。 Java 的准备状态是应用操作的投影。当前 operation ID 对应的 `.stopped` 到达后, diff --git a/macos/Sources/Lithe/Application/Composition/LanguageIntelligenceModuleCoordinator.swift b/macos/Sources/Lithe/Application/Composition/LanguageIntelligenceModuleCoordinator.swift index d3b1e1b38..22f82b7b4 100644 --- a/macos/Sources/Lithe/Application/Composition/LanguageIntelligenceModuleCoordinator.swift +++ b/macos/Sources/Lithe/Application/Composition/LanguageIntelligenceModuleCoordinator.swift @@ -9,14 +9,14 @@ import LitheModuleAPI final class LanguageIntelligenceModuleCoordinator { private let runtime: ModuleRuntime private let store: ModuleCapabilityStore - private let awaitShutdown: () async -> Void + private let awaitShutdown: () async throws -> Void private let bind: (LanguageIntelligenceCapability) -> Void private let notify: @MainActor (String) -> Void init( runtime: ModuleRuntime, store: ModuleCapabilityStore, - awaitShutdown: @escaping () async -> Void, + awaitShutdown: @escaping () async throws -> Void, bind: @escaping (LanguageIntelligenceCapability) -> Void, notify: @escaping @MainActor (String) -> Void ) { @@ -29,7 +29,7 @@ final class LanguageIntelligenceModuleCoordinator { func activate() async throws -> LanguageIntelligenceCapability { // A cached capability can still belong to the graph being torn down. - await awaitShutdown() + try await awaitShutdown() try Task.checkCancellation() if let cached: LanguageIntelligenceCapability = store.capability(.languageIntelligence) { return cached @@ -77,8 +77,13 @@ final class LanguageIntelligenceModuleCoordinator { testService: LanguageTestService, supports: @MainActor ([URL]) -> [LanguageSupportDeclaration] ) async -> Bool { - await awaitShutdown() - guard !Task.isCancelled else { return false } + do { + try await awaitShutdown() + try Task.checkCancellation() + } catch { + if !error.isCancellation { notify(error.localizedDescription) } + return false + } for support in supports(files) where support.testingModuleID != nil { do { let value = try await runtime.activateCapability( diff --git a/macos/Sources/Lithe/Models/AppModel/AppModel+RunConfiguration.swift b/macos/Sources/Lithe/Models/AppModel/AppModel+RunConfiguration.swift index 37f91d78a..f1d7854a7 100644 --- a/macos/Sources/Lithe/Models/AppModel/AppModel+RunConfiguration.swift +++ b/macos/Sources/Lithe/Models/AppModel/AppModel+RunConfiguration.swift @@ -165,7 +165,7 @@ extension AppModel { } var currentWorkspaceIdentity: WorkspaceIdentity? { - guard let url = workspaceURL?.standardizedFileURL else { return nil } + guard !isProjectSessionClosed, let url = workspaceURL?.standardizedFileURL else { return nil } return WorkspaceIdentity(url: url, generation: workspaceFeature.workspaceGeneration) } diff --git a/macos/Sources/Lithe/Models/AppModel/AppModel.swift b/macos/Sources/Lithe/Models/AppModel/AppModel.swift index c0adaf1d3..50eacdf94 100644 --- a/macos/Sources/Lithe/Models/AppModel/AppModel.swift +++ b/macos/Sources/Lithe/Models/AppModel/AppModel.swift @@ -148,6 +148,7 @@ final class AppModel: ObservableObject, Identifiable, UnsavedDocumentHandling { private var documentLanguageCoordinator: DocumentLanguageCoordinator? private var sidebarRefreshTask: Task? private var moduleSessionCoordinator: ModuleSessionCoordinator? + private(set) var isProjectSessionClosed = false private var featureObservationBinder: AppModelObservationBinder? private var fileVisibilityRulesObserverID: UUID? private var searchExclusionsObservation: AnyCancellable? @@ -227,7 +228,10 @@ final class AppModel: ObservableObject, Identifiable, UnsavedDocumentHandling { lazy var languageIntelligenceModuleCoordinator = LanguageIntelligenceModuleCoordinator( runtime: services.moduleRuntime, store: moduleCapabilityStore, - awaitShutdown: { [weak self] in await self?.awaitModuleRuntimeShutdown() }, + awaitShutdown: { [weak self] in + await self?.awaitModuleRuntimeShutdown() + guard self?.isProjectSessionClosed == false else { throw CancellationError() } + }, bind: { [weak self] in self?.bindLanguageIntelligenceCapability($0) }, notify: { [weak self] in self?.showNotification($0) } ) @@ -692,6 +696,7 @@ final class AppModel: ObservableObject, Identifiable, UnsavedDocumentHandling { } func shutdownProjectSession() async { + isProjectSessionClosed = true // Native window close can retain this model through Settings without // closing its workspace. Revoke page requests before teardown can yield. services.pluginWebPages.closeAll() diff --git a/macos/Tests/LitheTests/AppModelLanguageSessionShutdownTests.swift b/macos/Tests/LitheTests/AppModelLanguageSessionShutdownTests.swift new file mode 100644 index 000000000..4de7e7732 --- /dev/null +++ b/macos/Tests/LitheTests/AppModelLanguageSessionShutdownTests.swift @@ -0,0 +1,129 @@ +import Foundation +import LitheApplicationKernel +import LitheCoreContracts +import LitheLanguageIntelligenceModule +import LitheModuleAPI +import Testing +@testable import Lithe + +@MainActor +struct AppModelLanguageSessionShutdownTests { + @Test + func closingSessionRevokesLanguageActivationWaitingForWorkspaceCleanup() async throws { + let root = FileManager.default.temporaryDirectory.appendingPathComponent("language-close-\(UUID().uuidString)") + try FileManager.default.createDirectory(at: root, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(at: root) } + let file = root.appendingPathComponent("Main.startup") + try "test".write(to: file, atomically: true, encoding: .utf8) + let store = ShutdownTestStore() + let settings = AppSettings(store: store) + let processes = ManagedProcessRegistry() + let container = MacServiceContainer(store: store, settings: settings, processRegistry: processes) + defer { container.moduleLifecycleCoordinator.stop() } + let base = container.services + let runtime = base.moduleRuntime + let started = TestGate(), release = TestGate(), queued = TestGate() + let blocker = ShutdownGateModule(started: started, release: release) + try runtime.register(ModuleFactory(manifest: blocker.manifest) { blocker }) + let model = AppModel(settings: settings, services: services(base)) + var closing: Task? + var activation: Task? + try await WorkbenchTestScope.withCleanup({ + release.open() + activation?.cancel() + if let closing { await closing.value } + _ = try? await activation?.value + await model.shutdownProjectSession() + }) { scope in + defer { release.open(); activation?.cancel() } + try await scope.run("prepare workspace cleanup") { + _ = try await runtime.activate(blocker.manifest.id) + model.openProjectDirectly(root) + try #require(await started.waitUntilOpen()) + await model.documentFeature.openFileAsync(file, isReadOnly: false, displayPath: nil, activateWhenReady: true) + } + let document = try #require(model.openDocuments.first { $0.url == file }) + let identity = try #require(model.currentWorkspaceIdentity) + model.setProjectSessionActive(false) + #expect(model.isCurrentWorkspace(identity), "A background project is still a live session") + #expect(!model.activateLanguageServerIfAvailable(for: document)) + activation = Task { @MainActor in + queued.open() + return try await model.languageIntelligenceModuleCoordinator.activate() + } + try #require(await queued.waitUntilOpen()) + closing = Task { @MainActor in await model.shutdownProjectSession() } + // Observe the actual close entry, not task scheduling. The model is + // intentionally retained with its workspace and document, as in Settings. + let clock = ContinuousClock(), deadline = ContinuousClock.now.advanced(by: .seconds(2)) + while !model.isProjectSessionClosed && clock.now < deadline { await Task.yield() } + try #require(model.isProjectSessionClosed) + #expect(!model.isCurrentWorkspace(identity)) + #expect(model.workspaceURL?.path == root.path) + #expect(model.openDocuments.contains { $0 === document }) + release.open() + try await scope.run("finish closing and pending language activation") { + await closing?.value + let activation = try #require(activation) + await #expect(throws: CancellationError.self) { try await activation.value } + #expect(!model.activateLanguageServerIfAvailable(for: document)) + #expect(runtime.capability(.languageIntelligence) == nil) + #expect(model.languageToolingSessionsIfActive == nil) + #expect(processes.processIDs(for: ManagedProcessCategory.languageServer).isEmpty) + } + } + } + + private func services(_ base: AppServices) -> AppServices { + AppServices(moduleRuntime: base.moduleRuntime, pluginManager: base.pluginManager, + pluginMarketplace: base.pluginMarketplace, pluginCatalog: base.pluginCatalog, + languageProviderCatalogSource: ShutdownTestCatalog(), + workspaceLanguageServerPreferences: base.workspaceLanguageServerPreferences, + javaTestResultServerFactory: { MacJavaTestResultServer() }, + workspaceOperations: base.workspaceOperations, documentLifecycleDecider: base.documentLifecycleDecider, + lineEditing: base.lineEditing, javaMavenOperations: base.javaMavenOperations, + markdownRenderer: base.markdownRenderer, markdownImageImporter: base.markdownImageImporter, + store: base.store, fileStorage: base.fileStorage, fileOperations: base.fileOperations, + binaryFileViewerRegistry: base.binaryFileViewerRegistry, projectRuntimeService: base.projectRuntimeService, + gitWatchContextProvider: base.gitWatchContextProvider, githubService: base.githubService, + secureStore: base.secureStore, diagnosticsExportService: base.diagnosticsExportService, + credentialResolver: base.credentialResolver, aiConfigurationSources: [], + recentProjectsStore: base.recentProjectsStore, workspaceSessionStore: base.workspaceSessionStore, + directoryMarkStore: base.directoryMarkStore, workbenchLayoutStore: base.workbenchLayoutStore, + workbenchBackgroundPlatform: base.workbenchBackgroundPlatform, directoryWatcherFactory: base.directoryWatcherFactory, + platformUI: base.platformUI, shortcutDetectorFactory: base.shortcutDetectorFactory) + } +} + +@MainActor +private final class ShutdownGateModule: LitheModule { + let manifest = ModuleManifest(id: ModuleID("zz.test-language-close"), displayName: "Test close gate", scope: .workspace) + let started: TestGate, release: TestGate + init(started: TestGate, release: TestGate) { self.started = started; self.release = release } + func activate(context: ModuleContext) async throws {} + func prepareForSleep() async throws {} + func sleep() async {} + func shutdown() async { + started.open() + #expect(await release.waitUntilOpen(timeout: .seconds(5)), "Workspace shutdown gate was not released") + } + func exportedCapabilities() -> [ModuleCapabilityID: AnyObject] { [:] } +} + +private struct ShutdownTestCatalog: LanguageProviderCatalogSource { + func load(workspaceURL: URL?) -> LanguageProviderCatalogSnapshot { + .init(catalog: LanguageProviderCatalog(descriptors: [ + LanguageProviderDescriptor(id: "test-startup", displayName: "Test startup", fileExtensions: ["startup"], + capabilities: [.languageServer], activationPolicy: .onDemand) + ]), schemaVersion: nil, origin: .builtin, issues: []) + } +} + +private final class ShutdownTestStore: KeyValueStore { + var values: [String: Any] = [:] + func data(forKey key: String) -> Data? { values[key] as? Data } + func object(forKey key: String) -> Any? { values[key] } + func string(forKey key: String) -> String? { values[key] as? String } + func stringArray(forKey key: String) -> [String]? { values[key] as? [String] } + func set(_ value: Any?, forKey key: String) { values[key] = value } +} diff --git a/shared/platform-feature-matrix/features/lsp-lifecycle.json b/shared/platform-feature-matrix/features/lsp-lifecycle.json index 5410ef89c..74d80bbfd 100644 --- a/shared/platform-feature-matrix/features/lsp-lifecycle.json +++ b/shared/platform-feature-matrix/features/lsp-lifecycle.json @@ -18,7 +18,8 @@ "macos/Tests/LitheTests/JavaLanguageServerRuntimeTests.swift", "macos/Sources/LitheLanguageIntelligenceModule/Runtime/LanguageServerSession.swift", "macos/Sources/Lithe/Core/Rust/RustLanguageServerRuntimeAdapter.swift", - "macos/Tests/LitheTests/RunConfigurationIntegrationTests.swift" + "macos/Tests/LitheTests/RunConfigurationIntegrationTests.swift", + "macos/Tests/LitheTests/AppModelLanguageSessionShutdownTests.swift" ], "implementationStatus": "implemented", "verificationStatus": "pending" @@ -38,6 +39,6 @@ "verificationStatus": "pending" }, "owner": "Language Tooling", - "verification": "在两端启动真实 JDTLS,验证项目准备、重启、超时、取消和资源清理,并确认典型工作流后已安装程序包(macOS app bundle、Windows 安装目录)的文件清单不变。 验证 Maven 导入连续 45 秒无进度只警告、之后 ServiceReady 可正常就绪,且 10 分钟总期限、显式失败和取消仍有效。 检查 JDT LS 启动参数的最大堆高于 1.5 GB,并在待导入模块超过 50 个、且子模块 Maven 坐标重复的聚合工程中确认工作区准备不再以 serviceReadyFailed 终止整个 Java 服务。 macOS #1524:暂停旧模块图清理后请求普通语言能力、后台 Java 维护及文档激活,确认等待结束后才读取缓存或启动新会话;等待期间取消不得重新激活;匹配 operation 的停止应清除 preparing,旧 operation 的停止不得影响新准备。 macOS #1523:通过插件入口启动 Java,确认宿主集成、Maven/Gradle 与缓存参数不丢失,连续失败最多自动启动三次,显式重启可恢复,且包内文件哈希保持不变。", + "verification": "在两端启动真实 JDTLS,验证项目准备、重启、超时、取消和资源清理,并确认典型工作流后已安装程序包(macOS app bundle、Windows 安装目录)的文件清单不变。 验证 Maven 导入连续 45 秒无进度只警告、之后 ServiceReady 可正常就绪,且 10 分钟总期限、显式失败和取消仍有效。 检查 JDT LS 启动参数的最大堆高于 1.5 GB,并在待导入模块超过 50 个、且子模块 Maven 坐标重复的聚合工程中确认工作区准备不再以 serviceReadyFailed 终止整个 Java 服务。 macOS #1524:暂停旧模块图清理后请求普通语言能力、后台 Java 维护及文档激活,确认等待结束后才读取缓存或启动新会话;等待期间取消不得重新激活;匹配 operation 的停止应清除 preparing,旧 operation 的停止不得影响新准备。 macOS #1523:通过插件入口启动 Java,确认宿主集成、Maven/Gradle 与缓存参数不丢失,连续失败最多自动启动三次,显式重启可恢复,且包内文件哈希保持不变。 macOS 最终关闭场景:暂停旧模块清理、排队文档和维护激活、关闭项目会话、释放清理;即使 AppModel 保留工作区 URL 与打开文档,也不能重新发布语言能力或启动 LSP。", "notes": "JDT LS 统一以 -Xmx2048m 启动(#1156):打包的 1.61.0 在待导入模块超过 50 个且最大堆不超过 1.5 GB 时会走带缺陷的分批导入,重复 Maven 坐标会让 null 工程进入 IProject.open 并终止整个 Java 服务;上游修复进入下个里程碑前用这条堆上限规避。代价是语言服务 JVM 的堆上限从 1 GB 提到 2 GB,-Xms 仍为 256m。坐标完全相同的模块仍只有第一个成为 Java 工程,其余由 m2e 跳过。" } From df626c3fd6a13d45a355ef330f5ecfa1611c352d Mon Sep 17 00:00:00 2001 From: arkleselect Date: Tue, 27 Oct 2026 08:33:18 -0700 Subject: [PATCH 5/5] test(macos): cover production language launch and navigation evidence --- ...a-language-server-as-declarative-plugin.md | 2 + .../get-order-definition.png | Bin 0 -> 113082 bytes .../java-startup-navigation/java-ready.png | Bin 0 -> 134341 bytes .../RustLanguageServerLaunchTests.swift | 157 ++++++++++++++++++ .../features/lsp-lifecycle.json | 7 +- 5 files changed, 164 insertions(+), 2 deletions(-) create mode 100644 docs/assets/java-startup-navigation/get-order-definition.png create mode 100644 docs/assets/java-startup-navigation/java-ready.png create mode 100644 macos/Tests/LitheTests/RustLanguageServerLaunchTests.swift diff --git a/.agents/notes/implemented/architecture/2026-10-13-java-language-server-as-declarative-plugin.md b/.agents/notes/implemented/architecture/2026-10-13-java-language-server-as-declarative-plugin.md index e178ddbd4..070cbfb6c 100644 --- a/.agents/notes/implemented/architecture/2026-10-13-java-language-server-as-declarative-plugin.md +++ b/.agents/notes/implemented/architecture/2026-10-13-java-language-server-as-declarative-plugin.md @@ -186,6 +186,8 @@ dev.lithe.plugin.java-support/ - `./scripts/verify-macos-package.sh`:打出的应用里 Java Support 的文件齐全,且不存在 `Contents/Resources/LanguageServers`。 - `./scripts/verify-runtime-bundle-immutability.sh`:启动与插件工作流不改写安装目录。 +生产启动适配的回归使用 `RustLanguageServerLaunchTests`,直接从 `RustCoreBridge.startPluginLanguageServer` 经 C ABI 启动本地标准输入输出协议夹具;不经过协议默认回退。它用函数所属插件校验、credentials 请求与响应、通用插件配置查询、Java 启动参数、缓存配置副本和工作区指纹日志验证实际接线。夹具使用 macOS 开发工具已有的 Python,不依赖真实 JVM 或联网;Core 会话负责子进程,测试始终停止并销毁会话,再移除临时资源。运行命令:`./.agents/skills/write-stable-tests/scripts/test-stability-macos.sh -- --filter RustLanguageServerLaunchTests`。 + ## 适用范围 - `shared/contracts/plugins/v1/` diff --git a/docs/assets/java-startup-navigation/get-order-definition.png b/docs/assets/java-startup-navigation/get-order-definition.png new file mode 100644 index 0000000000000000000000000000000000000000..569dbc12f8cafaed67baa4ed67e3d35f329d6406 GIT binary patch literal 113082 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 z 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 literal 0 HcmV?d00001 diff --git a/docs/assets/java-startup-navigation/java-ready.png b/docs/assets/java-startup-navigation/java-ready.png new file mode 100644 index 0000000000000000000000000000000000000000..79a6f864978658a0083e1ad6629ef604b08744f9 GIT binary patch literal 134341 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Ⓢ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 H{nEby)ilpA literal 0 HcmV?d00001 diff --git a/macos/Tests/LitheTests/RustLanguageServerLaunchTests.swift b/macos/Tests/LitheTests/RustLanguageServerLaunchTests.swift new file mode 100644 index 000000000..31d6be95e --- /dev/null +++ b/macos/Tests/LitheTests/RustLanguageServerLaunchTests.swift @@ -0,0 +1,157 @@ +import Foundation +import LitheCoreContracts +import Testing +@testable import Lithe + +@MainActor +struct RustLanguageServerLaunchTests { + @Test(arguments: [false, true]) + func startupMapsIdentityConfigurationServicesAndJdtContextThroughCore(useJdt: Bool) async throws { + let root = FileManager.default.temporaryDirectory.appendingPathComponent("plugin-core-launch-\(UUID().uuidString)") + let installed = root.appendingPathComponent("installed") + let configuration = installed.appendingPathComponent("config_arm64") + let cache = root.appendingPathComponent("cache") + try FileManager.default.createDirectory(at: configuration, withIntermediateDirectories: true) + defer { try? FileManager.default.removeItem(at: root) } + let configText = "osgi.bundles.defaultStartLevel=4\n" + try configText.write(to: configuration.appendingPathComponent("config.ini"), atomically: true, encoding: .utf8) + let executable = root.appendingPathComponent("runtime.py") + try Self.server.write(to: executable, atomically: true, encoding: .utf8) + try FileManager.default.setAttributes([.posixPermissions: 0o755], ofItemAtPath: executable.path) + let launcher = installed.appendingPathComponent("plugins/equinox.jar") + let lombok = installed.appendingPathComponent("lombok.jar") + let extensionJar = installed.appendingPathComponent("extension.jar") + let core = RustCoreBridge() + let plugin = "dev.lithe.fixture.launch" + let started = try core.startPluginLanguageServer( + pluginID: plugin, providerID: useJdt ? "java" : "test-plugin", + executableURL: useJdt ? root.appendingPathComponent("must-not-be-launched") : executable, + arguments: useJdt ? ["-jar", launcher.path] : [], environment: [:], rootURL: root, + initializationOptions: .object(["fixtureOption": .string("preserved")]), + workspaceConfiguration: .object(["fixture": .object(["value": .string("configured")])]), + hostServices: ["credentials"], + hostIntegrationLaunch: useJdt ? .init(runtimeExecutableURL: executable, coreLaunch: .jdt(.init( + launcherJarURL: launcher, configurationDirectoryURL: configuration, lombokAgentURL: lombok, + javaExtensionBundleURLs: [extensionJar]))) : nil, + cacheDirectoryURL: cache, workspaceFingerprint: "workspace-v1", mavenContext: nil, javaGradle: nil, + initializeTimeout: 5, requestTimeout: 5, shutdownTimeout: 0.1 + ).get() + defer { core.stopLanguageServer(sessionID: started.sessionID); core.destroyLanguageServer(sessionID: started.sessionID) } + var ready = false, hostRequest = false, fingerprintObserved = false + let deadline = ContinuousClock.now.advanced(by: .seconds(5)) + // Core exposes a poll boundary; observe real process replies under a + // monotonic deadline rather than guessing when the backend has started. + while ContinuousClock.now < deadline { + for event in core.pollLanguageServerEvents(sessionID: started.sessionID) { + if event.type == "stateChanged", event.state == "ready" { ready = true } + if event.message == "Java language service process started", let detail = event.detail?.data(using: .utf8), + let fields = try? JSONSerialization.jsonObject(with: detail) as? [String: Any] { + fingerprintObserved = fields["workspaceFingerprintPresent"] as? Bool == true + } + if event.type == "hostRequest" { + guard case .object(let value)? = event.result else { + Issue.record("Host request was not an object") + continue + } + #expect(value["service"] == .string("credentials")) + #expect(event.method == "lithe/host/credentials/get") + guard case .string(let id)? = value["hostRequestID"] else { + Issue.record("Host request had no ID") + continue + } + try core.respondToPluginHostRequest(sessionID: started.sessionID, hostRequestID: id, + outcome: .success(.object(["value": .string("fixture-only")]))).get() + hostRequest = true + } + } + if ready && hostRequest && read("configuration", root) != nil && read("credential", root) != nil { break } + await Task.yield() + } + try #require(ready && hostRequest, "Backend did not reach ready and receive the granted service") + let arguments = try #require(read("argv", root) as? [String]) + if useJdt { + #expect(fingerprintObserved) + #expect(arguments.contains("-javaagent:" + lombok.path)) + #expect(arguments.contains(launcher.path)) + let configIndex = try #require(arguments.firstIndex(of: "-configuration")) + let writable = URL(fileURLWithPath: arguments[configIndex + 1]) + #expect(writable.path.hasPrefix(cache.path + "/jdtls-configuration/")) + #expect(try String(contentsOf: writable.appendingPathComponent("config.ini"), encoding: .utf8) == configText) + let dataIndex = try #require(arguments.firstIndex(of: "-data")) + #expect(arguments[dataIndex + 1].hasPrefix(cache.path + "/jdtls/")) + } + let initialize = try #require(read("initialize", root) as? [String: Any]) + let params = try #require(initialize["params"] as? [String: Any]) + let options = try #require(params["initializationOptions"] as? [String: Any]) + #expect(options["fixtureOption"] as? String == "preserved") + if useJdt { #expect((options["bundles"] as? [String])?.contains(extensionJar.path) == true) } + let configured = try #require(read("configuration", root) as? [String: Any]) + if useJdt { + // JDT owns workspace/configuration sections; an unrelated section + // returns null. Generic plugins read the forwarded plugin config. + #expect((configured["result"] as? [Any])?.first is NSNull) + } else { + #expect(((configured["result"] as? [[String: String]])?.first)?["value"] == "configured") + } + let credential = try #require(read("credential", root) as? [String: Any]) + #expect((credential["result"] as? [String: String])?["value"] == "fixture-only") + // A function call with the exact plugin owner must be accepted, while + // another plugin cannot use the same backend's negotiated function. + _ = try core.lspFunctionRequest(sessionID: started.sessionID, pluginID: plugin, + functionID: "snapshot.refresh", params: .object([:]), timeout: 1).get() + if case .success = core.lspFunctionRequest(sessionID: started.sessionID, pluginID: "dev.lithe.other", + functionID: "snapshot.refresh", params: .object([:]), timeout: 1) { + Issue.record("Core accepted another plugin's function request") + } + #expect(try String(contentsOf: configuration.appendingPathComponent("config.ini"), encoding: .utf8) == configText) + #expect(try FileManager.default.contentsOfDirectory(atPath: configuration.path) == ["config.ini"]) + } + + private func read(_ name: String, _ root: URL) -> Any? { + guard let data = try? Data(contentsOf: root.appendingPathComponent(name + ".json")) else { return nil } + return try? JSONSerialization.jsonObject(with: data) + } + + // macOS developer tools already provide Python; this explicit integration + // fixture speaks framed JSON-RPC and accepts the JVM argv without a JDK. + private static let server = #""" +#!/usr/bin/python3 +import json, pathlib, sys +root = pathlib.Path(__file__).parent + +def record(name, value): + tmp = root / (name + '.tmp') + tmp.write_text(json.dumps(value)) + tmp.replace(root / (name + '.json')) + +def send(value): + body = json.dumps(value).encode() + sys.stdout.buffer.write(('Content-Length: %d\r\n\r\n' % len(body)).encode() + body) + sys.stdout.buffer.flush() + +record('argv', sys.argv[1:]) +while True: + headers = {} + while True: + line = sys.stdin.buffer.readline() + if not line: sys.exit(0) + if line == b'\r\n': break + key, value = line.decode().split(':', 1) + headers[key.lower()] = value.strip() + message = json.loads(sys.stdin.buffer.read(int(headers['content-length']))) + method = message.get('method') + if method == 'initialize': + record('initialize', message) + send({'jsonrpc':'2.0','id':message['id'],'result':{'capabilities':{'experimental':{'litheFunctions':{'version':2,'functions':[{'id':'snapshot.refresh'}]}}}}}) + elif method == 'initialized': + send({'jsonrpc':'2.0','method':'language/status','params':{'type':'ServiceReady'}}) + send({'jsonrpc':'2.0','id':'configuration','method':'workspace/configuration','params':{'items':[{'section':'fixture'}]}}) + send({'jsonrpc':'2.0','id':'credential','method':'lithe/host/credentials/get','params':{'key':'fixture'}}) + elif method == 'exit': + break + elif method and 'id' in message: + send({'jsonrpc':'2.0','id':message['id'],'result':None}) + elif message.get('id') in ('configuration','credential'): + record(message['id'], message) +"""# +} diff --git a/shared/platform-feature-matrix/features/lsp-lifecycle.json b/shared/platform-feature-matrix/features/lsp-lifecycle.json index 74d80bbfd..9a456644b 100644 --- a/shared/platform-feature-matrix/features/lsp-lifecycle.json +++ b/shared/platform-feature-matrix/features/lsp-lifecycle.json @@ -19,7 +19,10 @@ "macos/Sources/LitheLanguageIntelligenceModule/Runtime/LanguageServerSession.swift", "macos/Sources/Lithe/Core/Rust/RustLanguageServerRuntimeAdapter.swift", "macos/Tests/LitheTests/RunConfigurationIntegrationTests.swift", - "macos/Tests/LitheTests/AppModelLanguageSessionShutdownTests.swift" + "macos/Tests/LitheTests/AppModelLanguageSessionShutdownTests.swift", + "macos/Tests/LitheTests/RustLanguageServerLaunchTests.swift", + "docs/assets/java-startup-navigation/java-ready.png", + "docs/assets/java-startup-navigation/get-order-definition.png" ], "implementationStatus": "implemented", "verificationStatus": "pending" @@ -39,6 +42,6 @@ "verificationStatus": "pending" }, "owner": "Language Tooling", - "verification": "在两端启动真实 JDTLS,验证项目准备、重启、超时、取消和资源清理,并确认典型工作流后已安装程序包(macOS app bundle、Windows 安装目录)的文件清单不变。 验证 Maven 导入连续 45 秒无进度只警告、之后 ServiceReady 可正常就绪,且 10 分钟总期限、显式失败和取消仍有效。 检查 JDT LS 启动参数的最大堆高于 1.5 GB,并在待导入模块超过 50 个、且子模块 Maven 坐标重复的聚合工程中确认工作区准备不再以 serviceReadyFailed 终止整个 Java 服务。 macOS #1524:暂停旧模块图清理后请求普通语言能力、后台 Java 维护及文档激活,确认等待结束后才读取缓存或启动新会话;等待期间取消不得重新激活;匹配 operation 的停止应清除 preparing,旧 operation 的停止不得影响新准备。 macOS #1523:通过插件入口启动 Java,确认宿主集成、Maven/Gradle 与缓存参数不丢失,连续失败最多自动启动三次,显式重启可恢复,且包内文件哈希保持不变。 macOS 最终关闭场景:暂停旧模块清理、排队文档和维护激活、关闭项目会话、释放清理;即使 AppModel 保留工作区 URL 与打开文档,也不能重新发布语言能力或启动 LSP。", + "verification": "在两端启动真实 JDTLS,验证项目准备、重启、超时、取消和资源清理,并确认典型工作流后已安装程序包(macOS app bundle、Windows 安装目录)的文件清单不变。 验证 Maven 导入连续 45 秒无进度只警告、之后 ServiceReady 可正常就绪,且 10 分钟总期限、显式失败和取消仍有效。 检查 JDT LS 启动参数的最大堆高于 1.5 GB,并在待导入模块超过 50 个、且子模块 Maven 坐标重复的聚合工程中确认工作区准备不再以 serviceReadyFailed 终止整个 Java 服务。 macOS #1524:暂停旧模块图清理后请求普通语言能力、后台 Java 维护及文档激活,确认等待结束后才读取缓存或启动新会话;等待期间取消不得重新激活;匹配 operation 的停止应清除 preparing,旧 operation 的停止不得影响新准备。 macOS #1523:通过插件入口启动 Java,确认宿主集成、Maven/Gradle 与缓存参数不丢失,连续失败最多自动启动三次,显式重启可恢复,且包内文件哈希保持不变。 macOS 最终关闭场景:暂停旧模块清理、排队文档和维护激活、关闭项目会话、释放清理;即使 AppModel 保留工作区 URL 与打开文档,也不能重新发布语言能力或启动 LSP。 macOS 生产 RustCoreBridge 与本地协议进程验证插件身份、host services、配置值和 JDT 缓存启动上下文;修复后的 Java ready 与 getOrder 定义导航截图见 evidence。", "notes": "JDT LS 统一以 -Xmx2048m 启动(#1156):打包的 1.61.0 在待导入模块超过 50 个且最大堆不超过 1.5 GB 时会走带缺陷的分批导入,重复 Maven 坐标会让 null 工程进入 IProject.open 并终止整个 Java 服务;上游修复进入下个里程碑前用这条堆上限规避。代价是语言服务 JVM 的堆上限从 1 GB 提到 2 GB,-Xms 仍为 256m。坐标完全相同的模块仍只有第一个成为 Java 工程,其余由 m2e 跳过。" }