@sideboard-ai/core 0.1.81 → 0.1.84

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 (35) hide show
  1. package/dist/agents/cursor-runner.cjs +106 -53
  2. package/dist/agents/cursor-runner.js +96 -55
  3. package/dist/{agents-UQ7D6U6L.js → agents-JFXM66QA.js} +7 -6
  4. package/dist/{agents-EBKJ55PN.js → agents-OPTHS4IX.js} +5 -5
  5. package/dist/{app-settings-6IOQYGBK.js → app-settings-K6RFCRF6.js} +2 -1
  6. package/dist/{app-settings-NILNWNNQ.js → app-settings-PEXK5VEX.js} +1 -1
  7. package/dist/chunk-5KLC2MWZ.js +40 -0
  8. package/dist/{chunk-XKNBSYA7.js → chunk-AY53MPDE.js} +39 -1
  9. package/dist/{chunk-4AVU4QXO.js → chunk-BBQ6HXKS.js} +67 -17
  10. package/dist/{chunk-SEOICVGB.js → chunk-CBJSPTBG.js} +30 -6
  11. package/dist/{chunk-FUUVPN4A.js → chunk-CKBIQ54F.js} +78 -49
  12. package/dist/{chunk-IFPN6TER.js → chunk-I3FRXL7J.js} +4 -1
  13. package/dist/{chunk-CQBQWX73.js → chunk-JPHG2KCC.js} +8 -3
  14. package/dist/{chunk-4HJK57XU.js → chunk-NW7MEJHO.js} +8 -3
  15. package/dist/{chunk-K553XK7M.js → chunk-ODZ2ZOA4.js} +2 -2
  16. package/dist/{chunk-6F2TQFJE.js → chunk-OIEFHOP7.js} +3 -3
  17. package/dist/{chunk-XNECBC6T.js → chunk-R753UFSX.js} +39 -11
  18. package/dist/{chunk-TDJ43HUD.js → chunk-UN3LVQB2.js} +2 -2
  19. package/dist/{chunk-P5VDPGAN.js → chunk-WJ5TINR6.js} +3 -3
  20. package/dist/{chunk-YVVXWWCC.js → chunk-XW47PL6A.js} +81 -49
  21. package/dist/{coordinator-prompt-NYNEFKIV.js → coordinator-prompt-DOIOSLUN.js} +3 -3
  22. package/dist/{coordinator-prompt-JQF72JKX.js → coordinator-prompt-RCTIIZ6C.js} +4 -3
  23. package/dist/{global-workspace-NUMUJRWG.js → global-workspace-33BIG7KK.js} +4 -4
  24. package/dist/{global-workspace-DZM4ZFGU.js → global-workspace-73OAKD3C.js} +5 -4
  25. package/dist/index.cjs +235 -88
  26. package/dist/index.d.cts +36 -9
  27. package/dist/index.d.ts +36 -9
  28. package/dist/index.js +69 -45
  29. package/dist/mcp/run-stdio.cjs +233 -88
  30. package/dist/mcp/run-stdio.js +60 -43
  31. package/dist/{workspaces-QLRCOXAY.js → workspaces-SRITISKA.js} +6 -5
  32. package/dist/{workspaces-SUU2GO3A.js → workspaces-WDLY34MX.js} +5 -5
  33. package/dist/{worktree-5VLLFI5W.js → worktree-SGZVAWOQ.js} +3 -2
  34. package/dist/{worktree-UNSOCYZU.js → worktree-TUAO74SI.js} +2 -2
  35. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  listWorkspaces,
5
5
  removeWorkspace,
6
6
  syncWorkspacesFromThreads
7
- } from "./chunk-K553XK7M.js";
7
+ } from "./chunk-ODZ2ZOA4.js";
8
8
  import {
9
9
  BRIGHTSY_MCP_ALLOWED_TOOLS,
10
10
  CLAUDE_MODEL_CATALOG,
@@ -64,7 +64,7 @@ import {
64
64
  threadRequestsBrightsyMcp,
65
65
  totalTokens,
66
66
  writeInjectedMcpConfig
67
- } from "./chunk-XNECBC6T.js";
67
+ } from "./chunk-R753UFSX.js";
68
68
  import {
69
69
  CLOUD_COORDINATOR_BUSY_REPLY,
70
70
  CLOUD_COORDINATOR_STOPPED_REPLY,
@@ -91,7 +91,7 @@ import {
91
91
  parseForceStopMessage,
92
92
  slackCoordinatorSourceRef,
93
93
  takenTeamSlugsForOrchestration
94
- } from "./chunk-6F2TQFJE.js";
94
+ } from "./chunk-OIEFHOP7.js";
95
95
  import {
96
96
  COORDINATOR_TOOL_PLAYBOOK,
97
97
  SLACK_REPLY_FORMATTING,
@@ -100,7 +100,7 @@ import {
100
100
  enrichWorkspacesWithGithub,
101
101
  ensureGlobalCoordinatorCwd,
102
102
  formatWorkspaceInventory
103
- } from "./chunk-CQBQWX73.js";
103
+ } from "./chunk-JPHG2KCC.js";
104
104
  import {
105
105
  brightsyConfigPath,
106
106
  brightsyMcpServerName,
@@ -134,7 +134,7 @@ import {
134
134
  parseCursorRunnerLine,
135
135
  pushTurnStderr,
136
136
  summarizeTurnStderr
137
- } from "./chunk-SEOICVGB.js";
137
+ } from "./chunk-CBJSPTBG.js";
138
138
  import {
139
139
  caffeinateHoldPath,
140
140
  getCaffeinateHold,
@@ -165,6 +165,7 @@ import {
165
165
  formatGhLandError,
166
166
  formatGitAuthModeDirective,
167
167
  formatIpcInvokeError,
168
+ formatMergePrError,
168
169
  formatRateLimitResetHint,
169
170
  getPr,
170
171
  getPrChecks,
@@ -179,6 +180,7 @@ import {
179
180
  isGhRateLimitError,
180
181
  isInPrStack,
181
182
  isPlaceholderBranch,
183
+ isPrNotMergeableError,
182
184
  isSideboardScratchPath,
183
185
  listBranches,
184
186
  listPrs,
@@ -208,7 +210,7 @@ import {
208
210
  worktreeDisplayLabel,
209
211
  worktreeDisplayLabelForGroup,
210
212
  worktreeNameFromPath
211
- } from "./chunk-YVVXWWCC.js";
213
+ } from "./chunk-XW47PL6A.js";
212
214
  import {
213
215
  ATTACHMENTS_DIR,
214
216
  LEGACY_ATTACHMENTS_DIR,
@@ -277,7 +279,10 @@ import {
277
279
  updateIntegrationsSettings,
278
280
  updateOpencodeSettings,
279
281
  writeSecureJson
280
- } from "./chunk-IFPN6TER.js";
282
+ } from "./chunk-I3FRXL7J.js";
283
+ import {
284
+ stripNestedElectronEnv
285
+ } from "./chunk-5KLC2MWZ.js";
281
286
  import {
282
287
  writePrivateFile
283
288
  } from "./chunk-JT7R45JB.js";
@@ -357,7 +362,8 @@ function agentGitPrompt(action, opts) {
357
362
  return "Commit, push, and open a PR in the browser.";
358
363
  case "resolve-conflicts": {
359
364
  const base = opts?.prBase?.trim().replace(/^refs\/heads\//, "");
360
- return base ? `Merge origin/${base} into this branch. Then push.` : "Fix merge conflicts.";
365
+ const named = base ? ` (${base})` : "";
366
+ return `Merge the remote branch${named} into your branch and resolve conflicts. Then, commit and push your changes.`;
361
367
  }
362
368
  case "merge":
363
369
  return "Merge PR.";
@@ -1310,9 +1316,9 @@ async function spawnAgentTurn(thread, input, onEvent) {
1310
1316
  `Cannot spawn ${thread.agent}: thread ${thread.id} has no worktreePath`
1311
1317
  );
1312
1318
  }
1313
- const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-DZM4ZFGU.js");
1319
+ const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-73OAKD3C.js");
1314
1320
  if (isGlobalThread2(thread)) {
1315
- const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-JQF72JKX.js");
1321
+ const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-RCTIIZ6C.js");
1316
1322
  ensureGlobalCoordinatorCwd2(
1317
1323
  isOrchestratorThread(thread) ? { orchestratorThreadId: thread.id } : void 0
1318
1324
  );
@@ -1511,7 +1517,7 @@ function formatWorktreeDirective(thread, opts) {
1511
1517
  '- "Fix CI: <name>." \u2192 investigate that failing check, fix it, commit, and push.'
1512
1518
  );
1513
1519
  lines.push(
1514
- '- "Update the branch." / "Fix merge conflicts." / "Merge origin/<base> into this branch. Then push." \u2192 sync with the PR base (merge or rebase), resolve conflicts carefully, commit, and push until the PR is mergeable.'
1520
+ '- "Merge the remote branch (<base>) into your branch and resolve conflicts. Then, commit and push your changes." \u2192 fetch the PR base, merge it into this branch, resolve conflicts carefully, commit, and push until the PR is mergeable.'
1515
1521
  );
1516
1522
  lines.push(
1517
1523
  '- "Address review comments." \u2192 read PR review feedback, make the requested changes, commit, and push.'
@@ -1519,11 +1525,22 @@ function formatWorktreeDirective(thread, opts) {
1519
1525
  lines.push(
1520
1526
  '- "Merge PR." \u2192 merge this thread\'s open pull request on GitHub (this phrase is the explicit ask). If `gh stack view` shows a stack, use `gh stack merge`; otherwise `gh pr merge` (respect repo defaults / squash vs merge). Do not force-push main/master or merge locally into the main checkout.'
1521
1527
  );
1528
+ lines.push("");
1529
+ lines.push(formatProcessGuideDirective());
1522
1530
  return lines.join("\n");
1523
1531
  }
1524
1532
  function formatWorktreeReminder() {
1525
1533
  return "Sideboard worktree: stay in this cwd for all file and git work. Push and open PRs against origin, never upstream. Do not edit the main repo checkout.";
1526
1534
  }
1535
+ function formatProcessGuideDirective() {
1536
+ return [
1537
+ "Process guides (recurring work only):",
1538
+ "- If `.claude/skills/graph-engineering/SKILL.md` exists, follow it (`/graph-engineering`) for migrations, ports, batch fixes, and other fan-out. Judge first; state on disk; grow the rulebook; do not patch around it.",
1539
+ "- If this same shape of work will happen again, write `.claude/skills/<kebab-name>/SKILL.md` in this worktree (Claude Code project skill). Sideboard `/name`, Claude Code, and `attach` all load that path. Do not leave the method only in chat.",
1540
+ "- Do not write new skills under `.sideboard/skills` \u2014 native agents do not scan it. Point Codex/OpenCode at the file from `AGENTS.md`. Optional: symlink `.cursor/skills/<name>` to the Claude skill.",
1541
+ "- Skip a guide for a one-off. If a matching skill exists, follow it. Same miss twice \u2192 edit the skill (or `.sideboard/review.md`), do not patch around it."
1542
+ ].join("\n");
1543
+ }
1527
1544
  function formatArtifactDirective() {
1528
1545
  return [
1529
1546
  "Sideboard side column (desktop UI):",
@@ -1541,9 +1558,22 @@ function formatArtifactDirective() {
1541
1558
  "Files / media browser (CMS file manager column):",
1542
1559
  "4) Call Sideboard MCP `present_files` with optional title, path, and datasource (brightsy|memory).",
1543
1560
  " Opens the Files column for browse/upload/pick. Do NOT say a file manager UI is missing.",
1544
- "Never say artifacts, CMS UI, or the Files column are unavailable. Prefer present_schema for list/edit/publish; present_files for storage UI; html fences for standalone pages."
1561
+ "Multiple-choice questions (any mode \u2014 not only Plan):",
1562
+ "5) Call Sideboard MCP `ask_user` when the user should pick from predefined options (approach forks, requirements, which API). First write a short chat message that explains the decision and what each option means (tradeoffs, when to pick it). Include a description on every option. After calling, stop and wait for their next message with answers. Do not ask multiple-choice questions as plain chat bullets \u2014 use ask_user so Sideboard shows the composer picker.",
1563
+ "Never say artifacts, CMS UI, or the Files column are unavailable. Prefer present_schema for list/edit/publish; present_files for storage UI; html fences for standalone pages; ask_user for predefined-option questions."
1545
1564
  ].join("\n");
1546
1565
  }
1566
+ function formatUiReminder() {
1567
+ return [
1568
+ "Sideboard side column (important):",
1569
+ "There is no claude.ai Artifact tool here \u2014 that is normal.",
1570
+ "HTML/SVG/markdown: ```html fence or MCP present_artifact.",
1571
+ "CMS forms/tables: MCP present_schema (Brightsy resource_id or inline schema+schemaUi).",
1572
+ "Files column: MCP present_files (brightsy account storage or memory).",
1573
+ "Do not say artifacts/CMS UI are unavailable.",
1574
+ "Multiple-choice questions: MCP ask_user (composer picker, any mode). Explain options in chat first, then wait for answers."
1575
+ ].join(" ");
1576
+ }
1547
1577
  var FILES_BY_AGENT = {
1548
1578
  claude: [
1549
1579
  "CLAUDE.md",
@@ -1738,16 +1768,6 @@ async function captureLoginEnv() {
1738
1768
  cachedLoginEnv = { ...process.env };
1739
1769
  return { ...cachedLoginEnv };
1740
1770
  }
1741
- var NESTED_ELECTRON_ENV_PREFIXES = ["ELECTRON_", "CHROME_"];
1742
- function stripNestedElectronEnv(env) {
1743
- const out = { ...env };
1744
- for (const key of Object.keys(out)) {
1745
- if (NESTED_ELECTRON_ENV_PREFIXES.some((prefix) => key.startsWith(prefix))) {
1746
- delete out[key];
1747
- }
1748
- }
1749
- return out;
1750
- }
1751
1771
  function buildWorkspaceScriptEnv(opts, baseEnv) {
1752
1772
  const env = stripNestedElectronEnv({
1753
1773
  ...baseEnv ?? process.env
@@ -3813,7 +3833,7 @@ async function createThread(input, _onSetupLine) {
3813
3833
  return readThread(thread.id) ?? thread;
3814
3834
  }
3815
3835
  async function listLinearIssues(agent, repoPath) {
3816
- const { getAdapter: getAdapter2 } = await import("./agents-UQ7D6U6L.js");
3836
+ const { getAdapter: getAdapter2 } = await import("./agents-JFXM66QA.js");
3817
3837
  await requireAgent(agent, { requireLinear: true });
3818
3838
  const adapter = getAdapter2(agent);
3819
3839
  if (!adapter.listLinearIssues) {
@@ -4356,7 +4376,7 @@ async function adoptThread(input) {
4356
4376
  messages: input.messages ?? []
4357
4377
  });
4358
4378
  writeThread(thread);
4359
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-QLRCOXAY.js");
4379
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-SRITISKA.js");
4360
4380
  await ensureWorkspace2(repoPath);
4361
4381
  return thread;
4362
4382
  }
@@ -5489,6 +5509,10 @@ File: src/client/frontends/desktop/core/UserData.ts
5489
5509
 
5490
5510
  **Approve** \u2014 Diff is scoped, behavior looks correct, and there are no blocking issues. Safe to merge.
5491
5511
  </example>
5512
+
5513
+ ## Growing the rules
5514
+
5515
+ If a blocking issue is a missing or ambiguous repo rule that will recur, say so and propose one sentence for \`.sideboard/review.md\` or a \`.claude/skills/<name>/SKILL.md\`. Do not only patch this diff when the same miss will happen again. New skills go under \`.claude/skills\` (Claude Code / attach) \u2014 not \`.sideboard/skills\`.
5492
5516
  `;
5493
5517
 
5494
5518
  // src/review/request-review.ts
@@ -5873,7 +5897,7 @@ var Orchestrator = class {
5873
5897
  orphans: orphans.map((o) => ({ path: o.path, repoPath: o.repoPath }))
5874
5898
  });
5875
5899
  }
5876
- const { autoCleanupOrphansEnabled: autoCleanupOrphansEnabled2 } = await import("./app-settings-6IOQYGBK.js");
5900
+ const { autoCleanupOrphansEnabled: autoCleanupOrphansEnabled2 } = await import("./app-settings-K6RFCRF6.js");
5877
5901
  if (autoCleanupOrphansEnabled2() && shouldRunWorktreeCleanup() && orphans.length > 0) {
5878
5902
  await cleanupOrphanWorktrees({ repoPaths });
5879
5903
  }
@@ -6030,7 +6054,7 @@ var Orchestrator = class {
6030
6054
  }
6031
6055
  async finishCreateThread(threadId, prompt) {
6032
6056
  await this.runSetupAfterCreate(threadId);
6033
- const { autoRunAfterSetupEnabled: autoRunAfterSetupEnabled2 } = await import("./app-settings-6IOQYGBK.js");
6057
+ const { autoRunAfterSetupEnabled: autoRunAfterSetupEnabled2 } = await import("./app-settings-K6RFCRF6.js");
6034
6058
  if (autoRunAfterSetupEnabled2()) {
6035
6059
  try {
6036
6060
  await this.startDev(threadId);
@@ -6272,14 +6296,7 @@ var Orchestrator = class {
6272
6296
  SLACK_REPLY_FORMATTING
6273
6297
  ].join("\n") : null
6274
6298
  ].filter(Boolean).join("\n") : null;
6275
- const artifactReminder = thread.agent !== "brightsy" ? [
6276
- "Sideboard side column (important):",
6277
- "There is no claude.ai Artifact tool here \u2014 that is normal.",
6278
- "HTML/SVG/markdown: ```html fence or MCP present_artifact.",
6279
- "CMS forms/tables: MCP present_schema (Brightsy resource_id or inline schema+schemaUi).",
6280
- "Files column: MCP present_files (brightsy account storage or memory).",
6281
- "Do not say artifacts/CMS UI are unavailable."
6282
- ].join(" ") : null;
6299
+ const artifactReminder = thread.agent !== "brightsy" ? formatUiReminder() : null;
6283
6300
  const worktreeReminder = thread.agent !== "brightsy" && !isOrchestratorThread(thread) ? formatWorktreeReminder() : null;
6284
6301
  const slackReplyContext = formatSlackRepliesForTurn(
6285
6302
  pendingSlackExternalReplies(thread.messages)
@@ -6308,7 +6325,7 @@ var Orchestrator = class {
6308
6325
  }
6309
6326
  const isBrightsy = fresh.agent === "brightsy";
6310
6327
  const isOrchestration = isOrchestratorThread(fresh);
6311
- const { autoRenameBranchEnabled: autoRenameBranchEnabled2, getGithubGitAuthMode: getGithubGitAuthMode2 } = await import("./app-settings-6IOQYGBK.js");
6328
+ const { autoRenameBranchEnabled: autoRenameBranchEnabled2, getGithubGitAuthMode: getGithubGitAuthMode2 } = await import("./app-settings-K6RFCRF6.js");
6312
6329
  const gitAuthMode = getGithubGitAuthMode2();
6313
6330
  const worktreeDirective = isBrightsy || isOrchestration ? null : formatWorktreeDirective(fresh, {
6314
6331
  githubSlug: await resolveGithubRepoSlug(fresh.worktreePath).catch(
@@ -6418,7 +6435,7 @@ var Orchestrator = class {
6418
6435
  }
6419
6436
  let lastStderr = summarizeTurnStderr(stderrTail);
6420
6437
  let detail = lastStderr || (exitCode !== 0 ? fallbackTurnFailDetail(assistantText) : "");
6421
- if (exitCode !== 0 && !assistantText && parts.length === 0 && !this.stoppedTurns.has(threadId) && looksLikeInvalidAgentSession(detail) && this.requireThread(threadId).sessionId && this.requireThread(threadId).agent !== "cursor" && this.requireThread(threadId).agent !== "brightsy") {
6438
+ if (exitCode !== 0 && !assistantText && parts.length === 0 && !this.stoppedTurns.has(threadId) && looksLikeInvalidAgentSession(detail) && this.requireThread(threadId).sessionId && this.requireThread(threadId).agent !== "brightsy") {
6422
6439
  updateThread(threadId, { sessionId: null });
6423
6440
  pushTurnStderr(
6424
6441
  stderrTail,
@@ -6973,7 +6990,9 @@ var Orchestrator = class {
6973
6990
  reviewDecision: null,
6974
6991
  baseRefName: "",
6975
6992
  headRefName: "",
6976
- isInMergeQueue: false
6993
+ isInMergeQueue: false,
6994
+ mergeable: null,
6995
+ mergeStateStatus: null
6977
6996
  };
6978
6997
  await this.persistPrMetaAndMaybeArchive(thread, metaLike);
6979
6998
  return { url: metaLike.url, state };
@@ -7023,7 +7042,7 @@ var Orchestrator = class {
7023
7042
  updateThread(thread.id, { title: meta.title });
7024
7043
  }
7025
7044
  }
7026
- const { autoArchiveOnMergeEnabled: autoArchiveOnMergeEnabled2 } = await import("./app-settings-6IOQYGBK.js");
7045
+ const { autoArchiveOnMergeEnabled: autoArchiveOnMergeEnabled2 } = await import("./app-settings-K6RFCRF6.js");
7027
7046
  const latest = this.requireThread(thread.id);
7028
7047
  if (!shouldAutoArchiveOnPrMerge({
7029
7048
  previousPrState: prevState || null,
@@ -7311,7 +7330,7 @@ var Orchestrator = class {
7311
7330
  this.emit({ type: "status_changed", threadId: archived.id, status: "archived" });
7312
7331
  if (thread.repoPath && !isGlobalRepoPath(thread.repoPath)) {
7313
7332
  try {
7314
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-QLRCOXAY.js");
7333
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-SRITISKA.js");
7315
7334
  await ensureWorkspace2(thread.repoPath);
7316
7335
  } catch {
7317
7336
  }
@@ -7333,7 +7352,7 @@ var Orchestrator = class {
7333
7352
  await runArchiveScript(thread.repoPath, thread.worktreePath);
7334
7353
  } catch {
7335
7354
  }
7336
- const { deleteBranchOnPurgeEnabled: deleteBranchOnPurgeEnabled2 } = await import("./app-settings-6IOQYGBK.js");
7355
+ const { deleteBranchOnPurgeEnabled: deleteBranchOnPurgeEnabled2 } = await import("./app-settings-K6RFCRF6.js");
7337
7356
  const deleteBranch = opts?.deleteBranch ?? deleteBranchOnPurgeEnabled2();
7338
7357
  await removeWorktree(thread.repoPath, thread.worktreePath, {
7339
7358
  deleteBranch: deleteBranch ? thread.branchName : void 0
@@ -7354,7 +7373,7 @@ var Orchestrator = class {
7354
7373
  return restored2;
7355
7374
  }
7356
7375
  if (!existsSync15(thread.worktreePath)) {
7357
- const { createThreadWorktree: createThreadWorktree2 } = await import("./worktree-5VLLFI5W.js");
7376
+ const { createThreadWorktree: createThreadWorktree2 } = await import("./worktree-SGZVAWOQ.js");
7358
7377
  const { execa: execa6 } = await import("execa");
7359
7378
  const slug = thread.worktreePath.split("/").pop();
7360
7379
  const dest = thread.worktreePath;
@@ -7463,7 +7482,7 @@ async function startOrchestration(opts) {
7463
7482
  sourceRef: "default",
7464
7483
  ...createOpts
7465
7484
  }).catch(async () => {
7466
- const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-5VLLFI5W.js");
7485
+ const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-SGZVAWOQ.js");
7467
7486
  const repo = await resolveRepoRoot2(repoPath);
7468
7487
  const def = await resolveDefaultBranch2(repo);
7469
7488
  return createThread({
@@ -8215,7 +8234,7 @@ function withTimeout(promise, ms, label) {
8215
8234
  async function startMcpServer() {
8216
8235
  const orch = getOrchestrator();
8217
8236
  try {
8218
- const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-6IOQYGBK.js");
8237
+ const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-K6RFCRF6.js");
8219
8238
  orch.setMaxConcurrent(maxConcurrentAgents2());
8220
8239
  } catch {
8221
8240
  }
@@ -8320,7 +8339,7 @@ async function startMcpServer() {
8320
8339
  );
8321
8340
  server.tool(
8322
8341
  "ask_user",
8323
- "Ask the user clarifying multiple-choice questions in Sideboard\u2019s composer (plan mode). Before calling, write a short chat message explaining the decision and what each option means. Include a description on every option. Use for approach forks and requirements \u2014 not for \u201Cis the plan ready?\u201D. After calling, stop and wait for their next message with answers.",
8342
+ "Ask the user clarifying multiple-choice questions in Sideboard\u2019s composer (any mode \u2014 not only Plan). Before calling, write a short chat message explaining the decision and what each option means. Include a description on every option. Use when the user should pick from predefined options (approach forks, requirements, which API) \u2014 not for \u201Cis the plan ready?\u201D. After calling, stop and wait for their next message with answers.",
8324
8343
  {
8325
8344
  questions: z3.array(
8326
8345
  z3.object({
@@ -8425,7 +8444,7 @@ async function startMcpServer() {
8425
8444
  registerLinearTools(server);
8426
8445
  if (sideboardMcpProfile() !== "worktree") {
8427
8446
  const { getCaffeinateHold: getCaffeinateHold2, setCaffeinateHold: setCaffeinateHold2 } = await import("./caffeinate-hold-EAZNWJBE.js");
8428
- const { resolveNewThreadOptions: resolveNewThreadOptions2, resolveThreadDefaults: resolveThreadDefaults2 } = await import("./app-settings-6IOQYGBK.js");
8447
+ const { resolveNewThreadOptions: resolveNewThreadOptions2, resolveThreadDefaults: resolveThreadDefaults2 } = await import("./app-settings-K6RFCRF6.js");
8429
8448
  const accountDefaults = resolveThreadDefaults2();
8430
8449
  const accountDefaultsHint = `Account defaults: agent=${accountDefaults.agent}, model=${accountDefaults.model?.trim() || "Auto"}, effort=${accountDefaults.effort}`;
8431
8450
  server.tool(
@@ -11172,6 +11191,7 @@ export {
11172
11191
  REVIEW_REQUEST_NAME,
11173
11192
  REVIEW_REQUEST_PATH,
11174
11193
  REVIEW_REQUEST_PREFILL,
11194
+ REVIEW_REQUEST_TEMPLATE,
11175
11195
  SIDEBOARD_FORCE_STOP,
11176
11196
  SIDEBOARD_MCP_ALLOWED_TOOLS,
11177
11197
  SIDEBOARD_MCP_PROFILE_ENV,
@@ -11320,9 +11340,11 @@ export {
11320
11340
  formatGhLandError,
11321
11341
  formatGitAuthModeDirective,
11322
11342
  formatIpcInvokeError,
11343
+ formatMergePrError,
11323
11344
  formatMessagesAsTranscript,
11324
11345
  formatPlanQuestionAnswers,
11325
11346
  formatPlanQuestionsForChat,
11347
+ formatProcessGuideDirective,
11326
11348
  formatRateLimitResetHint,
11327
11349
  formatRenameBranchDirective,
11328
11350
  formatSlackExternalReplyPrompt,
@@ -11330,6 +11352,7 @@ export {
11330
11352
  formatSlackRepliesForTurn,
11331
11353
  formatSlackSignedReply,
11332
11354
  formatTranscriptMarkdown,
11355
+ formatUiReminder,
11333
11356
  formatWorkspaceInventory,
11334
11357
  formatWorktreeDirective,
11335
11358
  formatWorktreeReminder,
@@ -11404,6 +11427,7 @@ export {
11404
11427
  isOrchestratorThread,
11405
11428
  isPidAlive,
11406
11429
  isPlaceholderBranch,
11430
+ isPrNotMergeableError,
11407
11431
  isPresentPlanToolName,
11408
11432
  isSessionQuotaLimit,
11409
11433
  isSideboardScratchPath,