@sideboard-ai/core 0.1.176 → 0.1.178

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 (31) hide show
  1. package/dist/{agents-544IX5KA.js → agents-2UD26PUT.js} +4 -4
  2. package/dist/{agents-UENEQ6J2.js → agents-XPWZG3JU.js} +4 -4
  3. package/dist/{chunk-3ZFGZ7RT.js → chunk-7T5XKNOF.js} +2 -2
  4. package/dist/{chunk-LZQULFIT.js → chunk-GOZ6T3AG.js} +2 -0
  5. package/dist/{chunk-4ELBAYFW.js → chunk-GVC4IVF5.js} +83 -17
  6. package/dist/{chunk-NIB6BTC6.js → chunk-IVJFEB3T.js} +3 -3
  7. package/dist/{chunk-JUA7XEXR.js → chunk-MZOZ6PIZ.js} +82 -16
  8. package/dist/{chunk-7UURXPKD.js → chunk-TCQAFTSV.js} +2 -0
  9. package/dist/{chunk-W44EKPIR.js → chunk-VUFJ5MAN.js} +3 -3
  10. package/dist/{chunk-7JIYKYLL.js → chunk-WXKXSZN4.js} +10 -7
  11. package/dist/{chunk-7O53GXTA.js → chunk-XBLN52RZ.js} +10 -7
  12. package/dist/{chunk-FJWQCZ74.js → chunk-XV3EFFZ6.js} +2 -2
  13. package/dist/{coordinator-prompt-PRM5ARWG.js → coordinator-prompt-3NRUXH3F.js} +3 -3
  14. package/dist/{coordinator-prompt-BE2FERYE.js → coordinator-prompt-GKH7Q7PK.js} +3 -3
  15. package/dist/{global-workspace-3HIWNQ3B.js → global-workspace-2FQU62S2.js} +3 -3
  16. package/dist/{global-workspace-J737XNUX.js → global-workspace-C2JMJXYV.js} +3 -3
  17. package/dist/index.cjs +90 -12
  18. package/dist/index.d.cts +25 -2
  19. package/dist/index.d.ts +25 -2
  20. package/dist/index.js +15 -7
  21. package/dist/mcp/run-stdio.cjs +133 -12
  22. package/dist/mcp/run-stdio.js +59 -8
  23. package/dist/{orchestrator-GDKEVLFK.js → orchestrator-HOMNNKMT.js} +7 -5
  24. package/dist/{orchestrator-2KZD7N4X.js → orchestrator-WNFMRRQP.js} +7 -5
  25. package/dist/{thread-store-KBFBHT5G.js → thread-store-RXXNSRVO.js} +1 -1
  26. package/dist/{thread-store-MVQU6HPJ.js → thread-store-ZL6GDIDP.js} +1 -1
  27. package/dist/{workspaces-ULHYXM4Y.js → workspaces-J3M3IPR3.js} +3 -3
  28. package/dist/{workspaces-DR4UNOQC.js → workspaces-YVZYX5H2.js} +3 -3
  29. package/dist/{worktree-LC4VRWDM.js → worktree-7LOSSD7G.js} +2 -2
  30. package/dist/{worktree-UTDBQXSS.js → worktree-LPWTX2NA.js} +2 -2
  31. package/package.json +1 -1
@@ -33,7 +33,7 @@ import {
33
33
  summarizeTurnStderr,
34
34
  toolDescription,
35
35
  turnFailChatText
36
- } from "./chunk-W44EKPIR.js";
36
+ } from "./chunk-VUFJ5MAN.js";
37
37
  import {
38
38
  extractPresentedPlan,
39
39
  readPlanFile,
@@ -64,7 +64,7 @@ import {
64
64
  stageAbsolutePathsAsAttachments,
65
65
  stageBuffersAsAttachments,
66
66
  syncWorkspacesFromThreads
67
- } from "./chunk-FJWQCZ74.js";
67
+ } from "./chunk-XV3EFFZ6.js";
68
68
  import {
69
69
  addPrStackLayer,
70
70
  allocateTeamName,
@@ -114,7 +114,7 @@ import {
114
114
  worktreeDisplayLabelForGroup,
115
115
  worktreeNameFromPath,
116
116
  worktreeSlugForTicket
117
- } from "./chunk-7O53GXTA.js";
117
+ } from "./chunk-XBLN52RZ.js";
118
118
  import {
119
119
  ATTACHMENTS_DIR,
120
120
  DETACHED_JOBS_DIR,
@@ -132,7 +132,7 @@ import {
132
132
  updateThread,
133
133
  withThreadLock,
134
134
  writeThread
135
- } from "./chunk-LZQULFIT.js";
135
+ } from "./chunk-GOZ6T3AG.js";
136
136
  import {
137
137
  ensureWorktreeSideboardIgnored
138
138
  } from "./chunk-SYFVUF2C.js";
@@ -148,6 +148,7 @@ import {
148
148
  assertOrchestratorCapableAgent,
149
149
  childEnvWithAppSettings,
150
150
  coerceOrchestratorAgent,
151
+ followUpBehavior,
151
152
  formatViewerContextDirective,
152
153
  formatViewerContextReminder,
153
154
  getIssueSource,
@@ -401,7 +402,7 @@ async function continueSourceThread(threadId, prompt) {
401
402
  await continueOnReply(threadId, prompt);
402
403
  return;
403
404
  }
404
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-2KZD7N4X.js");
405
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-WNFMRRQP.js");
405
406
  await getOrchestrator2().send(threadId, prompt);
406
407
  } catch {
407
408
  }
@@ -794,9 +795,9 @@ async function spawnAgentTurn(thread, input, onEvent) {
794
795
  `Cannot spawn ${thread.agent}: thread ${thread.id} has no worktreePath`
795
796
  );
796
797
  }
797
- const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-J737XNUX.js");
798
+ const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-C2JMJXYV.js");
798
799
  if (isGlobalThread2(thread)) {
799
- const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-BE2FERYE.js");
800
+ const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-GKH7Q7PK.js");
800
801
  ensureGlobalCoordinatorCwd2(
801
802
  isOrchestratorThread(thread) ? { orchestratorThreadId: thread.id } : void 0
802
803
  );
@@ -1536,6 +1537,8 @@ function worktreeBindingFrom(from) {
1536
1537
  prTitle: from.prTitle,
1537
1538
  prState: from.prState,
1538
1539
  prIsDraft: from.prIsDraft,
1540
+ prAuthorLogin: from.prAuthorLogin,
1541
+ prReviewerLogins: from.prReviewerLogins,
1539
1542
  skipAutoArchiveOnMerge: from.skipAutoArchiveOnMerge,
1540
1543
  stackId: from.stackId,
1541
1544
  stackLayer: from.stackLayer,
@@ -3070,6 +3073,36 @@ function groupHomeBoardWorktrees(threads, sort = DEFAULT_WORKTREE_SORT, labelOf
3070
3073
  }
3071
3074
  return [...map.values()].map((list) => sortThreadsInWorktree(list)).sort((a, b) => compareWorktreeGroups(a, b, sort, labelOf));
3072
3075
  }
3076
+ var DEFAULT_BOARD_OWNERSHIP = "all";
3077
+ function normalizeViewerLogin(login) {
3078
+ return (login ?? "").trim().toLowerCase();
3079
+ }
3080
+ function loginsInclude(logins, viewerLogin) {
3081
+ const me = normalizeViewerLogin(viewerLogin);
3082
+ if (!me) return false;
3083
+ return (logins ?? []).some((login) => normalizeViewerLogin(login) === me);
3084
+ }
3085
+ function classifyWorktreeOwnership(group, viewerLogin = "") {
3086
+ const me = normalizeViewerLogin(viewerLogin);
3087
+ if (group.some((t) => {
3088
+ const author = normalizeViewerLogin(t.prAuthorLogin);
3089
+ return Boolean(author && me && author === me);
3090
+ })) {
3091
+ return "mine";
3092
+ }
3093
+ const reviewing = group.some((t) => {
3094
+ const author = normalizeViewerLogin(t.prAuthorLogin);
3095
+ if (author && me && author !== me) return true;
3096
+ if (t.sourceType === "pr" && (!author || !me || author !== me)) return true;
3097
+ if (me && loginsInclude(t.prReviewerLogins, me)) return true;
3098
+ return false;
3099
+ });
3100
+ return reviewing ? "reviewing" : "mine";
3101
+ }
3102
+ function worktreeMatchesOwnership(group, filter, viewerLogin = "") {
3103
+ if (filter === "all") return true;
3104
+ return classifyWorktreeOwnership(group, viewerLogin) === filter;
3105
+ }
3073
3106
  function classifyWorktreeColumn(group) {
3074
3107
  if (group.some((t) => isMergedPrState(t.prUrl, t.prState))) return "done";
3075
3108
  if (group.some((t) => isOpenPrState(t.prUrl, t.prState) && !t.prIsDraft)) {
@@ -3390,6 +3423,8 @@ function assembleHomeBoard(input) {
3390
3423
  const tokens = tokenizeQuery(input.query ?? "");
3391
3424
  const repo = input.repoPath?.trim() ?? "";
3392
3425
  const kind = input.kind ?? "all";
3426
+ const ownership = input.ownership ?? DEFAULT_BOARD_OWNERSHIP;
3427
+ const viewerLogin = input.viewerLogin ?? "";
3393
3428
  const limit = Math.max(1, input.limit ?? BOARD_PAGE_SIZE);
3394
3429
  const wsName = input.workspaceName ?? (() => "");
3395
3430
  const live = input.threads.filter((t) => t.status !== "archived" && isHomeBoardThread(t));
@@ -3418,6 +3453,7 @@ function assembleHomeBoard(input) {
3418
3453
  };
3419
3454
  for (const group of groupHomeBoardWorktrees(live)) {
3420
3455
  if (!group.some((t) => threadMatchesKind(t, kind))) continue;
3456
+ if (!worktreeMatchesOwnership(group, ownership, viewerLogin)) continue;
3421
3457
  const col = classifyWorktreeColumn(group);
3422
3458
  if (col === "backlog") continue;
3423
3459
  const primary = group[0];
@@ -3447,7 +3483,7 @@ function assembleHomeBoard(input) {
3447
3483
  }
3448
3484
  return { columns, hidden, totals };
3449
3485
  }
3450
- var HOME_BOARD_AGENT_HINT = "Home is a Kanban of worktrees (one card per checkout; sibling chat tabs nest as inner cards). Do not create a second worktree for a ticket, PR, or named branch that already has a live checkout \u2014 create_thread / start_board_card return that thread (alreadyStarted). Creating from the default branch still opens a new isolated worktree. Columns are the path to merge: New (no PR) \u2192 Draft (draft PR) \u2192 Review (open PR) \u2192 Merged. Archive removes the card to Settings \u2192 History. Queued/running are activity on the card, not columns. Orchestration chats stay in the sidebar. Do not invent status.";
3486
+ var HOME_BOARD_AGENT_HINT = "Home is a Kanban of worktrees (one card per checkout; sibling chat tabs nest as inner cards). Do not create a second worktree for a ticket, PR, or named branch that already has a live checkout \u2014 create_thread / start_board_card return that thread (alreadyStarted). Creating from the default branch still opens a new isolated worktree. Columns are the path to merge: New (no PR) \u2192 Draft (draft PR) \u2192 Review (open PR) \u2192 Merged. ownership=mine is PRs you authored (or WIP with no PR); ownership=reviewing is someone else's PR (or a review-requested checkout). Viewer login comes from gh, not a setting. Archive removes the card to Settings \u2192 History. Queued/running are activity on the card, not columns. Orchestration chats stay in the sidebar. Do not invent status.";
3451
3487
 
3452
3488
  // src/threads/create.ts
3453
3489
  function persistCreateAttachments(worktreePath, attachments) {
@@ -3580,6 +3616,7 @@ async function createThread(input, _onSetupLine) {
3580
3616
  }
3581
3617
  let prUrl = null;
3582
3618
  let prTitle = null;
3619
+ let prAuthorLogin2 = null;
3583
3620
  if (sourceType === "pr") {
3584
3621
  const num = Number(input.sourceRef.replace(/^#/, ""));
3585
3622
  if (!Number.isFinite(num)) throw new Error(`Invalid PR number: ${input.sourceRef}`);
@@ -3595,6 +3632,7 @@ async function createThread(input, _onSetupLine) {
3595
3632
  if (reusedPr) return reusedPr;
3596
3633
  sourceIsFork = pr.isCrossRepository;
3597
3634
  prUrl = pr.url;
3635
+ prAuthorLogin2 = pr.author?.login?.trim() || null;
3598
3636
  const localFetchBranch = `sideboard-pr-${pr.number}`;
3599
3637
  await fetchPrHead(repoPath, pr.number, localFetchBranch);
3600
3638
  sourceRef = localFetchBranch;
@@ -3617,6 +3655,7 @@ async function createThread(input, _onSetupLine) {
3617
3655
  if (existing.url) {
3618
3656
  prUrl = existing.url;
3619
3657
  prTitle = existing.title;
3658
+ prAuthorLogin2 = existing.author?.login?.trim() || null;
3620
3659
  }
3621
3660
  }
3622
3661
  }
@@ -3651,7 +3690,8 @@ async function createThread(input, _onSetupLine) {
3651
3690
  parentThreadId: input.parentThreadId ?? null,
3652
3691
  status: "idle",
3653
3692
  prUrl,
3654
- prTitle
3693
+ prTitle,
3694
+ prAuthorLogin: prAuthorLogin2
3655
3695
  });
3656
3696
  writeThread(thread);
3657
3697
  await ensureWorkspace(repoPath);
@@ -4068,7 +4108,7 @@ async function adoptThread(input) {
4068
4108
  messages: input.messages ?? []
4069
4109
  });
4070
4110
  writeThread(thread);
4071
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-DR4UNOQC.js");
4111
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-YVZYX5H2.js");
4072
4112
  await ensureWorkspace2(repoPath);
4073
4113
  const { ensureWorktreeSideboardIgnored: ensureWorktreeSideboardIgnored2 } = await import("./worktree-exclude-N5X5I422.js");
4074
4114
  await ensureWorktreeSideboardIgnored2(input.worktreePath);
@@ -6344,7 +6384,7 @@ function formatScheduledPrompt(name, prompt) {
6344
6384
  ${prompt}`;
6345
6385
  }
6346
6386
  async function defaultDeps() {
6347
- const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-2KZD7N4X.js");
6387
+ const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-WNFMRRQP.js");
6348
6388
  const orch = getOrchestrator2();
6349
6389
  return {
6350
6390
  findThread: (id) => findThreadByRef(id),
@@ -6458,6 +6498,11 @@ function isPidAlive(pid) {
6458
6498
  return false;
6459
6499
  }
6460
6500
  }
6501
+ function sameLoginList(a, b) {
6502
+ const left = [...a ?? []].map((s) => s.trim().toLowerCase()).filter(Boolean).sort();
6503
+ const right = [...b ?? []].map((s) => s.trim().toLowerCase()).filter(Boolean).sort();
6504
+ return left.length === right.length && left.every((login, i) => login === right[i]);
6505
+ }
6461
6506
  async function waitForPidExit(pid, timeoutMs) {
6462
6507
  const start = Date.now();
6463
6508
  while (isPidAlive(pid)) {
@@ -6466,6 +6511,10 @@ async function waitForPidExit(pid, timeoutMs) {
6466
6511
  }
6467
6512
  return true;
6468
6513
  }
6514
+ function resolveSendFollowUp(thread, requested) {
6515
+ if (requested === "steer" || requested === "queue") return requested;
6516
+ return isOrchestratorThread(thread) ? followUpBehavior() : "queue";
6517
+ }
6469
6518
  var STALE_AGENT_PID_WAIT_MS = 2500;
6470
6519
  function writeLiveStatus(threadId, status, lastError) {
6471
6520
  const latest = readThread(threadId);
@@ -6931,13 +6980,13 @@ var Orchestrator = class {
6931
6980
  if (thread.status === "archived") {
6932
6981
  throw new Error(`Thread is archived: ${thread.id}`);
6933
6982
  }
6934
- const followUp = opts?.followUp === "steer" ? "steer" : "queue";
6935
6983
  let shouldSteer = false;
6936
6984
  const sent = await withThreadLock(thread.id, async () => {
6937
6985
  const current = this.requireThread(thread.id);
6938
6986
  if (current.status === "archived") {
6939
6987
  throw new Error(`Thread is archived: ${thread.id}`);
6940
6988
  }
6989
+ const followUp = resolveSendFollowUp(current, opts?.followUp);
6941
6990
  const queue = [...current.queue, prompt];
6942
6991
  this.crashContinued.delete(thread.id);
6943
6992
  this.jobContinueCount.delete(thread.id);
@@ -8103,6 +8152,14 @@ var Orchestrator = class {
8103
8152
  if (nextState && nextState !== prevState) patch.prState = nextState;
8104
8153
  const nextDraft = Boolean(meta.isDraft) && nextState !== "MERGED" && nextState !== "CLOSED";
8105
8154
  if (nextDraft !== Boolean(thread.prIsDraft)) patch.prIsDraft = nextDraft;
8155
+ const nextAuthor = meta.authorLogin?.trim() || "";
8156
+ if (nextAuthor && nextAuthor !== (thread.prAuthorLogin ?? "").trim()) {
8157
+ patch.prAuthorLogin = nextAuthor;
8158
+ }
8159
+ const nextReviewers = meta.reviewerLogins ?? [];
8160
+ if (!sameLoginList(nextReviewers, thread.prReviewerLogins)) {
8161
+ patch.prReviewerLogins = nextReviewers;
8162
+ }
8106
8163
  if (thread.skipAutoArchiveOnMerge && nextState && nextState !== "MERGED" && nextState !== "CLOSED") {
8107
8164
  patch.skipAutoArchiveOnMerge = false;
8108
8165
  }
@@ -8130,6 +8187,14 @@ var Orchestrator = class {
8130
8187
  const sibPatch = { prState: "MERGED", prIsDraft: false };
8131
8188
  if (meta.url && meta.url !== t.prUrl) sibPatch.prUrl = meta.url;
8132
8189
  if (meta.title && meta.title !== t.prTitle) sibPatch.prTitle = meta.title;
8190
+ const sibAuthor = meta.authorLogin?.trim() || "";
8191
+ if (sibAuthor && sibAuthor !== (t.prAuthorLogin ?? "").trim()) {
8192
+ sibPatch.prAuthorLogin = sibAuthor;
8193
+ }
8194
+ const sibReviewers = meta.reviewerLogins ?? [];
8195
+ if (!sameLoginList(sibReviewers, t.prReviewerLogins)) {
8196
+ sibPatch.prReviewerLogins = sibReviewers;
8197
+ }
8133
8198
  if (Object.keys(sibPatch).length > 0) updateThread(t.id, sibPatch);
8134
8199
  }
8135
8200
  for (const t of siblings) {
@@ -8430,7 +8495,7 @@ var Orchestrator = class {
8430
8495
  this.emit({ type: "status_changed", threadId: archived.id, status: "archived" });
8431
8496
  if (thread.repoPath && !isGlobalRepoPath(thread.repoPath)) {
8432
8497
  try {
8433
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-DR4UNOQC.js");
8498
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-YVZYX5H2.js");
8434
8499
  await ensureWorkspace2(thread.repoPath);
8435
8500
  } catch {
8436
8501
  }
@@ -8484,7 +8549,7 @@ var Orchestrator = class {
8484
8549
  `Cowboy checkout missing: ${thread.worktreePath}. Re-add the project folder, then restore.`
8485
8550
  );
8486
8551
  }
8487
- const { createThreadWorktree: createThreadWorktree2 } = await import("./worktree-LC4VRWDM.js");
8552
+ const { createThreadWorktree: createThreadWorktree2 } = await import("./worktree-7LOSSD7G.js");
8488
8553
  const slug = thread.worktreePath.split("/").pop();
8489
8554
  const dest = thread.worktreePath;
8490
8555
  await withRepoGitLock(thread.repoPath, async () => {
@@ -8594,7 +8659,7 @@ async function startOrchestration(opts) {
8594
8659
  sourceRef: "default",
8595
8660
  ...createOpts
8596
8661
  }).catch(async () => {
8597
- const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-LC4VRWDM.js");
8662
+ const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-7LOSSD7G.js");
8598
8663
  const repo = await resolveRepoRoot2(repoPath);
8599
8664
  const def = await resolveDefaultBranch2(repo);
8600
8665
  return orch.createThread({
@@ -8604,7 +8669,7 @@ async function startOrchestration(opts) {
8604
8669
  repoPath: repo
8605
8670
  });
8606
8671
  });
8607
- const { updateThread: upd } = await import("./thread-store-MVQU6HPJ.js");
8672
+ const { updateThread: upd } = await import("./thread-store-ZL6GDIDP.js");
8608
8673
  const updated = upd(thread.id, {
8609
8674
  sourceType: "orchestration",
8610
8675
  sourceRef: goal
@@ -8654,6 +8719,7 @@ export {
8654
8719
  LIVE_TURN_SPAWN_GRACE_MS,
8655
8720
  isPidAlive,
8656
8721
  waitForPidExit,
8722
+ resolveSendFollowUp,
8657
8723
  Orchestrator,
8658
8724
  getOrchestrator,
8659
8725
  startOrchestration
@@ -73,6 +73,8 @@ function createEmptyThread(partial) {
73
73
  prTitle: partial.prTitle ?? null,
74
74
  prState: partial.prState ?? null,
75
75
  prIsDraft: Boolean(partial.prIsDraft),
76
+ prAuthorLogin: partial.prAuthorLogin?.trim() || null,
77
+ prReviewerLogins: partial.prReviewerLogins ?? [],
76
78
  skipAutoArchiveOnMerge: partial.skipAutoArchiveOnMerge ?? false,
77
79
  cowboy: Boolean(partial.cowboy),
78
80
  stackId: partial.stackId ?? null,
@@ -11,13 +11,13 @@ import {
11
11
  } from "./chunk-Y4MIXGPA.js";
12
12
  import {
13
13
  isOrchestratorThread
14
- } from "./chunk-FJWQCZ74.js";
14
+ } from "./chunk-XV3EFFZ6.js";
15
15
  import {
16
16
  codexUnattendedGitConfigArgs,
17
17
  mergeAgentGitAuthEnv,
18
18
  resolveAgentGitAuthEnv,
19
19
  resolveCodexGitWritableRoots
20
- } from "./chunk-7O53GXTA.js";
20
+ } from "./chunk-XBLN52RZ.js";
21
21
  import {
22
22
  enrichPathWithNpmGlobalBin,
23
23
  isConductorBundledCli,
@@ -2342,7 +2342,7 @@ var claudeAdapter = {
2342
2342
  );
2343
2343
  }
2344
2344
  const mode = permissionMode(thread);
2345
- const { isOrchestratorThread: isOrchestratorThread2 } = await import("./global-workspace-J737XNUX.js");
2345
+ const { isOrchestratorThread: isOrchestratorThread2 } = await import("./global-workspace-C2JMJXYV.js");
2346
2346
  const isOrchestrator = isOrchestratorThread2(thread);
2347
2347
  const injectedServers = await buildInjectedMcpServers({
2348
2348
  includeSideboard: true,
@@ -7,7 +7,7 @@ import {
7
7
  } from "./chunk-J7LQVLFQ.js";
8
8
  import {
9
9
  listThreads
10
- } from "./chunk-7UURXPKD.js";
10
+ } from "./chunk-TCQAFTSV.js";
11
11
  import {
12
12
  worktreesRoot
13
13
  } from "./chunk-EFVFB2AH.js";
@@ -2117,7 +2117,7 @@ async function getPr(repoPath, number) {
2117
2117
  "view",
2118
2118
  String(number),
2119
2119
  "--json",
2120
- "number,title,headRefName,url,isCrossRepository"
2120
+ "number,title,headRefName,url,isCrossRepository,author"
2121
2121
  ];
2122
2122
  if (slug) args.push("--repo", slug);
2123
2123
  const { stdout, exitCode } = await gh(args, repoPath, { reject: false });
@@ -2163,7 +2163,7 @@ async function getPrForHeadBranch(repoPath, branch) {
2163
2163
  "view",
2164
2164
  head,
2165
2165
  "--json",
2166
- "number,title,headRefName,url,isCrossRepository"
2166
+ "number,title,headRefName,url,isCrossRepository,author"
2167
2167
  ];
2168
2168
  if (slug) viewArgs.push("--repo", slug);
2169
2169
  const viewed = await gh(viewArgs, repoPath, { reject: false });
@@ -2181,7 +2181,7 @@ async function getPrForHeadBranch(repoPath, branch) {
2181
2181
  "--head",
2182
2182
  listHead,
2183
2183
  "--json",
2184
- "number,title,headRefName,url,isCrossRepository",
2184
+ "number,title,headRefName,url,isCrossRepository,author",
2185
2185
  "--limit",
2186
2186
  "1",
2187
2187
  "--state",
@@ -2383,7 +2383,7 @@ async function getPrMeta(cwd, selector) {
2383
2383
  "view",
2384
2384
  selector,
2385
2385
  "--json",
2386
- "number,title,url,state,isDraft,reviewDecision,baseRefName,headRefName,isInMergeQueue,mergeStateStatus,mergeable"
2386
+ "number,title,url,state,isDraft,reviewDecision,baseRefName,headRefName,isInMergeQueue,mergeStateStatus,mergeable,author,reviewRequests"
2387
2387
  ];
2388
2388
  if (slug) viewArgs.push("--repo", slug);
2389
2389
  let { stdout, exitCode, stderr } = await gh(viewArgs, cwd, { reject: false });
@@ -2393,7 +2393,7 @@ async function getPrMeta(cwd, selector) {
2393
2393
  "view",
2394
2394
  selector,
2395
2395
  "--json",
2396
- "number,title,url,state,isDraft,reviewDecision,baseRefName,headRefName,mergeStateStatus,mergeable"
2396
+ "number,title,url,state,isDraft,reviewDecision,baseRefName,headRefName,mergeStateStatus,mergeable,author,reviewRequests"
2397
2397
  ];
2398
2398
  if (slug) retry.push("--repo", slug);
2399
2399
  ({ stdout, exitCode, stderr } = await gh(retry, cwd, { reject: false }));
@@ -2414,6 +2414,7 @@ async function getPrMeta(cwd, selector) {
2414
2414
  };
2415
2415
  const probed = await probeLocalMergeGate(cwd, gate);
2416
2416
  const resolved = probed.gate ?? gate;
2417
+ const author = view.author ?? {};
2417
2418
  return {
2418
2419
  number: Number(view.number),
2419
2420
  title: String(view.title ?? ""),
@@ -2425,7 +2426,9 @@ async function getPrMeta(cwd, selector) {
2425
2426
  headRefName: String(view.headRefName ?? ""),
2426
2427
  isInMergeQueue: Boolean(resolved.isInMergeQueue),
2427
2428
  mergeable: resolved.mergeable,
2428
- mergeStateStatus: resolved.mergeStateStatus
2429
+ mergeStateStatus: resolved.mergeStateStatus,
2430
+ authorLogin: author.login?.trim() || null,
2431
+ reviewerLogins: humanReviewerLogins(view.reviewRequests)
2429
2432
  };
2430
2433
  } catch {
2431
2434
  return null;
@@ -5,7 +5,7 @@ import {
5
5
  } from "./chunk-D6JWYJ4P.js";
6
6
  import {
7
7
  listThreads
8
- } from "./chunk-LZQULFIT.js";
8
+ } from "./chunk-GOZ6T3AG.js";
9
9
  import {
10
10
  ensureWorktreeSideboardIgnored
11
11
  } from "./chunk-SYFVUF2C.js";
@@ -2080,7 +2080,7 @@ async function getPr(repoPath, number) {
2080
2080
  "view",
2081
2081
  String(number),
2082
2082
  "--json",
2083
- "number,title,headRefName,url,isCrossRepository"
2083
+ "number,title,headRefName,url,isCrossRepository,author"
2084
2084
  ];
2085
2085
  if (slug) args.push("--repo", slug);
2086
2086
  const { stdout, exitCode } = await gh(args, repoPath, { reject: false });
@@ -2126,7 +2126,7 @@ async function getPrForHeadBranch(repoPath, branch) {
2126
2126
  "view",
2127
2127
  head,
2128
2128
  "--json",
2129
- "number,title,headRefName,url,isCrossRepository"
2129
+ "number,title,headRefName,url,isCrossRepository,author"
2130
2130
  ];
2131
2131
  if (slug) viewArgs.push("--repo", slug);
2132
2132
  const viewed = await gh(viewArgs, repoPath, { reject: false });
@@ -2144,7 +2144,7 @@ async function getPrForHeadBranch(repoPath, branch) {
2144
2144
  "--head",
2145
2145
  listHead,
2146
2146
  "--json",
2147
- "number,title,headRefName,url,isCrossRepository",
2147
+ "number,title,headRefName,url,isCrossRepository,author",
2148
2148
  "--limit",
2149
2149
  "1",
2150
2150
  "--state",
@@ -2346,7 +2346,7 @@ async function getPrMeta(cwd, selector) {
2346
2346
  "view",
2347
2347
  selector,
2348
2348
  "--json",
2349
- "number,title,url,state,isDraft,reviewDecision,baseRefName,headRefName,isInMergeQueue,mergeStateStatus,mergeable"
2349
+ "number,title,url,state,isDraft,reviewDecision,baseRefName,headRefName,isInMergeQueue,mergeStateStatus,mergeable,author,reviewRequests"
2350
2350
  ];
2351
2351
  if (slug) viewArgs.push("--repo", slug);
2352
2352
  let { stdout, exitCode, stderr } = await gh(viewArgs, cwd, { reject: false });
@@ -2356,7 +2356,7 @@ async function getPrMeta(cwd, selector) {
2356
2356
  "view",
2357
2357
  selector,
2358
2358
  "--json",
2359
- "number,title,url,state,isDraft,reviewDecision,baseRefName,headRefName,mergeStateStatus,mergeable"
2359
+ "number,title,url,state,isDraft,reviewDecision,baseRefName,headRefName,mergeStateStatus,mergeable,author,reviewRequests"
2360
2360
  ];
2361
2361
  if (slug) retry.push("--repo", slug);
2362
2362
  ({ stdout, exitCode, stderr } = await gh(retry, cwd, { reject: false }));
@@ -2377,6 +2377,7 @@ async function getPrMeta(cwd, selector) {
2377
2377
  };
2378
2378
  const probed = await probeLocalMergeGate(cwd, gate);
2379
2379
  const resolved = probed.gate ?? gate;
2380
+ const author = view.author ?? {};
2380
2381
  return {
2381
2382
  number: Number(view.number),
2382
2383
  title: String(view.title ?? ""),
@@ -2388,7 +2389,9 @@ async function getPrMeta(cwd, selector) {
2388
2389
  headRefName: String(view.headRefName ?? ""),
2389
2390
  isInMergeQueue: Boolean(resolved.isInMergeQueue),
2390
2391
  mergeable: resolved.mergeable,
2391
- mergeStateStatus: resolved.mergeStateStatus
2392
+ mergeStateStatus: resolved.mergeStateStatus,
2393
+ authorLogin: author.login?.trim() || null,
2394
+ reviewerLogins: humanReviewerLogins(view.reviewRequests)
2392
2395
  };
2393
2396
  } catch {
2394
2397
  return null;
@@ -7,7 +7,7 @@ import {
7
7
  resolveRepoRoot,
8
8
  takenSlugsFromThread,
9
9
  teamSlugFromName
10
- } from "./chunk-7O53GXTA.js";
10
+ } from "./chunk-XBLN52RZ.js";
11
11
  import {
12
12
  ATTACHMENTS_DIR,
13
13
  attachmentsGitignoreBody
@@ -17,7 +17,7 @@ import {
17
17
  listThreads,
18
18
  updateThread,
19
19
  writeThread
20
- } from "./chunk-LZQULFIT.js";
20
+ } from "./chunk-GOZ6T3AG.js";
21
21
  import {
22
22
  assertOrchestratorCapableAgent,
23
23
  formatAccountProfilePlaybookLine,
@@ -7,13 +7,13 @@ import {
7
7
  enrichWorkspacesWithGithub,
8
8
  ensureGlobalCoordinatorCwd,
9
9
  formatWorkspaceInventory
10
- } from "./chunk-3ZFGZ7RT.js";
11
- import "./chunk-7JIYKYLL.js";
10
+ } from "./chunk-7T5XKNOF.js";
11
+ import "./chunk-WXKXSZN4.js";
12
12
  import "./chunk-6K64FJDD.js";
13
13
  import "./chunk-J7LQVLFQ.js";
14
14
  import "./chunk-4TR3HZFT.js";
15
15
  import "./chunk-JT7R45JB.js";
16
- import "./chunk-7UURXPKD.js";
16
+ import "./chunk-TCQAFTSV.js";
17
17
  import "./chunk-77WWLBCI.js";
18
18
  import "./chunk-EFVFB2AH.js";
19
19
  import "./chunk-QQKDGPUI.js";
@@ -9,10 +9,10 @@ import {
9
9
  enrichWorkspacesWithGithub,
10
10
  ensureGlobalCoordinatorCwd,
11
11
  formatWorkspaceInventory
12
- } from "./chunk-FJWQCZ74.js";
13
- import "./chunk-7O53GXTA.js";
12
+ } from "./chunk-XV3EFFZ6.js";
13
+ import "./chunk-XBLN52RZ.js";
14
14
  import "./chunk-D6JWYJ4P.js";
15
- import "./chunk-LZQULFIT.js";
15
+ import "./chunk-GOZ6T3AG.js";
16
16
  import "./chunk-SYFVUF2C.js";
17
17
  import "./chunk-FNQNJOHY.js";
18
18
  import "./chunk-OKZFTOM2.js";
@@ -15,13 +15,13 @@ import {
15
15
  orchestratorSessionPoisonedByBuiltins,
16
16
  slackCoordinatorSourceRef,
17
17
  takenTeamSlugsForOrchestration
18
- } from "./chunk-3ZFGZ7RT.js";
19
- import "./chunk-7JIYKYLL.js";
18
+ } from "./chunk-7T5XKNOF.js";
19
+ import "./chunk-WXKXSZN4.js";
20
20
  import "./chunk-6K64FJDD.js";
21
21
  import "./chunk-J7LQVLFQ.js";
22
22
  import "./chunk-4TR3HZFT.js";
23
23
  import "./chunk-JT7R45JB.js";
24
- import "./chunk-7UURXPKD.js";
24
+ import "./chunk-TCQAFTSV.js";
25
25
  import "./chunk-77WWLBCI.js";
26
26
  import {
27
27
  globalAgentCwd
@@ -17,10 +17,10 @@ import {
17
17
  orchestratorSessionPoisonedByBuiltins,
18
18
  slackCoordinatorSourceRef,
19
19
  takenTeamSlugsForOrchestration
20
- } from "./chunk-FJWQCZ74.js";
21
- import "./chunk-7O53GXTA.js";
20
+ } from "./chunk-XV3EFFZ6.js";
21
+ import "./chunk-XBLN52RZ.js";
22
22
  import "./chunk-D6JWYJ4P.js";
23
- import "./chunk-LZQULFIT.js";
23
+ import "./chunk-GOZ6T3AG.js";
24
24
  import "./chunk-SYFVUF2C.js";
25
25
  import "./chunk-FNQNJOHY.js";
26
26
  import "./chunk-OKZFTOM2.js";