JetLinks 能力市场SDK
能力下载、安装、升级等操作通过 CapabilityOperationContext 串联同一次操作的
operationId。运行时安装入口可使用 CapabilityOperationContext.currentOrCreate()
读取或创建上下文,并通过 CapabilityOperationContext.makeCurrent(...) 传递到下载、
安装 Provider、资源保存和进度回调链路。
CapabilityMarketplaceClient.reportOperationEvent(CapabilityOperationEvent event) 是统一
的操作事件上报入口。默认实现为空操作,HTTP client 会调用
POST /marketplace/operations/_report,命令 client 可通过
ReportCapabilityOperationEventCommand 转发到服务端。上报失败应只影响操作流水,不应中断
实际安装流程。
当前标准事件类型包括:
download:开始下载能力包,只作为操作流水。installing:进入安装流程,可用于服务端维护当前安装状态。action:操作过程中ActionRecorder记录的动作摘要事件。progress/log:进度与日志流水。success/failed:安装最终状态。
Provider 可通过 CapabilityContext.monitor().recorder() 记录结构化动作信息。Recorder
产出的完整 ActionRecord 会放到安装进度流 ProgressState.extra 中,便于前端按结构化数据引导跳转;
CapabilityOperationEvent 仍只上报消息摘要和状态,不承载完整结构化细节。
CapabilityOperationContext 只保存 operationId,不承载项目、用户、来源或运行时等业务字段;
这些信息由调用侧已有的租户、认证或链路上下文解析。
能力包中的 CapabilityInfo.dependencies 会在主能力 Provider 执行前处理。依赖能力按声明顺序安装,
依赖安装或升级失败时会阻断主能力安装;optional=true 当前不改变失败策略。
依赖版本通过 CapabilityMarketplaceClient.getVersions(capabilityId) 获取,并从满足
CapabilityDependency.versionRange 的可用版本中选择最高版本。versionRange 为空时选择最高可用版本;
非空时支持逗号分隔的 AND 条件:>=、>、<=、<、=、==,裸版本按精确匹配处理。
当前上下文中全部可见的依赖安装记录会逐条与 versionRange 比较,所有满足范围的记录都会作为覆盖目标进入
依赖 Provider,由 Provider 根据安装请求和旧资源判断是否更新;没有满足范围的记录时按首次安装处理,不覆盖旧记录。
依赖安装复用同一个 CapabilityOperationContext,并会检测循环依赖以避免递归安装。
主能力 Provider 执行时,可通过 CapabilityContext.loadDependencyResources() 获取本次依赖安装后可见的依赖资源,
或通过 CapabilityContext.loadDependencyResources(type) 按资源类型过滤依赖资源,用于读取依赖资源的 dataId。
依赖 Provider 的返回结果会完整替换本次传入的覆盖目标绑定。Provider 只更新部分目标时,必须同时返回
未更新的旧资源;安装完成后,主能力上下文只加载版本仍满足 versionRange 的可见依赖资源。
运行时能力市场只通过 CapabilityMarketplaceClient 访问 SaaS 能力市场,不直接依赖 SaaS 管理端的
MarketplaceResourceDetail。公共契约新增 CapabilityLatestVersionInfo,在 CapabilityInfo 基础上携带最新
CapabilityVersion;版本信息补充 publishTime、others 和 dependencyDetails,其中依赖详情仍使用
CapabilityLatestVersionInfo 表达启用的依赖能力,并在其 versionRange 范围内选择最高版本。
查询沿用 CapabilitySearchRequest 的分页和筛选语义;paging 默认为 true,设置为 false 时忽略
pageIndex 和 pageSize 返回全部匹配结果。HTTP 与 Command 两条现有边界返回相同结构。
运行时入口为 POST /marketplace/capabilities/version/_search。
SaaS Manager 内部复用资源详情查询和直接依赖装配逻辑,在 MarketplacePublicService 统一转换为公共契约;
Controller、Command Handler 和 Client 只负责参数与结果转发,不暴露 SaaS 内部实体和 DTO。
本次只展开当前版本的直接依赖,依赖项自身的 dependencyDetails 不递归填充;发布时间原样返回版本
publishTime 与 others.contentPublishedAt,由调用方按 publishTime 优先、contentPublishedAt 兜底的规则
判断同版本内容是否更新。不改变现有能力安装时的 versionRange 解析和依赖安装行为。
测试覆盖:
- 公共查询返回能力基本信息、最新版本、发布时间、
others,以及启用的直接依赖在版本范围内的最高版本。 - 没有最新版本时
version为null;没有依赖时dependencyDetails为空集合,不产生递归查询或阻塞调用。 - HTTP Client、Command Client、内部 Client 与运行时 Controller 使用同一
CapabilityLatestVersionInfo契约。 - SaaS 公开查询继续只返回启用资源,并沿用既有认证、可用性判断和数据脱敏逻辑。
跨服务 Provider 安装时,CapabilityContext.loadInstallResources() 和
CapabilityContext.loadDependencyResources() 只以 marketplace-core 中的
InstalledResource 作为资源契约。安装编排侧会在进入 Provider 前把本地持久化实体转换为
InstalledResource,集群命令回调侧也会在返回 RPC 前复制为基础 InstalledResource,避免远端服务加载
marketplace-client 内部实体类。
capability_resource_install 的主键使用 capabilityId + type + resourceId + dataId 生成稳定摘要,
用于表达一条逻辑安装绑定,而不是一次安装流水。相同能力资源重新安装、升级或补写版本时应复用同一主键,
避免同一逻辑绑定因重复保存落成多条记录;版本号仍单独存储,不参与绑定主键生成。