refactor: share cli install helpers

This commit is contained in:
Peter Steinberger 2026-03-14 00:29:32 +00:00
parent 97aa786dd5
commit f806b07208
2 changed files with 19 additions and 17 deletions

View File

@ -126,6 +126,15 @@ function expectFirstInstallPlanCallOmitsToken() {
expect(firstArg && "token" in firstArg).toBe(false);
}
function mockResolvedGatewayTokenSecretRef() {
resolveSecretInputRefMock.mockReturnValue({
ref: { source: "env", provider: "default", id: "OPENCLAW_GATEWAY_TOKEN" },
});
resolveSecretRefValuesMock.mockResolvedValue(
new Map([["env:default:OPENCLAW_GATEWAY_TOKEN", "resolved-from-secretref"]]),
);
}
const { runDaemonInstall } = await import("./install.js");
const envSnapshot = captureFullEnv();
@ -195,12 +204,7 @@ describe("runDaemonInstall", () => {
});
it("validates token SecretRef but does not serialize resolved token into service env", async () => {
resolveSecretInputRefMock.mockReturnValue({
ref: { source: "env", provider: "default", id: "OPENCLAW_GATEWAY_TOKEN" },
});
resolveSecretRefValuesMock.mockResolvedValue(
new Map([["env:default:OPENCLAW_GATEWAY_TOKEN", "resolved-from-secretref"]]),
);
mockResolvedGatewayTokenSecretRef();
await runDaemonInstall({ json: true });
@ -219,12 +223,7 @@ describe("runDaemonInstall", () => {
loadConfigMock.mockReturnValue({
gateway: { auth: { mode: "token", token: "${OPENCLAW_GATEWAY_TOKEN}" } },
});
resolveSecretInputRefMock.mockReturnValue({
ref: { source: "env", provider: "default", id: "OPENCLAW_GATEWAY_TOKEN" },
});
resolveSecretRefValuesMock.mockResolvedValue(
new Map([["env:default:OPENCLAW_GATEWAY_TOKEN", "resolved-from-secretref"]]),
);
mockResolvedGatewayTokenSecretRef();
await runDaemonInstall({ json: true });

View File

@ -31,6 +31,12 @@ const parseFacing = (value: string): CameraFacing => {
throw new Error(`invalid facing: ${value} (expected front|back)`);
};
function getGatewayInvokePayload(raw: unknown): unknown {
return typeof raw === "object" && raw !== null
? (raw as { payload?: unknown }).payload
: undefined;
}
export function registerNodesCameraCommands(nodes: Command) {
const camera = nodes.command("camera").description("Capture camera media from a paired node");
@ -157,9 +163,7 @@ export function registerNodesCameraCommands(nodes: Command) {
});
const raw = await callGatewayCli("node.invoke", opts, invokeParams);
const res =
typeof raw === "object" && raw !== null ? (raw as { payload?: unknown }) : {};
const payload = parseCameraSnapPayload(res.payload);
const payload = parseCameraSnapPayload(getGatewayInvokePayload(raw));
const filePath = cameraTempPath({
kind: "snap",
facing,
@ -229,8 +233,7 @@ export function registerNodesCameraCommands(nodes: Command) {
});
const raw = await callGatewayCli("node.invoke", opts, invokeParams);
const res = typeof raw === "object" && raw !== null ? (raw as { payload?: unknown }) : {};
const payload = parseCameraClipPayload(res.payload);
const payload = parseCameraClipPayload(getGatewayInvokePayload(raw));
const filePath = await writeCameraClipPayloadToFile({
payload,
facing,