@sideboard-ai/core 0.1.299 → 0.1.301

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 (38) hide show
  1. package/dist/agents/claude-runner.cjs +36 -0
  2. package/dist/agents/claude-runner.js +17 -0
  3. package/dist/{agents-JCCJJMA7.js → agents-ETD2LWP4.js} +4 -4
  4. package/dist/{agents-IVKPCK56.js → agents-V2SRC2LH.js} +5 -4
  5. package/dist/{chunk-EB7B4D2Z.js → chunk-2KJE53ZJ.js} +15 -88
  6. package/dist/{chunk-3IXGI2FP.js → chunk-3XDU7RIE.js} +1 -1
  7. package/dist/{chunk-QB4UQA5L.js → chunk-7SEWZXPT.js} +2 -2
  8. package/dist/{chunk-F3JYJ4UB.js → chunk-EP4IIKP4.js} +4 -4
  9. package/dist/{chunk-HTL4FBTP.js → chunk-FBZODCO4.js} +65 -0
  10. package/dist/chunk-FO3NKZVJ.js +104 -0
  11. package/dist/{chunk-YAILSKW3.js → chunk-FPJFK4LB.js} +11 -11
  12. package/dist/{chunk-EB3F5AWV.js → chunk-FUXOZHHF.js} +15 -54
  13. package/dist/{chunk-NF3WDI7F.js → chunk-JTW4CZEQ.js} +41 -48
  14. package/dist/{chunk-G52HLBQR.js → chunk-KIWICTLW.js} +1 -1
  15. package/dist/{chunk-UMALFEDS.js → chunk-LZ744H2I.js} +2 -2
  16. package/dist/{chunk-MMIDAD6J.js → chunk-OJKSDRZU.js} +4 -4
  17. package/dist/{chunk-K5EACGG2.js → chunk-WV33I2GC.js} +13 -0
  18. package/dist/{conductor-UQDDDW35.js → conductor-57KZLWTB.js} +5 -4
  19. package/dist/{conductor-JLHXMMKR.js → conductor-57UKACQA.js} +4 -4
  20. package/dist/{coordinator-prompt-SSUYZSJO.js → coordinator-prompt-2TBRFJZ5.js} +3 -3
  21. package/dist/{coordinator-prompt-HKLVS26O.js → coordinator-prompt-VOWUJRVJ.js} +4 -3
  22. package/dist/{global-workspace-MHE6FCUZ.js → global-workspace-T5C7EMVV.js} +3 -3
  23. package/dist/{global-workspace-I32EWKX3.js → global-workspace-V6SOEETA.js} +4 -3
  24. package/dist/index.cjs +164 -120
  25. package/dist/index.d.cts +29 -18
  26. package/dist/index.d.ts +29 -18
  27. package/dist/index.js +43 -19
  28. package/dist/mcp/run-stdio.cjs +72 -57
  29. package/dist/mcp/run-stdio.js +6 -6
  30. package/dist/{orchestrator-SX4SGZHF.js → orchestrator-C43M3JDK.js} +6 -6
  31. package/dist/{orchestrator-ESLNXVOX.js → orchestrator-JEF7JC3S.js} +7 -6
  32. package/dist/{thread-store-5XXHSWMN.js → thread-store-BMNJEJUH.js} +1 -1
  33. package/dist/{thread-store-WXLXKDVN.js → thread-store-POAYB2ID.js} +2 -1
  34. package/dist/{workspaces-O3L32CDO.js → workspaces-7ZYTTB4A.js} +3 -3
  35. package/dist/{workspaces-ATMIKXLK.js → workspaces-EWVIEJ4O.js} +4 -3
  36. package/dist/{worktree-RMYXBTJG.js → worktree-2Q6J2VWZ.js} +3 -2
  37. package/dist/{worktree-6G5X4ABY.js → worktree-ZAJGYKCB.js} +2 -2
  38. package/package.json +1 -1
@@ -24,13 +24,13 @@ import {
24
24
  } from "./chunk-5XQ43YZU.js";
25
25
  import {
26
26
  isOrchestratorThread
27
- } from "./chunk-UMALFEDS.js";
27
+ } from "./chunk-LZ744H2I.js";
28
28
  import {
29
29
  codexUnattendedGitConfigArgs,
30
30
  mergeAgentGitAuthEnv,
31
31
  resolveAgentGitAuthEnv,
32
32
  resolveCodexGitWritableRoots
33
- } from "./chunk-3IXGI2FP.js";
33
+ } from "./chunk-3XDU7RIE.js";
34
34
  import {
35
35
  npmGlobalNodeModules,
36
36
  run
@@ -50,6 +50,13 @@ import {
50
50
  unwrapStrippedElectronLaunch,
51
51
  wrapElectronAsNodeLaunch
52
52
  } from "./chunk-WWUABK6B.js";
53
+ import {
54
+ BASE_ALLOWED_TOOLS,
55
+ CLAUDE_CHROME_ALLOWED_TOOLS,
56
+ CLAUDE_POSTHOG_CONNECTOR_ALLOWED_TOOLS,
57
+ CLAUDE_PRINT_BG_WAIT_CEILING_MS,
58
+ mcpAllowToolsFromNames
59
+ } from "./chunk-FBZODCO4.js";
53
60
  import {
54
61
  appDataDir
55
62
  } from "./chunk-H5XL4KUS.js";
@@ -441,54 +448,6 @@ var brightsyAdapter = {
441
448
  // src/agents/claude.ts
442
449
  import { existsSync as existsSync10 } from "fs";
443
450
 
444
- // src/agents/claude-mcp.ts
445
- function sanitizeMcpServerName(name) {
446
- return name.replace(/[^A-Za-z0-9_-]/g, "_");
447
- }
448
- function mcpAllowTools(servers) {
449
- const out = [];
450
- for (const s of servers) {
451
- if (!s.connected) continue;
452
- const id = sanitizeMcpServerName(s.name);
453
- if (!id) continue;
454
- out.push(`mcp__${id}`);
455
- out.push(`mcp__${id}__*`);
456
- }
457
- return out;
458
- }
459
- function mcpAllowToolsFromNames(names) {
460
- return mcpAllowTools(
461
- [...names].map((name) => name.trim()).filter(Boolean).map((name) => ({ name, connected: true, needsAuth: false }))
462
- );
463
- }
464
- var BASE_ALLOWED_TOOLS = [
465
- "Edit",
466
- "Write",
467
- "Bash",
468
- "Read",
469
- "Glob",
470
- "Grep",
471
- "WebFetch",
472
- "WebSearch",
473
- "Task",
474
- "Agent",
475
- "TaskOutput",
476
- "TaskStop",
477
- "EnterWorktree",
478
- "ExitWorktree",
479
- "Skill"
480
- ];
481
- var CLAUDE_PRINT_BG_WAIT_CEILING_MS = 72e5;
482
- var CLAUDE_CHROME_ALLOWED_TOOLS = [
483
- "mcp__claude-in-chrome",
484
- "mcp__claude-in-chrome__*",
485
- "Skill(claude-in-chrome)"
486
- ];
487
- var CLAUDE_POSTHOG_CONNECTOR_ALLOWED_TOOLS = [
488
- "mcp__claude_ai_PostHog",
489
- "mcp__claude_ai_PostHog__*"
490
- ];
491
-
492
451
  // src/agents/orch-mcp-isolation.ts
493
452
  import { existsSync as existsSync7, readFileSync as readFileSync3 } from "fs";
494
453
  import { homedir as homedir3 } from "os";
@@ -2020,7 +1979,7 @@ var claudeAdapter = {
2020
1979
  );
2021
1980
  }
2022
1981
  const mode = permissionMode(thread);
2023
- const { isOrchestratorThread: isOrchestratorThread2 } = await import("./global-workspace-MHE6FCUZ.js");
1982
+ const { isOrchestratorThread: isOrchestratorThread2 } = await import("./global-workspace-T5C7EMVV.js");
2024
1983
  const isOrchestrator = isOrchestratorThread2(thread);
2025
1984
  const rpc = worktreeAgentRpc(isOrchestrator);
2026
1985
  const injectedServers = await buildInjectedMcpServers({
@@ -2040,12 +1999,13 @@ var claudeAdapter = {
2040
1999
  allowedTools = [
2041
2000
  ...BASE_ALLOWED_TOOLS,
2042
2001
  ...SIDEBOARD_MCP_ALLOWED_TOOLS,
2043
- ...brightsyMcpAllowedTools(injectedBrightsyNames)
2002
+ ...brightsyMcpAllowedTools(injectedBrightsyNames),
2003
+ ...mcpAllowToolsFromNames(thread.approvedMcpServers ?? [])
2044
2004
  ];
2045
2005
  } else {
2046
2006
  allowedTools = [
2047
2007
  ...BASE_ALLOWED_TOOLS,
2048
- ...mcpAllowToolsFromNames(Object.keys(userMcpEntries)),
2008
+ ...mcpAllowToolsFromNames([...Object.keys(userMcpEntries), ...thread.approvedMcpServers ?? []]),
2049
2009
  ...sideboardWorktreeAllowedTools({
2050
2010
  github: true,
2051
2011
  linear: isLinearConnected(),
@@ -2085,7 +2045,8 @@ var claudeAdapter = {
2085
2045
  "--verbose",
2086
2046
  "--include-partial-messages",
2087
2047
  "--permission-mode",
2088
- mode.claude
2048
+ mode.claude,
2049
+ ...mode.claude === "bypassPermissions" ? ["--dangerously-skip-permissions"] : []
2089
2050
  ];
2090
2051
  if (systemPrompt) {
2091
2052
  args.push("--append-system-prompt", systemPrompt);
@@ -14,7 +14,7 @@ import {
14
14
  parseSessionQuotaResetAt,
15
15
  planModeTurnInstruction,
16
16
  resolveQuotaFallbackAgent
17
- } from "./chunk-EB7B4D2Z.js";
17
+ } from "./chunk-2KJE53ZJ.js";
18
18
  import {
19
19
  REVIEW_TAB_TITLE,
20
20
  applyWorktreePkgCacheEnv,
@@ -53,7 +53,7 @@ import {
53
53
  worktreeDevProcessKey,
54
54
  worktreeRunProcessKey,
55
55
  worktreeSetupProcessKey
56
- } from "./chunk-MMIDAD6J.js";
56
+ } from "./chunk-OJKSDRZU.js";
57
57
  import {
58
58
  applyAgentEvent,
59
59
  clipAgentEventForPaint,
@@ -100,7 +100,7 @@ import {
100
100
  stageAbsolutePathsAsAttachments,
101
101
  stageBuffersAsAttachments,
102
102
  syncWorkspacesFromThreads
103
- } from "./chunk-QB4UQA5L.js";
103
+ } from "./chunk-7SEWZXPT.js";
104
104
  import {
105
105
  addPrStackLayer,
106
106
  allocateTeamSlug,
@@ -144,7 +144,7 @@ import {
144
144
  resolveRepoRoot,
145
145
  switchWorktreeBranch,
146
146
  withRepoGitLock
147
- } from "./chunk-G52HLBQR.js";
147
+ } from "./chunk-KIWICTLW.js";
148
148
  import {
149
149
  agentNicknameFromWorktreePath,
150
150
  appendMessage,
@@ -168,7 +168,11 @@ import {
168
168
  worktreeNameFromPath,
169
169
  worktreeSlugForTicket,
170
170
  writeThread
171
- } from "./chunk-K5EACGG2.js";
171
+ } from "./chunk-WV33I2GC.js";
172
+ import {
173
+ mcpServerIdForPermission,
174
+ mcpServerPermissionUpdate
175
+ } from "./chunk-FO3NKZVJ.js";
172
176
  import {
173
177
  createAgentStreamCoalescer
174
178
  } from "./chunk-AXQ4ZWHK.js";
@@ -453,9 +457,9 @@ async function spawnAgentTurn(thread, input, onEvent) {
453
457
  `Cannot spawn ${thread.agent}: thread ${thread.id} has no worktreePath`
454
458
  );
455
459
  }
456
- const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-I32EWKX3.js");
460
+ const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-V6SOEETA.js");
457
461
  if (isGlobalThread2(thread)) {
458
- const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-HKLVS26O.js");
462
+ const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-VOWUJRVJ.js");
459
463
  ensureGlobalCoordinatorCwd2(
460
464
  isOrchestratorThread(thread) ? { orchestratorThreadId: thread.id } : void 0
461
465
  );
@@ -1507,6 +1511,7 @@ function denied(message) {
1507
1511
  return { behavior: "deny", message, decisionClassification: "user_reject" };
1508
1512
  }
1509
1513
  function sessionGrants(item) {
1514
+ if (item.mcpServerId) return [mcpServerPermissionUpdate(item.mcpServerId)];
1510
1515
  if (Array.isArray(item.suggestions) && item.suggestions.length > 0) {
1511
1516
  return item.suggestions;
1512
1517
  }
@@ -1565,12 +1570,16 @@ function askToolPermission(ask) {
1565
1570
  const toolName = clean(ask.toolName);
1566
1571
  if (!threadId || !toolName) return Promise.resolve(denied("Missing chat or tool."));
1567
1572
  const described = describeToolPermission({ ...ask, threadId, toolName });
1573
+ const mcpServerId = mcpServerIdForPermission(toolName, ask.mcpServer) ?? void 0;
1568
1574
  const prompt = {
1569
1575
  id: randomUUID(),
1570
1576
  title: described.title,
1571
1577
  detail: described.detail,
1572
1578
  path: described.path || void 0,
1573
- allowSession: !ask.suppressAlwaysAllow,
1579
+ // Claude hides "always allow" when the saved rule would be broader than
1580
+ // this call. For MCP that broader rule is what we want: the whole server.
1581
+ allowSession: mcpServerId ? true : !ask.suppressAlwaysAllow,
1582
+ ...mcpServerId ? { sessionLabel: "Allow this MCP" } : {},
1574
1583
  defaultToNo: Boolean(ask.defaultToNo)
1575
1584
  };
1576
1585
  return new Promise((resolve) => {
@@ -1579,6 +1588,7 @@ function askToolPermission(ask) {
1579
1588
  threadId,
1580
1589
  prompt,
1581
1590
  suggestions: ask.suggestions,
1591
+ mcpServerId,
1582
1592
  resolve
1583
1593
  };
1584
1594
  const q = queues.get(threadId) ?? [];
@@ -2093,13 +2103,13 @@ function isClosedPrState(prUrl, prState) {
2093
2103
  if (!prUrl?.trim()) return false;
2094
2104
  return (prState ?? "").trim().toUpperCase() === "CLOSED";
2095
2105
  }
2096
- function listBadge(id, title, conflict = false) {
2106
+ function listBadge(id, title, note) {
2097
2107
  return {
2098
2108
  id,
2099
2109
  label: id,
2100
- title: conflict ? `${title} \xB7 merge conflicts` : title,
2110
+ title: note ? `${title} \xB7 ${note}` : title,
2101
2111
  mod: `is-${id}`,
2102
- ...conflict ? { conflict: true } : {}
2112
+ ...note ? { conflict: true } : {}
2103
2113
  };
2104
2114
  }
2105
2115
  function hasMergeConflict(thread) {
@@ -2110,69 +2120,52 @@ function hasMergeConflict(thread) {
2110
2120
  isInMergeQueue: thread.prIsInMergeQueue
2111
2121
  }) === "conflicts";
2112
2122
  }
2113
- function groupPrError(group) {
2123
+ function blockerNote(group) {
2114
2124
  const open = group.filter(
2115
2125
  (thread) => isOpenPrState(thread.prUrl, thread.prState) && !thread.prIsInMergeQueue
2116
2126
  );
2127
+ const parts = [];
2117
2128
  if (open.some(
2118
2129
  (thread) => thread.prChecksFailed || mergeStateSuggestsCheckFailure({
2119
2130
  mergeStateStatus: thread.prMergeStateStatus ?? null,
2120
2131
  reviewDecision: thread.prReviewDecision ?? null
2121
2132
  })
2122
2133
  )) {
2123
- return { label: "failing", title: "Checks failing" };
2124
- }
2125
- if (open.some(
2134
+ parts.push("checks failing");
2135
+ } else if (open.some(
2126
2136
  (thread) => !thread.prIsDraft && (thread.prReviewDecision ?? "").trim().toUpperCase() === "CHANGES_REQUESTED"
2127
2137
  )) {
2128
- return { label: "changes", title: "Changes requested" };
2129
- }
2130
- return void 0;
2131
- }
2132
- function withPrError(badges, error, conflict) {
2133
- if (!error) return badges;
2134
- const [first] = badges;
2135
- if (!first) {
2136
- return [
2137
- {
2138
- id: "error",
2139
- label: error.label,
2140
- title: conflict ? `${error.title} \xB7 merge conflicts` : error.title,
2141
- mod: "is-error",
2142
- ...conflict ? { conflict: true } : {}
2143
- }
2144
- ];
2138
+ parts.push("changes requested");
2145
2139
  }
2146
- return [{ ...first, error }];
2140
+ if (open.some(hasMergeConflict)) parts.push("merge conflicts");
2141
+ return parts.length > 0 ? parts.join(" \xB7 ") : void 0;
2147
2142
  }
2148
2143
  function classifyWorktreeListBadges(group, viewerLogin = "", reviewLabel = "") {
2149
2144
  if (group.length === 0 || group.some((t) => t.cowboy)) return [];
2150
2145
  if (group.some((t) => isMergedPrState(t.prUrl, t.prState))) {
2151
2146
  return [listBadge("merged", "Merged")];
2152
2147
  }
2153
- const conflict = group.some(hasMergeConflict);
2154
- const error = groupPrError(group);
2155
- const finish2 = (badges) => withPrError(badges, error, conflict);
2148
+ const note = blockerNote(group);
2156
2149
  if (group.some((t) => isApprovedOpenPr(t))) {
2157
- return finish2([listBadge("approved", "Approved, not merged", conflict)]);
2150
+ return [listBadge("approved", "Approved, not merged", note)];
2158
2151
  }
2159
2152
  const open = group.filter((t) => isOpenPrState(t.prUrl, t.prState));
2160
2153
  if (open.length === 0) {
2161
2154
  if (group.some((t) => isClosedPrState(t.prUrl, t.prState))) return [];
2162
- return finish2([listBadge("new", "No pull request")]);
2155
+ return [listBadge("new", "No pull request")];
2163
2156
  }
2164
2157
  const ownership = classifyWorktreeOwnership(group, viewerLogin);
2165
2158
  if (ownership === "reviewing") {
2166
- return finish2([listBadge("review", "Someone else's PR", conflict)]);
2159
+ return [listBadge("review", "Someone else's PR", note)];
2167
2160
  }
2168
- if (!normalizeViewerLogin(viewerLogin)) return finish2([]);
2161
+ if (!normalizeViewerLogin(viewerLogin)) return [];
2169
2162
  if (!open.some((t) => !t.prIsDraft)) {
2170
- return finish2([listBadge("draft", "Draft pull request", conflict)]);
2163
+ return [listBadge("draft", "Draft pull request", note)];
2171
2164
  }
2172
2165
  const readyLabel = reviewLabel.trim();
2173
2166
  const inReview = readyLabel ? labelsInclude(groupPrLabels(group), readyLabel) : true;
2174
- if (!inReview) return finish2([]);
2175
- return finish2([listBadge("pending", "Waiting for review", conflict)]);
2167
+ if (!inReview) return [];
2168
+ return [listBadge("pending", "Waiting for review", note)];
2176
2169
  }
2177
2170
 
2178
2171
  // src/board/home-board.ts
@@ -2966,7 +2959,7 @@ async function createThread(input, _onSetupLine) {
2966
2959
  return readThread(thread.id) ?? thread;
2967
2960
  }
2968
2961
  async function listLinearIssues(agent, repoPath) {
2969
- const { getAdapter: getAdapter2 } = await import("./agents-IVKPCK56.js");
2962
+ const { getAdapter: getAdapter2 } = await import("./agents-V2SRC2LH.js");
2970
2963
  await requireAgent(agent, { requireLinear: true });
2971
2964
  const adapter = getAdapter2(agent);
2972
2965
  if (!adapter.listLinearIssues) {
@@ -3742,7 +3735,7 @@ async function adoptThread(input) {
3742
3735
  messages: input.messages ?? []
3743
3736
  });
3744
3737
  writeThread(thread);
3745
- const { addWorkspace: addWorkspace2 } = await import("./workspaces-ATMIKXLK.js");
3738
+ const { addWorkspace: addWorkspace2 } = await import("./workspaces-EWVIEJ4O.js");
3746
3739
  await addWorkspace2(repoPath);
3747
3740
  const { ensureWorktreeSideboardIgnored } = await import("./worktree-exclude-RXZPTCNH.js");
3748
3741
  await ensureWorktreeSideboardIgnored(input.worktreePath);
@@ -6671,7 +6664,7 @@ function formatScheduledPrompt(name, prompt) {
6671
6664
  ${prompt}`;
6672
6665
  }
6673
6666
  async function defaultDeps() {
6674
- const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-ESLNXVOX.js");
6667
+ const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-JEF7JC3S.js");
6675
6668
  const orch = getOrchestrator2();
6676
6669
  return {
6677
6670
  findThread: (id) => findThreadByRef(id),
@@ -9546,7 +9539,7 @@ async function startOrchestration(opts) {
9546
9539
  sourceRef: "default",
9547
9540
  ...createOpts
9548
9541
  }).catch(async () => {
9549
- const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-RMYXBTJG.js");
9542
+ const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-2Q6J2VWZ.js");
9550
9543
  const repo = await resolveRepoRoot2(repoPath);
9551
9544
  const def = await resolveDefaultBranch2(repo);
9552
9545
  return orch.createThread({
@@ -9556,7 +9549,7 @@ async function startOrchestration(opts) {
9556
9549
  repoPath: repo
9557
9550
  });
9558
9551
  });
9559
- const { updateThread: upd } = await import("./thread-store-WXLXKDVN.js");
9552
+ const { updateThread: upd } = await import("./thread-store-POAYB2ID.js");
9560
9553
  const updated = upd(thread.id, {
9561
9554
  sourceType: "orchestration",
9562
9555
  sourceRef: goal
@@ -4,7 +4,7 @@ import {
4
4
  normalizeTakenSlug,
5
5
  normalizeWorktreePath,
6
6
  takenSlugsFromThread
7
- } from "./chunk-K5EACGG2.js";
7
+ } from "./chunk-WV33I2GC.js";
8
8
  import {
9
9
  ensureWorktreeSideboardIgnored
10
10
  } from "./chunk-2P4XKWV2.js";
@@ -5,7 +5,7 @@ import {
5
5
  ensureGhPreferOrigin,
6
6
  resolveGithubRepoSlug,
7
7
  resolveRepoRoot
8
- } from "./chunk-3IXGI2FP.js";
8
+ } from "./chunk-3XDU7RIE.js";
9
9
  import {
10
10
  ATTACHMENTS_DIR,
11
11
  attachmentsGitignoreBody
@@ -31,7 +31,7 @@ import {
31
31
  teamSlugFromName,
32
32
  updateThread,
33
33
  writeThread
34
- } from "./chunk-HTL4FBTP.js";
34
+ } from "./chunk-FBZODCO4.js";
35
35
  import {
36
36
  appDataDir,
37
37
  globalAgentCwd,
@@ -8,11 +8,11 @@ import {
8
8
  isGlobalThread,
9
9
  isOrchestratorThread,
10
10
  isSlackCoordinatorThread
11
- } from "./chunk-QB4UQA5L.js";
11
+ } from "./chunk-7SEWZXPT.js";
12
12
  import {
13
13
  mergeAgentGitAuthEnv,
14
14
  resolveAgentGitAuthEnv
15
- } from "./chunk-G52HLBQR.js";
15
+ } from "./chunk-KIWICTLW.js";
16
16
  import {
17
17
  allocateTeamName,
18
18
  createEmptyThread,
@@ -23,7 +23,7 @@ import {
23
23
  updateThread,
24
24
  worktreeNameFromPath,
25
25
  writeThread
26
- } from "./chunk-K5EACGG2.js";
26
+ } from "./chunk-WV33I2GC.js";
27
27
  import {
28
28
  ensureWorktreeSideboardIgnored
29
29
  } from "./chunk-2P4XKWV2.js";
@@ -1776,7 +1776,7 @@ var PORT_RANGE_SIZE = 10;
1776
1776
  var RECLAIM_RETRY_DELAY_MS = 40;
1777
1777
  var RECLAIM_TRIES = 8;
1778
1778
  async function killReclaimable(ports, worktreePath, signal) {
1779
- const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-UQDDDW35.js");
1779
+ const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-57KZLWTB.js");
1780
1780
  if (worktreePath) killStaleWorktreeListeners2(ports, worktreePath, signal);
1781
1781
  else killListenersOnPorts2(ports);
1782
1782
  }
@@ -1,3 +1,6 @@
1
+ import {
2
+ sanitizeMcpServerName
3
+ } from "./chunk-FO3NKZVJ.js";
1
4
  import {
2
5
  cursorSdkStoreDir
3
6
  } from "./chunk-UWQ6UCIB.js";
@@ -962,6 +965,15 @@ function resolveThreadEffort(raw) {
962
965
  if (raw.fast) return "low";
963
966
  return "high";
964
967
  }
968
+ function normalizeApprovedMcpServers(raw) {
969
+ if (!Array.isArray(raw)) return void 0;
970
+ const ids = [
971
+ ...new Set(
972
+ raw.map((value) => typeof value === "string" ? sanitizeMcpServerName(value.trim()) : "").filter(Boolean)
973
+ )
974
+ ];
975
+ return ids.length > 0 ? ids : void 0;
976
+ }
965
977
  function normalizeRunScriptRequest(raw) {
966
978
  if (!raw || typeof raw !== "object") return void 0;
967
979
  const req = raw;
@@ -987,6 +999,7 @@ function normalizeThread(raw) {
987
999
  planMode: Boolean(raw.planMode),
988
1000
  isolateCodexPlugins: raw.isolateCodexPlugins === true ? true : void 0,
989
1001
  autonomy: raw.autonomy ?? "default",
1002
+ approvedMcpServers: normalizeApprovedMcpServers(raw.approvedMcpServers),
990
1003
  lastError: raw.lastError ?? null,
991
1004
  agentPid: raw.agentPid ?? null,
992
1005
  attachments: Array.isArray(raw.attachments) ? raw.attachments : [],
@@ -31,12 +31,13 @@ import {
31
31
  tryReservePort,
32
32
  tryReservePorts,
33
33
  worktreeRunPortsPath
34
- } from "./chunk-MMIDAD6J.js";
34
+ } from "./chunk-OJKSDRZU.js";
35
35
  import "./chunk-F36QRDM4.js";
36
- import "./chunk-QB4UQA5L.js";
37
- import "./chunk-G52HLBQR.js";
38
- import "./chunk-K5EACGG2.js";
36
+ import "./chunk-7SEWZXPT.js";
37
+ import "./chunk-KIWICTLW.js";
38
+ import "./chunk-WV33I2GC.js";
39
39
  import "./chunk-2P4XKWV2.js";
40
+ import "./chunk-FO3NKZVJ.js";
40
41
  import "./chunk-HO5R3ZRH.js";
41
42
  import "./chunk-6K64FJDD.js";
42
43
  import "./chunk-UWQ6UCIB.js";
@@ -33,10 +33,10 @@ import {
33
33
  tryReservePort,
34
34
  tryReservePorts,
35
35
  worktreeRunPortsPath
36
- } from "./chunk-F3JYJ4UB.js";
36
+ } from "./chunk-EP4IIKP4.js";
37
37
  import "./chunk-5XQ43YZU.js";
38
- import "./chunk-UMALFEDS.js";
39
- import "./chunk-3IXGI2FP.js";
38
+ import "./chunk-LZ744H2I.js";
39
+ import "./chunk-3XDU7RIE.js";
40
40
  import "./chunk-N2WW62LF.js";
41
41
  import "./chunk-DD67JWTN.js";
42
42
  import "./chunk-2UG25RMK.js";
@@ -47,7 +47,7 @@ import {
47
47
  } from "./chunk-WWUABK6B.js";
48
48
  import "./chunk-FJZWM2ON.js";
49
49
  import "./chunk-UN5Q7POQ.js";
50
- import "./chunk-HTL4FBTP.js";
50
+ import "./chunk-FBZODCO4.js";
51
51
  import "./chunk-4RZRHTSZ.js";
52
52
  import "./chunk-KGZBYWZ3.js";
53
53
  import {
@@ -9,8 +9,8 @@ import {
9
9
  enrichWorkspacesWithGithub,
10
10
  ensureGlobalCoordinatorCwd,
11
11
  formatWorkspaceInventory
12
- } from "./chunk-UMALFEDS.js";
13
- import "./chunk-3IXGI2FP.js";
12
+ } from "./chunk-LZ744H2I.js";
13
+ import "./chunk-3XDU7RIE.js";
14
14
  import "./chunk-N2WW62LF.js";
15
15
  import "./chunk-DD67JWTN.js";
16
16
  import "./chunk-2UG25RMK.js";
@@ -19,7 +19,7 @@ import "./chunk-NSTQ6QKD.js";
19
19
  import "./chunk-WWUABK6B.js";
20
20
  import "./chunk-FJZWM2ON.js";
21
21
  import "./chunk-UN5Q7POQ.js";
22
- import "./chunk-HTL4FBTP.js";
22
+ import "./chunk-FBZODCO4.js";
23
23
  import "./chunk-4RZRHTSZ.js";
24
24
  import "./chunk-KGZBYWZ3.js";
25
25
  import "./chunk-H5XL4KUS.js";
@@ -7,10 +7,11 @@ import {
7
7
  enrichWorkspacesWithGithub,
8
8
  ensureGlobalCoordinatorCwd,
9
9
  formatWorkspaceInventory
10
- } from "./chunk-QB4UQA5L.js";
11
- import "./chunk-G52HLBQR.js";
12
- import "./chunk-K5EACGG2.js";
10
+ } from "./chunk-7SEWZXPT.js";
11
+ import "./chunk-KIWICTLW.js";
12
+ import "./chunk-WV33I2GC.js";
13
13
  import "./chunk-2P4XKWV2.js";
14
+ import "./chunk-FO3NKZVJ.js";
14
15
  import "./chunk-6K64FJDD.js";
15
16
  import "./chunk-UWQ6UCIB.js";
16
17
  import "./chunk-QVN2WOKJ.js";
@@ -20,8 +20,8 @@ import {
20
20
  remoteCoordinatorSourceRef,
21
21
  slackCoordinatorSourceRef,
22
22
  takenTeamSlugsForOrchestration
23
- } from "./chunk-UMALFEDS.js";
24
- import "./chunk-3IXGI2FP.js";
23
+ } from "./chunk-LZ744H2I.js";
24
+ import "./chunk-3XDU7RIE.js";
25
25
  import "./chunk-N2WW62LF.js";
26
26
  import "./chunk-DD67JWTN.js";
27
27
  import "./chunk-2UG25RMK.js";
@@ -30,7 +30,7 @@ import "./chunk-NSTQ6QKD.js";
30
30
  import "./chunk-WWUABK6B.js";
31
31
  import "./chunk-FJZWM2ON.js";
32
32
  import "./chunk-UN5Q7POQ.js";
33
- import "./chunk-HTL4FBTP.js";
33
+ import "./chunk-FBZODCO4.js";
34
34
  import "./chunk-4RZRHTSZ.js";
35
35
  import "./chunk-KGZBYWZ3.js";
36
36
  import {
@@ -18,10 +18,11 @@ import {
18
18
  remoteCoordinatorSourceRef,
19
19
  slackCoordinatorSourceRef,
20
20
  takenTeamSlugsForOrchestration
21
- } from "./chunk-QB4UQA5L.js";
22
- import "./chunk-G52HLBQR.js";
23
- import "./chunk-K5EACGG2.js";
21
+ } from "./chunk-7SEWZXPT.js";
22
+ import "./chunk-KIWICTLW.js";
23
+ import "./chunk-WV33I2GC.js";
24
24
  import "./chunk-2P4XKWV2.js";
25
+ import "./chunk-FO3NKZVJ.js";
25
26
  import "./chunk-6K64FJDD.js";
26
27
  import "./chunk-UWQ6UCIB.js";
27
28
  import "./chunk-QVN2WOKJ.js";