# 安装环境与插件请求

使用完整 Bundle 安装身份区分来源与目标环境，并按授权路由引用访问解析。

Bundle 顶层绑定引用稳定 `pluginId`，执行地址由插件目录管理。
生命周期协议 `6.0.0` 与引用协议 `4.0.0` 都携带同一个 `installation`。

## 安装身份

```json
{
  "installation": {
    "environmentKey": "consumer",
    "applicationRuntimeId": "runtime-a",
    "workspaceId": 42,
    "bundleInstallId": "installation-a",
    "bundle": {
      "environmentKey": "publisher",
      "bundleId": "sales"
    }
  }
}
```

`installation.environmentKey` 表示安装所在环境，`installation.bundle.environmentKey` 表示 Bundle 来源。
两者可以不同。`applicationRuntimeId`、`workspaceId`、`bundleInstallId` 与来源 Bundle 共同定位安装；
`resources` 或引用请求中的 `resource` 使用完整 ResourceLocator 定位获授权资源。
不得从资源来源、工作区、域名或 Runtime ID 推断安装环境，也不得只按业务实例 ID 接管其他安装的资源。

环境键是环境登记的规范字符串：2–64 个 ASCII 字符，首位为字母或数字，其余为字母、数字、下划线或连字符。
大小写保留，拒绝 URL、空白或自动补齐。完整请求见[协议](/development/lifecycle-plugin-development/reference-protocol/)。

## 按需访问

插件保存完整安装身份、资源 Locator 和已授权的属性名。需要业务调用时，向配置的平台入口发送
`POST /module-plugin-manager/api/bundle-plugin/service-reference/resolve`，原样携带 `installation`、`resource`、`propertyKey` 与引用协议版本。
平台从经过认证的插件凭据取得 `pluginId`；请求不能自行指定插件身份、目标服务或地址密钥。

平台依据安装环境登记完成路由，并在目标环境验证当前活动安装、插件绑定、资源、属性授权与当前引用。
安装环境字段只是定位信息，不是授权。未知环境、撤销、无权访问、身份不匹配或远端不可达都使本次解析失败。
插件不维护其他环境的地址或凭据，不尝试其他环境或使用之前保存的访问材料。

## 外部实例归属

创建、查询、修改和解除关联均校验完整安装身份。重新安装产生的新 `bundleInstallId` 不自动取得旧安装的外部实例。
显式传入已有实例编号时也必须验证其归属。历史关联必须由业务所有者根据可证明的安装记录迁移，不能按地址猜测归属。
安装与业务配置迁移完成后，再验证停止、卸载、重装以及跨环境隔离。
