@sideboard-ai/core 0.1.315 → 0.1.317

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 (48) hide show
  1. package/dist/{abletime-QQZWYJXC.js → abletime-NZ2ABWAL.js} +3 -3
  2. package/dist/{abletime-QK3KMRQD.js → abletime-TKAFNXCM.js} +3 -3
  3. package/dist/{abletime-oauth-CAHTMB4V.js → abletime-oauth-CBFFBINA.js} +2 -2
  4. package/dist/{abletime-oauth-I2RRPVKT.js → abletime-oauth-S4AXA4WR.js} +2 -2
  5. package/dist/{abletime-rest-5V4KGMSY.js → abletime-rest-NSOP72AI.js} +2 -2
  6. package/dist/{abletime-rest-W5TLQK7C.js → abletime-rest-ORBELZQO.js} +2 -2
  7. package/dist/{agents-Y3M3EKLY.js → agents-BJVSYC6Y.js} +4 -4
  8. package/dist/{agents-5XJ7EHGU.js → agents-KABJUDPI.js} +4 -4
  9. package/dist/{chunk-IODJCVMN.js → chunk-4XZJYBO2.js} +6 -34
  10. package/dist/{chunk-JRZTJ4F7.js → chunk-7SCVGGF6.js} +4 -4
  11. package/dist/{chunk-5CTG5W7S.js → chunk-A46CIARU.js} +1 -1
  12. package/dist/{chunk-PN32Z4JL.js → chunk-A6C67DY5.js} +2 -2
  13. package/dist/{chunk-CYPFOIUK.js → chunk-BXTISNKW.js} +16 -16
  14. package/dist/{chunk-7J2KOIYD.js → chunk-CCUGIVYN.js} +2 -2
  15. package/dist/{chunk-DV6ID6CK.js → chunk-ELBK34TY.js} +4 -4
  16. package/dist/{chunk-FVTR54LY.js → chunk-GH7UMULC.js} +4 -4
  17. package/dist/{chunk-MKGSMPWB.js → chunk-GXSV3X3L.js} +2 -2
  18. package/dist/{chunk-U35AHE2P.js → chunk-HOLB6ZFZ.js} +33 -2
  19. package/dist/{chunk-72OWKHFJ.js → chunk-I5CLCWUK.js} +2 -2
  20. package/dist/{chunk-YR7NZYUT.js → chunk-NRSC4N5X.js} +6 -34
  21. package/dist/{chunk-GFM63DTU.js → chunk-PX324N7P.js} +2 -2
  22. package/dist/{chunk-BMORGDYI.js → chunk-U53JICJ2.js} +18 -17
  23. package/dist/{chunk-NZVD5EVX.js → chunk-VVV7EI6T.js} +2 -1
  24. package/dist/{chunk-Y4WARKPW.js → chunk-VZAJVX36.js} +2 -1
  25. package/dist/{chunk-NKVNHBDB.js → chunk-XWUDFLBX.js} +3 -3
  26. package/dist/{chunk-CHUPIJP7.js → chunk-YEIHCSZS.js} +63 -2
  27. package/dist/{chunk-BPBDGJ43.js → chunk-YN6XONV5.js} +1 -1
  28. package/dist/{conductor-IMKNYQWZ.js → conductor-NIUBJLTS.js} +4 -4
  29. package/dist/{conductor-DKWTQADV.js → conductor-TP2NA44I.js} +4 -4
  30. package/dist/{coordinator-prompt-HUZC4DZ2.js → coordinator-prompt-3CT3D5UM.js} +3 -3
  31. package/dist/{coordinator-prompt-SPOYUZG5.js → coordinator-prompt-FQC2SZPP.js} +3 -3
  32. package/dist/{global-workspace-3NNDDTFD.js → global-workspace-72K6D354.js} +3 -3
  33. package/dist/{global-workspace-SK4JQBPN.js → global-workspace-BUWMRNW5.js} +3 -3
  34. package/dist/index.cjs +360 -42
  35. package/dist/index.d.cts +11 -5
  36. package/dist/index.d.ts +11 -5
  37. package/dist/index.js +301 -21
  38. package/dist/mcp/run-stdio.cjs +38 -34
  39. package/dist/mcp/run-stdio.js +9 -9
  40. package/dist/{orchestrator-4XFRK57E.js → orchestrator-E72HYGTB.js} +6 -6
  41. package/dist/{orchestrator-ZRMZ4TCL.js → orchestrator-N54V3B76.js} +6 -6
  42. package/dist/{thread-store-5OF6M6VZ.js → thread-store-7BBA63KV.js} +1 -1
  43. package/dist/{thread-store-GOVVXQV2.js → thread-store-PLNIWFZ4.js} +1 -1
  44. package/dist/{workspaces-EYNZDL45.js → workspaces-2V5UYPYC.js} +3 -3
  45. package/dist/{workspaces-52L6NZ3P.js → workspaces-GAUHXBUL.js} +3 -3
  46. package/dist/{worktree-BP5ICYQ2.js → worktree-6FUQ7FEF.js} +2 -2
  47. package/dist/{worktree-UCOSAI7J.js → worktree-XJKLDYOL.js} +2 -2
  48. package/package.json +1 -1
@@ -11,11 +11,11 @@ import {
11
11
  isGlobalThread,
12
12
  isOrchestratorThread,
13
13
  isSlackCoordinatorThread
14
- } from "./chunk-PN32Z4JL.js";
14
+ } from "./chunk-A6C67DY5.js";
15
15
  import {
16
16
  mergeAgentGitAuthEnv,
17
17
  resolveAgentGitAuthEnv
18
- } from "./chunk-5CTG5W7S.js";
18
+ } from "./chunk-A46CIARU.js";
19
19
  import {
20
20
  ATTACHMENTS_DIR,
21
21
  DETACHED_JOBS_DIR,
@@ -37,6 +37,7 @@ import {
37
37
  stripNestedElectronEnv
38
38
  } from "./chunk-WWUABK6B.js";
39
39
  import {
40
+ REVIEW_TAB_TITLE,
40
41
  allocateTeamName,
41
42
  createEmptyThread,
42
43
  findThreadByRef,
@@ -46,7 +47,7 @@ import {
46
47
  updateThread,
47
48
  worktreeNameFromPath,
48
49
  writeThread
49
- } from "./chunk-U35AHE2P.js";
50
+ } from "./chunk-HOLB6ZFZ.js";
50
51
  import {
51
52
  findConventionSetup,
52
53
  loadRepoSettings,
@@ -665,6 +666,7 @@ function worktreeBindingFrom(from) {
665
666
  prIsInMergeQueue: from.prIsInMergeQueue,
666
667
  prLabels: from.prLabels,
667
668
  prChecksFailed: from.prChecksFailed,
669
+ issueBlockedBy: from.issueBlockedBy,
668
670
  skipAutoArchiveOnMerge: from.skipAutoArchiveOnMerge,
669
671
  stackId: from.stackId,
670
672
  stackLayer: from.stackLayer,
@@ -761,32 +763,6 @@ function forkChatTab(input) {
761
763
  return tab;
762
764
  }
763
765
 
764
- // src/review/review-write-gate.ts
765
- var REVIEW_TAB_TITLE = "Review";
766
- function hasLiveReviewSibling(thread, siblings = []) {
767
- const selfId = thread.id;
768
- return siblings.some(
769
- (t) => t.id !== selfId && t.status !== "archived" && t.title.trim() === REVIEW_TAB_TITLE
770
- );
771
- }
772
- function isReviewWriteGatedThread(thread, siblings) {
773
- if (thread.sourceType === "pr" || thread.title.trim() === REVIEW_TAB_TITLE) {
774
- return true;
775
- }
776
- return hasLiveReviewSibling(thread, siblings);
777
- }
778
- function formatReviewWriteGateDirective() {
779
- return [
780
- "Review writes are public. The PR or ticket author sees GitHub/Linear/AbleTime comments, ticket updates, and submitted reviews immediately \u2014 a draft will confuse them.",
781
- "Write the recommendation in chat so the user can work through the feedback first. Do not call github_comment, linear_comment, abletime_comment, github_update_issue, linear_update_issue, abletime_update_task, or run `gh pr review` / `gh pr comment`, until they type a next step that asks you to post.",
782
- "After the review is in chat, stop. Do not call ask_user. The user needs time to read and will type the next steps. If they already asked you to post a specific comment or update in this turn, that is confirmation.",
783
- "Do not request reviewers, change labels, or assign yourself unless they asked \u2014 those also notify the author."
784
- ].join("\n");
785
- }
786
- function formatReviewWriteGateReminder() {
787
- return "Review writes: keep the review in chat. Do not ask_user after it \u2014 they read and type next steps. Do not github_comment / linear_comment / *_update_* / `gh pr review` on the PR or ticket until they ask. Authors see those immediately.";
788
- }
789
-
790
766
  // src/review/review-request-template.ts
791
767
  var REVIEW_REQUEST_TEMPLATE = `# Review guidelines:
792
768
 
@@ -1702,7 +1678,7 @@ var PORT_RANGE_SIZE = 10;
1702
1678
  var RECLAIM_RETRY_DELAY_MS = 40;
1703
1679
  var RECLAIM_TRIES = 8;
1704
1680
  async function killReclaimable(ports, worktreePath, signal) {
1705
- const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-IMKNYQWZ.js");
1681
+ const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-NIUBJLTS.js");
1706
1682
  if (worktreePath) killStaleWorktreeListeners2(ports, worktreePath, signal);
1707
1683
  else killListenersOnPorts2(ports);
1708
1684
  }
@@ -2410,10 +2386,6 @@ export {
2410
2386
  buildForkTranscriptAttachment,
2411
2387
  createChatTab,
2412
2388
  forkChatTab,
2413
- REVIEW_TAB_TITLE,
2414
- isReviewWriteGatedThread,
2415
- formatReviewWriteGateDirective,
2416
- formatReviewWriteGateReminder,
2417
2389
  requestReview,
2418
2390
  RUN_PORTS_REL,
2419
2391
  worktreeRunPortsPath,
@@ -3,7 +3,7 @@ import {
3
3
  ensureGhPreferOrigin,
4
4
  resolveGithubRepoSlug,
5
5
  resolveRepoRoot
6
- } from "./chunk-BPBDGJ43.js";
6
+ } from "./chunk-YN6XONV5.js";
7
7
  import {
8
8
  allocateTeamName,
9
9
  createEmptyThread,
@@ -12,7 +12,7 @@ import {
12
12
  teamSlugFromName,
13
13
  updateThread,
14
14
  writeThread
15
- } from "./chunk-CHUPIJP7.js";
15
+ } from "./chunk-YEIHCSZS.js";
16
16
  import {
17
17
  ATTACHMENTS_DIR,
18
18
  attachmentsGitignoreBody
@@ -14,9 +14,8 @@ import {
14
14
  parseSessionQuotaResetAt,
15
15
  planModeTurnInstruction,
16
16
  resolveQuotaFallbackAgent
17
- } from "./chunk-NKVNHBDB.js";
17
+ } from "./chunk-XWUDFLBX.js";
18
18
  import {
19
- REVIEW_TAB_TITLE,
20
19
  applyWorktreePkgCacheEnv,
21
20
  askBlockStillWaiting,
22
21
  buildBrightsySessionSeed,
@@ -28,13 +27,10 @@ import {
28
27
  extractPendingPlanQuestions,
29
28
  forkChatTab,
30
29
  forkMessageSlice,
31
- formatReviewWriteGateDirective,
32
- formatReviewWriteGateReminder,
33
30
  getDefaultRunScript,
34
31
  getRunMode,
35
32
  isAskUserToolName,
36
33
  isJobContinuePrompt,
37
- isReviewWriteGatedThread,
38
34
  isWorktreeRunProcessKey,
39
35
  killDetachedRunTree,
40
36
  killListenersOnPorts,
@@ -56,7 +52,7 @@ import {
56
52
  worktreeDevProcessKey,
57
53
  worktreeRunProcessKey,
58
54
  worktreeSetupProcessKey
59
- } from "./chunk-IODJCVMN.js";
55
+ } from "./chunk-4XZJYBO2.js";
60
56
  import {
61
57
  applyAgentEvent,
62
58
  clipAgentEventForPaint,
@@ -103,7 +99,7 @@ import {
103
99
  stageAbsolutePathsAsAttachments,
104
100
  stageBuffersAsAttachments,
105
101
  syncWorkspacesFromThreads
106
- } from "./chunk-GFM63DTU.js";
102
+ } from "./chunk-PX324N7P.js";
107
103
  import {
108
104
  addPrStackLayer,
109
105
  allocateTeamSlug,
@@ -147,14 +143,18 @@ import {
147
143
  resolveRepoRoot,
148
144
  switchWorktreeBranch,
149
145
  withRepoGitLock
150
- } from "./chunk-BPBDGJ43.js";
146
+ } from "./chunk-YN6XONV5.js";
151
147
  import {
148
+ REVIEW_TAB_TITLE,
152
149
  agentNicknameFromWorktreePath,
153
150
  appendMessage,
154
151
  createEmptyThread,
155
152
  deleteThreadRecord,
156
153
  findThreadByRef,
154
+ formatReviewWriteGateDirective,
155
+ formatReviewWriteGateReminder,
157
156
  isPlaceholderBranch,
157
+ isReviewWriteGatedThread,
158
158
  isWorktreeIdentityTitle,
159
159
  listThreads,
160
160
  normalizeWorkspaceTags,
@@ -171,7 +171,7 @@ import {
171
171
  worktreeNameFromPath,
172
172
  worktreeSlugForTicket,
173
173
  writeThread
174
- } from "./chunk-CHUPIJP7.js";
174
+ } from "./chunk-YEIHCSZS.js";
175
175
  import {
176
176
  mcpServerIdForPermission,
177
177
  mcpServerPermissionUpdate
@@ -461,9 +461,9 @@ async function spawnAgentTurn(thread, input, onEvent) {
461
461
  `Cannot spawn ${thread.agent}: thread ${thread.id} has no worktreePath`
462
462
  );
463
463
  }
464
- const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-3NNDDTFD.js");
464
+ const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-72K6D354.js");
465
465
  if (isGlobalThread2(thread)) {
466
- const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-SPOYUZG5.js");
466
+ const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-FQC2SZPP.js");
467
467
  ensureGlobalCoordinatorCwd2(
468
468
  isOrchestratorThread(thread) ? { orchestratorThreadId: thread.id } : void 0
469
469
  );
@@ -2989,7 +2989,7 @@ async function createThread(input, _onSetupLine) {
2989
2989
  let sourceIsFork = false;
2990
2990
  if (!input.cowboy && sourceType === "branch" && (!sourceRef || sourceRef === "HEAD" || sourceRef === "default")) {
2991
2991
  if (isAbleTimeConnected() && getIssueSource() === "abletime") {
2992
- const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-QQZWYJXC.js");
2992
+ const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-NZ2ABWAL.js");
2993
2993
  const task = await ensureAbleTimeTask({
2994
2994
  title: title?.trim() || "Untitled work",
2995
2995
  description: input.prompt?.trim() || void 0
@@ -3100,7 +3100,7 @@ async function createThread(input, _onSetupLine) {
3100
3100
  return readThread(thread.id) ?? thread;
3101
3101
  }
3102
3102
  async function listLinearIssues(agent, repoPath) {
3103
- const { getAdapter: getAdapter2 } = await import("./agents-Y3M3EKLY.js");
3103
+ const { getAdapter: getAdapter2 } = await import("./agents-BJVSYC6Y.js");
3104
3104
  await requireAgent(agent, { requireLinear: true });
3105
3105
  const adapter = getAdapter2(agent);
3106
3106
  if (!adapter.listLinearIssues) {
@@ -3877,7 +3877,7 @@ async function adoptThread(input) {
3877
3877
  messages: input.messages ?? []
3878
3878
  });
3879
3879
  writeThread(thread);
3880
- const { addWorkspace: addWorkspace2 } = await import("./workspaces-52L6NZ3P.js");
3880
+ const { addWorkspace: addWorkspace2 } = await import("./workspaces-GAUHXBUL.js");
3881
3881
  await addWorkspace2(repoPath);
3882
3882
  const { ensureWorktreeSideboardIgnored } = await import("./worktree-exclude-RXZPTCNH.js");
3883
3883
  await ensureWorktreeSideboardIgnored(input.worktreePath);
@@ -6815,7 +6815,7 @@ function formatScheduledPrompt(name, prompt) {
6815
6815
  ${prompt}`;
6816
6816
  }
6817
6817
  async function defaultDeps() {
6818
- const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-4XFRK57E.js");
6818
+ const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-E72HYGTB.js");
6819
6819
  const orch = getOrchestrator2();
6820
6820
  return {
6821
6821
  findThread: (id) => findThreadByRef(id),
@@ -9697,7 +9697,7 @@ async function startOrchestration(opts) {
9697
9697
  sourceRef: "default",
9698
9698
  ...createOpts
9699
9699
  }).catch(async () => {
9700
- const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-BP5ICYQ2.js");
9700
+ const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-6FUQ7FEF.js");
9701
9701
  const repo = await resolveRepoRoot2(repoPath);
9702
9702
  const def = await resolveDefaultBranch2(repo);
9703
9703
  return orch.createThread({
@@ -9707,7 +9707,7 @@ async function startOrchestration(opts) {
9707
9707
  repoPath: repo
9708
9708
  });
9709
9709
  });
9710
- const { updateThread: upd } = await import("./thread-store-5OF6M6VZ.js");
9710
+ const { updateThread: upd } = await import("./thread-store-7BBA63KV.js");
9711
9711
  const updated = upd(thread.id, {
9712
9712
  sourceType: "orchestration",
9713
9713
  sourceRef: goal
@@ -9730,6 +9730,7 @@ export {
9730
9730
  sidebarRowAgentBlock,
9731
9731
  sidebarParentSelectId,
9732
9732
  sidebarQuestionThreadId,
9733
+ issueBlockedByIds,
9733
9734
  reviewLabelForRepo,
9734
9735
  classifyWorktreeListBadges,
9735
9736
  isHomeBoardThread,
@@ -4,7 +4,7 @@ import {
4
4
  normalizeAbleTimeCredential,
5
5
  normalizeAbleTimeHost,
6
6
  rewriteAbleTimeError
7
- } from "./chunk-DV6ID6CK.js";
7
+ } from "./chunk-ELBK34TY.js";
8
8
  import {
9
9
  httpFetch
10
10
  } from "./chunk-JAT3JFOS.js";
@@ -153,6 +153,7 @@ function restTaskToRaw(raw, users) {
153
153
  projectId: asString(rec.projectId),
154
154
  categoryId: asString(rec.projectCategoryId) || asString(rec.categoryId),
155
155
  parentId: asString(rec.parentTaskId) || asString(rec.parentId),
156
+ depends_on: rec.dependencyParentTimeflowTaskId ?? null,
156
157
  tags: rec.tags,
157
158
  comments,
158
159
  attachments: rec.attachments ?? rec.files ?? rec.media,
@@ -6,7 +6,7 @@ import {
6
6
  normalizeAbleTimeCredential,
7
7
  normalizeAbleTimeHost,
8
8
  rewriteAbleTimeError
9
- } from "./chunk-JRZTJ4F7.js";
9
+ } from "./chunk-7SCVGGF6.js";
10
10
  import {
11
11
  httpFetch
12
12
  } from "./chunk-2GPQZZLY.js";
@@ -155,6 +155,7 @@ function restTaskToRaw(raw, users) {
155
155
  projectId: asString(rec.projectId),
156
156
  categoryId: asString(rec.projectCategoryId) || asString(rec.categoryId),
157
157
  parentId: asString(rec.parentTaskId) || asString(rec.parentId),
158
+ depends_on: rec.dependencyParentTimeflowTaskId ?? null,
158
159
  tags: rec.tags,
159
160
  comments,
160
161
  attachments: rec.attachments ?? rec.files ?? rec.media,
@@ -12,13 +12,13 @@ import {
12
12
  } from "./chunk-7Q327QF2.js";
13
13
  import {
14
14
  isOrchestratorThread
15
- } from "./chunk-GFM63DTU.js";
15
+ } from "./chunk-PX324N7P.js";
16
16
  import {
17
17
  codexUnattendedGitConfigArgs,
18
18
  mergeAgentGitAuthEnv,
19
19
  resolveAgentGitAuthEnv,
20
20
  resolveCodexGitWritableRoots
21
- } from "./chunk-BPBDGJ43.js";
21
+ } from "./chunk-YN6XONV5.js";
22
22
  import {
23
23
  loadBrightsyConfig
24
24
  } from "./chunk-RSA47QYR.js";
@@ -2609,7 +2609,7 @@ var claudeAdapter = {
2609
2609
  );
2610
2610
  }
2611
2611
  const mode = permissionMode(thread);
2612
- const { isOrchestratorThread: isOrchestratorThread2 } = await import("./global-workspace-3NNDDTFD.js");
2612
+ const { isOrchestratorThread: isOrchestratorThread2 } = await import("./global-workspace-72K6D354.js");
2613
2613
  const isOrchestrator = isOrchestratorThread2(thread);
2614
2614
  const rpc = worktreeAgentRpc(isOrchestrator);
2615
2615
  const injectedServers = await buildInjectedMcpServers({
@@ -16,6 +16,32 @@ import {
16
16
  // src/store/thread-store.ts
17
17
  import { randomUUID } from "crypto";
18
18
 
19
+ // src/review/review-write-gate.ts
20
+ var REVIEW_TAB_TITLE = "Review";
21
+ function hasLiveReviewSibling(thread, siblings = []) {
22
+ const selfId = thread.id;
23
+ return siblings.some(
24
+ (t) => t.id !== selfId && t.status !== "archived" && t.title.trim() === REVIEW_TAB_TITLE
25
+ );
26
+ }
27
+ function isReviewWriteGatedThread(thread, siblings) {
28
+ if (thread.sourceType === "pr" || thread.title.trim() === REVIEW_TAB_TITLE) {
29
+ return true;
30
+ }
31
+ return hasLiveReviewSibling(thread, siblings);
32
+ }
33
+ function formatReviewWriteGateDirective() {
34
+ return [
35
+ "Review writes are public. The PR or ticket author sees GitHub/Linear/AbleTime comments, ticket updates, and submitted reviews immediately \u2014 a draft will confuse them.",
36
+ "Write the recommendation in chat so the user can work through the feedback first. Do not call github_comment, linear_comment, abletime_comment, github_update_issue, linear_update_issue, abletime_update_task, or run `gh pr review` / `gh pr comment`, until they type a next step that asks you to post.",
37
+ "After the review is in chat, stop. Do not call ask_user. The user needs time to read and will type the next steps. If they already asked you to post a specific comment or update in this turn, that is confirmation.",
38
+ "Do not request reviewers, change labels, or assign yourself unless they asked \u2014 those also notify the author."
39
+ ].join("\n");
40
+ }
41
+ function formatReviewWriteGateReminder() {
42
+ return "Review writes: keep the review in chat. Do not ask_user after it \u2014 they read and type next steps. Do not github_comment / linear_comment / *_update_* / `gh pr review` on the PR or ticket until they ask. Authors see those immediately.";
43
+ }
44
+
19
45
  // src/git/team-meta.ts
20
46
  var SOCCER_TEAM_META = {
21
47
  "aalborg": { location: "Aalborg, Denmark", league: "Danish Superliga" },
@@ -876,11 +902,12 @@ function branchDisplayLabel(branchName, worktreePath) {
876
902
  }
877
903
  function taskPurposeTitle(title) {
878
904
  const trimmed = title?.trim() ?? "";
879
- if (!trimmed || teamSlugFromName(trimmed)) return null;
905
+ if (!trimmed || teamSlugFromName(trimmed) || trimmed === REVIEW_TAB_TITLE) return null;
880
906
  return trimmed;
881
907
  }
882
908
  function threadDisplayLabel(thread) {
883
- if (thread.userSetTitle && thread.title?.trim()) return thread.title.trim();
909
+ const titled = thread.title?.trim() ?? "";
910
+ if (thread.userSetTitle && titled && titled !== REVIEW_TAB_TITLE) return titled;
884
911
  if (thread.prTitle?.trim()) return thread.prTitle.trim();
885
912
  if (isPlaceholderBranch(thread.branchName, thread.worktreePath)) {
886
913
  const purpose = taskPurposeTitle(thread.title);
@@ -896,6 +923,35 @@ function worktreeDisplayLabelForGroup(threads) {
896
923
  const canonical = [...threads].sort((a, b) => a.createdAt.localeCompare(b.createdAt))[0];
897
924
  return threadDisplayLabel(canonical);
898
925
  }
926
+ function worktreeAnchorLabel(threads) {
927
+ if (threads.length === 0) return { title: "Worktree", subtitle: null };
928
+ const canonical = [...threads].sort((a, b) => a.createdAt.localeCompare(b.createdAt))[0];
929
+ const pr = threads.map((t) => t.prTitle?.trim()).find((v) => Boolean(v)) ?? "";
930
+ const branch = (canonical.branchName ?? "").trim();
931
+ const placeholder = isPlaceholderBranch(branch, canonical.worktreePath);
932
+ const display = branchDisplayLabel(canonical.branchName, canonical.worktreePath);
933
+ const realBranch = !placeholder && branch && branch !== "HEAD" ? branch : null;
934
+ if (pr) {
935
+ return {
936
+ title: pr,
937
+ subtitle: realBranch && realBranch !== pr ? realBranch : null
938
+ };
939
+ }
940
+ if (placeholder) {
941
+ const purpose = taskPurposeTitle(canonical.title);
942
+ if (purpose) return { title: purpose, subtitle: null };
943
+ }
944
+ if (display) {
945
+ return {
946
+ title: display,
947
+ subtitle: realBranch && realBranch !== display ? realBranch : null
948
+ };
949
+ }
950
+ return {
951
+ title: worktreeNameFromPath(canonical.worktreePath),
952
+ subtitle: realBranch
953
+ };
954
+ }
899
955
  function agentNicknameFromWorktreePath(worktreePath) {
900
956
  const dir = worktreeNameFromPath(worktreePath);
901
957
  if (!soccerTokenFromTakenSlug(dir)) return null;
@@ -1246,6 +1302,10 @@ function findThreadByRef(ref) {
1246
1302
  }
1247
1303
 
1248
1304
  export {
1305
+ REVIEW_TAB_TITLE,
1306
+ isReviewWriteGatedThread,
1307
+ formatReviewWriteGateDirective,
1308
+ formatReviewWriteGateReminder,
1249
1309
  FAMOUS_SOCCER_TEAMS,
1250
1310
  lookupSoccerTeam,
1251
1311
  teamSlugFromName,
@@ -1263,6 +1323,7 @@ export {
1263
1323
  threadDisplayLabel,
1264
1324
  worktreeDisplayLabel,
1265
1325
  worktreeDisplayLabelForGroup,
1326
+ worktreeAnchorLabel,
1266
1327
  agentNicknameFromWorktreePath,
1267
1328
  workspaceNameLabel,
1268
1329
  worktreeIdentityTitles,
@@ -4,7 +4,7 @@ import {
4
4
  normalizeTakenSlug,
5
5
  normalizeWorktreePath,
6
6
  takenSlugsFromThread
7
- } from "./chunk-CHUPIJP7.js";
7
+ } from "./chunk-YEIHCSZS.js";
8
8
  import {
9
9
  ensureWorktreeSideboardIgnored
10
10
  } from "./chunk-2P4XKWV2.js";
@@ -34,10 +34,10 @@ import {
34
34
  tryReservePort,
35
35
  tryReservePorts,
36
36
  worktreeRunPortsPath
37
- } from "./chunk-YR7NZYUT.js";
37
+ } from "./chunk-NRSC4N5X.js";
38
38
  import "./chunk-I5TESHDN.js";
39
- import "./chunk-PN32Z4JL.js";
40
- import "./chunk-5CTG5W7S.js";
39
+ import "./chunk-A6C67DY5.js";
40
+ import "./chunk-A46CIARU.js";
41
41
  import "./chunk-N2WW62LF.js";
42
42
  import "./chunk-DD67JWTN.js";
43
43
  import "./chunk-2UG25RMK.js";
@@ -48,7 +48,7 @@ import {
48
48
  } from "./chunk-WWUABK6B.js";
49
49
  import "./chunk-FJZWM2ON.js";
50
50
  import "./chunk-J2LNLI4S.js";
51
- import "./chunk-U35AHE2P.js";
51
+ import "./chunk-HOLB6ZFZ.js";
52
52
  import "./chunk-WMZIANPV.js";
53
53
  import "./chunk-KGZBYWZ3.js";
54
54
  import {
@@ -32,11 +32,11 @@ import {
32
32
  tryReservePort,
33
33
  tryReservePorts,
34
34
  worktreeRunPortsPath
35
- } from "./chunk-IODJCVMN.js";
35
+ } from "./chunk-4XZJYBO2.js";
36
36
  import "./chunk-7Q327QF2.js";
37
- import "./chunk-GFM63DTU.js";
38
- import "./chunk-BPBDGJ43.js";
39
- import "./chunk-CHUPIJP7.js";
37
+ import "./chunk-PX324N7P.js";
38
+ import "./chunk-YN6XONV5.js";
39
+ import "./chunk-YEIHCSZS.js";
40
40
  import "./chunk-2P4XKWV2.js";
41
41
  import "./chunk-F2PVRF3B.js";
42
42
  import "./chunk-5XNT6BCG.js";
@@ -9,8 +9,8 @@ import {
9
9
  enrichWorkspacesWithGithub,
10
10
  ensureGlobalCoordinatorCwd,
11
11
  formatWorkspaceInventory
12
- } from "./chunk-PN32Z4JL.js";
13
- import "./chunk-5CTG5W7S.js";
12
+ } from "./chunk-A6C67DY5.js";
13
+ import "./chunk-A46CIARU.js";
14
14
  import "./chunk-N2WW62LF.js";
15
15
  import "./chunk-DD67JWTN.js";
16
16
  import "./chunk-2UG25RMK.js";
@@ -19,7 +19,7 @@ import "./chunk-NSTQ6QKD.js";
19
19
  import "./chunk-WWUABK6B.js";
20
20
  import "./chunk-FJZWM2ON.js";
21
21
  import "./chunk-J2LNLI4S.js";
22
- import "./chunk-U35AHE2P.js";
22
+ import "./chunk-HOLB6ZFZ.js";
23
23
  import "./chunk-WMZIANPV.js";
24
24
  import "./chunk-KGZBYWZ3.js";
25
25
  import "./chunk-WOU343SI.js";
@@ -7,9 +7,9 @@ import {
7
7
  enrichWorkspacesWithGithub,
8
8
  ensureGlobalCoordinatorCwd,
9
9
  formatWorkspaceInventory
10
- } from "./chunk-GFM63DTU.js";
11
- import "./chunk-BPBDGJ43.js";
12
- import "./chunk-CHUPIJP7.js";
10
+ } from "./chunk-PX324N7P.js";
11
+ import "./chunk-YN6XONV5.js";
12
+ import "./chunk-YEIHCSZS.js";
13
13
  import "./chunk-2P4XKWV2.js";
14
14
  import "./chunk-F2PVRF3B.js";
15
15
  import "./chunk-6K64FJDD.js";
@@ -18,9 +18,9 @@ import {
18
18
  remoteCoordinatorSourceRef,
19
19
  slackCoordinatorSourceRef,
20
20
  takenTeamSlugsForOrchestration
21
- } from "./chunk-GFM63DTU.js";
22
- import "./chunk-BPBDGJ43.js";
23
- import "./chunk-CHUPIJP7.js";
21
+ } from "./chunk-PX324N7P.js";
22
+ import "./chunk-YN6XONV5.js";
23
+ import "./chunk-YEIHCSZS.js";
24
24
  import "./chunk-2P4XKWV2.js";
25
25
  import "./chunk-F2PVRF3B.js";
26
26
  import "./chunk-6K64FJDD.js";
@@ -20,8 +20,8 @@ import {
20
20
  remoteCoordinatorSourceRef,
21
21
  slackCoordinatorSourceRef,
22
22
  takenTeamSlugsForOrchestration
23
- } from "./chunk-PN32Z4JL.js";
24
- import "./chunk-5CTG5W7S.js";
23
+ } from "./chunk-A6C67DY5.js";
24
+ import "./chunk-A46CIARU.js";
25
25
  import "./chunk-N2WW62LF.js";
26
26
  import "./chunk-DD67JWTN.js";
27
27
  import "./chunk-2UG25RMK.js";
@@ -30,7 +30,7 @@ import "./chunk-NSTQ6QKD.js";
30
30
  import "./chunk-WWUABK6B.js";
31
31
  import "./chunk-FJZWM2ON.js";
32
32
  import "./chunk-J2LNLI4S.js";
33
- import "./chunk-U35AHE2P.js";
33
+ import "./chunk-HOLB6ZFZ.js";
34
34
  import "./chunk-WMZIANPV.js";
35
35
  import "./chunk-KGZBYWZ3.js";
36
36
  import {