@agentclientprotocol/codex-acp 2.5.1-preview.17 → 2.5.1-preview.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. package/README.md +2 -2
  2. package/dist/index.js +159 -55
  3. package/package.json +1 -1
package/README.md CHANGED
@@ -9,7 +9,7 @@ Use [OpenAI Codex](https://github.com/openai/codex) from [Agent Client Protocol]
9
9
  ## Features
10
10
 
11
11
  - ChatGPT, API key, and client-provided custom gateway authentication.
12
- - Model, reasoning effort, fast mode, approval, and sandbox mode configuration.
12
+ - Model, reasoning effort, fast mode, approval, sandbox mode, and configured [Codex permission profile](docs/permission-profiles.md) selection.
13
13
  - Concrete recommended model and reasoning-effort values through the opt-in [AIR recommended config values](docs/air-extensions.md#recommended-config-values) capability.
14
14
  - Text prompts, embedded context, images, resource links, and additional workspace directories.
15
15
  - Shell command, file change, [permission request](docs/air-extensions.md#permission-presentation), MCP tool call, terminal output, reasoning, plan, web search, image generation, image view, token usage, and review events.
@@ -73,7 +73,7 @@ The adapter advertises ACP auth methods during initialization. Clients can authe
73
73
  - `CODEX_CONFIG` - JSON object merged into the Codex session config.
74
74
  - `MODEL_PROVIDER` - model provider to pass to Codex for new sessions.
75
75
  - `DEFAULT_AUTH_REQUEST` - ACP auth request JSON used when Codex requires authentication.
76
- - `INITIAL_AGENT_MODE` - initial mode id: `read-only`, `workspace-write`, `agent`, or `agent-full-access`.
76
+ - `INITIAL_AGENT_MODE` - initial mode id: `read-only`, `workspace-write`, `agent`, `agent-full-access`, or `permission-profile:<profile-id>`.
77
77
  - `NO_BROWSER` - hide browser-based ChatGPT auth when set.
78
78
  - `APP_SERVER_LOGS` - directory for adapter logs.
79
79
 
package/dist/index.js CHANGED
@@ -41772,6 +41772,7 @@ var ModelId = class _ModelId {
41772
41772
 
41773
41773
  // src/AgentMode.ts
41774
41774
  var MODE_CONFIG_ID = "mode";
41775
+ var PERMISSION_PROFILE_MODE_PREFIX = "permission-profile:";
41775
41776
  var AgentMode = class _AgentMode {
41776
41777
  id;
41777
41778
  name;
@@ -41781,7 +41782,8 @@ var AgentMode = class _AgentMode {
41781
41782
  approvalsReviewer;
41782
41783
  sandboxPolicy;
41783
41784
  sandboxMode;
41784
- constructor(id, name, description, kind, approvalPolicy, approvalsReviewer, sandboxPolicy, sandboxMode) {
41785
+ permissionProfileId;
41786
+ constructor(id, name, description, kind, approvalPolicy, approvalsReviewer, sandboxPolicy, sandboxMode, permissionProfileId = null) {
41785
41787
  this.id = id;
41786
41788
  this.name = name;
41787
41789
  this.description = description;
@@ -41790,6 +41792,7 @@ var AgentMode = class _AgentMode {
41790
41792
  this.approvalsReviewer = approvalsReviewer;
41791
41793
  this.sandboxPolicy = sandboxPolicy;
41792
41794
  this.sandboxMode = sandboxMode;
41795
+ this.permissionProfileId = permissionProfileId;
41793
41796
  }
41794
41797
  static ReadOnly = new _AgentMode(
41795
41798
  "read-only",
@@ -41849,7 +41852,7 @@ var AgentMode = class _AgentMode {
41849
41852
  static DEFAULT_AGENT_MODE = _AgentMode.Agent;
41850
41853
  /** Only AIR gets the mode kind, in `_meta.jetbrains.air.kind`. */
41851
41854
  toSessionMode(airClient) {
41852
- const meta3 = airOnlyMeta(airClient, AIR_KIND_KEY, this.kind);
41855
+ const meta3 = this.kind === null ? void 0 : airOnlyMeta(airClient, AIR_KIND_KEY, this.kind);
41853
41856
  return {
41854
41857
  id: this.id,
41855
41858
  name: this.name,
@@ -41857,13 +41860,35 @@ var AgentMode = class _AgentMode {
41857
41860
  ...meta3 ? { _meta: meta3 } : {}
41858
41861
  };
41859
41862
  }
41860
- toSessionModeState(airClient) {
41863
+ toSessionModeState(airClient, availableModes = _AgentMode.all()) {
41861
41864
  return {
41862
- availableModes: _AgentMode.all().map((mode) => mode.toSessionMode(airClient)),
41865
+ availableModes: availableModes.map((mode) => mode.toSessionMode(airClient)),
41863
41866
  currentModeId: this.id
41864
41867
  };
41865
41868
  }
41866
- toConfigOption(airClient) {
41869
+ toConfigOption(airClient, availableModes = _AgentMode.all()) {
41870
+ const toOptions = (modes) => modes.map((mode) => {
41871
+ const meta3 = mode.kind === null ? void 0 : airOnlyMeta(airClient, AIR_KIND_KEY, mode.kind);
41872
+ return {
41873
+ value: mode.id,
41874
+ name: mode.name,
41875
+ description: mode.description,
41876
+ ...meta3 ? { _meta: meta3 } : {}
41877
+ };
41878
+ });
41879
+ const permissionProfileModes = availableModes.filter((mode) => mode.permissionProfileId !== null);
41880
+ const options = permissionProfileModes.length === 0 ? toOptions(availableModes) : [
41881
+ {
41882
+ group: "sandbox-modes",
41883
+ name: "Sandbox Modes",
41884
+ options: toOptions(availableModes.filter((mode) => mode.permissionProfileId === null))
41885
+ },
41886
+ {
41887
+ group: "permission-profiles",
41888
+ name: "Permission Profiles",
41889
+ options: toOptions(permissionProfileModes)
41890
+ }
41891
+ ];
41867
41892
  return {
41868
41893
  id: MODE_CONFIG_ID,
41869
41894
  name: "Mode",
@@ -41871,31 +41896,45 @@ var AgentMode = class _AgentMode {
41871
41896
  category: "mode",
41872
41897
  type: "select",
41873
41898
  currentValue: this.id,
41874
- options: _AgentMode.all().map((mode) => {
41875
- const meta3 = airOnlyMeta(airClient, AIR_KIND_KEY, mode.kind);
41876
- return {
41877
- value: mode.id,
41878
- name: mode.name,
41879
- description: mode.description,
41880
- ...meta3 ? { _meta: meta3 } : {}
41881
- };
41882
- })
41883
- };
41884
- }
41885
- static all() {
41886
- return [_AgentMode.ReadOnly, _AgentMode.WorkspaceWrite, _AgentMode.Agent, _AgentMode.AgentFullAccess];
41899
+ options
41900
+ };
41901
+ }
41902
+ static all(permissionProfiles = [], permissionProfileApprovalPolicy = "on-request", permissionProfileApprovalsReviewer = "user") {
41903
+ const profileModes = permissionProfiles.filter((profile) => profile.allowed && !profile.id.startsWith(":")).map((profile) => new _AgentMode(
41904
+ `${PERMISSION_PROFILE_MODE_PREFIX}${profile.id}`,
41905
+ profile.id,
41906
+ profile.description ?? `Use the ${profile.id} Codex permission profile.`,
41907
+ null,
41908
+ permissionProfileApprovalPolicy,
41909
+ permissionProfileApprovalsReviewer,
41910
+ null,
41911
+ null,
41912
+ profile.id
41913
+ ));
41914
+ return [
41915
+ _AgentMode.ReadOnly,
41916
+ _AgentMode.WorkspaceWrite,
41917
+ _AgentMode.Agent,
41918
+ _AgentMode.AgentFullAccess,
41919
+ ...profileModes
41920
+ ];
41887
41921
  }
41888
- static find(modeId) {
41889
- const match = _AgentMode.all().find((m) => m.id === modeId);
41922
+ static find(modeId, availableModes = _AgentMode.all()) {
41923
+ const match = availableModes.find((m) => m.id === modeId);
41890
41924
  return match ?? null;
41891
41925
  }
41892
- static getInitialAgentMode() {
41926
+ static getInitialAgentMode(availableModes = _AgentMode.all(), activePermissionProfileId = null) {
41893
41927
  const predefinedAgentMode = process.env["INITIAL_AGENT_MODE"];
41894
41928
  if (predefinedAgentMode) {
41895
- return _AgentMode.find(predefinedAgentMode) ?? _AgentMode.DEFAULT_AGENT_MODE;
41896
- } else {
41897
- return _AgentMode.DEFAULT_AGENT_MODE;
41929
+ return _AgentMode.find(predefinedAgentMode, availableModes) ?? _AgentMode.DEFAULT_AGENT_MODE;
41930
+ }
41931
+ if (activePermissionProfileId !== null) {
41932
+ const profileMode = availableModes.find((mode) => mode.permissionProfileId === activePermissionProfileId);
41933
+ if (profileMode) {
41934
+ return profileMode;
41935
+ }
41898
41936
  }
41937
+ return _AgentMode.DEFAULT_AGENT_MODE;
41899
41938
  }
41900
41939
  };
41901
41940
 
@@ -41909,7 +41948,7 @@ var package_default = {
41909
41948
  publishConfig: {
41910
41949
  access: "public"
41911
41950
  },
41912
- version: "2.5.1-preview.17",
41951
+ version: "2.5.1-preview.19",
41913
41952
  description: "",
41914
41953
  main: "dist/index.js",
41915
41954
  bin: {
@@ -42202,14 +42241,14 @@ import { createHash } from "node:crypto";
42202
42241
  async function forkSession(request, additionalDirectories, dependencies, instructions) {
42203
42242
  await dependencies.refreshSkills(request.cwd, additionalDirectories);
42204
42243
  const lastTurnId = await resolveForkTurnId(request, dependencies.codexClient);
42205
- const sessionConfig = await dependencies.createSessionConfig(
42244
+ const { config: config2, skippedMcpServers, defaultPermissionProfileId: _defaultPermissionProfileId, ...permissionProfileMetadata } = await dependencies.createSessionConfig(
42206
42245
  request.cwd,
42207
42246
  additionalDirectories,
42208
42247
  request.mcpServers ?? []
42209
42248
  );
42210
42249
  const response = await dependencies.codexClient.threadFork({
42211
42250
  excludeTurns: true,
42212
- config: sessionConfig.config,
42251
+ config: config2,
42213
42252
  cwd: request.cwd,
42214
42253
  ...lastTurnId !== void 0 && { lastTurnId },
42215
42254
  modelProvider: await dependencies.getResumeModelProvider(),
@@ -42232,7 +42271,9 @@ async function forkSession(request, additionalDirectories, dependencies, instruc
42232
42271
  modelProvider: response.modelProvider,
42233
42272
  currentServiceTier: response.serviceTier ?? null,
42234
42273
  additionalDirectories,
42235
- skippedMcpServers: sessionConfig.skippedMcpServers,
42274
+ skippedMcpServers,
42275
+ activePermissionProfileId: response.activePermissionProfile?.id ?? null,
42276
+ ...permissionProfileMetadata,
42236
42277
  ...instructions ? { instructions } : {}
42237
42278
  };
42238
42279
  }
@@ -42460,7 +42501,7 @@ function readModelIds(body) {
42460
42501
  return ids.length === data.length ? ids : null;
42461
42502
  }
42462
42503
  function normalizeModelId(id) {
42463
- return id.toLowerCase().replace(/-(\d{8}|\d{4}-\d{2}-\d{2})$/, "");
42504
+ return id.toLowerCase().replace(/^.*\//, "").replace(/-(\d{8}|\d{4}-\d{2}-\d{2})$/, "");
42464
42505
  }
42465
42506
  function isListedModel(model, listed) {
42466
42507
  return isListedModelId(model.model, listed) || isListedModelId(model.id, listed);
@@ -42942,6 +42983,7 @@ var CodexAcpClient = class _CodexAcpClient {
42942
42983
  modelProvider: response.modelProvider,
42943
42984
  reasoningEffort: response.reasoningEffort,
42944
42985
  serviceTier: response.serviceTier,
42986
+ activePermissionProfileId: response.activePermissionProfile?.id ?? null,
42945
42987
  itemsBackwardsCursor: response.itemsBackwardsCursor ?? null,
42946
42988
  materialized: true,
42947
42989
  collaborationMode: response.collaborationMode?.mode ?? null
@@ -42964,6 +43006,8 @@ var CodexAcpClient = class _CodexAcpClient {
42964
43006
  modelProvider: response.thread.modelProvider,
42965
43007
  reasoningEffort: response.thread.reasoningEffort,
42966
43008
  serviceTier: null,
43009
+ // thread/read omits permissions; callers restore the config default before the first prompt.
43010
+ activePermissionProfileId: null,
42967
43011
  // An unmaterialized thread has no persisted history to hydrate:
42968
43012
  // `thread/turns/list` rejects it outright ("not materialized
42969
43013
  // yet"), and there is nothing to list either way.
@@ -42977,10 +43021,10 @@ var CodexAcpClient = class _CodexAcpClient {
42977
43021
  const instructions = await this.resolveSessionInstructions(request, previousInstructions);
42978
43022
  const additionalDirectories = readAdditionalDirectories(request.cwd, request.additionalDirectories, request._meta);
42979
43023
  await this.refreshSkills(request.cwd, additionalDirectories);
42980
- const sessionConfig = await this.createSessionConfig(request.cwd, additionalDirectories, request.mcpServers ?? []);
43024
+ const { config: config2, skippedMcpServers, defaultPermissionProfileId, ...permissionProfileMetadata } = await this.createSessionConfig(request.cwd, additionalDirectories, request.mcpServers ?? []);
42981
43025
  const response = await this.resumeThreadWithInstructions({
42982
43026
  excludeTurns: true,
42983
- config: sessionConfig.config,
43027
+ config: config2,
42984
43028
  cwd: request.cwd,
42985
43029
  modelProvider: await this.getResumeModelProvider(),
42986
43030
  threadId: request.sessionId,
@@ -43000,8 +43044,10 @@ var CodexAcpClient = class _CodexAcpClient {
43000
43044
  modelProvider: response.modelProvider,
43001
43045
  currentServiceTier: response.serviceTier ?? null,
43002
43046
  additionalDirectories,
43003
- skippedMcpServers: sessionConfig.skippedMcpServers,
43004
- ...instructions ? { instructions } : {}
43047
+ skippedMcpServers,
43048
+ ...instructions ? { instructions } : {},
43049
+ activePermissionProfileId: response.materialized ? response.activePermissionProfileId : defaultPermissionProfileId ?? null,
43050
+ ...permissionProfileMetadata
43005
43051
  };
43006
43052
  }
43007
43053
  async forkSession(request, releaseFailedFork = (threadId) => this.closeSession(threadId), forkCreated = () => {
@@ -43024,10 +43070,10 @@ var CodexAcpClient = class _CodexAcpClient {
43024
43070
  const instructions = await this.resolveSessionInstructions(request, previousInstructions);
43025
43071
  const additionalDirectories = readAdditionalDirectories(request.cwd, request.additionalDirectories, request._meta);
43026
43072
  await this.refreshSkills(request.cwd, additionalDirectories);
43027
- const sessionConfig = await this.createSessionConfig(request.cwd, additionalDirectories, request.mcpServers ?? []);
43073
+ const { config: config2, skippedMcpServers, defaultPermissionProfileId, ...permissionProfileMetadata } = await this.createSessionConfig(request.cwd, additionalDirectories, request.mcpServers ?? []);
43028
43074
  const response = await this.resumeThreadWithInstructions({
43029
43075
  excludeTurns: true,
43030
- config: sessionConfig.config,
43076
+ config: config2,
43031
43077
  cwd: request.cwd,
43032
43078
  modelProvider: await this.getResumeModelProvider(),
43033
43079
  threadId: request.sessionId,
@@ -43066,8 +43112,10 @@ var CodexAcpClient = class _CodexAcpClient {
43066
43112
  thread,
43067
43113
  history,
43068
43114
  additionalDirectories,
43069
- skippedMcpServers: sessionConfig.skippedMcpServers,
43070
- ...instructions ? { instructions } : {}
43115
+ skippedMcpServers,
43116
+ ...instructions ? { instructions } : {},
43117
+ activePermissionProfileId: response.materialized ? response.activePermissionProfileId : defaultPermissionProfileId ?? null,
43118
+ ...permissionProfileMetadata
43071
43119
  };
43072
43120
  }
43073
43121
  /**
@@ -43121,9 +43169,9 @@ var CodexAcpClient = class _CodexAcpClient {
43121
43169
  const additionalDirectories = readAdditionalDirectories(request.cwd, request.additionalDirectories, request._meta);
43122
43170
  const developerInstructions = instructions?.developerInstructions;
43123
43171
  await this.refreshSkills(request.cwd, additionalDirectories);
43124
- const sessionConfig = await this.createSessionConfig(request.cwd, additionalDirectories, request.mcpServers ?? []);
43172
+ const { config: config2, skippedMcpServers, defaultPermissionProfileId: _defaultPermissionProfileId, ...permissionProfileMetadata } = await this.createSessionConfig(request.cwd, additionalDirectories, request.mcpServers ?? []);
43125
43173
  const response = await this.codexClient.threadStart({
43126
- config: sessionConfig.config,
43174
+ config: config2,
43127
43175
  modelProvider: this.getModelProvider(),
43128
43176
  cwd: request.cwd,
43129
43177
  ...developerInstructions !== void 0 && { developerInstructions }
@@ -43141,8 +43189,10 @@ var CodexAcpClient = class _CodexAcpClient {
43141
43189
  modelProvider: response.modelProvider,
43142
43190
  currentServiceTier: response.serviceTier ?? null,
43143
43191
  additionalDirectories,
43144
- skippedMcpServers: sessionConfig.skippedMcpServers,
43145
- ...instructions ? { instructions } : {}
43192
+ skippedMcpServers,
43193
+ ...instructions ? { instructions } : {},
43194
+ activePermissionProfileId: response.activePermissionProfile?.id ?? null,
43195
+ ...permissionProfileMetadata
43146
43196
  };
43147
43197
  }
43148
43198
  async resolveSessionInstructions(request, previous, creating = false) {
@@ -43344,13 +43394,22 @@ var CodexAcpClient = class _CodexAcpClient {
43344
43394
  }]))
43345
43395
  };
43346
43396
  const configWithWorkspaceRoots = mergeSandboxWorkspaceWriteRoots(mergedConfig, additionalDirectories);
43397
+ const permissionProfiles = await this.fetchPermissionProfiles(projectPath);
43398
+ const effectiveConfig = await this.codexClient.configRead({ includeLayers: true, cwd: projectPath });
43399
+ const defaultPermissionProfileId = effectiveConfig?.config?.["default_permissions"];
43400
+ const permissionProfileMetadata = {
43401
+ permissionProfiles,
43402
+ defaultPermissionProfileId: typeof defaultPermissionProfileId === "string" ? defaultPermissionProfileId : null,
43403
+ ...effectiveConfig?.config?.approval_policy != null && { approvalPolicy: effectiveConfig.config.approval_policy },
43404
+ ...effectiveConfig?.config?.approvals_reviewer != null && { approvalsReviewer: effectiveConfig.config.approvals_reviewer }
43405
+ };
43347
43406
  if (mcpServers.length === 0) {
43348
- return { config: configWithWorkspaceRoots, skippedMcpServers: [] };
43407
+ return { config: configWithWorkspaceRoots, skippedMcpServers: [], ...permissionProfileMetadata };
43349
43408
  }
43350
43409
  const requestedServers = normalizeMcpServers(mcpServers).map((server) => ({ name: server.name, server }));
43351
43410
  let serversToConfigure = requestedServers;
43352
43411
  if (shouldDeduplicateMcpConflicts()) {
43353
- const existingNames = await this.getConfigMcpServerNames(projectPath);
43412
+ const existingNames = this.getConfigMcpServerNames(effectiveConfig);
43354
43413
  serversToConfigure = requestedServers.filter((mcp) => !existingNames.has(mcp.name));
43355
43414
  }
43356
43415
  const skippedMcpServers = requestedServers.filter((mcp) => !serversToConfigure.includes(mcp)).map((mcp) => mcp.name);
@@ -43361,18 +43420,18 @@ var CodexAcpClient = class _CodexAcpClient {
43361
43420
  });
43362
43421
  }
43363
43422
  if (serversToConfigure.length === 0) {
43364
- return { config: configWithWorkspaceRoots, skippedMcpServers };
43423
+ return { config: configWithWorkspaceRoots, skippedMcpServers, ...permissionProfileMetadata };
43365
43424
  }
43366
43425
  return {
43367
43426
  config: {
43368
43427
  ...configWithWorkspaceRoots,
43369
43428
  "mcp_servers": Object.fromEntries(serversToConfigure.map((mcp) => [mcp.name, toCodexMcpServerConfig(mcp.server)]))
43370
43429
  },
43371
- skippedMcpServers
43430
+ skippedMcpServers,
43431
+ ...permissionProfileMetadata
43372
43432
  };
43373
43433
  }
43374
- async getConfigMcpServerNames(projectPath) {
43375
- const response = await this.codexClient.configRead({ includeLayers: true, cwd: projectPath });
43434
+ getConfigMcpServerNames(response) {
43376
43435
  const effectiveMcpServers = response?.config?.["mcp_servers"];
43377
43436
  const configLayers = response?.layers ?? [];
43378
43437
  const layerMcpServers = configLayers.map((layer) => {
@@ -43384,6 +43443,16 @@ var CodexAcpClient = class _CodexAcpClient {
43384
43443
  }
43385
43444
  return new Set(configuredMcpServers.flatMap((server) => Object.keys(server)));
43386
43445
  }
43446
+ async fetchPermissionProfiles(projectPath) {
43447
+ const profiles = [];
43448
+ let cursor = null;
43449
+ do {
43450
+ const response = await this.codexClient.listPermissionProfiles({ cwd: projectPath, cursor });
43451
+ profiles.push(...response?.data ?? []);
43452
+ cursor = response?.nextCursor ?? null;
43453
+ } while (cursor !== null);
43454
+ return profiles;
43455
+ }
43387
43456
  getModelProvider() {
43388
43457
  return this.gatewayConfig?.modelProvider ?? this.modelProvider;
43389
43458
  }
@@ -43496,12 +43565,16 @@ var CodexAcpClient = class _CodexAcpClient {
43496
43565
  if (shouldCancel?.()) {
43497
43566
  return null;
43498
43567
  }
43568
+ const permissionProfileId = agentMode.permissionProfileId;
43499
43569
  return await this.codexClient.runTurn({
43500
43570
  threadId: request.sessionId,
43501
43571
  input: input2,
43502
43572
  approvalPolicy: agentMode.approvalPolicy,
43503
43573
  approvalsReviewer: agentMode.approvalsReviewer,
43504
- sandboxPolicy: addAdditionalDirectoriesToSandboxPolicy(agentMode.sandboxPolicy, additionalDirectories),
43574
+ ...permissionProfileId ? {
43575
+ permissions: permissionProfileId,
43576
+ runtimeWorkspaceRoots: [cwd, ...additionalDirectories]
43577
+ } : { sandboxPolicy: addAdditionalDirectoriesToSandboxPolicy(agentMode.sandboxPolicy, additionalDirectories) },
43505
43578
  summary: disableSummary ? "none" : "auto",
43506
43579
  effort,
43507
43580
  model: modelId.model,
@@ -44894,6 +44967,9 @@ var CodexAppServerClient = class {
44894
44967
  async listModels(params) {
44895
44968
  return await this.sendRequest({ method: "model/list", params });
44896
44969
  }
44970
+ async listPermissionProfiles(params) {
44971
+ return await this.sendRequest({ method: "permissionProfile/list", params });
44972
+ }
44897
44973
  async skillsExtraRootsSet(params) {
44898
44974
  return await this.sendRequest({ method: "skills/extraRoots/set", params });
44899
44975
  }
@@ -47127,11 +47203,12 @@ var CodexCommands = class {
47127
47203
  sessionState.lastTokenUsage,
47128
47204
  sessionState.modelContextWindow
47129
47205
  );
47206
+ const permissionLine = agentMode.permissionProfileId ? `**Permission profile:** ${agentMode.permissionProfileId}` : `**Sandbox:** ${agentMode.sandboxMode}`;
47130
47207
  const lines = [
47131
47208
  `**Model:** ${sessionState.currentModelId}`,
47132
47209
  `**Directory:** ${sessionState.cwd}`,
47133
47210
  `**Approval:** ${agentMode.approvalPolicy}`,
47134
- `**Sandbox:** ${agentMode.sandboxMode}`,
47211
+ permissionLine,
47135
47212
  `**Account:** ${accountText}`,
47136
47213
  `**Session:** \`${sessionState.sessionId}\``,
47137
47214
  ``,
@@ -51468,13 +51545,22 @@ You have been logged out. Please try again.`);
51468
51545
  const currentModel = this.findCurrentModel(models, currentModelId);
51469
51546
  const currentModelSupportsFast = modelSupportsFast(currentModel);
51470
51547
  if (this.setupResponseOrdering && operation !== "resume") this.clientDelivery.beginSessionSetup(sessionId);
51548
+ const availableAgentModes = AgentMode.all(
51549
+ sessionMetadata.permissionProfiles,
51550
+ sessionMetadata.approvalPolicy,
51551
+ sessionMetadata.approvalsReviewer
51552
+ );
51471
51553
  const sessionState = {
51472
51554
  sessionId,
51473
51555
  currentModelId,
51474
51556
  availableModels: models,
51475
51557
  supportedReasoningEfforts: currentModel?.supportedReasoningEfforts ?? [],
51476
51558
  supportedInputModalities: currentModel?.inputModalities ?? ["text", "image"],
51477
- agentMode: AgentMode.getInitialAgentMode(),
51559
+ agentMode: AgentMode.getInitialAgentMode(
51560
+ availableAgentModes,
51561
+ sessionMetadata.activePermissionProfileId
51562
+ ),
51563
+ availableAgentModes,
51478
51564
  collaborationMode: sessionMetadata.collaborationMode,
51479
51565
  currentTurnId: null,
51480
51566
  interruptTurnId: null,
@@ -51550,7 +51636,10 @@ You have been logged out. Please try again.`);
51550
51636
  this.publishAsyncTasksAsync(sessionState, sessionGeneration);
51551
51637
  }
51552
51638
  const sessionModelState = this.createModelState(models, currentModelId);
51553
- const sessionModeState = sessionState.agentMode.toSessionModeState(sessionState.clientCapabilities.airClient);
51639
+ const sessionModeState = sessionState.agentMode.toSessionModeState(
51640
+ sessionState.clientCapabilities.airClient,
51641
+ sessionState.availableAgentModes
51642
+ );
51554
51643
  return [sessionId, sessionModelState, sessionModeState];
51555
51644
  }
51556
51645
  /**
@@ -52747,7 +52836,7 @@ You have been logged out. Please try again.`);
52747
52836
  return params.value;
52748
52837
  }
52749
52838
  applyModeChange(sessionState, value) {
52750
- const newMode = AgentMode.find(value);
52839
+ const newMode = AgentMode.find(value, sessionState.availableAgentModes);
52751
52840
  if (!newMode) {
52752
52841
  throw RequestError.invalidParams();
52753
52842
  }
@@ -53095,7 +53184,10 @@ You have been logged out. Please try again.`);
53095
53184
  const currentModel = this.findCurrentModel(sessionState.availableModels, sessionState.currentModelId);
53096
53185
  const recommendedModelId = useRecommendedValue ? sessionState.availableModels.find((model) => model.isDefault)?.id : void 0;
53097
53186
  const configOptions = [
53098
- sessionState.agentMode.toConfigOption(sessionState.clientCapabilities.airClient),
53187
+ sessionState.agentMode.toConfigOption(
53188
+ sessionState.clientCapabilities.airClient,
53189
+ sessionState.availableAgentModes
53190
+ ),
53099
53191
  createCollaborationModeConfigOption(sessionState.collaborationMode)
53100
53192
  ];
53101
53193
  if (sessionState.availableModels.length > 0) {
@@ -53305,13 +53397,22 @@ You have been logged out. Please try again.`);
53305
53397
  const sessionMcpServers = this.resolveSessionMcpServers(requestedMcpServers, true);
53306
53398
  const currentModel = this.findCurrentModel(models, currentModelId);
53307
53399
  const currentModelSupportsFast = modelSupportsFast(currentModel);
53400
+ const availableAgentModes = AgentMode.all(
53401
+ sessionMetadata.permissionProfiles,
53402
+ sessionMetadata.approvalPolicy,
53403
+ sessionMetadata.approvalsReviewer
53404
+ );
53308
53405
  const sessionState = {
53309
53406
  sessionId,
53310
53407
  currentModelId,
53311
53408
  availableModels: models,
53312
53409
  supportedReasoningEfforts: currentModel?.supportedReasoningEfforts ?? [],
53313
53410
  supportedInputModalities: currentModel?.inputModalities ?? ["text", "image"],
53314
- agentMode: AgentMode.getInitialAgentMode(),
53411
+ agentMode: AgentMode.getInitialAgentMode(
53412
+ availableAgentModes,
53413
+ sessionMetadata.activePermissionProfileId
53414
+ ),
53415
+ availableAgentModes,
53315
53416
  collaborationMode: sessionMetadata.collaborationMode,
53316
53417
  currentTurnId: null,
53317
53418
  interruptTurnId: null,
@@ -53370,7 +53471,10 @@ You have been logged out. Please try again.`);
53370
53471
  }
53371
53472
  await this.publishCurrentGoalBestEffort(sessionState, requestedSessionGeneration, true);
53372
53473
  const sessionModelState = this.createModelState(models, currentModelId);
53373
- const sessionModeState = sessionState.agentMode.toSessionModeState(sessionState.clientCapabilities.airClient);
53474
+ const sessionModeState = sessionState.agentMode.toSessionModeState(
53475
+ sessionState.clientCapabilities.airClient,
53476
+ sessionState.availableAgentModes
53477
+ );
53374
53478
  return {
53375
53479
  sessionId,
53376
53480
  modelState: sessionModelState,
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publishConfig": {
4
4
  "access": "public"
5
5
  },
6
- "version": "2.5.1-preview.17",
6
+ "version": "2.5.1-preview.19",
7
7
  "description": "",
8
8
  "main": "dist/index.js",
9
9
  "bin": {