package.json#heybox.companions 中声明的 Companion alias。必须完整匹配
[a-z][a-z0-9-]{0,31}:长度为 1 至 32,第一个字符是小写 ASCII 字母,其余字符
只能是小写字母、数字或连字符;SDK 不会 trim 或改变大小写。
Host 确认进程处于 running 并把当前 controller 交给本 Runtime 后返回
CompanionSession proxy。如果同 alias 已有活动 Session,则返回该进程而不是
创建第二个;同一 SDK 页面内相同 Session ID 会复用同一个 proxy 对象。
HbMiniProgramSDKError alias 不符合格式时在请求前以 INVALID_PARAMS
拒绝。真正创建新进程时,缺少新的可信用户手势以 USER_GESTURE_REQUIRED 拒绝,用户
取消 Host 授权以 COMPANION_USER_CANCELLED 拒绝,产物尚未 ready 以
COMPANION_NOT_PREPARED 拒绝;描述符不可用、操作系统阻止、启动失败或未来管理员权限
被拒绝时,可能以 COMPANION_DESCRIPTOR_UNAVAILABLE、COMPANION_OS_BLOCKED、
COMPANION_LAUNCH_FAILED、COMPANION_ELEVATION_DENIED 拒绝。
当前版本未声明 alias、当前平台没有匹配 target、预览 Host 不支持 Companion 或当前
Host 未开放能力时,可能以 COMPANION_NOT_DECLARED、COMPANION_TARGET_UNSUPPORTED、
COMPANION_PREVIEW_UNSUPPORTED、COMPANION_UNSUPPORTED 或 METHOD_FORBIDDEN 拒绝。
当前运行快照缺少或未启用 companion 权限时分别以 PERMISSION_NOT_IN_SNAPSHOT、
PERMISSION_DENIED 拒绝;Host 返回非法 Session 快照时以 COMPANION_HOST_FAILED 拒绝,
同一 Session ID 的 alias、target 或 capability 集合发生不兼容变化时以
COMPANION_SESSION_VERSION_MISMATCH 拒绝。握手失败、SDK/Runtime 已销毁及其他 bridge
或 Host 失败会保留对应 SDK 错误码。
launch() 不会隐式调用 companion.prepare,
也不会下载、校验或解压产物。没有活动 Session 时,产物必须已通过原子提交进入
ready;应先用
companion.getPreparationStatus
展示准备状态,并由单独的用户操作完成准备。
真正创建新进程的 launch() 与开始新准备的 prepare() 必须来自两次独立的可信用户
手势和两次 Host 授权。不要在一个点击回调中 await prepare() 后串联 launch,也不要在
页面挂载、定时器或 Promise continuation 中自动启动。调用 launch() 时应把它作为用户
回调中的第一个异步操作;SDK/Runtime 会自行处理握手。
同一小程序 identity 与 alias 同时最多有一个活动 Session。Runtime 会先查询活动进程; 若存在,则直接取得并返回它,不要求新的手势、不显示 launch 授权,也不调用 Host 的新 进程启动原语。页面 reload 后只需恢复现有进程时,优先使用 companion.getActiveSession,更清楚地 表达“重新取得 controller”而不是“启动”。
返回的 proxy 公开稳定的 id、alias、target、只读 capabilities 与初始
state: 'running',以及 terminate()、waitForExit()、onStateChange()、onExit()、
onOwnershipLost()。它不暴露 PID、物理路径、命令行、原生句柄或 controller
generation。只有 Host 返回的 capability 集合包含对应项时,stdio、attachments、
notifications 才存在;调用方必须按属性是否存在分支。
进程由 Host 持有,页面隐藏或 reload 不会结束它。当前受支持的新 PC Host 提供 Session
event source;其他 Runtime 取得 controller 后,当前 proxy 会触发 onOwnershipLost(),控制类操作随后以
COMPANION_SESSION_OWNERSHIP_LOST 失败,但 waitForExit() 仍等待同一进程退出。退出后
state 变为 exited,onExit() 与 waitForExit() 获得同一份退出结果。自定义 Host 若未提供
可选的 Session 事件源,则这些本地监听不会主动更新,waitForExit() 也可能一直 pending;集成方应补齐事件源。
该调用需要 Manifest 声明且平台批准 companion 权限。V1 真实启动仅支持新 PC Host 的
windows-x64 与 macos-arm64;Browser Dev Host 只启动确定性 Fake,不下载、不解压、
不执行本机程序,不能替代目标系统验收。可先用
companion.getInfo 展示 target、capability、签名
与产物来源,但这些元数据本身不表示已经 ready。
import hbSDK from '@heybox/hb-sdk'
launchButton.addEventListener('click', () => {
// launch() 是点击回调中的第一个异步操作,不复用 prepare() 的手势。
void launchRunner().catch(showLaunchError)
})
async function launchRunner() {
const session = await hbSDK.companion.launch('runner')
const stopOwnership = session.onOwnershipLost(disableCompanionControls)
const stopOutput = session.stdio?.onStdout(handleCompanionBytes)
const exit = await session.waitForExit()
stopOutput?.()
stopOwnership()
renderCompanionExit(exit)
}
启动指定 alias 的 Companion,或取得已经活动的同 alias Session。