Skip to content

Commit 60dac9d

Browse files
feat: add granular per-session flags for multitenancy hardening (#1474)
* feat: add granular per-session flags for multitenancy hardening Add 7 new optional fields to SessionConfigBase across all 6 SDK languages (Node.js, Go, Python, .NET, Rust, Java): - skipEmbeddingRetrieval: prevent cross-session info leakage via embedding cache - organizationCustomInstructions: inject org-level instructions into system prompt - enableOnDemandInstructionDiscovery: control instruction file discovery after file views - enableFileHooks: control loading of file-based hooks from .github/hooks/ - enableHostGitOperations: control git operations on host filesystem - enableSessionStore: control cross-session store for search/retrieval - enableSkills: control skill loading (builtin + discovered) All fields are optional and pass through to the runtime without SDK-side default coercion. Empty mode applies restrictive defaults for multitenancy. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * address PR review feedback - Go: change OrganizationCustomInstructions to *string for cross-SDK consistency - Go: clarify *bool field docs (nil = runtime default, non-nil = forwarded) - Rust: redact organization_custom_instructions in Debug impls - Node.js: clarify JSDoc defaults apply only in empty mode - Python: replace unused imports with parametrized tests Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: add embeddingCacheStorage per-session option across all SDKs Adds embeddingCacheStorage field ("persistent" | "in-memory") to session create and resume across all 6 SDKs. In empty mode, defaults to "in-memory" for multitenant isolation. Companion to runtime PR #8388. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: apply formatting, convert EmbeddingCacheStorage to enum in .NET, improve tests - Run formatters across all SDKs (prettier, gofmt, ruff, cargo fmt, spotless, dotnet format) - Convert EmbeddingCacheStorage from string to EmbeddingCacheStorageMode enum in .NET - Rename test methods to avoid temporal wording - Expand EnableFileHooks doc comment in Go ResumeSessionConfig - Add embeddingCacheStorage test coverage in Go, Java Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * docs: remove runtime implementation details from property docs Simplify doc comments across all SDKs to focus on user-facing behavior rather than SDK-to-runtime interaction details. Removes boilerplate like 'When nil, the runtime default is used. When non-nil, the value is passed through to the runtime.' in favor of concise, behavior-focused docs that match the existing style of other properties. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * test: rename Java test methods to remove temporal 'new' wording Rename to use 'granularMultitenancyFields' instead of 'newSessionFields' for consistency with .NET and Node.js test naming. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: resolve Python SDK test failures Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: add missing Java empty-mode defaults for granular flags The Cross-SDK Consistency Review identified that Java was only applying embeddingCacheStorage and mcpOAuthTokenStorage in empty mode, but missing the 6 boolean flags (skipEmbeddingRetrieval, enableOnDemandInstructionDiscovery, enableFileHooks, enableHostGitOperations, enableSessionStore, enableSkills). Also adds embeddingCacheStorage assertion to Node.js empty-mode test for coverage parity with Go and .NET. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix(rust): add embedding_cache_storage to Debug impls and builder API Add the missing embedding_cache_storage field to: - SessionConfig custom Debug impl - ResumeSessionConfig custom Debug impl - SessionConfig fluent builder (with_embedding_cache_storage) - ResumeSessionConfig fluent builder (with_embedding_cache_storage) Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * fix: .NET empty-mode tests and Java enableConfigDiscovery docs - Add BaseDirectory and AvailableTools to .NET empty-mode default tests so they don't throw at client construction time - Fix enableConfigDiscovery Javadoc in ResumeSessionConfig: use Optional.empty() instead of null in @return, remove null from @param (setter takes primitive boolean) - Fix stale 'runtime default' wording in SessionConfig.java getter Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent d2b9788 commit 60dac9d

25 files changed

Lines changed: 2447 additions & 139 deletions

dotnet/src/Client.cs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -637,6 +637,13 @@ private void ApplyConfigDefaultsForMode(SessionConfigBase config)
637637
if (_options.Mode == CopilotClientMode.Empty)
638638
{
639639
config.EnableSessionTelemetry ??= false;
640+
config.SkipEmbeddingRetrieval ??= true;
641+
config.EmbeddingCacheStorage ??= EmbeddingCacheStorageMode.InMemory;
642+
config.EnableOnDemandInstructionDiscovery ??= false;
643+
config.EnableFileHooks ??= false;
644+
config.EnableHostGitOperations ??= false;
645+
config.EnableSessionStore ??= false;
646+
config.EnableSkills ??= false;
640647
config.McpOAuthTokenStorage ??= McpOAuthTokenStorageMode.InMemory;
641648
}
642649
}
@@ -876,6 +883,14 @@ public async Task<CopilotSession> CreateSessionAsync(SessionConfig config, Cance
876883
config.Agent,
877884
config.ConfigDirectory,
878885
config.EnableConfigDiscovery,
886+
config.SkipEmbeddingRetrieval,
887+
config.EmbeddingCacheStorage,
888+
config.OrganizationCustomInstructions,
889+
config.EnableOnDemandInstructionDiscovery,
890+
config.EnableFileHooks,
891+
config.EnableHostGitOperations,
892+
config.EnableSessionStore,
893+
config.EnableSkills,
879894
config.SkillDirectories,
880895
config.DisabledSkills,
881896
config.InfiniteSessions,
@@ -1053,6 +1068,14 @@ public async Task<CopilotSession> ResumeSessionAsync(string sessionId, ResumeSes
10531068
config.WorkingDirectory,
10541069
config.ConfigDirectory,
10551070
config.EnableConfigDiscovery,
1071+
config.SkipEmbeddingRetrieval,
1072+
config.EmbeddingCacheStorage,
1073+
config.OrganizationCustomInstructions,
1074+
config.EnableOnDemandInstructionDiscovery,
1075+
config.EnableFileHooks,
1076+
config.EnableHostGitOperations,
1077+
config.EnableSessionStore,
1078+
config.EnableSkills,
10561079
config.SuppressResumeEvent is true ? true : null,
10571080
config.Streaming is true ? true : null,
10581081
config.IncludeSubAgentStreamingEvents,
@@ -2179,6 +2202,14 @@ internal record CreateSessionRequest(
21792202
string? Agent,
21802203
[property: JsonPropertyName("configDir")] string? ConfigDirectory,
21812204
bool? EnableConfigDiscovery,
2205+
bool? SkipEmbeddingRetrieval,
2206+
EmbeddingCacheStorageMode? EmbeddingCacheStorage,
2207+
string? OrganizationCustomInstructions,
2208+
bool? EnableOnDemandInstructionDiscovery,
2209+
bool? EnableFileHooks,
2210+
bool? EnableHostGitOperations,
2211+
bool? EnableSessionStore,
2212+
bool? EnableSkills,
21822213
IList<string>? SkillDirectories,
21832214
IList<string>? DisabledSkills,
21842215
InfiniteSessionConfig? InfiniteSessions,
@@ -2247,6 +2278,14 @@ internal record ResumeSessionRequest(
22472278
string? WorkingDirectory,
22482279
[property: JsonPropertyName("configDir")] string? ConfigDirectory,
22492280
bool? EnableConfigDiscovery,
2281+
bool? SkipEmbeddingRetrieval,
2282+
EmbeddingCacheStorageMode? EmbeddingCacheStorage,
2283+
string? OrganizationCustomInstructions,
2284+
bool? EnableOnDemandInstructionDiscovery,
2285+
bool? EnableFileHooks,
2286+
bool? EnableHostGitOperations,
2287+
bool? EnableSessionStore,
2288+
bool? EnableSkills,
22502289
bool? SuppressResumeEvent,
22512290
bool? Streaming,
22522291
bool? IncludeSubAgentStreamingEvents,
@@ -2349,6 +2388,7 @@ internal record HooksInvokeResponse(
23492388
[JsonSerializable(typeof(GetSessionMetadataRequest))]
23502389
[JsonSerializable(typeof(GetSessionMetadataResponse))]
23512390
[JsonSerializable(typeof(McpOAuthTokenStorageMode))]
2391+
[JsonSerializable(typeof(EmbeddingCacheStorageMode))]
23522392
[JsonSerializable(typeof(ModelCapabilitiesOverride))]
23532393
[JsonSerializable(typeof(ProviderConfig))]
23542394
[JsonSerializable(typeof(ResumeSessionRequest))]

dotnet/src/Types.cs

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2096,6 +2096,21 @@ public enum McpOAuthTokenStorageMode
20962096
InMemory
20972097
}
20982098

2099+
/// <summary>
2100+
/// Controls how the embedding cache is stored for a session.
2101+
/// </summary>
2102+
[JsonConverter(typeof(JsonStringEnumConverter<EmbeddingCacheStorageMode>))]
2103+
public enum EmbeddingCacheStorageMode
2104+
{
2105+
/// <summary>Embeddings are cached on disk, shared across sessions and restarts.</summary>
2106+
[JsonStringEnumMemberName("persistent")]
2107+
Persistent,
2108+
2109+
/// <summary>Embeddings are cached in memory only and discarded when the session ends.</summary>
2110+
[JsonStringEnumMemberName("in-memory")]
2111+
InMemory
2112+
}
2113+
20992114
/// <summary>
21002115
/// Abstract base class for MCP server configurations.
21012116
/// </summary>
@@ -2402,6 +2417,14 @@ protected SessionConfigBase(SessionConfigBase? other)
24022417
Agent = other.Agent;
24032418
DisabledSkills = other.DisabledSkills is not null ? [.. other.DisabledSkills] : null;
24042419
EnableConfigDiscovery = other.EnableConfigDiscovery;
2420+
SkipEmbeddingRetrieval = other.SkipEmbeddingRetrieval;
2421+
EmbeddingCacheStorage = other.EmbeddingCacheStorage;
2422+
OrganizationCustomInstructions = other.OrganizationCustomInstructions;
2423+
EnableOnDemandInstructionDiscovery = other.EnableOnDemandInstructionDiscovery;
2424+
EnableFileHooks = other.EnableFileHooks;
2425+
EnableHostGitOperations = other.EnableHostGitOperations;
2426+
EnableSessionStore = other.EnableSessionStore;
2427+
EnableSkills = other.EnableSkills;
24052428
EnableMcpApps = other.EnableMcpApps;
24062429
ExcludedTools = other.ExcludedTools is not null ? [.. other.ExcludedTools] : null;
24072430
Hooks = other.Hooks;
@@ -2492,6 +2515,63 @@ protected SessionConfigBase(SessionConfigBase? other)
24922515
/// </summary>
24932516
public bool? EnableConfigDiscovery { get; set; }
24942517

2518+
/// <summary>
2519+
/// When <see langword="true"/>, skips embedding-based retrieval for this session.
2520+
/// Use in multitenant deployments to prevent cross-session information leakage
2521+
/// through the shared embedding cache.
2522+
/// </summary>
2523+
public bool? SkipEmbeddingRetrieval { get; set; }
2524+
2525+
/// <summary>
2526+
/// Controls how the embedding cache is stored for this session.
2527+
/// <see cref="EmbeddingCacheStorageMode.Persistent"/>: Embeddings are cached on disk and shared across sessions/restarts.
2528+
/// <see cref="EmbeddingCacheStorageMode.InMemory"/>: Embeddings are cached in memory only and discarded when the session ends.
2529+
/// </summary>
2530+
public EmbeddingCacheStorageMode? EmbeddingCacheStorage { get; set; }
2531+
2532+
/// <summary>
2533+
/// Organization-level custom instructions to include in the system prompt.
2534+
/// Allows hosts to inject organization-specific guidance without relying on
2535+
/// filesystem-based instruction discovery.
2536+
/// </summary>
2537+
public string? OrganizationCustomInstructions { get; set; }
2538+
2539+
/// <summary>
2540+
/// When <see langword="true"/>, enables on-demand discovery of instruction files
2541+
/// (for example <c>AGENTS.md</c> and <c>.github/copilot-instructions.md</c>)
2542+
/// after successful file views.
2543+
/// </summary>
2544+
public bool? EnableOnDemandInstructionDiscovery { get; set; }
2545+
2546+
/// <summary>
2547+
/// When <see langword="true"/>, enables loading of file-based hooks from
2548+
/// <c>.github/hooks/</c>. This is separate from <see cref="Hooks"/>, which
2549+
/// controls SDK hook callback registration.
2550+
/// </summary>
2551+
public bool? EnableFileHooks { get; set; }
2552+
2553+
/// <summary>
2554+
/// When <see langword="true"/>, enables git operations on the host filesystem
2555+
/// such as branch detection, file status, and commit history. When
2556+
/// <see langword="false"/>, no git context is surfaced in the system prompt.
2557+
/// </summary>
2558+
public bool? EnableHostGitOperations { get; set; }
2559+
2560+
/// <summary>
2561+
/// When <see langword="true"/>, enables the cross-session store for search and
2562+
/// retrieval across sessions. When <see langword="false"/>, session content is
2563+
/// not written to or read from the shared session store.
2564+
/// </summary>
2565+
public bool? EnableSessionStore { get; set; }
2566+
2567+
/// <summary>
2568+
/// When <see langword="true"/>, enables skill loading, including built-in
2569+
/// skills and discovered skill directories. When <see langword="false"/>, no
2570+
/// skills are loaded regardless of <see cref="SkillDirectories"/> or
2571+
/// <see cref="EnableConfigDiscovery"/>.
2572+
/// </summary>
2573+
public bool? EnableSkills { get; set; }
2574+
24952575
/// <summary>
24962576
/// Custom tool declarations available to the language model during the session.
24972577
/// Declarations backed by an <see cref="AIFunction"/> are invoked automatically; declarations without one

dotnet/test/E2E/ClientOptionsE2ETests.cs

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,82 @@ public async Task Should_Omit_EnableSessionTelemetry_When_Not_Set()
177177
await session.DisposeAsync();
178178
}
179179

180+
[Fact]
181+
public async Task Should_Forward_Granular_Multitenancy_Fields_In_Create_Wire_Request()
182+
{
183+
var (cliPath, capturePath) = await CreateFakeCliCaptureAsync();
184+
185+
await using var client = Ctx.CreateClient(options: new CopilotClientOptions
186+
{
187+
Connection = RuntimeConnection.ForStdio(path: cliPath, args: ["--capture-file", capturePath]),
188+
UseLoggedInUser = false,
189+
});
190+
191+
await client.StartAsync();
192+
193+
var session = await client.CreateSessionAsync(new SessionConfig
194+
{
195+
SkipEmbeddingRetrieval = false,
196+
OrganizationCustomInstructions = "Follow org policy.",
197+
EnableOnDemandInstructionDiscovery = true,
198+
EmbeddingCacheStorage = EmbeddingCacheStorageMode.Persistent,
199+
EnableFileHooks = true,
200+
EnableHostGitOperations = false,
201+
EnableSessionStore = true,
202+
EnableSkills = false,
203+
OnPermissionRequest = PermissionHandler.ApproveAll,
204+
});
205+
206+
using var capture = JsonDocument.Parse(await File.ReadAllTextAsync(capturePath));
207+
var createRequest = GetCapturedRequestParams(capture.RootElement, "session.create");
208+
Assert.False(createRequest.GetProperty("skipEmbeddingRetrieval").GetBoolean());
209+
Assert.Equal("Follow org policy.", createRequest.GetProperty("organizationCustomInstructions").GetString());
210+
Assert.True(createRequest.GetProperty("enableOnDemandInstructionDiscovery").GetBoolean());
211+
Assert.Equal("persistent", createRequest.GetProperty("embeddingCacheStorage").GetString());
212+
Assert.True(createRequest.GetProperty("enableFileHooks").GetBoolean());
213+
Assert.False(createRequest.GetProperty("enableHostGitOperations").GetBoolean());
214+
Assert.True(createRequest.GetProperty("enableSessionStore").GetBoolean());
215+
Assert.False(createRequest.GetProperty("enableSkills").GetBoolean());
216+
217+
await session.DisposeAsync();
218+
}
219+
220+
[Fact]
221+
public async Task Should_Apply_Empty_Mode_Defaults_To_CreateSession_Wire_Request()
222+
{
223+
var (cliPath, capturePath) = await CreateFakeCliCaptureAsync();
224+
225+
await using var client = Ctx.CreateClient(options: new CopilotClientOptions
226+
{
227+
Connection = RuntimeConnection.ForStdio(path: cliPath, args: ["--capture-file", capturePath]),
228+
Mode = CopilotClientMode.Empty,
229+
BaseDirectory = Ctx.WorkDir,
230+
UseLoggedInUser = false,
231+
});
232+
233+
await client.StartAsync();
234+
235+
var session = await client.CreateSessionAsync(new SessionConfig
236+
{
237+
OnPermissionRequest = PermissionHandler.ApproveAll,
238+
AvailableTools = new ToolSet().AddBuiltIn(BuiltInTools.Isolated),
239+
});
240+
241+
using var capture = JsonDocument.Parse(await File.ReadAllTextAsync(capturePath));
242+
var createRequest = GetCapturedRequestParams(capture.RootElement, "session.create");
243+
Assert.False(createRequest.GetProperty("enableSessionTelemetry").GetBoolean());
244+
Assert.True(createRequest.GetProperty("skipEmbeddingRetrieval").GetBoolean());
245+
Assert.False(createRequest.GetProperty("enableOnDemandInstructionDiscovery").GetBoolean());
246+
Assert.Equal("in-memory", createRequest.GetProperty("embeddingCacheStorage").GetString());
247+
Assert.False(createRequest.GetProperty("enableFileHooks").GetBoolean());
248+
Assert.False(createRequest.GetProperty("enableHostGitOperations").GetBoolean());
249+
Assert.False(createRequest.GetProperty("enableSessionStore").GetBoolean());
250+
Assert.False(createRequest.GetProperty("enableSkills").GetBoolean());
251+
Assert.False(createRequest.TryGetProperty("organizationCustomInstructions", out _));
252+
253+
await session.DisposeAsync();
254+
}
255+
180256
[Fact]
181257
public async Task Should_Propagate_Activity_TraceContext_To_Session_Create_And_Send()
182258
{
@@ -293,6 +369,82 @@ public async Task Should_Propagate_Activity_TraceContext_To_Session_Resume()
293369
await session.DisposeAsync();
294370
}
295371

372+
[Fact]
373+
public async Task Should_Forward_Granular_Multitenancy_Fields_In_Resume_Wire_Request()
374+
{
375+
var (cliPath, capturePath) = await CreateFakeCliCaptureAsync();
376+
377+
await using var client = Ctx.CreateClient(options: new CopilotClientOptions
378+
{
379+
Connection = RuntimeConnection.ForStdio(path: cliPath, args: ["--capture-file", capturePath]),
380+
UseLoggedInUser = false,
381+
});
382+
383+
await client.StartAsync();
384+
385+
var session = await client.ResumeSessionAsync("resume-session", new ResumeSessionConfig
386+
{
387+
SkipEmbeddingRetrieval = false,
388+
OrganizationCustomInstructions = "Resume org policy.",
389+
EnableOnDemandInstructionDiscovery = true,
390+
EmbeddingCacheStorage = EmbeddingCacheStorageMode.Persistent,
391+
EnableFileHooks = true,
392+
EnableHostGitOperations = false,
393+
EnableSessionStore = true,
394+
EnableSkills = false,
395+
OnPermissionRequest = PermissionHandler.ApproveAll,
396+
});
397+
398+
using var capture = JsonDocument.Parse(await File.ReadAllTextAsync(capturePath));
399+
var resumeRequest = GetCapturedRequestParams(capture.RootElement, "session.resume");
400+
Assert.False(resumeRequest.GetProperty("skipEmbeddingRetrieval").GetBoolean());
401+
Assert.Equal("Resume org policy.", resumeRequest.GetProperty("organizationCustomInstructions").GetString());
402+
Assert.True(resumeRequest.GetProperty("enableOnDemandInstructionDiscovery").GetBoolean());
403+
Assert.Equal("persistent", resumeRequest.GetProperty("embeddingCacheStorage").GetString());
404+
Assert.True(resumeRequest.GetProperty("enableFileHooks").GetBoolean());
405+
Assert.False(resumeRequest.GetProperty("enableHostGitOperations").GetBoolean());
406+
Assert.True(resumeRequest.GetProperty("enableSessionStore").GetBoolean());
407+
Assert.False(resumeRequest.GetProperty("enableSkills").GetBoolean());
408+
409+
await session.DisposeAsync();
410+
}
411+
412+
[Fact]
413+
public async Task Should_Apply_Empty_Mode_Defaults_To_ResumeSession_Wire_Request()
414+
{
415+
var (cliPath, capturePath) = await CreateFakeCliCaptureAsync();
416+
417+
await using var client = Ctx.CreateClient(options: new CopilotClientOptions
418+
{
419+
Connection = RuntimeConnection.ForStdio(path: cliPath, args: ["--capture-file", capturePath]),
420+
Mode = CopilotClientMode.Empty,
421+
BaseDirectory = Ctx.WorkDir,
422+
UseLoggedInUser = false,
423+
});
424+
425+
await client.StartAsync();
426+
427+
var session = await client.ResumeSessionAsync("resume-empty-session", new ResumeSessionConfig
428+
{
429+
OnPermissionRequest = PermissionHandler.ApproveAll,
430+
AvailableTools = new ToolSet().AddBuiltIn(BuiltInTools.Isolated),
431+
});
432+
433+
using var capture = JsonDocument.Parse(await File.ReadAllTextAsync(capturePath));
434+
var resumeRequest = GetCapturedRequestParams(capture.RootElement, "session.resume");
435+
Assert.False(resumeRequest.GetProperty("enableSessionTelemetry").GetBoolean());
436+
Assert.True(resumeRequest.GetProperty("skipEmbeddingRetrieval").GetBoolean());
437+
Assert.False(resumeRequest.GetProperty("enableOnDemandInstructionDiscovery").GetBoolean());
438+
Assert.Equal("in-memory", resumeRequest.GetProperty("embeddingCacheStorage").GetString());
439+
Assert.False(resumeRequest.GetProperty("enableFileHooks").GetBoolean());
440+
Assert.False(resumeRequest.GetProperty("enableHostGitOperations").GetBoolean());
441+
Assert.False(resumeRequest.GetProperty("enableSessionStore").GetBoolean());
442+
Assert.False(resumeRequest.GetProperty("enableSkills").GetBoolean());
443+
Assert.False(resumeRequest.TryGetProperty("organizationCustomInstructions", out _));
444+
445+
await session.DisposeAsync();
446+
}
447+
296448
[Fact]
297449
public void Should_Accept_GitHubToken_Option()
298450
{

go/client.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,14 @@ func (c *Client) CreateSession(ctx context.Context, config *SessionConfig) (*Ses
609609
if config.EnableConfigDiscovery {
610610
req.EnableConfigDiscovery = Bool(true)
611611
}
612+
req.SkipEmbeddingRetrieval = config.SkipEmbeddingRetrieval
613+
req.EmbeddingCacheStorage = config.EmbeddingCacheStorage
614+
req.OrganizationCustomInstructions = config.OrganizationCustomInstructions
615+
req.EnableOnDemandInstructionDiscovery = config.EnableOnDemandInstructionDiscovery
616+
req.EnableFileHooks = config.EnableFileHooks
617+
req.EnableHostGitOperations = config.EnableHostGitOperations
618+
req.EnableSessionStore = config.EnableSessionStore
619+
req.EnableSkills = config.EnableSkills
612620
req.Tools = config.Tools
613621
systemMessage := c.systemMessageForMode(config.SystemMessage)
614622
wireSystemMessage, transformCallbacks := extractTransformCallbacks(systemMessage)
@@ -952,6 +960,14 @@ func (c *Client) ResumeSessionWithOptions(ctx context.Context, sessionID string,
952960
if config.EnableConfigDiscovery {
953961
req.EnableConfigDiscovery = Bool(true)
954962
}
963+
req.SkipEmbeddingRetrieval = config.SkipEmbeddingRetrieval
964+
req.EmbeddingCacheStorage = config.EmbeddingCacheStorage
965+
req.OrganizationCustomInstructions = config.OrganizationCustomInstructions
966+
req.EnableOnDemandInstructionDiscovery = config.EnableOnDemandInstructionDiscovery
967+
req.EnableFileHooks = config.EnableFileHooks
968+
req.EnableHostGitOperations = config.EnableHostGitOperations
969+
req.EnableSessionStore = config.EnableSessionStore
970+
req.EnableSkills = config.EnableSkills
955971
if config.SuppressResumeEvent {
956972
req.DisableResume = Bool(true)
957973
}

0 commit comments

Comments
 (0)