@sideboard-ai/core 0.1.152 → 0.1.155

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 (61) hide show
  1. package/dist/{abletime-223A3LY6.js → abletime-H7LPGIP2.js} +3 -3
  2. package/dist/{abletime-CLC5UJC2.js → abletime-JSTJLXAW.js} +3 -3
  3. package/dist/agents/cursor-runner.js +2 -2
  4. package/dist/{agents-CUKWIM34.js → agents-V24DYZI4.js} +8 -9
  5. package/dist/{agents-VHXCBBBD.js → agents-YVW75KBO.js} +8 -9
  6. package/dist/{app-settings-3CHCNIMD.js → app-settings-H3INSR67.js} +38 -4
  7. package/dist/{app-settings-J3JBCUOT.js → app-settings-VRQI3FIE.js} +38 -4
  8. package/dist/{caffeinate-hold-NBRUWYXO.js → caffeinate-hold-DBKMRZZO.js} +2 -2
  9. package/dist/{caffeinate-hold-X3JNPR42.js → caffeinate-hold-SK2QISPE.js} +2 -2
  10. package/dist/chunk-2F63IMCL.js +959 -0
  11. package/dist/{chunk-4XNSGDXE.js → chunk-3BWVOUQG.js} +244 -1
  12. package/dist/{chunk-7BQNSUR2.js → chunk-46ZTBUVJ.js} +364 -200
  13. package/dist/{chunk-EY6QXPPO.js → chunk-4THE3EY7.js} +6 -6
  14. package/dist/{chunk-TUGKX5BD.js → chunk-7UURXPKD.js} +1 -1
  15. package/dist/{chunk-DCOZABNT.js → chunk-AO35MGOE.js} +1 -1
  16. package/dist/{chunk-3JBMACYX.js → chunk-CJQLPPEJ.js} +387 -15
  17. package/dist/{chunk-CZD4NRDZ.js → chunk-D7EGJ3EI.js} +244 -1
  18. package/dist/{chunk-QZQEXME2.js → chunk-EFVFB2AH.js} +1 -1
  19. package/dist/{chunk-B7XK37WZ.js → chunk-FDCFXMDG.js} +1 -1
  20. package/dist/{chunk-6X7Z34XE.js → chunk-J2OKVOBM.js} +410 -188
  21. package/dist/{chunk-WLV7TRMR.js → chunk-JOK4XWBG.js} +1 -1
  22. package/dist/{chunk-BD2ICC4D.js → chunk-JTJHOYCU.js} +1 -1
  23. package/dist/{chunk-GE7M3QTE.js → chunk-LQMFCS54.js} +387 -15
  24. package/dist/{chunk-G7SIQFBQ.js → chunk-LZ6QMEQC.js} +1 -1
  25. package/dist/{chunk-EUXOHTUK.js → chunk-LZQULFIT.js} +1 -1
  26. package/dist/{chunk-KLBOWJ74.js → chunk-OCQPTUR7.js} +1 -1
  27. package/dist/{chunk-GFQ57XAX.js → chunk-QZEZXYVV.js} +13 -13
  28. package/dist/chunk-RNC3GR6L.js +905 -0
  29. package/dist/{chunk-VHX673DI.js → chunk-WLPXZFRE.js} +1 -1
  30. package/dist/{chunk-7F4XE6UG.js → chunk-XD2BAANL.js} +5 -5
  31. package/dist/{connected-teams-XO766HB4.js → connected-teams-DBWAMP7G.js} +2 -2
  32. package/dist/{connected-teams-I2WZZZFA.js → connected-teams-WGONUQOF.js} +2 -2
  33. package/dist/{coordinator-prompt-WGFRYCHE.js → coordinator-prompt-7FHKCWXB.js} +5 -5
  34. package/dist/{coordinator-prompt-TBX4MOFM.js → coordinator-prompt-KX2FVVYT.js} +5 -5
  35. package/dist/{cursor-recover-NOQYOFRF.js → cursor-recover-L5MD6MBO.js} +1 -1
  36. package/dist/{cursor-recover-QSLWEZNA.js → cursor-recover-NDMLLNYX.js} +2 -2
  37. package/dist/{global-workspace-IY5QAV5C.js → global-workspace-2BRRKSDN.js} +5 -6
  38. package/dist/{global-workspace-BHLUJ46D.js → global-workspace-4LHCZ2DC.js} +5 -6
  39. package/dist/index.cjs +1889 -777
  40. package/dist/index.d.cts +222 -12
  41. package/dist/index.d.ts +222 -12
  42. package/dist/index.js +304 -108
  43. package/dist/mcp/run-stdio.cjs +1747 -1240
  44. package/dist/mcp/run-stdio.js +232 -80
  45. package/dist/{orchestrator-256DFPSX.js → orchestrator-3FWEKDAQ.js} +9 -11
  46. package/dist/{orchestrator-NUA6SEV7.js → orchestrator-HC7XVGJB.js} +10 -12
  47. package/dist/{paths-UMEDHOS5.js → paths-53TLA7VQ.js} +1 -1
  48. package/dist/{paths-QCI3MTO5.js → paths-RRCLNSJB.js} +1 -1
  49. package/dist/{thread-store-WGASXXXR.js → thread-store-KBFBHT5G.js} +2 -2
  50. package/dist/{thread-store-57ZLHR3A.js → thread-store-MVQU6HPJ.js} +2 -2
  51. package/dist/{workspaces-4FSXVIZM.js → workspaces-5UNDTN4G.js} +5 -7
  52. package/dist/{workspaces-NECIQTAO.js → workspaces-MQYNZXUK.js} +5 -7
  53. package/dist/{worktree-HTUM35NT.js → worktree-PEWDAX5O.js} +4 -4
  54. package/dist/{worktree-DPIREDFR.js → worktree-T4SWFSTT.js} +4 -4
  55. package/package.json +1 -1
  56. package/dist/chunk-2U6QF3PT.js +0 -211
  57. package/dist/chunk-67TIJ7S5.js +0 -122
  58. package/dist/chunk-7TIUOYBK.js +0 -213
  59. package/dist/chunk-G4MTYUWS.js +0 -592
  60. package/dist/chunk-K2ANSHUO.js +0 -120
  61. package/dist/chunk-SN6CMKF6.js +0 -538
package/dist/index.js CHANGED
@@ -72,6 +72,7 @@ import {
72
72
  disconnectOptionalService,
73
73
  disconnectSlackWorkspace,
74
74
  discoverSkills,
75
+ emptySetupLog,
75
76
  ensureReviewGuidelinesFile,
76
77
  ensureReviewRequestFile,
77
78
  ensureReviewSkillFile,
@@ -86,6 +87,7 @@ import {
86
87
  findBoardPr,
87
88
  findLastBrightsyContextSummary,
88
89
  findLiveThreadForCreate,
90
+ findLiveThreadForCreateSource,
89
91
  findOrphanWorktrees,
90
92
  findThreadForStackLayer,
91
93
  fireSchedule,
@@ -137,7 +139,9 @@ import {
137
139
  isOptionalServiceId,
138
140
  isPidAlive,
139
141
  isPrimaryCheckoutThread,
142
+ isSetupLastError,
140
143
  isSlackExternalReplyPrompt,
144
+ isStaleLastErrorDuringTurn,
141
145
  isThisProcessDesktopHost,
142
146
  issueNeedsWorkspacePick,
143
147
  lastRequestOccupancy,
@@ -152,6 +156,7 @@ import {
152
156
  listWorktreeFiles,
153
157
  loadAgentInstructions,
154
158
  maybeCompactContext,
159
+ mergeSetupOutput,
155
160
  messagesSinceLastBrightsyContextSummary,
156
161
  normalizeServiceOrigin,
157
162
  openPrStackLayers,
@@ -164,6 +169,7 @@ import {
164
169
  pollSlackOutboundWatches,
165
170
  previewLand,
166
171
  readExistingReviewRequestFile,
172
+ readSetupLog,
167
173
  readSkillBody,
168
174
  readTurnLive,
169
175
  readWorktreeFile,
@@ -192,6 +198,7 @@ import {
192
198
  shouldRemoveWorktreeOnTeardown,
193
199
  shouldResetSessionForOccupancy,
194
200
  shouldRunWorktreeCleanup,
201
+ shouldStampSetupLastError,
195
202
  slackApi,
196
203
  slackArchiveUrl,
197
204
  slackTokenFor,
@@ -216,7 +223,7 @@ import {
216
223
  worktreeCleanupSettings,
217
224
  wrapReviewSkillMarkdown,
218
225
  writeWorktreeFile
219
- } from "./chunk-6X7Z34XE.js";
226
+ } from "./chunk-J2OKVOBM.js";
220
227
  import {
221
228
  LEGACY_PLAN_FILE_REL,
222
229
  PLAN_FILE_NAME,
@@ -310,49 +317,33 @@ import {
310
317
  withEventParentId,
311
318
  withEventsParentId,
312
319
  writeInjectedMcpConfig
313
- } from "./chunk-GFQ57XAX.js";
314
- import {
315
- brightsyMcpServerName,
316
- connectBrightsyTeam,
317
- disconnectBrightsyTeam,
318
- ensureConnectedBrightsyTeamTokens,
319
- getBrightsySession,
320
- listBrightsyAccounts,
321
- listConnectedBrightsyTeams,
322
- switchBrightsyAccount
323
- } from "./chunk-7F4XE6UG.js";
324
- import {
325
- brightsyAccessTokenNeedsRefresh,
326
- brightsyConfigPath,
327
- ensureBrightsyLocalConfigFresh,
328
- loadBrightsyConfig,
329
- refreshBrightsyAccessToken,
330
- saveBrightsyConfig
331
- } from "./chunk-M267JPEA.js";
332
- import {
333
- addWorkspace,
334
- ensureWorkspace,
335
- listWorkspaces,
336
- removeWorkspace,
337
- syncWorkspacesFromThreads
338
- } from "./chunk-K2ANSHUO.js";
320
+ } from "./chunk-QZEZXYVV.js";
339
321
  import {
340
322
  CLOUD_COORDINATOR_BUSY_REPLY,
341
323
  CLOUD_COORDINATOR_STOPPED_REPLY,
342
324
  CLOUD_COORDINATOR_TIMEOUT_REPLY,
343
325
  CLOUD_ORCHESTRATOR_GOAL,
326
+ COORDINATOR_TOOL_PLAYBOOK,
344
327
  GLOBAL_WORKSPACE_ID,
345
328
  ORCHESTRATOR_AGENT_KINDS,
346
329
  SIDEBOARD_FORCE_STOP,
330
+ SLACK_REPLY_FORMATTING,
331
+ addWorkspace,
347
332
  assertOrchestratorCapableAgent,
348
333
  attachmentFromAbsolutePath,
349
334
  attachmentsFromBuffers,
350
335
  attachmentsFromWorktreePaths,
351
336
  coerceOrchestratorAgent,
337
+ coordinatorSystemPrompt,
338
+ coordinatorTurnReminder,
352
339
  createGlobalChat,
340
+ enrichWorkspacesWithGithub,
353
341
  ensureCloudCoordinator,
342
+ ensureGlobalCoordinatorCwd,
354
343
  ensureSlackCoordinator,
344
+ ensureWorkspace,
355
345
  findSlackCoordinator,
346
+ formatWorkspaceInventory,
356
347
  healOrchestrationSoccerTitles,
357
348
  isCloudCoordinatorThread,
358
349
  isGlobalRepoPath,
@@ -362,24 +353,18 @@ import {
362
353
  isOrchestratorThread,
363
354
  isSlackCoordinatorThread,
364
355
  listGlobalThreads,
356
+ listWorkspaces,
365
357
  orchestrationTitleNeedsSoccerNickname,
366
358
  orchestratorSessionPoisonedByBuiltins,
367
359
  parseForceStopMessage,
368
360
  persistPendingFileAttachments,
361
+ removeWorkspace,
369
362
  slackCoordinatorSourceRef,
370
363
  stageAbsolutePathsAsAttachments,
371
364
  stageBuffersAsAttachments,
365
+ syncWorkspacesFromThreads,
372
366
  takenTeamSlugsForOrchestration
373
- } from "./chunk-G4MTYUWS.js";
374
- import {
375
- COORDINATOR_TOOL_PLAYBOOK,
376
- SLACK_REPLY_FORMATTING,
377
- coordinatorSystemPrompt,
378
- coordinatorTurnReminder,
379
- enrichWorkspacesWithGithub,
380
- ensureGlobalCoordinatorCwd,
381
- formatWorkspaceInventory
382
- } from "./chunk-2U6QF3PT.js";
367
+ } from "./chunk-2F63IMCL.js";
383
368
  import {
384
369
  FAMOUS_SOCCER_TEAMS,
385
370
  GITHUB_PR_BODY_MAX_CHARS,
@@ -457,6 +442,7 @@ import {
457
442
  resolveDiffBaseRef,
458
443
  resolveGithubAgentToken,
459
444
  resolveGithubRepoSlug,
445
+ resolveListPrsOptions,
460
446
  resolvePrSelector,
461
447
  resolvePrSelectors,
462
448
  resolveRepoRoot,
@@ -471,7 +457,7 @@ import {
471
457
  worktreeDisplayLabel,
472
458
  worktreeDisplayLabelForGroup,
473
459
  worktreeNameFromPath
474
- } from "./chunk-GE7M3QTE.js";
460
+ } from "./chunk-LQMFCS54.js";
475
461
  import {
476
462
  ATTACHMENTS_DIR,
477
463
  DETACHED_JOBS_DIR,
@@ -480,6 +466,24 @@ import {
480
466
  attachmentsGitignoreBody,
481
467
  isWorkspaceScratchPath
482
468
  } from "./chunk-JRH62XC4.js";
469
+ import {
470
+ brightsyMcpServerName,
471
+ connectBrightsyTeam,
472
+ disconnectBrightsyTeam,
473
+ ensureConnectedBrightsyTeamTokens,
474
+ getBrightsySession,
475
+ listBrightsyAccounts,
476
+ listConnectedBrightsyTeams,
477
+ switchBrightsyAccount
478
+ } from "./chunk-XD2BAANL.js";
479
+ import {
480
+ brightsyAccessTokenNeedsRefresh,
481
+ brightsyConfigPath,
482
+ ensureBrightsyLocalConfigFresh,
483
+ loadBrightsyConfig,
484
+ refreshBrightsyAccessToken,
485
+ saveBrightsyConfig
486
+ } from "./chunk-M267JPEA.js";
483
487
  import {
484
488
  ABLETIME_MCP_PATH,
485
489
  DEFAULT_ABLETIME_HOST,
@@ -501,7 +505,7 @@ import {
501
505
  taskUrl,
502
506
  toAbleTimeIssueInfo,
503
507
  verifyAbleTimeConnection
504
- } from "./chunk-WLV7TRMR.js";
508
+ } from "./chunk-JOK4XWBG.js";
505
509
  import {
506
510
  formatFetchError,
507
511
  httpFetch,
@@ -518,10 +522,16 @@ import {
518
522
  withMaxOldSpaceSize
519
523
  } from "./chunk-HEII7W3Q.js";
520
524
  import {
525
+ ACCOUNT_ROLES,
526
+ ACCOUNT_ROLE_LABELS,
527
+ ACCOUNT_ROLE_MAX,
528
+ ACCOUNT_ROLE_PRESETS,
521
529
  FOLLOW_UP_BEHAVIORS,
522
530
  GITHUB_GIT_AUTH_MODES,
523
531
  HARNESS_ENV_KEYS,
524
532
  ISSUE_SOURCE_LABELS,
533
+ PROFILE_NOTES_MAX,
534
+ accountRoleLabel,
525
535
  appSettingsPath,
526
536
  applyAppEnvironment,
527
537
  autoArchiveOnMergeEnabled,
@@ -544,7 +554,11 @@ import {
544
554
  disconnectLinearConnection,
545
555
  emptyPublicIntegrations,
546
556
  ensureSlackDeviceIdentity,
557
+ findProjectProfileKey,
547
558
  followUpBehavior,
559
+ formatAccountProfilePlaybookLine,
560
+ formatProjectProfilePlaybookLines,
561
+ formatWorkspaceProfileSuffix,
548
562
  getAbleTimeAccessToken,
549
563
  getAbleTimeHost,
550
564
  getDefaultAgent,
@@ -565,13 +579,19 @@ import {
565
579
  orchestrationQuotaFallbackAgent,
566
580
  orchestrationQuotaOnLimit,
567
581
  persistVaultKeyInKeychain,
582
+ preferTeamsForRole,
568
583
  readKeychainVaultKey,
584
+ resolveAccountProfile,
585
+ resolveAccountProfileFromSettings,
569
586
  resolveAgentExecutable,
570
587
  resolveClaudeExecutable,
571
588
  resolveEffectiveIssueSource,
572
589
  resolveNewThreadOptions,
573
590
  resolveThreadDefaults,
574
591
  resolveVaultKey,
592
+ resolveViewerProfile,
593
+ resolveViewerProfileForRepo,
594
+ reviewTeamHintsForRoles,
575
595
  saveAbleTimeConnection,
576
596
  saveAppSettings,
577
597
  saveLinearOAuth,
@@ -589,8 +609,9 @@ import {
589
609
  updateCodexSettings,
590
610
  updateDefaultsSettings,
591
611
  updateIntegrationsSettings,
592
- updateOpencodeSettings
593
- } from "./chunk-4XNSGDXE.js";
612
+ updateOpencodeSettings,
613
+ updateProjectProfileSettings
614
+ } from "./chunk-3BWVOUQG.js";
594
615
  import {
595
616
  stripNestedElectronEnv
596
617
  } from "./chunk-4TR3HZFT.js";
@@ -600,7 +621,7 @@ import {
600
621
  isThreadCaffeinated,
601
622
  releaseCaffeinateHoldForThread,
602
623
  setCaffeinateHold
603
- } from "./chunk-DCOZABNT.js";
624
+ } from "./chunk-AO35MGOE.js";
604
625
  import "./chunk-JT7R45JB.js";
605
626
  import {
606
627
  appendMessage,
@@ -617,7 +638,7 @@ import {
617
638
  updateThread,
618
639
  withThreadLock,
619
640
  writeThread
620
- } from "./chunk-TUGKX5BD.js";
641
+ } from "./chunk-7UURXPKD.js";
621
642
  import {
622
643
  THINKING_EFFORTS,
623
644
  isThinkingEffort,
@@ -653,7 +674,7 @@ import {
653
674
  threadsDir,
654
675
  workspaceSettingsSourceLabel,
655
676
  worktreesRoot
656
- } from "./chunk-QZQEXME2.js";
677
+ } from "./chunk-EFVFB2AH.js";
657
678
  import "./chunk-QQKDGPUI.js";
658
679
  import {
659
680
  conductorBundledBinDir,
@@ -1021,7 +1042,7 @@ var ISSUE_FIELDS = `
1021
1042
  state { id name type }
1022
1043
  assignee { id name }
1023
1044
  creator { id name }
1024
- team { id key name states(first: 50) { nodes { id name type } } }
1045
+ team { id key name }
1025
1046
  labels(first: 50) { nodes { name } }
1026
1047
  cycle { name number startsAt endsAt completedAt }
1027
1048
  project { id name }
@@ -1502,7 +1523,9 @@ async function updateLinearIssue(input, opts) {
1502
1523
  }
1503
1524
  if (input.state?.trim()) {
1504
1525
  const existing = await getLinearIssue(issueId, opts);
1505
- const team = existing.team;
1526
+ const { teams } = await listLinearTeams(opts);
1527
+ const teamRef = existing.team?.key || existing.team?.id;
1528
+ const team = teamRef ? resolveLinearTeam(teams, teamRef) : void 0;
1506
1529
  if (!team?.states.length) {
1507
1530
  throw new Error(`Linear issue ${existing.identifier} has no workflow states to resolve "${input.state}"`);
1508
1531
  }
@@ -1559,6 +1582,11 @@ async function validateLinearApiKey(apiKey) {
1559
1582
  function assigneeKey(assignee) {
1560
1583
  return (assignee ?? "").trim().toLowerCase();
1561
1584
  }
1585
+ function takeIssuePage(issues, limit) {
1586
+ if (limit == null) return issues;
1587
+ const n = Math.max(1, Math.min(1e3, Math.floor(limit)));
1588
+ return issues.slice(0, n);
1589
+ }
1562
1590
  function issueMatchesAssignee(issue, assignee, viewerName = "") {
1563
1591
  const key = assigneeKey(assignee);
1564
1592
  if (!key || key === "all" || key === "*") return true;
@@ -1660,13 +1688,33 @@ async function listIssues(repoPath, opts) {
1660
1688
  };
1661
1689
  }
1662
1690
  if (source === "abletime") {
1663
- const [listed, searched] = await Promise.all([
1664
- listAbleTimeAssignedIssues(),
1665
- query ? searchAbleTimeTasks(query) : Promise.resolve(null)
1666
- ]);
1691
+ if (query) {
1692
+ const [searched, orientation] = await Promise.all([
1693
+ searchAbleTimeTasks(query),
1694
+ getAbleTimeOrientation().catch(() => null)
1695
+ ]);
1696
+ const viewerName2 = orientation?.viewer.name ?? orientation?.viewer.id ?? "";
1697
+ const issues3 = takeIssuePage(
1698
+ searched.map(toAbleTimeIssueInfo).filter((issue) => issueMatchesAssignee(issue, assignee, viewerName2)),
1699
+ opts?.limit
1700
+ );
1701
+ return {
1702
+ source,
1703
+ preferredSource,
1704
+ linearConnected,
1705
+ abletimeConnected,
1706
+ issues: issues3,
1707
+ viewer: {
1708
+ login: orientation?.viewer.name,
1709
+ name: orientation?.viewer.name
1710
+ }
1711
+ };
1712
+ }
1713
+ const listed = await listAbleTimeAssignedIssues();
1667
1714
  const viewerName = listed.viewer.name ?? listed.viewer.id ?? "";
1668
- const issues2 = (searched ? searched.map(toAbleTimeIssueInfo) : listed.issues).filter(
1669
- (issue) => issueMatchesAssignee(issue, assignee, viewerName)
1715
+ const issues2 = takeIssuePage(
1716
+ listed.issues.filter((issue) => issueMatchesAssignee(issue, assignee, viewerName)),
1717
+ opts?.limit
1670
1718
  );
1671
1719
  return {
1672
1720
  source,
@@ -2586,12 +2634,53 @@ function registerSlackTools(server) {
2586
2634
 
2587
2635
  // src/mcp/abletime-tools.ts
2588
2636
  import { z as z2 } from "zod";
2589
- function text2(payload, isError = false) {
2637
+
2638
+ // src/mcp/issue-list.ts
2639
+ var MCP_ISSUE_LIST_DEFAULT_LIMIT = 40;
2640
+ var MCP_ISSUE_LIST_MAX_LIMIT = 250;
2641
+ function clampMcpIssueLimit(limit) {
2642
+ if (limit == null || !Number.isFinite(limit)) return MCP_ISSUE_LIST_DEFAULT_LIMIT;
2643
+ return Math.max(1, Math.min(MCP_ISSUE_LIST_MAX_LIMIT, Math.floor(limit)));
2644
+ }
2645
+ function applyIssueListWindow(items, limit) {
2646
+ const truncated = items.length > limit;
2590
2647
  return {
2591
- content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
2648
+ items: truncated ? items.slice(0, limit) : items,
2649
+ truncated
2650
+ };
2651
+ }
2652
+ function compactIssueRow(issue) {
2653
+ return {
2654
+ identifier: issue.identifier,
2655
+ title: issue.title,
2656
+ ...issue.assignee ? { assignee: issue.assignee } : {},
2657
+ ...issue.labels.length > 0 ? { labels: issue.labels } : {},
2658
+ ...issue.teamKey ? { team: issue.teamKey } : {},
2659
+ ...issue.cycle?.name ? { cycle: issue.cycle.name } : {}
2660
+ };
2661
+ }
2662
+ function formatMcpIssueList(input) {
2663
+ return {
2664
+ ...input.source ? { source: input.source } : {},
2665
+ ...input.viewer ? { viewer: input.viewer } : {},
2666
+ limit: input.limit,
2667
+ returned: input.issues.length,
2668
+ truncated: input.truncated,
2669
+ ...input.truncated ? { hint: "More issues match. Pass a higher limit (max 250) or a tighter query." } : {},
2670
+ issues: input.issues.map(compactIssueRow)
2671
+ };
2672
+ }
2673
+ function mcpJson(payload, isError = false) {
2674
+ return {
2675
+ content: [{ type: "text", text: JSON.stringify(payload) }],
2592
2676
  ...isError ? { isError: true } : {}
2593
2677
  };
2594
2678
  }
2679
+
2680
+ // src/mcp/abletime-tools.ts
2681
+ function text2(payload, isError = false) {
2682
+ return mcpJson(payload, isError);
2683
+ }
2595
2684
  function fail2(err) {
2596
2685
  return text2(
2597
2686
  { error: err instanceof Error ? err.message : String(err) },
@@ -2601,7 +2690,7 @@ function fail2(err) {
2601
2690
  function registerAbleTimeTools(server) {
2602
2691
  server.tool(
2603
2692
  "abletime_orientation",
2604
- "Call first when using AbleTime. Returns who the Account token is, open drafts, active tasks, and current projects. Requires Agent access (MCP) enabled in AbleTime.",
2693
+ "Call first when using AbleTime. Returns viewer, active tasks, and projects.",
2605
2694
  {},
2606
2695
  async () => {
2607
2696
  try {
@@ -2618,7 +2707,7 @@ function registerAbleTimeTools(server) {
2618
2707
  );
2619
2708
  server.tool(
2620
2709
  "abletime_list_projects",
2621
- "List AbleTime projects (and categories) the Account token can see. Use a project id on abletime_create_task / abletime_ensure_task.",
2710
+ "List AbleTime projects (and categories). Use a project id on create/ensure.",
2622
2711
  {},
2623
2712
  async () => {
2624
2713
  try {
@@ -2686,7 +2775,7 @@ function registerAbleTimeTools(server) {
2686
2775
  );
2687
2776
  server.tool(
2688
2777
  "abletime_ensure_task",
2689
- "Find an open AbleTime task for this work, or create one to track against. Matches identifier or exact title before creating. Prefer this when starting work that has no ticket yet, then create_thread with sourceType=ticket and the returned identifier.",
2778
+ "Find or create an AbleTime task for this work, then create_thread with sourceType=ticket.",
2690
2779
  {
2691
2780
  title: z2.string(),
2692
2781
  description: z2.string().optional(),
@@ -2707,10 +2796,7 @@ function registerAbleTimeTools(server) {
2707
2796
  // src/mcp/linear-tools.ts
2708
2797
  import { z as z3 } from "zod";
2709
2798
  function text3(payload, isError = false) {
2710
- return {
2711
- content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
2712
- ...isError ? { isError: true } : {}
2713
- };
2799
+ return mcpJson(payload, isError);
2714
2800
  }
2715
2801
  function fail3(err) {
2716
2802
  return text3(
@@ -2722,7 +2808,7 @@ var prioritySchema = z3.number().int().min(0).max(4).optional().describe("0 none
2722
2808
  function registerLinearTools(server) {
2723
2809
  server.tool(
2724
2810
  "linear_list_teams",
2725
- "List Linear teams (id, key, name) and workflow states for the connected Account. Use team key (e.g. ENG) on linear_create_issue; use state name or type (started, completed) on create/update. Viewer id is for assignee=me.",
2811
+ "List Linear teams (id, key, name) and workflow states. Use team key on create; state name or type on create/update.",
2726
2812
  {},
2727
2813
  async () => {
2728
2814
  try {
@@ -2734,15 +2820,30 @@ function registerLinearTools(server) {
2734
2820
  );
2735
2821
  server.tool(
2736
2822
  "linear_search_issues",
2737
- "Search or list open Linear issues. Not limited to the current user \u2014 pass assignee=unassigned for issues with no owner, assignee=all (default when query is set) for anyone including unassigned, assignee=me for yours, or a user id / name. Optional query uses Linear search (title, identifier, description).",
2823
+ "Search or list open Linear issues. Default 40; pass query and/or limit (max 250) when truncated. assignee: me, unassigned, all (default with query), or a user id/name.",
2738
2824
  {
2739
2825
  query: z3.string().optional().describe("Search text (identifier, title, description). Omit to list by assignee only."),
2740
2826
  assignee: z3.string().optional().describe("me, unassigned, all, a Linear user id, or a display name. Default: all when query is set, otherwise me."),
2741
- limit: z3.number().int().positive().max(250).optional()
2827
+ limit: z3.number().int().positive().max(250).optional().describe("Page size (default 40, max 250). Raise when truncated is true.")
2742
2828
  },
2743
2829
  async ({ query, assignee, limit }) => {
2744
2830
  try {
2745
- return text3(await listLinearIssuesFiltered({ query, assignee, limit }));
2831
+ const page = clampMcpIssueLimit(limit);
2832
+ const listed = await listLinearIssuesFiltered({
2833
+ query,
2834
+ assignee,
2835
+ limit: page + 1
2836
+ });
2837
+ const windowed = applyIssueListWindow(listed.issues, page);
2838
+ return mcpJson(
2839
+ formatMcpIssueList({
2840
+ source: "linear",
2841
+ viewer: listed.viewer.name,
2842
+ limit: page,
2843
+ issues: windowed.items,
2844
+ truncated: windowed.truncated
2845
+ })
2846
+ );
2746
2847
  } catch (err) {
2747
2848
  return fail3(err);
2748
2849
  }
@@ -2750,7 +2851,7 @@ function registerLinearTools(server) {
2750
2851
  );
2751
2852
  server.tool(
2752
2853
  "linear_get_issue",
2753
- "Get a Linear issue by uuid or identifier (ENG-123). Returns description, comments, relations (blocks/blockedBy/related/duplicate), parent/children, project, cycle, labels, and other metadata.",
2854
+ "Get a Linear issue by uuid or identifier (ENG-123): description, comments, relations, parent/children.",
2754
2855
  { id: z3.string() },
2755
2856
  async ({ id }) => {
2756
2857
  try {
@@ -2762,7 +2863,7 @@ function registerLinearTools(server) {
2762
2863
  );
2763
2864
  server.tool(
2764
2865
  "linear_create_issue",
2765
- 'Create a Linear issue. Call linear_list_teams first. team is id, key, or name. state is name, type (unstarted/started/completed/canceled/backlog), or id. assignee is "me" or a user id.',
2866
+ 'Create a Linear issue. Call linear_list_teams first. team is id/key/name; state is name/type/id; assignee is "me" or a user id.',
2766
2867
  {
2767
2868
  team: z3.string(),
2768
2869
  title: z3.string(),
@@ -2781,7 +2882,7 @@ function registerLinearTools(server) {
2781
2882
  );
2782
2883
  server.tool(
2783
2884
  "linear_update_issue",
2784
- 'Update a Linear issue (uuid or ENG-123). Pass at least one of title, description, state, assignee, priority. state is name, type, or id. assignee is "me", a user id, or null to unassign.',
2885
+ "Update a Linear issue (uuid or ENG-123). Pass title, description, state, assignee, and/or priority.",
2785
2886
  {
2786
2887
  id: z3.string(),
2787
2888
  title: z3.string().optional(),
@@ -2815,6 +2916,46 @@ function registerLinearTools(server) {
2815
2916
  );
2816
2917
  }
2817
2918
 
2919
+ // src/mcp/issue-vendor-tools.ts
2920
+ function registerConnectedIssueVendorTools(server, settings = loadAppSettings()) {
2921
+ if (isLinearConnected(settings)) registerLinearTools(server);
2922
+ if (isAbleTimeConnected(settings)) registerAbleTimeTools(server);
2923
+ }
2924
+
2925
+ // src/mcp/pr-list.ts
2926
+ function compactPrRow(pr) {
2927
+ return {
2928
+ number: pr.number,
2929
+ title: pr.title,
2930
+ ...pr.headRefName ? { head: pr.headRefName } : {},
2931
+ ...pr.author?.login ? { author: pr.author.login } : {},
2932
+ ...pr.state ? { state: pr.state } : {},
2933
+ ...pr.isDraft ? { draft: true } : {},
2934
+ ...pr.labels?.length ? { labels: pr.labels } : {},
2935
+ ...pr.reviewers?.length ? { reviewers: pr.reviewers } : {},
2936
+ ...pr.teams?.length ? { teams: pr.teams } : {},
2937
+ ...pr.reviewDecision ? { reviewDecision: pr.reviewDecision } : {},
2938
+ ...pr.tickets?.length ? { tickets: pr.tickets } : {}
2939
+ };
2940
+ }
2941
+ function formatMcpPrList(input) {
2942
+ return {
2943
+ ...input.viewer ? { viewer: input.viewer } : {},
2944
+ ...input.queue ? { queue: input.queue } : {},
2945
+ state: input.state,
2946
+ ...input.labels?.length ? { labels: input.labels } : {},
2947
+ ...input.reviewer ? { reviewer: input.reviewer } : {},
2948
+ ...input.query ? { query: input.query } : {},
2949
+ limit: input.limit,
2950
+ returned: input.prs.length,
2951
+ truncated: input.truncated,
2952
+ ...input.truncated ? {
2953
+ hint: "More PRs match. Pass a higher limit (max 250) or tighten label / reviewer / query."
2954
+ } : {},
2955
+ prs: input.prs.map(compactPrRow)
2956
+ };
2957
+ }
2958
+
2818
2959
  // src/mcp/schedule-tools.ts
2819
2960
  import { z as z4 } from "zod";
2820
2961
  function text4(payload, isError = false) {
@@ -3373,7 +3514,7 @@ async function startMcpServer() {
3373
3514
  );
3374
3515
  }
3375
3516
  try {
3376
- const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-3CHCNIMD.js");
3517
+ const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-H3INSR67.js");
3377
3518
  orch.setMaxConcurrent(maxConcurrentAgents2());
3378
3519
  } catch {
3379
3520
  }
@@ -3393,14 +3534,21 @@ async function startMcpServer() {
3393
3534
  if (!worktreeProfile) {
3394
3535
  server.tool(
3395
3536
  "list_workspaces",
3396
- "List registered Sideboard workspaces (repos). Each line is name, path, and github:owner/repo when resolvable \u2014 use path as repoPath for list_board/list_branches/list_prs/list_issues/create_thread.",
3537
+ "List registered Sideboard workspaces (repos). Each line is name, path, github:owner/repo when resolvable, and viewer roles/notes when set \u2014 use path as repoPath for list_board/list_branches/list_prs/list_issues/create_thread. Roles and notes (Settings \u2192 Agents / Projects) say which tickets and review PRs belong to the user.",
3397
3538
  {},
3398
3539
  async () => {
3399
3540
  const workspaces = orch.listWorkspaces();
3400
3541
  const lines = await Promise.all(
3401
3542
  workspaces.map(async (w) => {
3402
3543
  const slug = await resolveGithubRepoSlug(w.path).catch(() => null);
3403
- return slug ? `${w.name} ${w.path} github:${slug}` : `${w.name} ${w.path}`;
3544
+ let profile;
3545
+ try {
3546
+ profile = resolveViewerProfileForRepo(w.path);
3547
+ } catch {
3548
+ profile = resolveViewerProfile();
3549
+ }
3550
+ const suffix = formatWorkspaceProfileSuffix(profile);
3551
+ return slug ? `${w.name} ${w.path} github:${slug}${suffix}` : `${w.name} ${w.path}${suffix}`;
3404
3552
  })
3405
3553
  );
3406
3554
  return {
@@ -3653,11 +3801,10 @@ async function startMcpServer() {
3653
3801
  );
3654
3802
  if (!worktreeProfile) {
3655
3803
  registerSlackTools(server);
3656
- registerLinearTools(server);
3657
- registerAbleTimeTools(server);
3804
+ registerConnectedIssueVendorTools(server);
3658
3805
  registerScheduleTools(server);
3659
- const { getCaffeinateHold: getCaffeinateHold2, setCaffeinateHold: setCaffeinateHold2 } = await import("./caffeinate-hold-X3JNPR42.js");
3660
- const { resolveNewThreadOptions: resolveNewThreadOptions2, resolveThreadDefaults: resolveThreadDefaults2 } = await import("./app-settings-3CHCNIMD.js");
3806
+ const { getCaffeinateHold: getCaffeinateHold2, setCaffeinateHold: setCaffeinateHold2 } = await import("./caffeinate-hold-SK2QISPE.js");
3807
+ const { resolveNewThreadOptions: resolveNewThreadOptions2, resolveThreadDefaults: resolveThreadDefaults2 } = await import("./app-settings-H3INSR67.js");
3661
3808
  const accountDefaults = resolveThreadDefaults2();
3662
3809
  const accountDefaultsHint = `Account defaults: agent=${accountDefaults.agent}, model=${accountDefaults.model?.trim() || "Auto"}, effort=${accountDefaults.effort}`;
3663
3810
  server.tool(
@@ -3700,7 +3847,7 @@ async function startMcpServer() {
3700
3847
  );
3701
3848
  server.tool(
3702
3849
  "create_thread",
3703
- `Create a worktree thread (chat) from branch, pr, or ticket. If a live worktree already matches that ticket, PR, or named branch, returns it (alreadyStarted=true) instead of a second checkout. Creating from the default branch still opens a new isolated worktree. Pass repoPath from list_workspaces. cowboy=true uses the project folder on the default branch (no isolated worktree; land is commit+push). From an orchestration chat, omit parentThreadId (Sideboard binds the child to this chat) or pass the exact id from the turn reminder \u2014 never invent a uuid. Prefer omitting agent/model so Sideboard applies ${accountDefaultsHint}. Setup (settings.toml, .cursor/worktrees.json, or script/setup) runs in the background in parallel with the first turn (skipped for cowboy). Then use send_to_thread to chat.`,
3850
+ `Create a worktree thread (chat) from branch, pr, or ticket. A ticket, PR, or named branch may have only one live worktree \u2014 if one already matches, returns it (alreadyStarted=true) instead of a second checkout. Creating from the default branch still opens a new isolated worktree. Pass repoPath from list_workspaces. cowboy=true uses the project folder on the default branch (no isolated worktree; land is commit+push). From an orchestration chat, omit parentThreadId (Sideboard binds the child to this chat) or pass the exact id from the turn reminder \u2014 never invent a uuid. Prefer omitting agent/model so Sideboard applies ${accountDefaultsHint}. Setup (settings.toml, .cursor/worktrees.json, or script/setup) runs in the background in parallel with the first turn (skipped for cowboy). Then use send_to_thread to chat.`,
3704
3851
  {
3705
3852
  sourceType: z5.enum(["branch", "pr", "ticket"]),
3706
3853
  sourceRef: z5.string(),
@@ -3727,7 +3874,7 @@ async function startMcpServer() {
3727
3874
  );
3728
3875
  server.tool(
3729
3876
  "start_board_card",
3730
- "Same as create_thread for a ticket, PR, or named branch (attaches issue text when Sideboard can resolve it). Reuses the live worktree if one already matches. Then send_to_thread.",
3877
+ "Same as create_thread for a ticket, PR, or named branch (attaches issue text when Sideboard can resolve it). Does not create a second worktree when one already matches \u2014 returns that thread (alreadyStarted). Then send_to_thread.",
3731
3878
  {
3732
3879
  kind: z5.enum(["ticket", "pr", "branch"]),
3733
3880
  ref: z5.string().describe("Ticket identifier (ENG-12), PR number (44), or branch name from list_board"),
@@ -4373,21 +4520,47 @@ async function startMcpServer() {
4373
4520
  );
4374
4521
  server.tool(
4375
4522
  "list_prs",
4376
- "List open GitHub PRs for a registered workspace. Pass repoPath from list_workspaces (uses gh against that repo remote). Then create_thread with sourceType=pr.",
4377
- { repoPath: z5.string() },
4378
- async ({ repoPath }) => {
4523
+ 'List GitHub PRs for a registered workspace (the review surface for assigned ticket work \u2014 not the tickets). Pass repoPath from list_workspaces. "Get me N tickets to review" \u2192 queue=review and limit=N: open non-draft PRs labeled eng-review with no individual user reviewer. Prefer teams that match Settings \u2192 Agents / Projects roles for this repo. A team like engineering-team is not a claim (you are on that team). Also: state (open|closed|merged|all|review), label, reviewer (me|unassigned|login), query, limit (default 40, max 250). Then create_thread with sourceType=pr.',
4524
+ {
4525
+ repoPath: z5.string(),
4526
+ query: z5.string().optional().describe("GitHub search tokens (title, draft:true, \u2026)"),
4527
+ queue: z5.enum(["review", "mine", "approved", "changes"]).optional().describe(
4528
+ 'review = unclaimed eng-review inbox (use for "get me N tickets to review"). mine = review-requested:@me. approved / changes = eng-approved / eng-requested-changes.'
4529
+ ),
4530
+ state: z5.enum(["open", "closed", "merged", "all", "review"]).optional().describe("GitHub PR state (default open). review is an alias for queue=review."),
4531
+ label: z5.string().optional().describe(
4532
+ "GitHub label / workflow tag. Comma-separated AND. Examples: eng-review, eng-approved, eng-requested-changes"
4533
+ ),
4534
+ reviewer: z5.string().optional().describe(
4535
+ "me (review requested of you), unassigned (no individual reviewer; team queues like engineering-team still count), all, or a GitHub login"
4536
+ ),
4537
+ limit: z5.number().int().positive().max(250).optional().describe("Page size (default 40, max 250). Raise when truncated is true.")
4538
+ },
4539
+ async ({ repoPath, query, queue, state, label, reviewer, limit }) => {
4379
4540
  const root = await resolveRepoRoot(repoPath);
4380
- const prs = await listPrs(root);
4381
- return {
4382
- content: [
4383
- {
4384
- type: "text",
4385
- text: prs.map(
4386
- (p) => `#${p.number} ${p.title} (${p.headRefName})${p.isCrossRepository ? " [fork]" : ""}`
4387
- ).join("\n")
4388
- }
4389
- ]
4390
- };
4541
+ const page = clampMcpIssueLimit(limit);
4542
+ const resolved = resolveListPrsOptions({
4543
+ query,
4544
+ queue,
4545
+ state,
4546
+ labels: label,
4547
+ reviewer,
4548
+ limit: page + 1
4549
+ });
4550
+ const prs = await listPrs(root, resolved);
4551
+ const windowed = applyIssueListWindow(prs, page);
4552
+ return mcpJson(
4553
+ formatMcpPrList({
4554
+ queue: resolved.queue,
4555
+ state: resolved.state,
4556
+ labels: resolved.labels,
4557
+ reviewer: resolved.reviewer,
4558
+ query: resolved.query,
4559
+ limit: page,
4560
+ prs: windowed.items,
4561
+ truncated: windowed.truncated
4562
+ })
4563
+ );
4391
4564
  }
4392
4565
  );
4393
4566
  server.tool(
@@ -4512,28 +4685,27 @@ async function startMcpServer() {
4512
4685
  );
4513
4686
  server.tool(
4514
4687
  "list_issues",
4515
- "List or search issues from Sideboard Account connections (Linear, AbleTime MCP, or GitHub Issues; falls back to GitHub when the preferred tracker is not connected). Linear defaults to issues assigned to you; pass assignee=unassigned for no owner, assignee=all for everyone (including unassigned), or a user id / GitHub login. Optional query searches title/identifier. Linear/AbleTime are account-wide; GitHub Issues are scoped to repoPath from list_workspaces. Prefer linear_search_issues when Linear is connected and you need unassigned or other people's tickets. When AbleTime is the issue source and work has no ticket, call abletime_ensure_task (or create_thread from the default branch \u2014 Sideboard auto-creates a task to track against). Prefer list_board for Home columns. Then create_thread with sourceType=ticket.",
4688
+ "List or search issues (Linear, AbleTime, or GitHub; falls back to GitHub). Use Settings \u2192 Agents / Projects notes and roles to pick tickets relevant to the viewer (query + assignee=me or unassigned as the notes say). Default 40; pass query and/or limit (max 250) when truncated. assignee: me (Linear default), unassigned, all, or a user id. Then create_thread with sourceType=ticket.",
4516
4689
  {
4517
4690
  repoPath: z5.string(),
4518
4691
  query: z5.string().optional().describe("Search title, identifier, or description"),
4519
- assignee: z5.string().optional().describe("me (Linear default), unassigned, all, a user id, or a GitHub login")
4692
+ assignee: z5.string().optional().describe("me (Linear default), unassigned, all, a user id, or a GitHub login"),
4693
+ limit: z5.number().int().positive().max(250).optional().describe("Page size (default 40, max 250). Raise when truncated is true.")
4520
4694
  },
4521
- async ({ repoPath, query, assignee }) => {
4695
+ async ({ repoPath, query, assignee, limit }) => {
4522
4696
  const root = await resolveRepoRoot(repoPath);
4523
- const result = await listIssues(root, { query, assignee });
4524
- return { content: [{ type: "text", text: JSON.stringify(result, null, 2) }] };
4525
- }
4526
- );
4527
- server.tool(
4528
- "list_linear_issues",
4529
- "Deprecated: prefer list_issues. Lists assigned Linear issues via the chosen agent MCP connector",
4530
- {
4531
- agent: z5.enum(["claude", "codex", "opencode"]),
4532
- repoPath: z5.string()
4533
- },
4534
- async ({ agent, repoPath }) => {
4535
- const issues = await listLinearIssues(agent, repoPath);
4536
- return { content: [{ type: "text", text: JSON.stringify(issues, null, 2) }] };
4697
+ const page = clampMcpIssueLimit(limit);
4698
+ const result = await listIssues(root, { query, assignee, limit: page + 1 });
4699
+ const windowed = applyIssueListWindow(result.issues, page);
4700
+ return mcpJson(
4701
+ formatMcpIssueList({
4702
+ source: result.source,
4703
+ viewer: result.viewer?.name || result.viewer?.login,
4704
+ limit: page,
4705
+ issues: windowed.items,
4706
+ truncated: windowed.truncated
4707
+ })
4708
+ );
4537
4709
  }
4538
4710
  );
4539
4711
  }
@@ -6816,6 +6988,10 @@ async function startSlackRelayServer(opts) {
6816
6988
  }
6817
6989
  export {
6818
6990
  ABLETIME_MCP_PATH,
6991
+ ACCOUNT_ROLES,
6992
+ ACCOUNT_ROLE_LABELS,
6993
+ ACCOUNT_ROLE_MAX,
6994
+ ACCOUNT_ROLE_PRESETS,
6819
6995
  AGENT_GIT_ACTIONS,
6820
6996
  AGENT_RUNNER_MAX_OLD_SPACE_MB,
6821
6997
  ATTACHMENTS_DIR,
@@ -6872,6 +7048,7 @@ export {
6872
7048
  PLAN_FILE_REL,
6873
7049
  PLAN_MODE_INSTRUCTION,
6874
7050
  PLAN_QUESTION_ANSWERS_PREFIX,
7051
+ PROFILE_NOTES_MAX,
6875
7052
  REPO_REVIEW_NAME,
6876
7053
  REPO_REVIEW_PATH,
6877
7054
  REVIEW_REQUEST_NAME,
@@ -6898,6 +7075,7 @@ export {
6898
7075
  WORKTREE_MCP_TOOLS,
6899
7076
  abletimeMcpRequest,
6900
7077
  abletimeMcpUrl,
7078
+ accountRoleLabel,
6901
7079
  ackSlackInboundSeen,
6902
7080
  addBoardPin,
6903
7081
  addPrStackLayer,
@@ -7032,6 +7210,7 @@ export {
7032
7210
  discoverSkills,
7033
7211
  dropCachedPrefixOnResume,
7034
7212
  emptyPublicIntegrations,
7213
+ emptySetupLog,
7035
7214
  encodeBrightsyTarget,
7036
7215
  enrichPathWithNpmGlobalBin,
7037
7216
  enrichWorkspacesWithGithub,
@@ -7065,7 +7244,9 @@ export {
7065
7244
  findInvalidCacheControlTtlOrder,
7066
7245
  findLastBrightsyContextSummary,
7067
7246
  findLiveThreadForCreate,
7247
+ findLiveThreadForCreateSource,
7068
7248
  findOrphanWorktrees,
7249
+ findProjectProfileKey,
7069
7250
  findSlackCoordinator,
7070
7251
  findThreadByRef,
7071
7252
  findThreadForStackLayer,
@@ -7076,6 +7257,7 @@ export {
7076
7257
  forkChatTab,
7077
7258
  forkMessageSlice,
7078
7259
  forkThreadWorktree,
7260
+ formatAccountProfilePlaybookLine,
7079
7261
  formatAgentInstructions,
7080
7262
  formatArtifactDirective,
7081
7263
  formatBrightsyFetchError,
@@ -7094,6 +7276,7 @@ export {
7094
7276
  formatPlanQuestionsForChat,
7095
7277
  formatPrGateDirective,
7096
7278
  formatProcessGuideDirective,
7279
+ formatProjectProfilePlaybookLines,
7097
7280
  formatRateLimitResetHint,
7098
7281
  formatRenameBranchDirective,
7099
7282
  formatScheduleWhen,
@@ -7107,6 +7290,7 @@ export {
7107
7290
  formatTranscriptMarkdown,
7108
7291
  formatUiReminder,
7109
7292
  formatWorkspaceInventory,
7293
+ formatWorkspaceProfileSuffix,
7110
7294
  formatWorktreeDirective,
7111
7295
  formatWorktreeReminder,
7112
7296
  forwardContextUsage,
@@ -7212,11 +7396,13 @@ export {
7212
7396
  isPresentPlanToolName,
7213
7397
  isPrimaryCheckoutThread,
7214
7398
  isSessionQuotaLimit,
7399
+ isSetupLastError,
7215
7400
  isShellToolName,
7216
7401
  isSideboardScratchPath,
7217
7402
  isSlackCoordinatorThread,
7218
7403
  isSlackExternalReplyPrompt,
7219
7404
  isSlackOAuthCancelled,
7405
+ isStaleLastErrorDuringTurn,
7220
7406
  isSubagentToolName,
7221
7407
  isThinkingEffort,
7222
7408
  isThisProcessDesktopHost,
@@ -7285,6 +7471,7 @@ export {
7285
7471
  mergeAgentGitAuthEnv,
7286
7472
  mergePr,
7287
7473
  mergePrStack,
7474
+ mergeSetupOutput,
7288
7475
  mergeSideboardIntoMcpServersJson,
7289
7476
  mergeUsage,
7290
7477
  messagePartParentId,
@@ -7333,6 +7520,7 @@ export {
7333
7520
  planQuestionsSignature,
7334
7521
  pollSlackOutboundWatches,
7335
7522
  posixShellSingleQuote,
7523
+ preferTeamsForRole,
7336
7524
  preferredCursorCostCents,
7337
7525
  prepareTerminalCommand,
7338
7526
  previewLand,
@@ -7341,6 +7529,7 @@ export {
7341
7529
  readExistingReviewRequestFile,
7342
7530
  readKeychainVaultKey,
7343
7531
  readPlanFile,
7532
+ readSetupLog,
7344
7533
  readSkillBody,
7345
7534
  readThread,
7346
7535
  readWorktreeFile,
@@ -7362,6 +7551,8 @@ export {
7362
7551
  requireAgent,
7363
7552
  resetGhStackDetectCache,
7364
7553
  resetGithubAgentTokenMemo,
7554
+ resolveAccountProfile,
7555
+ resolveAccountProfileFromSettings,
7365
7556
  resolveAgentExecutable,
7366
7557
  resolveAgentGitAuthEnv,
7367
7558
  resolveClaudeExecutable,
@@ -7393,7 +7584,10 @@ export {
7393
7584
  resolveThreadDefaults,
7394
7585
  resolveThreadEffort,
7395
7586
  resolveVaultKey,
7587
+ resolveViewerProfile,
7588
+ resolveViewerProfileForRepo,
7396
7589
  resolveWorktreeStartPoint,
7590
+ reviewTeamHintsForRoles,
7397
7591
  rewriteAbleTimeError,
7398
7592
  rewriteLinearError,
7399
7593
  run,
@@ -7426,6 +7620,7 @@ export {
7426
7620
  shouldRemoveWorktreeOnTeardown,
7427
7621
  shouldResetSessionForOccupancy,
7428
7622
  shouldRunWorktreeCleanup,
7623
+ shouldStampSetupLastError,
7429
7624
  showCostEnabled,
7430
7625
  sideboardHomeDir,
7431
7626
  sideboardMcpProfile,
@@ -7493,6 +7688,7 @@ export {
7493
7688
  updateIntegrationsSettings,
7494
7689
  updateLinearIssue,
7495
7690
  updateOpencodeSettings,
7691
+ updateProjectProfileSettings,
7496
7692
  updateSchedule,
7497
7693
  updateThread,
7498
7694
  userClaudeMcpConfigPath,