Skip to content

Commit ca1ee94

Browse files
laitingshengprekshivyasclaude
authored
fix(policy): suppress agent-required preset additions on restricted tier (NVIDIA#5798)
<!-- markdownlint-disable MD041 --> ## Summary `nemoclaw onboard --policy-tier=restricted` (and the interactive equivalent) used to apply `openclaw-pricing` to OpenClaw sandboxes regardless of the chosen tier, because the suggestion pipeline added it as an OpenClaw-required preset before the tier filter ran. The Restricted tier description promises "no third-party network access beyond inference and core agent tooling", so the pricing fetch — which reaches LiteLLM and OpenRouter — directly contradicts the tier intent. This change suppresses the OpenClaw agent-required additions (`openclaw-pricing`, and the local OTEL preset when OTEL is enabled) on the Restricted tier at both the suggestion helper and the final application boundary, prints a one-line onboard notice listing what was suppressed and how to reapply it, and documents the stricter Restricted behaviour in the tier definition and reference page. ## Related Issue Fixes NVIDIA#5793 ## Changes - `src/lib/onboard/policy-selection.ts`: extract a shared `agentRequiredPresetAdditions(agent, env)` helper so `computeSetupPresetSuggestions` and `suppressedAgentRequiredPresets` cannot drift apart. Gate the OpenClaw agent-required adds (`openclaw-pricing` and `requiredOpenclawOtelPolicyPresets`) on `tierName !== "restricted"` inside `computeSetupPresetSuggestions`, and filter the same set out of `chosen` and `interactiveChoice` after `mergeRequiredSetupPolicyPresets` so the later merge step cannot reintroduce the OTEL preset for restricted + OpenClaw. - `src/lib/onboard/policy-selection.ts`: new exported `suppressedAgentRequiredPresets(tierName, agent, env)` helper and a follow-up `deps.note(...)` in `setupPoliciesWithSelectionInner` that prints `Restricted tier suppresses agent-required preset(s): ... Apply later with 'nemoclaw <name> policy-add <preset>' if needed.` whenever the helper returns anything. - `nemoclaw-blueprint/policies/tiers.yaml`: extend the Restricted tier description (active voice) to call out that Restricted mode suppresses agent-required preset additions and to point operators at `policy-add`. - `docs/reference/network-policies.mdx`: mirror the new Restricted description in the tier table (active voice). - `test/onboard-policy-suggestions.test.ts`: ten new tests under `computeSetupPresetSuggestions > restricted tier suppresses agent-required preset additions` and a new `suppressedAgentRequiredPresets` block. The OTEL env-var tests save, clear, and restore both `NEMOCLAW_OPENCLAW_OTEL` and `NEMOCLAW_OPENCLAW_OTEL_ENDPOINT` so runner-inherited values cannot affect the expectation. - `test/policy-tiers-onboard.test.ts`: three new application-path tests that exercise `setupPoliciesWithSelection` end-to-end — restricted + OpenClaw applies zero presets in non-interactive suggested mode, restricted + OpenClaw with `NEMOCLAW_OPENCLAW_OTEL=1` does not re-add `openclaw-diagnostics-otel-local` after the required-preset merge, and the suppression note matches the final applied set. ## Type of Change - [ ] Code change (feature, bug fix, or refactor) - [x] Code change with doc updates - [ ] Doc only (prose changes, no code sample modifications) - [ ] Doc only (includes code sample changes) ## Verification - [x] PR description includes the DCO sign-off declaration and every commit appears as `Verified` in GitHub - [x] Git hooks passed during commit and push, or `npx prek run --from-ref main --to-ref HEAD` passes - [x] Targeted tests pass for changed behavior - [ ] Full `npm test` passes (broad runtime changes only) - [x] Tests added or updated for new or changed behavior - [x] No secrets, API keys, or credentials committed - [x] Docs updated for user-facing behavior changes - [ ] `npm run docs` builds without warnings (doc changes only) - [x] Doc pages follow the [style guide](https://github.com/NVIDIA/NemoClaw/blob/main/docs/CONTRIBUTING.md) (doc changes only) - [ ] New doc pages include SPDX header and frontmatter (new pages only) --- Signed-off-by: Tinson Lai <tinsonl@nvidia.com> <!-- This is an auto-generated comment: release notes by coderabbit.ai --> ## Summary by CodeRabbit * **Documentation** * Updated “Restricted” network policy tier guidance to clarify that specific agent-required preset additions are suppressed and can be re-applied later with `policy-add`. * **New Features** * Restricted-tier onboarding now suppresses withheld agent-required presets for applicable agents and surfaces a note listing which presets are suppressed. * **Bug Fixes** * Correctly limits preset suggestions and prevents restricted presets from being (re-)applied; reconciliation removes previously applied withheld presets. * **Tests** * Added unit and integration coverage for Restricted-tier behavior, including OTEL-enabled scenarios and applied-vs-suppressed verification. <!-- end of auto-generated comment: release notes by coderabbit.ai --> --------- Signed-off-by: Tinson Lai <tinsonl@nvidia.com> Co-authored-by: Prekshi Vyas <prekshiv@nvidia.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
1 parent 34b1156 commit ca1ee94

22 files changed

Lines changed: 1845 additions & 120 deletions

docs/reference/network-policies.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ The baseline policy is always applied regardless of the selected tier.
6868

6969
| Tier | Presets included | Description |
7070
|------|------------------|-------------|
71-
| Restricted | None | Base sandbox only. No third-party network access beyond inference and core agent tooling. |
71+
| Restricted | None | Base sandbox only. No third-party network access beyond inference and core agent tooling. Restricted mode suppresses agent-required preset additions, such as OpenClaw pricing fetches; reapply them later with `policy-add` if cost recording or other agent-side features are needed. |
7272
| Balanced (default) | `npm`, `pypi`, `huggingface`, `brew`, `brave when supported` | Full dev tooling and web search for agents that support web search. No messaging platform access. Apply the `weather` preset explicitly if your agent needs read-only weather lookups. |
7373
| Open | `npm`, `pypi`, `huggingface`, `brew`, `brave when supported`, `weather`, `public-reference`, `slack`, `discord`, `telegram`, `wechat` (experimental), `whatsapp` (experimental), `jira`, `outlook` | Broad access across third-party services including messaging, productivity, weather, and public-reference APIs. |
7474

nemoclaw-blueprint/policies/tiers.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
tiers:
1515
- name: restricted
1616
label: Restricted
17-
description: Base sandbox only. No third-party network access beyond inference and core agent tooling.
17+
description: Base sandbox only. No third-party network access beyond inference and core agent tooling. Restricted mode suppresses agent-required preset additions, such as OpenClaw pricing fetches; reapply them later with policy-add if cost recording or other agent-side features are needed.
1818
presets: []
1919

2020
- name: balanced

src/lib/onboard.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4571,8 +4571,8 @@ async function setupPoliciesWithSelection(
45714571
waitForSandboxReady,
45724572
syncPresetSelection,
45734573
selectPolicyTier,
4574-
setPolicyTier: (sandbox, tierName) =>
4575-
registry.updateSandbox(sandbox, { policyTier: tierName }),
4574+
setPolicyTier: (s, t) => registry.updateSandbox(s, { policyTier: t }),
4575+
getRecordedPolicyTier: (s) => registry.getSandbox(s)?.policyTier ?? null,
45764576
selectTierPresetsAndAccess,
45774577
parsePolicyPresetEnv,
45784578
env: process.env,

src/lib/onboard/initial-policy.test.ts

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -265,21 +265,35 @@ network_policies:
265265
expect(prepared.cleanup?.()).toBe(true);
266266
});
267267

268-
it("merges openclaw-diagnostics-otel-local at create time when OTEL is enabled", () => {
268+
it("merges openclaw-diagnostics-otel-local at create time when OTEL is enabled and the tier is known non-restricted", () => {
269269
const basePolicyPath = tmpPolicy("version: 1\nnetwork_policies:\n base: {}\n");
270270
process.env.NEMOCLAW_OPENCLAW_OTEL = "1";
271271
process.env.NEMOCLAW_OPENCLAW_OTEL_ENDPOINT = "http://host.openshell.internal:4318";
272272
delete process.env.NEMOCLAW_OPENCLAW_OTEL_SERVICE_NAME;
273273
delete process.env.NEMOCLAW_OPENCLAW_OTEL_SAMPLE_RATE;
274274
const prepared = prepareInitialSandboxCreatePolicy(basePolicyPath, [], {
275275
agentName: "openclaw",
276+
policyTier: "balanced",
276277
});
277278

278279
expect(prepared.appliedPresets).toEqual(["openclaw-diagnostics-otel-local"]);
279280
expect(prepared.policyPath).not.toBe(basePolicyPath);
280281
expect(prepared.cleanup?.()).toBe(true);
281282
});
282283

284+
it("defers openclaw-diagnostics-otel-local at create time when the tier is unknown (interactive flow)", () => {
285+
const basePolicyPath = tmpPolicy("version: 1\nnetwork_policies:\n base: {}\n");
286+
process.env.NEMOCLAW_OPENCLAW_OTEL = "1";
287+
process.env.NEMOCLAW_OPENCLAW_OTEL_ENDPOINT = "http://host.openshell.internal:4318";
288+
289+
const prepared = prepareInitialSandboxCreatePolicy(basePolicyPath, [], {
290+
agentName: "openclaw",
291+
});
292+
293+
expect(prepared.appliedPresets).toEqual([]);
294+
expect(prepared.policyPath).toBe(basePolicyPath);
295+
});
296+
283297
it("does not merge OpenClaw OTEL policy at create time for terminal agents", () => {
284298
const basePolicyPath = tmpPolicy("version: 1\nnetwork_policies:\n base: {}\n");
285299
process.env.NEMOCLAW_OPENCLAW_OTEL = "1";
@@ -293,4 +307,32 @@ network_policies:
293307
expect(prepared.policyPath).toBe(basePolicyPath);
294308
expect(prepared.cleanup).toBeUndefined();
295309
});
310+
311+
it("suppresses openclaw-diagnostics-otel-local at create time on the restricted tier (defence-in-depth)", () => {
312+
const basePolicyPath = tmpPolicy("version: 1\nnetwork_policies:\n base: {}\n");
313+
process.env.NEMOCLAW_OPENCLAW_OTEL = "1";
314+
process.env.NEMOCLAW_OPENCLAW_OTEL_ENDPOINT = "http://host.openshell.internal:4318";
315+
316+
const prepared = prepareInitialSandboxCreatePolicy(basePolicyPath, [], {
317+
agentName: "openclaw",
318+
policyTier: "restricted",
319+
});
320+
321+
expect(prepared.appliedPresets).toEqual([]);
322+
expect(prepared.policyPath).toBe(basePolicyPath);
323+
});
324+
325+
it("keeps openclaw-diagnostics-otel-local at create time on the balanced tier when OTEL is enabled", () => {
326+
const basePolicyPath = tmpPolicy("version: 1\nnetwork_policies:\n base: {}\n");
327+
process.env.NEMOCLAW_OPENCLAW_OTEL = "1";
328+
process.env.NEMOCLAW_OPENCLAW_OTEL_ENDPOINT = "http://host.openshell.internal:4318";
329+
330+
const prepared = prepareInitialSandboxCreatePolicy(basePolicyPath, [], {
331+
agentName: "openclaw",
332+
policyTier: "balanced",
333+
});
334+
335+
expect(prepared.appliedPresets).toEqual(["openclaw-diagnostics-otel-local"]);
336+
expect(prepared.cleanup?.()).toBe(true);
337+
});
296338
});

src/lib/onboard/initial-policy.ts

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { getMessagingPolicyKeysByChannel } from "../messaging/channels";
99
import * as policies from "../policy";
1010
import { requiredMessagingChannelPolicyPresets } from "./messaging-policy-presets";
1111
import { requiredOpenclawOtelPolicyPresets } from "./openclaw-otel-policy-presets";
12+
import { filterSuppressedAgentRequiredPresets } from "./policy-tier-suppression";
1213
import { cleanupTempDir, secureTempFile } from "./temp-files";
1314

1415
export type InitialSandboxPolicy = {
@@ -203,6 +204,7 @@ export function prepareInitialSandboxCreatePolicy(
203204
dockerGpuPatch?: boolean;
204205
additionalPresets?: string[];
205206
agentName?: string | null;
207+
policyTier?: string | null;
206208
} = {},
207209
): InitialSandboxPolicy {
208210
const directGpuPolicy = options.directGpu
@@ -214,13 +216,29 @@ export function prepareInitialSandboxCreatePolicy(
214216
const cleanupFns = directGpuPolicy?.cleanup ? [directGpuPolicy.cleanup] : [];
215217
const buildCleanup = () =>
216218
cleanupFns.length > 0 ? () => cleanupFns.map((cleanup) => cleanup()).every(Boolean) : undefined;
217-
const requestedCreateTimePresets = [
218-
...new Set([
219-
...requiredMessagingChannelPolicyPresets(activeMessagingChannels),
220-
...requiredOpenclawOtelPolicyPresets(options.agentName ?? "openclaw"),
221-
...(options.additionalPresets || []),
222-
]),
223-
];
219+
// Fail closed: the OpenClaw OTEL preset is added at create time only when the
220+
// selected policy tier is known and is not Restricted. When the tier is null
221+
// (interactive flow that selects later) the preset is deferred to the
222+
// post-boot policy step, so a later Restricted selection cannot leave a
223+
// transient host-local OTLP egress allowance during sandbox boot. The same
224+
// suppression filter still runs so an explicit `policyTier: "restricted"`
225+
// (non-interactive flow) drops openclaw-pricing from `additionalPresets`.
226+
const tierKnown = typeof options.policyTier === "string" && options.policyTier.length > 0;
227+
const otelCreateTimePresets =
228+
tierKnown && options.policyTier !== "restricted"
229+
? requiredOpenclawOtelPolicyPresets(options.agentName ?? "openclaw")
230+
: [];
231+
const requestedCreateTimePresets = filterSuppressedAgentRequiredPresets(
232+
[
233+
...new Set([
234+
...requiredMessagingChannelPolicyPresets(activeMessagingChannels),
235+
...otelCreateTimePresets,
236+
...(options.additionalPresets || []),
237+
]),
238+
],
239+
options.policyTier ?? null,
240+
options.agentName ?? null,
241+
);
224242
const dedupe = (values: string[]) => [...new Set(values.filter(Boolean))];
225243

226244
let basePolicy = fs.readFileSync(effectiveBasePolicyPath, "utf-8");
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
import { describe, expect, it, vi } from "vitest";
5+
6+
import { createSession } from "../../../state/onboard-session";
7+
import { handlePoliciesState } from "./policies";
8+
import {
9+
basePolicyHandlerOptions as baseOptions,
10+
createPolicyHandlerDeps as createDeps,
11+
makeMessagingPlan,
12+
} from "./policies-test-fixtures";
13+
14+
// Handler-level fallback for the runtime check the advisor calls out: the
15+
// narrowest live assertion (read the actual OpenShell-applied preset list
16+
// after restricted OpenClaw onboarding and confirm `openclaw-pricing` and
17+
// `openclaw-diagnostics-otel-local` are absent) lives in the nightly
18+
// `network-policy-vitest` scenario — that path requires real OpenShell plus
19+
// an `nvapi-` inference key and is intentionally not run on every PR push.
20+
// This contract test covers the handler-side reconciliation branch — that
21+
// restricted resume forces `setupPoliciesWithSelection` to run rather than
22+
// taking the resume-skip branch whenever
23+
// `policyResumeSelection.suppressedAgentRequiredPresetsLive` is true — so the
24+
// recorded-empty + live-suppressed-preset case cannot silently leave
25+
// third-party egress active on restricted sandboxes.
26+
// Removal condition: when the nightly live `network-policy-vitest` scenario
27+
// asserts the actual applied preset list on restricted OpenClaw onboarding
28+
// (both default and `NEMOCLAW_OPENCLAW_OTEL=1` cases), this handler-level
29+
// contract test stays as the cheap reconciliation regression and the live
30+
// scenario takes over as the source-of-truth runtime gate.
31+
describe("handlePoliciesState — restricted resume reconciliation", () => {
32+
it("forces setup reconciliation on restricted resume when suppressed presets are live", async () => {
33+
const session = createSession({ policyPresets: [] });
34+
const prepareResume = vi.fn((_sandboxName, _options) => ({
35+
policyPresets: [],
36+
recordedPolicyPresetsNeedReconcile: false,
37+
disabledMessagingPolicyPresetApplied: false,
38+
suppressedAgentRequiredPresetsLive: true,
39+
}));
40+
const { deps, calls, setSession } = createDeps({
41+
preparePolicyPresetResumeSelection: prepareResume,
42+
arePolicyPresetsApplied: vi.fn(() => true),
43+
getActiveSandbox: vi.fn(() => ({
44+
messaging: { plan: makeMessagingPlan("my-assistant", []) },
45+
policyTier: "restricted",
46+
})),
47+
});
48+
setSession(session);
49+
50+
await handlePoliciesState({ ...baseOptions(deps), resume: true });
51+
52+
expect(prepareResume).toHaveBeenCalledWith(
53+
"my-assistant",
54+
expect.objectContaining({ tierName: "restricted" }),
55+
);
56+
expect(calls.skipped).not.toHaveBeenCalled();
57+
expect(calls.recordSkip).not.toHaveBeenCalled();
58+
expect(calls.setupPolicies).toHaveBeenCalledWith(
59+
"my-assistant",
60+
expect.objectContaining({ selectedPresets: [] }),
61+
);
62+
});
63+
});
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
// SPDX-FileCopyrightText: Copyright (c) 2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
4+
import { vi } from "vitest";
5+
6+
import { createSession, type Session, type SessionUpdates } from "../../../state/onboard-session";
7+
import type { PoliciesStateOptions } from "./policies";
8+
9+
export type PolicyTestAgent = { name: string } | null;
10+
export type PolicyTestWebSearchConfig = { fetchEnabled: true };
11+
type MessagingPlan = NonNullable<Session["messagingPlan"]>;
12+
type MessagingChannelId = MessagingPlan["channels"][number]["channelId"];
13+
14+
export function makeMessagingPlan(
15+
sandboxName: string,
16+
channels: readonly MessagingChannelId[],
17+
disabledChannels: readonly MessagingChannelId[] = [],
18+
): MessagingPlan {
19+
const disabled = new Set(disabledChannels);
20+
return {
21+
schemaVersion: 1,
22+
sandboxName,
23+
agent: "openclaw",
24+
workflow: "onboard",
25+
channels: channels.map((channelId) => ({
26+
channelId,
27+
displayName: channelId,
28+
authMode: "token-paste",
29+
active: !disabled.has(channelId),
30+
selected: true,
31+
configured: true,
32+
disabled: disabled.has(channelId),
33+
inputs: [],
34+
hooks: [],
35+
})),
36+
disabledChannels,
37+
credentialBindings: [],
38+
networkPolicy: { presets: [], entries: [] },
39+
agentRender: [],
40+
buildSteps: [],
41+
stateUpdates: [],
42+
healthChecks: [],
43+
};
44+
}
45+
46+
export function createPolicyHandlerDeps(
47+
overrides: Partial<PoliciesStateOptions<PolicyTestAgent, PolicyTestWebSearchConfig>["deps"]> = {},
48+
) {
49+
let session = createSession();
50+
const calls = {
51+
load: vi.fn(() => session),
52+
activeSandbox: vi.fn(() => ({
53+
messaging: { plan: makeMessagingPlan("my-assistant", ["telegram"]) },
54+
})),
55+
mergeChannels: vi.fn(
56+
(selected: string[], recorded: string[], active: string[] | null | undefined) =>
57+
selected.length > 0 ? selected : (active ?? recorded),
58+
),
59+
smoke: vi.fn(),
60+
prepareResume: vi.fn(
61+
(
62+
_sandboxName: string,
63+
options: Parameters<
64+
PoliciesStateOptions<
65+
PolicyTestAgent,
66+
PolicyTestWebSearchConfig
67+
>["deps"]["preparePolicyPresetResumeSelection"]
68+
>[1],
69+
) => ({
70+
policyPresets: (options.recordedPolicyPresets ?? []).filter(
71+
(name) => name !== "unsupported",
72+
),
73+
recordedPolicyPresetsNeedReconcile: (options.recordedPolicyPresets ?? []).includes(
74+
"unsupported",
75+
),
76+
disabledMessagingPolicyPresetApplied: false,
77+
suppressedAgentRequiredPresetsLive: false,
78+
}),
79+
),
80+
appliedCheck: vi.fn(() => false),
81+
skipped: vi.fn(),
82+
recordSkip: vi.fn(async () => session),
83+
startStep: vi.fn(async () => undefined),
84+
setupPolicies: vi.fn(async () => ["npm"]),
85+
updateSession: vi.fn((mutator: (value: Session) => Session | void) => {
86+
session = mutator(session) ?? session;
87+
return session;
88+
}),
89+
complete: vi.fn(async () => session),
90+
persistPolicies: vi.fn((_sandboxName: string, _appliedPolicyPresets: string[]) => undefined),
91+
};
92+
return {
93+
calls,
94+
deps: {
95+
loadSession: calls.load,
96+
getActiveSandbox: calls.activeSandbox,
97+
mergePolicyMessagingChannels: calls.mergeChannels,
98+
verifyCompatibleEndpointSandboxSmoke: calls.smoke,
99+
preparePolicyPresetResumeSelection: calls.prepareResume,
100+
arePolicyPresetsApplied: calls.appliedCheck,
101+
skippedStepMessage: calls.skipped,
102+
recordStateSkipped: calls.recordSkip,
103+
startRecordedStep: calls.startStep,
104+
setupPoliciesWithSelection: calls.setupPolicies,
105+
updateSession: calls.updateSession,
106+
recordStepComplete: calls.complete,
107+
toSessionUpdates: (updates: Record<string, unknown>) => updates as SessionUpdates,
108+
persistAppliedPolicyPresets: calls.persistPolicies,
109+
...overrides,
110+
},
111+
setSession(next: Session) {
112+
session = next;
113+
},
114+
getSession: () => session,
115+
};
116+
}
117+
118+
export function basePolicyHandlerOptions(
119+
deps: PoliciesStateOptions<PolicyTestAgent, PolicyTestWebSearchConfig>["deps"],
120+
): PoliciesStateOptions<PolicyTestAgent, PolicyTestWebSearchConfig> {
121+
return {
122+
resume: false,
123+
sandboxName: "my-assistant",
124+
provider: "provider",
125+
model: "model",
126+
endpointUrl: "https://example.com/v1",
127+
credentialEnv: "NVIDIA_INFERENCE_API_KEY",
128+
selectedMessagingChannels: [],
129+
webSearchConfig: null,
130+
webSearchSupported: true,
131+
hermesToolGateways: [],
132+
agent: null,
133+
deps,
134+
};
135+
}

src/lib/onboard/machine/handlers/policies.test.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ function createDeps(overrides: Partial<PoliciesStateOptions<Agent, WebSearchConf
6767
"unsupported",
6868
),
6969
disabledMessagingPolicyPresetApplied: false,
70+
suppressedAgentRequiredPresetsLive: false,
7071
}),
7172
),
7273
appliedCheck: vi.fn(() => false),
@@ -234,6 +235,7 @@ describe("handlePoliciesState", () => {
234235
policyPresets: [...(options.recordedPolicyPresets ?? []), ...options.hermesToolGateways],
235236
recordedPolicyPresetsNeedReconcile: false,
236237
disabledMessagingPolicyPresetApplied: false,
238+
suppressedAgentRequiredPresetsLive: false,
237239
}));
238240
const { deps, calls, setSession } = createDeps({
239241
preparePolicyPresetResumeSelection: prepareResume,

0 commit comments

Comments
 (0)