@sideboard-ai/core 0.1.107 → 0.1.109

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/cursor-runner.js +2 -2
  2. package/dist/{agents-T4RHL5UX.js → agents-XB332VUJ.js} +5 -5
  3. package/dist/{agents-4XQANGFO.js → agents-YIMHDI46.js} +7 -7
  4. package/dist/{app-settings-2WH6DVOW.js → app-settings-EBCVMFF6.js} +1 -1
  5. package/dist/{app-settings-6AXBWM3K.js → app-settings-IYSSVZHH.js} +2 -2
  6. package/dist/{chunk-7ZTQHC2Q.js → chunk-4LKD3PGO.js} +1 -1
  7. package/dist/{chunk-TLPJHLLM.js → chunk-4TR3HZFT.js} +1 -1
  8. package/dist/{chunk-SMWVSSE5.js → chunk-756EO4GK.js} +3 -3
  9. package/dist/{chunk-XOYH3OMI.js → chunk-AY2EQI2P.js} +16 -13
  10. package/dist/{chunk-PZVA2VDF.js → chunk-EW7COXYE.js} +1 -1
  11. package/dist/{chunk-VTTTV2LM.js → chunk-FBV6NK62.js} +2 -2
  12. package/dist/{chunk-GYFNFU62.js → chunk-I2OJ2YSP.js} +8 -16
  13. package/dist/{chunk-6JJTMI7G.js → chunk-JVIW55KT.js} +1 -1
  14. package/dist/{chunk-6HRR4T4P.js → chunk-KKHDPV45.js} +15 -14
  15. package/dist/{chunk-XEFHG6VG.js → chunk-LTPX5N6K.js} +1310 -1265
  16. package/dist/{chunk-EX4NZN3O.js → chunk-NE4TOOKS.js} +1 -1
  17. package/dist/{chunk-LRO7YVLJ.js → chunk-OQDIYVDD.js} +2 -2
  18. package/dist/{chunk-3SIFRHJ3.js → chunk-Q6B3NRCT.js} +1457 -1431
  19. package/dist/{chunk-THXSFETX.js → chunk-TROJ3PVH.js} +3 -3
  20. package/dist/{chunk-5XUKY2JY.js → chunk-VRTKGKUW.js} +8 -16
  21. package/dist/{chunk-HUKCGRAT.js → chunk-WD2TARQS.js} +7 -2
  22. package/dist/{coordinator-prompt-4TUQUEHY.js → coordinator-prompt-JKOU6BWV.js} +4 -4
  23. package/dist/{coordinator-prompt-YQWRXCPX.js → coordinator-prompt-V66BYTUV.js} +3 -3
  24. package/dist/{global-workspace-V6TMECDU.js → global-workspace-NCTBE7G7.js} +5 -5
  25. package/dist/{global-workspace-H37LFFXI.js → global-workspace-WBQWQQQY.js} +4 -4
  26. package/dist/index.cjs +1697 -1661
  27. package/dist/index.d.cts +65 -24
  28. package/dist/index.d.ts +65 -24
  29. package/dist/index.js +107 -85
  30. package/dist/mcp/run-stdio.cjs +1660 -1619
  31. package/dist/mcp/run-stdio.js +82 -79
  32. package/dist/{orchestrator-DEHSKERK.js → orchestrator-6W7EKSPO.js} +9 -9
  33. package/dist/{orchestrator-2P7DX44Q.js → orchestrator-JVGVPKLI.js} +7 -7
  34. package/dist/{workspaces-JU3P6FHB.js → workspaces-I3554R3F.js} +5 -5
  35. package/dist/{workspaces-UPEVANU4.js → workspaces-SUBEDSGB.js} +6 -6
  36. package/dist/{worktree-NR5YJG2E.js → worktree-2UWO7VEK.js} +3 -3
  37. package/dist/{worktree-6MFKE465.js → worktree-7H6HB6GW.js} +2 -2
  38. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -12,6 +12,9 @@ import {
12
12
  REVIEW_REQUEST_PATH,
13
13
  REVIEW_REQUEST_PREFILL,
14
14
  REVIEW_REQUEST_TEMPLATE,
15
+ REVIEW_SKILL_NAME,
16
+ REVIEW_SKILL_PATH,
17
+ SESSION_RESET_OCCUPANCY_TOKENS,
15
18
  SlackApiError,
16
19
  addStackLayerFromThread,
17
20
  adoptThread,
@@ -20,6 +23,7 @@ import {
20
23
  allocatePortRange,
21
24
  applyAgentEvent,
22
25
  applyCompaction,
26
+ applyPromptCacheTtlEnv,
23
27
  applyThreadIntoMain,
24
28
  armSchedules,
25
29
  attachmentFromAbsolutePath,
@@ -51,6 +55,7 @@ import {
51
55
  discoverSkills,
52
56
  dismissSlackReplyBadge,
53
57
  ensureReviewRequestFile,
58
+ ensureReviewSkillFile,
54
59
  estimateMessageChars,
55
60
  estimateThreadChars,
56
61
  expandComposerPrompt,
@@ -96,6 +101,7 @@ import {
96
101
  isPidAlive,
97
102
  isSlackExternalReplyPrompt,
98
103
  isThisProcessDesktopHost,
104
+ lastRequestOccupancy,
99
105
  listBranchCommits,
100
106
  listConductorWorkspaces,
101
107
  listLinearIssues,
@@ -142,6 +148,7 @@ import {
142
148
  setSlackReplyTarget,
143
149
  shouldCompactContext,
144
150
  shouldRefreshReviewRequestTemplate,
151
+ shouldResetSessionForOccupancy,
145
152
  shouldRunWorktreeCleanup,
146
153
  slackApi,
147
154
  slackArchiveUrl,
@@ -167,8 +174,9 @@ import {
167
174
  waitForPidExit,
168
175
  withAgentInstructions,
169
176
  worktreeCleanupSettings,
177
+ wrapReviewSkillMarkdown,
170
178
  writeWorktreeFile
171
- } from "./chunk-3SIFRHJ3.js";
179
+ } from "./chunk-Q6B3NRCT.js";
172
180
  import {
173
181
  BRIGHTSY_MCP_ALLOWED_TOOLS,
174
182
  CLAUDE_MODEL_CATALOG,
@@ -176,6 +184,7 @@ import {
176
184
  PLAN_MODE_INSTRUCTION,
177
185
  SIDEBOARD_MCP_ALLOWED_TOOLS,
178
186
  SIDEBOARD_MCP_PROFILE_ENV,
187
+ WORKTREE_MCP_TOOLS,
179
188
  allAdapters,
180
189
  applyTurnUsage,
181
190
  brightsyAdapter,
@@ -228,7 +237,7 @@ import {
228
237
  threadRequestsBrightsyMcp,
229
238
  totalTokens,
230
239
  writeInjectedMcpConfig
231
- } from "./chunk-6HRR4T4P.js";
240
+ } from "./chunk-KKHDPV45.js";
232
241
  import {
233
242
  brightsyConfigPath,
234
243
  brightsyMcpServerName,
@@ -247,7 +256,7 @@ import {
247
256
  listWorkspaces,
248
257
  removeWorkspace,
249
258
  syncWorkspacesFromThreads
250
- } from "./chunk-VTTTV2LM.js";
259
+ } from "./chunk-FBV6NK62.js";
251
260
  import {
252
261
  CLOUD_COORDINATOR_BUSY_REPLY,
253
262
  CLOUD_COORDINATOR_STOPPED_REPLY,
@@ -275,7 +284,7 @@ import {
275
284
  parseForceStopMessage,
276
285
  slackCoordinatorSourceRef,
277
286
  takenTeamSlugsForOrchestration
278
- } from "./chunk-SMWVSSE5.js";
287
+ } from "./chunk-756EO4GK.js";
279
288
  import {
280
289
  COORDINATOR_TOOL_PLAYBOOK,
281
290
  SLACK_REPLY_FORMATTING,
@@ -284,7 +293,7 @@ import {
284
293
  enrichWorkspacesWithGithub,
285
294
  ensureGlobalCoordinatorCwd,
286
295
  formatWorkspaceInventory
287
- } from "./chunk-GYFNFU62.js";
296
+ } from "./chunk-I2OJ2YSP.js";
288
297
  import {
289
298
  LEGACY_PLAN_FILE_REL,
290
299
  PLAN_FILE_NAME,
@@ -300,7 +309,7 @@ import "./chunk-MMI4RJ5I.js";
300
309
  import {
301
310
  cursorSdkMessageToEvents,
302
311
  parseCursorRunnerLine
303
- } from "./chunk-HUKCGRAT.js";
312
+ } from "./chunk-WD2TARQS.js";
304
313
  import {
305
314
  caffeinateHoldPath,
306
315
  getCaffeinateHold,
@@ -388,7 +397,7 @@ import {
388
397
  worktreeDisplayLabel,
389
398
  worktreeDisplayLabelForGroup,
390
399
  worktreeNameFromPath
391
- } from "./chunk-PZVA2VDF.js";
400
+ } from "./chunk-EW7COXYE.js";
392
401
  import {
393
402
  ATTACHMENTS_DIR,
394
403
  LEGACY_ATTACHMENTS_DIR,
@@ -455,10 +464,10 @@ import {
455
464
  updateDefaultsSettings,
456
465
  updateIntegrationsSettings,
457
466
  updateOpencodeSettings
458
- } from "./chunk-7ZTQHC2Q.js";
467
+ } from "./chunk-4LKD3PGO.js";
459
468
  import {
460
469
  stripNestedElectronEnv
461
- } from "./chunk-TLPJHLLM.js";
470
+ } from "./chunk-4TR3HZFT.js";
462
471
  import "./chunk-JT7R45JB.js";
463
472
  import {
464
473
  appendMessage,
@@ -2225,7 +2234,7 @@ async function startMcpServer() {
2225
2234
  );
2226
2235
  }
2227
2236
  try {
2228
- const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-6AXBWM3K.js");
2237
+ const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-IYSSVZHH.js");
2229
2238
  orch.setMaxConcurrent(maxConcurrentAgents2());
2230
2239
  } catch {
2231
2240
  }
@@ -2241,74 +2250,77 @@ async function startMcpServer() {
2241
2250
  name: "sideboard",
2242
2251
  version: "0.1.0"
2243
2252
  });
2244
- server.tool(
2245
- "list_workspaces",
2246
- "List registered Sideboard workspaces (repos). Each line is name, path, and github:owner/repo when resolvable \u2014 use path as repoPath for list_branches/list_prs/list_issues/create_thread.",
2247
- {},
2248
- async () => {
2249
- const workspaces = orch.listWorkspaces();
2250
- const lines = await Promise.all(
2251
- workspaces.map(async (w) => {
2252
- const slug = await resolveGithubRepoSlug(w.path).catch(() => null);
2253
- return slug ? `${w.name} ${w.path} github:${slug}` : `${w.name} ${w.path}`;
2254
- })
2255
- );
2256
- return {
2257
- content: [
2258
- { type: "text", text: lines.join("\n") || "(no workspaces)" }
2259
- ]
2260
- };
2261
- }
2262
- );
2263
- server.tool(
2264
- "list_threads",
2265
- "List Sideboard threads across all workspaces (one summary line each \u2014 token-frugal). Each line ends with sideboard://thread/<id> \u2014 use that URL in markdown links so the UI can open the chat.",
2266
- {},
2267
- async () => {
2268
- const threads = orch.getThreads(true);
2269
- const lines = threads.map((t) => {
2270
- const repo = t.repoPath === GLOBAL_WORKSPACE_ID ? "Orchestration" : basename(t.repoPath) || t.repoPath;
2253
+ const worktreeProfile = sideboardMcpProfile() === "worktree";
2254
+ if (!worktreeProfile) {
2255
+ server.tool(
2256
+ "list_workspaces",
2257
+ "List registered Sideboard workspaces (repos). Each line is name, path, and github:owner/repo when resolvable \u2014 use path as repoPath for list_branches/list_prs/list_issues/create_thread.",
2258
+ {},
2259
+ async () => {
2260
+ const workspaces = orch.listWorkspaces();
2261
+ const lines = await Promise.all(
2262
+ workspaces.map(async (w) => {
2263
+ const slug = await resolveGithubRepoSlug(w.path).catch(() => null);
2264
+ return slug ? `${w.name} ${w.path} github:${slug}` : `${w.name} ${w.path}`;
2265
+ })
2266
+ );
2267
+ return {
2268
+ content: [
2269
+ { type: "text", text: lines.join("\n") || "(no workspaces)" }
2270
+ ]
2271
+ };
2272
+ }
2273
+ );
2274
+ server.tool(
2275
+ "list_threads",
2276
+ "List Sideboard threads across all workspaces (one summary line each \u2014 token-frugal). Each line ends with sideboard://thread/<id> \u2014 use that URL in markdown links so the UI can open the chat.",
2277
+ {},
2278
+ async () => {
2279
+ const threads = orch.getThreads(true);
2280
+ const lines = threads.map((t) => {
2281
+ const repo = t.repoPath === GLOBAL_WORKSPACE_ID ? "Orchestration" : basename(t.repoPath) || t.repoPath;
2282
+ const live = t.status === "running" || t.status === "queued" ? readTurnLive(t.id) : null;
2283
+ const progress = live?.summary ? ` ${live.summary}` : "";
2284
+ return `${t.id.slice(0, 8)} ${t.status.padEnd(9)} ${t.agent.padEnd(8)} ${repo} ${t.sourceType}:${t.sourceRef} ${t.title} sideboard://thread/${t.id}${t.devPort ? ` http://localhost:${t.devPort}` : ""}${progress}`;
2285
+ });
2286
+ return {
2287
+ content: [{ type: "text", text: lines.join("\n") || "(no threads)" }]
2288
+ };
2289
+ }
2290
+ );
2291
+ server.tool(
2292
+ "get_thread",
2293
+ "Get a compact thread summary by id/ref. While running, includes progress (last tool/thinking) and lastActivityAt.",
2294
+ { ref: z4.string() },
2295
+ async ({ ref }) => {
2296
+ const t = orch.getThread(ref);
2297
+ if (!t) {
2298
+ return { content: [{ type: "text", text: `Thread not found: ${ref}` }], isError: true };
2299
+ }
2271
2300
  const live = t.status === "running" || t.status === "queued" ? readTurnLive(t.id) : null;
2272
- const progress = live?.summary ? ` ${live.summary}` : "";
2273
- return `${t.id.slice(0, 8)} ${t.status.padEnd(9)} ${t.agent.padEnd(8)} ${repo} ${t.sourceType}:${t.sourceRef} ${t.title} sideboard://thread/${t.id}${t.devPort ? ` http://localhost:${t.devPort}` : ""}${progress}`;
2274
- });
2275
- return {
2276
- content: [{ type: "text", text: lines.join("\n") || "(no threads)" }]
2277
- };
2278
- }
2279
- );
2280
- server.tool(
2281
- "get_thread",
2282
- "Get a compact thread summary by id/ref. While running, includes progress (last tool/thinking) and lastActivityAt.",
2283
- { ref: z4.string() },
2284
- async ({ ref }) => {
2285
- const t = orch.getThread(ref);
2286
- if (!t) {
2287
- return { content: [{ type: "text", text: `Thread not found: ${ref}` }], isError: true };
2301
+ const summary = {
2302
+ id: t.id,
2303
+ title: t.title,
2304
+ status: t.status,
2305
+ agent: t.agent,
2306
+ sourceType: t.sourceType,
2307
+ sourceRef: t.sourceRef,
2308
+ branchName: t.branchName,
2309
+ worktreePath: t.worktreePath,
2310
+ sessionId: t.sessionId,
2311
+ queueLength: t.queue.length,
2312
+ messageCount: t.messages.length,
2313
+ devPort: t.devPort,
2314
+ prUrl: t.prUrl,
2315
+ lastError: t.lastError ?? null,
2316
+ stillRunning: t.status === "running" || t.status === "queued",
2317
+ progress: live?.summary ?? null,
2318
+ lastActivityAt: live?.updatedAt ?? null
2319
+ };
2320
+ return { content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] };
2288
2321
  }
2289
- const live = t.status === "running" || t.status === "queued" ? readTurnLive(t.id) : null;
2290
- const summary = {
2291
- id: t.id,
2292
- title: t.title,
2293
- status: t.status,
2294
- agent: t.agent,
2295
- sourceType: t.sourceType,
2296
- sourceRef: t.sourceRef,
2297
- branchName: t.branchName,
2298
- worktreePath: t.worktreePath,
2299
- sessionId: t.sessionId,
2300
- queueLength: t.queue.length,
2301
- messageCount: t.messages.length,
2302
- devPort: t.devPort,
2303
- prUrl: t.prUrl,
2304
- lastError: t.lastError ?? null,
2305
- stillRunning: t.status === "running" || t.status === "queued",
2306
- progress: live?.summary ?? null,
2307
- lastActivityAt: live?.updatedAt ?? null
2308
- };
2309
- return { content: [{ type: "text", text: JSON.stringify(summary, null, 2) }] };
2310
- }
2311
- );
2322
+ );
2323
+ }
2312
2324
  server.tool(
2313
2325
  "present_artifact",
2314
2326
  "Show an HTML, SVG, markdown, or React document in Sideboard\u2019s Claude-style side column (desktop). Use instead of claude.ai\u2019s artifact tool \u2014 pass the full document content. Prefer type=html for interactive pages. For type=react, pass a single component module that `export default`s a component (JSX/TSX ok) \u2014 Sideboard bootstraps React/ReactDOM/Babel and renders it; only `react`/`react-dom` imports are available, no other npm packages.",
@@ -2437,12 +2449,12 @@ async function startMcpServer() {
2437
2449
  return { content: [{ type: "text", text: JSON.stringify(payload) }] };
2438
2450
  }
2439
2451
  );
2440
- registerSlackTools(server);
2441
- registerLinearTools(server);
2442
- if (sideboardMcpProfile() !== "worktree") {
2452
+ if (!worktreeProfile) {
2453
+ registerSlackTools(server);
2454
+ registerLinearTools(server);
2443
2455
  registerScheduleTools(server);
2444
2456
  const { getCaffeinateHold: getCaffeinateHold2, setCaffeinateHold: setCaffeinateHold2 } = await import("./caffeinate-hold-X3JNPR42.js");
2445
- const { resolveNewThreadOptions: resolveNewThreadOptions2, resolveThreadDefaults: resolveThreadDefaults2 } = await import("./app-settings-6AXBWM3K.js");
2457
+ const { resolveNewThreadOptions: resolveNewThreadOptions2, resolveThreadDefaults: resolveThreadDefaults2 } = await import("./app-settings-IYSSVZHH.js");
2446
2458
  const accountDefaults = resolveThreadDefaults2();
2447
2459
  const accountDefaultsHint = `Account defaults: agent=${accountDefaults.agent}, model=${accountDefaults.model?.trim() || "Auto"}, effort=${accountDefaults.effort}`;
2448
2460
  server.tool(
@@ -2793,7 +2805,7 @@ async function startMcpServer() {
2793
2805
  );
2794
2806
  server.tool(
2795
2807
  "request_review",
2796
- 'Start a merge-readiness Review on a worktree agent thread (same as the desktop Review button). Opens a new Review chat tab, attaches .sideboard/review.md when present (else local Review request.md / stock template), and sends "Review changes in this workspace." Expect Approve / Approve with nits / Request changes / Needs more information. Pass a worktree thread ref \u2014 not the orchestrator. Then wait_for_turn (loop while stillRunning) / get_turn_result on the returned review tab id.',
2808
+ 'Start a merge-readiness Review on a worktree agent thread (same as the desktop Review button). Opens a new Review chat tab, attaches .claude/skills/review/SKILL.md when present (else seeds that skill from .sideboard/review.md or the stock template), and sends "Review changes in this workspace." Expect Approve / Approve with nits / Request changes / Needs more information. Pass a worktree thread ref \u2014 not the orchestrator. Then wait_for_turn (loop while stillRunning) / get_turn_result on the returned review tab id.',
2797
2809
  { ref: z4.string().describe("Worktree thread id/ref to review") },
2798
2810
  async ({ ref }) => {
2799
2811
  try {
@@ -4534,10 +4546,11 @@ function slackReplyThreadTs(msg) {
4534
4546
  }
4535
4547
  var SLACK_PROGRESS_DELAY_MS = 2e4;
4536
4548
  var SLACK_PROGRESS_EDIT_MS = 15e3;
4549
+ var SLACK_PROGRESS_PLACEHOLDER = "Thinking\u2026";
4537
4550
  function formatSlackWorkingText(summary) {
4538
4551
  const line = (summary ?? "").trim();
4539
- if (!line || /^working/i.test(line)) return "Working\u2026";
4540
- return `Working\u2026 ${line}`;
4552
+ if (!line || /^(working|thinking)/i.test(line)) return SLACK_PROGRESS_PLACEHOLDER;
4553
+ return line;
4541
4554
  }
4542
4555
  var SLACK_SEEN_REACTION = "eyes";
4543
4556
  function writeTokenForTeam(teamId) {
@@ -4673,7 +4686,7 @@ function startSlackTurnProgress(msg, threadId, opts) {
4673
4686
  };
4674
4687
  const postWorking = async () => {
4675
4688
  if (!stillLive()) return;
4676
- const summary = readTurnLive(threadId())?.summary ?? "Working\u2026";
4689
+ const summary = readTurnLive(threadId())?.summary ?? SLACK_PROGRESS_PLACEHOLDER;
4677
4690
  const body = formatSlackWorkingText(summary);
4678
4691
  try {
4679
4692
  const posted = await postSlackText(target, signForThisMac(body), opts);
@@ -4691,7 +4704,7 @@ function startSlackTurnProgress(msg, threadId, opts) {
4691
4704
  };
4692
4705
  const editWorking = async () => {
4693
4706
  if (!postedTs || !stillLive()) return;
4694
- const summary = readTurnLive(threadId())?.summary ?? "Working\u2026";
4707
+ const summary = readTurnLive(threadId())?.summary ?? SLACK_PROGRESS_PLACEHOLDER;
4695
4708
  const body = formatSlackWorkingText(summary);
4696
4709
  if (body === lastBody) return;
4697
4710
  lastBody = body;
@@ -5594,6 +5607,9 @@ export {
5594
5607
  REVIEW_REQUEST_PATH,
5595
5608
  REVIEW_REQUEST_PREFILL,
5596
5609
  REVIEW_REQUEST_TEMPLATE,
5610
+ REVIEW_SKILL_NAME,
5611
+ REVIEW_SKILL_PATH,
5612
+ SESSION_RESET_OCCUPANCY_TOKENS,
5597
5613
  SIDEBOARD_FORCE_STOP,
5598
5614
  SIDEBOARD_MCP_ALLOWED_TOOLS,
5599
5615
  SIDEBOARD_MCP_PROFILE_ENV,
@@ -5608,6 +5624,7 @@ export {
5608
5624
  SlackOAuthCancelledError,
5609
5625
  SlackRelayHub,
5610
5626
  THINKING_EFFORTS,
5627
+ WORKTREE_MCP_TOOLS,
5611
5628
  ackSlackInboundSeen,
5612
5629
  addPrStackLayer,
5613
5630
  addStackLayerFromThread,
@@ -5627,6 +5644,7 @@ export {
5627
5644
  applyAppEnvironment,
5628
5645
  applyCompaction,
5629
5646
  applyGithubGitAuthEnv,
5647
+ applyPromptCacheTtlEnv,
5630
5648
  applyThreadIntoMain,
5631
5649
  applyTurnUsage,
5632
5650
  armSchedules,
@@ -5726,6 +5744,7 @@ export {
5726
5744
  ensureGhPreferOrigin,
5727
5745
  ensureGlobalCoordinatorCwd,
5728
5746
  ensureReviewRequestFile,
5747
+ ensureReviewSkillFile,
5729
5748
  ensureSlackCoordinator,
5730
5749
  ensureSlackDeviceIdentity,
5731
5750
  ensureWorkspace,
@@ -5864,6 +5883,7 @@ export {
5864
5883
  isThisProcessDesktopHost,
5865
5884
  isThreadCaffeinated,
5866
5885
  isWorkspaceScratchPath,
5886
+ lastRequestOccupancy,
5867
5887
  linearAuthorizationHeader,
5868
5888
  linearGraphql,
5869
5889
  linearOAuthAuthorizeUrl,
@@ -6031,6 +6051,7 @@ export {
6031
6051
  shouldCompactContext,
6032
6052
  shouldInjectBrightsyMcp,
6033
6053
  shouldRefreshReviewRequestTemplate,
6054
+ shouldResetSessionForOccupancy,
6034
6055
  shouldRunWorktreeCleanup,
6035
6056
  sideboardHomeDir,
6036
6057
  sideboardMcpProfile,
@@ -6108,6 +6129,7 @@ export {
6108
6129
  worktreeDisplayLabelForGroup,
6109
6130
  worktreeNameFromPath,
6110
6131
  worktreesRoot,
6132
+ wrapReviewSkillMarkdown,
6111
6133
  writeInjectedMcpConfig,
6112
6134
  writePlanFile,
6113
6135
  writeThread,