webloom-framework 0.1.0 → 0.2.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.
- package/README.md +83 -36
- package/dist/{chunk-KGNF36DZ.js → chunk-URY3E6UH.js} +333 -267
- package/dist/chunk-URY3E6UH.js.map +1 -0
- package/dist/{createPluginHost-CcW9sPNs.d.ts → createPluginHost-ChJNBTsX.d.ts} +76 -77
- package/dist/index.d.ts +300 -10
- package/dist/index.js +1556 -146
- package/dist/index.js.map +1 -1
- package/dist/react.d.ts +1 -1
- package/dist/{resourceRegistry-BAnqKcp7.d.ts → resourceRegistry-MNM1c7od.d.ts} +1 -1
- package/dist/testing.d.ts +3 -3
- package/dist/testing.js +2 -2
- package/docs/api.md +156 -14
- package/docs/migration-baseline.md +20 -12
- package/docs/proposals/browser-runtime-v1/implementation-plan.md +527 -0
- package/docs/proposals/browser-runtime-v1/requirements.md +349 -0
- package/docs/proposals/browser-runtime-v1/verification.md +49 -0
- package/package.json +4 -1
- package/dist/chunk-KGNF36DZ.js.map +0 -1
|
@@ -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/transport/serviceBridge.ts","../src/transport/messagePortServiceTransport.ts","../src/lifecycle/pluginIntentController.ts"],"names":["errorMessage","unique","options","result","entry","controller","error","desired","missing","unavailable","mergeSignals"],"mappings":"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","file":"chunk-URY3E6UH.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 providerInstanceId: string;\n /** 提供者所在真实 Runtime。 */\n runtime: RuntimeKind;\n /** 服务契约版本;第一阶段要求精确匹配。 */\n contractVersion: string;\n /** 提供环境的启动身份;重启后变化。 */\n authorityInstanceId: string;\n /** 提供者作用域身份。 */\n scopeId: string;\n /** 提供者所在 Coordinator 的升级接管世代;旧 Worker 引用不能跨世代使用。 */\n handoverGeneration: number;\n /** 宿主绑定的只读服务属性;服务桥不解释其业务含义。 */\n attributes: Readonly<Record<string, unknown>>;\n /** 当前服务目录状态。 */\n status: \"starting\" | \"ready\" | \"unavailable\" | \"failed\";\n /** 该引用所属的物理端口连接;本地服务可省略。 */\n connectionId?: string;\n /** 当前权威目录流修订号。 */\n snapshotRevision: number;\n /** 可选的外部授权标识;引用不是授权本身,Provider 仍需查权威状态。 */\n grantId?: string;\n /** 服务端授权策略修订;策略变化时旧引用必须失效。 */\n authorizationRevision?: number;\n}\n\n/** 服务桥握手输入;connectionId 必须由实际端口连接生成。 */\nexport interface RemoteServiceHandshake {\n /** 当前端口 / MessagePort 连接标识。 */\n connectionId: string;\n /** 对端提供环境的启动身份。 */\n authorityInstanceId: string;\n /** 桥协议版本。 */\n protocolVersion: string;\n}\n\n/** 一次服务目录基线或增量快照。 */\nexport interface RemoteServiceSnapshot {\n /** 快照来自哪条端口连接。 */\n connectionId: string;\n /** 快照来自哪个权威启动身份。 */\n authorityInstanceId: string;\n /** 同一启动身份、同一订阅范围内单调递增。 */\n snapshotRevision: number;\n /** 是否为包含完整订阅范围的基线。 */\n baseline: boolean;\n /** 当前订阅范围内的服务引用。 */\n services: readonly RemoteServiceReference[];\n}\n\n/** 服务桥在独立 MessagePort 上发送的控制消息。 */\nexport type RemoteServicePortControlMessage =\n | {\n /** 控制消息类型由 codec 绑定,核心不固定产品前缀。 */\n type: string;\n handshake: RemoteServiceHandshake;\n }\n | {\n type: string;\n snapshot: RemoteServiceSnapshot;\n }\n | {\n type: string;\n reason?: string;\n }\n | {\n type: string;\n reason?: string;\n };\n\n/** MessagePort 服务消息类别;具体字符串由 codec 统一编码。 */\nexport type RemoteServiceMessageKind =\n | \"call\"\n | \"result\"\n | \"error\"\n | \"cancel\"\n | \"handshake\"\n | \"snapshot\"\n | \"invalidate\"\n | \"disconnect\";\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 codec;产品可用同一工厂绑定旧协议前缀。 */\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 ?? \"1\";\n const types = new Map<RemoteServiceMessageKind, string>([\n [\"call\", `${prefix}.call`],\n [\"result\", `${prefix}.result`],\n [\"error\", `${prefix}.error`],\n [\"cancel\", `${prefix}.cancel`],\n [\"handshake\", `${prefix}.handshake`],\n [\"snapshot\", `${prefix}.snapshot`],\n [\"invalidate\", `${prefix}.invalidate`],\n [\"disconnect\", `${prefix}.disconnect`],\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 scopeId?: string;\n}\n\n/** 服务代理调用上下文;服务端必须在最终边界重新检查引用和租约。 */\nexport interface RemoteServiceCallContext {\n /** 业务操作标识;可由调用方复用,用于审计和幂等,不作为传输关联键。 */\n operationId?: string;\n /** 实际建立代理的端口连接标识。 */\n connectionId: string;\n /** 创建代理时捕获的不可变引用。 */\n reference: RemoteServiceReference;\n /** 引用绑定的外部授权标识,供最终服务边界再次核验。 */\n grantId?: string;\n /** 同时受消费者作用域和本次请求控制的 signal。 */\n signal: AbortSignal;\n}\n\n/** 跨环境传输实现;桥不负责自动重放有外部副作用的请求。 */\nexport interface RemoteServiceTransport {\n call<TRequest, TResult>(\n request: TRequest,\n context: RemoteServiceCallContext\n ): Promise<TResult>;\n}\n\n/** 已绑定服务引用的代理;提供者重建后旧代理永久失效。 */\nexport interface RemoteServiceProxy {\n readonly reference: RemoteServiceReference;\n readonly revoked: boolean;\n call<TRequest, TResult>(\n request: TRequest,\n options?: { signal?: AbortSignal; operationId?: string; /** 旧 requestId 调用方别名;不作为传输 callId。 */ requestId?: string }\n ): Promise<TResult>;\n revoke(reason?: string): void;\n}\n\nexport type RemoteServiceBridgeState = \"disconnected\" | \"handshaking\" | \"ready\" | \"stale\";\n\n/** 服务桥快照结果;调用方据此决定等待、重新握手或重新同步基线。 */\nexport type RemoteServiceSnapshotResult =\n | { accepted: true; state: RemoteServiceBridgeState; snapshotRevision: number }\n | { accepted: false; reason: \"wrong-connection\" | \"wrong-authority\" | \"stale-revision\" | \"baseline-required\" | \"revision-gap\"; expectedRevision?: number; receivedRevision: number };\n\n/** 跨 Worker 服务桥最小本地契约。 */\nexport interface RemoteServiceBridge {\n /** 当前端口连接状态。 */\n readonly state: RemoteServiceBridgeState;\n /** 当前握手连接标识。 */\n readonly connectionId?: string;\n /** 当前权威启动身份。 */\n readonly authorityInstanceId?: string;\n /** 接受一次新握手;新连接会使旧代理全部失效。 */\n handshake(input: RemoteServiceHandshake): { accepted: boolean; reason?: \"protocol-mismatch\" };\n /** 应用基线或连续增量快照;乱序和旧连接快照会被丢弃。 */\n applySnapshot(snapshot: RemoteServiceSnapshot): RemoteServiceSnapshotResult;\n /** 查询当前 ready 且版本精确匹配的服务代理。 */\n getProxy(lookup: RemoteServiceLookup, scope?: LifecycleScope): RemoteServiceProxy | undefined;\n /** 查询代理失败时抛出稳定错误。 */\n requireProxy(lookup: RemoteServiceLookup, scope?: LifecycleScope): RemoteServiceProxy;\n /** 同步撤下全部代理;不等待远端。 */\n invalidate(reason?: string): void;\n /** 端口断线;清除当前连接身份,后续快照必须等待新握手和基线。 */\n disconnect(reason?: string): void;\n /** 订阅桥状态和服务目录变化。 */\n subscribe(listener: () => void): () => void;\n /** 只读当前有效服务引用。 */\n services(): readonly RemoteServiceReference[];\n}\n\n/** 服务桥未就绪或代理已失效。 */\nexport class RemoteServiceUnavailableError extends Error {\n readonly code = \"service.unavailable\" as const;\n\n constructor(message = \"Remote service is unavailable\") {\n super(message);\n this.name = \"RemoteServiceUnavailableError\";\n }\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","// 跨 Worker 服务桥的本地实现。\n//\n// 桥只处理握手、服务目录连续性和代理失效;它不做自动寻址、不传递\n// PluginContext,也不替代本地依赖装配器。真正的 RPC 入口仍必须在提供端\n// 按引用、租约和宿主绑定属性再次校验。\n\nimport type {\n LifecycleScope,\n RemoteServiceBridge,\n RemoteServiceCallContext,\n RemoteServiceHandshake,\n RemoteServiceLookup,\n RemoteServiceProxy,\n RemoteServiceReference,\n RemoteServiceSnapshot,\n RemoteServiceSnapshotResult,\n RemoteServiceTransport,\n} from \"../contracts/lifecycle.js\";\nimport { RemoteServiceUnavailableError } from \"../contracts/lifecycle.js\";\n\nexport interface CreateServiceBridgeOptions {\n /** 桥协议版本;握手要求精确匹配。 */\n protocolVersion: string;\n /** 实际端口 RPC 传输;桥不负责重放请求。 */\n transport: RemoteServiceTransport;\n}\n\nfunction makeRequestId(): string {\n try {\n if (typeof crypto !== \"undefined\" && typeof crypto.randomUUID === \"function\") {\n return `service-request:${crypto.randomUUID()}`;\n }\n } catch {\n // 测试 / 旧 Worker 没有 Web Crypto 时退回非安全唯一值;它不是授权凭据。\n }\n return `service-request:${Date.now().toString(36)}:${Math.random().toString(36).slice(2)}`;\n}\n\nfunction mergeSignals(...signals: Array<AbortSignal | undefined>): {\n signal: AbortSignal;\n dispose: () => void;\n} {\n const activeSignals = signals.filter((signal): signal is AbortSignal => signal !== undefined);\n if (activeSignals.length === 0) {\n return { signal: new AbortController().signal, dispose: () => undefined };\n }\n if (activeSignals.length === 1) {\n const [signal] = activeSignals;\n // length 已知为 1;显式判断是为了兼容 noUncheckedIndexedAccess。\n if (signal) return { signal, dispose: () => undefined };\n }\n const alreadyAborted = activeSignals.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 abort = (source: AbortSignal) => {\n try {\n controller.abort(source.reason);\n } catch {\n controller.abort();\n }\n };\n const listeners = activeSignals.map((signal) => {\n const listener = () => abort(signal);\n signal.addEventListener(\"abort\", listener, { once: true });\n return { signal, listener };\n });\n return {\n signal: controller.signal,\n dispose: () => {\n for (const item of listeners) item.signal.removeEventListener(\"abort\", item.listener);\n },\n };\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 referenceKey(reference: RemoteServiceReference): string {\n return [\n reference.capabilityId,\n reference.providerInstanceId,\n reference.runtime,\n reference.contractVersion,\n reference.authorityInstanceId,\n reference.connectionId ?? \"local\",\n reference.scopeId,\n reference.handoverGeneration,\n stableAttributes(reference.attributes),\n reference.grantId ?? \"null\",\n reference.authorizationRevision ?? \"null\",\n // 代理绑定的是某一份权威目录快照;目录修订后即使 Provider 实例未变,\n // 旧代理也不能继续使用旧授权视图,必须重新取得当前引用。\n reference.snapshotRevision,\n ].join(\"\\u0000\");\n}\n\nfunction lookupMatches(reference: RemoteServiceReference, lookup: RemoteServiceLookup): boolean {\n return reference.status === \"ready\"\n && reference.capabilityId === lookup.capabilityId\n && reference.contractVersion === lookup.contractVersion\n && (lookup.runtime === undefined || reference.runtime === lookup.runtime)\n && (lookup.scopeId === undefined || reference.scopeId === lookup.scopeId);\n}\n\ninterface ProxyRecord {\n reference: RemoteServiceReference;\n revoked: boolean;\n reason: string;\n controller: AbortController;\n}\n\n/**\n * 创建一个绑定端口的服务桥。\n *\n * 快照规则:必须先接受 baseline;后续 revision 必须连续递增。发现缺口后\n * 立即清空代理,等待新 baseline,不能拿旧服务继续运行。\n */\nexport function createServiceBridge(options: CreateServiceBridgeOptions): RemoteServiceBridge {\n let currentState: RemoteServiceBridge[\"state\"] = \"disconnected\";\n let currentConnectionId: string | undefined;\n let currentAuthorityInstanceId: string | undefined;\n let lastRevision: number | undefined;\n let hasBaseline = false;\n const references = new Map<string, RemoteServiceReference>();\n const proxies = new Set<ProxyRecord>();\n const listeners = new Set<() => void>();\n\n const notify = () => {\n for (const listener of [...listeners]) {\n try {\n listener();\n } catch {\n // 观察者异常不能让服务桥停止接收撤权消息。\n }\n }\n };\n\n const revokeProxy = (proxy: ProxyRecord, reason: string) => {\n if (proxy.revoked) return;\n proxy.revoked = true;\n proxy.reason = reason;\n try {\n proxy.controller.abort(new RemoteServiceUnavailableError(reason));\n } catch {\n proxy.controller.abort();\n }\n };\n\n const invalidateProxies = (reason: string, keep?: ReadonlySet<string>) => {\n for (const proxy of proxies) {\n if (!keep?.has(referenceKey(proxy.reference))) {\n revokeProxy(proxy, reason);\n // Proxy 对象仍可被调用方持有;这里只移除桥内部的追踪记录,\n // 避免每次 Provider 重建都累积一个永不再用的旧实例记录。\n proxies.delete(proxy);\n }\n }\n };\n\n const clearReferences = (reason: string) => {\n references.clear();\n invalidateProxies(reason);\n };\n\n const bridge: RemoteServiceBridge = {\n get state() {\n return currentState;\n },\n get connectionId() {\n return currentConnectionId;\n },\n get authorityInstanceId() {\n return currentAuthorityInstanceId;\n },\n handshake(input: RemoteServiceHandshake) {\n if (input.protocolVersion !== options.protocolVersion) {\n clearReferences(\"service bridge protocol mismatch\");\n currentConnectionId = undefined;\n currentAuthorityInstanceId = undefined;\n lastRevision = undefined;\n hasBaseline = false;\n currentState = \"disconnected\";\n notify();\n return { accepted: false, reason: \"protocol-mismatch\" as const };\n }\n\n const isNewBinding = currentConnectionId !== input.connectionId\n || currentAuthorityInstanceId !== input.authorityInstanceId;\n if (isNewBinding) {\n clearReferences(\"remote service authority or connection changed\");\n lastRevision = undefined;\n hasBaseline = false;\n }\n currentConnectionId = input.connectionId;\n currentAuthorityInstanceId = input.authorityInstanceId;\n currentState = \"handshaking\";\n notify();\n return { accepted: true };\n },\n applySnapshot(snapshot: RemoteServiceSnapshot): RemoteServiceSnapshotResult {\n if (snapshot.connectionId !== currentConnectionId) {\n return {\n accepted: false,\n reason: \"wrong-connection\",\n receivedRevision: snapshot.snapshotRevision,\n };\n }\n if (snapshot.authorityInstanceId !== currentAuthorityInstanceId) {\n return {\n accepted: false,\n reason: \"wrong-authority\",\n receivedRevision: snapshot.snapshotRevision,\n };\n }\n if (!Number.isSafeInteger(snapshot.snapshotRevision) || snapshot.snapshotRevision < 0) {\n return {\n accepted: false,\n reason: \"stale-revision\",\n receivedRevision: snapshot.snapshotRevision,\n };\n }\n if (!snapshot.baseline && !hasBaseline) {\n currentState = \"stale\";\n clearReferences(\"service bridge baseline required\");\n notify();\n return {\n accepted: false,\n reason: \"baseline-required\",\n receivedRevision: snapshot.snapshotRevision,\n };\n }\n if (lastRevision !== undefined && snapshot.snapshotRevision <= lastRevision) {\n return {\n accepted: false,\n reason: \"stale-revision\",\n receivedRevision: snapshot.snapshotRevision,\n };\n }\n if (!snapshot.baseline && lastRevision !== undefined && snapshot.snapshotRevision !== lastRevision + 1) {\n currentState = \"stale\";\n clearReferences(\"service bridge revision gap\");\n hasBaseline = false;\n notify();\n return {\n accepted: false,\n reason: \"revision-gap\",\n expectedRevision: lastRevision + 1,\n receivedRevision: snapshot.snapshotRevision,\n };\n }\n\n const next = new Map<string, RemoteServiceReference>();\n for (const reference of snapshot.services) {\n // 目录包也必须自洽;不能让一条伪造的 entry 借当前握手身份\n // 把代理指向另一条 authority,或借旧 revision 混入当前快照。\n // 不自洽的条目按 fail-closed 处理:忽略它,而不是猜测兼容版本。\n if (\n reference.authorityInstanceId !== currentAuthorityInstanceId\n || reference.connectionId !== undefined && reference.connectionId !== snapshot.connectionId\n || reference.snapshotRevision !== snapshot.snapshotRevision\n ) continue;\n next.set(referenceKey(reference), Object.freeze({ ...reference }));\n }\n references.clear();\n for (const [key, reference] of next) references.set(key, reference);\n const validKeys = new Set(\n [...next.values()]\n .filter((reference) => reference.status === \"ready\")\n .map(referenceKey)\n );\n invalidateProxies(\"remote service reference is no longer ready\", validKeys);\n lastRevision = snapshot.snapshotRevision;\n hasBaseline = true;\n currentState = \"ready\";\n notify();\n return {\n accepted: true,\n state: currentState,\n snapshotRevision: snapshot.snapshotRevision,\n };\n },\n getProxy(lookup: RemoteServiceLookup, scope?: LifecycleScope): RemoteServiceProxy | undefined {\n if (currentState !== \"ready\") return undefined;\n const matches = [...references.values()].filter((candidate) => lookupMatches(candidate, lookup));\n if (matches.length > 1) {\n throw new RemoteServiceUnavailableError(\n `Service reference is ambiguous for \"${lookup.capabilityId}\" version \"${lookup.contractVersion}\"`\n );\n }\n const reference = matches[0];\n if (!reference) return undefined;\n const record: ProxyRecord = {\n reference,\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 let proxy: RemoteServiceProxy;\n const revokeFromScope = (reason: string) => {\n revokeProxy(record, reason);\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:${reference.capabilityId}`);\n } catch {\n record.revoked = true;\n }\n }\n if (record.revoked) {\n proxies.delete(record);\n removeScopeRevoke?.();\n removeScopeDispose?.();\n return undefined;\n }\n proxy = {\n reference,\n get revoked() {\n return record.revoked;\n },\n async call<TRequest, TResult>(\n request: TRequest,\n callOptions: { signal?: AbortSignal; operationId?: string; requestId?: string } = {}\n ) {\n if (record.revoked) throw new RemoteServiceUnavailableError(record.reason);\n const current = references.get(referenceKey(reference));\n if (currentState !== \"ready\" || !current || current.status !== \"ready\") {\n record.revoked = true;\n record.reason = \"Remote service reference is no longer ready\";\n throw new RemoteServiceUnavailableError(record.reason);\n }\n const merged = mergeSignals(scope?.signal, record.controller.signal, callOptions.signal);\n const connectionId = currentConnectionId;\n if (!connectionId) {\n merged.dispose();\n throw new RemoteServiceUnavailableError(\"Remote service connection is no longer active\");\n }\n const context: RemoteServiceCallContext = {\n // requestId 只作为旧调用方的业务 operationId 别名;真正的\n // MessagePort callId 由传输层每次调用单独生成。\n operationId: callOptions.operationId ?? callOptions.requestId ?? makeRequestId(),\n connectionId,\n reference,\n grantId: reference.grantId,\n signal: merged.signal,\n };\n let result: Promise<TResult>;\n try {\n result = Promise.resolve(options.transport.call<TRequest, TResult>(request, context));\n } catch (error) {\n merged.dispose();\n throw error;\n }\n try {\n const value = await Promise.race([\n result,\n new Promise<TResult>((_, reject) => {\n if (merged.signal.aborted) {\n reject(merged.signal.reason ?? new RemoteServiceUnavailableError(\"Remote service request aborted\"));\n return;\n }\n const onAbort = () => reject(merged.signal.reason ?? new RemoteServiceUnavailableError(\"Remote service request aborted\"));\n merged.signal.addEventListener(\"abort\", onAbort, { once: true });\n result.finally(() => merged.signal.removeEventListener(\"abort\", onAbort)).catch(() => undefined);\n }),\n ]);\n if (record.revoked || currentState !== \"ready\" || references.get(referenceKey(reference))?.status !== \"ready\") {\n throw new RemoteServiceUnavailableError(\"Remote service request belongs to an invalidated proxy\");\n }\n return value;\n } finally {\n merged.dispose();\n // 代理被撤销后保留在集合中没有安全意义,避免长期增长;撤销\n // 本身已经不可逆,因此不会被未来同名服务复用。\n if (record.revoked) {\n proxies.delete(record);\n removeScopeRevoke?.();\n removeScopeDispose?.();\n }\n }\n },\n revoke(reason = \"remote service proxy revoked\") {\n revokeProxy(record, reason);\n proxies.delete(record);\n removeScopeRevoke?.();\n removeScopeDispose?.();\n },\n };\n return proxy;\n },\n requireProxy(lookup: RemoteServiceLookup, scope?: LifecycleScope): RemoteServiceProxy {\n const proxy = bridge.getProxy(lookup, scope);\n if (!proxy) {\n throw new RemoteServiceUnavailableError(\n `Service \"${lookup.capabilityId}\" version \"${lookup.contractVersion}\" is not ready`\n );\n }\n return proxy;\n },\n invalidate(reason = \"remote service bridge invalidated\") {\n clearReferences(reason);\n currentState = \"stale\";\n lastRevision = undefined;\n hasBaseline = false;\n notify();\n },\n disconnect(reason = \"remote service connection disconnected\") {\n clearReferences(reason);\n currentConnectionId = undefined;\n currentAuthorityInstanceId = undefined;\n lastRevision = undefined;\n hasBaseline = false;\n currentState = \"disconnected\";\n notify();\n },\n subscribe(listener) {\n listeners.add(listener);\n return () => listeners.delete(listener);\n },\n services() {\n return [...references.values()];\n },\n };\n\n return bridge;\n}\n\n/** 兼容“服务桥 / 远程服务桥”两种调用语义;实现仍只有一套。 */\nexport const createRemoteServiceBridge = createServiceBridge;\n","// 基于 MessagePort 的远程服务调用传输。\n//\n// 服务桥本身只负责“哪个引用可以变成代理”;本模块负责把代理调用\n// 接到真实 Worker / Window MessagePort。它不做寻址、重放或权限放大:\n// - 每个请求都携带桥已经校验过的 service reference;\n// - AbortSignal 只发送取消通知,不把一次有外部副作用的调用自动重试;\n// - Provider 仍必须在自己的 RPC handler 和最终 I/O 边界再次校验引用、\n// owner、会话世代和权限租约。\n\nimport type {\n RemoteServiceMessageCodec,\n RemoteServiceCallContext,\n RemoteServiceReference,\n RemoteServiceTransport,\n} from \"../contracts/lifecycle.js\";\nimport {\n createRemoteServiceMessageCodec,\n RemoteServiceUnavailableError,\n} from \"../contracts/lifecycle.js\";\n\n/** MessagePort 上的调用请求;request 内容由具体服务契约定义。 */\nexport interface RemoteServicePortCallMessage {\n /** 固定协议类型,避免与业务 MessageBus 事件混用。 */\n /** codec 绑定的调用消息类型。 */\n type: string;\n /** 由传输层生成的唯一关联键;不接受调用方提供的业务 ID。 */\n callId: string;\n /** 实际端口连接标识。 */\n connectionId: string;\n /** 提供者运行实例;响应必须原样回显。 */\n providerInstanceId: string;\n /** 调用方可复用的业务操作标识;不参与 pending 映射。 */\n operationId?: string;\n /** 外部授权标识;Provider 最终边界必须核验。 */\n grantId?: string;\n /** Provider 必须在最终边界重新核验的服务引用。 */\n reference: RemoteServiceReference;\n /** 具体服务请求体;桥不解释也不重放。 */\n request: unknown;\n}\n\n/** MessagePort 上的成功响应。 */\nexport interface RemoteServicePortResultMessage {\n /** codec 绑定的成功消息类型。 */\n type: string;\n callId: string;\n connectionId: string;\n providerInstanceId: string;\n result: unknown;\n}\n\n/** MessagePort 上的失败响应;只传可序列化错误信息。 */\nexport interface RemoteServicePortErrorMessage {\n /** codec 绑定的失败消息类型。 */\n type: string;\n callId: string;\n connectionId: string;\n providerInstanceId: string;\n error: {\n name?: string;\n message: string;\n code?: string;\n };\n}\n\n/** 请求取消通知;Provider 仍需在最终提交前做自己的世代校验。 */\nexport interface RemoteServicePortCancelMessage {\n /** codec 绑定的取消消息类型。 */\n type: string;\n callId: string;\n connectionId: string;\n providerInstanceId: 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.*。 */\n codec?: RemoteServiceMessageCodec;\n}\n\ninterface PendingCall {\n connectionId: string;\n providerInstanceId: string;\n resolve(value: unknown): void;\n reject(error: unknown): void;\n removeAbort: () => void;\n}\n\n// 调用 ID 属于传输协议,不属于业务请求。计数器放在模块级,确保同一\n// Worker / Window 内即使销毁并重建 transport,也不会重新使用旧 callId。\n// 业务 operationId / requestId 可以重试或复用,但不能参与响应关联。\nlet nextTransportId = 0;\nlet nextCallSequence = 0;\n\nfunction makeTransportId(): number {\n nextTransportId += 1;\n return nextTransportId;\n}\n\nfunction makeCallId(transportId: number): string {\n nextCallSequence += 1;\n return `remote-call:${transportId}:${nextCallSequence}`;\n}\n\nfunction errorFromWire(input: RemoteServicePortErrorMessage[\"error\"]): Error {\n const error = new Error(\n typeof input?.message === \"string\" ? input.message : \"Remote service call failed\"\n );\n if (typeof input?.name === \"string\" && input.name.length > 0) error.name = input.name;\n if (typeof input?.code === \"string\" && input.code.length > 0) {\n Object.defineProperty(error, \"code\", {\n configurable: true,\n enumerable: true,\n value: input.code,\n writable: false,\n });\n }\n return error;\n}\n\nfunction abortReason(signal: AbortSignal): unknown {\n return signal.reason ?? new RemoteServiceUnavailableError(\"Remote service request aborted\");\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 (\n (message.type === codec.type(\"result\") || message.type === codec.type(\"error\"))\n && typeof message.callId === \"string\"\n && typeof message.connectionId === \"string\"\n && typeof message.providerInstanceId === \"string\"\n );\n}\n\n/**\n * 创建一个真实 MessagePort 传输。\n *\n * 返回对象的 `dispose()` 只关闭本端请求表和监听器;默认不关闭端口,\n * 以免误伤同一端口上的握手 / 快照订阅。需要独占端口时可显式设置\n * `closeOnDispose: true`。\n */\nexport function createMessagePortServiceTransport(\n options: CreateMessagePortServiceTransportOptions\n): RemoteServiceTransport & { dispose(): void } {\n const pending = new Map<string, PendingCall>();\n let disposed = false;\n const transportId = makeTransportId();\n const codec = options.codec ?? createRemoteServiceMessageCodec();\n\n const onMessage = (event: MessageEvent) => {\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 // 迟到的旧连接/旧 Provider 响应必须被丢弃。callId 单独解决复用\n // operationId 的问题,连接和 provider 身份再解决端口内的世代问题。\n if (\n decoded.connectionId !== call.connectionId\n || decoded.providerInstanceId !== call.providerInstanceId\n ) return;\n pending.delete(decoded.callId);\n call.removeAbort();\n if (decoded.type === codec.type(\"error\")) {\n call.reject(errorFromWire(decoded.error as RemoteServicePortErrorMessage[\"error\"]));\n } else {\n call.resolve(decoded.result);\n }\n };\n\n options.port.addEventListener(\"message\", onMessage);\n options.port.start();\n\n const dispose = () => {\n if (disposed) return;\n disposed = true;\n options.port.removeEventListener(\"message\", onMessage);\n for (const [callId, call] of pending) {\n pending.delete(callId);\n call.removeAbort();\n call.reject(new RemoteServiceUnavailableError(\"Remote service transport disposed\"));\n }\n if (options.closeOnDispose) options.port.close();\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 RemoteServiceUnavailableError(\"Remote service transport disposed\"));\n if (context.signal.aborted) return Promise.reject(abortReason(context.signal));\n const callId = makeCallId(transportId);\n const providerInstanceId = context.reference.providerInstanceId;\n\n return new Promise<TResult>((resolve, reject) => {\n let settled = false;\n const finish = (callback: () => void) => {\n if (settled) return;\n settled = true;\n callback();\n };\n const onAbort = () => {\n if (!pending.delete(callId)) return;\n finish(() => reject(abortReason(context.signal)));\n try {\n const cancel: RemoteServicePortCancelMessage = {\n type: codec.type(\"cancel\"),\n callId,\n connectionId: context.connectionId,\n providerInstanceId,\n };\n options.port.postMessage(codec.encode(cancel as unknown as Record<string, unknown>));\n } catch {\n // 端口断开时调用已经失败;不能再用异常覆盖原取消结果。\n }\n };\n const pendingCall: PendingCall = {\n connectionId: context.connectionId,\n providerInstanceId,\n resolve: (value) => finish(() => resolve(value as TResult)),\n reject: (error) => finish(() => reject(error)),\n removeAbort: () => context.signal.removeEventListener(\"abort\", onAbort),\n };\n pending.set(callId, pendingCall);\n context.signal.addEventListener(\"abort\", onAbort, { once: true });\n try {\n const message: RemoteServicePortCallMessage = {\n type: codec.type(\"call\"),\n callId,\n connectionId: context.connectionId,\n providerInstanceId,\n ...(context.operationId ? { operationId: context.operationId } : {}),\n ...(context.grantId ?? context.reference.grantId\n ? { grantId: context.grantId ?? context.reference.grantId }\n : {}),\n reference: context.reference,\n request,\n };\n const transfer = options.transferForRequest?.(request, context) ?? [];\n options.port.postMessage(codec.encode(message as unknown as Record<string, unknown>), [...transfer]);\n if (context.signal.aborted) onAbort();\n } catch (error) {\n pending.delete(callId);\n pendingCall.removeAbort();\n pendingCall.reject(error);\n }\n });\n },\n dispose,\n };\n return transport;\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"]}
|