@sideboard-ai/core 0.1.152 → 0.1.153

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-7BQNSUR2.js → chunk-2NRNP7QP.js} +357 -185
  12. package/dist/{chunk-4XNSGDXE.js → chunk-3BWVOUQG.js} +244 -1
  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-WLV7TRMR.js → chunk-JOK4XWBG.js} +1 -1
  21. package/dist/{chunk-BD2ICC4D.js → chunk-JTJHOYCU.js} +1 -1
  22. package/dist/{chunk-6X7Z34XE.js → chunk-KMNODRWF.js} +397 -173
  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 +1875 -765
  40. package/dist/index.d.cts +195 -11
  41. package/dist/index.d.ts +195 -11
  42. package/dist/index.js +298 -108
  43. package/dist/mcp/run-stdio.cjs +1743 -1228
  44. package/dist/mcp/run-stdio.js +232 -80
  45. package/dist/{orchestrator-NUA6SEV7.js → orchestrator-5PSHBLP6.js} +10 -12
  46. package/dist/{orchestrator-256DFPSX.js → orchestrator-ZSSU3FKW.js} +9 -11
  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,
@@ -152,6 +154,7 @@ import {
152
154
  listWorktreeFiles,
153
155
  loadAgentInstructions,
154
156
  maybeCompactContext,
157
+ mergeSetupOutput,
155
158
  messagesSinceLastBrightsyContextSummary,
156
159
  normalizeServiceOrigin,
157
160
  openPrStackLayers,
@@ -164,6 +167,7 @@ import {
164
167
  pollSlackOutboundWatches,
165
168
  previewLand,
166
169
  readExistingReviewRequestFile,
170
+ readSetupLog,
167
171
  readSkillBody,
168
172
  readTurnLive,
169
173
  readWorktreeFile,
@@ -216,7 +220,7 @@ import {
216
220
  worktreeCleanupSettings,
217
221
  wrapReviewSkillMarkdown,
218
222
  writeWorktreeFile
219
- } from "./chunk-6X7Z34XE.js";
223
+ } from "./chunk-KMNODRWF.js";
220
224
  import {
221
225
  LEGACY_PLAN_FILE_REL,
222
226
  PLAN_FILE_NAME,
@@ -310,49 +314,33 @@ import {
310
314
  withEventParentId,
311
315
  withEventsParentId,
312
316
  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";
317
+ } from "./chunk-QZEZXYVV.js";
339
318
  import {
340
319
  CLOUD_COORDINATOR_BUSY_REPLY,
341
320
  CLOUD_COORDINATOR_STOPPED_REPLY,
342
321
  CLOUD_COORDINATOR_TIMEOUT_REPLY,
343
322
  CLOUD_ORCHESTRATOR_GOAL,
323
+ COORDINATOR_TOOL_PLAYBOOK,
344
324
  GLOBAL_WORKSPACE_ID,
345
325
  ORCHESTRATOR_AGENT_KINDS,
346
326
  SIDEBOARD_FORCE_STOP,
327
+ SLACK_REPLY_FORMATTING,
328
+ addWorkspace,
347
329
  assertOrchestratorCapableAgent,
348
330
  attachmentFromAbsolutePath,
349
331
  attachmentsFromBuffers,
350
332
  attachmentsFromWorktreePaths,
351
333
  coerceOrchestratorAgent,
334
+ coordinatorSystemPrompt,
335
+ coordinatorTurnReminder,
352
336
  createGlobalChat,
337
+ enrichWorkspacesWithGithub,
353
338
  ensureCloudCoordinator,
339
+ ensureGlobalCoordinatorCwd,
354
340
  ensureSlackCoordinator,
341
+ ensureWorkspace,
355
342
  findSlackCoordinator,
343
+ formatWorkspaceInventory,
356
344
  healOrchestrationSoccerTitles,
357
345
  isCloudCoordinatorThread,
358
346
  isGlobalRepoPath,
@@ -362,24 +350,18 @@ import {
362
350
  isOrchestratorThread,
363
351
  isSlackCoordinatorThread,
364
352
  listGlobalThreads,
353
+ listWorkspaces,
365
354
  orchestrationTitleNeedsSoccerNickname,
366
355
  orchestratorSessionPoisonedByBuiltins,
367
356
  parseForceStopMessage,
368
357
  persistPendingFileAttachments,
358
+ removeWorkspace,
369
359
  slackCoordinatorSourceRef,
370
360
  stageAbsolutePathsAsAttachments,
371
361
  stageBuffersAsAttachments,
362
+ syncWorkspacesFromThreads,
372
363
  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";
364
+ } from "./chunk-2F63IMCL.js";
383
365
  import {
384
366
  FAMOUS_SOCCER_TEAMS,
385
367
  GITHUB_PR_BODY_MAX_CHARS,
@@ -457,6 +439,7 @@ import {
457
439
  resolveDiffBaseRef,
458
440
  resolveGithubAgentToken,
459
441
  resolveGithubRepoSlug,
442
+ resolveListPrsOptions,
460
443
  resolvePrSelector,
461
444
  resolvePrSelectors,
462
445
  resolveRepoRoot,
@@ -471,7 +454,7 @@ import {
471
454
  worktreeDisplayLabel,
472
455
  worktreeDisplayLabelForGroup,
473
456
  worktreeNameFromPath
474
- } from "./chunk-GE7M3QTE.js";
457
+ } from "./chunk-LQMFCS54.js";
475
458
  import {
476
459
  ATTACHMENTS_DIR,
477
460
  DETACHED_JOBS_DIR,
@@ -480,6 +463,24 @@ import {
480
463
  attachmentsGitignoreBody,
481
464
  isWorkspaceScratchPath
482
465
  } from "./chunk-JRH62XC4.js";
466
+ import {
467
+ brightsyMcpServerName,
468
+ connectBrightsyTeam,
469
+ disconnectBrightsyTeam,
470
+ ensureConnectedBrightsyTeamTokens,
471
+ getBrightsySession,
472
+ listBrightsyAccounts,
473
+ listConnectedBrightsyTeams,
474
+ switchBrightsyAccount
475
+ } from "./chunk-XD2BAANL.js";
476
+ import {
477
+ brightsyAccessTokenNeedsRefresh,
478
+ brightsyConfigPath,
479
+ ensureBrightsyLocalConfigFresh,
480
+ loadBrightsyConfig,
481
+ refreshBrightsyAccessToken,
482
+ saveBrightsyConfig
483
+ } from "./chunk-M267JPEA.js";
483
484
  import {
484
485
  ABLETIME_MCP_PATH,
485
486
  DEFAULT_ABLETIME_HOST,
@@ -501,7 +502,7 @@ import {
501
502
  taskUrl,
502
503
  toAbleTimeIssueInfo,
503
504
  verifyAbleTimeConnection
504
- } from "./chunk-WLV7TRMR.js";
505
+ } from "./chunk-JOK4XWBG.js";
505
506
  import {
506
507
  formatFetchError,
507
508
  httpFetch,
@@ -518,10 +519,16 @@ import {
518
519
  withMaxOldSpaceSize
519
520
  } from "./chunk-HEII7W3Q.js";
520
521
  import {
522
+ ACCOUNT_ROLES,
523
+ ACCOUNT_ROLE_LABELS,
524
+ ACCOUNT_ROLE_MAX,
525
+ ACCOUNT_ROLE_PRESETS,
521
526
  FOLLOW_UP_BEHAVIORS,
522
527
  GITHUB_GIT_AUTH_MODES,
523
528
  HARNESS_ENV_KEYS,
524
529
  ISSUE_SOURCE_LABELS,
530
+ PROFILE_NOTES_MAX,
531
+ accountRoleLabel,
525
532
  appSettingsPath,
526
533
  applyAppEnvironment,
527
534
  autoArchiveOnMergeEnabled,
@@ -544,7 +551,11 @@ import {
544
551
  disconnectLinearConnection,
545
552
  emptyPublicIntegrations,
546
553
  ensureSlackDeviceIdentity,
554
+ findProjectProfileKey,
547
555
  followUpBehavior,
556
+ formatAccountProfilePlaybookLine,
557
+ formatProjectProfilePlaybookLines,
558
+ formatWorkspaceProfileSuffix,
548
559
  getAbleTimeAccessToken,
549
560
  getAbleTimeHost,
550
561
  getDefaultAgent,
@@ -565,13 +576,19 @@ import {
565
576
  orchestrationQuotaFallbackAgent,
566
577
  orchestrationQuotaOnLimit,
567
578
  persistVaultKeyInKeychain,
579
+ preferTeamsForRole,
568
580
  readKeychainVaultKey,
581
+ resolveAccountProfile,
582
+ resolveAccountProfileFromSettings,
569
583
  resolveAgentExecutable,
570
584
  resolveClaudeExecutable,
571
585
  resolveEffectiveIssueSource,
572
586
  resolveNewThreadOptions,
573
587
  resolveThreadDefaults,
574
588
  resolveVaultKey,
589
+ resolveViewerProfile,
590
+ resolveViewerProfileForRepo,
591
+ reviewTeamHintsForRoles,
575
592
  saveAbleTimeConnection,
576
593
  saveAppSettings,
577
594
  saveLinearOAuth,
@@ -589,8 +606,9 @@ import {
589
606
  updateCodexSettings,
590
607
  updateDefaultsSettings,
591
608
  updateIntegrationsSettings,
592
- updateOpencodeSettings
593
- } from "./chunk-4XNSGDXE.js";
609
+ updateOpencodeSettings,
610
+ updateProjectProfileSettings
611
+ } from "./chunk-3BWVOUQG.js";
594
612
  import {
595
613
  stripNestedElectronEnv
596
614
  } from "./chunk-4TR3HZFT.js";
@@ -600,7 +618,7 @@ import {
600
618
  isThreadCaffeinated,
601
619
  releaseCaffeinateHoldForThread,
602
620
  setCaffeinateHold
603
- } from "./chunk-DCOZABNT.js";
621
+ } from "./chunk-AO35MGOE.js";
604
622
  import "./chunk-JT7R45JB.js";
605
623
  import {
606
624
  appendMessage,
@@ -617,7 +635,7 @@ import {
617
635
  updateThread,
618
636
  withThreadLock,
619
637
  writeThread
620
- } from "./chunk-TUGKX5BD.js";
638
+ } from "./chunk-7UURXPKD.js";
621
639
  import {
622
640
  THINKING_EFFORTS,
623
641
  isThinkingEffort,
@@ -653,7 +671,7 @@ import {
653
671
  threadsDir,
654
672
  workspaceSettingsSourceLabel,
655
673
  worktreesRoot
656
- } from "./chunk-QZQEXME2.js";
674
+ } from "./chunk-EFVFB2AH.js";
657
675
  import "./chunk-QQKDGPUI.js";
658
676
  import {
659
677
  conductorBundledBinDir,
@@ -1021,7 +1039,7 @@ var ISSUE_FIELDS = `
1021
1039
  state { id name type }
1022
1040
  assignee { id name }
1023
1041
  creator { id name }
1024
- team { id key name states(first: 50) { nodes { id name type } } }
1042
+ team { id key name }
1025
1043
  labels(first: 50) { nodes { name } }
1026
1044
  cycle { name number startsAt endsAt completedAt }
1027
1045
  project { id name }
@@ -1502,7 +1520,9 @@ async function updateLinearIssue(input, opts) {
1502
1520
  }
1503
1521
  if (input.state?.trim()) {
1504
1522
  const existing = await getLinearIssue(issueId, opts);
1505
- const team = existing.team;
1523
+ const { teams } = await listLinearTeams(opts);
1524
+ const teamRef = existing.team?.key || existing.team?.id;
1525
+ const team = teamRef ? resolveLinearTeam(teams, teamRef) : void 0;
1506
1526
  if (!team?.states.length) {
1507
1527
  throw new Error(`Linear issue ${existing.identifier} has no workflow states to resolve "${input.state}"`);
1508
1528
  }
@@ -1559,6 +1579,11 @@ async function validateLinearApiKey(apiKey) {
1559
1579
  function assigneeKey(assignee) {
1560
1580
  return (assignee ?? "").trim().toLowerCase();
1561
1581
  }
1582
+ function takeIssuePage(issues, limit) {
1583
+ if (limit == null) return issues;
1584
+ const n = Math.max(1, Math.min(1e3, Math.floor(limit)));
1585
+ return issues.slice(0, n);
1586
+ }
1562
1587
  function issueMatchesAssignee(issue, assignee, viewerName = "") {
1563
1588
  const key = assigneeKey(assignee);
1564
1589
  if (!key || key === "all" || key === "*") return true;
@@ -1660,13 +1685,33 @@ async function listIssues(repoPath, opts) {
1660
1685
  };
1661
1686
  }
1662
1687
  if (source === "abletime") {
1663
- const [listed, searched] = await Promise.all([
1664
- listAbleTimeAssignedIssues(),
1665
- query ? searchAbleTimeTasks(query) : Promise.resolve(null)
1666
- ]);
1688
+ if (query) {
1689
+ const [searched, orientation] = await Promise.all([
1690
+ searchAbleTimeTasks(query),
1691
+ getAbleTimeOrientation().catch(() => null)
1692
+ ]);
1693
+ const viewerName2 = orientation?.viewer.name ?? orientation?.viewer.id ?? "";
1694
+ const issues3 = takeIssuePage(
1695
+ searched.map(toAbleTimeIssueInfo).filter((issue) => issueMatchesAssignee(issue, assignee, viewerName2)),
1696
+ opts?.limit
1697
+ );
1698
+ return {
1699
+ source,
1700
+ preferredSource,
1701
+ linearConnected,
1702
+ abletimeConnected,
1703
+ issues: issues3,
1704
+ viewer: {
1705
+ login: orientation?.viewer.name,
1706
+ name: orientation?.viewer.name
1707
+ }
1708
+ };
1709
+ }
1710
+ const listed = await listAbleTimeAssignedIssues();
1667
1711
  const viewerName = listed.viewer.name ?? listed.viewer.id ?? "";
1668
- const issues2 = (searched ? searched.map(toAbleTimeIssueInfo) : listed.issues).filter(
1669
- (issue) => issueMatchesAssignee(issue, assignee, viewerName)
1712
+ const issues2 = takeIssuePage(
1713
+ listed.issues.filter((issue) => issueMatchesAssignee(issue, assignee, viewerName)),
1714
+ opts?.limit
1670
1715
  );
1671
1716
  return {
1672
1717
  source,
@@ -2586,12 +2631,53 @@ function registerSlackTools(server) {
2586
2631
 
2587
2632
  // src/mcp/abletime-tools.ts
2588
2633
  import { z as z2 } from "zod";
2589
- function text2(payload, isError = false) {
2634
+
2635
+ // src/mcp/issue-list.ts
2636
+ var MCP_ISSUE_LIST_DEFAULT_LIMIT = 40;
2637
+ var MCP_ISSUE_LIST_MAX_LIMIT = 250;
2638
+ function clampMcpIssueLimit(limit) {
2639
+ if (limit == null || !Number.isFinite(limit)) return MCP_ISSUE_LIST_DEFAULT_LIMIT;
2640
+ return Math.max(1, Math.min(MCP_ISSUE_LIST_MAX_LIMIT, Math.floor(limit)));
2641
+ }
2642
+ function applyIssueListWindow(items, limit) {
2643
+ const truncated = items.length > limit;
2590
2644
  return {
2591
- content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
2645
+ items: truncated ? items.slice(0, limit) : items,
2646
+ truncated
2647
+ };
2648
+ }
2649
+ function compactIssueRow(issue) {
2650
+ return {
2651
+ identifier: issue.identifier,
2652
+ title: issue.title,
2653
+ ...issue.assignee ? { assignee: issue.assignee } : {},
2654
+ ...issue.labels.length > 0 ? { labels: issue.labels } : {},
2655
+ ...issue.teamKey ? { team: issue.teamKey } : {},
2656
+ ...issue.cycle?.name ? { cycle: issue.cycle.name } : {}
2657
+ };
2658
+ }
2659
+ function formatMcpIssueList(input) {
2660
+ return {
2661
+ ...input.source ? { source: input.source } : {},
2662
+ ...input.viewer ? { viewer: input.viewer } : {},
2663
+ limit: input.limit,
2664
+ returned: input.issues.length,
2665
+ truncated: input.truncated,
2666
+ ...input.truncated ? { hint: "More issues match. Pass a higher limit (max 250) or a tighter query." } : {},
2667
+ issues: input.issues.map(compactIssueRow)
2668
+ };
2669
+ }
2670
+ function mcpJson(payload, isError = false) {
2671
+ return {
2672
+ content: [{ type: "text", text: JSON.stringify(payload) }],
2592
2673
  ...isError ? { isError: true } : {}
2593
2674
  };
2594
2675
  }
2676
+
2677
+ // src/mcp/abletime-tools.ts
2678
+ function text2(payload, isError = false) {
2679
+ return mcpJson(payload, isError);
2680
+ }
2595
2681
  function fail2(err) {
2596
2682
  return text2(
2597
2683
  { error: err instanceof Error ? err.message : String(err) },
@@ -2601,7 +2687,7 @@ function fail2(err) {
2601
2687
  function registerAbleTimeTools(server) {
2602
2688
  server.tool(
2603
2689
  "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.",
2690
+ "Call first when using AbleTime. Returns viewer, active tasks, and projects.",
2605
2691
  {},
2606
2692
  async () => {
2607
2693
  try {
@@ -2618,7 +2704,7 @@ function registerAbleTimeTools(server) {
2618
2704
  );
2619
2705
  server.tool(
2620
2706
  "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.",
2707
+ "List AbleTime projects (and categories). Use a project id on create/ensure.",
2622
2708
  {},
2623
2709
  async () => {
2624
2710
  try {
@@ -2686,7 +2772,7 @@ function registerAbleTimeTools(server) {
2686
2772
  );
2687
2773
  server.tool(
2688
2774
  "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.",
2775
+ "Find or create an AbleTime task for this work, then create_thread with sourceType=ticket.",
2690
2776
  {
2691
2777
  title: z2.string(),
2692
2778
  description: z2.string().optional(),
@@ -2707,10 +2793,7 @@ function registerAbleTimeTools(server) {
2707
2793
  // src/mcp/linear-tools.ts
2708
2794
  import { z as z3 } from "zod";
2709
2795
  function text3(payload, isError = false) {
2710
- return {
2711
- content: [{ type: "text", text: JSON.stringify(payload, null, 2) }],
2712
- ...isError ? { isError: true } : {}
2713
- };
2796
+ return mcpJson(payload, isError);
2714
2797
  }
2715
2798
  function fail3(err) {
2716
2799
  return text3(
@@ -2722,7 +2805,7 @@ var prioritySchema = z3.number().int().min(0).max(4).optional().describe("0 none
2722
2805
  function registerLinearTools(server) {
2723
2806
  server.tool(
2724
2807
  "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.",
2808
+ "List Linear teams (id, key, name) and workflow states. Use team key on create; state name or type on create/update.",
2726
2809
  {},
2727
2810
  async () => {
2728
2811
  try {
@@ -2734,15 +2817,30 @@ function registerLinearTools(server) {
2734
2817
  );
2735
2818
  server.tool(
2736
2819
  "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).",
2820
+ "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
2821
  {
2739
2822
  query: z3.string().optional().describe("Search text (identifier, title, description). Omit to list by assignee only."),
2740
2823
  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()
2824
+ limit: z3.number().int().positive().max(250).optional().describe("Page size (default 40, max 250). Raise when truncated is true.")
2742
2825
  },
2743
2826
  async ({ query, assignee, limit }) => {
2744
2827
  try {
2745
- return text3(await listLinearIssuesFiltered({ query, assignee, limit }));
2828
+ const page = clampMcpIssueLimit(limit);
2829
+ const listed = await listLinearIssuesFiltered({
2830
+ query,
2831
+ assignee,
2832
+ limit: page + 1
2833
+ });
2834
+ const windowed = applyIssueListWindow(listed.issues, page);
2835
+ return mcpJson(
2836
+ formatMcpIssueList({
2837
+ source: "linear",
2838
+ viewer: listed.viewer.name,
2839
+ limit: page,
2840
+ issues: windowed.items,
2841
+ truncated: windowed.truncated
2842
+ })
2843
+ );
2746
2844
  } catch (err) {
2747
2845
  return fail3(err);
2748
2846
  }
@@ -2750,7 +2848,7 @@ function registerLinearTools(server) {
2750
2848
  );
2751
2849
  server.tool(
2752
2850
  "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.",
2851
+ "Get a Linear issue by uuid or identifier (ENG-123): description, comments, relations, parent/children.",
2754
2852
  { id: z3.string() },
2755
2853
  async ({ id }) => {
2756
2854
  try {
@@ -2762,7 +2860,7 @@ function registerLinearTools(server) {
2762
2860
  );
2763
2861
  server.tool(
2764
2862
  "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.',
2863
+ '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
2864
  {
2767
2865
  team: z3.string(),
2768
2866
  title: z3.string(),
@@ -2781,7 +2879,7 @@ function registerLinearTools(server) {
2781
2879
  );
2782
2880
  server.tool(
2783
2881
  "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.',
2882
+ "Update a Linear issue (uuid or ENG-123). Pass title, description, state, assignee, and/or priority.",
2785
2883
  {
2786
2884
  id: z3.string(),
2787
2885
  title: z3.string().optional(),
@@ -2815,6 +2913,46 @@ function registerLinearTools(server) {
2815
2913
  );
2816
2914
  }
2817
2915
 
2916
+ // src/mcp/issue-vendor-tools.ts
2917
+ function registerConnectedIssueVendorTools(server, settings = loadAppSettings()) {
2918
+ if (isLinearConnected(settings)) registerLinearTools(server);
2919
+ if (isAbleTimeConnected(settings)) registerAbleTimeTools(server);
2920
+ }
2921
+
2922
+ // src/mcp/pr-list.ts
2923
+ function compactPrRow(pr) {
2924
+ return {
2925
+ number: pr.number,
2926
+ title: pr.title,
2927
+ ...pr.headRefName ? { head: pr.headRefName } : {},
2928
+ ...pr.author?.login ? { author: pr.author.login } : {},
2929
+ ...pr.state ? { state: pr.state } : {},
2930
+ ...pr.isDraft ? { draft: true } : {},
2931
+ ...pr.labels?.length ? { labels: pr.labels } : {},
2932
+ ...pr.reviewers?.length ? { reviewers: pr.reviewers } : {},
2933
+ ...pr.teams?.length ? { teams: pr.teams } : {},
2934
+ ...pr.reviewDecision ? { reviewDecision: pr.reviewDecision } : {},
2935
+ ...pr.tickets?.length ? { tickets: pr.tickets } : {}
2936
+ };
2937
+ }
2938
+ function formatMcpPrList(input) {
2939
+ return {
2940
+ ...input.viewer ? { viewer: input.viewer } : {},
2941
+ ...input.queue ? { queue: input.queue } : {},
2942
+ state: input.state,
2943
+ ...input.labels?.length ? { labels: input.labels } : {},
2944
+ ...input.reviewer ? { reviewer: input.reviewer } : {},
2945
+ ...input.query ? { query: input.query } : {},
2946
+ limit: input.limit,
2947
+ returned: input.prs.length,
2948
+ truncated: input.truncated,
2949
+ ...input.truncated ? {
2950
+ hint: "More PRs match. Pass a higher limit (max 250) or tighten label / reviewer / query."
2951
+ } : {},
2952
+ prs: input.prs.map(compactPrRow)
2953
+ };
2954
+ }
2955
+
2818
2956
  // src/mcp/schedule-tools.ts
2819
2957
  import { z as z4 } from "zod";
2820
2958
  function text4(payload, isError = false) {
@@ -3373,7 +3511,7 @@ async function startMcpServer() {
3373
3511
  );
3374
3512
  }
3375
3513
  try {
3376
- const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-3CHCNIMD.js");
3514
+ const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-H3INSR67.js");
3377
3515
  orch.setMaxConcurrent(maxConcurrentAgents2());
3378
3516
  } catch {
3379
3517
  }
@@ -3393,14 +3531,21 @@ async function startMcpServer() {
3393
3531
  if (!worktreeProfile) {
3394
3532
  server.tool(
3395
3533
  "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.",
3534
+ "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
3535
  {},
3398
3536
  async () => {
3399
3537
  const workspaces = orch.listWorkspaces();
3400
3538
  const lines = await Promise.all(
3401
3539
  workspaces.map(async (w) => {
3402
3540
  const slug = await resolveGithubRepoSlug(w.path).catch(() => null);
3403
- return slug ? `${w.name} ${w.path} github:${slug}` : `${w.name} ${w.path}`;
3541
+ let profile;
3542
+ try {
3543
+ profile = resolveViewerProfileForRepo(w.path);
3544
+ } catch {
3545
+ profile = resolveViewerProfile();
3546
+ }
3547
+ const suffix = formatWorkspaceProfileSuffix(profile);
3548
+ return slug ? `${w.name} ${w.path} github:${slug}${suffix}` : `${w.name} ${w.path}${suffix}`;
3404
3549
  })
3405
3550
  );
3406
3551
  return {
@@ -3653,11 +3798,10 @@ async function startMcpServer() {
3653
3798
  );
3654
3799
  if (!worktreeProfile) {
3655
3800
  registerSlackTools(server);
3656
- registerLinearTools(server);
3657
- registerAbleTimeTools(server);
3801
+ registerConnectedIssueVendorTools(server);
3658
3802
  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");
3803
+ const { getCaffeinateHold: getCaffeinateHold2, setCaffeinateHold: setCaffeinateHold2 } = await import("./caffeinate-hold-SK2QISPE.js");
3804
+ const { resolveNewThreadOptions: resolveNewThreadOptions2, resolveThreadDefaults: resolveThreadDefaults2 } = await import("./app-settings-H3INSR67.js");
3661
3805
  const accountDefaults = resolveThreadDefaults2();
3662
3806
  const accountDefaultsHint = `Account defaults: agent=${accountDefaults.agent}, model=${accountDefaults.model?.trim() || "Auto"}, effort=${accountDefaults.effort}`;
3663
3807
  server.tool(
@@ -3700,7 +3844,7 @@ async function startMcpServer() {
3700
3844
  );
3701
3845
  server.tool(
3702
3846
  "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.`,
3847
+ `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
3848
  {
3705
3849
  sourceType: z5.enum(["branch", "pr", "ticket"]),
3706
3850
  sourceRef: z5.string(),
@@ -3727,7 +3871,7 @@ async function startMcpServer() {
3727
3871
  );
3728
3872
  server.tool(
3729
3873
  "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.",
3874
+ "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
3875
  {
3732
3876
  kind: z5.enum(["ticket", "pr", "branch"]),
3733
3877
  ref: z5.string().describe("Ticket identifier (ENG-12), PR number (44), or branch name from list_board"),
@@ -4373,21 +4517,47 @@ async function startMcpServer() {
4373
4517
  );
4374
4518
  server.tool(
4375
4519
  "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 }) => {
4520
+ '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.',
4521
+ {
4522
+ repoPath: z5.string(),
4523
+ query: z5.string().optional().describe("GitHub search tokens (title, draft:true, \u2026)"),
4524
+ queue: z5.enum(["review", "mine", "approved", "changes"]).optional().describe(
4525
+ 'review = unclaimed eng-review inbox (use for "get me N tickets to review"). mine = review-requested:@me. approved / changes = eng-approved / eng-requested-changes.'
4526
+ ),
4527
+ state: z5.enum(["open", "closed", "merged", "all", "review"]).optional().describe("GitHub PR state (default open). review is an alias for queue=review."),
4528
+ label: z5.string().optional().describe(
4529
+ "GitHub label / workflow tag. Comma-separated AND. Examples: eng-review, eng-approved, eng-requested-changes"
4530
+ ),
4531
+ reviewer: z5.string().optional().describe(
4532
+ "me (review requested of you), unassigned (no individual reviewer; team queues like engineering-team still count), all, or a GitHub login"
4533
+ ),
4534
+ limit: z5.number().int().positive().max(250).optional().describe("Page size (default 40, max 250). Raise when truncated is true.")
4535
+ },
4536
+ async ({ repoPath, query, queue, state, label, reviewer, limit }) => {
4379
4537
  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
- };
4538
+ const page = clampMcpIssueLimit(limit);
4539
+ const resolved = resolveListPrsOptions({
4540
+ query,
4541
+ queue,
4542
+ state,
4543
+ labels: label,
4544
+ reviewer,
4545
+ limit: page + 1
4546
+ });
4547
+ const prs = await listPrs(root, resolved);
4548
+ const windowed = applyIssueListWindow(prs, page);
4549
+ return mcpJson(
4550
+ formatMcpPrList({
4551
+ queue: resolved.queue,
4552
+ state: resolved.state,
4553
+ labels: resolved.labels,
4554
+ reviewer: resolved.reviewer,
4555
+ query: resolved.query,
4556
+ limit: page,
4557
+ prs: windowed.items,
4558
+ truncated: windowed.truncated
4559
+ })
4560
+ );
4391
4561
  }
4392
4562
  );
4393
4563
  server.tool(
@@ -4512,28 +4682,27 @@ async function startMcpServer() {
4512
4682
  );
4513
4683
  server.tool(
4514
4684
  "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.",
4685
+ "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
4686
  {
4517
4687
  repoPath: z5.string(),
4518
4688
  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")
4689
+ assignee: z5.string().optional().describe("me (Linear default), unassigned, all, a user id, or a GitHub login"),
4690
+ limit: z5.number().int().positive().max(250).optional().describe("Page size (default 40, max 250). Raise when truncated is true.")
4520
4691
  },
4521
- async ({ repoPath, query, assignee }) => {
4692
+ async ({ repoPath, query, assignee, limit }) => {
4522
4693
  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) }] };
4694
+ const page = clampMcpIssueLimit(limit);
4695
+ const result = await listIssues(root, { query, assignee, limit: page + 1 });
4696
+ const windowed = applyIssueListWindow(result.issues, page);
4697
+ return mcpJson(
4698
+ formatMcpIssueList({
4699
+ source: result.source,
4700
+ viewer: result.viewer?.name || result.viewer?.login,
4701
+ limit: page,
4702
+ issues: windowed.items,
4703
+ truncated: windowed.truncated
4704
+ })
4705
+ );
4537
4706
  }
4538
4707
  );
4539
4708
  }
@@ -6816,6 +6985,10 @@ async function startSlackRelayServer(opts) {
6816
6985
  }
6817
6986
  export {
6818
6987
  ABLETIME_MCP_PATH,
6988
+ ACCOUNT_ROLES,
6989
+ ACCOUNT_ROLE_LABELS,
6990
+ ACCOUNT_ROLE_MAX,
6991
+ ACCOUNT_ROLE_PRESETS,
6819
6992
  AGENT_GIT_ACTIONS,
6820
6993
  AGENT_RUNNER_MAX_OLD_SPACE_MB,
6821
6994
  ATTACHMENTS_DIR,
@@ -6872,6 +7045,7 @@ export {
6872
7045
  PLAN_FILE_REL,
6873
7046
  PLAN_MODE_INSTRUCTION,
6874
7047
  PLAN_QUESTION_ANSWERS_PREFIX,
7048
+ PROFILE_NOTES_MAX,
6875
7049
  REPO_REVIEW_NAME,
6876
7050
  REPO_REVIEW_PATH,
6877
7051
  REVIEW_REQUEST_NAME,
@@ -6898,6 +7072,7 @@ export {
6898
7072
  WORKTREE_MCP_TOOLS,
6899
7073
  abletimeMcpRequest,
6900
7074
  abletimeMcpUrl,
7075
+ accountRoleLabel,
6901
7076
  ackSlackInboundSeen,
6902
7077
  addBoardPin,
6903
7078
  addPrStackLayer,
@@ -7032,6 +7207,7 @@ export {
7032
7207
  discoverSkills,
7033
7208
  dropCachedPrefixOnResume,
7034
7209
  emptyPublicIntegrations,
7210
+ emptySetupLog,
7035
7211
  encodeBrightsyTarget,
7036
7212
  enrichPathWithNpmGlobalBin,
7037
7213
  enrichWorkspacesWithGithub,
@@ -7065,7 +7241,9 @@ export {
7065
7241
  findInvalidCacheControlTtlOrder,
7066
7242
  findLastBrightsyContextSummary,
7067
7243
  findLiveThreadForCreate,
7244
+ findLiveThreadForCreateSource,
7068
7245
  findOrphanWorktrees,
7246
+ findProjectProfileKey,
7069
7247
  findSlackCoordinator,
7070
7248
  findThreadByRef,
7071
7249
  findThreadForStackLayer,
@@ -7076,6 +7254,7 @@ export {
7076
7254
  forkChatTab,
7077
7255
  forkMessageSlice,
7078
7256
  forkThreadWorktree,
7257
+ formatAccountProfilePlaybookLine,
7079
7258
  formatAgentInstructions,
7080
7259
  formatArtifactDirective,
7081
7260
  formatBrightsyFetchError,
@@ -7094,6 +7273,7 @@ export {
7094
7273
  formatPlanQuestionsForChat,
7095
7274
  formatPrGateDirective,
7096
7275
  formatProcessGuideDirective,
7276
+ formatProjectProfilePlaybookLines,
7097
7277
  formatRateLimitResetHint,
7098
7278
  formatRenameBranchDirective,
7099
7279
  formatScheduleWhen,
@@ -7107,6 +7287,7 @@ export {
7107
7287
  formatTranscriptMarkdown,
7108
7288
  formatUiReminder,
7109
7289
  formatWorkspaceInventory,
7290
+ formatWorkspaceProfileSuffix,
7110
7291
  formatWorktreeDirective,
7111
7292
  formatWorktreeReminder,
7112
7293
  forwardContextUsage,
@@ -7285,6 +7466,7 @@ export {
7285
7466
  mergeAgentGitAuthEnv,
7286
7467
  mergePr,
7287
7468
  mergePrStack,
7469
+ mergeSetupOutput,
7288
7470
  mergeSideboardIntoMcpServersJson,
7289
7471
  mergeUsage,
7290
7472
  messagePartParentId,
@@ -7333,6 +7515,7 @@ export {
7333
7515
  planQuestionsSignature,
7334
7516
  pollSlackOutboundWatches,
7335
7517
  posixShellSingleQuote,
7518
+ preferTeamsForRole,
7336
7519
  preferredCursorCostCents,
7337
7520
  prepareTerminalCommand,
7338
7521
  previewLand,
@@ -7341,6 +7524,7 @@ export {
7341
7524
  readExistingReviewRequestFile,
7342
7525
  readKeychainVaultKey,
7343
7526
  readPlanFile,
7527
+ readSetupLog,
7344
7528
  readSkillBody,
7345
7529
  readThread,
7346
7530
  readWorktreeFile,
@@ -7362,6 +7546,8 @@ export {
7362
7546
  requireAgent,
7363
7547
  resetGhStackDetectCache,
7364
7548
  resetGithubAgentTokenMemo,
7549
+ resolveAccountProfile,
7550
+ resolveAccountProfileFromSettings,
7365
7551
  resolveAgentExecutable,
7366
7552
  resolveAgentGitAuthEnv,
7367
7553
  resolveClaudeExecutable,
@@ -7393,7 +7579,10 @@ export {
7393
7579
  resolveThreadDefaults,
7394
7580
  resolveThreadEffort,
7395
7581
  resolveVaultKey,
7582
+ resolveViewerProfile,
7583
+ resolveViewerProfileForRepo,
7396
7584
  resolveWorktreeStartPoint,
7585
+ reviewTeamHintsForRoles,
7397
7586
  rewriteAbleTimeError,
7398
7587
  rewriteLinearError,
7399
7588
  run,
@@ -7493,6 +7682,7 @@ export {
7493
7682
  updateIntegrationsSettings,
7494
7683
  updateLinearIssue,
7495
7684
  updateOpencodeSettings,
7685
+ updateProjectProfileSettings,
7496
7686
  updateSchedule,
7497
7687
  updateThread,
7498
7688
  userClaudeMcpConfigPath,