webloom-framework 0.2.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/contracts/lifecycle.ts","../src/contracts/messageBus.ts","../src/contracts/resource.ts","../src/host/capabilityRegistry.ts","../src/host/pluginGraph.ts","../src/messaging/messageBus.ts","../src/lifecycle/resourceScope.ts","../src/lifecycle/scopedMessageBus.ts","../src/lifecycle/permissionLease.ts","../src/lifecycle/taskScheduler.ts","../src/resources/resourceRegistry.ts","../src/resources/resourceStore.ts","../src/host/createPluginHost.ts","../src/host/runtimeUnitImplementationRegistry.ts","../src/runtime/runtimeTypes.ts","../src/runtime/runtimeProtocol.ts","../src/transport/serviceBridge.ts","../src/transport/messagePortServiceTransport.ts","../src/runtime/connectSharedWorker.ts","../src/lifecycle/pluginIntentController.ts"],"names":["errorMessage","unique","options","result","entry","controller","error","desired","missing","unavailable","isRecord","isRuntimeKind","mergeSignals","ensureTimeout","addMessageListener"],"mappings":"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","file":"chunk-76BGPI6M.js","sourcesContent":["// 生命周期、权限租约、服务桥与升级门禁契约。\n//\n// 这里仅放跨执行环境共享的类型和稳定错误码,不暴露具体平台实现。\n\n/** 运行实例的作用域类型;名称由宿主定义,WebLoom 只比较和调度。 */\nexport type LifecycleScopeKind = string;\n\n/** 作用域状态;stopping 表示已撤权但异步收尾还未结束。 */\nexport type LifecycleScopeState = \"active\" | \"stopping\" | \"stopped\";\n\n/** 浏览器中由 WebLoom 管理的真实 JavaScript 运行空间。 */\nexport type RuntimeKind = \"window-main\" | \"shared-worker\";\n\n/** 权限动作名称;权限集合和最终 I/O allowlist 由宿主定义。 */\nexport type PluginPermission = string;\n\n/** 一个运行作用域的身份绑定;敏感句柄必须带上这些字段。 */\nexport interface LifecycleScopeIdentity<\n TAttributes extends Readonly<Record<string, unknown>> = Readonly<Record<string, unknown>>,\n> {\n /** 作用域唯一标识;每次重建都必须不同。 */\n scopeId: string;\n /** 运行实例唯一标识;A -> B -> A 也不能复用旧实例。 */\n instanceId: string;\n /** 作用域类型;只作为宿主提供的稳定标签。 */\n kind: LifecycleScopeKind;\n /** 父作用域标识;跨环境时只传标识,不传 Context。 */\n parentScopeId?: string;\n /** 插件标识。由 Host 绑定,调用方不可从请求参数替换。 */\n pluginId?: string;\n /** 宿主绑定的只读扩展元数据;不得放入私密材料。 */\n attributes: TAttributes;\n}\n\n/** 释放回调;reason 是中文 UI 之外的稳定审计原因。 */\nexport type LifecycleCleanup = (reason: string) => void | Promise<void>;\n\n/** 清理阶段;Registry 等技术注册项通常在 legacy teardown 之后释放。 */\nexport type LifecycleCleanupPhase = \"before-teardown\" | \"after-teardown\";\n\n/** 作用域内一项资源的结构化快照。 */\nexport interface LifecycleResourceSnapshot {\n /** 资源唯一标识。 */\n resourceId: string;\n /** 当前阶段。 */\n state: \"acquiring\" | \"active\" | \"released\" | \"pending\";\n /** 最近一次释放错误。 */\n error?: string;\n}\n\n/** 释放失败或超时的结构化记录。 */\nexport interface LifecycleCleanupIssue {\n /** 对应资源或清理回调标识。 */\n resourceId: string;\n /** 错误稳定码。 */\n code: \"lifecycle.cleanup_failed\" | \"lifecycle.cleanup_timeout\";\n /** 便于日志和诊断的错误文本。 */\n message: string;\n}\n\n/** 作用域停止的结果;清理不完整时仍然返回,而不是伪装成功。 */\nexport interface LifecycleDisposeResult {\n /** 作用域标识。 */\n scopeId: string;\n /** 停止后的状态。 */\n state: \"stopped\";\n /** 尝试执行的释放项数量。 */\n attempted: number;\n /** 已完成的释放项数量。 */\n released: number;\n /** 超时或仍在异步收尾的资源标识。 */\n pending: string[];\n /** 所有释放错误;一个错误不阻止其它项执行。 */\n errors: LifecycleCleanupIssue[];\n /** 是否存在未完成收尾。 */\n cleanupIncomplete: boolean;\n}\n\n/** 作用域停止选项。 */\nexport interface LifecycleDisposeOptions {\n /** 每一项释放允许等待的毫秒数;不填则等待到完成。 */\n timeoutMs?: number;\n /** 释放原因。 */\n reason?: string;\n /** 在 before-teardown 资源完成后执行的旧 teardown / 领域收尾。 */\n teardown?: LifecycleCleanup;\n /**\n * 某项清理超过 timeoutMs 后最终成功时回调;回调只用于本地状态投影,\n * 不改变已经完成的撤权边界。resourceId 是稳定资源标识,result 是同一\n * 次 dispose 返回的可变快照(可能尚未生成)。\n */\n onLateSuccess?: (resourceId: string, result?: LifecycleDisposeResult) => void;\n /**\n * 某项清理在超时后最终失败时回调;调用方必须保留 cleanup-pending,\n * 不能把失败的迟到结果当成新实例成功。\n */\n onLateFailure?: (resourceId: string, error: unknown, result?: LifecycleDisposeResult) => void;\n}\n\n/** 已登记资源的可控释放句柄。 */\nexport interface LifecycleResourceHandle {\n /** 资源标识。 */\n readonly resourceId: string;\n /** 资源是否已经完成释放。 */\n readonly released: boolean;\n /** 幂等释放;重复调用不会再次执行资源释放函数。 */\n release(reason?: string): Promise<void>;\n}\n\n/**\n * 作用域公开 API。\n *\n * `revoke()` 只做同步安全撤权;`dispose()` 负责异步资源收尾。业务不需要\n * 接触底层框架 Context,也不能在 stopping/stopped 作用域中注册新资源。\n */\nexport interface LifecycleScope {\n readonly identity: LifecycleScopeIdentity;\n readonly state: LifecycleScopeState;\n readonly signal: AbortSignal;\n /** 订阅同步撤权事件;返回值用于取消该订阅。 */\n onRevoke(listener: (reason: string) => void): () => void;\n /** 登记一个释放回调;返回取消登记函数。 */\n onDispose(cleanup: LifecycleCleanup, resourceId?: string, phase?: LifecycleCleanupPhase): () => void;\n /** 登记已有资源并返回幂等释放句柄。 */\n track<T>(resource: T, release: (resource: T, reason: string) => void | Promise<void>, resourceId?: string): T;\n /** 受控异步创建:停止期间才返回的资源会被立即释放且不会进入旧实例。 */\n acquire<T>(\n resourceId: string,\n create: (signal: AbortSignal) => T | Promise<T>,\n release: (resource: T, reason: string) => void | Promise<void>\n ): Promise<T>;\n /** 创建同一运行实例下的子作用域。 */\n child(kind: LifecycleScopeKind, metadata?: Partial<Omit<LifecycleScopeIdentity, \"scopeId\" | \"instanceId\" | \"kind\" | \"parentScopeId\">>): LifecycleScope;\n /** 同步撤销权限、发出 signal.abort,并阻止新资源登记。 */\n revoke(reason?: string): void;\n /** 异步释放全部已登记资源,结果可见且幂等。 */\n dispose(options?: LifecycleDisposeOptions): Promise<LifecycleDisposeResult>;\n /** 作用域已撤权时抛出稳定错误。 */\n assertActive(): void;\n /** 只读资源快照。 */\n resources(): readonly LifecycleResourceSnapshot[];\n}\n\n/** 生命周期作用域已撤权。 */\nexport class LifecycleScopeRevokedError extends Error {\n readonly code = \"lifecycle.scope_revoked\" as const;\n\n constructor(message = \"Lifecycle scope has been revoked\") {\n super(message);\n this.name = \"LifecycleScopeRevokedError\";\n }\n}\n\n/** 权限租约已撤销或身份不匹配。 */\nexport class PermissionLeaseRevokedError extends Error {\n readonly code = \"permission.lease_revoked\" as const;\n\n constructor(message = \"Permission lease has been revoked\") {\n super(message);\n this.name = \"PermissionLeaseRevokedError\";\n }\n}\n\n/** 没有得到可信装配批准的权限。 */\nexport class PermissionDeniedError extends Error {\n readonly code = \"permission.denied\" as const;\n readonly permission: PluginPermission;\n\n constructor(permission: PluginPermission, message = `Permission denied: ${permission}`) {\n super(message);\n this.name = \"PermissionDeniedError\";\n this.permission = permission;\n }\n}\n\n/** 权限租约的不可变身份绑定。 */\nexport interface PermissionLeaseBinding extends LifecycleScopeIdentity {\n /** 插件申请的权限;申请不等于批准。 */\n requested: readonly PluginPermission[];\n /** 可信装配层批准的权限。 */\n approved: readonly PluginPermission[];\n /** 当前会话额外允许的权限;未提供会话限制时由装配层视为全量允许。 */\n sessionConstraints?: readonly PluginPermission[];\n /** 内置可信策略修订;策略扩大或收窄都会触发重新发租约。 */\n policyRevision?: number;\n /** Connect 用户授权修订;内置插件可以省略。 */\n grantRevision?: number;\n /** Connect/外部授权的不可猜测授权标识;最终服务边界必须核验。 */\n grantId?: string;\n}\n\n/** 最终 RPC / I/O 边界可比较的租约身份字段。 */\nexport type PermissionLeaseBindingExpectation =\n Partial<Pick<LifecycleScopeIdentity, \"pluginId\" | \"instanceId\">>\n & { attributes?: Readonly<Record<string, unknown>> }\n & Partial<Pick<PermissionLeaseBinding, \"policyRevision\" | \"grantRevision\" | \"grantId\">>;\n\n/** 权限租约;实现必须在最终 RPC/I/O 边界再次校验。 */\nexport interface PermissionLease {\n readonly binding: PermissionLeaseBinding;\n readonly revoked: boolean;\n /** 当前租约是否同时满足申请、批准和作用域状态。 */\n has(permission: PluginPermission): boolean;\n /** 校验权限;失败抛稳定错误。 */\n assert(permission: PluginPermission): void;\n /** 校验绑定身份;不允许替换 owner、插件或世代。 */\n assertBinding(expected: PermissionLeaseBindingExpectation): void;\n /** 撤销租约;重复调用幂等。 */\n revoke(reason?: string): void;\n}\n\n/** 跨 Worker 服务的可序列化引用;引用本身不是授权凭据。 */\nexport interface RemoteServiceReference {\n /** 服务契约标识。 */\n capabilityId: string;\n /** 要求精确匹配的服务契约版本。 */\n contractVersion: string;\n /** 提供者所在真实 Runtime。 */\n runtime: RuntimeKind;\n /** 提供环境的启动身份;重启后变化。 */\n runtimeInstanceId: string;\n /** 服务实例身份;撤销后永不复用。 */\n serviceInstanceId: string;\n /** 当前服务目录状态。 */\n status: \"starting\" | \"ready\" | \"unavailable\" | \"failed\";\n /** 宿主绑定的只读服务属性;服务桥不解释其业务含义。 */\n attributes: Readonly<Record<string, unknown>>;\n /** 可选的外部授权标识;引用不是授权本身,Provider 仍需查权威状态。 */\n grantId?: string;\n /** 服务端授权策略修订;策略变化时旧引用必须失效。 */\n authorizationRevision?: number;\n}\n\n/** 传给服务桥的完整目录快照;Runtime Host 是它的唯一权威发布者。 */\nexport interface RemoteServiceSnapshot {\n /** 快照协议版本;解析成功但版本不匹配时不得当成可用目录。 */\n protocolVersion: string;\n /** 权威 Runtime 的逻辑标识;独立服务桥可省略。 */\n runtimeId?: string;\n /** 权威 Runtime 类型;独立服务桥可省略。 */\n runtimeKind?: RuntimeKind;\n /** 每次 Worker 启动唯一的 Runtime 身份。 */\n runtimeInstanceId: string;\n /** 当前完整目录修订;同一 Runtime 只接受严格递增值。 */\n revision: number;\n /** Runtime 当前状态。 */\n state?: \"starting\" | \"ready\" | \"stopping\" | \"failed\" | \"disposed\";\n /** 当前完整服务目录。 */\n services: readonly RemoteServiceReference[];\n}\n\n/** MessagePort 服务消息类别;codec 只承载调用生命周期。 */\nexport type RemoteServiceMessageKind = \"call\" | \"result\" | \"error\" | \"cancel\";\n\n/** 服务桥 wire codec;负责类型名、编解码和协议版本,不让传输层散落字符串判断。 */\nexport interface RemoteServiceMessageCodec {\n /** codec 对应的协议版本。 */\n readonly protocolVersion: string;\n /** 各消息类别对应的 wire type。 */\n type(kind: RemoteServiceMessageKind): string;\n /** 将结构化消息编码为可结构化克隆的数据。 */\n encode(message: Record<string, unknown>): unknown;\n /** 将 wire 数据解码为对象;无效消息返回 undefined。 */\n decode(input: unknown): Record<string, unknown> | undefined;\n}\n\n/** 创建 WebLoom v2 codec;产品可以只替换 wire 前缀,不能恢复控制消息。 */\nexport function createRemoteServiceMessageCodec(options: {\n prefix?: string;\n protocolVersion?: string;\n} = {}): RemoteServiceMessageCodec {\n const prefix = options.prefix ?? \"webloom.remote-service\";\n const protocolVersion = options.protocolVersion ?? \"webloom.remote-service.v2\";\n const types = new Map<RemoteServiceMessageKind, string>([\n [\"call\", `${prefix}.call`],\n [\"result\", `${prefix}.result`],\n [\"error\", `${prefix}.error`],\n [\"cancel\", `${prefix}.cancel`],\n ]);\n return Object.freeze({\n protocolVersion,\n type(kind: RemoteServiceMessageKind): string {\n const value = types.get(kind);\n if (!value) throw new Error(`Unknown remote service message kind: ${kind}`);\n return value;\n },\n encode(message: Record<string, unknown>): unknown {\n return { ...message };\n },\n decode(input: unknown): Record<string, unknown> | undefined {\n if (!input || typeof input !== \"object\") return undefined;\n const message = input as Record<string, unknown>;\n if (typeof message.type !== \"string\" || ![...types.values()].includes(message.type)) return undefined;\n return message;\n },\n });\n}\n\n/** 服务桥查询条件;不匹配时不能返回“差不多兼容”的代理。 */\nexport interface RemoteServiceLookup {\n /** 要求的服务契约标识。 */\n capabilityId: string;\n /** 要求的精确契约版本。 */\n contractVersion: string;\n /** 可选的预期提供 Runtime。 */\n runtime?: RuntimeKind;\n}\n\n/** 服务代理调用上下文;服务端必须在最终边界重新检查引用和租约。 */\nexport interface RemoteServiceCallContext {\n /** 业务操作标识;可由调用方复用,用于审计和幂等,不作为传输关联键。 */\n operationId?: string;\n /** 创建代理时捕获的不可变引用。 */\n reference: RemoteServiceReference;\n /** 引用绑定的外部授权标识,供最终服务边界再次核验。 */\n grantId?: string;\n /** 同时受消费者作用域和本次请求控制的 signal。 */\n signal: AbortSignal;\n /** 从调用开始计算的总 deadline;等待目录和远程执行共用它。 */\n deadlineAt?: number;\n /** 传输直调用时的总 timeout;桥调用会同时提供 deadlineAt。 */\n timeoutMs?: number;\n}\n\n/** 跨环境传输实现;桥不负责自动重放有外部副作用的请求。 */\nexport interface RemoteServiceTransport {\n call<TRequest, TResult>(\n request: TRequest,\n context: RemoteServiceCallContext\n ): Promise<TResult>;\n}\n\nexport interface RemoteServiceCallOptions {\n signal?: AbortSignal;\n operationId?: string;\n /** 兼容旧业务命名;只作为 operationId,不作为传输 callId。 */\n requestId?: string;\n /** 覆盖 RuntimeHandle 的默认有限 deadline。 */\n timeoutMs?: number;\n}\n\n/** 惰性服务代理;第一次成功调用后永久绑定一份服务引用。 */\nexport interface RemoteServiceProxy {\n /** 未绑定时为 undefined;绑定后引用永远不换绑。 */\n readonly reference?: RemoteServiceReference;\n readonly revoked: boolean;\n call<TRequest, TResult>(\n request: TRequest,\n options?: RemoteServiceCallOptions,\n ): Promise<TResult>;\n revoke(reason?: string): void;\n}\n\nexport type RemoteServiceBridgeState = \"empty\" | \"ready\" | \"stale\" | \"disposed\";\n\n/** 服务桥完整快照结果;旧/重复 revision 直接忽略,不清空当前目录。 */\nexport type RemoteServiceSnapshotResult =\n | { accepted: true; state: RemoteServiceBridgeState; revision: number }\n | { accepted: false; reason: \"stale-revision\" | \"protocol-mismatch\" | \"invalid-snapshot\" | \"disposed\"; receivedRevision?: number };\n\n/** WebLoom v2 调用错误的稳定码;业务 handler 可以附加自己的 code。 */\nexport type RemoteServiceErrorCode =\n | \"transport_unavailable\"\n | \"call_timeout\"\n | \"runtime_initialization_failed\"\n | \"protocol_mismatch\"\n | \"capability_unavailable\"\n | \"contract_version_mismatch\"\n | \"service_stale\"\n | \"service_revoked\"\n | \"permission_denied\"\n | \"request_cancelled\"\n | \"request_clone_failed\"\n | \"handler_failed\"\n | (string & {});\n\nexport class RemoteServiceError extends Error {\n readonly code: RemoteServiceErrorCode;\n readonly details?: Readonly<Record<string, unknown>>;\n\n constructor(\n code: RemoteServiceErrorCode,\n message: string,\n details?: Readonly<Record<string, unknown>>,\n ) {\n super(message);\n this.name = \"RemoteServiceError\";\n this.code = code;\n this.details = details;\n }\n}\n\n/** 跨 Worker 服务桥最小本地契约。 */\nexport interface RemoteServiceBridge {\n /** 当前端口连接状态。 */\n readonly state: RemoteServiceBridgeState;\n /** 当前权威 Runtime 启动身份。 */\n readonly runtimeInstanceId?: string;\n /** 应用一份完整快照;第一次调用可以早于它到达。 */\n applySnapshot(snapshot: RemoteServiceSnapshot): RemoteServiceSnapshotResult;\n /** 记录可解析但版本不兼容的对端;后续调用返回 protocol_mismatch。 */\n markProtocolMismatch(reason?: string): void;\n /** 记录权威 Runtime 初始化失败;后续调用返回 runtime_initialization_failed。 */\n markInitializationFailed(reason?: string): void;\n /** 总 deadline 默认值;必须是有限且大于零的毫秒数。 */\n readonly defaultCallTimeoutMs: number;\n /** 获取一个惰性、单次绑定代理;不得因当前目录为空同步失败。 */\n getProxy(lookup: RemoteServiceLookup, scope?: LifecycleScope): RemoteServiceProxy | undefined;\n /** 获取惰性代理的显式别名;只在桥 disposed 后仍返回会失败的代理。 */\n requireProxy(lookup: RemoteServiceLookup, scope?: LifecycleScope): RemoteServiceProxy;\n /** 同步撤下全部代理;不等待远端。 */\n invalidate(reason?: string): void;\n /** 端口断线;旧代理永久失效,后续恢复必须创建新 RuntimeHandle。 */\n disconnect(reason?: string): void;\n /** 永久销毁桥,并拒绝所有等待绑定和 pending call。 */\n dispose(reason?: string): void;\n /** 订阅桥状态和服务目录变化。 */\n subscribe(listener: () => void): () => void;\n /** 只读当前有效服务引用。 */\n services(): readonly RemoteServiceReference[];\n}\n\n/** 首次发布采用的升级并存策略。冷切换要求旧环境先退出;两阶段允许\n * 短暂并存,但必须先在写入边界完成同一接管世代的排空。 */\nexport type UpgradeMode = \"cold-switch\" | \"two-phase\";\n\n/** 升级接管门禁状态;draining 仍可等待旧 I/O,但不接受新业务 I/O。 */\nexport type UpgradeGateState = \"active\" | \"draining\" | \"closed\";\n\n/** 新旧 Worker / 客户端接管握手。 */\nexport interface UpgradeHandshake {\n /** 发起握手的实际连接标识;会话不能脱离这条连接转移使用。 */\n connectionId: string;\n /** 控制协议版本;不兼容时拒绝业务接入。 */\n protocolVersion: string;\n /** 构建产物标识;不同构建只有显式兼容时才可接入。 */\n buildId: string;\n /** 当前运行环境启动身份。 */\n authorityInstanceId: string;\n /** 写入接管世代;旧世代不能重新取得租约。 */\n handoverGeneration: number;\n /** 对端支持的精确服务契约版本。 */\n supportedContractVersions: readonly string[];\n}\n\n/** 升级握手结果。 */\nexport type UpgradeHandshakeResult =\n | {\n accepted: true;\n mode: UpgradeMode;\n handoverGeneration: number;\n contractVersion: string;\n /** 只有握手返回的绑定会话才可申请 I/O 租约。 */\n connectionId: string;\n sessionId: string;\n session: UpgradeSession;\n }\n | {\n accepted: false;\n reason:\n | \"protocol-mismatch\"\n | \"build-incompatible\"\n | \"stale-generation\"\n | \"future-generation\"\n | \"contract-mismatch\"\n | \"draining\"\n | \"closed\";\n };\n\n/** 一次已获准的 I/O 接管租约;排空期间已发租约可完成,close 后失效。 */\nexport interface UpgradeIoLease {\n /** 发放租约的实际连接标识。 */\n readonly connectionId: string;\n /** 发放该租约的握手会话。 */\n readonly sessionId: string;\n /** 发放租约的权威启动身份。 */\n readonly authorityInstanceId: string;\n /** 发放租约时的接管世代。 */\n readonly handoverGeneration: number;\n /** 精确匹配的服务契约版本。 */\n readonly contractVersion: string;\n /** 本次 I/O 类型;写入边界必须额外做领域校验。 */\n readonly operation: \"read\" | \"write\";\n /** 租约是否已撤销或主动释放。 */\n readonly revoked: boolean;\n /** 与本次 I/O 合并的取消信号。 */\n readonly signal: AbortSignal;\n /** 在最终提交前检查租约仍属于当前接管门禁。 */\n assertActive(): void;\n /** 释放租约;重复调用幂等。 */\n release(): void;\n}\n\n/** 一次通过握手、绑定权威/世代/契约版本的接管会话。 */\nexport interface UpgradeSession {\n /** 会话绑定的实际连接标识;换连接必须重新握手。 */\n readonly connectionId: string;\n /** 不可猜测的会话标识;跨端传输时作为 opaque token。 */\n readonly sessionId: string;\n /** 发放会话的当前权威启动身份。 */\n readonly authorityInstanceId: string;\n /** 发放会话时的接管世代。 */\n readonly handoverGeneration: number;\n /** 握手协商出的精确服务契约版本。 */\n readonly contractVersion: string;\n /** 会话是否已撤销。 */\n readonly revoked: boolean;\n /** 会话撤销信号。 */\n readonly signal: AbortSignal;\n /** 校验会话仍可申请 I/O。 */\n assertActive(): void;\n /** 只能申请握手协商出的契约版本,不接受调用方换版本。 */\n admit(input: { operation: \"read\" | \"write\"; signal?: AbortSignal }): UpgradeIoLease;\n /** 关闭当前握手会话并撤销其尚未完成的 I/O。 */\n close(reason?: string): void;\n}\n\n/** 升级排空结果;超时不会伪装成已排空。 */\nexport interface UpgradeDrainResult {\n /** 排空时的门禁状态。 */\n state: UpgradeGateState;\n /** 是否确认所有已发 I/O 租约都已释放。 */\n drained: boolean;\n /** 仍未释放的 I/O 数量。 */\n pending: number;\n}\n\n/** 接管门禁创建参数。 */\nexport interface CreateUpgradeGateOptions {\n /** 当前接受的控制协议版本。 */\n protocolVersion: string;\n /** 当前构建产物标识。 */\n buildId: string;\n /** 当前 Worker / 执行环境启动身份。 */\n authorityInstanceId: string;\n /** 当前写入接管世代。 */\n handoverGeneration: number;\n /** 当前允许的精确服务契约版本集合。 */\n supportedContractVersions: readonly string[];\n /** 冷切换或两阶段并存;默认冷切换。 */\n mode?: UpgradeMode;\n /** 显式允许接入的旧构建;不填时只接受同 buildId。 */\n compatibleBuildIds?: ReadonlySet<string>;\n /** 更复杂部署可提供显式构建兼容规则。 */\n isBuildCompatible?: (buildId: string) => boolean;\n}\n\n/** 跨 Worker 写入接管门禁。它不负责选主、不负责调度插件。 */\nexport interface UpgradeGate {\n readonly state: UpgradeGateState;\n readonly mode: UpgradeMode;\n readonly authorityInstanceId: string;\n readonly handoverGeneration: number;\n /** 校验版本、构建、接管世代和精确契约版本。 */\n handshake(input: UpgradeHandshake): UpgradeHandshakeResult;\n /** 当前仍允许发放新业务 I/O 租约。 */\n assertAccepting(): void;\n /** 发放绑定当前握手会话、权威和世代的 I/O 租约。 */\n admit(input: {\n session: UpgradeSession;\n operation: \"read\" | \"write\";\n signal?: AbortSignal;\n }): UpgradeIoLease;\n /** 同步关闭新 I/O 入口;不等待已提交 I/O。 */\n beginDrain(reason?: string): void;\n /** 等待已发租约释放;超时后仍保持 draining。 */\n drain(timeoutMs?: number): Promise<UpgradeDrainResult>;\n /** 永久关闭并撤销尚未释放的租约。 */\n close(reason?: string): void;\n /** 当前已发且尚未释放的 I/O 数量。 */\n activeIo(): number;\n}\n\n/** 升级门禁拒绝或租约失效。 */\nexport class UpgradeGateRejectedError extends Error {\n readonly code = \"upgrade.gate_rejected\" as const;\n readonly reason: string;\n\n constructor(reason: string, message = `Upgrade gate rejected operation: ${reason}`) {\n super(message);\n this.name = \"UpgradeGateRejectedError\";\n this.reason = reason;\n }\n}\n\n/** 单次插件启停控制命令;目标是绝对意图,不是 toggle。 */\nexport interface PluginIntentCommand {\n /** 客户端生成的幂等命令标识。 */\n commandId: string;\n /** 命令发送方握手得到的控制面启动身份。 */\n authorityInstanceId: string;\n /** 客户端观察到的全局修订。 */\n expectedRevision: number;\n /** 目标产品标识。 */\n pluginId: string;\n /** 目标启用意图。 */\n desiredEnabled: boolean;\n}\n\n/** 控制面持久化的插件意图快照。 */\nexport interface PluginIntentSnapshot {\n /** 控制面全局修订。 */\n revision: number;\n /** 每个产品当前的绝对启用意图。 */\n desiredEnabled: Readonly<Record<string, boolean>>;\n /** 每个产品自己的意图修订。 */\n desiredRevision: Readonly<Record<string, number>>;\n}\n\n/** 启停命令的结构化结果;accepted 只表示意图已持久化。 */\nexport type PluginIntentCommandResult =\n | { status: \"accepted\" | \"duplicate\"; commandId: string; snapshot: PluginIntentSnapshot; persisted: true }\n | { status: \"stale-authority\"; commandId: string; expectedAuthorityInstanceId: string }\n | { status: \"command-conflict\"; commandId: string; message: string }\n | { status: \"revision-conflict\"; commandId: string; snapshot: PluginIntentSnapshot }\n | { status: \"persistence-failed\"; commandId: string; message: string; snapshot: PluginIntentSnapshot };\n\n/** 意图 RPC 的完整结果;transport-error 不代表意图已保存。 */\nexport type PluginIntentSubmissionResult = PluginIntentCommandResult | {\n status: \"transport-error\";\n message: string;\n retryable: boolean;\n};\n\n/** 单一控制面上的命令去重、修订比较和持久化边界。 */\nexport interface PluginIntentController {\n /** 当前控制面启动身份;Worker 重启后必须更换。 */\n readonly authorityInstanceId: string;\n /** 当前意图快照。 */\n snapshot(): PluginIntentSnapshot;\n /** 串行提交一次绝对意图命令。 */\n submit(command: PluginIntentCommand): Promise<PluginIntentCommandResult>;\n /** 订阅持久化成功后的意图变化。 */\n subscribe(listener: (snapshot: PluginIntentSnapshot) => void): () => void;\n}\n\n/** Host 使用的意图控制面适配器;生产实现位于 Coordinator client。 */\nexport interface PluginIntentCoordinator {\n /** 当前 SharedWorker authority;Worker 重启后变化。 */\n readonly authorityInstanceId: string;\n /** 当前权威意图快照。 */\n snapshot(): PluginIntentSnapshot;\n /** 提交绝对启停意图;不直接承诺运行实例已启动。 */\n submit(command: PluginIntentCommand): Promise<PluginIntentSubmissionResult>;\n /** 接收其它页面或 Worker 广播的持久化快照。 */\n subscribe(listener: (snapshot: PluginIntentSnapshot) => void): () => void;\n}\n\n/** 带实例取消信号的后台任务定义;不负责持久化外部副作用。 */\nexport interface ScopedTaskDefinition {\n /** 全局唯一任务标识。 */\n id: string;\n /** 所属插件;默认由作用域身份提供。 */\n pluginId?: string;\n /** 展示名称。 */\n label: string;\n /** 周期;缺省表示只响应显式触发。 */\n intervalMs?: number;\n /** 任务执行体。 */\n run(context: { signal: AbortSignal; reason: string }): void | Promise<void>;\n}\n\n/** 作用域任务的运行快照。 */\nexport interface ScopedTaskSnapshot {\n /** 任务标识。 */\n id: string;\n /** 所属插件。 */\n pluginId: string;\n /** 展示名称。 */\n label: string;\n /** 当前任务状态。 */\n state: \"idle\" | \"queued\" | \"running\" | \"failed\";\n /** 最近一次错误。 */\n error?: string;\n /** 最近成功时间。 */\n lastCompletedAt?: string;\n /** 下一次周期触发时间。 */\n nextRunAt?: string;\n}\n\n/** 绑定作用域的最小任务调度器。 */\nexport interface ScopedTaskScheduler {\n /** 注册任务并返回幂等取消句柄。 */\n register(definition: ScopedTaskDefinition): () => void;\n /** 显式触发一次;同一任务运行中只合并一次重跑请求。 */\n runNow(id: string, reason?: string): Promise<void>;\n /** 取消当前任务实例并等待其退出。 */\n cancel(id: string): Promise<void>;\n /** 获取当前任务快照。 */\n snapshot(): readonly ScopedTaskSnapshot[];\n /** 订阅快照变化。 */\n subscribe(listener: (snapshot: readonly ScopedTaskSnapshot[]) => void): () => void;\n}\n\n/** 作用域后台任务调度器 capability key。 */\nexport const SCOPED_TASK_SCHEDULER_CAPABILITY = \"runtime.task-scheduler\";\n\n/** 用户可见的稳定生命周期错误中文说明。 */\nexport const LIFECYCLE_ERROR_TEXT: Readonly<Record<string, string>> = Object.freeze({\n \"lifecycle.scope_revoked\": \"运行实例已停止\",\n \"permission.denied\": \"插件没有获得该操作的权限\",\n \"permission.lease_revoked\": \"授权租约已撤销\",\n \"lifecycle.cleanup_failed\": \"资源清理失败,等待重试\",\n \"lifecycle.cleanup_timeout\": \"资源清理超时,仍在后台排空\",\n \"upgrade.gate_rejected\": \"版本接管门禁未通过\"\n});\n\n/** 将稳定错误码映射到中文 UI 文案;未知错误返回通用提示。 */\nexport function lifecycleErrorText(code: string): string {\n return LIFECYCLE_ERROR_TEXT[code] ?? \"生命周期操作未完成\";\n}\n","// packages/contracts/src/messageBus.ts\n// WebLoom MessageBus 契约:事件、命令、请求统一入口。\n//\n// 设计缘由:\n// - 旧 EventBus 只能表达\"已发生的事件\";系统实际需要命令、请求响应、\n// actor mailbox、限流、取消、超时等多类语义。\n// - 不把 EventBus / CommandBus / ActorBus 并存作为多入口;业务插件\n// 只看到一个 MessageBus,由 mode / target 区分消息类型。\n// - envelope 由 type 表达业务含义、mode 表达调用语义、target 表达\n// 由哪个 actor mailbox 消费、priority 给调度策略使用、causationId\n// 串起同根消息链。\n// - publish / subscribe 必须保持与旧 EventBus 同步调用等价,避免改变\n// vault.unlocked、key.deleted、UI notify 的时序。\n// - 第一阶段只暴露 publish / subscribe / dispatch / request / handle;\n// actor mailbox 的持久化、延迟调度、限流属于具体 actor(如 WOC actor)\n// 的内部实现。\n\n/** runtime messageBus capability key;manifest 通过 ctx.get<...> 取出。 */\nexport const RUNTIME_MESSAGE_BUS = \"webloom.messageBus\";\n\n/** 消息调用语义。 */\nexport type MessageMode = \"event\" | \"command\" | \"request\";\n\n/** 消息 envelope。 */\nexport interface Message<TPayload = unknown> {\n id: string;\n type: string;\n mode: MessageMode;\n payload: TPayload;\n /** 由哪个 actor mailbox 消费。缺省时同步调用 subscriber 或无 mailbox。 */\n target?: string;\n /** 数值越大越优先(actor 内部解读)。 */\n priority?: number;\n /** 超时(ms);超时后 message 标记为超时失败。 */\n timeoutMs?: number;\n /**\n * MessageBus 内部维护的 abort signal。\n * - 来自调用方 DispatchOptions.signal 的 upstream 取消会触发。\n * - 来自 MessageBus 自身的 timeout 触发。\n * - 来自 actor / MessageBus 内部主动 abort。\n * handler 应优先用此 signal 取消 fetch 等异步操作;payload.signal 仍\n * 可保留以兼容旧调用方。\n */\n signal?: AbortSignal;\n causationId?: string;\n createdAt: number;\n}\n\n/** 消息 handler 签名。 */\nexport type MessageHandler<TPayload = unknown, TResult = unknown> = (\n message: Message<TPayload>\n) => TResult | Promise<TResult>;\n\n/** publish 行为:仅同步广播给订阅者,不等待异步 handler 完成。 */\nexport interface PublishOptions {\n /** 关联上一条消息(同一业务动作触发的子事件)。 */\n causationId?: string;\n /** 自定义 message id;缺省由 MessageBus 生成。 */\n messageId?: string;\n}\n\n/**\n * dispatch 行为:投递给 actor mailbox;返回 messageId。\n * - target 必填:dispatch 期望被 actor 处理,不退化为 publish 语义。\n * - 找到 handler 时消息会真正入 mailbox 并被 pump 串行消费。\n * - 找不到 handler 时消息被记为 failed + lastError,但**不抛**给调用方\n * (dispatch 不返回结果)。\n */\nexport interface DispatchOptions extends PublishOptions {\n target: string;\n priority?: number;\n signal?: AbortSignal;\n timeoutMs?: number;\n /** 消息进入终态后调用一次;生命周期 facade 用它释放临时 signal 监听。 */\n onSettled?: () => void;\n}\n\n/**\n * request 行为:等待 actor 返回结果;选项语义与 dispatch 完全一致。\n * - 行为差异:request 返回 Promise<TResult>,handler reject 即 promise reject。\n * - 找不到 handler / no target 时立即 reject。\n * - timeoutMs 触发时会先 abort 内部 signal,再 reject 外层 promise;\n * handler 内部应该监听 message.signal 取消 fetch。\n */\nexport type RequestOptions = DispatchOptions;\n\n/** handle 注册选项。 */\nexport interface HandlerOptions {\n target?: string;\n priority?: number;\n /**\n * 同 target 投递并发上限。\n * 缺省 1:同 target actor 严格串行。\n * 同 target 全部 handler 注册时必须使用一致 concurrency,否则\n * MessageBus 抛 `Conflicting concurrency for target \"...\"`。\n * 注意:这是 MessageBus 投递并发,不是 handler 内部副作用(如网络\n * 请求)的并发;高并发适合\"内部 actor 自己做限流\"的场景(如 WOC\n * 内部 mailbox)。\n */\n concurrency?: number;\n}\n\n/** 快照。 */\nexport interface MessageBusSnapshot {\n /** 消息总数(含已完成、失败、被取消)。 */\n total: number;\n /** 队列中尚未处理的消息数。 */\n queued: number;\n /** 飞行中消息数。 */\n inFlight: number;\n /** 已成功完成的消息数。 */\n completed: number;\n /** handler 抛错或被 lastError 路径标记失败的消息数。 */\n failed: number;\n /** 被 abort signal 取消的消息数。 */\n canceled: number;\n /** 最近一次错误。 */\n lastError?: string;\n /** 各 target 队列长度。 */\n byTarget: Record<string, number>;\n}\n\n/** 订阅事件快捷方式:仅接收 mode=event 的消息。 */\nexport type EventHandler<TPayload = unknown> = (payload: TPayload) => void;\n\n/**\n * MessageBus 契约。\n * 设计缘由:业务插件调用方只看到这一套入口。\n */\nexport interface MessageBus {\n /** 事件广播:已发生的事实,不等待业务完成;同步调用 subscriber。 */\n publish<TPayload>(type: string, payload: TPayload, options?: PublishOptions): string;\n\n /** 事件订阅:仅接收 mode=event 的消息;返回取消订阅函数。 */\n subscribe<TPayload>(type: string, handler: EventHandler<TPayload>): () => void;\n\n /**\n * 命令投递:把消息入 actor mailbox,返回 messageId。\n * 不等待 handler 完成;handler 抛错 / 超时 / 找不到 handler 仅写\n * snapshot.lastError,不冒泡。\n */\n dispatch<TPayload>(type: string, payload: TPayload, options: DispatchOptions): string;\n\n /** 请求响应:等待 actor 返回结果。 */\n request<TPayload, TResult>(\n type: string,\n payload: TPayload,\n options: RequestOptions\n ): Promise<TResult>;\n\n /** 注册 handler:带 target 时进入对应 actor mailbox。 */\n handle<TPayload, TResult>(\n type: string,\n handler: MessageHandler<TPayload, TResult>,\n options?: HandlerOptions\n ): () => void;\n\n /** 快照。 */\n snapshot(): MessageBusSnapshot;\n\n /** 订阅快照变更。 */\n onSnapshot(handler: (snapshot: MessageBusSnapshot) => void): () => void;\n}\n","// WebLoom 通用资源缓存契约。\n\n/** 资源键:稳定、可比较且不含秘密的字符串元组。 */\nexport type ResourceKey = readonly [resourceId: string, ...parts: readonly string[]];\n\n/** 资源当前状态。 */\nexport type ResourceStatus = \"pending\" | \"ready\" | \"stale\" | \"error\" | \"blocked\";\n\n/** 资源快照:状态、数据、错误和单调修订。 */\nexport interface ResourceSnapshot<T> {\n /** 资源键。 */\n readonly key: ResourceKey;\n /** 当前加载状态。 */\n readonly status: ResourceStatus;\n /** 当前数据;未 ready 时可以为空。 */\n readonly data: T | undefined;\n /** 稳定错误码和可展示错误信息。 */\n readonly error?: { readonly code: string; readonly message: string };\n /** 快照修订,每次有效变化递增。 */\n readonly revision: number;\n}\n\n/** 资源读取上下文;只提供通用 capability 和宿主扩展属性。 */\nexport interface ResourceContext<TAttributes extends Readonly<Record<string, unknown>> = Readonly<Record<string, unknown>>> {\n /** 读取已注入的 capability;不存在时返回 undefined。 */\n getCapability<T>(id: string): T | undefined;\n /** 资源定义所属的插件实例标识;由注册表绑定,插件不能伪造。 */\n readonly ownerId: string;\n /** 宿主绑定的当前作用域属性;资源定义不能写入。 */\n readonly attributes: TAttributes;\n}\n\n/** Runtime-only metadata used to bind a definition to an owner. */\nexport const RESOURCE_OWNER = Symbol(\"webloom.resource.owner\");\nexport type OwnedResourceDefinition = ResourceDefinition<unknown, readonly string[]> & {\n readonly [RESOURCE_OWNER]?: string;\n};\n\n/** 资源定义:描述键、加载、失效订阅与比较方式。 */\nexport interface ResourceDefinition<T, TArgs extends readonly string[] = readonly string[]> {\n /** 资源唯一标识。 */\n readonly id: string;\n /** 资源所依附的生命周期标签,由宿主解释。 */\n readonly scope: string;\n /** 生成资源键。 */\n key(args: TArgs, context: ResourceContext): ResourceKey;\n /** 加载资源数据;实现必须响应 signal。 */\n load(args: TArgs, context: ResourceContext, signal: AbortSignal): Promise<T>;\n /** 订阅失效事件;只表达失效,不直接改写快照。 */\n subscribe?(args: TArgs, context: ResourceContext, invalidate: () => void): () => void;\n /** 语义相等判断;返回 true 时不发布新数据快照。 */\n equals?(previous: T | undefined, next: T | undefined): boolean;\n /** 同一事件循环内是否合并失效通知。 */\n readonly invalidation: \"immediate\" | \"microtask\";\n}\n\n/** 资源定义注册表。 */\nexport interface ResourceRegistry {\n /** 注册资源定义。 */\n register<T, TArgs extends readonly string[]>(definition: ResourceDefinition<T, TArgs>): void;\n /** 注销资源定义。 */\n unregister(id: string): void;\n /** 查询资源定义。 */\n get<T, TArgs extends readonly string[]>(id: string): ResourceDefinition<T, TArgs> | undefined;\n /** 调试和宿主清理使用的定义标识。 */\n _ids(): string[];\n}\n\n/** Resource Registry 的 capability 标识。 */\nexport const RESOURCE_REGISTRY_CAPABILITY = \"webloom.resource.registry\";\n","// packages/runtime/src/capabilityRegistry.ts\n// 能力注册表:所有 plugin 服务都通过 capability 提供和消费。\n// 关键不变量:\n// - provide 重复必须抛错(防止后注册覆盖先注册)。\n// - require 缺失必须抛错(让插件依赖问题在启动时暴露)。\n// - revoke 后再 has() 必须返回 false(host 在插件 disable 时调用)。\n// 设计缘由:把\"插件间互相不知道\"这件事落到机制上。\n\nexport interface CapabilityRegistry {\n provide<T>(key: string, value: T): void;\n /**\n * 硬切换 001:撤销一个 capability。\n * 不存在时 no-op;存在则移除。提供方应保证自己负责的 capability\n * 被撤销时,相关订阅/资源也被清理(这通常由 host 的 plugin teardown\n * 流程负责)。\n */\n revoke(key: string): void;\n get<T>(key: string): T;\n has(key: string): boolean;\n require(key: string): void;\n /** 仅用于调试。 */\n keys(): string[];\n}\n\nexport function createCapabilityRegistry(): CapabilityRegistry {\n const map = new Map<string, unknown>();\n\n return {\n provide(key, value) {\n if (map.has(key)) {\n throw new Error(`Capability \"${key}\" is already provided`);\n }\n map.set(key, value);\n },\n revoke(key) {\n if (!map.has(key)) return;\n map.delete(key);\n },\n get(key) {\n if (!map.has(key)) {\n throw new Error(`Capability \"${key}\" is not available`);\n }\n return map.get(key) as never;\n },\n has(key) {\n return map.has(key);\n },\n require(key) {\n if (!map.has(key)) {\n throw new Error(`Required capability \"${key}\" is missing`);\n }\n },\n keys() {\n return [...map.keys()];\n }\n };\n}\n","// 插件依赖图:依赖 capability,而不是依赖 manifest 顺序或 pluginId 猜测。\n//\n// 图是纯描述数据;启停状态由 Host/config store 提供。这样同一份图可以在\n// SharedWorker、页面和测试中复用,页面不会另起一套业务生命周期。\n\nimport type {\n PluginDependency,\n PluginGraph,\n PluginManifest,\n PluginReverseDep,\n PluginUnitGraph,\n RuntimeUnitDependency,\n RuntimeUnitDescriptor,\n} from \"../contracts/plugin.js\";\nimport type { RuntimeKind } from \"../contracts/lifecycle.js\";\n\nexport interface BuildPluginGraphOptions {\n /** 当前真正运行的插件;不传时使用 manifest.meta.defaultEnabled。 */\n enabledPluginIds?: ReadonlySet<string>;\n /** 当前 Host 的真实 Runtime;未选中的 Window/Worker 单元不会进入图。 */\n runtime?: RuntimeKind;\n}\n\nexport interface ValidatePluginGraphOptions extends BuildPluginGraphOptions {\n /** 平台内建 capability,不需要由某个 manifest 提供。 */\n builtinCapabilities?: ReadonlySet<string>;\n /** 允许多 Provider 的 capability;调用方必须有专门 Registry 选择语义。 */\n multiProviderCapabilities?: ReadonlySet<string>;\n /** Host 分批注册时允许 provider 尚未注册;真正装配前仍会进入 blocked。 */\n allowMissingDependencies?: boolean;\n /**\n * 允许依赖当前图之外的另一个真实 Runtime;实际是否 ready 由运行时\n * snapshot 和 RemoteServiceBridge 在 Host reconcile 时决定。\n */\n externalRuntimeDependencies?: boolean;\n}\n\nexport interface PluginGraphDiagnostic {\n /** 稳定诊断码。 */\n code:\n | \"plugin.duplicate_id\"\n | \"capability.duplicate_provider\"\n | \"plugin.missing_dependency\"\n | \"plugin.dependency_cycle\"\n | \"plugin.dependency_contract_invalid\"\n | \"plugin.dependency_contract_unavailable\"\n | \"plugin.runtime_invalid\"\n | \"plugin.runtime_declaration_at_product_level\";\n /** 相关插件或 capability。 */\n ids: string[];\n /** 中文诊断原因,供设置页直接显示或再做 i18n 映射。 */\n message: string;\n}\n\n/** 依赖图不满足装配条件。 */\nexport class PluginGraphValidationError extends Error {\n readonly code = \"plugin.graph_invalid\" as const;\n readonly diagnostics: readonly PluginGraphDiagnostic[];\n\n constructor(diagnostics: readonly PluginGraphDiagnostic[]) {\n super(diagnostics.map((diagnostic) => diagnostic.message).join(\"; \"));\n this.name = \"PluginGraphValidationError\";\n this.diagnostics = [...diagnostics];\n }\n}\n\nfunction unique(values: readonly string[]): string[] {\n return [...new Set(values)];\n}\n\nfunction isRuntimeKind(value: unknown): value is RuntimeKind {\n return value === \"window-main\" || value === \"shared-worker\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null;\n}\n\n/**\n * 校验所有显式运行单元的跨环境依赖契约。\n *\n * 多运行单元产品的运行期声明必须全部位于对应 unit;产品级字段只给没有\n * `units` 的简单插件保留兼容性。此函数同时服务 TypeScript 以外导入的\n * manifest,避免运行时只依赖静态类型。\n */\nexport function validateRuntimeUnitDependencyContracts(\n manifests: readonly PluginManifest[]\n): PluginGraphDiagnostic[] {\n const diagnostics: PluginGraphDiagnostic[] = [];\n for (const manifest of manifests) {\n const units = manifest.units;\n if (units === undefined) continue;\n const productLevelFields = [\n [\"dependencies\", manifest.dependencies],\n [\"permissions\", manifest.permissions],\n [\"contribution\", manifest.contribution],\n [\"config\", manifest.config],\n ] as const;\n for (const [field, value] of productLevelFields) {\n if (value === undefined) continue;\n diagnostics.push({\n code: \"plugin.runtime_declaration_at_product_level\",\n ids: [manifest.id, field],\n message: `多运行单元插件 \"${manifest.id}\" 的 ${field} 必须声明在对应 RuntimeUnitDescriptor 中,不能使用产品级 fallback`,\n });\n }\n if ((manifest.provides?.length ?? 0) > 0) {\n diagnostics.push({\n code: \"plugin.runtime_declaration_at_product_level\",\n ids: [manifest.id, \"provides\"],\n message: `多运行单元插件 \"${manifest.id}\" 的 provides 必须声明在对应 RuntimeUnitDescriptor 中,不能使用产品级 capability 摘要`,\n });\n }\n if (!Array.isArray(units)) {\n diagnostics.push({\n code: \"plugin.dependency_contract_invalid\",\n ids: [manifest.id, \"units\"],\n message: `插件 \"${manifest.id}\" 的 units 必须是运行单元数组`,\n });\n continue;\n }\n units.forEach((unitValue, unitIndex) => {\n if (!isRecord(unitValue)) {\n diagnostics.push({\n code: \"plugin.dependency_contract_invalid\",\n ids: [manifest.id, `unit:${unitIndex}`],\n message: `插件 \"${manifest.id}\" 的第 ${unitIndex + 1} 个运行单元描述无效`,\n });\n return;\n }\n const unitId = typeof unitValue.id === \"string\" && unitValue.id.length > 0\n ? unitValue.id\n : `unit:${unitIndex}`;\n const providedContracts = unitValue.providedContracts;\n if (providedContracts !== undefined) {\n if (!isRecord(providedContracts)) {\n diagnostics.push({\n code: \"plugin.dependency_contract_invalid\",\n ids: [manifest.id, unitId],\n message: `插件 \"${manifest.id}\" 的运行单元 \"${unitId}\" 的 providedContracts(提供契约版本)必须是对象`,\n });\n } else {\n for (const [capability, version] of Object.entries(providedContracts)) {\n if (typeof version !== \"string\" || version.trim() === \"\") {\n diagnostics.push({\n code: \"plugin.dependency_contract_invalid\",\n ids: [manifest.id, unitId, capability],\n message: `插件 \"${manifest.id}\" 的运行单元 \"${unitId}\" 为能力 \"${capability}\" 声明的契约版本不能为空`,\n });\n }\n }\n }\n }\n const dependencies = unitValue.dependencies;\n if (dependencies === undefined) return;\n if (!Array.isArray(dependencies)) {\n diagnostics.push({\n code: \"plugin.dependency_contract_invalid\",\n ids: [manifest.id, unitId],\n message: `插件 \"${manifest.id}\" 的运行单元 \"${unitId}\" 的 dependencies 必须是数组`,\n });\n return;\n }\n dependencies.forEach((dependencyValue, dependencyIndex) => {\n const dependency = isRecord(dependencyValue)\n ? dependencyValue as Partial<RuntimeUnitDependency>\n : {};\n const errors: string[] = [];\n if (typeof dependency.capability !== \"string\" || dependency.capability.trim() === \"\") {\n errors.push(\"capability(能力标识)不能为空\");\n }\n if (typeof dependency.contractVersion !== \"string\" || dependency.contractVersion.trim() === \"\") {\n errors.push(\"contractVersion(契约版本)不能为空\");\n }\n if (!isRuntimeKind(dependency.sourceRuntime)) {\n errors.push(\"sourceRuntime(提供者 Runtime)无效\");\n }\n if (unitValue.runtime !== undefined && !isRuntimeKind(unitValue.runtime)) {\n errors.push(\"runtime(目标 Runtime)无效\");\n }\n if (dependency.reason !== undefined && typeof dependency.reason !== \"string\") {\n errors.push(\"reason(依赖说明)必须是字符串\");\n }\n if (dependency.optional !== undefined && typeof dependency.optional !== \"boolean\") {\n errors.push(\"optional(是否可选)必须是布尔值\");\n }\n if (errors.length === 0) return;\n const capability = typeof dependency.capability === \"string\" && dependency.capability.length > 0\n ? dependency.capability\n : `dependency:${dependencyIndex}`;\n diagnostics.push({\n code: \"plugin.dependency_contract_invalid\",\n ids: [manifest.id, unitId, capability],\n message: `插件 \"${manifest.id}\" 的运行单元 \"${unitId}\" 第 ${dependencyIndex + 1} 条依赖契约无效:${errors.join(\"、\")}`,\n });\n });\n });\n }\n for (const manifest of manifests) {\n for (const unit of manifest.units ?? []) {\n if (!isRuntimeKind(unit.runtime)) {\n diagnostics.push({\n code: \"plugin.runtime_invalid\",\n ids: [manifest.id, unit.id],\n message: `插件 \"${manifest.id}\" 的运行单元 \"${unit.id}\" 声明了不支持的 Runtime;v1 仅支持 window-main/shared-worker`,\n });\n }\n }\n }\n return diagnostics;\n}\n\nfunction unitRuntime(unit: RuntimeUnitDescriptor): RuntimeKind | undefined {\n return unit.runtime;\n}\n\nfunction isRuntimeUnit(\n unit: RuntimeUnitDescriptor,\n): unit is RuntimeUnitDescriptor & { id: string; runtime: RuntimeKind } {\n return typeof unit.id === \"string\"\n && unit.id.length > 0\n && isRuntimeKind(unit.runtime);\n}\n\nfunction selectedRuntimeUnits(\n manifest: PluginManifest,\n runtime?: RuntimeKind,\n): Array<RuntimeUnitDescriptor & { id: string; runtime: RuntimeKind }> {\n const units = manifest.units ?? [];\n if (units.length === 0) return [];\n if (runtime !== undefined) return units.filter((unit): unit is RuntimeUnitDescriptor & { id: string; runtime: RuntimeKind } =>\n isRuntimeUnit(unit) && unit.runtime === runtime\n );\n // 多环境 manifest 没有 Runtime 上下文时 fail closed,不能把所有单元的\n // capability 合并成一个假 Provider。\n return units.length === 1 && isRuntimeUnit(units[0]!) ? [units[0]!] : [];\n}\n\n/**\n * 返回当前执行环境的依赖;显式运行单元不会继承产品级依赖。\n * 只有没有 units 的简单插件才读取历史 product-level dependencies。\n */\nexport function dependenciesOfManifest(\n manifest: PluginManifest,\n runtime?: RuntimeKind,\n): PluginDependency[] {\n const byCapability = new Map<string, PluginDependency>();\n const add = (dependency: PluginDependency) => {\n const previous = byCapability.get(dependency.capability);\n if (!previous || (previous.optional === true && dependency.optional !== true)) {\n byCapability.set(dependency.capability, { ...dependency });\n }\n };\n const units = manifest.units ?? [];\n if (units.length > 1 && runtime === undefined) return [];\n const selectedUnits = selectedRuntimeUnits(manifest, runtime);\n if (units.length > 0 && selectedUnits.length === 0) return [];\n if (units.length === 0) {\n for (const dependency of manifest.dependencies ?? []) add(dependency);\n } else {\n for (const unit of selectedUnits) {\n for (const dependency of unit.dependencies ?? []) add(dependency);\n }\n }\n return [...byCapability.values()];\n}\n\n/** 返回当前执行环境提供的 capability;显式单元不会继承产品级摘要。 */\nexport function providesOfManifest(\n manifest: PluginManifest,\n runtime?: RuntimeKind,\n): string[] {\n const units = manifest.units ?? [];\n if (units.length > 1 && runtime === undefined) return [];\n return unique([\n ...(units.length === 0 ? (manifest.provides ?? []) : []),\n ...selectedRuntimeUnits(manifest, runtime).flatMap((unit) => unit.provides ?? []),\n ]);\n}\n\ninterface RuntimeUnitProvider {\n pluginId: string;\n unitId: string;\n runtime: RuntimeKind;\n contractVersion?: string;\n}\n\n/** 从完整产品描述中找显式运行单元 Provider;允许消费者跨环境依赖。 */\nfunction runtimeUnitProviders(\n manifests: readonly PluginManifest[],\n capability: string\n): RuntimeUnitProvider[] {\n const providers: RuntimeUnitProvider[] = [];\n for (const manifest of manifests) {\n for (const unit of manifest.units ?? []) {\n if (!unit.provides?.includes(capability)) continue;\n if (!isRuntimeUnit(unit)) continue;\n providers.push({\n pluginId: manifest.id,\n unitId: unit.id,\n runtime: unit.runtime,\n contractVersion: unit.providedContracts?.[capability],\n });\n }\n }\n return providers;\n}\n\nfunction matchingRuntimeUnitProviders(\n manifests: readonly PluginManifest[],\n dependency: RuntimeUnitDependency\n): RuntimeUnitProvider[] {\n return runtimeUnitProviders(manifests, dependency.capability).filter((provider) =>\n provider.runtime === dependency.sourceRuntime\n && provider.contractVersion === dependency.contractVersion\n );\n}\n\nfunction runtimeDependenciesForValidation(\n manifest: PluginManifest,\n runtime?: RuntimeKind,\n): RuntimeUnitDependency[] {\n const units = manifest.units ?? [];\n const selected = runtime === undefined\n ? units\n : units.filter((unit) => unitRuntime(unit) === runtime);\n return selected.flatMap((unit) => unit.dependencies ?? []);\n}\n\n/** 从 manifest 列表构造依赖、提供者和反向依赖。 */\nexport function buildPluginGraph(\n manifests: PluginManifest[],\n options: BuildPluginGraphOptions = {}\n): PluginGraph {\n const provides: Record<string, string[]> = {};\n const dependencies: Record<string, string[]> = {};\n const optionalDependencies: Record<string, string[]> = {};\n const dependencyDetails: Record<string, PluginDependency[]> = {};\n const providers: Record<string, string[]> = {};\n const unitGraph: Record<string, PluginUnitGraph> = {};\n const enabled = options.enabledPluginIds;\n\n for (const manifest of manifests) {\n const selectedUnits = selectedRuntimeUnits(manifest, options.runtime);\n const provided = providesOfManifest(manifest, options.runtime);\n const dependencyEntries = dependenciesOfManifest(manifest, options.runtime);\n dependencyDetails[manifest.id] = dependencyEntries.map((dependency) => ({ ...dependency }));\n const deps = unique(dependencyEntries.map((dependency) => dependency.capability));\n optionalDependencies[manifest.id] = unique(\n dependencyEntries\n .filter((dependency) => dependency.optional)\n .map((dependency) => dependency.capability)\n );\n provides[manifest.id] = provided;\n dependencies[manifest.id] = deps;\n for (const unit of selectedUnits) {\n const unitKey = `${manifest.id}:${unit.id}`;\n unitGraph[unitKey] = {\n pluginId: manifest.id,\n unitId: unit.id,\n runtime: unit.runtime,\n dependencies: unique((unit.dependencies ?? []).map((dependency) => dependency.capability)),\n dependencyDetails: (unit.dependencies ?? []).map((dependency) => ({ ...dependency })),\n provides: unique(unit.provides ?? []),\n providedContracts: unit.providedContracts ? { ...unit.providedContracts } : undefined,\n };\n }\n for (const capability of provided) {\n (providers[capability] ??= []).push(manifest.id);\n }\n }\n\n const providerByCapability = new Map<string, string[]>();\n for (const [capability, pluginIds] of Object.entries(providers)) {\n providerByCapability.set(capability, pluginIds);\n }\n\n const reverse: Record<string, PluginReverseDep[]> = {};\n for (const manifest of manifests) {\n const dependentEnabled = enabled?.has(manifest.id) ?? manifest.meta.defaultEnabled;\n for (const capability of dependencies[manifest.id] ?? []) {\n // 可选服务只影响局部功能,不应让其 Provider 停掉整个产品。\n if (optionalDependencies[manifest.id]?.includes(capability)) continue;\n for (const providerId of providerByCapability.get(capability) ?? []) {\n if (providerId === manifest.id) continue;\n const entries = (reverse[providerId] ??= []);\n let entry = entries.find((item) => item.pluginId === manifest.id);\n if (!entry) {\n entry = { pluginId: manifest.id, enabled: dependentEnabled, capabilities: [] };\n entries.push(entry);\n }\n if (!entry.capabilities.includes(capability)) entry.capabilities.push(capability);\n }\n }\n }\n\n const cycles: string[][] = [];\n // capability -> provider 取第一个只用于诊断路径;重复 provider 会由\n // validatePluginGraph 单独报错,不能在这里静默抢占。\n const firstProvider = new Map<string, string>();\n for (const [capability, pluginIds] of providerByCapability) {\n if (pluginIds[0]) firstProvider.set(capability, pluginIds[0]);\n }\n const visited = new Set<string>();\n const path: string[] = [];\n const visit = (pluginId: string) => {\n if (visited.has(pluginId)) return;\n const position = path.indexOf(pluginId);\n if (position >= 0) {\n const cycle = [...path.slice(position), pluginId];\n if (!cycles.some((item) => item.join(\"\\0\") === cycle.join(\"\\0\"))) cycles.push(cycle);\n return;\n }\n path.push(pluginId);\n const manifest = manifests.find((item) => item.id === pluginId);\n if (!manifest) {\n path.pop();\n visited.add(pluginId);\n return;\n }\n for (const dependency of dependenciesOfManifest(manifest, options.runtime)) {\n if (dependency.optional) continue;\n const provider = firstProvider.get(dependency.capability);\n if (provider) visit(provider);\n }\n path.pop();\n visited.add(pluginId);\n };\n for (const manifest of manifests) visit(manifest.id);\n\n return {\n plugins: manifests.map((manifest) => manifest.id),\n dependencies,\n optionalDependencies,\n provides,\n reverse,\n providers,\n dependencyDetails,\n cycles,\n units: unitGraph,\n };\n}\n\n/** 在任何 setup 前校验重复提供、缺失硬依赖和硬依赖环。 */\nexport function validatePluginGraph(\n manifests: readonly PluginManifest[],\n options: ValidatePluginGraphOptions = {}\n): PluginGraph {\n const diagnostics: PluginGraphDiagnostic[] = [];\n diagnostics.push(...validateRuntimeUnitDependencyContracts(manifests));\n const ids = new Set<string>();\n for (const manifest of manifests) {\n if (ids.has(manifest.id)) {\n diagnostics.push({\n code: \"plugin.duplicate_id\",\n ids: [manifest.id],\n message: `插件标识 \"${manifest.id}\" 重复,无法确定唯一运行实例`,\n });\n }\n ids.add(manifest.id);\n }\n\n const graph = buildPluginGraph([...manifests], options);\n const builtins = options.builtinCapabilities ?? new Set<string>();\n const multiProvider = options.multiProviderCapabilities ?? new Set<string>();\n for (const [capability, pluginIds] of Object.entries(graph.providers ?? {})) {\n if (pluginIds.length > 1 && !multiProvider.has(capability)) {\n diagnostics.push({\n code: \"capability.duplicate_provider\",\n ids: [capability, ...pluginIds],\n message: `能力 \"${capability}\" 有多个提供者(${pluginIds.join(\", \")}),但未声明专用 Provider Registry`,\n });\n }\n }\n // 运行单元依赖不能沿用产品级“同名 capability 即可”的兼容规则。\n // Provider 必须同时声明 Runtime 和 providedContracts 版本;\n // sourceRuntime 可以指向当前图之外的 Worker,因此这里故意在完整\n // manifest 集合上查找,而不是只看当前 Window Host 的 providers。\n for (const manifest of manifests) {\n const strictDependencies = runtimeDependenciesForValidation(manifest, options.runtime);\n for (const dependency of strictDependencies) {\n if (dependency.optional) continue;\n // Window Host 不应因为 Worker manifest 不在本地 bundle 而在注册阶段\n // 失败。这里仅放过“来源 Runtime 不同”的依赖;精确 capability、版本和\n // 当前 provider 身份仍由 remoteServiceReferences/bridge 在运行时检查。\n if (options.externalRuntimeDependencies\n && options.runtime !== undefined\n && dependency.sourceRuntime !== options.runtime) {\n continue;\n }\n const matches = matchingRuntimeUnitProviders(manifests, dependency);\n if (matches.length > 0) {\n if (matches.length > 1 && !multiProvider.has(dependency.capability)) {\n diagnostics.push({\n code: \"capability.duplicate_provider\",\n ids: [dependency.capability, ...matches.map((provider) => `${provider.pluginId}:${provider.unitId}`)],\n message: `能力 \"${dependency.capability}\" 的运行单元契约有多个匹配 Provider(${matches.map((provider) => `${provider.pluginId}:${provider.unitId}`).join(\", \")}),但未声明专用 Provider Registry`,\n });\n }\n continue;\n }\n const candidates = runtimeUnitProviders(manifests, dependency.capability);\n // Host 注入的 builtin capability 没有 manifest Provider,但已经在\n // 当前装配环境内完成契约注册;它不应被误判成缺少远程 Provider。\n if (builtins.has(dependency.capability) && candidates.length === 0) {\n continue;\n }\n if (candidates.length > 0) {\n diagnostics.push({\n code: \"plugin.dependency_contract_unavailable\",\n ids: [manifest.id, dependency.capability],\n message: `插件 \"${manifest.id}\" 的运行单元依赖 \"${dependency.capability}\" 没有匹配的契约版本、来源环境或作用域`,\n });\n } else if (!options.allowMissingDependencies) {\n diagnostics.push({\n code: \"plugin.missing_dependency\",\n ids: [manifest.id, dependency.capability],\n message: `插件 \"${manifest.id}\" 缺少硬依赖能力 \"${dependency.capability}\"`,\n });\n }\n }\n }\n for (const manifest of manifests) {\n const strictDependencyCapabilities = new Set(\n runtimeDependenciesForValidation(manifest, options.runtime).map((dependency) => dependency.capability)\n );\n for (const dependency of dependenciesOfManifest(manifest, options.runtime)) {\n if (dependency.optional) continue;\n // 上面的严格运行单元校验已经处理了精确契约;这里仅保留没有\n // units 的简单插件 product-level dependencies 兼容逻辑。\n if (strictDependencyCapabilities.has(dependency.capability)) continue;\n const provided = (graph.providers?.[dependency.capability]?.length ?? 0) > 0\n || builtins.has(dependency.capability);\n if (!provided && !options.allowMissingDependencies) {\n diagnostics.push({\n code: \"plugin.missing_dependency\",\n ids: [manifest.id, dependency.capability],\n message: `插件 \"${manifest.id}\" 缺少硬依赖能力 \"${dependency.capability}\"`,\n });\n }\n }\n }\n for (const cycle of graph.cycles ?? []) {\n diagnostics.push({\n code: \"plugin.dependency_cycle\",\n ids: cycle,\n message: `插件存在硬依赖环:${cycle.join(\" -> \")}`,\n });\n }\n if (diagnostics.length > 0) throw new PluginGraphValidationError(diagnostics);\n return graph;\n}\n\n/** 查询当前启用的逆依赖者;禁用提供者时应按此集合先停止消费者。 */\nexport function reverseDependentsOf(\n graph: PluginGraph,\n pluginId: string,\n enabledSet: ReadonlySet<string>\n): PluginReverseDep[] {\n return (graph.reverse[pluginId] ?? []).filter((dependent) => enabledSet.has(dependent.pluginId));\n}\n","// packages/runtime/src/messageBus.ts\n// MessageBus runtime 实现。\n//\n// 设计缘由:\n// - publish / subscribe 同步调用:与旧 EventBus 行为等价;不 await async handler。\n// - dispatch / request 走 actor mailbox:把消息投递到 target 对应的内部队列,\n// pump 串行消费,跨请求隔离限流、取消与超时。\n// - handle 注册的 handler 不带 target 时走 publish 路径(用于把 publish 强制\n// 路由到具体实现,例如 keyspace 注册的 key.created 处理器)。\n// - publish / handle 不引入任何 React 依赖。\n// - 关键不变量:\n// 1. 每个 MailboxEntry 全生命周期只 settle 一次(唯一终态)。\n// 所有成功、失败、取消都必须经过 settleEntry;它统一维护\n// entry.settled / entry.state / inFlight / completed / failed /\n// canceled / lastError,避免重复计数。\n// 2. pump 是 N 个并发的 worker 循环(默认 N=1),每个 worker 拉取\n// best entry 后 await handler,再 settle。await 是关键的——\n// 旧实现的\"开火-遗忘\"会丢并发上限,让 WOC 的 priority 失效。\n// 3. abort / timeout 触发时,无论 entry 是 queued 还是 running,\n// 都立即 settle 为 canceled。in-flight 立即让 inFlight 归零;\n// handler 后续 resolve/reject 走 settled=true 守卫 no-op。\n// 4. target 并发由 HandlerOptions.concurrency 配置;同 target 全\n// 部 handler 注册时必须使用一致值(否则抛英文错误),缺省 1。\n// - 阶段 1 的 dispatch / request 仅在 handler 带 target 时启用;纯业务\n// 事件保持同步 publish 行为,避免破坏 key.deleting / key.deleted 时序。\n// - 关键不变量:dispatch / request 的 message envelope 会带上 messageBus\n// 内部维护的 signal(= upstream signal + timeout 触发的 ctl),handler\n// 通过 message.signal 监听取消;timeout 触发时先 abort 再 settle。\n\nimport type {\n DispatchOptions,\n EventHandler,\n HandlerOptions,\n Message,\n MessageBus,\n MessageBusSnapshot,\n MessageHandler,\n MessageMode,\n PublishOptions,\n RequestOptions\n} from \"../contracts/messageBus.js\";\n\ntype MailboxState = \"queued\" | \"running\" | \"completed\" | \"failed\" | \"canceled\";\ntype EntrySettleState = \"completed\" | \"failed\" | \"canceled\";\n\ninterface MailboxEntry {\n message: Message;\n signal: AbortSignal;\n /** 标记本 entry 是 dispatch 模式(resolve/reject 即 no-op)还是 request 模式(外层 promise)。 */\n mode: \"command\" | \"request\";\n state: MailboxState;\n settled: boolean;\n resolve: (value: unknown) => void;\n reject: (err: unknown) => void;\n /** settle 时调用:清理 upstream abort listener + clearTimeout + 移除 ctl abort listener。 */\n cleanup: () => void;\n /** 进入任一终态后只调用一次;用于释放调用方的临时生命周期监听。 */\n onSettled?: () => void;\n}\n\ninterface ActorHandler {\n type: string;\n target: string;\n priority: number;\n /** 同 target 投递并发上限;缺省 1。同 target 全部 handler 必须一致。 */\n concurrency: number;\n handler: MessageHandler;\n}\n\ninterface SubscriptionRecord {\n type: string;\n handler: EventHandler;\n}\n\nfunction makeMessageId(): string {\n if (typeof crypto !== \"undefined\" && \"randomUUID\" in crypto) {\n return crypto.randomUUID();\n }\n return `m_${Date.now().toString(36)}_${Math.floor(Math.random() * 1e9).toString(36)}`;\n}\n\nfunction errorMessage(err: unknown): string {\n if (err instanceof Error) return err.message;\n if (typeof err === \"string\") return err;\n return String(err);\n}\n\n/** 单个 handler 允许注册的最大并发数;超过即拒绝注册。 */\nconst MAX_HANDLER_CONCURRENCY = 128;\n\n/**\n * 等待 handler 返回 / 抛错,但允许调用方随时通过 AbortSignal 取消等待。\n * 关键不变量:MessageBus 只能停止等待 handler(释放 worker),不能强制\n * 打断 handler 内部副作用;handler 仍必须监听 `message.signal`。worker\n * 释放后同 target 后续消息可被 pump 立即消费。\n *\n * 同时,原 Promise 仍会被 resolve / reject handler 接管,避免迟到\n * rejection 触发 unhandledRejection。\n */\nfunction waitForHandler(\n result: Promise<unknown>,\n signal: AbortSignal\n): Promise<unknown> {\n if (signal.aborted) {\n return Promise.reject(signal.reason ?? new Error(\"aborted\"));\n }\n\n return new Promise((resolve, reject) => {\n const onAbort = () => {\n reject(signal.reason ?? new Error(\"aborted\"));\n };\n\n signal.addEventListener(\"abort\", onAbort, { once: true });\n\n result.then(resolve, reject).finally(() => {\n signal.removeEventListener(\"abort\", onAbort);\n });\n });\n}\n\nexport function createMessageBus(): MessageBus {\n // event 订阅表:type -> handlers\n const subscriptions = new Map<string, Set<SubscriptionRecord>>();\n // 强制路由表:type -> handler(用于把 publish 路由到具体实现)\n const routedHandlers = new Map<string, ActorHandler>();\n // actor mailbox:target -> queue\n const mailboxes = new Map<string, MailboxEntry[]>();\n // target -> 已注册的 handler 数量;注销时清 0 才删除 targetConcurrency。\n const targetHandlerCount = new Map<string, number>();\n // target -> 该 target 全部 handler 协商的并发上限。\n const targetConcurrency = new Map<string, number>();\n const snapshotListeners = new Set<(s: MessageBusSnapshot) => void>();\n let total = 0;\n let completed = 0;\n let failed = 0;\n let canceled = 0;\n let inFlight = 0;\n let lastError: string | undefined;\n // 正在 pump 的 target 集合:避免重入。\n const pumping = new Set<string>();\n\n function emitSnapshot() {\n const snap = snapshot();\n for (const l of snapshotListeners) l(snap);\n }\n\n function snapshot(): MessageBusSnapshot {\n const byTarget: Record<string, number> = {};\n let queued = 0;\n for (const [target, queue] of mailboxes.entries()) {\n byTarget[target] = queue.length;\n queued += queue.length;\n }\n return {\n total,\n queued,\n inFlight,\n completed,\n failed,\n canceled,\n lastError,\n byTarget\n };\n }\n\n function makeMessage<TPayload>(\n type: string,\n mode: MessageMode,\n payload: TPayload,\n options: { target?: string; priority?: number; timeoutMs?: number; causationId?: string; messageId?: string }\n ): Message<TPayload> {\n return {\n id: options.messageId ?? makeMessageId(),\n type,\n mode,\n payload,\n target: options.target,\n priority: options.priority,\n timeoutMs: options.timeoutMs,\n causationId: options.causationId,\n createdAt: Date.now()\n };\n }\n\n function publishInternal<TPayload>(message: Message<TPayload>): string {\n total += 1;\n // 1) 同步路由:先看 routedHandlers(handle 注册但无 target 时被 publish 视为强制目标)。\n // 带 target 的 handler 属于 actor mailbox,只允许 dispatch/request 触发;\n // publish 主动绕过会让绕过 concurrency / abort / timeout 管控。\n const routed = routedHandlers.get(message.type);\n if (routed && !routed.target) {\n try {\n const result = routed.handler(message as Message);\n if (result && typeof (result as Promise<unknown>).then === \"function\") {\n // 不等待异步 handler;仅记录 lastError。\n (result as Promise<unknown>).catch((err) => {\n failed += 1;\n lastError = errorMessage(err);\n emitSnapshot();\n });\n }\n } catch (err) {\n failed += 1;\n lastError = errorMessage(err);\n }\n }\n // 2) 同步广播给订阅者\n const bucket = subscriptions.get(message.type);\n if (bucket) {\n // 拷贝一份以容忍 handler 中取消订阅。\n for (const sub of [...bucket]) {\n try {\n sub.handler(message.payload);\n } catch (err) {\n failed += 1;\n lastError = errorMessage(err);\n }\n }\n }\n emitSnapshot();\n return message.id;\n }\n\n /**\n * 唯一终态函数。\n * - 守卫:若已 settled,no-op;这是避免重复计数的关键。\n * - 唯一修改 entry.settled / entry.state / inFlight / completed /\n * failed / canceled / lastError 的入口。\n * - 副作用顺序:settled → state → cleanup → 计数 → 快照 → resolve/reject。\n */\n function settleEntry(entry: MailboxEntry, state: EntrySettleState, value?: unknown): void {\n if (entry.settled) return;\n entry.settled = true;\n const wasRunning = entry.state === \"running\";\n entry.state = state;\n entry.cleanup();\n if (state === \"completed\") {\n completed += 1;\n } else if (state === \"failed\") {\n failed += 1;\n lastError = errorMessage(value);\n } else {\n canceled += 1;\n lastError = errorMessage(value ?? entry.signal.reason);\n }\n if (wasRunning) inFlight -= 1;\n emitSnapshot();\n try {\n entry.onSettled?.();\n } catch (err) {\n // 终态清理属于观察/生命周期回调,不能改变已经提交的消息结果。\n lastError = errorMessage(err);\n }\n if (entry.mode === \"request\") {\n if (state === \"completed\") entry.resolve(value);\n else entry.reject(value);\n }\n // dispatch 模式:resolve / reject 即 no-op,调用方拿不到结果。\n }\n\n /**\n * dispatch / request 共享的入队核心。\n * - 找到 handler:消息入 mailbox,pump worker 并发消费。\n * - 找不到 handler:写 lastError + failed;dispatch 静默(return id),\n * request 立即 reject。\n * - signal 已 abort:写 lastError + canceled;dispatch 静默,request 立即 reject。\n * - 内部 ctl 由 MessageBus 维护,组合 upstream signal + timeout;handler\n * 通过 message.signal 监听。\n * - abort listener 统一处理:queued 移除 mailbox、running 仍 settle,\n * 两者都走 settleEntry(\"canceled\")。handler 后续 resolve/reject 因\n * settled=true 全部 no-op。\n */\n function enqueueMessage(message: Message, mode: \"command\" | \"request\", signal: AbortSignal | undefined, onSettled?: () => void): string | Promise<unknown> {\n total += 1;\n const target = message.target;\n if (!target) {\n failed += 1;\n lastError = `MessageBus.${mode === \"request\" ? \"request\" : \"dispatch\"} requires a target`;\n emitSnapshot();\n try { onSettled?.(); } catch { /* 生命周期清理不能阻断错误结果 */ }\n return mode === \"request\" ? Promise.reject(new Error(lastError)) : message.id;\n }\n const handler = routedHandlers.get(message.type);\n if (!handler || handler.target !== target) {\n failed += 1;\n lastError = `No handler registered for type \"${message.type}\" at target \"${target}\"`;\n emitSnapshot();\n try { onSettled?.(); } catch { /* 生命周期清理不能阻断错误结果 */ }\n return mode === \"request\" ? Promise.reject(new Error(lastError)) : message.id;\n }\n if (signal?.aborted) {\n canceled += 1;\n lastError = errorMessage(signal.reason ?? new Error(\"aborted\"));\n emitSnapshot();\n try { onSettled?.(); } catch { /* 生命周期清理不能阻断错误结果 */ }\n return mode === \"request\" ? Promise.reject(signal.reason ?? new Error(\"aborted\")) : message.id;\n }\n\n const ctl = new AbortController();\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n const onUpstreamAbort = () => {\n ctl.abort(signal?.reason ?? new Error(\"aborted\"));\n };\n if (signal) {\n signal.addEventListener(\"abort\", onUpstreamAbort, { once: true });\n }\n if (typeof message.timeoutMs === \"number\" && message.timeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n ctl.abort(new Error(\"MessageBus.request timeout\"));\n }, message.timeoutMs);\n }\n // 把 messageBus 维护的 ctl.signal 注入 envelope,handler 监听它。\n const stamped: Message = { ...message, signal: ctl.signal };\n const mailbox = mailboxes.get(target) ?? [];\n mailboxes.set(target, mailbox);\n\n return new Promise<unknown>((resolve, reject) => {\n const entry: MailboxEntry = {\n message: stamped,\n signal: ctl.signal,\n mode,\n state: \"queued\",\n settled: false,\n resolve: (v) => resolve(v),\n reject: (e) => reject(e),\n onSettled,\n cleanup: () => {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n if (signal) signal.removeEventListener(\"abort\", onUpstreamAbort);\n ctl.signal.removeEventListener(\"abort\", onAbort);\n }\n };\n function onAbort() {\n // 关键不变量:queued 移除 mailbox;running 不动 mailbox。\n // 两者都立即 settle 为 canceled。in-flight 由此让 inFlight 归零。\n if (entry.state === \"queued\") {\n const idx = mailbox.indexOf(entry);\n if (idx >= 0) {\n mailbox.splice(idx, 1);\n }\n }\n settleEntry(entry, \"canceled\", ctl.signal.reason ?? new Error(\"aborted\"));\n }\n ctl.signal.addEventListener(\"abort\", onAbort, { once: true });\n mailbox.push(entry);\n emitSnapshot();\n schedulePump(target);\n });\n }\n\n function schedulePump(target: string) {\n if (pumping.has(target)) return;\n const mailbox = mailboxes.get(target);\n if (!mailbox || mailbox.length === 0) return;\n pumping.add(target);\n if (typeof queueMicrotask === \"function\") {\n queueMicrotask(() => {\n void runPump(target);\n });\n } else {\n Promise.resolve().then(() => {\n void runPump(target);\n });\n }\n }\n\n /**\n * Pump 顶层:N 个 worker 并行 await handler。N 由 targetConcurrency\n * 决定,缺省 1。所有 worker 退出后再 cleanup;若有新 entry 在退出前\n * 入 mailbox,finally 阶段重新 schedulePump。\n */\n async function runPump(target: string) {\n const concurrency = targetConcurrency.get(target) ?? 1;\n const workers: Promise<void>[] = [];\n for (let i = 0; i < concurrency; i += 1) {\n workers.push(workerLoop(target, i));\n }\n try {\n await Promise.all(workers);\n } finally {\n pumping.delete(target);\n // Race: enqueueMessage 可能在该 worker 退出后、finally 之前压入新 entry。\n const mailbox = mailboxes.get(target);\n if (mailbox && mailbox.length > 0) {\n schedulePump(target);\n }\n emitSnapshot();\n }\n }\n\n async function workerLoop(target: string, workerId: number) {\n // 每个 worker 持续拉 best entry;mailbox 空则本 worker 退出。\n // 其他 worker 仍在跑;Promise.all 等所有 worker 退出后才回收 pump。\n void workerId;\n while (true) {\n const entry = pickBestEntry(target);\n if (!entry) return;\n await processEntry(target, entry);\n }\n }\n\n function pickBestEntry(target: string): MailboxEntry | undefined {\n const mailbox = mailboxes.get(target);\n if (!mailbox || mailbox.length === 0) return undefined;\n let bestIdx = -1;\n let bestEntry: MailboxEntry | undefined;\n for (let i = 0; i < mailbox.length; i += 1) {\n const cur = mailbox[i]!;\n // 防御:onAbort 已把 queued 移除;运行中不会被 pickBest 看到。\n if (cur.settled) continue;\n if (!bestEntry) {\n bestEntry = cur;\n bestIdx = i;\n continue;\n }\n const bestPriority = (bestEntry.message.priority ?? 0) as number;\n const curPriority = (cur.message.priority ?? 0) as number;\n if (curPriority > bestPriority ||\n (curPriority === bestPriority && cur.message.createdAt < bestEntry.message.createdAt)) {\n bestEntry = cur;\n bestIdx = i;\n }\n }\n if (bestEntry && bestIdx >= 0) {\n mailbox.splice(bestIdx, 1);\n }\n return bestEntry;\n }\n\n async function processEntry(target: string, entry: MailboxEntry): Promise<void> {\n // pickBestEntry 已把 entry 移出 mailbox。此处 settled 可能为 true\n // (abort listener 在我们执行 sync 块之前已跑完)。但 JS 单线程\n // 保证了下面的赋值与 abort listener 不会在中间插入。\n if (entry.settled) return;\n entry.state = \"running\";\n inFlight += 1;\n emitSnapshot();\n const handler = routedHandlers.get(entry.message.type);\n if (!handler) {\n settleEntry(entry, \"failed\", new Error(`No handler for type \"${entry.message.type}\"`));\n return;\n }\n try {\n const result = handler.handler(entry.message as Message);\n if (result && typeof (result as Promise<unknown>).then === \"function\") {\n // waitForHandler:abort 触发时只停止等待并立即 settle 为 canceled;\n // handler 内部副作用由 handler 自己监听 message.signal 取消。\n // 原 Promise 仍由 waitForHandler 接管,避免迟到 rejection 触发\n // unhandledRejection。\n const v = await waitForHandler(\n result as Promise<unknown>,\n entry.signal\n );\n // 关键:await 期间 abort 可能已触发并 settle 为 canceled;本调用 no-op。\n if (entry.signal.aborted) {\n settleEntry(entry, \"canceled\", entry.signal.reason);\n } else {\n settleEntry(entry, \"completed\", v);\n }\n } else {\n if (entry.signal.aborted) {\n settleEntry(entry, \"canceled\", entry.signal.reason);\n } else {\n settleEntry(entry, \"completed\", result);\n }\n }\n } catch (err) {\n if (entry.signal.aborted) {\n // 关键:abort 优先,错误信息不污染 lastError。\n settleEntry(entry, \"canceled\", entry.signal.reason ?? err);\n } else {\n settleEntry(entry, \"failed\", err);\n }\n }\n }\n\n const bus: MessageBus = {\n publish<TPayload>(type: string, payload: TPayload, options?: PublishOptions): string {\n const message = makeMessage<TPayload>(type, \"event\", payload, {\n causationId: options?.causationId,\n messageId: options?.messageId\n });\n return publishInternal(message);\n },\n\n subscribe<TPayload>(type: string, handler: EventHandler<TPayload>): () => void {\n const record: SubscriptionRecord = { type, handler: handler as EventHandler };\n let bucket = subscriptions.get(type);\n if (!bucket) {\n bucket = new Set();\n subscriptions.set(type, bucket);\n }\n bucket.add(record);\n return () => {\n bucket?.delete(record);\n };\n },\n\n dispatch<TPayload>(type: string, payload: TPayload, options: DispatchOptions): string {\n const message = makeMessage<TPayload>(type, \"command\", payload, {\n target: options.target,\n priority: options.priority,\n timeoutMs: options.timeoutMs,\n causationId: options.causationId,\n messageId: options.messageId\n });\n const result = enqueueMessage(message, \"command\", options.signal, options.onSettled);\n // enqueueMessage 在 command 模式下不会 reject;但类型系统要求同步返回 string。\n if (typeof result === \"string\") return result;\n // 防御:理论上 command 模式只会返回 string。\n return message.id;\n },\n\n request<TPayload, TResult>(type: string, payload: TPayload, options: RequestOptions): Promise<TResult> {\n const message = makeMessage<TPayload>(type, \"request\", payload, {\n target: options.target,\n priority: options.priority,\n timeoutMs: options.timeoutMs,\n causationId: options.causationId,\n messageId: options.messageId\n });\n const result = enqueueMessage(message, \"request\", options.signal, options.onSettled);\n if (typeof result === \"string\") {\n return Promise.reject(new Error(\"MessageBus.request returned a string id unexpectedly\"));\n }\n return result as Promise<TResult>;\n },\n\n handle<TPayload, TResult>(type: string, handler: MessageHandler<TPayload, TResult>, options?: HandlerOptions): () => void {\n // 关键不变量:校验必须发生在修改 routedHandlers / targetConcurrency /\n // targetHandlerCount / mailboxes 之前,避免注册失败后留下半初始化状态。\n const concurrency = options?.concurrency ?? 1;\n if (\n !Number.isFinite(concurrency) ||\n !Number.isInteger(concurrency) ||\n concurrency <= 0\n ) {\n throw new Error(\"Handler concurrency must be a positive integer\");\n }\n if (concurrency > MAX_HANDLER_CONCURRENCY) {\n throw new Error(\n `Handler concurrency must not exceed ${MAX_HANDLER_CONCURRENCY}`\n );\n }\n const record: ActorHandler = {\n type,\n target: options?.target ?? \"\",\n priority: options?.priority ?? 0,\n concurrency,\n handler: handler as MessageHandler\n };\n if (routedHandlers.has(type)) {\n throw new Error(`Handler for \"${type}\" is already registered`);\n }\n if (record.target) {\n // 同 target 全部 handler 必须使用一致 concurrency。\n const existing = targetConcurrency.get(record.target);\n if (existing !== undefined && existing !== concurrency) {\n throw new Error(`Conflicting concurrency for target \"${record.target}\"`);\n }\n targetConcurrency.set(record.target, concurrency);\n targetHandlerCount.set(record.target, (targetHandlerCount.get(record.target) ?? 0) + 1);\n if (!mailboxes.has(record.target)) {\n mailboxes.set(record.target, []);\n }\n // 已有 enqueue 的消息可以直接 pump。\n schedulePump(record.target);\n }\n routedHandlers.set(type, record);\n return () => {\n if (routedHandlers.get(type) === record) {\n routedHandlers.delete(type);\n if (record.target) {\n const count = (targetHandlerCount.get(record.target) ?? 1) - 1;\n if (count <= 0) {\n targetHandlerCount.delete(record.target);\n targetConcurrency.delete(record.target);\n } else {\n targetHandlerCount.set(record.target, count);\n }\n }\n }\n };\n },\n\n snapshot,\n onSnapshot(handler) {\n snapshotListeners.add(handler);\n handler(snapshot());\n return () => snapshotListeners.delete(handler);\n }\n };\n\n return bus;\n}\n","// 轻量生命周期作用域实现。\n//\n// 该模块刻意不依赖 React、Node、Worker 或 Cordis。它只负责三件事:\n// 1. 给运行实例生成不可复用的身份;\n// 2. 在同步 revoke 后立即阻止新资源,并通过 AbortSignal 通知资源;\n// 3. 尽力执行所有异步清理,返回可观测的失败/超时结果。\n//\n// 它不是安全沙箱:同源代码仍可能拿到自己的全局对象。权限安全必须在\n// Host、RPC 和最终存储/签名边界重复校验。\n\nimport type {\n LifecycleCleanup,\n LifecycleCleanupPhase,\n LifecycleCleanupIssue,\n LifecycleDisposeOptions,\n LifecycleDisposeResult,\n LifecycleResourceHandle,\n LifecycleResourceSnapshot,\n LifecycleScope,\n LifecycleScopeIdentity,\n LifecycleScopeKind,\n LifecycleScopeState,\n} from \"../contracts/lifecycle.js\";\nimport { LifecycleScopeRevokedError } from \"../contracts/lifecycle.js\";\n\ntype ResourceState = LifecycleResourceSnapshot[\"state\"];\n\ninterface ResourceEntry {\n resourceId: string;\n state: ResourceState;\n cleanup: LifecycleCleanup;\n phase: LifecycleCleanupPhase;\n /** 清理是否已经开始;防止重复释放同一个底层句柄。 */\n cleanupStarted: boolean;\n /** 清理回调是否已经返回;超时后可能仍为 false。 */\n cleanupFinished: boolean;\n /** 清理 Promise,供重复 release 调用共享。 */\n cleanupPromise?: Promise<void>;\n /** 获取资源失败后从作用域中移除。 */\n removeOnFailure: boolean;\n /** 迟到资源的释放失败;不能被先前的空清理回调覆盖成 released。 */\n lateReleaseFailed?: boolean;\n /** acquire 尚未完成时,dispose 必须等待创建结果再决定是否释放。 */\n acquisitionDone?: Promise<void>;\n /** 子作用域是父作用域的一等资源,清理结果必须向父级聚合。 */\n childScope?: LifecycleScope;\n /** 最近一次子作用域停止结果;迟到清理会原地更新同一对象。 */\n childResult?: LifecycleDisposeResult;\n error?: string;\n}\n\nexport interface CreateResourceScopeOptions {\n /** 可选固定作用域标识;生产代码通常省略,让实现生成不可复用 ID。 */\n scopeId?: string;\n /** 运行实例标识;省略时与 scopeId 同源生成。 */\n instanceId?: string;\n /** 作用域类型。 */\n kind: LifecycleScopeKind;\n /** 绑定插件和宿主只读属性。 */\n metadata?: Omit<Partial<LifecycleScopeIdentity>, \"scopeId\" | \"instanceId\" | \"kind\">;\n /** 测试或宿主诊断使用的状态变更回调。 */\n onChange?: (scope: LifecycleScope) => void;\n /** 子作用域生成最终清理结果后的内部通知;用于更新父级登记。 */\n onDisposeResult?: (result: LifecycleDisposeResult) => void;\n}\n\nfunction makeId(prefix: string): string {\n try {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return `${prefix}:${crypto.randomUUID()}`;\n }\n } catch {\n // 某些 Worker/测试环境没有可用的 Web Crypto;下面的随机值只用于身份\n // 去重,不承担密码学安全语义。\n }\n return `${prefix}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`;\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n return typeof error === \"string\" ? error : String(error);\n}\n\nfunction isPositiveFiniteNumber(value: number | undefined): value is number {\n return value !== undefined && Number.isFinite(value) && value >= 0;\n}\n\n/**\n * 创建一个可嵌套的生命周期作用域。\n *\n * `createResourceScope` 是 `createLifecycleScope` 的同义入口,方便不同\n * 模块按“作用域”或“资源”语义调用;两者不代表两套实现。\n */\nexport function createLifecycleScope(options: CreateResourceScopeOptions): LifecycleScope {\n const identity: LifecycleScopeIdentity = {\n scopeId: options.scopeId ?? makeId(`scope:${options.kind}`),\n instanceId: options.instanceId ?? makeId(\"instance\"),\n kind: options.kind,\n attributes: {},\n ...options.metadata,\n };\n const controller = new AbortController();\n const revokeListeners = new Set<(reason: string) => void>();\n const entries = new Map<string, ResourceEntry>();\n const usedIds = new Set<string>();\n let currentState: LifecycleScopeState = \"active\";\n let revokeReason = \"scope revoked\";\n let disposalPromise: Promise<LifecycleDisposeResult> | undefined;\n /** 父作用域清理已经返回后,子作用域迟到收敛时刷新父级结果。 */\n let refreshPublishedDisposeResult: (() => void) | undefined;\n const disposeResultNotifier = options.onDisposeResult;\n\n const notifyChange = (scope: LifecycleScope) => {\n try {\n options.onChange?.(scope);\n } catch {\n // 诊断回调不能改变生命周期结果。\n }\n };\n\n const publicScope = {} as LifecycleScope;\n\n function uniqueResourceId(resourceId: string | undefined): string {\n const base = resourceId && resourceId.length > 0 ? resourceId : makeId(\"resource\");\n if (!usedIds.has(base)) {\n usedIds.add(base);\n return base;\n }\n let index = 2;\n while (usedIds.has(`${base}#${index}`)) index += 1;\n const unique = `${base}#${index}`;\n usedIds.add(unique);\n return unique;\n }\n\n function assertActive(): void {\n if (currentState !== \"active\") {\n throw new LifecycleScopeRevokedError(\n `Lifecycle scope \"${identity.scopeId}\" is ${currentState}`\n );\n }\n }\n\n function addEntry(\n resourceId: string | undefined,\n cleanup: LifecycleCleanup,\n state: ResourceState,\n removeOnFailure = false,\n phase: LifecycleCleanupPhase = \"before-teardown\"\n ): ResourceEntry {\n assertActive();\n const entry: ResourceEntry = {\n resourceId: uniqueResourceId(resourceId),\n state,\n cleanup,\n phase,\n cleanupStarted: false,\n cleanupFinished: false,\n removeOnFailure,\n };\n entries.set(entry.resourceId, entry);\n notifyChange(publicScope);\n return entry;\n }\n\n function releaseEntry(entry: ResourceEntry, reason: string): Promise<void> {\n if (entry.cleanupPromise) return entry.cleanupPromise;\n entry.cleanupStarted = true;\n entry.cleanupPromise = Promise.resolve()\n .then(() => entry.cleanup(reason))\n .then(() => {\n entry.cleanupFinished = true;\n if (!entry.lateReleaseFailed) {\n entry.state = \"released\";\n entry.error = undefined;\n }\n notifyChange(publicScope);\n })\n .catch((error) => {\n entry.cleanupFinished = true;\n // 失败项保留为 pending,便于状态页和后续恢复逻辑发现;不再次\n // 隐式调用不幂等的外部清理函数。\n entry.state = \"pending\";\n entry.error = errorMessage(error);\n notifyChange(publicScope);\n throw error;\n });\n // 即使调用方只触发同步 revoke,也必须接住迟到 rejection。\n entry.cleanupPromise.catch(() => undefined);\n return entry.cleanupPromise;\n }\n\n function track<T>(\n resource: T,\n release: (value: T, reason: string) => void | Promise<void>,\n resourceId?: string\n ): T {\n if (currentState !== \"active\") {\n // 资源已经在 stopping 之后返回:不允许发布到旧作用域,同时尽力\n // 释放它。这里不会把释放错误变成未处理 Promise。\n void Promise.resolve()\n .then(() => release(resource, revokeReason))\n .catch(() => undefined);\n throw new LifecycleScopeRevokedError();\n }\n let released = false;\n addEntry(\n resourceId,\n async (reason) => {\n if (released) return;\n released = true;\n await release(resource, reason);\n },\n \"active\"\n );\n return resource;\n }\n\n function acquire<T>(\n resourceId: string,\n create: (signal: AbortSignal) => T | Promise<T>,\n release: (resource: T, reason: string) => void | Promise<void>\n ): Promise<T> {\n assertActive();\n let resource: T | undefined;\n let hasResource = false;\n let released = false;\n let resolveAcquisition!: () => void;\n let rejectAcquisition!: (error: unknown) => void;\n let acquisitionSettled = false;\n const acquisitionDone = new Promise<void>((resolve, reject) => {\n resolveAcquisition = () => {\n if (acquisitionSettled) return;\n acquisitionSettled = true;\n resolve();\n };\n rejectAcquisition = (error) => {\n if (acquisitionSettled) return;\n acquisitionSettled = true;\n reject(error);\n };\n });\n // dispose 可能没有被调用,或者 timeout 后不再等待;仍需接住这个\n // 内部等待 Promise 的迟到失败,不能制造 unhandled rejection。\n acquisitionDone.catch(() => undefined);\n const entry = addEntry(\n resourceId,\n async (reason) => {\n // 不能在创建尚未结束时直接返回:否则 dispose 会把 acquiring\n // 资源伪装成 released,迟到资源随后发生的释放失败也无法进入\n // 本次清理链。timeout 由 runEntry 负责把仍未完成项标成 pending。\n await acquisitionDone;\n if (!hasResource || released) return;\n released = true;\n await release(resource as T, reason);\n },\n \"acquiring\",\n true,\n \"before-teardown\"\n );\n entry.acquisitionDone = acquisitionDone;\n\n return Promise.resolve()\n .then(() => create(controller.signal))\n .then(async (created) => {\n resource = created;\n hasResource = true;\n if (currentState !== \"active\" || controller.signal.aborted || entry.cleanupStarted) {\n // dispose 可能在 create() 等待期间已经开始;此时由 acquire 自己\n // 接管迟到资源。entry.cleanup 正在等待 acquisitionDone,因此不会\n // 与这里的释放形成互相等待。\n if (!released) {\n released = true;\n try {\n await release(created, revokeReason);\n } catch (error) {\n entry.lateReleaseFailed = true;\n entry.state = \"pending\";\n entry.error = errorMessage(error);\n notifyChange(publicScope);\n rejectAcquisition(error);\n throw error;\n }\n }\n entry.state = \"released\";\n resolveAcquisition();\n notifyChange(publicScope);\n throw new LifecycleScopeRevokedError(\n `Resource \"${entry.resourceId}\" completed after scope revoke`\n );\n }\n entry.state = \"active\";\n entry.removeOnFailure = false;\n resolveAcquisition();\n notifyChange(publicScope);\n return created;\n })\n .catch((error) => {\n if (!hasResource) {\n // 创建失败不是资源释放失败;让正在等待的 dispose 继续完成,\n // 同时保留原始 create 错误给 acquire 调用方。\n resolveAcquisition();\n entries.delete(entry.resourceId);\n usedIds.delete(entry.resourceId);\n }\n throw error;\n });\n }\n\n function onDispose(\n cleanup: LifecycleCleanup,\n resourceId?: string,\n phase: LifecycleCleanupPhase = \"before-teardown\"\n ): () => void {\n if (currentState !== \"active\") {\n // 异步回调在停止后才拿到释放责任时,不能把 disposer 丢在旧作用域\n // 外面;立即执行一次,并吞掉异常交给调用方之外的可观测层处理。\n void Promise.resolve()\n .then(() => cleanup(revokeReason))\n .catch(() => undefined);\n return () => undefined;\n }\n const entry = addEntry(resourceId, cleanup, \"active\", false, phase);\n return () => {\n if (entry.cleanupStarted || entry.cleanupFinished) return;\n entries.delete(entry.resourceId);\n usedIds.delete(entry.resourceId);\n notifyChange(publicScope);\n };\n }\n\n function onRevoke(listener: (reason: string) => void): () => void {\n if (currentState === \"active\") {\n revokeListeners.add(listener);\n return () => revokeListeners.delete(listener);\n }\n try {\n listener(revokeReason);\n } catch {\n // 观察者错误不影响撤权。\n }\n return () => undefined;\n }\n\n function revoke(reason = \"scope revoked\"): void {\n if (currentState !== \"active\") return;\n revokeReason = reason;\n currentState = \"stopping\";\n // 先改状态再 abort,任何 abort listener 都只能看到 stopping,不能\n // 在回调里继续注册资源。\n try {\n controller.abort(new LifecycleScopeRevokedError(reason));\n } catch {\n controller.abort();\n }\n for (const listener of [...revokeListeners]) {\n try {\n listener(reason);\n } catch {\n // 其它撤权监听仍必须执行。\n }\n }\n notifyChange(publicScope);\n }\n\n async function runEntry(\n entry: ResourceEntry,\n reason: string,\n timeoutMs: number | undefined,\n issues: LifecycleCleanupIssue[],\n onLateSuccess?: (entry: ResourceEntry) => void,\n onLateFailure?: (entry: ResourceEntry, error: unknown) => void\n ): Promise<\"released\" | \"pending\"> {\n if (entry.cleanupFinished && entry.state === \"released\") return \"released\";\n const cleanup = releaseEntry(entry, reason);\n if (!isPositiveFiniteNumber(timeoutMs)) {\n try {\n await cleanup;\n return entry.state === \"released\" ? \"released\" : \"pending\";\n } catch (error) {\n issues.push({\n resourceId: entry.resourceId,\n code: \"lifecycle.cleanup_failed\",\n message: errorMessage(error),\n });\n return \"pending\";\n }\n }\n\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n const timeout = new Promise<\"timeout\">((resolve) => {\n timeoutHandle = setTimeout(() => resolve(\"timeout\"), timeoutMs);\n });\n const result = await Promise.race([\n cleanup.then(() => \"released\" as const, (error) => ({ error })),\n timeout,\n ]);\n if (timeoutHandle) clearTimeout(timeoutHandle);\n if (result === \"timeout\") {\n entry.state = \"pending\";\n issues.push({\n resourceId: entry.resourceId,\n code: \"lifecycle.cleanup_timeout\",\n message: `Cleanup timed out after ${timeoutMs}ms`,\n });\n // dispose() 已经可以按超时返回,但 acquiring 资源的真实创建/释放\n // 仍可能稍后结束。若这一步失败,必须把失败追加到同一份结果对象,\n // 不能让“先返回 cleanupIncomplete=false”的快照掩盖迟到错误。\n void cleanup.then(\n () => {\n try {\n onLateSuccess?.(entry);\n } catch {\n // 迟到状态投影不能改变底层清理结果,也不能制造未处理异常。\n }\n },\n (error) => {\n try {\n onLateFailure?.(entry, error);\n } catch {\n // 同上:失败已经记录在 scope 结果中。\n }\n },\n );\n return \"pending\";\n }\n if (result === \"released\") return \"released\";\n entry.state = \"pending\";\n issues.push({\n resourceId: entry.resourceId,\n code: \"lifecycle.cleanup_failed\",\n message: errorMessage(result.error),\n });\n return \"pending\";\n }\n\n async function dispose(options: LifecycleDisposeOptions = {}): Promise<LifecycleDisposeResult> {\n if (disposalPromise) return disposalPromise;\n revoke(options.reason ?? \"scope disposed\");\n const reason = options.reason ?? revokeReason;\n const entriesToRelease = [...entries.values()].reverse();\n disposalPromise = (async () => {\n const errors: LifecycleCleanupIssue[] = [];\n const pending = new Set<string>();\n const lateReleased = new Set<string>();\n let released = 0;\n let attempted = 0;\n let resultSnapshot: LifecycleDisposeResult | undefined;\n let resultPublished = false;\n\n const publishDisposeResult = (): void => {\n if (!resultPublished || !resultSnapshot) return;\n try {\n disposeResultNotifier?.(resultSnapshot);\n } catch {\n // 父级状态投影不能改变清理结果。\n }\n };\n\n /**\n * 把 direct resource 和 child scope 的结果合并到同一个父级快照。\n * child:<scopeId>:<resourceId> 是父级可观测的稳定资源标识;不能只\n * 记录 child scope 自身,否则 Host 会把子资源错误地显示为已释放。\n */\n const rebuildResultSnapshot = (): void => {\n if (!resultSnapshot) return;\n const mergedPending = new Set(pending);\n const mergedErrors = [...errors];\n let mergedAttempted = attempted;\n let mergedReleased = released;\n for (const childEntry of entries.values()) {\n const childScope = childEntry.childScope;\n const childResult = childEntry.childResult;\n if (!childScope || !childResult) continue;\n const prefix = `child:${childScope.identity.scopeId}:`;\n mergedAttempted += childResult.attempted;\n mergedReleased += childResult.released;\n for (const resourceId of childResult.pending) {\n mergedPending.add(`${prefix}${resourceId}`);\n }\n for (const issue of childResult.errors) {\n mergedErrors.push({\n ...issue,\n resourceId: `${prefix}${issue.resourceId}`,\n });\n }\n }\n resultSnapshot.attempted = mergedAttempted;\n resultSnapshot.released = mergedReleased;\n resultSnapshot.pending = [...mergedPending];\n resultSnapshot.errors = mergedErrors;\n resultSnapshot.cleanupIncomplete = mergedPending.size > 0 || mergedErrors.length > 0;\n };\n\n const projectChildResult = (\n entry: ResourceEntry,\n childResult: LifecycleDisposeResult,\n lateResourceId?: string,\n lateError?: unknown,\n ): void => {\n if (!entry.childScope) return;\n const previous = entry.childResult;\n entry.childResult = childResult;\n entry.state = childResult.cleanupIncomplete ? \"pending\" : \"released\";\n entry.error = childResult.cleanupIncomplete\n ? childResult.errors[0]?.message ?? \"Child scope cleanup is still pending\"\n : undefined;\n rebuildResultSnapshot();\n // 先向更高层父作用域发布最新快照,再调用外部投影;否则 Host\n // 可能在父级仍是旧 pending 时先计算出错误的汇总结果。\n publishDisposeResult();\n if (lateResourceId && resultSnapshot) {\n const resourceId = `child:${entry.childScope.identity.scopeId}:${lateResourceId}`;\n try {\n if (lateError !== undefined) options.onLateFailure?.(resourceId, lateError, resultSnapshot);\n else options.onLateSuccess?.(resourceId, resultSnapshot);\n } catch {\n // 外部状态投影不能改变清理结果。\n }\n } else if (previous?.cleanupIncomplete && !childResult.cleanupIncomplete && resultSnapshot) {\n // 子作用域没有提供具体迟到资源标识时,仍需通知父级已经收敛。\n try {\n options.onLateSuccess?.(`child:${entry.childScope.identity.scopeId}`, resultSnapshot);\n } catch {\n // 同上。\n }\n }\n notifyChange(publicScope);\n };\n\n // 子作用域可能在父作用域已经返回 cleanup-pending 后才最终收敛;\n // 保留这个刷新入口,避免父级结果快照停留在旧的 pending/error。\n refreshPublishedDisposeResult = () => {\n if (!resultPublished || !resultSnapshot) return;\n rebuildResultSnapshot();\n publishDisposeResult();\n };\n\n const onLateFailure = (entry: ResourceEntry, error: unknown): void => {\n entry.state = \"pending\";\n entry.error = errorMessage(error);\n if (!errors.some((issue) => issue.resourceId === entry.resourceId && issue.code === \"lifecycle.cleanup_failed\")) {\n errors.push({\n resourceId: entry.resourceId,\n code: \"lifecycle.cleanup_failed\",\n message: errorMessage(error),\n });\n }\n pending.add(entry.resourceId);\n if (resultSnapshot) {\n rebuildResultSnapshot();\n }\n publishDisposeResult();\n try {\n options.onLateFailure?.(entry.resourceId, error, resultSnapshot);\n } catch {\n // 外部状态投影不能改变清理结果。\n }\n notifyChange(publicScope);\n };\n const onLateSuccess = (entry: ResourceEntry): void => {\n // runEntry 只为 timeout 项登记此回调;Set 也防御同一项的重复通知。\n if (lateReleased.has(entry.resourceId)) return;\n lateReleased.add(entry.resourceId);\n pending.delete(entry.resourceId);\n released += 1;\n for (let index = errors.length - 1; index >= 0; index -= 1) {\n const issue = errors[index];\n if (issue?.resourceId === entry.resourceId && issue.code === \"lifecycle.cleanup_timeout\") {\n errors.splice(index, 1);\n }\n }\n if (resultSnapshot) {\n rebuildResultSnapshot();\n }\n publishDisposeResult();\n try {\n options.onLateSuccess?.(entry.resourceId, resultSnapshot);\n } catch {\n // 外部状态投影不能改变清理结果。\n }\n notifyChange(publicScope);\n };\n const releasePhase = async (phase: LifecycleCleanupPhase) => {\n // 每个阶段按登记逆序释放;每项都有独立超时,所以一个永不返回\n // 的网络退订不会阻塞其它资源释放。\n for (const entry of entriesToRelease.filter((item) => item.phase === phase)) {\n if (entry.childScope) {\n // 子 Scope 自己负责对子资源应用 timeout;父级只维护它的\n // 结构化结果,并通过 child scope 的迟到回调持续重建快照。\n entry.cleanupStarted = true;\n try {\n const childResult = await entry.childScope.dispose({\n reason,\n timeoutMs: options.timeoutMs,\n onLateSuccess: (resourceId, result) => {\n if (result) projectChildResult(entry, result, resourceId);\n },\n onLateFailure: (resourceId, error, result) => {\n if (result) projectChildResult(entry, result, resourceId, error);\n },\n });\n entry.cleanupFinished = true;\n projectChildResult(entry, childResult);\n } catch (error) {\n entry.cleanupFinished = true;\n entry.state = \"pending\";\n entry.error = errorMessage(error);\n pending.add(entry.resourceId);\n errors.push({\n resourceId: entry.resourceId,\n code: \"lifecycle.cleanup_failed\",\n message: errorMessage(error),\n });\n notifyChange(publicScope);\n }\n continue;\n }\n attempted += 1;\n const result = await runEntry(entry, reason, options.timeoutMs, errors, onLateSuccess, onLateFailure);\n if (result === \"released\") released += 1;\n else if (!lateReleased.has(entry.resourceId)) pending.add(entry.resourceId);\n }\n };\n await releasePhase(\"before-teardown\");\n\n // Host 的旧 teardown / 领域收尾位于两个清理阶段之间。这样显式\n // onDispose 仍能先看到旧注册项,而异步 Registry facade 可以在\n // teardown 完成后再注销,不依赖 snapshot 差分。\n if (options.teardown) {\n const teardownEntry: ResourceEntry = {\n resourceId: \"scope:teardown\",\n state: \"active\",\n cleanup: options.teardown,\n phase: \"before-teardown\",\n cleanupStarted: false,\n cleanupFinished: false,\n removeOnFailure: false,\n };\n attempted += 1;\n const result = await runEntry(teardownEntry, reason, options.timeoutMs, errors, onLateSuccess, onLateFailure);\n if (result === \"released\") released += 1;\n else if (!lateReleased.has(teardownEntry.resourceId)) pending.add(teardownEntry.resourceId);\n }\n\n await releasePhase(\"after-teardown\");\n currentState = \"stopped\";\n notifyChange(publicScope);\n resultSnapshot = {\n scopeId: identity.scopeId,\n state: \"stopped\" as const,\n attempted,\n released,\n pending: [...pending],\n errors,\n cleanupIncomplete: pending.size > 0 || errors.length > 0,\n };\n rebuildResultSnapshot();\n resultPublished = true;\n publishDisposeResult();\n return resultSnapshot;\n })();\n // 所有当前调用者共享同一个完成结果。\n return disposalPromise;\n }\n\n function resources(): readonly LifecycleResourceSnapshot[] {\n return [...entries.values()].map((entry) => ({\n resourceId: entry.resourceId,\n state: entry.state,\n ...(entry.error ? { error: entry.error } : {}),\n }));\n }\n\n function child(\n kind: LifecycleScopeKind,\n metadata: Partial<Omit<LifecycleScopeIdentity, \"scopeId\" | \"instanceId\" | \"kind\" | \"parentScopeId\">> = {}\n ): LifecycleScope {\n assertActive();\n let childEntry: ResourceEntry | undefined;\n const childScope = createLifecycleScope({\n kind,\n metadata: {\n ...metadata,\n parentScopeId: identity.scopeId,\n },\n // 父作用域的 Host 订阅者也必须看到子作用域资源的状态变化。\n onChange: () => notifyChange(publicScope),\n // 只有子作用域已经生成最终结果后,父级才允许更新/删除登记。\n onDisposeResult: (result) => {\n const entry = childEntry;\n if (!entry) return;\n entry.childResult = result;\n entry.state = result.cleanupIncomplete ? \"pending\" : \"released\";\n entry.error = result.cleanupIncomplete\n ? result.errors[0]?.message ?? \"Child scope cleanup is still pending\"\n : undefined;\n refreshPublishedDisposeResult?.();\n // 父级主动 dispose 时保留登记,供父级结果和诊断快照继续展示;\n // 只有独立 dispose 的子作用域在最终成功后才解除父级链接。\n if (!result.cleanupIncomplete && !disposalPromise && !entry.cleanupStarted) {\n entries.delete(entry.resourceId);\n usedIds.delete(entry.resourceId);\n }\n notifyChange(publicScope);\n },\n });\n // revoke 是同步安全边界,父作用域撤权时立即传播;dispose 再等待子\n // 作用域的异步收尾。\n const removeRevoke = onRevoke((reason) => childScope.revoke(reason));\n // 子作用域作为父级的一等资源登记。不能用“父级 disposer 只 await\n // child.dispose()”的旧写法:child.dispose() 在失败/超时时会返回\n // cleanupIncomplete=true,而父级若忽略返回值就会错误标记为 released。\n const entry = addEntry(`child:${childScope.identity.scopeId}`, async () => undefined, \"active\");\n childEntry = entry;\n entry.childScope = childScope;\n // 子作用域可能早于父作用域结束(例如插件 disable 后再次 enable)。\n // parent-link 只解除 revoke 监听;父级登记必须等子作用域的最终结果\n // 生成后再处理,否则子资源失败/超时时父级会丢失 cleanup-pending。\n childScope.onDispose(() => {\n removeRevoke();\n }, `parent-link:${identity.scopeId}`);\n return childScope;\n }\n\n Object.assign(publicScope, {\n identity,\n signal: controller.signal,\n onRevoke,\n onDispose,\n track,\n acquire,\n child,\n revoke,\n dispose,\n assertActive,\n resources,\n });\n // Object.assign 会读取 getter 的当前值,不能用它暴露动态 state;必须\n // 保持状态只读且随 revoke/dispose 实时变化。\n Object.defineProperty(publicScope, \"state\", {\n enumerable: true,\n configurable: false,\n get: () => currentState,\n });\n return publicScope;\n}\n\n/** 语义别名:资源管理代码通常以 ResourceScope 称呼同一原语。 */\nexport const createResourceScope = createLifecycleScope;\n\nexport type ResourceScopeOptions = CreateResourceScopeOptions;\n","// 把共享 MessageBus 绑定到一个插件实例作用域。\n//\n// MessageBus 本身不拥有插件生命周期;这个 facade 负责把订阅、handler、\n// 请求和取消信号登记到当前 Scope。这样同步撤权后,迟到的消息不会继续\n// 进入已经失效的插件实例。\n\nimport type {\n DispatchOptions,\n HandlerOptions,\n Message,\n MessageBus,\n MessageHandler,\n PublishOptions,\n RequestOptions,\n} from \"../contracts/messageBus.js\";\nimport { LifecycleScopeRevokedError } from \"../contracts/lifecycle.js\";\nimport type { LifecycleScope } from \"../contracts/lifecycle.js\";\n\ninterface MergedSignal {\n signal: AbortSignal;\n dispose(): void;\n}\n\nfunction mergeSignals(scopeSignal: AbortSignal, requestSignal?: AbortSignal): MergedSignal {\n if (!requestSignal) return { signal: scopeSignal, dispose: () => undefined };\n if (scopeSignal.aborted) {\n const controller = new AbortController();\n controller.abort(scopeSignal.reason);\n return { signal: controller.signal, dispose: () => undefined };\n }\n if (requestSignal.aborted) {\n const controller = new AbortController();\n controller.abort(requestSignal.reason);\n return { signal: controller.signal, dispose: () => undefined };\n }\n const controller = new AbortController();\n const abortFrom = (source: AbortSignal) => {\n try {\n controller.abort(source.reason);\n } catch {\n controller.abort();\n }\n };\n const onScopeAbort = () => abortFrom(scopeSignal);\n const onRequestAbort = () => abortFrom(requestSignal);\n scopeSignal.addEventListener(\"abort\", onScopeAbort, { once: true });\n requestSignal.addEventListener(\"abort\", onRequestAbort, { once: true });\n return {\n signal: controller.signal,\n dispose: () => {\n scopeSignal.removeEventListener(\"abort\", onScopeAbort);\n requestSignal.removeEventListener(\"abort\", onRequestAbort);\n },\n };\n}\n\nfunction withScopeCleanup(scope: LifecycleScope, cleanup: () => void): () => void {\n let active = true;\n let removeRevoke: () => void = () => undefined;\n let removeDispose: () => void = () => undefined;\n const runCleanup = () => {\n if (!active) return;\n active = false;\n removeRevoke();\n removeDispose();\n cleanup();\n };\n removeRevoke = scope.onRevoke(runCleanup);\n removeDispose = scope.onDispose(runCleanup, \"message-bus-registration\");\n return () => {\n if (!active) return;\n active = false;\n removeRevoke();\n removeDispose();\n cleanup();\n };\n}\n\n/** 创建绑定到指定插件实例的 MessageBus 视图。 */\nexport function createScopedMessageBus(base: MessageBus, scope: LifecycleScope): MessageBus {\n return {\n publish<TPayload>(type: string, payload: TPayload, options?: PublishOptions): string {\n scope.assertActive();\n return base.publish(type, payload, options);\n },\n\n subscribe<TPayload>(type: string, handler: (payload: TPayload) => void): () => void {\n scope.assertActive();\n const unsubscribe = base.subscribe<TPayload>(type, (payload) => {\n if (scope.state !== \"active\") return;\n handler(payload);\n });\n return withScopeCleanup(scope, unsubscribe);\n },\n\n dispatch<TPayload>(type: string, payload: TPayload, options: DispatchOptions): string {\n scope.assertActive();\n const merged = mergeSignals(scope.signal, options.signal);\n const cleanup = withScopeCleanup(scope, merged.dispose);\n try {\n return base.dispatch(type, payload, {\n ...options,\n signal: merged.signal,\n onSettled: () => {\n cleanup();\n options.onSettled?.();\n },\n });\n } catch (error) {\n cleanup();\n throw error;\n }\n },\n\n request<TPayload, TResult>(type: string, payload: TPayload, options: RequestOptions): Promise<TResult> {\n scope.assertActive();\n const merged = mergeSignals(scope.signal, options.signal);\n const cleanup = withScopeCleanup(scope, merged.dispose);\n try {\n const request = base.request<TPayload, TResult>(type, payload, {\n ...options,\n signal: merged.signal,\n onSettled: () => {\n cleanup();\n options.onSettled?.();\n },\n });\n return request.finally(cleanup);\n } catch (error) {\n cleanup();\n return Promise.reject(error);\n }\n },\n\n handle<TPayload, TResult>(\n type: string,\n handler: MessageHandler<TPayload, TResult>,\n options?: HandlerOptions,\n ): () => void {\n scope.assertActive();\n const scopedHandler: MessageHandler<TPayload, TResult> = (message: Message<TPayload>) => {\n if (scope.state !== \"active\") {\n throw new LifecycleScopeRevokedError(\n `Lifecycle scope \"${scope.identity.scopeId}\" is ${scope.state}`,\n );\n }\n const merged = mergeSignals(scope.signal, message.signal);\n try {\n const result = handler({ ...message, signal: merged.signal });\n if (result && typeof (result as PromiseLike<TResult>).then === \"function\") {\n return Promise.resolve(result).finally(merged.dispose) as Promise<TResult>;\n }\n merged.dispose();\n return result;\n } catch (error) {\n merged.dispose();\n throw error;\n }\n };\n const unregister = base.handle(type, scopedHandler, options);\n return withScopeCleanup(scope, unregister);\n },\n\n snapshot() {\n return base.snapshot();\n },\n\n onSnapshot(handler) {\n scope.assertActive();\n const unsubscribe = base.onSnapshot(handler);\n return withScopeCleanup(scope, unsubscribe);\n },\n };\n}\n","// 绑定身份的权限租约实现。\n//\n// 申请权限、可信装配批准和当前作用域是三个独立条件。租约只授予它们的\n// 交集;撤权后任何调用都 fail closed。这个模块不替代远端服务端校验,\n// 后者必须在最终 RPC / I/O 或签名边界再次检查绑定字段。\n\nimport type {\n LifecycleScope,\n LifecycleScopeIdentity,\n PermissionLease,\n PermissionLeaseBinding,\n PermissionLeaseBindingExpectation,\n PluginPermission,\n} from \"../contracts/lifecycle.js\";\nimport {\n PermissionDeniedError,\n PermissionLeaseRevokedError,\n} from \"../contracts/lifecycle.js\";\n\nexport interface CreatePermissionLeaseOptions {\n /** 已由 Host 绑定的作用域身份;调用方不能从请求体自报。 */\n identity: LifecycleScopeIdentity;\n /** 插件 manifest 申请的权限。 */\n requested?: readonly PluginPermission[];\n /** 可信策略批准的权限。 */\n approved?: readonly PluginPermission[];\n /** 当前会话约束;存在时再与申请、批准求交集。 */\n sessionConstraints?: readonly PluginPermission[];\n /** 内置可信策略修订;策略变化后不能复用旧租约。 */\n policyRevision?: number;\n /** Connect 用户授权修订;内置插件可以省略。 */\n grantRevision?: number;\n /** Connect/外部授权的不可猜测授权标识;最终边界仍需查权威状态。 */\n grantId?: string;\n /** 可选作用域;撤权时自动撤销租约。 */\n scope?: LifecycleScope;\n}\n\nfunction uniquePermissions(permissions: readonly PluginPermission[] | undefined): PluginPermission[] {\n return [...new Set(permissions ?? [])];\n}\n\nfunction sameBindingValue(\n actual: string | number | undefined,\n expected: string | number | undefined\n): boolean {\n return expected === undefined || actual === expected;\n}\n\nfunction sameAttributes(\n actual: Readonly<Record<string, unknown>>,\n expected: Readonly<Record<string, unknown>> | undefined,\n): boolean {\n if (expected === undefined) return true;\n return Object.keys(expected).every((key) => Object.is(actual[key], expected[key]));\n}\n\nfunction normalizedRevision(value: number | undefined, name: string): number | undefined {\n if (value === undefined) return undefined;\n if (!Number.isSafeInteger(value) || value < 0) throw new Error(`${name} must be a non-negative safe integer`);\n return value;\n}\n\n/** 创建一个不可换绑的权限租约。 */\nexport function createPermissionLease(options: CreatePermissionLeaseOptions): PermissionLease {\n const binding: PermissionLeaseBinding = {\n ...options.identity,\n requested: Object.freeze(uniquePermissions(options.requested)),\n approved: Object.freeze(uniquePermissions(options.approved)),\n ...(options.sessionConstraints\n ? { sessionConstraints: Object.freeze(uniquePermissions(options.sessionConstraints)) }\n : {}),\n ...(options.policyRevision !== undefined\n ? { policyRevision: normalizedRevision(options.policyRevision, \"policyRevision\") }\n : {}),\n ...(options.grantRevision !== undefined\n ? { grantRevision: normalizedRevision(options.grantRevision, \"grantRevision\") }\n : {}),\n ...(options.grantId !== undefined\n ? { grantId: options.grantId }\n : {}),\n };\n Object.freeze(binding);\n const granted = new Set(\n binding.requested.filter((permission) =>\n binding.approved.includes(permission)\n && (binding.sessionConstraints === undefined || binding.sessionConstraints.includes(permission))\n )\n );\n let revoked = false;\n let revokeReason = \"permission lease revoked\";\n\n const lease: PermissionLease = {\n binding,\n get revoked() {\n return revoked || (options.scope !== undefined && options.scope.state !== \"active\");\n },\n has(permission) {\n return !lease.revoked && granted.has(permission);\n },\n assert(permission) {\n if (lease.revoked) {\n throw new PermissionLeaseRevokedError(revokeReason);\n }\n if (!granted.has(permission)) {\n throw new PermissionDeniedError(permission);\n }\n },\n assertBinding(expected: PermissionLeaseBindingExpectation) {\n if (\n !sameBindingValue(binding.pluginId, expected.pluginId)\n || !sameBindingValue(binding.instanceId, expected.instanceId)\n || !sameAttributes(binding.attributes, expected.attributes)\n || !sameBindingValue(binding.policyRevision, expected.policyRevision)\n || !sameBindingValue(binding.grantRevision, expected.grantRevision)\n || !sameBindingValue(binding.grantId, expected.grantId)\n ) {\n throw new PermissionLeaseRevokedError(\"Permission lease identity does not match\");\n }\n if (lease.revoked) throw new PermissionLeaseRevokedError(revokeReason);\n },\n revoke(reason = \"permission lease revoked\") {\n if (revoked) return;\n revoked = true;\n revokeReason = reason;\n },\n };\n\n if (options.scope) {\n options.scope.onRevoke((reason) => lease.revoke(reason));\n options.scope.onDispose((reason) => lease.revoke(reason), \"permission-lease\");\n }\n return lease;\n}\n","// 绑定生命周期作用域的轻量后台任务调度器。\n//\n// 这是 Worker 内核可复用的调度原语,不是领域持久工作流:\n// - 定时器、取消控制器和运行实例都登记到同一个 scope;\n// - 同一任务不并发,重复触发只合并一次;\n// - 周期采用 setTimeout 链,避免 setInterval 在任务变慢时重叠;\n// - 作用域停止时只撤销本地任务,外部上传 / 支付等恢复仍由领域仓库负责。\n\nimport type {\n LifecycleScope,\n ScopedTaskDefinition,\n ScopedTaskScheduler,\n ScopedTaskSnapshot,\n} from \"../contracts/lifecycle.js\";\n\ninterface TaskRuntime {\n definition: ScopedTaskDefinition;\n state: ScopedTaskSnapshot[\"state\"];\n error?: string;\n lastCompletedAt?: string;\n nextRunAt?: string;\n timer?: ReturnType<typeof setTimeout>;\n controller?: AbortController;\n runPromise?: Promise<void>;\n rerunRequested: boolean;\n active: boolean;\n}\n\nexport interface CreateScopedTaskSchedulerOptions {\n /** 注册后是否先恢复运行一次;缺省为 false,由业务显式触发。 */\n runOnRegister?: boolean;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\n/** 创建绑定到一个 lifecycle scope 的任务调度器。 */\nexport function createScopedTaskScheduler(\n scope: LifecycleScope,\n options: CreateScopedTaskSchedulerOptions = {}\n): ScopedTaskScheduler & { dispose(): Promise<void> } {\n const tasks = new Map<string, TaskRuntime>();\n const listeners = new Set<(snapshot: readonly ScopedTaskSnapshot[]) => void>();\n let disposed = false;\n\n const notify = () => {\n const value = [...tasks.values()].map((task) => ({\n id: task.definition.id,\n pluginId: task.definition.pluginId ?? scope.identity.pluginId ?? \"unknown\",\n label: task.definition.label,\n state: task.state,\n ...(task.error ? { error: task.error } : {}),\n ...(task.lastCompletedAt ? { lastCompletedAt: task.lastCompletedAt } : {}),\n ...(task.nextRunAt ? { nextRunAt: task.nextRunAt } : {}),\n }));\n for (const listener of [...listeners]) {\n try {\n listener(value);\n } catch {\n // UI 观察者不能影响任务撤销和调度。\n }\n }\n };\n\n const clearTimer = (task: TaskRuntime) => {\n if (task.timer !== undefined) {\n clearTimeout(task.timer);\n task.timer = undefined;\n }\n task.nextRunAt = undefined;\n };\n\n const schedule = (task: TaskRuntime) => {\n clearTimer(task);\n const intervalMs = task.definition.intervalMs;\n if (!task.active || disposed || intervalMs === undefined) {\n notify();\n return;\n }\n if (!Number.isFinite(intervalMs) || intervalMs < 0) {\n task.error = \"任务 intervalMs 必须是非负有限数\";\n task.state = \"failed\";\n notify();\n return;\n }\n const dueAt = Date.now() + intervalMs;\n task.nextRunAt = new Date(dueAt).toISOString();\n task.timer = setTimeout(() => {\n task.timer = undefined;\n task.nextRunAt = undefined;\n void runTask(task, \"interval\");\n }, intervalMs);\n notify();\n };\n\n const runTask = async (task: TaskRuntime, reason: string): Promise<void> => {\n if (!task.active || disposed || scope.state !== \"active\") return;\n if (task.runPromise) {\n task.rerunRequested = true;\n return task.runPromise;\n }\n task.state = \"queued\";\n task.error = undefined;\n notify();\n const run = (async () => {\n let requestScope: LifecycleScope | undefined;\n let controller: AbortController | undefined;\n let abortFromScope: (() => void) | undefined;\n try {\n // scope 可能在上面的 active 检查后、这里真正创建 request 子作用域前\n // 被同步撤权。把这条竞态纳入任务失败收口,不能让 timer 产生未处理\n // rejection,也不能在 stopped scope 上继续排下一次运行。\n requestScope = scope.child(\"request\");\n controller = new AbortController();\n task.controller = controller;\n abortFromScope = () => controller?.abort(scope.signal.reason);\n if (scope.signal.aborted) abortFromScope();\n else scope.signal.addEventListener(\"abort\", abortFromScope, { once: true });\n task.state = \"running\";\n notify();\n await task.definition.run({ signal: controller.signal, reason });\n if (!controller.signal.aborted && !requestScope.signal.aborted) {\n task.state = \"idle\";\n task.error = undefined;\n task.lastCompletedAt = new Date().toISOString();\n } else {\n task.state = \"idle\";\n }\n } catch (error) {\n task.state = \"failed\";\n task.error = controller?.signal.aborted ? undefined : errorMessage(error);\n } finally {\n if (abortFromScope) scope.signal.removeEventListener(\"abort\", abortFromScope);\n task.controller = undefined;\n if (requestScope) {\n await requestScope.dispose({ reason: `task ${task.definition.id} finished` });\n }\n if (task.active && !disposed && scope.state === \"active\") schedule(task);\n else clearTimer(task);\n notify();\n }\n })();\n task.runPromise = run;\n try {\n await run;\n } finally {\n task.runPromise = undefined;\n notify();\n if (task.rerunRequested && task.active && !disposed && scope.state === \"active\") {\n task.rerunRequested = false;\n queueMicrotask(() => { void runTask(task, \"coalesced\"); });\n }\n }\n };\n\n const releaseTask = async (task: TaskRuntime, reason: string): Promise<void> => {\n if (!task.active) return;\n task.active = false;\n task.rerunRequested = false;\n clearTimer(task);\n task.controller?.abort(reason);\n if (task.runPromise) await task.runPromise;\n tasks.delete(task.definition.id);\n notify();\n };\n\n const scheduler: ScopedTaskScheduler & { dispose(): Promise<void> } = {\n register(definition) {\n scope.assertActive();\n if (!definition.id || tasks.has(definition.id)) {\n throw new Error(`Scoped task id \"${definition.id}\" is already registered or empty`);\n }\n const task: TaskRuntime = {\n definition: { ...definition },\n state: \"idle\",\n rerunRequested: false,\n active: true,\n };\n tasks.set(definition.id, task);\n const removeScopeCleanup = scope.onDispose(\n (reason) => releaseTask(task, reason),\n `task:${definition.id}`\n );\n // register 返回的取消句柄是同步触发、异步等待由下一次 scope dispose\n // 负责;不会让调用方误以为 cleanup 已经完成。\n const unregister = () => {\n if (!task.active) return;\n removeScopeCleanup();\n void releaseTask(task, \"task unregistered\");\n };\n schedule(task);\n if (options.runOnRegister) void runTask(task, \"initial\");\n return unregister;\n },\n async runNow(id, reason = \"manual\") {\n const task = tasks.get(id);\n if (!task) throw new Error(`Scoped task \"${id}\" is not registered`);\n await runTask(task, reason);\n },\n async cancel(id) {\n const task = tasks.get(id);\n if (!task) return;\n task.rerunRequested = false;\n task.controller?.abort(\"task canceled\");\n if (task.runPromise) await task.runPromise;\n },\n snapshot() {\n return [...tasks.values()].map((task) => ({\n id: task.definition.id,\n pluginId: task.definition.pluginId ?? scope.identity.pluginId ?? \"unknown\",\n label: task.definition.label,\n state: task.state,\n ...(task.error ? { error: task.error } : {}),\n ...(task.lastCompletedAt ? { lastCompletedAt: task.lastCompletedAt } : {}),\n ...(task.nextRunAt ? { nextRunAt: task.nextRunAt } : {}),\n }));\n },\n subscribe(listener) {\n listeners.add(listener);\n listener(scheduler.snapshot());\n return () => listeners.delete(listener);\n },\n async dispose() {\n if (disposed) return;\n disposed = true;\n for (const task of [...tasks.values()]) {\n task.controller?.abort(\"task scheduler disposed\");\n clearTimer(task);\n }\n await Promise.all([...tasks.values()].map((task) => releaseTask(task, \"task scheduler disposed\")));\n listeners.clear();\n },\n };\n return scheduler;\n}\n","/**\n * 资源注册表实现\n *\n * 设计缘由:管理资源定义的注册和查询,支持 owner-aware 生命周期。\n * 重复 id 抛错,disable 时可回收。\n */\n\nimport type {\n OwnedResourceDefinition,\n ResourceDefinition,\n ResourceRegistry,\n} from \"../contracts/resource.js\";\nimport { RESOURCE_OWNER as RESOURCE_OWNER_KEY } from \"../contracts/resource.js\";\n\n/** 资源注册表实现 */\nexport function createResourceRegistry(): ResourceRegistry {\n const definitions = new Map<string, OwnedResourceDefinition>();\n\n function registerOwned<T, TArgs extends readonly string[]>(\n ownerId: string,\n definition: ResourceDefinition<T, TArgs>\n ): void {\n if (definitions.has(definition.id)) {\n throw new Error(\n `Resource definition \"${definition.id}\" is already registered`\n );\n }\n // Keep ownership outside the public definition object. The object is copied\n // so a plugin cannot mutate the definition after registration to change it.\n const owned = Object.assign({}, definition) as OwnedResourceDefinition;\n Object.defineProperty(owned, RESOURCE_OWNER_KEY, {\n value: ownerId,\n enumerable: false,\n writable: false,\n configurable: false,\n });\n definitions.set(definition.id, owned);\n }\n\n return {\n _registerOwned: registerOwned,\n register<T, TArgs extends readonly string[]>(\n definition: ResourceDefinition<T, TArgs>\n ): void {\n // Direct registry users have no plugin identity. Host-provided facades use\n // registerOwned below and are the only path used by plugin setup.\n registerOwned(\"\", definition);\n },\n\n unregister(id: string): void {\n definitions.delete(id);\n },\n\n get<T, TArgs extends readonly string[]>(\n id: string\n ): ResourceDefinition<T, TArgs> | undefined {\n return definitions.get(id) as ResourceDefinition<T, TArgs> | undefined;\n },\n\n /** 获取所有已注册的资源定义 id(用于 ownership 快照) */\n _ids(): string[] {\n return Array.from(definitions.keys());\n },\n } as ResourceRegistry & {\n _registerOwned: typeof registerOwned;\n };\n}\n\n/** Internal runtime hook; deliberately absent from ResourceRegistry's public type. */\nexport function registerOwnedResource(\n registry: ResourceRegistry,\n ownerId: string,\n definition: ResourceDefinition<any, any>\n): void {\n const internal = registry as ResourceRegistry & {\n _registerOwned?: (owner: string, definition: ResourceDefinition<any, any>) => void;\n };\n if (!internal._registerOwned) {\n // Fallback is only for custom registries used by tests/adapters.\n registry.register(definition);\n return;\n }\n internal._registerOwned(ownerId, definition);\n}\n","// WebLoom Resource Store 实现。\n//\n// 负责加载去重、取消、修订、失效通知和按实例 owner 清理。资源的 scope\n// 和 attributes 完全由宿主定义,Store 不猜测任何领域身份。\n\nimport type {\n ResourceContext,\n ResourceDefinition,\n ResourceKey,\n ResourceRegistry,\n ResourceSnapshot,\n} from \"../contracts/resource.js\";\nimport { RESOURCE_OWNER } from \"../contracts/resource.js\";\n\ninterface ResourceRecord<T = unknown> {\n snapshot: ResourceSnapshot<T>;\n inFlight: Promise<T> | null;\n abortController: AbortController | null;\n subscribers: Set<() => void>;\n invalidationScheduled: boolean;\n loadRevision: number;\n owner: string;\n providerUnsubscribe: (() => void) | null;\n}\n\n/** Resource Store 公共 API。 */\nexport interface ResourceStoreApi {\n /** 确保资源已加载,并返回当前快照。 */\n ensure<T>(definitionId: string, args: readonly string[]): ResourceSnapshot<T>;\n /** 订阅资源变更。 */\n subscribe(definitionId: string, args: readonly string[], callback: () => void): () => void;\n /** 读取资源快照,不触发加载。 */\n read<T>(definitionId: string, args: readonly string[]): ResourceSnapshot<T> | undefined;\n /** 使资源失效并重新加载。 */\n invalidate(definitionId: string, args: readonly string[]): void;\n /** 清理指定 owner 的所有资源记录。 */\n disposeOwner(ownerId: string): void;\n /** 宿主属性或 capability 变化后刷新绑定。 */\n refreshRuntimeBindings(): void;\n /** 订阅宿主 Context 变化。 */\n subscribeContext(callback: () => void): () => void;\n}\n\ntype Attributes = Readonly<Record<string, unknown>>;\n\nfunction createContext(\n ownerId: string,\n getCapability: <T>(id: string) => T | undefined,\n getAttributes: (ownerId?: string) => Attributes,\n): ResourceContext {\n return {\n getCapability,\n attributes: getAttributes(ownerId),\n ownerId,\n } as ResourceContext & { ownerId: string };\n}\n\nfunction recordKey(definitionId: string, key: ResourceKey): string {\n return `${definitionId}::${key.join(\"::\")}`;\n}\n\nfunction defaultEquals(a: unknown, b: unknown): boolean {\n return Object.is(a, b);\n}\n\n/** 创建通用 Resource Store。 */\nexport function createResourceStore(\n registry: ResourceRegistry,\n getCapability: <T>(id: string) => T | undefined,\n getAttributes: (ownerId?: string) => Attributes = () => ({}),\n): ResourceStoreApi {\n const records = new Map<string, ResourceRecord>();\n const microtaskQueue = new Map<string, { definitionId: string; args: readonly string[] }>();\n const contextSubscribers = new Set<() => void>();\n let microtaskScheduled = false;\n\n const notify = (record: ResourceRecord): void => {\n for (const subscriber of [...record.subscribers]) {\n try { subscriber(); } catch { /* 观察者不能改变资源状态。 */ }\n }\n };\n\n const notifyContext = (): void => {\n for (const subscriber of [...contextSubscribers]) {\n try { subscriber(); } catch { /* 观察者不能改变资源状态。 */ }\n }\n };\n\n const cleanupRecord = (record: ResourceRecord): void => {\n record.abortController?.abort();\n record.providerUnsubscribe?.();\n record.providerUnsubscribe = null;\n };\n\n const contextFor = (definition: ResourceDefinition<unknown, readonly string[]>): ResourceContext =>\n createContext(\n ((definition as ResourceDefinition<unknown, readonly string[]> & { [RESOURCE_OWNER]?: string })[RESOURCE_OWNER] ?? \"__unowned__\"),\n getCapability,\n getAttributes,\n );\n\n const getOrCreateRecord = <T>(\n definition: ResourceDefinition<T, readonly string[]>,\n args: readonly string[],\n ): ResourceRecord<T> => {\n const context = contextFor(definition as ResourceDefinition<unknown, readonly string[]>);\n const key = definition.key(args, context);\n const keyString = recordKey(definition.id, key);\n const current = records.get(keyString) as ResourceRecord<T> | undefined;\n if (current) {\n if (definition.subscribe && !current.providerUnsubscribe) {\n current.providerUnsubscribe = definition.subscribe(args, context, () => {\n scheduleInvalidation(definition.id, args);\n });\n }\n return current;\n }\n\n const record: ResourceRecord<T> = {\n snapshot: { key, status: \"pending\", data: undefined, revision: 0 },\n inFlight: null,\n abortController: null,\n subscribers: new Set(),\n invalidationScheduled: false,\n loadRevision: 0,\n owner: ((definition as ResourceDefinition<unknown, readonly string[]> & { [RESOURCE_OWNER]?: string })[RESOURCE_OWNER] ?? \"__unowned__\"),\n providerUnsubscribe: null,\n };\n records.set(keyString, record);\n if (definition.subscribe) {\n record.providerUnsubscribe = definition.subscribe(args, context, () => {\n scheduleInvalidation(definition.id, args);\n });\n }\n return record;\n };\n\n const loadResource = <T>(\n definition: ResourceDefinition<T, readonly string[]>,\n args: readonly string[],\n record: ResourceRecord<T>,\n ): void => {\n record.abortController?.abort();\n const context = contextFor(definition as ResourceDefinition<unknown, readonly string[]>);\n const key = definition.key(args, context);\n if (record.snapshot.key.join(\"::\") !== key.join(\"::\")) return;\n\n const abortController = new AbortController();\n const loadRevision = ++record.loadRevision;\n record.abortController = abortController;\n try {\n record.inFlight = Promise.resolve(definition.load(args, context, abortController.signal));\n } catch (error) {\n record.inFlight = Promise.reject(error);\n }\n record.snapshot = { ...record.snapshot, status: \"pending\", revision: record.snapshot.revision + 1 };\n notify(record);\n\n record.inFlight.then((data) => {\n if (abortController.signal.aborted || record.loadRevision !== loadRevision) return;\n if (record.snapshot.key.join(\"::\") !== key.join(\"::\")) return;\n const equals = definition.equals ?? defaultEquals;\n const changed = !equals(record.snapshot.data, data);\n record.snapshot = {\n key,\n status: \"ready\",\n data,\n revision: changed ? record.snapshot.revision + 1 : record.snapshot.revision,\n };\n record.inFlight = null;\n record.abortController = null;\n if (changed) notify(record);\n }).catch((error: unknown) => {\n if (abortController.signal.aborted || record.loadRevision !== loadRevision) return;\n const blocked = error instanceof Error && error.message === \"blocked\";\n const errorValue = error instanceof Error ? error : new Error(String(error));\n record.snapshot = blocked\n ? { ...record.snapshot, status: \"blocked\", revision: record.snapshot.revision + 1 }\n : {\n ...record.snapshot,\n status: record.snapshot.data === undefined ? \"error\" : \"stale\",\n error: {\n code: typeof (errorValue as Error & { code?: unknown }).code === \"string\"\n ? String((errorValue as Error & { code?: unknown }).code)\n : \"resource.load_failed\",\n message: errorValue.message,\n },\n revision: record.snapshot.revision + 1,\n };\n record.inFlight = null;\n record.abortController = null;\n notify(record);\n });\n };\n\n const invalidateNow = (definitionId: string, args: readonly string[]): void => {\n const definition = registry.get<unknown, readonly string[]>(definitionId);\n if (!definition) return;\n const context = contextFor(definition);\n const key = definition.key(args, context);\n const record = records.get(recordKey(definitionId, key));\n if (!record) return;\n record.snapshot = { ...record.snapshot, status: \"stale\", revision: record.snapshot.revision + 1 };\n notify(record);\n loadResource(definition, args, record);\n };\n\n const flushInvalidations = (): void => {\n const queue = [...microtaskQueue.values()];\n microtaskQueue.clear();\n microtaskScheduled = false;\n for (const item of queue) invalidateNow(item.definitionId, item.args);\n };\n\n const scheduleInvalidation = (definitionId: string, args: readonly string[]): void => {\n const definition = registry.get<unknown, readonly string[]>(definitionId);\n if (!definition) return;\n if (definition.invalidation === \"immediate\") {\n invalidateNow(definitionId, args);\n return;\n }\n const key = recordKey(definitionId, definition.key(args, contextFor(definition)));\n if (microtaskQueue.has(key)) return;\n microtaskQueue.set(key, { definitionId, args });\n if (!microtaskScheduled) {\n microtaskScheduled = true;\n queueMicrotask(flushInvalidations);\n }\n };\n\n const refreshRuntimeBindings = (): void => {\n for (const record of records.values()) cleanupRecord(record);\n records.clear();\n notifyContext();\n };\n\n return {\n ensure<T>(definitionId: string, args: readonly string[]): ResourceSnapshot<T> {\n const definition = registry.get<T, readonly string[]>(definitionId);\n if (!definition) throw new Error(`Resource definition \"${definitionId}\" not found`);\n const record = getOrCreateRecord(definition, args);\n if (!record.inFlight && record.snapshot.status === \"pending\") loadResource(definition, args, record);\n return record.snapshot;\n },\n subscribe(definitionId, args, callback) {\n const definition = registry.get<unknown, readonly string[]>(definitionId);\n if (!definition) return () => undefined;\n let record = getOrCreateRecord(definition, args);\n record.subscribers.add(callback);\n const removeContext = definition.scope === \"context\"\n ? (() => {\n const listener = () => {\n record.subscribers.delete(callback);\n record = getOrCreateRecord(definition, args);\n record.subscribers.add(callback);\n callback();\n };\n contextSubscribers.add(listener);\n return () => contextSubscribers.delete(listener);\n })()\n : undefined;\n return () => {\n removeContext?.();\n record.subscribers.delete(callback);\n if (record.subscribers.size === 0 && record.providerUnsubscribe) {\n record.providerUnsubscribe();\n record.providerUnsubscribe = null;\n }\n if (record.subscribers.size === 0 && record.abortController) {\n const current = record;\n setTimeout(() => {\n if (current.subscribers.size === 0 && current.abortController) {\n current.abortController.abort();\n current.abortController = null;\n current.inFlight = null;\n }\n }, 100);\n }\n };\n },\n read<T>(definitionId: string, args: readonly string[]) {\n const definition = registry.get<T, readonly string[]>(definitionId);\n if (!definition) return undefined;\n const key = definition.key(args, contextFor(definition));\n return (records.get(recordKey(definitionId, key)) as ResourceRecord<T> | undefined)?.snapshot;\n },\n invalidate: scheduleInvalidation,\n disposeOwner(ownerId) {\n for (const [key, record] of records) {\n if (record.owner !== ownerId) continue;\n cleanupRecord(record);\n records.delete(key);\n }\n },\n refreshRuntimeBindings,\n subscribeContext(callback) {\n contextSubscribers.add(callback);\n return () => contextSubscribers.delete(callback);\n },\n };\n}\n","// WebLoom 通用 Plugin Host。\n//\n// Host 只负责产品、运行单元、实例、依赖、Scope 和权限租约。路由、存储、\n// 日志、国际化以及其它产品能力通过 options 注入,不在这里创建领域 Registry。\n\nimport type {\n PluginState,\n PluginStateKind,\n PluginManifest,\n PluginContext,\n PluginDependency,\n PluginGraph,\n PluginReverseDep,\n PluginSetup,\n PluginTeardown,\n RuntimeUnitDescriptor,\n RuntimeUnitImplementationRegistry,\n HostListener,\n StartupCapabilityErrorDetails,\n StartupPluginErrorDetails,\n} from \"../contracts/plugin.js\";\nimport type {\n LifecycleDisposeResult,\n LifecycleScope,\n LifecycleScopeIdentity,\n LifecycleCleanup,\n PermissionLease,\n PermissionLeaseBinding,\n PluginIntentCoordinator,\n PluginIntentSubmissionResult,\n PluginPermission,\n RemoteServiceReference,\n RuntimeKind,\n ScopedTaskScheduler,\n} from \"../contracts/lifecycle.js\";\nimport {\n LifecycleScopeRevokedError,\n SCOPED_TASK_SCHEDULER_CAPABILITY,\n} from \"../contracts/lifecycle.js\";\nimport type { MessageBus } from \"../contracts/messageBus.js\";\nimport { RUNTIME_MESSAGE_BUS } from \"../contracts/messageBus.js\";\nimport type { ResourceRegistry } from \"../contracts/resource.js\";\nimport { RESOURCE_REGISTRY_CAPABILITY } from \"../contracts/resource.js\";\n\nimport { createCapabilityRegistry, type CapabilityRegistry } from \"./capabilityRegistry.js\";\nimport {\n buildPluginGraph,\n dependenciesOfManifest,\n providesOfManifest,\n reverseDependentsOf,\n validatePluginGraph,\n} from \"./pluginGraph.js\";\nimport { createRuntimeUnitImplementationRegistry } from \"./runtimeUnitImplementationRegistry.js\";\nimport { createMessageBus } from \"../messaging/messageBus.js\";\nimport { createLifecycleScope } from \"../lifecycle/resourceScope.js\";\nimport { createScopedMessageBus } from \"../lifecycle/scopedMessageBus.js\";\nimport { createPermissionLease } from \"../lifecycle/permissionLease.js\";\nimport { createScopedTaskScheduler } from \"../lifecycle/taskScheduler.js\";\nimport { createResourceRegistry, registerOwnedResource } from \"../resources/resourceRegistry.js\";\nimport { createResourceStore, type ResourceStoreApi } from \"../resources/resourceStore.js\";\n\n/** 插件启停意图的通用持久化端口。 */\nexport interface PluginConfigStore {\n /** 读取产品级绝对启停意图。 */\n read(): Readonly<Record<string, boolean>>;\n /** 写入一个产品的绝对启停意图。 */\n setEnabled(pluginId: string, enabled: boolean): void;\n /** 订阅外部控制面带来的变化。 */\n subscribe(listener: (snapshot: Readonly<Record<string, boolean>>) => void): () => void;\n}\n\n/** 创建内存配置端口;产品可通过 configStore 注入持久化实现。 */\nexport function createInMemoryPluginConfigStore(\n initial: Readonly<Record<string, boolean>> = {},\n readOnly = false,\n): PluginConfigStore {\n const values = new Map<string, boolean>();\n for (const [id, value] of Object.entries(initial)) {\n if (typeof value === \"boolean\") values.set(id, value);\n }\n const listeners = new Set<(snapshot: Readonly<Record<string, boolean>>) => void>();\n const snapshot = (): Readonly<Record<string, boolean>> => Object.freeze(Object.fromEntries(values));\n return {\n read: snapshot,\n setEnabled(pluginId, enabled) {\n if (readOnly) return;\n if (values.get(pluginId) === enabled) return;\n values.set(pluginId, enabled);\n const next = snapshot();\n for (const listener of [...listeners]) listener(next);\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n}\n\n/** 权限策略输入;申请、批准和会话约束必须分开计算。 */\nexport interface PermissionPolicyInput {\n /** 产品标识。 */\n pluginId: string;\n /** 运行单元标识。 */\n unitId: string;\n /** 当前 Scope 身份。 */\n identity: LifecycleScopeIdentity;\n /** 清单申请的权限。 */\n requested: readonly PluginPermission[];\n}\n\n/** 权限策略结果;Host 只发放三者交集。 */\nexport interface PermissionPolicyResult {\n /** 可信装配批准集合;缺省为申请集合。 */\n approved?: readonly PluginPermission[];\n /** 当前会话的额外限制。 */\n sessionConstraints?: readonly PluginPermission[];\n /** 绑定到租约的策略/授权修订。 */\n binding?: Partial<Pick<PermissionLeaseBinding, \"policyRevision\" | \"grantRevision\" | \"grantId\">>;\n}\n\n/** Context Extension 生成输入。 */\nexport interface ContextExtensionInput {\n /** 产品标识。 */\n pluginId: string;\n /** 运行单元标识。 */\n unitId: string;\n /** 本次实例标识。 */\n instanceId: string;\n /** 实例 Scope。 */\n scope: LifecycleScope;\n /** 静态清单。 */\n manifest: PluginManifest;\n}\n\n/** 贡献注册的运行时输入。 */\nexport interface ContributionAdapterInput {\n /** 产品标识。 */\n pluginId: string;\n /** 运行单元标识。 */\n unitId: string;\n /** 实例标识。 */\n instanceId: string;\n /** 实例 Scope。 */\n scope: LifecycleScope;\n /** 泛型产品贡献。 */\n contribution: unknown;\n /** 完整静态清单。 */\n manifest: PluginManifest;\n}\n\n/** 贡献适配器返回的同步撤权/异步清理句柄。 */\nexport interface ContributionHandle {\n /** 同步撤下 UI、命令或其它入口;不能等待网络。 */\n revoke?(): void;\n /** 异步完成底层清理;失败必须可观察。 */\n dispose?(): void | Promise<void>;\n}\n\n/** 宿主贡献适配器;具体产品可以注册多个不同领域的适配器。 */\nexport interface ContributionAdapter {\n /** 适配器名称,仅用于诊断。 */\n name?: string;\n /** 注册一份泛型贡献。 */\n register(input: ContributionAdapterInput):\n | void\n | ContributionHandle\n | (() => void | Promise<void>)\n | Promise<void | ContributionHandle | (() => void | Promise<void>)>;\n}\n\n/** 运行单元可用性检查;返回稳定原因表示当前实例不能装配。 */\nexport interface RuntimeUnitAvailabilityInput {\n /** 产品标识。 */\n pluginId: string;\n /** 运行单元标识。 */\n unitId: string;\n /** 真实 Runtime。 */\n runtime: RuntimeKind;\n}\n\n/** 新运行单元 Scope 的身份属性输入。 */\nexport interface RuntimeUnitAttributesInput extends RuntimeUnitAvailabilityInput {\n /** 静态产品清单。 */\n manifest: PluginManifest;\n}\n\n/** 为运行单元选择父 Scope;未提供时运行单元直接挂在 Host 根 Scope。 */\nexport type RuntimeUnitParentScopeInput = RuntimeUnitAttributesInput;\n\n/** 通用运行单元快照;用于展示远端单元未知/恢复状态。 */\nexport interface RuntimeUnitSnapshot {\n /** 产品标识。 */\n pluginId: string;\n /** 单元标识。 */\n unitId: string;\n /** 真实 Runtime。 */\n runtime: RuntimeKind;\n /** 远端实例标识。 */\n instanceId?: string;\n /** 远端当前状态。 */\n state: PluginStateKind;\n}\n\nexport interface CreatePluginHostOptions {\n /** 当前 Host 所在真实 Runtime。 */\n runtime?: RuntimeKind;\n /** 根 Scope 的宿主只读属性。 */\n rootAttributes?: Readonly<Record<string, unknown>>;\n /** 预注入的内建 capability;不归属于任何插件实例。 */\n capabilities?: Readonly<Record<string, unknown>> | ReadonlyMap<string, unknown>;\n /** 可选的资源定义注册表;适配器可把领域 facade 绑定到同一个 Store。 */\n resourceRegistry?: ResourceRegistry;\n /** 可选的消息总线;适配器可为 legacy capability 保持同一实例。 */\n messageBus?: MessageBus;\n /** builtin capability 的别名,便于适配器明确表达用途。 */\n builtinCapabilities?: Readonly<Record<string, unknown>> | ReadonlyMap<string, unknown>;\n /** 生成领域 Context Extension;结果会浅冻结。 */\n contextExtension?: (input: ContextExtensionInput) => Readonly<Record<string, unknown>>;\n /** 校验产品清单中的宿主扩展字段。 */\n manifestValidator?: (manifest: PluginManifest) => void;\n /** 计算权限批准与会话交集。 */\n permissionPolicy?: (input: PermissionPolicyInput) => PermissionPolicyResult;\n /** 启停意图持久化端口。 */\n configStore?: PluginConfigStore;\n /** 兼容测试的内存启停意图。 */\n initialPluginConfig?: Readonly<Record<string, boolean>>;\n /** 多页面唯一启停控制面。 */\n pluginIntentCoordinator?: PluginIntentCoordinator;\n /** 为实例绑定远程服务桥。 */\n serviceBridgeForPlugin?: (pluginId: string, instanceId: string) => import(\"../contracts/lifecycle.js\").RemoteServiceBridge | undefined;\n /** 当前执行环境的运行单元实现注册表。 */\n runtimeUnitImplementationRegistry?: RuntimeUnitImplementationRegistry;\n /** 当前身份/授权不允许装配时返回稳定的 blockedBy 原因。 */\n runtimeUnitAvailability?: (input: RuntimeUnitAvailabilityInput) => string | undefined;\n /** 为每次新建运行单元 Scope 生成当前绑定的只读属性。 */\n runtimeUnitAttributes?: (input: RuntimeUnitAttributesInput) => Readonly<Record<string, unknown>> | undefined;\n /** 为每次新建运行单元 Scope 选择生命周期父级;返回 undefined 使用 Host 根 Scope。 */\n runtimeUnitParentScope?: (input: RuntimeUnitParentScopeInput) => LifecycleScope | undefined;\n /** 贡献适配器集合。 */\n contributionAdapters?: readonly ContributionAdapter[];\n /** 允许每一项清理等待的时间。 */\n lifecycleCleanupTimeoutMs?: number;\n /** 读取远端单元真实状态。 */\n runtimeSnapshots?: () => readonly RuntimeUnitSnapshot[];\n /** 读取其它真实 Runtime 当前已接受的服务目录。 */\n remoteServiceReferences?: () => readonly RemoteServiceReference[];\n /** 允许来源 Runtime 不同且尚未出现在本地 manifest 集合中的依赖。 */\n externalRuntimeDependencies?: boolean;\n}\n\ninterface ContributionRuntime {\n active: boolean;\n revoke: () => void;\n dispose: () => void | Promise<void>;\n}\n\ninterface PluginRecord {\n manifest: PluginManifest;\n state: PluginStateKind;\n error?: string;\n blockedBy?: string[];\n scope?: LifecycleScope;\n instanceId?: string;\n unitId?: string;\n teardown?: PluginTeardown;\n disposeCallbacks: Array<PluginTeardown>;\n capabilities: Set<string>;\n contributions: ContributionRuntime[];\n cleanup?: LifecycleDisposeResult;\n pendingDesiredEnabled?: boolean;\n stopRequested?: string;\n preserveIntentOnStop?: boolean;\n}\n\nfunction errorMessage(error: unknown): string {\n if (error instanceof Error) return error.message;\n if (error && typeof error === \"object\" && \"message\" in error) {\n const message = (error as { message?: unknown }).message;\n if (typeof message === \"string\") return message;\n }\n return String(error);\n}\n\nfunction makeInstanceId(pluginId: string, unitId: string): string {\n try {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return `${pluginId}:${unitId}:${crypto.randomUUID()}`;\n }\n } catch {\n // 某些运行环境没有 Web Crypto;该标识只承担实例去重,不承担密钥语义。\n }\n return `${pluginId}:${unitId}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`;\n}\n\nfunction lifecycleStateFor(state: PluginStateKind, desired: boolean): NonNullable<PluginState[\"lifecycleState\"]> {\n switch (state) {\n case \"starting\": return \"starting\";\n case \"stopping\": return \"stopping\";\n case \"enabled\": return \"running\";\n case \"blocked\": return \"waiting\";\n case \"error-disabled\":\n case \"cleanup-pending\": return \"failed\";\n case \"unknown\": return desired ? \"waiting\" : \"disabled\";\n case \"disabled\": return \"disabled\";\n case \"registered\": return desired ? \"waiting\" : \"disabled\";\n }\n}\n\nfunction selectedUnit(\n manifest: PluginManifest,\n runtime: RuntimeKind | undefined,\n): (RuntimeUnitDescriptor & { id: string; runtime: RuntimeKind }) | undefined {\n const units = manifest.units ?? [];\n if (units.length > 1) {\n const matches = runtime === undefined\n ? []\n : units.filter((unit): unit is RuntimeUnitDescriptor & { id: string; runtime: RuntimeKind } =>\n unit.runtime === runtime\n );\n return matches.length === 1 ? matches[0] : undefined;\n }\n if (units.length === 1) {\n const unit = units[0];\n return unit && (runtime === undefined || unit.runtime === runtime) && unit.runtime !== undefined\n ? unit as RuntimeUnitDescriptor & { id: string; runtime: RuntimeKind }\n : undefined;\n }\n const targetRuntime = runtime ?? \"window-main\";\n return {\n id: manifest.id,\n runtime: targetRuntime,\n dependencies: manifest.dependencies?.map((dependency) => ({\n capability: dependency.capability,\n contractVersion: dependency.contractVersion ?? `${dependency.capability}.v1`,\n sourceRuntime: dependency.sourceRuntime ?? targetRuntime,\n ...(dependency.reason !== undefined ? { reason: dependency.reason } : {}),\n ...(dependency.optional !== undefined ? { optional: dependency.optional } : {}),\n })),\n provides: manifest.provides,\n permissions: manifest.permissions,\n config: manifest.config,\n contribution: manifest.contribution,\n };\n}\n\nfunction dependenciesFor(\n manifest: PluginManifest,\n runtime?: RuntimeKind,\n): PluginDependency[] {\n return dependenciesOfManifest(manifest, runtime);\n}\n\nfunction setupFor(\n manifest: PluginManifest,\n unit: RuntimeUnitDescriptor,\n options: CreatePluginHostOptions,\n): PluginSetup | undefined {\n return options.runtimeUnitImplementationRegistry?.get(manifest.id, unit.id);\n}\n\nexport class StartupCapabilityError extends Error {\n readonly details: StartupCapabilityErrorDetails[];\n constructor(details: StartupCapabilityErrorDetails[], phase = \"startup\") {\n super(`Startup prerequisite unavailable: ${details.map((item) => item.capability).join(\", \")} (${phase})`);\n this.name = \"StartupCapabilityError\";\n this.details = details;\n }\n}\n\nexport class StartupPluginError extends Error {\n readonly details: StartupPluginErrorDetails;\n constructor(details: StartupPluginErrorDetails) {\n super(`Startup plugin failed: ${details.pluginId}`);\n this.name = \"StartupPluginError\";\n this.details = details;\n }\n}\n\n/** 创建一个只包含通用生命周期核心的 Plugin Host。 */\nexport function createPluginHost(options: CreatePluginHostOptions = {}): PluginHost {\n // 未指定 Runtime 时只允许唯一运行单元自动选择;多单元产品必须由\n // 真实 Window/SharedWorker Host 显式指定执行环境。\n const runtimeKind = options.runtime;\n const listeners = new Set<HostListener>();\n let versionCounter = 0;\n let hostDisposed = false;\n let disposePromise: Promise<LifecycleDisposeResult> | undefined;\n let runtimeSnapshots = options.runtimeSnapshots;\n\n const bumpVersion = (): void => {\n versionCounter += 1;\n for (const listener of [...listeners]) {\n try { listener({ version: versionCounter }); } catch { /* 观察者不能改变 Host 状态。 */ }\n }\n };\n\n const rootScope = createLifecycleScope({\n kind: \"root\",\n metadata: { attributes: Object.freeze({ ...(options.rootAttributes ?? {}) }) },\n onChange: bumpVersion,\n });\n const taskScheduler = createScopedTaskScheduler(rootScope);\n const capabilities = createCapabilityRegistry();\n const messageBus = options.messageBus ?? createMessageBus();\n const resourceRegistry = options.resourceRegistry ?? createResourceRegistry();\n let rootAttributes: Readonly<Record<string, unknown>> = Object.freeze({ ...(options.rootAttributes ?? {}) });\n const instanceAttributes = new Map<string, Readonly<Record<string, unknown>>>();\n const resourceStore = createResourceStore(resourceRegistry, <T>(key: string) => (\n capabilities.has(key) ? capabilities.get<T>(key) : undefined\n ), (ownerId) => instanceAttributes.get(ownerId ?? \"\") ?? rootAttributes);\n\n const injectCapabilities = (source: CreatePluginHostOptions[\"capabilities\"]): void => {\n if (!source) return;\n const entries = source instanceof Map ? source.entries() : Object.entries(source);\n for (const [key, value] of entries) capabilities.provide(key, value);\n };\n injectCapabilities(options.capabilities);\n injectCapabilities(options.builtinCapabilities);\n if (!capabilities.has(RUNTIME_MESSAGE_BUS)) capabilities.provide<MessageBus>(RUNTIME_MESSAGE_BUS, messageBus);\n if (!capabilities.has(RESOURCE_REGISTRY_CAPABILITY)) capabilities.provide<ResourceRegistry>(RESOURCE_REGISTRY_CAPABILITY, resourceRegistry);\n if (!capabilities.has(SCOPED_TASK_SCHEDULER_CAPABILITY)) capabilities.provide<ScopedTaskScheduler>(SCOPED_TASK_SCHEDULER_CAPABILITY, taskScheduler);\n\n const configStore = options.configStore ?? createInMemoryPluginConfigStore(options.initialPluginConfig, false);\n const knownManifests = new Map<string, PluginManifest>();\n const records = new Map<string, PluginRecord>();\n const enabledSet = new Set<string>();\n const starting = new Map<string, Promise<void>>();\n const stopping = new Map<string, Promise<void>>();\n const internalConfigWrites = new Set<string>();\n let intentSnapshot = options.pluginIntentCoordinator?.snapshot();\n let removeConfigSubscription = (): void => undefined;\n let removeIntentSubscription = (): void => undefined;\n let reconcilePromise: Promise<void> | undefined;\n\n const desiredEnabledFor = (pluginId: string, manifest?: PluginManifest): boolean => {\n // required / immutable plugins are always-on contracts. A stale false\n // value must not make their capabilities disappear during bootstrap.\n if (manifest?.meta.startup === \"required\" || manifest?.meta.canDisable === false) return true;\n if (intentSnapshot && Object.prototype.hasOwnProperty.call(intentSnapshot.desiredEnabled, pluginId)) {\n return intentSnapshot.desiredEnabled[pluginId] === true;\n }\n return configStore.read()[pluginId] ?? manifest?.meta.defaultEnabled ?? false;\n };\n\n const desiredRevisionFor = (pluginId: string): number | undefined => intentSnapshot?.desiredRevision[pluginId];\n\n const selected = (manifest: PluginManifest): (RuntimeUnitDescriptor & { id: string; runtime: RuntimeKind }) | undefined =>\n selectedUnit(manifest, runtimeKind);\n\n const graph = (): PluginGraph => buildPluginGraph([\n ...knownManifests.values(),\n ], { runtime: runtimeKind, enabledPluginIds: enabledSet });\n\n const validateManifest = (manifest: PluginManifest): void => {\n if (!manifest || typeof manifest.id !== \"string\" || manifest.id.trim() === \"\") throw new Error(\"Plugin id must be a non-empty string\");\n if (typeof manifest.name !== \"string\" || manifest.name.trim() === \"\") throw new Error(`Plugin \"${manifest.id}\" name must be a non-empty string`);\n if (!manifest.meta || typeof manifest.meta.defaultEnabled !== \"boolean\" || typeof manifest.meta.canDisable !== \"boolean\") {\n throw new Error(`Plugin \"${manifest.id}\" meta must define defaultEnabled and canDisable`);\n }\n if (manifest.meta.startup === \"required\" && (manifest.meta.canDisable || !manifest.meta.defaultEnabled)) {\n throw new Error(`Plugin \"${manifest.id}\" required startup metadata is inconsistent`);\n }\n if (manifest.units !== undefined && !Array.isArray(manifest.units)) throw new Error(`Plugin \"${manifest.id}\" units must be an array`);\n if ((manifest.units?.length ?? 0) > 1 && runtimeKind === undefined) {\n throw new Error(`Plugin \"${manifest.id}\" runtime must be explicit for multi-unit manifests`);\n }\n if (manifest.units && manifest.units.length > 0) {\n const ids = new Set<string>();\n for (const unit of manifest.units) {\n if (!unit.id || ids.has(unit.id)) throw new Error(`Plugin \"${manifest.id}\" has duplicate or empty unit id`);\n ids.add(unit.id);\n if (unit.runtime !== \"window-main\" && unit.runtime !== \"shared-worker\") {\n throw new Error(`Plugin \"${manifest.id}\" unit \"${unit.id}\" declares an unsupported Runtime`);\n }\n }\n }\n options.manifestValidator?.(manifest);\n };\n\n const isRequired = (manifest: PluginManifest): boolean => manifest.meta.startup === \"required\" || manifest.meta.canDisable === false;\n\n const missingDependencies = (manifest: PluginManifest): string[] => {\n const missing: string[] = [];\n const selectedUnitForDependencies = selected(manifest);\n const localRuntime = selectedUnitForDependencies?.runtime ?? runtimeKind;\n for (const dependency of dependenciesFor(manifest, runtimeKind)) {\n if (dependency.optional) continue;\n const sourceRuntime = dependency.sourceRuntime ?? localRuntime;\n const contractVersion = dependency.contractVersion ?? `${dependency.capability}.v1`;\n if (sourceRuntime !== undefined && sourceRuntime !== localRuntime) {\n const available = options.remoteServiceReferences?.().some((reference) => (\n reference.status === \"ready\"\n && reference.runtime === sourceRuntime\n && reference.capabilityId === dependency.capability\n && reference.contractVersion === contractVersion\n )) ?? false;\n if (!available) missing.push(dependency.capability);\n } else if (!capabilities.has(dependency.capability)) {\n missing.push(dependency.capability);\n }\n }\n return [...new Set(missing)];\n };\n\n const runtimeUnavailable = (manifest: PluginManifest): string | undefined => {\n const unit = selected(manifest);\n if (!unit) {\n const units = manifest.units ?? [];\n if (units.length > 0 && runtimeKind !== undefined && !units.some((item) => item.runtime === runtimeKind)) {\n const snapshots = runtimeSnapshots?.() ?? [];\n if (snapshots.some((item) => item.pluginId === manifest.id)) return `runtime:${manifest.id}:unknown`;\n }\n return units.length > 0 ? `runtime:${manifest.id}:unit-unavailable` : undefined;\n }\n const unavailable = options.runtimeUnitAvailability?.({\n pluginId: manifest.id,\n unitId: unit.id,\n runtime: unit.runtime,\n });\n if (unavailable) return unavailable;\n if (!setupFor(manifest, unit, options)) return `runtime:${manifest.id}:${unit.id}:implementation-unavailable`;\n return undefined;\n };\n\n const revokeContributions = (record: PluginRecord): void => {\n for (const contribution of record.contributions) {\n if (!contribution.active) continue;\n contribution.active = false;\n try { contribution.revoke(); } catch { /* 同步撤权继续处理其它贡献。 */ }\n }\n };\n\n const releaseContributions = async (record: PluginRecord): Promise<void> => {\n let firstError: unknown;\n for (const contribution of [...record.contributions].reverse()) {\n try { await contribution.dispose(); } catch (error) { firstError ??= error; }\n }\n record.contributions = [];\n if (firstError) throw firstError;\n };\n\n const registerContribution = async (record: PluginRecord, unit: RuntimeUnitDescriptor, instanceId: string, scope: LifecycleScope): Promise<void> => {\n const contribution = unit.contribution;\n if (contribution === undefined || !options.contributionAdapters) return;\n for (const adapter of options.contributionAdapters) {\n const result = await adapter.register({\n pluginId: record.manifest.id,\n unitId: unit.id,\n instanceId,\n scope,\n contribution,\n manifest: record.manifest,\n });\n if (!result) continue;\n if (typeof result === \"function\") {\n let active = true;\n let cleanupPromise: Promise<void> | undefined;\n const dispose = async (): Promise<void> => {\n if (cleanupPromise) return cleanupPromise;\n if (!active) return;\n active = false;\n cleanupPromise = Promise.resolve(result());\n await cleanupPromise;\n };\n record.contributions.push({ active: true, revoke: () => { void dispose().catch(() => undefined); }, dispose });\n } else {\n const handle = result as ContributionHandle;\n let cleanupPromise: Promise<void> | undefined;\n record.contributions.push({\n active: true,\n revoke: () => {\n try { handle.revoke?.(); } catch { /* 撤权必须继续。 */ }\n if (!cleanupPromise) cleanupPromise = Promise.resolve(handle.dispose?.());\n cleanupPromise.catch(() => undefined);\n },\n dispose: async () => {\n if (cleanupPromise) return cleanupPromise;\n cleanupPromise = Promise.resolve(handle.dispose?.());\n return cleanupPromise;\n },\n });\n }\n }\n };\n\n const buildContext = (record: PluginRecord, unit: RuntimeUnitDescriptor, scope: LifecycleScope, instanceId: string): PluginContext => {\n const requested = [...new Set(unit.permissions ?? [])];\n const policy = options.permissionPolicy?.({\n pluginId: record.manifest.id,\n unitId: unit.id,\n // Host 的实例令牌和 Scope 原语的内部 instanceId 是两个生成点;\n // PermissionLease 必须绑定 Context 对外暴露的实例令牌。\n identity: { ...scope.identity, instanceId },\n requested,\n }) ?? { approved: requested };\n const permissionLease: PermissionLease = createPermissionLease({\n identity: { ...scope.identity, instanceId },\n requested,\n approved: policy.approved ?? requested,\n sessionConstraints: policy.sessionConstraints,\n ...(policy.binding ?? {}),\n scope,\n });\n const extension = Object.freeze({\n ...(options.contextExtension?.({\n pluginId: record.manifest.id,\n unitId: unit.id,\n instanceId,\n scope,\n manifest: record.manifest,\n }) ?? {}),\n });\n const config = unit.config === undefined ? undefined : Object.freeze({ ...unit.config });\n const contextTaskScheduler = createScopedTaskScheduler(scope);\n const scopedMessageBus = createScopedMessageBus(messageBus, scope);\n const ownedResourceIds = new Set<string>();\n let resourceDefinitionsRevoked = false;\n const revokeResourceDefinitions = (): void => {\n if (resourceDefinitionsRevoked) return;\n resourceDefinitionsRevoked = true;\n resourceStore.disposeOwner(instanceId);\n for (const resourceId of ownedResourceIds) {\n if (resourceRegistry.get(resourceId)) resourceRegistry.unregister(resourceId);\n }\n ownedResourceIds.clear();\n };\n const scopedResourceRegistry: ResourceRegistry = {\n register<T, TArgs extends readonly string[]>(definition: import(\"../contracts/resource.js\").ResourceDefinition<T, TArgs>): void {\n scope.assertActive();\n registerOwnedResource(resourceRegistry, instanceId, definition);\n ownedResourceIds.add(definition.id);\n },\n unregister(resourceId: string): void {\n scope.assertActive();\n if (!ownedResourceIds.has(resourceId)) {\n throw new Error(`Resource definition \"${resourceId}\" is not owned by plugin instance \"${instanceId}\"`);\n }\n resourceRegistry.unregister(resourceId);\n ownedResourceIds.delete(resourceId);\n },\n get<T, TArgs extends readonly string[]>(resourceId: string) {\n return resourceRegistry.get<T, TArgs>(resourceId);\n },\n _ids() {\n return [...ownedResourceIds];\n },\n };\n scope.onRevoke(revokeResourceDefinitions);\n scope.onDispose(revokeResourceDefinitions, `resource-definitions:${record.manifest.id}`, \"after-teardown\");\n scope.onDispose(() => contextTaskScheduler.dispose(), `task-scheduler:${record.manifest.id}`);\n const context: PluginContext = {\n pluginId: record.manifest.id,\n instanceId,\n unitId: unit.id,\n scope,\n signal: scope.signal,\n permissions: Object.freeze([...permissionLease.binding.requested.filter((permission) => permissionLease.has(permission))]),\n permissionLease,\n serviceBridge: options.serviceBridgeForPlugin?.(record.manifest.id, instanceId),\n taskScheduler: contextTaskScheduler,\n extension,\n config,\n onDispose(cleanup) {\n scope.onDispose(cleanup, `plugin-dispose:${record.manifest.id}`);\n record.disposeCallbacks.push(cleanup);\n },\n provide<T>(key: string, value: T) {\n scope.assertActive();\n capabilities.provide(key, value);\n record.capabilities.add(key);\n },\n get<T>(key: string): T {\n if (key === RUNTIME_MESSAGE_BUS) return scopedMessageBus as T;\n if (key === RESOURCE_REGISTRY_CAPABILITY) return scopedResourceRegistry as T;\n return capabilities.get<T>(key);\n },\n has(key: string): boolean { return capabilities.has(key); },\n require(key: string): void { capabilities.require(key); },\n messageBus: scopedMessageBus,\n };\n return context;\n };\n\n const beginStop = (record: PluginRecord, reason: string, preserveIntent: boolean, blockedBy?: readonly string[]): void => {\n if (record.state === \"stopping\" || record.state === \"cleanup-pending\") return;\n const wasStarting = record.state === \"starting\";\n record.state = \"stopping\";\n record.error = undefined;\n record.blockedBy = undefined;\n record.stopRequested = reason;\n record.preserveIntentOnStop = preserveIntent;\n record.scope?.revoke(reason);\n revokeContributions(record);\n for (const capability of record.capabilities) capabilities.revoke(capability);\n record.capabilities.clear();\n enabledSet.delete(record.manifest.id);\n if (wasStarting) record.pendingDesiredEnabled = desiredEnabledFor(record.manifest.id, record.manifest);\n if (blockedBy) record.blockedBy = [...blockedBy];\n resourceStore.disposeOwner(record.instanceId ?? record.manifest.id);\n bumpVersion();\n };\n\n const finishStop = async (record: PluginRecord, reason: string): Promise<void> => {\n const scope = record.scope;\n const preserveIntent = preserveIntentOf(record);\n let teardownError: unknown;\n const projectLateCleanup = (\n result: LifecycleDisposeResult | undefined,\n error?: unknown,\n ): void => {\n if (result) record.cleanup = result;\n if (error !== undefined) {\n record.error = errorMessage(error);\n bumpVersion();\n return;\n }\n if (!result || result.cleanupIncomplete || record.state !== \"cleanup-pending\") return;\n const desired = record.pendingDesiredEnabled ?? desiredEnabledFor(record.manifest.id, record.manifest);\n const missing = missingDependencies(record.manifest);\n const unavailable = runtimeUnavailable(record.manifest);\n record.state = desired && (missing.length > 0 || unavailable) ? \"blocked\" : \"disabled\";\n record.blockedBy = record.state === \"blocked\"\n ? [...new Set([...missing, ...(unavailable ? [unavailable] : [])])]\n : undefined;\n record.error = undefined;\n bumpVersion();\n if (desired && record.state === \"disabled\" && !hostDisposed) {\n queueMicrotask(() => { void enable(record.manifest.id).catch(() => undefined); });\n }\n };\n const cleanup = scope\n ? await scope.dispose({\n reason,\n timeoutMs: options.lifecycleCleanupTimeoutMs,\n teardown: async () => {\n try {\n if (record.teardown) await record.teardown();\n await releaseContributions(record);\n } catch (error) {\n teardownError = error;\n throw error;\n }\n },\n onLateSuccess: (_resourceId, result) => projectLateCleanup(result),\n onLateFailure: (_resourceId, error, result) => projectLateCleanup(result, error),\n })\n : undefined;\n record.cleanup = cleanup;\n record.scope = undefined;\n if (record.instanceId) instanceAttributes.delete(record.instanceId);\n record.instanceId = undefined;\n record.unitId = undefined;\n record.teardown = undefined;\n record.stopRequested = undefined;\n record.disposeCallbacks = [];\n const desired = record.pendingDesiredEnabled ?? desiredEnabledFor(record.manifest.id, record.manifest);\n record.pendingDesiredEnabled = undefined;\n const missing = missingDependencies(record.manifest);\n const unavailable = runtimeUnavailable(record.manifest);\n const incomplete = Boolean(cleanup?.pending.length && cleanup.errors.some((item) => item.code === \"lifecycle.cleanup_timeout\"));\n const error = teardownError ?? cleanup?.errors.find((item) => item.code !== \"lifecycle.cleanup_timeout\");\n if (incomplete) {\n record.state = \"cleanup-pending\";\n record.error = errorMessage(error ?? \"Plugin cleanup is still pending\");\n } else if (error || cleanup?.cleanupIncomplete) {\n record.state = \"error-disabled\";\n record.error = errorMessage(error ?? \"Plugin cleanup did not complete\");\n } else if (desired && (missing.length > 0 || unavailable)) {\n record.state = \"blocked\";\n record.blockedBy = [...new Set([...missing, ...(unavailable ? [unavailable] : [])])];\n } else {\n record.state = \"disabled\";\n record.error = undefined;\n record.blockedBy = undefined;\n }\n if (!preserveIntent && !desired) {\n internalConfigWrites.add(record.manifest.id);\n try { configStore.setEnabled(record.manifest.id, false); } finally { internalConfigWrites.delete(record.manifest.id); }\n }\n record.preserveIntentOnStop = undefined;\n bumpVersion();\n if (desired && record.state === \"disabled\" && !hostDisposed) {\n queueMicrotask(() => { void enable(record.manifest.id).catch(() => undefined); });\n }\n };\n\n const preserveIntentOf = (record: PluginRecord): boolean => record.preserveIntentOnStop === true;\n\n const stopPlugin = async (record: PluginRecord, reason: string, preserveIntent: boolean, blockedBy?: readonly string[]): Promise<void> => {\n const existing = stopping.get(record.manifest.id);\n if (existing) return existing;\n beginStop(record, reason, preserveIntent, blockedBy);\n const start = starting.get(record.manifest.id);\n const promise = (start ? start.catch(() => undefined) : Promise.resolve())\n .then(() => finishStop(record, reason))\n .finally(() => stopping.delete(record.manifest.id));\n stopping.set(record.manifest.id, promise);\n return promise;\n };\n\n const enable = async (pluginId: string): Promise<void> => {\n if (hostDisposed) throw new LifecycleScopeRevokedError(\"Plugin host is disposed\");\n const record = records.get(pluginId);\n if (!record) throw new Error(`Plugin \"${pluginId}\" is not registered`);\n // enable() expresses a new absolute local intent. Persist it before any\n // in-flight stop/start wait so callers can observe the new intent during\n // the transitional state as well.\n if (!options.pluginIntentCoordinator) {\n internalConfigWrites.add(pluginId);\n try { configStore.setEnabled(pluginId, true); }\n finally { internalConfigWrites.delete(pluginId); }\n }\n record.pendingDesiredEnabled = true;\n const existingStop = stopping.get(pluginId);\n if (existingStop) { await existingStop; }\n if (record.state === \"enabled\") return;\n const existing = starting.get(pluginId);\n if (existing) return existing;\n // 旧实例的 stopRequested 只用于让迟到的 setup 结果退出;停止完成后\n // 新一代实例必须清掉这个一次性标记,否则会被误判为仍在停止。\n record.stopRequested = undefined;\n if (record.state === \"cleanup-pending\") {\n throw new Error(`Plugin \"${pluginId}\" cannot start while cleanup is pending`);\n }\n if (record.state === \"error-disabled\") {\n record.error = undefined;\n record.cleanup = undefined;\n }\n const task = (async () => {\n const missing = missingDependencies(record.manifest);\n const unavailable = runtimeUnavailable(record.manifest);\n if (missing.length > 0 || unavailable) {\n record.state = \"blocked\";\n record.blockedBy = [...new Set([...missing, ...(unavailable ? [unavailable] : [])])];\n bumpVersion();\n return;\n }\n const unit = selected(record.manifest);\n if (!unit) {\n record.state = \"blocked\";\n record.blockedBy = [`runtime:${record.manifest.id}:unit-unavailable`];\n bumpVersion();\n return;\n }\n const instanceId = makeInstanceId(record.manifest.id, unit.id);\n let scope: LifecycleScope;\n try {\n const attributes = Object.freeze({\n ...rootAttributes,\n ...(options.runtimeUnitAttributes?.({\n pluginId: record.manifest.id,\n unitId: unit.id,\n runtime: unit.runtime,\n manifest: record.manifest,\n }) ?? {}),\n });\n const parent = options.runtimeUnitParentScope?.({\n pluginId: record.manifest.id,\n unitId: unit.id,\n runtime: unit.runtime,\n manifest: record.manifest,\n }) ?? rootScope;\n scope = parent.child(\"runtime-unit\", { pluginId: record.manifest.id, attributes });\n } catch (error) {\n record.state = \"blocked\";\n record.blockedBy = [errorMessage(error)];\n bumpVersion();\n return;\n }\n record.state = \"starting\";\n record.scope = scope;\n record.instanceId = instanceId;\n record.unitId = unit.id;\n instanceAttributes.set(instanceId, scope.identity.attributes);\n record.error = undefined;\n record.blockedBy = undefined;\n bumpVersion();\n try {\n const setup = setupFor(record.manifest, unit, options);\n if (!setup) throw new Error(`Runtime implementation is unavailable for ${record.manifest.id}/${unit.id}`);\n const context = buildContext(record, unit, scope, instanceId);\n const result = await setup(context);\n record.teardown = typeof result === \"function\" ? result : undefined;\n await registerContribution(record, unit, instanceId, scope);\n const declared = providesOfManifest(record.manifest, runtimeKind);\n const missingDeclarations = declared.filter((key) => !record.capabilities.has(key));\n if (missingDeclarations.length > 0) {\n throw new Error(`Plugin \"${record.manifest.id}\" did not provide declared capabilities: ${missingDeclarations.join(\", \")}`);\n }\n if (record.stopRequested || scope.state !== \"active\" || !desiredEnabledFor(record.manifest.id, record.manifest)) {\n return;\n }\n enabledSet.add(record.manifest.id);\n record.state = \"enabled\";\n record.pendingDesiredEnabled = undefined;\n bumpVersion();\n // Provider capability 变为可用后,按绝对意图恢复此前等待的消费者。\n // 放到微任务避免在当前 setup 调用栈中重入 Host 状态机。\n queueMicrotask(() => { void reconcile().catch(() => undefined); });\n } catch (error) {\n if (record.stopRequested || scope.state !== \"active\") {\n return;\n }\n record.state = \"error-disabled\";\n record.error = errorMessage(error);\n record.scope?.revoke(\"plugin setup failed\");\n revokeContributions(record);\n for (const capability of record.capabilities) capabilities.revoke(capability);\n record.capabilities.clear();\n record.cleanup = await scope.dispose({ reason: \"plugin setup failed\", timeoutMs: options.lifecycleCleanupTimeoutMs });\n record.scope = undefined;\n instanceAttributes.delete(instanceId);\n record.instanceId = undefined;\n record.unitId = undefined;\n bumpVersion();\n throw new StartupPluginError({\n pluginId: record.manifest.id,\n unitId: unit.id,\n capabilities: providesOfManifest(record.manifest, runtimeKind),\n state: record.state,\n error: record.error,\n });\n }\n })();\n starting.set(pluginId, task);\n try { await task; } finally { starting.delete(pluginId); }\n };\n\n const collectDisablePlan = (pluginId: string): PluginRecord[] => {\n const plan: PluginRecord[] = [];\n const visited = new Set<string>();\n const currentGraph = graph();\n const activePluginIds = new Set([\n ...enabledSet,\n ...[...records.values()]\n .filter((record) => record.state === \"starting\" || record.state === \"stopping\")\n .map((record) => record.manifest.id),\n ]);\n const visit = (providerId: string): void => {\n for (const dependent of reverseDependentsOf(currentGraph, providerId, activePluginIds)) {\n if (visited.has(dependent.pluginId)) continue;\n visited.add(dependent.pluginId);\n visit(dependent.pluginId);\n const dependentRecord = records.get(dependent.pluginId);\n if (dependentRecord) plan.push(dependentRecord);\n }\n };\n visit(pluginId);\n const target = records.get(pluginId);\n if (target) plan.push(target);\n return plan;\n };\n\n const reconcile = async (): Promise<void> => {\n if (hostDisposed) return;\n if (reconcilePromise) return reconcilePromise;\n reconcilePromise = (async () => {\n const manifests = [...knownManifests.values()];\n const ordered = orderManifestsByDependencies(manifests, runtimeKind);\n for (const manifest of ordered) {\n const record = records.get(manifest.id);\n if (!record) continue;\n if (record && (record.state === \"enabled\" || record.state === \"starting\")) {\n const missing = missingDependencies(manifest);\n const unavailable = runtimeUnavailable(manifest);\n if (missing.length > 0 || unavailable) {\n await stopPlugin(\n record,\n \"runtime dependency unavailable\",\n true,\n [...new Set([...missing, ...(unavailable ? [unavailable] : [])])],\n );\n }\n }\n if (desiredEnabledFor(manifest.id, manifest) && record.state !== \"enabled\" && record.state !== \"starting\") {\n try {\n await enable(manifest.id);\n } catch (error) {\n // Optional startup failure is represented in the Host state and\n // must not prevent unrelated required units from starting.\n if (!isRequired(manifest)) continue;\n throw error;\n }\n }\n }\n for (const manifest of manifests) {\n const record = records.get(manifest.id);\n if (record && !desiredEnabledFor(manifest.id, manifest) && (record.state === \"enabled\" || record.state === \"starting\")) {\n await stopPlugin(record, \"desired intent disabled\", false);\n }\n }\n })().finally(() => { reconcilePromise = undefined; });\n return reconcilePromise;\n };\n\n function orderManifestsByDependencies(\n manifests: readonly PluginManifest[],\n runtime?: RuntimeKind,\n ): PluginManifest[] {\n const byId = new Map(manifests.map((manifest) => [manifest.id, manifest]));\n const providers = new Map<string, string>();\n for (const manifest of manifests) {\n for (const capability of providesOfManifest(manifest, runtime)) {\n if (!providers.has(capability)) providers.set(capability, manifest.id);\n }\n }\n const visited = new Set<string>();\n const visiting = new Set<string>();\n const ordered: PluginManifest[] = [];\n const visit = (manifest: PluginManifest): void => {\n if (visited.has(manifest.id)) return;\n if (visiting.has(manifest.id)) return;\n visiting.add(manifest.id);\n for (const dependency of dependenciesFor(manifest, runtime)) {\n if (dependency.optional) continue;\n const provider = providers.get(dependency.capability);\n const providerManifest = provider ? byId.get(provider) : undefined;\n if (providerManifest) visit(providerManifest);\n }\n visiting.delete(manifest.id);\n visited.add(manifest.id);\n ordered.push(manifest);\n };\n for (const manifest of manifests) visit(manifest);\n return ordered;\n }\n\n const host: PluginHost = {\n capabilities,\n messageBus,\n resourceRegistry,\n resourceStore,\n rootScope,\n taskScheduler,\n installed: () => [...knownManifests.keys()],\n manifests: () => [...knownManifests.keys()],\n state(pluginId) {\n const record = records.get(pluginId);\n if (!record) return { id: pluginId, kind: \"disabled\", lifecycleState: \"disabled\" };\n const desired = desiredEnabledFor(pluginId, record.manifest);\n const unit = selected(record.manifest);\n return {\n id: pluginId,\n kind: record.state,\n lifecycleState: lifecycleStateFor(record.state, desired),\n ...(record.error ? { error: record.error } : {}),\n desiredEnabled: desired,\n ...(desiredRevisionFor(pluginId) !== undefined ? { desiredRevision: desiredRevisionFor(pluginId) } : {}),\n ...(record.instanceId ? { instanceId: record.instanceId } : {}),\n ...(record.unitId ? { unitId: record.unitId } : {}),\n ...(record.blockedBy ? { blockedBy: [...record.blockedBy] } : {}),\n ...(record.cleanup ? { cleanup: record.cleanup } : {}),\n units: unit ? [{\n pluginId,\n unitId: unit.id,\n runtime: unit.runtime,\n kind: record.state,\n ...(record.instanceId ? { instanceId: record.instanceId } : {}),\n ...(record.error ? { error: record.error } : {}),\n }] : [],\n };\n },\n scope: (pluginId) => records.get(pluginId)?.scope,\n refreshRuntimeUnitSnapshots() { runtimeSnapshots = options.runtimeSnapshots; bumpVersion(); },\n reconcile,\n graph,\n version: () => versionCounter,\n subscribe(listener) { listeners.add(listener); return () => listeners.delete(listener); },\n getManifest: (pluginId) => knownManifests.get(pluginId),\n reverseDeps(pluginId) { return graph().reverse[pluginId] ?? []; },\n validateManifestSet(manifests) {\n for (const manifest of manifests) validateManifest(manifest);\n validatePluginGraph([...manifests], {\n runtime: runtimeKind,\n builtinCapabilities: new Set([\n ...capabilities.keys(),\n ...(options.remoteServiceReferences?.() ?? []).map((reference) => reference.capabilityId),\n ]),\n externalRuntimeDependencies: options.externalRuntimeDependencies,\n });\n },\n provide<T>(key: string, value: T) {\n if (hostDisposed) throw new LifecycleScopeRevokedError(\"Plugin host is disposed\");\n capabilities.provide(key, value);\n bumpVersion();\n },\n register: async (manifest) => {\n if (hostDisposed) throw new LifecycleScopeRevokedError(\"Plugin host is disposed\");\n validateManifest(manifest);\n if (knownManifests.has(manifest.id)) throw new Error(`Plugin \"${manifest.id}\" is already registered`);\n knownManifests.set(manifest.id, manifest);\n records.set(manifest.id, { manifest, state: \"registered\", disposeCallbacks: [], capabilities: new Set(), contributions: [] });\n bumpVersion();\n if (desiredEnabledFor(manifest.id, manifest)) await enable(manifest.id);\n },\n registerAll: async (manifests) => {\n if (hostDisposed) throw new LifecycleScopeRevokedError(\"Plugin host is disposed\");\n const current = [...manifests];\n for (const manifest of current) {\n validateManifest(manifest);\n if (knownManifests.has(manifest.id)) throw new Error(`Plugin \"${manifest.id}\" is already registered`);\n }\n validatePluginGraph(current, {\n runtime: runtimeKind,\n builtinCapabilities: new Set([\n ...capabilities.keys(),\n ...(options.remoteServiceReferences?.() ?? []).map((reference) => reference.capabilityId),\n ]),\n allowMissingDependencies: false,\n externalRuntimeDependencies: options.externalRuntimeDependencies,\n });\n for (const manifest of current) {\n knownManifests.set(manifest.id, manifest);\n records.set(manifest.id, { manifest, state: \"registered\", disposeCallbacks: [], capabilities: new Set(), contributions: [] });\n }\n bumpVersion();\n await reconcile();\n },\n enable,\n retry: async (pluginId) => {\n const record = records.get(pluginId);\n if (!record) throw new Error(`Plugin \"${pluginId}\" is not registered`);\n record.error = undefined;\n record.cleanup = undefined;\n record.state = \"registered\";\n await enable(pluginId);\n },\n submitIntent: async (pluginId, desired): Promise<PluginIntentSubmissionResult> => {\n if (!knownManifests.has(pluginId)) throw new Error(`Plugin \"${pluginId}\" is not registered`);\n if (options.pluginIntentCoordinator) {\n const current = options.pluginIntentCoordinator.snapshot();\n const command = {\n commandId: `plugin-intent:${pluginId}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`,\n authorityInstanceId: options.pluginIntentCoordinator.authorityInstanceId,\n expectedRevision: current.revision,\n pluginId,\n desiredEnabled: desired,\n };\n return options.pluginIntentCoordinator.submit(command);\n }\n internalConfigWrites.add(pluginId);\n try { configStore.setEnabled(pluginId, desired); } finally { internalConfigWrites.delete(pluginId); }\n if (desired) await enable(pluginId);\n else await host.disable(pluginId);\n const next = Object.freeze({\n revision: 0,\n desiredEnabled: { ...configStore.read() },\n desiredRevision: {},\n });\n return { status: \"accepted\", commandId: `local:${pluginId}`, snapshot: next, persisted: true };\n },\n disable: async (pluginId) => {\n const record = records.get(pluginId);\n if (!record) throw new Error(`Plugin \"${pluginId}\" is not registered`);\n if (isRequired(record.manifest)) return { ok: false, reason: `Plugin \"${pluginId}\" cannot be disabled` } as const;\n if (!options.pluginIntentCoordinator) {\n internalConfigWrites.add(pluginId);\n try { configStore.setEnabled(pluginId, false); } finally { internalConfigWrites.delete(pluginId); }\n }\n const plan = collectDisablePlan(pluginId);\n // 先同步撤掉整个级联计划,再逐项等待异步收尾;这样消费者不会在\n // 提供者能力仍可见的窗口里自动重启。\n for (const item of plan) beginStop(\n item,\n item.manifest.id === pluginId ? \"plugin disabled\" : `dependency ${pluginId} disabled`,\n item.manifest.id !== pluginId,\n item.manifest.id === pluginId ? undefined : [pluginId],\n );\n for (const item of plan) await stopPlugin(\n item,\n item.manifest.id === pluginId ? \"plugin disabled\" : `dependency ${pluginId} disabled`,\n item.manifest.id !== pluginId,\n item.manifest.id === pluginId ? undefined : [pluginId],\n );\n return { ok: true } as const;\n },\n suspend: async (pluginId, reason = \"runtime identity changed\") => {\n const record = records.get(pluginId);\n if (!record) return;\n if (record.state !== \"enabled\" && record.state !== \"starting\") return;\n // suspend 不改变用户/权威控制面的 desiredEnabled;它只撤销当前\n // Scope,避免身份切换把永久启用的系统插件写成 disabled。\n beginStop(record, reason, true);\n await stopPlugin(record, reason, true);\n },\n unregister: async (pluginId) => {\n const record = records.get(pluginId);\n if (!record) return;\n if (isRequired(record.manifest)) throw new Error(`Plugin \"${pluginId}\" cannot be unregistered`);\n await host.disable(pluginId);\n if (record.state === \"cleanup-pending\") throw new Error(`Plugin \"${pluginId}\" cleanup is still pending`);\n records.delete(pluginId);\n knownManifests.delete(pluginId);\n bumpVersion();\n },\n dispose: (reason = \"plugin host disposed\") => {\n if (disposePromise) return disposePromise;\n hostDisposed = true;\n removeConfigSubscription();\n removeIntentSubscription();\n disposePromise = (async () => {\n for (const record of [...records.values()].reverse()) {\n if (record.state === \"enabled\" || record.state === \"starting\") {\n await stopPlugin(record, reason, false);\n }\n }\n return rootScope.dispose({ reason, timeoutMs: options.lifecycleCleanupTimeoutMs });\n })();\n return disposePromise;\n },\n assertCapabilities(required, extra = {}) {\n const details: StartupCapabilityErrorDetails[] = [];\n for (const capability of required) {\n if (capabilities.has(capability)) continue;\n const provider = graph().providers?.[capability]?.[0];\n const providerRecord = provider ? records.get(provider) : undefined;\n details.push({\n capability,\n providerPluginId: provider,\n providerState: providerRecord?.state,\n providerError: providerRecord?.error,\n configuredEnabled: providerRecord ? desiredEnabledFor(providerRecord.manifest.id, providerRecord.manifest) : undefined,\n });\n }\n if (details.length > 0) throw new StartupCapabilityError(details, extra.phase ?? \"startup\");\n },\n };\n\n // 将插件意图控制面接回 Host,但不把控制面实现复制进通用核心。\n if (options.pluginIntentCoordinator) {\n removeIntentSubscription = options.pluginIntentCoordinator.subscribe((snapshot) => {\n intentSnapshot = snapshot;\n void reconcile().catch(() => undefined);\n bumpVersion();\n });\n }\n removeConfigSubscription = configStore.subscribe((snapshot) => {\n if (internalConfigWrites.size > 0) return;\n for (const [pluginId, manifest] of knownManifests) {\n if (manifest.meta.startup !== \"required\" && manifest.meta.canDisable !== false) continue;\n if (snapshot[pluginId] === true) continue;\n internalConfigWrites.add(pluginId);\n try { configStore.setEnabled(pluginId, true); }\n finally { internalConfigWrites.delete(pluginId); }\n }\n void reconcile().catch(() => undefined);\n bumpVersion();\n });\n return host;\n}\n\nexport interface PluginHost {\n /** 通用 capability 注册表。 */\n capabilities: CapabilityRegistry;\n /** 通用消息总线。 */\n messageBus: MessageBus;\n /** 通用资源定义注册表。 */\n resourceRegistry: ResourceRegistry;\n /** 通用资源缓存和订阅 Store。 */\n resourceStore: ResourceStoreApi;\n /** Host 根生命周期 Scope。 */\n readonly rootScope: LifecycleScope;\n /** 根 Scope 的任务调度器。 */\n readonly taskScheduler: ScopedTaskScheduler;\n /** 已知产品标识。 */\n installed(): string[];\n /** 已知产品标识;installed 的兼容别名。 */\n manifests(): string[];\n /** 查询产品运行状态。 */\n state(pluginId: string): PluginState;\n /** 查询当前实例 Scope。 */\n scope(pluginId: string): LifecycleScope | undefined;\n /** 让宿主重新读取远端运行单元快照。 */\n refreshRuntimeUnitSnapshots(): void;\n /** 让领域适配器在 Scope 身份变化后立即完成一次协调。 */\n reconcile(): Promise<void>;\n /** 获取依赖图。 */\n graph(): PluginGraph;\n /** Host 版本。 */\n version(): number;\n /** 订阅 Host 变化。 */\n subscribe(listener: HostListener): () => void;\n /** 获取清单。 */\n getManifest(pluginId: string): PluginManifest | undefined;\n /** 查询反向依赖。 */\n reverseDeps(pluginId: string): PluginReverseDep[];\n /** 校验一组清单。 */\n validateManifestSet(manifests: readonly PluginManifest[]): void;\n /** 注入一个不归属插件实例的内建 capability。 */\n provide<T>(key: string, value: T): void;\n /** 注册并按当前意图尝试启动。 */\n register(manifest: PluginManifest): Promise<void>;\n /** 批量注册并按依赖顺序协调。 */\n registerAll(manifests: readonly PluginManifest[]): Promise<void>;\n /** 启动一个插件。 */\n enable(pluginId: string): Promise<void>;\n /** 清除失败状态并重试。 */\n retry(pluginId: string): Promise<void>;\n /** 提交绝对启停意图。 */\n submitIntent(pluginId: string, desiredEnabled: boolean): Promise<PluginIntentSubmissionResult>;\n /** 停止一个插件及其反向依赖者。 */\n disable(pluginId: string): Promise<{ ok: true } | { ok: false; reason: string }>;\n /** 暂停当前实例但保留启用意图;供宿主身份世代切换时撤权重建。 */\n suspend(pluginId: string, reason?: string): Promise<void>;\n /** 从 Host 删除一个插件。 */\n unregister(pluginId: string): Promise<void>;\n /** 停止所有实例并释放根 Scope。 */\n dispose(reason?: string): Promise<LifecycleDisposeResult>;\n /** 启动前检查 capability。 */\n assertCapabilities(capabilities: readonly string[], options?: { phase?: string }): void;\n}\n","// 运行单元实现注册表。\n//\n// contracts 只描述 get() 契约;这里提供 Window / Worker 装配层可复用的\n// Map 实现。实现函数和产品静态描述分开保存,避免 manifest 被当成可执行目录。\n\nimport type {\n PluginSetup,\n RuntimeUnitImplementationRegistry,\n} from \"../contracts/plugin.js\";\n\nexport interface RuntimeUnitImplementation {\n /** 产品标识。 */\n pluginId: string;\n /** 稳定运行单元标识。 */\n unitId: string;\n /** 当前环境的可执行入口。 */\n setup: PluginSetup;\n}\n\nfunction implementationKey(pluginId: string, unitId: string): string {\n return `${pluginId}\\u0000${unitId}`;\n}\n\n/** 创建一个拒绝重复注册、按产品和单元查找实现的运行时注册表。 */\nexport function createRuntimeUnitImplementationRegistry(\n implementations: readonly RuntimeUnitImplementation[] = [],\n): RuntimeUnitImplementationRegistry & {\n register(implementation: RuntimeUnitImplementation): void;\n unregister(pluginId: string, unitId: string): void;\n} {\n const entries = new Map<string, PluginSetup>();\n const register = (implementation: RuntimeUnitImplementation): void => {\n const key = implementationKey(implementation.pluginId, implementation.unitId);\n if (entries.has(key)) throw new Error(`运行单元实现重复注册: ${implementation.pluginId}/${implementation.unitId}`);\n entries.set(key, implementation.setup);\n };\n for (const implementation of implementations) register(implementation);\n\n return {\n get(pluginId, unitId) {\n return entries.get(implementationKey(pluginId, unitId));\n },\n register,\n unregister(pluginId, unitId) {\n entries.delete(implementationKey(pluginId, unitId));\n },\n };\n}\n","import type {\n LifecycleDisposeResult,\n RemoteServiceProxy,\n RemoteServiceReference,\n RuntimeKind,\n} from \"../contracts/lifecycle.js\";\nimport type { PluginHost } from \"../host/createPluginHost.js\";\nimport type { RuntimeSnapshotUnit } from \"./runtimeProtocol.js\";\n\nexport type RuntimeAppState =\n | \"starting\"\n | \"ready\"\n | \"stopping\"\n | \"failed\"\n | \"disposed\"\n | \"disconnected\";\n\nexport interface RuntimeStatusSnapshot {\n runtimeId: string;\n runtimeKind: RuntimeKind;\n runtimeInstanceId: string;\n state: RuntimeAppState;\n revision: number;\n units: readonly RuntimeSnapshotUnit[];\n services: readonly RemoteServiceReference[];\n error?: string;\n}\n\nexport type RuntimeStatusListener = (snapshot: RuntimeStatusSnapshot) => void;\n\nexport interface WindowApp {\n readonly runtimeKind: \"window-main\";\n readonly runtimeId: string;\n readonly runtimeInstanceId: string;\n /** 已由 createWindowApp 装配并注册完成的本地 Host。 */\n readonly host: PluginHost;\n state(): RuntimeStatusSnapshot;\n /** 获取当前本地 capability;停止或销毁后同步抛错。 */\n capability<T>(capabilityId: string): T;\n subscribe(listener: RuntimeStatusListener): () => void;\n dispose(reason?: string): Promise<LifecycleDisposeResult>;\n}\n\nexport interface RuntimeHandle {\n readonly runtimeKind: \"shared-worker\";\n readonly runtimeId: string;\n /** 当前已观察到的 Worker 启动身份;首份快照前为 undefined。 */\n readonly runtimeInstanceId?: string;\n state(): RuntimeStatusSnapshot;\n capability<T = unknown>(capabilityId: string, options?: {\n contractVersion?: string;\n }): RemoteServiceProxy & { readonly serviceType?: T };\n subscribe(listener: RuntimeStatusListener): () => void;\n dispose(reason?: string): Promise<void>;\n}\n\n/** 跨 realm 初始化失败;不把 required 插件错误包装成成功状态。 */\nexport interface RuntimeInitializationErrorDetails {\n pluginId?: string;\n unitId?: string;\n phase: \"validate\" | \"register\" | \"startup\" | \"snapshot\";\n error: string;\n}\n\nexport class RuntimeInitializationError extends Error {\n readonly code = \"runtime_initialization_failed\" as const;\n readonly details: RuntimeInitializationErrorDetails;\n\n constructor(details: RuntimeInitializationErrorDetails) {\n super(\n `Runtime initialization failed${details.pluginId ? ` for ${details.pluginId}` : \"\"}`\n + ` during ${details.phase}: ${details.error}`,\n );\n this.name = \"RuntimeInitializationError\";\n this.details = details;\n }\n}\n\nexport class RuntimeUnavailableError extends Error {\n readonly code = \"transport_unavailable\" as const;\n\n constructor(message = \"Runtime is unavailable\") {\n super(message);\n this.name = \"RuntimeUnavailableError\";\n }\n}\n","// Window <-> SharedWorker 的 WebLoom v2 运行时协议。\n//\n// Runtime 只发布完整快照。没有 hello、握手、baseline 或 resync 控制消息;\n// 端口本身就是连接边界,服务调用则只走 call/result/error/cancel。\n\nimport type { PluginStateKind, PluginUnitState } from \"../contracts/plugin.js\";\nimport type {\n RemoteServiceMessageCodec,\n RemoteServiceReference,\n RuntimeKind,\n} from \"../contracts/lifecycle.js\";\nimport { createRemoteServiceMessageCodec } from \"../contracts/lifecycle.js\";\n\nexport const RUNTIME_PROTOCOL_VERSION = \"webloom.runtime.v2\";\nexport const RUNTIME_SNAPSHOT_TYPE = \"webloom.runtime.snapshot\";\nexport const RUNTIME_ERROR_TYPE = \"webloom.runtime.error\";\n\nexport interface RuntimeErrorMessage {\n type: typeof RUNTIME_ERROR_TYPE;\n protocolVersion: string;\n code: \"runtime_initialization_failed\" | \"protocol_mismatch\" | \"transport_unavailable\";\n message: string;\n pluginId?: string;\n unitId?: string;\n phase?: \"startup\" | \"snapshot\";\n}\n\nexport interface RuntimeSnapshot {\n type: typeof RUNTIME_SNAPSHOT_TYPE;\n protocolVersion: string;\n runtimeId: string;\n runtimeKind: RuntimeKind;\n runtimeInstanceId: string;\n revision: number;\n state: \"starting\" | \"ready\" | \"stopping\" | \"failed\" | \"disposed\";\n units: readonly RuntimeSnapshotUnit[];\n services: readonly RemoteServiceReference[];\n}\n\nexport interface RuntimeSnapshotUnit {\n pluginId: string;\n unitId: string;\n runtime: RuntimeKind;\n instanceId?: string;\n state: PluginStateKind;\n}\n\nfunction isRecord(input: unknown): input is Record<string, unknown> {\n return typeof input === \"object\" && input !== null;\n}\n\nfunction isNonEmptyString(input: unknown): input is string {\n return typeof input === \"string\" && input.length > 0;\n}\n\nfunction isRuntimeKind(input: unknown): input is RuntimeKind {\n return input === \"window-main\" || input === \"shared-worker\";\n}\n\nfunction isPluginStateKind(input: unknown): input is PluginStateKind {\n return input === \"registered\"\n || input === \"starting\"\n || input === \"stopping\"\n || input === \"enabled\"\n || input === \"disabled\"\n || input === \"blocked\"\n || input === \"error-disabled\"\n || input === \"cleanup-pending\"\n || input === \"unknown\";\n}\n\nfunction isRemoteServiceReference(input: unknown): input is RemoteServiceReference {\n if (!isRecord(input)) return false;\n const reference = input as Partial<RemoteServiceReference>;\n return isNonEmptyString(reference.capabilityId)\n && isNonEmptyString(reference.contractVersion)\n && isRuntimeKind(reference.runtime)\n && isNonEmptyString(reference.runtimeInstanceId)\n && isNonEmptyString(reference.serviceInstanceId)\n && (reference.status === \"starting\"\n || reference.status === \"ready\"\n || reference.status === \"unavailable\"\n || reference.status === \"failed\")\n && isRecord(reference.attributes)\n && !Array.isArray(reference.attributes)\n && (reference.grantId === undefined || isNonEmptyString(reference.grantId))\n && (reference.authorizationRevision === undefined\n || (Number.isSafeInteger(reference.authorizationRevision) && reference.authorizationRevision >= 0));\n}\n\nfunction isRuntimeSnapshotUnit(input: unknown): input is RuntimeSnapshotUnit {\n if (!isRecord(input)) return false;\n const unit = input as Partial<RuntimeSnapshotUnit>;\n return isNonEmptyString(unit.pluginId)\n && isNonEmptyString(unit.unitId)\n && isRuntimeKind(unit.runtime)\n && isPluginStateKind(unit.state)\n && (unit.instanceId === undefined || isNonEmptyString(unit.instanceId));\n}\n\nexport function createRuntimeMessageCodec(): RemoteServiceMessageCodec {\n return createRemoteServiceMessageCodec({\n prefix: \"webloom.runtime\",\n protocolVersion: RUNTIME_PROTOCOL_VERSION,\n });\n}\n\n/** 只验证外层结构;协议版本接受由 RuntimeHandle 单独处理。 */\nexport function isRuntimeSnapshot(input: unknown): input is RuntimeSnapshot {\n if (!isRecord(input)) return false;\n const message = input as Partial<RuntimeSnapshot>;\n return message.type === RUNTIME_SNAPSHOT_TYPE\n && isNonEmptyString(message.protocolVersion)\n && isNonEmptyString(message.runtimeId)\n && isRuntimeKind(message.runtimeKind)\n && isNonEmptyString(message.runtimeInstanceId)\n && Number.isSafeInteger(message.revision)\n && (message.revision as number) >= 0\n && Array.isArray(message.units)\n && message.units.every(isRuntimeSnapshotUnit)\n && Array.isArray(message.services)\n && message.services.every(isRemoteServiceReference)\n && (message.state === \"starting\"\n || message.state === \"ready\"\n || message.state === \"stopping\"\n || message.state === \"failed\"\n || message.state === \"disposed\");\n}\n\nexport function isRuntimeSnapshotProtocol(input: RuntimeSnapshot): boolean {\n return input.protocolVersion === RUNTIME_PROTOCOL_VERSION;\n}\n\nexport function isRuntimeError(input: unknown): input is RuntimeErrorMessage {\n if (!isRecord(input)) return false;\n const message = input as Partial<RuntimeErrorMessage>;\n return message.type === RUNTIME_ERROR_TYPE\n && isNonEmptyString(message.protocolVersion)\n && (message.code === \"runtime_initialization_failed\"\n || message.code === \"protocol_mismatch\"\n || message.code === \"transport_unavailable\")\n && isNonEmptyString(message.message)\n && (message.pluginId === undefined || isNonEmptyString(message.pluginId))\n && (message.unitId === undefined || isNonEmptyString(message.unitId))\n && (message.phase === undefined || message.phase === \"startup\" || message.phase === \"snapshot\");\n}\n\n/** 将 Host 的 PluginUnitState 映射成不会泄露领域配置的运行时快照。 */\nexport function unitSnapshotFromState(\n state: PluginUnitState,\n runtime: RuntimeKind,\n): RuntimeSnapshotUnit {\n return {\n pluginId: state.pluginId,\n unitId: state.unitId,\n runtime,\n ...(state.instanceId !== undefined ? { instanceId: state.instanceId } : {}),\n state: state.kind,\n };\n}\n","// 跨 Worker 服务桥的 WebLoom v2 实现。\n//\n// capability() / getProxy() 只创建惰性代理。第一次 call() 在同一个总\n// deadline 内等待完整目录和远端执行;绑定成功后代理永久固定到一份\n// runtimeInstanceId + serviceInstanceId,目录替换、断线和 Runtime 重启只会\n// 撤销它,绝不静默换绑。\n\nimport type {\n LifecycleScope,\n RemoteServiceBridge,\n RemoteServiceCallContext,\n RemoteServiceCallOptions,\n RemoteServiceErrorCode,\n RemoteServiceLookup,\n RemoteServiceProxy,\n RemoteServiceReference,\n RemoteServiceSnapshot,\n RemoteServiceSnapshotResult,\n RemoteServiceTransport,\n} from \"../contracts/lifecycle.js\";\nimport {\n RemoteServiceError,\n} from \"../contracts/lifecycle.js\";\n\nexport interface CreateServiceBridgeOptions {\n /** 要接受的精确服务协议版本。 */\n protocolVersion: string;\n /** 实际端口 RPC 传输;桥不负责重放请求。 */\n transport: RemoteServiceTransport;\n /** 默认总 deadline;必须有限且大于零。 */\n defaultCallTimeoutMs?: number;\n}\n\ninterface ProxyRecord {\n boundReference?: RemoteServiceReference;\n revoked: boolean;\n reason: string;\n controller: AbortController;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction stableAttributes(value: Readonly<Record<string, unknown>>): string {\n const normalize = (input: unknown): unknown => {\n if (Array.isArray(input)) return input.map(normalize);\n if (!input || typeof input !== \"object\") return input;\n return Object.fromEntries(\n Object.entries(input as Record<string, unknown>)\n .sort(([left], [right]) => left.localeCompare(right))\n .map(([key, item]) => [key, normalize(item)]),\n );\n };\n return JSON.stringify(normalize(value));\n}\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction isSafeAttributeValue(value: unknown, seen: Set<object>): boolean {\n if (value === null || value === undefined || typeof value === \"string\" || typeof value === \"boolean\") return true;\n if (typeof value === \"number\") return Number.isFinite(value);\n if (typeof value !== \"object\") return false;\n if (seen.has(value)) return false;\n seen.add(value);\n const valid = Array.isArray(value)\n ? value.every((item) => isSafeAttributeValue(item, seen))\n : isPlainRecord(value)\n && !Reflect.ownKeys(value).some((key) => typeof key !== \"string\")\n && Object.values(value).every((item) => isSafeAttributeValue(item, seen));\n seen.delete(value);\n return valid;\n}\n\nfunction isValidAttributes(value: unknown): value is Readonly<Record<string, unknown>> {\n return isPlainRecord(value) && isSafeAttributeValue(value, new Set<object>());\n}\n\nfunction isValidSnapshot(snapshot: RemoteServiceSnapshot): boolean {\n if (!snapshot || typeof snapshot !== \"object\"\n || typeof snapshot.protocolVersion !== \"string\"\n || snapshot.protocolVersion.length === 0\n || typeof snapshot.runtimeInstanceId !== \"string\"\n || snapshot.runtimeInstanceId.length === 0\n || !Number.isSafeInteger(snapshot.revision)\n || snapshot.revision < 0\n || !Array.isArray(snapshot.services)) return false;\n if (snapshot.runtimeId !== undefined && (typeof snapshot.runtimeId !== \"string\" || snapshot.runtimeId.length === 0)) return false;\n if (snapshot.runtimeKind !== undefined && snapshot.runtimeKind !== \"window-main\" && snapshot.runtimeKind !== \"shared-worker\") return false;\n if (snapshot.state !== undefined\n && snapshot.state !== \"starting\"\n && snapshot.state !== \"ready\"\n && snapshot.state !== \"stopping\"\n && snapshot.state !== \"failed\"\n && snapshot.state !== \"disposed\") return false;\n\n const bindingKeys = new Set<string>();\n const serviceCapabilityKeys = new Set<string>();\n const readyLookupKeys = new Set<string>();\n for (const service of snapshot.services) {\n if (!service || typeof service !== \"object\"\n || typeof service.capabilityId !== \"string\" || service.capabilityId.length === 0\n || typeof service.contractVersion !== \"string\" || service.contractVersion.length === 0\n || (service.runtime !== \"window-main\" && service.runtime !== \"shared-worker\")\n || service.runtimeInstanceId !== snapshot.runtimeInstanceId\n || typeof service.serviceInstanceId !== \"string\" || service.serviceInstanceId.length === 0\n || (service.status !== \"starting\" && service.status !== \"ready\" && service.status !== \"unavailable\" && service.status !== \"failed\")\n || !isValidAttributes(service.attributes)\n || (service.grantId !== undefined && (typeof service.grantId !== \"string\" || service.grantId.length === 0))\n || (service.authorizationRevision !== undefined\n && (!Number.isSafeInteger(service.authorizationRevision) || service.authorizationRevision < 0))) return false;\n if (snapshot.runtimeKind !== undefined && service.runtime !== snapshot.runtimeKind) return false;\n\n const key = bindingKey(service);\n if (bindingKeys.has(key)) return false;\n bindingKeys.add(key);\n const serviceCapabilityKey = `${service.capabilityId}\\u0000${service.serviceInstanceId}`;\n if (serviceCapabilityKeys.has(serviceCapabilityKey)) return false;\n serviceCapabilityKeys.add(serviceCapabilityKey);\n if (service.status === \"ready\") {\n const lookupKey = `${service.capabilityId}\\u0000${service.contractVersion}\\u0000${service.runtime}`;\n if (readyLookupKeys.has(lookupKey)) return false;\n readyLookupKeys.add(lookupKey);\n }\n }\n return true;\n}\n\nfunction referenceKey(reference: RemoteServiceReference): string {\n return [\n reference.capabilityId,\n reference.contractVersion,\n reference.runtime,\n reference.runtimeInstanceId,\n reference.serviceInstanceId,\n reference.status,\n stableAttributes(reference.attributes),\n reference.grantId ?? \"null\",\n reference.authorizationRevision ?? \"null\",\n ].join(\"\\u0000\");\n}\n\nfunction bindingKey(reference: RemoteServiceReference): string {\n return [\n reference.capabilityId,\n reference.contractVersion,\n reference.runtime,\n reference.runtimeInstanceId,\n reference.serviceInstanceId,\n ].join(\"\\u0000\");\n}\n\nfunction lookupMatches(reference: RemoteServiceReference, lookup: RemoteServiceLookup): boolean {\n return reference.capabilityId === lookup.capabilityId\n && reference.contractVersion === lookup.contractVersion\n && (lookup.runtime === undefined || reference.runtime === lookup.runtime);\n}\n\nfunction ensureTimeout(value: number | undefined, label: string): number {\n const timeout = value ?? 30_000;\n if (!Number.isFinite(timeout) || timeout <= 0) {\n throw new TypeError(`${label} must be a finite number greater than zero`);\n }\n return timeout;\n}\n\nfunction mergeSignals(...signals: Array<AbortSignal | undefined>): {\n signal: AbortSignal;\n dispose: () => void;\n} {\n const active = signals.filter((signal): signal is AbortSignal => signal !== undefined);\n if (active.length === 0) return { signal: new AbortController().signal, dispose: () => undefined };\n const alreadyAborted = active.find((signal) => signal.aborted);\n if (alreadyAborted) {\n const controller = new AbortController();\n controller.abort(alreadyAborted.reason);\n return { signal: controller.signal, dispose: () => undefined };\n }\n const controller = new AbortController();\n const listeners = active.map((signal) => {\n const listener = () => {\n try { controller.abort(signal.reason); } catch { controller.abort(); }\n };\n signal.addEventListener(\"abort\", listener, { once: true });\n return { signal, listener };\n });\n return {\n signal: controller.signal,\n dispose: () => {\n for (const { signal, listener } of listeners) signal.removeEventListener(\"abort\", listener);\n },\n };\n}\n\nfunction abortedError(signal: AbortSignal, fallback: RemoteServiceErrorCode = \"request_cancelled\"): Error {\n const reason = signal.reason;\n if (reason instanceof Error && typeof (reason as Error & { code?: unknown }).code === \"string\") return reason;\n if (reason instanceof Error && fallback === \"request_cancelled\") {\n return new RemoteServiceError(\"request_cancelled\", reason.message);\n }\n return new RemoteServiceError(fallback, fallback === \"call_timeout\" ? \"Remote service call timed out\" : \"Remote service request was cancelled\");\n}\n\nfunction callTimeoutError(timeoutMs: number): RemoteServiceError {\n return new RemoteServiceError(\"call_timeout\", `Remote service call exceeded its ${timeoutMs}ms deadline`, { timeoutMs });\n}\n\n/** 创建一个无连接握手、无增量 revision 状态机的服务桥。 */\nexport function createServiceBridge(options: CreateServiceBridgeOptions): RemoteServiceBridge {\n const defaultCallTimeoutMs = ensureTimeout(options.defaultCallTimeoutMs, \"defaultCallTimeoutMs\");\n let currentState: RemoteServiceBridge[\"state\"] = \"empty\";\n let currentRuntimeInstanceId: string | undefined;\n let currentRevision: number | undefined;\n let currentServices: readonly RemoteServiceReference[] = [];\n let terminalError: RemoteServiceError | undefined;\n const proxies = new Set<ProxyRecord>();\n const listeners = new Set<() => void>();\n\n const notify = (): void => {\n for (const listener of [...listeners]) {\n try { listener(); } catch { /* 观察者不能阻断撤权 */ }\n }\n };\n\n const revokeProxy = (record: ProxyRecord, reason: string, code: RemoteServiceErrorCode = \"service_revoked\"): void => {\n if (record.revoked) return;\n record.revoked = true;\n record.reason = reason;\n try { record.controller.abort(new RemoteServiceError(code, reason)); } catch { record.controller.abort(); }\n };\n\n const revokeAll = (reason: string, code: RemoteServiceErrorCode = \"service_revoked\"): void => {\n for (const record of proxies) revokeProxy(record, reason, code);\n };\n\n const currentMatches = (lookup: RemoteServiceLookup): RemoteServiceReference[] => (\n currentServices.filter((reference) => reference.status === \"ready\" && lookupMatches(reference, lookup))\n );\n\n const findBinding = (record: ProxyRecord, lookup: RemoteServiceLookup): RemoteServiceReference | undefined => {\n if (record.boundReference) return record.boundReference;\n if (terminalError) throw terminalError;\n const matches = currentMatches(lookup);\n if (matches.length > 1) {\n throw new RemoteServiceError(\n \"capability_unavailable\",\n `Service \"${lookup.capabilityId}\" version \"${lookup.contractVersion}\" has multiple ready instances`,\n );\n }\n const reference = matches[0];\n if (reference) {\n record.boundReference = Object.freeze({\n ...reference,\n attributes: Object.freeze({ ...reference.attributes }),\n });\n return record.boundReference;\n }\n return undefined;\n };\n\n const waitForBinding = (\n record: ProxyRecord,\n lookup: RemoteServiceLookup,\n signal: AbortSignal,\n ): Promise<RemoteServiceReference> => {\n const immediate = findBinding(record, lookup);\n if (immediate) return Promise.resolve(immediate);\n if (record.revoked) return Promise.reject(new RemoteServiceError(\"service_revoked\", record.reason));\n if (signal.aborted) return Promise.reject(abortedError(signal));\n\n return new Promise<RemoteServiceReference>((resolve, reject) => {\n let settled = false;\n const finish = (callback: () => void): void => {\n if (settled) return;\n settled = true;\n removeListener();\n callback();\n };\n const check = (): void => {\n if (record.revoked) {\n finish(() => reject(new RemoteServiceError(\"service_revoked\", record.reason)));\n return;\n }\n if (signal.aborted) {\n finish(() => reject(abortedError(signal)));\n return;\n }\n try {\n const reference = findBinding(record, lookup);\n if (reference) finish(() => resolve(reference));\n } catch (error) {\n finish(() => reject(error));\n }\n };\n const onAbort = () => check();\n const listener = () => check();\n const removeListener = (): void => {\n signal.removeEventListener(\"abort\", onAbort);\n listeners.delete(listener);\n };\n signal.addEventListener(\"abort\", onAbort, { once: true });\n listeners.add(listener);\n check();\n });\n };\n\n const bridge: RemoteServiceBridge = {\n get state() { return currentState; },\n get runtimeInstanceId() { return currentRuntimeInstanceId; },\n get defaultCallTimeoutMs() { return defaultCallTimeoutMs; },\n applySnapshot(snapshot: RemoteServiceSnapshot): RemoteServiceSnapshotResult {\n if (currentState === \"disposed\") return { accepted: false, reason: \"disposed\" };\n if (snapshot.protocolVersion !== options.protocolVersion) {\n return { accepted: false, reason: \"protocol-mismatch\", receivedRevision: snapshot.revision };\n }\n // Validate the complete directory before revoking any proxy or changing\n // the current authority. A single foreign/duplicate/unsafe reference\n // therefore cannot cause a partial state transition.\n if (!isValidSnapshot(snapshot)) {\n return { accepted: false, reason: \"invalid-snapshot\", receivedRevision: snapshot.revision };\n }\n if (currentRuntimeInstanceId === snapshot.runtimeInstanceId\n && currentRevision !== undefined\n && snapshot.revision <= currentRevision) {\n return { accepted: false, reason: \"stale-revision\", receivedRevision: snapshot.revision };\n }\n\n const runtimeChanged = currentRuntimeInstanceId !== undefined\n && currentRuntimeInstanceId !== snapshot.runtimeInstanceId;\n if (runtimeChanged) revokeAll(\"Runtime instance changed; proxy cannot be rebound\", \"service_stale\");\n\n const nextServices = snapshot.services.map((service) => Object.freeze({\n ...service,\n attributes: Object.freeze({ ...service.attributes }),\n }));\n const nextReady = new Map(nextServices\n .filter((service) => service.status === \"ready\")\n .map((service) => [bindingKey(service), service] as const));\n if (!runtimeChanged) {\n for (const record of proxies) {\n const bound = record.boundReference;\n if (!bound) continue;\n const replacement = nextReady.get(bindingKey(bound));\n if (!replacement || referenceKey(replacement) !== referenceKey(bound)) {\n revokeProxy(record, \"Bound service instance was replaced or revoked\", \"service_revoked\");\n }\n }\n }\n\n currentRuntimeInstanceId = snapshot.runtimeInstanceId;\n currentRevision = snapshot.revision;\n currentServices = Object.freeze(nextServices);\n terminalError = undefined;\n if (snapshot.state === \"failed\") {\n currentState = \"stale\";\n terminalError = new RemoteServiceError(\"runtime_initialization_failed\", \"Remote Runtime initialization failed\");\n } else if (snapshot.state === \"disposed\" || snapshot.state === \"stopping\") {\n currentState = \"stale\";\n terminalError = new RemoteServiceError(\"transport_unavailable\", \"Remote Runtime is no longer accepting calls\");\n revokeAll(\"Remote Runtime is no longer accepting calls\", \"transport_unavailable\");\n } else if (snapshot.state === \"ready\") {\n currentState = \"ready\";\n } else {\n currentState = \"empty\";\n }\n notify();\n return { accepted: true, state: currentState, revision: snapshot.revision };\n },\n markProtocolMismatch(reason = \"Remote Runtime protocol version mismatch\"): void {\n if (currentState === \"disposed\") return;\n terminalError = new RemoteServiceError(\"protocol_mismatch\", reason);\n revokeAll(reason, \"protocol_mismatch\");\n currentState = \"stale\";\n notify();\n },\n markInitializationFailed(reason = \"Remote Runtime initialization failed\"): void {\n if (currentState === \"disposed\") return;\n terminalError = new RemoteServiceError(\"runtime_initialization_failed\", reason);\n revokeAll(reason, \"runtime_initialization_failed\");\n currentState = \"stale\";\n notify();\n },\n getProxy(lookup: RemoteServiceLookup, scope?: LifecycleScope): RemoteServiceProxy {\n const record: ProxyRecord = {\n revoked: false,\n reason: \"Remote service proxy revoked\",\n controller: new AbortController(),\n };\n proxies.add(record);\n let removeScopeRevoke: (() => void) | undefined;\n let removeScopeDispose: (() => void) | undefined;\n const revokeFromScope = (reason: string): void => {\n revokeProxy(record, reason, \"service_revoked\");\n proxies.delete(record);\n removeScopeRevoke?.();\n removeScopeDispose?.();\n };\n if (scope) {\n try {\n removeScopeRevoke = scope.onRevoke(revokeFromScope);\n removeScopeDispose = scope.onDispose(revokeFromScope, `service-proxy:${lookup.capabilityId}`);\n } catch {\n revokeFromScope(\"Remote service proxy scope is already revoked\");\n }\n }\n const proxy: RemoteServiceProxy = {\n get reference() { return record.boundReference; },\n get revoked() { return record.revoked; },\n async call<TRequest, TResult>(request: TRequest, callOptions: RemoteServiceCallOptions = {}): Promise<TResult> {\n if (record.revoked) throw new RemoteServiceError(\"service_revoked\", record.reason);\n const timeoutMs = ensureTimeout(callOptions.timeoutMs ?? defaultCallTimeoutMs, \"timeoutMs\");\n const deadlineAt = Date.now() + timeoutMs;\n const timeoutController = new AbortController();\n const timeout = setTimeout(() => {\n try { timeoutController.abort(callTimeoutError(timeoutMs)); } catch { timeoutController.abort(); }\n }, timeoutMs);\n const merged = mergeSignals(scope?.signal, record.controller.signal, callOptions.signal, timeoutController.signal);\n try {\n const reference = await waitForBinding(record, lookup, merged.signal);\n if (merged.signal.aborted) throw abortedError(merged.signal);\n const context: RemoteServiceCallContext = {\n operationId: callOptions.operationId ?? callOptions.requestId,\n reference,\n grantId: reference.grantId,\n signal: merged.signal,\n deadlineAt,\n timeoutMs,\n };\n let result: Promise<TResult>;\n try {\n result = Promise.resolve(options.transport.call<TRequest, TResult>(request, context));\n } catch (error) {\n throw error;\n }\n const value = await Promise.race([\n result,\n new Promise<TResult>((_, reject) => {\n if (merged.signal.aborted) {\n reject(abortedError(merged.signal));\n return;\n }\n const onAbort = () => reject(abortedError(merged.signal));\n merged.signal.addEventListener(\"abort\", onAbort, { once: true });\n result.finally(() => merged.signal.removeEventListener(\"abort\", onAbort)).catch(() => undefined);\n }),\n ]);\n if (record.revoked) throw new RemoteServiceError(\"service_revoked\", record.reason);\n return value;\n } catch (error) {\n if (merged.signal.aborted) throw abortedError(merged.signal);\n if (error instanceof RemoteServiceError) throw error;\n throw error;\n } finally {\n clearTimeout(timeout);\n merged.dispose();\n if (record.revoked) {\n proxies.delete(record);\n removeScopeRevoke?.();\n removeScopeDispose?.();\n }\n }\n },\n revoke(reason = \"Remote service proxy revoked\"): void {\n revokeFromScope(reason);\n },\n };\n return proxy;\n },\n requireProxy(lookup: RemoteServiceLookup, scope?: LifecycleScope): RemoteServiceProxy {\n return bridge.getProxy(lookup, scope) as RemoteServiceProxy;\n },\n invalidate(reason = \"Remote service directory invalidated\"): void {\n if (currentState === \"disposed\") return;\n currentServices = [];\n currentRevision = undefined;\n terminalError = undefined;\n revokeAll(reason, \"service_revoked\");\n currentState = \"stale\";\n notify();\n },\n disconnect(reason = \"Remote service transport disconnected\"): void {\n if (currentState === \"disposed\") return;\n currentServices = [];\n currentRevision = undefined;\n currentRuntimeInstanceId = undefined;\n terminalError = new RemoteServiceError(\"transport_unavailable\", reason);\n revokeAll(reason, \"transport_unavailable\");\n currentState = \"stale\";\n notify();\n },\n dispose(reason = \"Remote service bridge disposed\"): void {\n if (currentState === \"disposed\") return;\n currentServices = [];\n currentRevision = undefined;\n currentRuntimeInstanceId = undefined;\n terminalError = new RemoteServiceError(\"transport_unavailable\", reason);\n revokeAll(reason, \"transport_unavailable\");\n currentState = \"disposed\";\n notify();\n proxies.clear();\n },\n subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n services(): readonly RemoteServiceReference[] {\n return currentServices;\n },\n };\n return bridge;\n}\n","// 基于 MessagePort 的 WebLoom v2 远程调用传输。\n//\n// wire 只保留 call/result/error/cancel。MessagePort 本身就是连接隔离边界,\n// 因此不传 connectionId,也不把完整 RemoteServiceReference 回显给 Provider。\n\nimport type {\n RemoteServiceCallContext,\n RemoteServiceMessageCodec,\n RemoteServiceReference,\n RemoteServiceTransport,\n} from \"../contracts/lifecycle.js\";\nimport {\n createRemoteServiceMessageCodec,\n RemoteServiceError,\n} from \"../contracts/lifecycle.js\";\n\nexport interface RemoteServicePortCallMessage {\n type: string;\n protocolVersion: string;\n callId: string;\n capabilityId: string;\n contractVersion: string;\n serviceInstanceId: string;\n operationId?: string;\n grantId?: string;\n request: unknown;\n}\n\nexport interface RemoteServicePortResultMessage {\n type: string;\n protocolVersion: string;\n callId: string;\n serviceInstanceId: string;\n result: unknown;\n}\n\nexport interface RemoteServicePortErrorMessage {\n type: string;\n protocolVersion: string;\n callId: string;\n serviceInstanceId: string;\n error: {\n name?: string;\n message: string;\n code: string;\n details?: Readonly<Record<string, unknown>>;\n };\n}\n\nexport interface RemoteServicePortCancelMessage {\n type: string;\n protocolVersion: string;\n callId: string;\n serviceInstanceId: string;\n}\n\nexport type RemoteServicePortResponseMessage =\n | RemoteServicePortResultMessage\n | RemoteServicePortErrorMessage;\n\nexport interface CreateMessagePortServiceTransportOptions {\n /** 已由实际 Worker / Window 连接产生的双工端口。 */\n port: MessagePort;\n /** 可选 transferable 提取器;默认只发送结构化克隆数据。 */\n transferForRequest?: (\n request: unknown,\n context: RemoteServiceCallContext,\n ) => readonly Transferable[];\n /** dispose 时是否关闭端口;默认不关闭,由端口所有者决定。 */\n closeOnDispose?: boolean;\n /** wire 消息 codec;默认 webloom.remote-service.v2。 */\n codec?: RemoteServiceMessageCodec;\n /** 直接使用 transport 时的默认总 deadline。 */\n defaultCallTimeoutMs?: number;\n}\n\ninterface PendingCall {\n protocolVersion: string;\n serviceInstanceId: string;\n resolve(value: unknown): void;\n reject(error: unknown): void;\n removeAbort: () => void;\n disposeDeadline: () => void;\n}\n\nlet nextTransportId = 0;\nlet nextCallSequence = 0;\n\nfunction makeCallId(transportId: number): string {\n nextCallSequence += 1;\n return `remote-call:${transportId}:${nextCallSequence}`;\n}\n\nfunction finiteTimeout(value: number | undefined): number {\n const timeout = value ?? 30_000;\n if (!Number.isFinite(timeout) || timeout <= 0) throw new TypeError(\"Remote service timeout must be finite and greater than zero\");\n return timeout;\n}\n\nfunction errorFromWire(input: RemoteServicePortErrorMessage[\"error\"]): RemoteServiceError {\n return new RemoteServiceError(\n typeof input?.code === \"string\" && input.code.length > 0 ? input.code : \"handler_failed\",\n typeof input?.message === \"string\" ? input.message : \"Remote service call failed\",\n input?.details,\n );\n}\n\nfunction abortReason(signal: AbortSignal): Error {\n const reason = signal.reason;\n if (reason instanceof Error && typeof (reason as Error & { code?: unknown }).code === \"string\") return reason;\n if (reason instanceof Error) return new RemoteServiceError(\"request_cancelled\", reason.message);\n return new RemoteServiceError(\"request_cancelled\", \"Remote service request was cancelled\");\n}\n\nfunction addMessageListener(port: MessagePort, listener: (event: MessageEvent) => void): () => void {\n port.addEventListener(\"message\", listener);\n return () => port.removeEventListener(\"message\", listener);\n}\n\nfunction postBestEffort(port: MessagePort, message: unknown, transfer: readonly Transferable[] = []): void {\n try { port.postMessage(message, [...transfer]); } catch { /* 断线由 deadline / dispose 收敛 */ }\n}\n\nfunction postRequest(port: MessagePort, message: unknown, transfer: readonly Transferable[] = []): void {\n try {\n port.postMessage(message, [...transfer]);\n } catch (error) {\n const name = error && typeof error === \"object\" && typeof (error as { name?: unknown }).name === \"string\"\n ? (error as { name: string }).name\n : \"DataCloneError\";\n const messageText = error instanceof Error ? error.message : String(error);\n throw new RemoteServiceError(\n \"request_clone_failed\",\n `Remote service request could not be posted: ${messageText}`,\n { name, message: messageText },\n );\n }\n}\n\nfunction isResponseMessage(\n input: unknown,\n codec: RemoteServiceMessageCodec,\n): input is RemoteServicePortResponseMessage {\n if (!input || typeof input !== \"object\") return false;\n const message = input as Partial<RemoteServicePortResponseMessage>;\n return (message.type === codec.type(\"result\") || message.type === codec.type(\"error\"))\n && typeof message.protocolVersion === \"string\"\n && typeof message.callId === \"string\"\n && typeof message.serviceInstanceId === \"string\";\n}\n\n/** 创建一条不携带连接身份、不会自动重放的 MessagePort transport。 */\nexport function createMessagePortServiceTransport(\n options: CreateMessagePortServiceTransportOptions,\n): RemoteServiceTransport & { dispose(): void } {\n const pending = new Map<string, PendingCall>();\n let disposed = false;\n const transportId = ++nextTransportId;\n const codec = options.codec ?? createRemoteServiceMessageCodec();\n const defaultCallTimeoutMs = finiteTimeout(options.defaultCallTimeoutMs);\n\n const rejectPending = (error: Error, sendCancel: boolean): void => {\n for (const [callId, call] of pending) {\n pending.delete(callId);\n call.removeAbort();\n call.disposeDeadline();\n if (sendCancel) {\n postBestEffort(options.port, codec.encode({\n type: codec.type(\"cancel\"),\n protocolVersion: codec.protocolVersion,\n callId,\n serviceInstanceId: call.serviceInstanceId,\n }));\n }\n call.reject(error);\n }\n };\n\n const onMessage = (event: MessageEvent): void => {\n const decoded = codec.decode(event.data);\n if (!isResponseMessage(decoded, codec)) return;\n const call = pending.get(decoded.callId);\n if (!call) return;\n if (decoded.serviceInstanceId !== call.serviceInstanceId) return;\n pending.delete(decoded.callId);\n call.removeAbort();\n call.disposeDeadline();\n if (decoded.protocolVersion !== codec.protocolVersion) {\n call.reject(new RemoteServiceError(\"protocol_mismatch\", \"Remote service protocol version mismatch\"));\n return;\n }\n if (decoded.type === codec.type(\"error\")) {\n call.reject(errorFromWire((decoded as RemoteServicePortErrorMessage).error));\n } else {\n call.resolve(decoded.result);\n }\n };\n const onMessageError = (): void => rejectPending(new RemoteServiceError(\"transport_unavailable\", \"Remote service message could not be decoded\"), false);\n const removeMessage = addMessageListener(options.port, onMessage);\n options.port.addEventListener(\"messageerror\", onMessageError);\n options.port.start();\n\n const dispose = (): void => {\n if (disposed) return;\n disposed = true;\n removeMessage();\n options.port.removeEventListener(\"messageerror\", onMessageError);\n rejectPending(new RemoteServiceError(\"transport_unavailable\", \"Remote service transport disposed\"), true);\n if (options.closeOnDispose) {\n try { options.port.close(); } catch { /* noop */ }\n }\n };\n\n const transport: RemoteServiceTransport & { dispose(): void } = {\n call<TRequest, TResult>(request: TRequest, context: RemoteServiceCallContext): Promise<TResult> {\n if (disposed) return Promise.reject(new RemoteServiceError(\"transport_unavailable\", \"Remote service transport disposed\"));\n if (context.signal.aborted) return Promise.reject(abortReason(context.signal));\n const callId = makeCallId(transportId);\n const serviceInstanceId = context.reference.serviceInstanceId;\n const timeoutMs = finiteTimeout(context.timeoutMs ?? defaultCallTimeoutMs);\n const deadlineAt = context.deadlineAt ?? Date.now() + timeoutMs;\n const timeoutController = new AbortController();\n const remaining = Math.max(0, deadlineAt - Date.now());\n const deadlineTimer = setTimeout(() => {\n try { timeoutController.abort(new RemoteServiceError(\"call_timeout\", \"Remote service call timed out\")); } catch { timeoutController.abort(); }\n }, remaining);\n const merged = (() => {\n const controller = new AbortController();\n const signals = [context.signal, timeoutController.signal];\n const listeners = signals.map((signal) => {\n const listener = () => {\n try { controller.abort(signal.reason); } catch { controller.abort(); }\n };\n signal.addEventListener(\"abort\", listener, { once: true });\n return { signal, listener };\n });\n return {\n signal: controller.signal,\n dispose: () => listeners.forEach(({ signal, listener }) => signal.removeEventListener(\"abort\", listener)),\n };\n })();\n\n return new Promise<TResult>((resolve, reject) => {\n let settled = false;\n const finish = (callback: () => void): void => {\n if (settled) return;\n settled = true;\n callback();\n };\n const sendCancel = (): void => postBestEffort(options.port, codec.encode({\n type: codec.type(\"cancel\"),\n protocolVersion: codec.protocolVersion,\n callId,\n serviceInstanceId,\n }));\n const onAbort = (): void => {\n if (!pending.delete(callId)) return;\n sendCancel();\n const reason = merged.signal.reason instanceof RemoteServiceError\n ? merged.signal.reason\n : merged.signal.reason?.code === \"call_timeout\"\n ? merged.signal.reason\n : abortReason(merged.signal);\n finish(() => reject(reason));\n merged.dispose();\n clearTimeout(deadlineTimer);\n };\n const pendingCall: PendingCall = {\n protocolVersion: codec.protocolVersion,\n serviceInstanceId,\n resolve: (value) => finish(() => resolve(value as TResult)),\n reject: (error) => finish(() => reject(error)),\n removeAbort: () => merged.signal.removeEventListener(\"abort\", onAbort),\n disposeDeadline: () => {\n merged.dispose();\n clearTimeout(deadlineTimer);\n },\n };\n pending.set(callId, pendingCall);\n merged.signal.addEventListener(\"abort\", onAbort, { once: true });\n const message: RemoteServicePortCallMessage = {\n type: codec.type(\"call\"),\n protocolVersion: codec.protocolVersion,\n callId,\n capabilityId: context.reference.capabilityId,\n contractVersion: context.reference.contractVersion,\n serviceInstanceId,\n ...(context.operationId ? { operationId: context.operationId } : {}),\n ...(context.grantId ?? context.reference.grantId\n ? { grantId: context.grantId ?? context.reference.grantId }\n : {}),\n request,\n };\n try {\n const transfer = options.transferForRequest?.(request, context) ?? [];\n postRequest(options.port, codec.encode(message as unknown as Record<string, unknown>), transfer);\n if (merged.signal.aborted) onAbort();\n } catch (error) {\n pending.delete(callId);\n pendingCall.removeAbort();\n pendingCall.disposeDeadline();\n pendingCall.reject(error);\n }\n });\n },\n dispose,\n };\n return transport;\n}\n\n/** Provider 侧调用消息的结构化输入。 */\nexport interface MessagePortServiceCallInput {\n message: RemoteServicePortCallMessage;\n /** Provider 的权威目录命中的服务引用。 */\n reference: RemoteServiceReference;\n signal: AbortSignal;\n}\n","import type {\n RemoteServiceCallContext,\n RemoteServiceTransport,\n} from \"../contracts/lifecycle.js\";\nimport { createServiceBridge } from \"../transport/serviceBridge.js\";\nimport { createMessagePortServiceTransport } from \"../transport/messagePortServiceTransport.js\";\nimport {\n createRuntimeMessageCodec,\n isRuntimeError,\n isRuntimeSnapshot,\n isRuntimeSnapshotProtocol,\n RUNTIME_PROTOCOL_VERSION,\n type RuntimeErrorMessage,\n type RuntimeSnapshot,\n} from \"./runtimeProtocol.js\";\nimport {\n RuntimeInitializationError,\n RuntimeUnavailableError,\n type RuntimeHandle,\n type RuntimeStatusListener,\n type RuntimeStatusSnapshot,\n} from \"./runtimeTypes.js\";\n\nexport interface SharedWorkerLike {\n readonly port: MessagePort;\n onerror?: (event: Event) => void;\n addEventListener?(type: \"error\", listener: (event: Event) => void): void;\n removeEventListener?(type: \"error\", listener: (event: Event) => void): void;\n}\n\nexport type SharedWorkerFactory = (\n url: string | URL,\n options: { type: \"module\"; name?: string; credentials?: RequestCredentials },\n) => SharedWorkerLike;\n\n/**\n * 临时迁移接缝:下游 typed transfer API 完成前允许领域代码在同一\n * 物理端口安装 listener。它不参与 Runtime 授权,也不传 connectionId。\n */\nexport interface SharedWorkerConnectionContext {\n readonly worker: SharedWorkerLike;\n readonly port: MessagePort;\n}\n\nexport interface ConnectSharedWorkerOptions {\n id: string;\n url: string | URL;\n name?: string;\n credentials?: RequestCredentials;\n defaultCallTimeoutMs?: number;\n /** SWCF-009 完成前的临时同端口迁移接缝。 */\n onConnection?: (context: SharedWorkerConnectionContext) => void;\n}\n\ninterface InternalConnectSharedWorkerOptions extends ConnectSharedWorkerOptions {\n workerFactory?: SharedWorkerFactory;\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n\nfunction ensureTimeout(value: number | undefined): number {\n const timeout = value ?? 30_000;\n if (!Number.isFinite(timeout) || timeout <= 0) {\n throw new TypeError(\"defaultCallTimeoutMs must be a finite number greater than zero\");\n }\n return timeout;\n}\n\nfunction addMessageListener(port: MessagePort, listener: (event: MessageEvent) => void): () => void {\n port.addEventListener(\"message\", listener);\n return () => port.removeEventListener(\"message\", listener);\n}\n\n/** 给极简测试端口补齐事件目标;真实 MessagePort 不改变其行为。 */\nfunction ensureMessageEventTarget(port: MessagePort): void {\n const target = port as unknown as {\n onmessage: ((this: MessagePort, event: MessageEvent) => unknown) | null;\n addEventListener?: (this: MessagePort, type: string, listener: (event: MessageEvent) => void) => void;\n removeEventListener?: (this: MessagePort, type: string, listener: (event: MessageEvent) => void) => void;\n };\n if (target.addEventListener && target.removeEventListener) return;\n const listeners = new Set<(event: MessageEvent) => void>();\n const original = target.onmessage;\n target.addEventListener = function add(type, listener) {\n if (type === \"message\") listeners.add(listener);\n };\n target.removeEventListener = function remove(type, listener) {\n if (type === \"message\") listeners.delete(listener);\n };\n target.onmessage = (event) => {\n original?.call(port, event);\n for (const listener of [...listeners]) listener(event);\n };\n}\n\nfunction makeWorker(options: InternalConnectSharedWorkerOptions): SharedWorkerLike {\n const workerOptions = {\n type: \"module\" as const,\n ...(options.name ? { name: options.name } : {}),\n ...(options.credentials ? { credentials: options.credentials } : {}),\n };\n if (options.workerFactory) return options.workerFactory(options.url, workerOptions);\n const WorkerConstructor = (globalThis as unknown as {\n SharedWorker?: new (\n url: string | URL,\n options: { type: \"module\"; name?: string; credentials?: RequestCredentials },\n ) => SharedWorkerLike;\n }).SharedWorker;\n if (!WorkerConstructor) throw new RuntimeUnavailableError(\"SharedWorker is not supported by this browser\");\n return new WorkerConstructor(options.url, workerOptions);\n}\n\n/**\n * 同步创建本地 RuntimeHandle。\n *\n * 该函数只执行参数校验、SharedWorker 构造、监听器/Transport 安装和\n * port.start();它不等待任何 Worker 回包。远端就绪、协议不兼容和服务\n * 不存在都在 capability().call() 的 Promise 边界收敛。\n */\nfunction connectSharedWorkerInternal(options: InternalConnectSharedWorkerOptions): RuntimeHandle {\n if (!options || typeof options.id !== \"string\" || options.id.trim() === \"\") {\n throw new Error(\"SharedWorker runtime id must be a non-empty string\");\n }\n const defaultCallTimeoutMs = ensureTimeout(options.defaultCallTimeoutMs);\n const worker = makeWorker(options);\n const port = worker.port;\n if (!port) throw new RuntimeUnavailableError(\"SharedWorker did not expose a MessagePort\");\n ensureMessageEventTarget(port);\n\n const listeners = new Set<RuntimeStatusListener>();\n const codec = createRuntimeMessageCodec();\n let disposed = false;\n let runtimeInstanceId: string | undefined;\n let removeRuntimeMessage: (() => void) | undefined;\n let transport: (RemoteServiceTransport & { dispose(): void }) | undefined;\n let restoreWorkerError = (): void => undefined;\n\n let currentSnapshot: RuntimeStatusSnapshot = {\n runtimeId: options.id,\n runtimeKind: \"shared-worker\",\n runtimeInstanceId: \"\",\n state: \"starting\",\n revision: 0,\n units: [],\n services: [],\n };\n\n const emit = (next: RuntimeStatusSnapshot): void => {\n currentSnapshot = Object.freeze({\n ...next,\n units: Object.freeze([...next.units]),\n services: Object.freeze([...next.services]),\n });\n for (const listener of [...listeners]) {\n try { listener(currentSnapshot); } catch { /* observer isolation */ }\n }\n };\n\n const bridgeTransport: RemoteServiceTransport = {\n call<TRequest, TResult>(request: TRequest, context: RemoteServiceCallContext): Promise<TResult> {\n if (!transport) {\n return Promise.reject(new RuntimeUnavailableError(\"SharedWorker connection is unavailable\"));\n }\n return transport.call<TRequest, TResult>(request, context);\n },\n };\n const bridge = createServiceBridge({\n protocolVersion: RUNTIME_PROTOCOL_VERSION,\n transport: bridgeTransport,\n defaultCallTimeoutMs,\n });\n\n const cleanup = (): void => {\n removeRuntimeMessage?.();\n removeRuntimeMessage = undefined;\n port.removeEventListener(\"messageerror\", onWorkerError);\n transport?.dispose();\n transport = undefined;\n try { port.close(); } catch { /* noop */ }\n if (worker.removeEventListener) worker.removeEventListener(\"error\", onWorkerError);\n restoreWorkerError();\n restoreWorkerError = () => undefined;\n };\n\n const disconnect = (reason: string, failure?: unknown): void => {\n if (disposed) return;\n cleanup();\n bridge.disconnect(reason);\n emit({\n ...currentSnapshot,\n state: \"disconnected\",\n runtimeInstanceId: \"\",\n revision: 0,\n units: [],\n services: [],\n error: failure ? errorMessage(failure) : reason,\n });\n runtimeInstanceId = undefined;\n };\n\n const onRuntimeError = (message: RuntimeErrorMessage): void => {\n const error = new RuntimeInitializationError({\n pluginId: message.pluginId,\n unitId: message.unitId,\n phase: message.phase === \"snapshot\" ? \"snapshot\" : \"startup\",\n error: message.message,\n });\n if (message.code === \"protocol_mismatch\") bridge.markProtocolMismatch(message.message);\n else if (message.code === \"runtime_initialization_failed\") bridge.markInitializationFailed(message.message);\n else bridge.disconnect(message.message);\n emit({ ...currentSnapshot, state: \"failed\", error: error.message, units: [], services: [] });\n };\n\n const onSnapshot = (snapshot: RuntimeSnapshot): void => {\n if (snapshot.runtimeId !== options.id || snapshot.runtimeKind !== \"shared-worker\") return;\n if (!isRuntimeSnapshotProtocol(snapshot)) {\n bridge.markProtocolMismatch(`Runtime protocol ${snapshot.protocolVersion} is not supported`);\n emit({\n ...currentSnapshot,\n state: \"failed\",\n error: `Runtime protocol ${snapshot.protocolVersion} is not supported`,\n units: [],\n services: [],\n });\n return;\n }\n const applied = bridge.applySnapshot(snapshot);\n if (!applied.accepted) return;\n runtimeInstanceId = snapshot.runtimeInstanceId;\n emit({\n runtimeId: snapshot.runtimeId,\n runtimeKind: snapshot.runtimeKind,\n runtimeInstanceId: snapshot.runtimeInstanceId,\n state: snapshot.state === \"ready\" ? \"ready\" : snapshot.state,\n revision: snapshot.revision,\n units: snapshot.units,\n services: snapshot.services,\n });\n };\n\n const onWorkerError = (event: Event): void => {\n const detail = event.type ? `SharedWorker error: ${event.type}` : \"SharedWorker error\";\n disconnect(detail);\n };\n\n const onMessage = (event: MessageEvent): void => {\n if (disposed) return;\n if (isRuntimeError(event.data)) {\n onRuntimeError(event.data);\n return;\n }\n if (isRuntimeSnapshot(event.data)) {\n onSnapshot(event.data);\n return;\n }\n // 完全无法解析的对端消息不改变状态;正在等待的 call 由自己的\n // deadline 收敛为 call_timeout,而不是伪造一个握手错误。\n const decoded = codec.decode(event.data);\n if (decoded?.type === codec.type(\"error\")) {\n // Remote service transport owns response matching. Runtime 只处理它的\n // own snapshot/error namespace。\n }\n };\n\n try {\n // 临时迁移钩子必须先于 Runtime listener 安装,以便复用同一端口。\n options.onConnection?.({ worker, port });\n transport = createMessagePortServiceTransport({\n port,\n codec,\n defaultCallTimeoutMs,\n closeOnDispose: false,\n });\n removeRuntimeMessage = addMessageListener(port, onMessage);\n port.addEventListener(\"messageerror\", onWorkerError);\n if (worker.addEventListener) worker.addEventListener(\"error\", onWorkerError);\n else {\n const previous = worker.onerror;\n const fallbackHandler = (event: Event): void => {\n previous?.(event);\n onWorkerError(event);\n };\n worker.onerror = fallbackHandler;\n restoreWorkerError = () => {\n if (worker.onerror === fallbackHandler) worker.onerror = previous;\n };\n }\n port.start();\n } catch (error) {\n cleanup();\n throw error;\n }\n\n // 供 Window Runtime 的内部装配使用;不写入 RuntimeHandle 公共接口,\n // 也不暴露原始 MessagePort。\n const handle = {\n runtimeKind: \"shared-worker\" as const,\n runtimeId: options.id,\n get runtimeInstanceId() { return runtimeInstanceId; },\n serviceBridge: bridge,\n state: () => currentSnapshot,\n capability<T = unknown>(capabilityId: string, capabilityOptions: { contractVersion?: string } = {}) {\n const proxy = bridge.requireProxy({\n capabilityId,\n contractVersion: capabilityOptions.contractVersion ?? `${capabilityId}.v1`,\n });\n return proxy as typeof proxy & { readonly serviceType?: T };\n },\n subscribe(listener: RuntimeStatusListener) {\n listeners.add(listener);\n listener(currentSnapshot);\n return () => listeners.delete(listener);\n },\n dispose(reason = \"SharedWorker connection disposed\"): Promise<void> {\n if (disposed) return Promise.resolve();\n // 先同步撤销代理并拒绝 transport pending,再做端口清理。\n disposed = true;\n emit({ ...currentSnapshot, state: \"stopping\" });\n bridge.dispose(reason);\n cleanup();\n runtimeInstanceId = undefined;\n emit({\n ...currentSnapshot,\n state: \"disposed\",\n runtimeInstanceId: \"\",\n revision: 0,\n units: [],\n services: [],\n });\n return Promise.resolve();\n },\n };\n return handle as RuntimeHandle;\n}\n\n/** 创建生产 RuntimeHandle;测试工厂不属于生产公共选项。 */\nexport function connectSharedWorker(options: ConnectSharedWorkerOptions): RuntimeHandle {\n return connectSharedWorkerInternal(options);\n}\n\n/** 仅由 `webloom-framework/testing` 暴露的 SharedWorker 工厂注入入口。 */\nexport function connectSharedWorkerForTesting(\n options: ConnectSharedWorkerOptions,\n workerFactory: SharedWorkerFactory,\n): RuntimeHandle {\n return connectSharedWorkerInternal({ ...options, workerFactory });\n}\n","// 插件产品启停控制面。\n//\n// 这里处理“用户意图已持久化”和“运行实例已经启动”之间的边界:\n// - 命令是绝对 desiredEnabled,不使用 toggle;\n// - 同一个 authority 内按 commandId 去重;\n// - 先查去重,再查 expectedRevision;\n// - 只有持久化成功后才发布 accepted。\n//\n// 它不直接启停 PluginHost。Host / Coordinator 订阅成功后的意图快照,再按\n// 依赖图装配运行实例;因此启动失败不会把用户意图偷偷改回 false。\n\nimport type {\n PluginIntentCommand,\n PluginIntentCommandResult,\n PluginIntentController,\n PluginIntentSnapshot,\n} from \"../contracts/lifecycle.js\";\n\nexport interface CreatePluginIntentControllerOptions {\n /** 当前控制面启动身份;Worker 重启时应传入新值。 */\n authorityInstanceId?: string;\n /** Worker 恢复后读取的平台意图。 */\n initial?: Partial<PluginIntentSnapshot>;\n /** 将候选快照原子写入平台存储;缺省表示内存控制面(测试用)。 */\n persist?: (snapshot: PluginIntentSnapshot) => Promise<void>;\n /** 有界去重记录数量,避免 commandId 永久增长。 */\n maxCommandRecords?: number;\n}\n\ninterface CommandRecord {\n fingerprint: string;\n result: Extract<PluginIntentCommandResult, { status: \"accepted\" | \"duplicate\" }>;\n}\n\nfunction makeAuthorityInstanceId(): string {\n try {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return `authority:${crypto.randomUUID()}`;\n }\n } catch {\n // 非安全唯一值只作本次 Worker 运行身份,不能作为权限凭据。\n }\n return `authority:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`;\n}\n\nfunction cloneSnapshot(snapshot: PluginIntentSnapshot): PluginIntentSnapshot {\n return {\n revision: snapshot.revision,\n desiredEnabled: { ...snapshot.desiredEnabled },\n desiredRevision: { ...snapshot.desiredRevision },\n };\n}\n\nfunction normalizeSnapshot(initial: Partial<PluginIntentSnapshot> | undefined): PluginIntentSnapshot {\n const revision = Number.isSafeInteger(initial?.revision) && (initial?.revision ?? 0) >= 0\n ? initial!.revision!\n : 0;\n const desiredEnabled: Record<string, boolean> = {};\n for (const [pluginId, value] of Object.entries(initial?.desiredEnabled ?? {})) {\n if (typeof value === \"boolean\") desiredEnabled[pluginId] = value;\n }\n const desiredRevision: Record<string, number> = {};\n for (const [pluginId, value] of Object.entries(initial?.desiredRevision ?? {})) {\n if (Number.isSafeInteger(value) && value >= 0) desiredRevision[pluginId] = value;\n }\n return { revision, desiredEnabled, desiredRevision };\n}\n\nfunction commandFingerprint(command: PluginIntentCommand): string {\n return [\n command.authorityInstanceId,\n command.expectedRevision,\n command.pluginId,\n command.desiredEnabled ? \"true\" : \"false\",\n ].join(\"\\u0000\");\n}\n\nfunction commandError(message: string): Extract<PluginIntentCommandResult, { status: \"command-conflict\" }> {\n return { status: \"command-conflict\", commandId: \"\", message };\n}\n\n/** 创建单一控制面上的插件意图控制器。 */\nexport function createPluginIntentController(\n options: CreatePluginIntentControllerOptions = {}\n): PluginIntentController {\n const authorityInstanceId = options.authorityInstanceId ?? makeAuthorityInstanceId();\n const maxCommandRecords = Math.max(1, Math.floor(options.maxCommandRecords ?? 256));\n let current = normalizeSnapshot(options.initial);\n const commandRecords = new Map<string, CommandRecord>();\n const listeners = new Set<(snapshot: PluginIntentSnapshot) => void>();\n let queue = Promise.resolve();\n\n const notify = () => {\n const snapshot = cloneSnapshot(current);\n for (const listener of [...listeners]) {\n try {\n listener(snapshot);\n } catch {\n // UI 观察者错误不能回滚已经成功持久化的意图。\n }\n }\n };\n\n const process = async (command: PluginIntentCommand): Promise<PluginIntentCommandResult> => {\n const candidate = command as Partial<PluginIntentCommand> | null | undefined;\n const commandId = typeof candidate?.commandId === \"string\" ? candidate.commandId : \"\";\n if (\n !candidate\n || typeof candidate.authorityInstanceId !== \"string\"\n || candidate.authorityInstanceId.length === 0\n || typeof candidate.pluginId !== \"string\"\n || candidate.pluginId.length === 0\n || typeof candidate.desiredEnabled !== \"boolean\"\n || !Number.isSafeInteger(candidate.expectedRevision)\n || (candidate.expectedRevision ?? -1) < 0\n || commandId.length === 0\n ) {\n const result = commandError(\"commandId、pluginId 和 expectedRevision 必须是有效值\");\n return { ...result, commandId };\n }\n if (command.authorityInstanceId !== authorityInstanceId) {\n return {\n status: \"stale-authority\",\n commandId: command.commandId,\n expectedAuthorityInstanceId: authorityInstanceId,\n };\n }\n\n const fingerprint = commandFingerprint(command);\n const existing = commandRecords.get(command.commandId);\n if (existing) {\n if (existing.fingerprint !== fingerprint) {\n return {\n status: \"command-conflict\",\n commandId: command.commandId,\n message: \"相同 commandId 的命令内容不同,拒绝覆盖原命令\",\n };\n }\n return {\n status: \"duplicate\",\n commandId: command.commandId,\n snapshot: cloneSnapshot(existing.result.snapshot),\n persisted: true,\n };\n }\n\n if (command.expectedRevision !== current.revision) {\n return {\n status: \"revision-conflict\",\n commandId: command.commandId,\n snapshot: cloneSnapshot(current),\n };\n }\n\n const next: PluginIntentSnapshot = {\n revision: current.revision + 1,\n desiredEnabled: {\n ...current.desiredEnabled,\n [command.pluginId]: command.desiredEnabled,\n },\n desiredRevision: {\n ...current.desiredRevision,\n [command.pluginId]: (current.desiredRevision[command.pluginId] ?? 0) + 1,\n },\n };\n try {\n await options.persist?.(cloneSnapshot(next));\n } catch (error) {\n return {\n status: \"persistence-failed\",\n commandId: command.commandId,\n message: error instanceof Error ? error.message : String(error),\n snapshot: cloneSnapshot(current),\n };\n }\n\n current = next;\n const accepted: Extract<PluginIntentCommandResult, { status: \"accepted\" | \"duplicate\" }> = {\n status: \"accepted\",\n commandId: command.commandId,\n snapshot: cloneSnapshot(current),\n persisted: true,\n };\n commandRecords.set(command.commandId, {\n fingerprint,\n result: accepted,\n });\n while (commandRecords.size > maxCommandRecords) {\n const oldest = commandRecords.keys().next().value as string | undefined;\n if (oldest === undefined) break;\n commandRecords.delete(oldest);\n }\n notify();\n return {\n status: \"accepted\",\n commandId: accepted.commandId,\n snapshot: cloneSnapshot(accepted.snapshot),\n persisted: true,\n };\n };\n\n const controller: PluginIntentController = {\n authorityInstanceId,\n snapshot: () => cloneSnapshot(current),\n submit(command) {\n const result = queue.then(() => process(command));\n // 无论上一条命令结果如何,后续命令都必须继续进入同一串行队列。\n queue = result.then(() => undefined, () => undefined);\n return result;\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n };\n return controller;\n}\n"]}