@ycodium-ai/agent-claude 0.2.3106 → 0.2.3108

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 (2) hide show
  1. package/dist/index.js +60 -29
  2. package/package.json +4 -4
package/dist/index.js CHANGED
@@ -22770,6 +22770,39 @@ function assertSteeringTarget(expectedTurnId, turnState) {
22770
22770
  throw rejected;
22771
22771
  }
22772
22772
 
22773
+ // src/hostMcpAllowRules.ts
22774
+ function claudeHostMcpAllowRules(servers) {
22775
+ return (servers ?? []).filter((server) => server.hostOwned === true).map((server) => `mcp__${server.name}`);
22776
+ }
22777
+ function claudePermissionAllow(rules, mode) {
22778
+ return mode === "auto" ? [...rules.read, ...rules.hostMcp] : rules.read;
22779
+ }
22780
+
22781
+ // src/adapter/permissionMode.ts
22782
+ var sameRules = (a, b3) => a.join("\n") === b3.join("\n");
22783
+ var permissionAllowInSync = (context) => sameRules(
22784
+ claudePermissionAllow(context.permissionRules, context.currentPermissionMode),
22785
+ context.currentPermissionAllow
22786
+ );
22787
+ async function applyClaudePermissionMode(context, mode, failAs) {
22788
+ try {
22789
+ await context.query.setPermissionMode(mode);
22790
+ } catch (cause) {
22791
+ throw toRequestError(failAs.threadId, failAs.method, cause);
22792
+ }
22793
+ context.currentPermissionMode = mode;
22794
+ const allow = claudePermissionAllow(context.permissionRules, mode);
22795
+ if (sameRules(allow, context.currentPermissionAllow)) return;
22796
+ try {
22797
+ await context.query.applyFlagSettings({
22798
+ permissions: allow.length > 0 ? { allow: [...allow] } : null
22799
+ });
22800
+ } catch (cause) {
22801
+ throw toRequestError(failAs.threadId, "session/applyFlagSettings", cause);
22802
+ }
22803
+ context.currentPermissionAllow = allow;
22804
+ }
22805
+
22773
22806
  // src/adapter/sendTurn.ts
22774
22807
  var makeSendTurn = (deps) => {
22775
22808
  const {
@@ -22824,19 +22857,15 @@ var makeSendTurn = (deps) => {
22824
22857
  context.currentEffort = getEffectiveClaudeAgentEffort(turnEffort ?? null) ?? void 0;
22825
22858
  }
22826
22859
  if (input.interactionMode === "plan") {
22827
- try {
22828
- await context.query.setPermissionMode("plan");
22829
- } catch (cause) {
22830
- throw toRequestError(input.threadId, "turn/setPermissionMode", cause);
22831
- }
22832
- context.currentPermissionMode = "plan";
22860
+ await applyClaudePermissionMode(context, "plan", {
22861
+ threadId: input.threadId,
22862
+ method: "turn/setPermissionMode"
22863
+ });
22833
22864
  } else if (input.interactionMode === "default") {
22834
- try {
22835
- await context.query.setPermissionMode(context.basePermissionMode ?? "default");
22836
- } catch (cause) {
22837
- throw toRequestError(input.threadId, "turn/setPermissionMode", cause);
22838
- }
22839
- context.currentPermissionMode = context.basePermissionMode;
22865
+ await applyClaudePermissionMode(context, context.basePermissionMode ?? "default", {
22866
+ threadId: input.threadId,
22867
+ method: "turn/setPermissionMode"
22868
+ });
22840
22869
  }
22841
22870
  const turnCapsForPrompt = claudeModelCapabilities(
22842
22871
  modelSelection?.model,
@@ -23377,7 +23406,7 @@ var makeSessionControls = (deps) => {
23377
23406
  };
23378
23407
  const setRuntimeMode = async (threadId, runtimeMode) => {
23379
23408
  const context = requireSession(threadId);
23380
- if (context.session.runtimeMode === runtimeMode) {
23409
+ if (context.session.runtimeMode === runtimeMode && permissionAllowInSync(context)) {
23381
23410
  return;
23382
23411
  }
23383
23412
  const permissionMode = claudePermissionModeFor(runtimeMode);
@@ -23389,12 +23418,10 @@ var makeSessionControls = (deps) => {
23389
23418
  updatedAt: nowIso()
23390
23419
  };
23391
23420
  if (context.currentPermissionMode !== "plan") {
23392
- try {
23393
- await context.query.setPermissionMode(permissionMode);
23394
- } catch (cause) {
23395
- throw toRequestError(threadId, "session/setPermissionMode", cause);
23396
- }
23397
- context.currentPermissionMode = permissionMode;
23421
+ await applyClaudePermissionMode(context, permissionMode, {
23422
+ threadId,
23423
+ method: "session/setPermissionMode"
23424
+ });
23398
23425
  }
23399
23426
  if (permissionMode !== "bypassPermissions") {
23400
23427
  return;
@@ -23407,7 +23434,7 @@ var makeSessionControls = (deps) => {
23407
23434
  const setNativeMode = async (threadId, nativeModeId) => {
23408
23435
  const context = requireSession(threadId);
23409
23436
  if (!isClaudeNativeModeId(nativeModeId)) return;
23410
- if (context.currentPermissionMode === nativeModeId) return;
23437
+ if (context.currentPermissionMode === nativeModeId && permissionAllowInSync(context)) return;
23411
23438
  context.basePermissionMode = nativeModeId;
23412
23439
  context.session = {
23413
23440
  ...context.session,
@@ -23415,12 +23442,10 @@ var makeSessionControls = (deps) => {
23415
23442
  updatedAt: nowIso()
23416
23443
  };
23417
23444
  if (context.currentPermissionMode !== "plan" || nativeModeId === "plan") {
23418
- try {
23419
- await context.query.setPermissionMode(nativeModeId);
23420
- } catch (cause) {
23421
- throw toRequestError(threadId, "session/setPermissionMode", cause);
23422
- }
23423
- context.currentPermissionMode = nativeModeId;
23445
+ await applyClaudePermissionMode(context, nativeModeId, {
23446
+ threadId,
23447
+ method: "session/setPermissionMode"
23448
+ });
23424
23449
  }
23425
23450
  if (nativeModeId !== "bypassPermissions") {
23426
23451
  return;
@@ -23956,9 +23981,13 @@ var makeStartSession = (deps) => {
23956
23981
  const additionalDirectories = input.cwd ? [input.cwd] : [];
23957
23982
  const mcpServers = toClaudeMcpServers(input.mcpServers);
23958
23983
  const querySettings = { ...settings };
23959
- const readAllowRules = claudeReadAllowRules(input.readOnlyDirectories);
23960
- if (readAllowRules.length > 0) {
23961
- querySettings.permissions = { allow: [...readAllowRules] };
23984
+ const permissionRules = {
23985
+ read: claudeReadAllowRules(input.readOnlyDirectories),
23986
+ hostMcp: claudeHostMcpAllowRules(input.mcpServers)
23987
+ };
23988
+ const permissionAllow = claudePermissionAllow(permissionRules, permissionMode);
23989
+ if (permissionAllow.length > 0) {
23990
+ querySettings.permissions = { allow: [...permissionAllow] };
23962
23991
  }
23963
23992
  const stderrTail = createOutputTail(CLAUDE_STDERR_TAIL_CHARS);
23964
23993
  const mcpConfig = await createClaudeMcpConfig(mcpServers, log);
@@ -24055,6 +24084,8 @@ var makeStartSession = (deps) => {
24055
24084
  sessionSkills: input.skills,
24056
24085
  spawnEnvironment,
24057
24086
  currentSettings: settings,
24087
+ permissionRules,
24088
+ currentPermissionAllow: permissionAllow,
24058
24089
  interruptSettled: void 0,
24059
24090
  resumeSessionId: sessionId,
24060
24091
  pendingApprovals,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ycodium-ai/agent-claude",
3
- "version": "0.2.3106",
3
+ "version": "0.2.3108",
4
4
  "description": "Claude executor: Claude Code CLI via @anthropic-ai/claude-agent-sdk.",
5
5
  "keywords": [
6
6
  "ycodium",
@@ -24,10 +24,10 @@
24
24
  "@types/node": "24.12.4",
25
25
  "esbuild": "0.28.1",
26
26
  "vite-plus": "0.2.2",
27
- "@ycodium-ai/plugin-api": "0.2.0",
27
+ "@ycodium-ai/plugin-api": "0.2.3108",
28
28
  "ycodium-composer-tokens": "0.0.0",
29
- "ycodium-jsonl-stream": "0.0.0",
30
- "ycodium-executor-testing": "0.0.0"
29
+ "ycodium-executor-testing": "0.0.0",
30
+ "ycodium-jsonl-stream": "0.0.0"
31
31
  },
32
32
  "ycodium": {
33
33
  "plugin": "./dist/index.js",