@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
@@ -16,9 +16,9 @@ import {
16
16
  toAbleTimeIssueInfo,
17
17
  updateAbleTimeTask,
18
18
  verifyAbleTimeConnection
19
- } from "./chunk-MKGSMPWB.js";
20
- import "./chunk-NZVD5EVX.js";
21
- import "./chunk-DV6ID6CK.js";
19
+ } from "./chunk-GXSV3X3L.js";
20
+ import "./chunk-VVV7EI6T.js";
21
+ import "./chunk-ELBK34TY.js";
22
22
  import "./chunk-JAT3JFOS.js";
23
23
  import "./chunk-6K64FJDD.js";
24
24
  import "./chunk-U7PNCYNX.js";
@@ -18,9 +18,9 @@ import {
18
18
  toAbleTimeIssueInfo,
19
19
  updateAbleTimeTask,
20
20
  verifyAbleTimeConnection
21
- } from "./chunk-72OWKHFJ.js";
22
- import "./chunk-Y4WARKPW.js";
23
- import "./chunk-JRZTJ4F7.js";
21
+ } from "./chunk-I5CLCWUK.js";
22
+ import "./chunk-VZAJVX36.js";
23
+ import "./chunk-7SCVGGF6.js";
24
24
  import "./chunk-2GPQZZLY.js";
25
25
  import "./chunk-N2WW62LF.js";
26
26
  import "./chunk-GCHSJCCX.js";
@@ -20,8 +20,8 @@ import {
20
20
  parseAbleTimeOAuthCallbackUrl,
21
21
  resolveAbleTimeOAuthHost,
22
22
  startAbleTimeOAuth
23
- } from "./chunk-7J2KOIYD.js";
24
- import "./chunk-DV6ID6CK.js";
23
+ } from "./chunk-CCUGIVYN.js";
24
+ import "./chunk-ELBK34TY.js";
25
25
  import "./chunk-JAT3JFOS.js";
26
26
  import "./chunk-U7PNCYNX.js";
27
27
  import "./chunk-77WWLBCI.js";
@@ -3,7 +3,7 @@
3
3
  import {
4
4
  DEFAULT_ABLETIME_HOST,
5
5
  normalizeAbleTimeHost
6
- } from "./chunk-JRZTJ4F7.js";
6
+ } from "./chunk-7SCVGGF6.js";
7
7
  import {
8
8
  httpFetch
9
9
  } from "./chunk-2GPQZZLY.js";
@@ -288,7 +288,7 @@ async function startAbleTimeOAuth(opts) {
288
288
  persistAbleTimeTokens(data, { host });
289
289
  const token = data.access_token.trim();
290
290
  try {
291
- const { getAbleTimeOrientation } = await import("./abletime-QK3KMRQD.js");
291
+ const { getAbleTimeOrientation } = await import("./abletime-TKAFNXCM.js");
292
292
  const orientation = await getAbleTimeOrientation({ token, host });
293
293
  return saveAbleTimeConnection({
294
294
  accessToken: token,
@@ -5,8 +5,8 @@ import {
5
5
  callAbleTimeRestTool,
6
6
  looksLikeAbleTimeUlid,
7
7
  textFromAbleTimeDoc
8
- } from "./chunk-NZVD5EVX.js";
9
- import "./chunk-DV6ID6CK.js";
8
+ } from "./chunk-VVV7EI6T.js";
9
+ import "./chunk-ELBK34TY.js";
10
10
  import "./chunk-JAT3JFOS.js";
11
11
  import "./chunk-U7PNCYNX.js";
12
12
  import "./chunk-77WWLBCI.js";
@@ -7,8 +7,8 @@ import {
7
7
  callAbleTimeRestTool,
8
8
  looksLikeAbleTimeUlid,
9
9
  textFromAbleTimeDoc
10
- } from "./chunk-Y4WARKPW.js";
11
- import "./chunk-JRZTJ4F7.js";
10
+ } from "./chunk-VZAJVX36.js";
11
+ import "./chunk-7SCVGGF6.js";
12
12
  import "./chunk-2GPQZZLY.js";
13
13
  import "./chunk-GCHSJCCX.js";
14
14
  import "./chunk-NSTQ6QKD.js";
@@ -37,7 +37,7 @@ import {
37
37
  planModeTurnInstruction,
38
38
  resolveCursorModelId,
39
39
  resolveQuotaFallbackAgent
40
- } from "./chunk-NKVNHBDB.js";
40
+ } from "./chunk-XWUDFLBX.js";
41
41
  import "./chunk-HH3VVTEC.js";
42
42
  import "./chunk-7Q327QF2.js";
43
43
  import {
@@ -52,9 +52,9 @@ import {
52
52
  resolveLoginCommand,
53
53
  whichOnPath
54
54
  } from "./chunk-NXNNYY3Q.js";
55
- import "./chunk-GFM63DTU.js";
56
- import "./chunk-BPBDGJ43.js";
57
- import "./chunk-CHUPIJP7.js";
55
+ import "./chunk-PX324N7P.js";
56
+ import "./chunk-YN6XONV5.js";
57
+ import "./chunk-YEIHCSZS.js";
58
58
  import "./chunk-2P4XKWV2.js";
59
59
  import "./chunk-RSA47QYR.js";
60
60
  import "./chunk-JAT3JFOS.js";
@@ -46,7 +46,7 @@ import {
46
46
  resolveCursorSdkRoot,
47
47
  resolveQuotaFallbackAgent,
48
48
  turnCostUsdFromCursorUsage
49
- } from "./chunk-FVTR54LY.js";
49
+ } from "./chunk-GH7UMULC.js";
50
50
  import {
51
51
  getAgentSetupInfo,
52
52
  installAgent,
@@ -63,8 +63,8 @@ import "./chunk-V5BTGQ6M.js";
63
63
  import "./chunk-E63AM3PW.js";
64
64
  import "./chunk-2GPQZZLY.js";
65
65
  import "./chunk-I5TESHDN.js";
66
- import "./chunk-PN32Z4JL.js";
67
- import "./chunk-5CTG5W7S.js";
66
+ import "./chunk-A6C67DY5.js";
67
+ import "./chunk-A46CIARU.js";
68
68
  import "./chunk-N2WW62LF.js";
69
69
  import "./chunk-DD67JWTN.js";
70
70
  import {
@@ -88,7 +88,7 @@ import "./chunk-NSTQ6QKD.js";
88
88
  import "./chunk-WWUABK6B.js";
89
89
  import "./chunk-FJZWM2ON.js";
90
90
  import "./chunk-J2LNLI4S.js";
91
- import "./chunk-U35AHE2P.js";
91
+ import "./chunk-HOLB6ZFZ.js";
92
92
  import "./chunk-WMZIANPV.js";
93
93
  import "./chunk-KGZBYWZ3.js";
94
94
  import "./chunk-WOU343SI.js";
@@ -8,12 +8,13 @@ import {
8
8
  isGlobalThread,
9
9
  isOrchestratorThread,
10
10
  isSlackCoordinatorThread
11
- } from "./chunk-GFM63DTU.js";
11
+ } from "./chunk-PX324N7P.js";
12
12
  import {
13
13
  mergeAgentGitAuthEnv,
14
14
  resolveAgentGitAuthEnv
15
- } from "./chunk-BPBDGJ43.js";
15
+ } from "./chunk-YN6XONV5.js";
16
16
  import {
17
+ REVIEW_TAB_TITLE,
17
18
  allocateTeamName,
18
19
  createEmptyThread,
19
20
  findThreadByRef,
@@ -23,7 +24,7 @@ import {
23
24
  updateThread,
24
25
  worktreeNameFromPath,
25
26
  writeThread
26
- } from "./chunk-CHUPIJP7.js";
27
+ } from "./chunk-YEIHCSZS.js";
27
28
  import {
28
29
  ensureWorktreeSideboardIgnored
29
30
  } from "./chunk-2P4XKWV2.js";
@@ -690,6 +691,7 @@ function worktreeBindingFrom(from) {
690
691
  prIsInMergeQueue: from.prIsInMergeQueue,
691
692
  prLabels: from.prLabels,
692
693
  prChecksFailed: from.prChecksFailed,
694
+ issueBlockedBy: from.issueBlockedBy,
693
695
  skipAutoArchiveOnMerge: from.skipAutoArchiveOnMerge,
694
696
  stackId: from.stackId,
695
697
  stackLayer: from.stackLayer,
@@ -786,32 +788,6 @@ function forkChatTab(input) {
786
788
  return tab;
787
789
  }
788
790
 
789
- // src/review/review-write-gate.ts
790
- var REVIEW_TAB_TITLE = "Review";
791
- function hasLiveReviewSibling(thread, siblings = []) {
792
- const selfId = thread.id;
793
- return siblings.some(
794
- (t) => t.id !== selfId && t.status !== "archived" && t.title.trim() === REVIEW_TAB_TITLE
795
- );
796
- }
797
- function isReviewWriteGatedThread(thread, siblings) {
798
- if (thread.sourceType === "pr" || thread.title.trim() === REVIEW_TAB_TITLE) {
799
- return true;
800
- }
801
- return hasLiveReviewSibling(thread, siblings);
802
- }
803
- function formatReviewWriteGateDirective() {
804
- return [
805
- "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.",
806
- "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.",
807
- "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.",
808
- "Do not request reviewers, change labels, or assign yourself unless they asked \u2014 those also notify the author."
809
- ].join("\n");
810
- }
811
- function formatReviewWriteGateReminder() {
812
- 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.";
813
- }
814
-
815
791
  // src/review/review-request-template.ts
816
792
  var REVIEW_REQUEST_TEMPLATE = `# Review guidelines:
817
793
 
@@ -1832,7 +1808,7 @@ var PORT_RANGE_SIZE = 10;
1832
1808
  var RECLAIM_RETRY_DELAY_MS = 40;
1833
1809
  var RECLAIM_TRIES = 8;
1834
1810
  async function killReclaimable(ports, worktreePath, signal) {
1835
- const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-DKWTQADV.js");
1811
+ const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-TP2NA44I.js");
1836
1812
  if (worktreePath) killStaleWorktreeListeners2(ports, worktreePath, signal);
1837
1813
  else killListenersOnPorts2(ports);
1838
1814
  }
@@ -2583,10 +2559,6 @@ export {
2583
2559
  buildForkTranscriptAttachment,
2584
2560
  createChatTab,
2585
2561
  forkChatTab,
2586
- REVIEW_TAB_TITLE,
2587
- isReviewWriteGatedThread,
2588
- formatReviewWriteGateDirective,
2589
- formatReviewWriteGateReminder,
2590
2562
  REVIEW_REQUEST_TEMPLATE,
2591
2563
  REVIEW_SKILL_PATH,
2592
2564
  REVIEW_SKILL_NAME,
@@ -155,7 +155,7 @@ function textsFromUnknown(value) {
155
155
  return "";
156
156
  }
157
157
  async function abletimeMcpRequest(method, params, opts) {
158
- const rawToken = opts?.token ?? await import("./abletime-oauth-I2RRPVKT.js").then((m) => m.ensureAbleTimeAccessToken());
158
+ const rawToken = opts?.token ?? await import("./abletime-oauth-S4AXA4WR.js").then((m) => m.ensureAbleTimeAccessToken());
159
159
  if (!rawToken?.trim()) {
160
160
  throw new Error("AbleTime is not connected \u2014 paste a personal access token in Account settings");
161
161
  }
@@ -226,9 +226,9 @@ async function callAbleTimeTool(name, args = {}, opts) {
226
226
  if (!opts?.token && !isAbleTimeConnected()) {
227
227
  throw new Error("AbleTime is not connected \u2014 paste a personal access token in Account settings");
228
228
  }
229
- const rawToken = opts?.token ?? await import("./abletime-oauth-I2RRPVKT.js").then((m) => m.ensureAbleTimeAccessToken());
229
+ const rawToken = opts?.token ?? await import("./abletime-oauth-S4AXA4WR.js").then((m) => m.ensureAbleTimeAccessToken());
230
230
  if (rawToken && ableTimeUsesRest(rawToken)) {
231
- const { callAbleTimeRestTool } = await import("./abletime-rest-W5TLQK7C.js");
231
+ const { callAbleTimeRestTool } = await import("./abletime-rest-ORBELZQO.js");
232
232
  return callAbleTimeRestTool(name, args, { ...opts, token: rawToken });
233
233
  }
234
234
  const requestOpts = { ...opts, pm: opts?.pm ?? abletimeToolUsesPm(name) };
@@ -244,7 +244,7 @@ async function callAbleTimeTool(name, args = {}, opts) {
244
244
  return await call();
245
245
  }
246
246
  if (rawToken && ableTimeUsesRest(rawToken) && isAbleTimeRejectedCredential(message)) {
247
- const { callAbleTimeRestTool } = await import("./abletime-rest-W5TLQK7C.js");
247
+ const { callAbleTimeRestTool } = await import("./abletime-rest-ORBELZQO.js");
248
248
  return callAbleTimeRestTool(name, args, { ...opts, token: rawToken });
249
249
  }
250
250
  throw err instanceof Error ? new Error(rewriteAbleTimeError(err.message)) : err;
@@ -26,7 +26,7 @@ import {
26
26
  normalizeTakenSlug,
27
27
  normalizeWorktreePath,
28
28
  takenSlugsFromThread
29
- } from "./chunk-U35AHE2P.js";
29
+ } from "./chunk-HOLB6ZFZ.js";
30
30
  import {
31
31
  worktreesRoot
32
32
  } from "./chunk-WOU343SI.js";
@@ -5,7 +5,7 @@ import {
5
5
  ensureGhPreferOrigin,
6
6
  resolveGithubRepoSlug,
7
7
  resolveRepoRoot
8
- } from "./chunk-5CTG5W7S.js";
8
+ } from "./chunk-A46CIARU.js";
9
9
  import {
10
10
  ATTACHMENTS_DIR,
11
11
  attachmentsGitignoreBody
@@ -31,7 +31,7 @@ import {
31
31
  teamSlugFromName,
32
32
  updateThread,
33
33
  writeThread
34
- } from "./chunk-U35AHE2P.js";
34
+ } from "./chunk-HOLB6ZFZ.js";
35
35
  import {
36
36
  appDataDir,
37
37
  globalAgentCwd,
@@ -27,9 +27,8 @@ import {
27
27
  parseSessionQuotaResetAt,
28
28
  planModeTurnInstruction,
29
29
  resolveQuotaFallbackAgent
30
- } from "./chunk-FVTR54LY.js";
30
+ } from "./chunk-GH7UMULC.js";
31
31
  import {
32
- REVIEW_TAB_TITLE,
33
32
  applyWorktreePkgCacheEnv,
34
33
  askBlockStillWaiting,
35
34
  buildBrightsySessionSeed,
@@ -41,13 +40,10 @@ import {
41
40
  extractPendingPlanQuestions,
42
41
  forkChatTab,
43
42
  forkMessageSlice,
44
- formatReviewWriteGateDirective,
45
- formatReviewWriteGateReminder,
46
43
  getDefaultRunScript,
47
44
  getRunMode,
48
45
  isAskUserToolName,
49
46
  isJobContinuePrompt,
50
- isReviewWriteGatedThread,
51
47
  isWorktreeRunProcessKey,
52
48
  killDetachedRunTree,
53
49
  killListenersOnPorts,
@@ -69,7 +65,7 @@ import {
69
65
  worktreeDevProcessKey,
70
66
  worktreeRunProcessKey,
71
67
  worktreeSetupProcessKey
72
- } from "./chunk-YR7NZYUT.js";
68
+ } from "./chunk-NRSC4N5X.js";
73
69
  import {
74
70
  applyAgentEvent,
75
71
  clipAgentEventForPaint,
@@ -121,7 +117,7 @@ import {
121
117
  stageAbsolutePathsAsAttachments,
122
118
  stageBuffersAsAttachments,
123
119
  syncWorkspacesFromThreads
124
- } from "./chunk-PN32Z4JL.js";
120
+ } from "./chunk-A6C67DY5.js";
125
121
  import {
126
122
  addPrStackLayer,
127
123
  allocateTeamSlug,
@@ -163,7 +159,7 @@ import {
163
159
  resolveRepoRoot,
164
160
  switchWorktreeBranch,
165
161
  withRepoGitLock
166
- } from "./chunk-5CTG5W7S.js";
162
+ } from "./chunk-A46CIARU.js";
167
163
  import {
168
164
  clearStaleIndexLocks,
169
165
  enrichPathWithNpmGlobalBin,
@@ -220,12 +216,16 @@ import {
220
216
  resolveAccountForThread
221
217
  } from "./chunk-J2LNLI4S.js";
222
218
  import {
219
+ REVIEW_TAB_TITLE,
223
220
  agentNicknameFromWorktreePath,
224
221
  appendMessage,
225
222
  createEmptyThread,
226
223
  deleteThreadRecord,
227
224
  findThreadByRef,
225
+ formatReviewWriteGateDirective,
226
+ formatReviewWriteGateReminder,
228
227
  isPlaceholderBranch,
228
+ isReviewWriteGatedThread,
229
229
  isWorktreeIdentityTitle,
230
230
  listThreads,
231
231
  normalizeWorkspaceTags,
@@ -242,7 +242,7 @@ import {
242
242
  worktreeNameFromPath,
243
243
  worktreeSlugForTicket,
244
244
  writeThread
245
- } from "./chunk-U35AHE2P.js";
245
+ } from "./chunk-HOLB6ZFZ.js";
246
246
  import {
247
247
  annotateDevAccessRuns,
248
248
  appDataDir,
@@ -507,9 +507,9 @@ async function spawnAgentTurn(thread, input, onEvent) {
507
507
  `Cannot spawn ${thread.agent}: thread ${thread.id} has no worktreePath`
508
508
  );
509
509
  }
510
- const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-SK4JQBPN.js");
510
+ const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-BUWMRNW5.js");
511
511
  if (isGlobalThread2(thread)) {
512
- const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-HUZC4DZ2.js");
512
+ const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-3CT3D5UM.js");
513
513
  ensureGlobalCoordinatorCwd2(
514
514
  isOrchestratorThread(thread) ? { orchestratorThreadId: thread.id } : void 0
515
515
  );
@@ -2691,7 +2691,7 @@ async function createThread(input, _onSetupLine) {
2691
2691
  let sourceIsFork = false;
2692
2692
  if (!input.cowboy && sourceType === "branch" && (!sourceRef || sourceRef === "HEAD" || sourceRef === "default")) {
2693
2693
  if (isAbleTimeConnected() && getIssueSource() === "abletime") {
2694
- const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-QK3KMRQD.js");
2694
+ const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-TKAFNXCM.js");
2695
2695
  const task = await ensureAbleTimeTask({
2696
2696
  title: title?.trim() || "Untitled work",
2697
2697
  description: input.prompt?.trim() || void 0
@@ -3564,7 +3564,7 @@ async function adoptThread(input) {
3564
3564
  messages: input.messages ?? []
3565
3565
  });
3566
3566
  writeThread(thread);
3567
- const { addWorkspace: addWorkspace2 } = await import("./workspaces-EYNZDL45.js");
3567
+ const { addWorkspace: addWorkspace2 } = await import("./workspaces-2V5UYPYC.js");
3568
3568
  await addWorkspace2(repoPath);
3569
3569
  const { ensureWorktreeSideboardIgnored } = await import("./worktree-exclude-5N2KTYIT.js");
3570
3570
  await ensureWorktreeSideboardIgnored(input.worktreePath);
@@ -6458,7 +6458,7 @@ function formatScheduledPrompt(name, prompt) {
6458
6458
  ${prompt}`;
6459
6459
  }
6460
6460
  async function defaultDeps() {
6461
- const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-ZRMZ4TCL.js");
6461
+ const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-N54V3B76.js");
6462
6462
  const orch = getOrchestrator2();
6463
6463
  return {
6464
6464
  findThread: (id) => findThreadByRef(id),
@@ -9340,7 +9340,7 @@ async function startOrchestration(opts) {
9340
9340
  sourceRef: "default",
9341
9341
  ...createOpts
9342
9342
  }).catch(async () => {
9343
- const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-UCOSAI7J.js");
9343
+ const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-XJKLDYOL.js");
9344
9344
  const repo = await resolveRepoRoot2(repoPath);
9345
9345
  const def = await resolveDefaultBranch2(repo);
9346
9346
  return orch.createThread({
@@ -9350,7 +9350,7 @@ async function startOrchestration(opts) {
9350
9350
  repoPath: repo
9351
9351
  });
9352
9352
  });
9353
- const { updateThread: upd } = await import("./thread-store-GOVVXQV2.js");
9353
+ const { updateThread: upd } = await import("./thread-store-PLNIWFZ4.js");
9354
9354
  const updated = upd(thread.id, {
9355
9355
  sourceType: "orchestration",
9356
9356
  sourceRef: goal
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DEFAULT_ABLETIME_HOST,
3
3
  normalizeAbleTimeHost
4
- } from "./chunk-DV6ID6CK.js";
4
+ } from "./chunk-ELBK34TY.js";
5
5
  import {
6
6
  httpFetch
7
7
  } from "./chunk-JAT3JFOS.js";
@@ -280,7 +280,7 @@ async function startAbleTimeOAuth(opts) {
280
280
  persistAbleTimeTokens(data, { host });
281
281
  const token = data.access_token.trim();
282
282
  try {
283
- const { getAbleTimeOrientation } = await import("./abletime-QQZWYJXC.js");
283
+ const { getAbleTimeOrientation } = await import("./abletime-NZ2ABWAL.js");
284
284
  const orientation = await getAbleTimeOrientation({ token, host });
285
285
  return saveAbleTimeConnection({
286
286
  accessToken: token,
@@ -153,7 +153,7 @@ function textsFromUnknown(value) {
153
153
  return "";
154
154
  }
155
155
  async function abletimeMcpRequest(method, params, opts) {
156
- const rawToken = opts?.token ?? await import("./abletime-oauth-CAHTMB4V.js").then((m) => m.ensureAbleTimeAccessToken());
156
+ const rawToken = opts?.token ?? await import("./abletime-oauth-CBFFBINA.js").then((m) => m.ensureAbleTimeAccessToken());
157
157
  if (!rawToken?.trim()) {
158
158
  throw new Error("AbleTime is not connected \u2014 paste a personal access token in Account settings");
159
159
  }
@@ -224,9 +224,9 @@ async function callAbleTimeTool(name, args = {}, opts) {
224
224
  if (!opts?.token && !isAbleTimeConnected()) {
225
225
  throw new Error("AbleTime is not connected \u2014 paste a personal access token in Account settings");
226
226
  }
227
- const rawToken = opts?.token ?? await import("./abletime-oauth-CAHTMB4V.js").then((m) => m.ensureAbleTimeAccessToken());
227
+ const rawToken = opts?.token ?? await import("./abletime-oauth-CBFFBINA.js").then((m) => m.ensureAbleTimeAccessToken());
228
228
  if (rawToken && ableTimeUsesRest(rawToken)) {
229
- const { callAbleTimeRestTool } = await import("./abletime-rest-5V4KGMSY.js");
229
+ const { callAbleTimeRestTool } = await import("./abletime-rest-NSOP72AI.js");
230
230
  return callAbleTimeRestTool(name, args, { ...opts, token: rawToken });
231
231
  }
232
232
  const requestOpts = { ...opts, pm: opts?.pm ?? abletimeToolUsesPm(name) };
@@ -242,7 +242,7 @@ async function callAbleTimeTool(name, args = {}, opts) {
242
242
  return await call();
243
243
  }
244
244
  if (rawToken && ableTimeUsesRest(rawToken) && isAbleTimeRejectedCredential(message)) {
245
- const { callAbleTimeRestTool } = await import("./abletime-rest-5V4KGMSY.js");
245
+ const { callAbleTimeRestTool } = await import("./abletime-rest-NSOP72AI.js");
246
246
  return callAbleTimeRestTool(name, args, { ...opts, token: rawToken });
247
247
  }
248
248
  throw err instanceof Error ? new Error(rewriteAbleTimeError(err.message)) : err;
@@ -24,13 +24,13 @@ import {
24
24
  } from "./chunk-I5TESHDN.js";
25
25
  import {
26
26
  isOrchestratorThread
27
- } from "./chunk-PN32Z4JL.js";
27
+ } from "./chunk-A6C67DY5.js";
28
28
  import {
29
29
  codexUnattendedGitConfigArgs,
30
30
  mergeAgentGitAuthEnv,
31
31
  resolveAgentGitAuthEnv,
32
32
  resolveCodexGitWritableRoots
33
- } from "./chunk-5CTG5W7S.js";
33
+ } from "./chunk-A46CIARU.js";
34
34
  import {
35
35
  githubAgentAuthReady,
36
36
  npmGlobalNodeModules,
@@ -57,7 +57,7 @@ import {
57
57
  CLAUDE_POSTHOG_CONNECTOR_ALLOWED_TOOLS,
58
58
  CLAUDE_PRINT_BG_WAIT_CEILING_MS,
59
59
  mcpAllowToolsFromNames
60
- } from "./chunk-U35AHE2P.js";
60
+ } from "./chunk-HOLB6ZFZ.js";
61
61
  import {
62
62
  appDataDir
63
63
  } from "./chunk-WOU343SI.js";
@@ -2916,7 +2916,7 @@ var claudeAdapter = {
2916
2916
  );
2917
2917
  }
2918
2918
  const mode = permissionMode(thread);
2919
- const { isOrchestratorThread: isOrchestratorThread2 } = await import("./global-workspace-SK4JQBPN.js");
2919
+ const { isOrchestratorThread: isOrchestratorThread2 } = await import("./global-workspace-BUWMRNW5.js");
2920
2920
  const isOrchestrator = isOrchestratorThread2(thread);
2921
2921
  const rpc = worktreeAgentRpc(isOrchestrator);
2922
2922
  const injectedServers = await buildInjectedMcpServers({
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  abletimeRestUrl,
3
3
  textFromAbleTimeDoc
4
- } from "./chunk-NZVD5EVX.js";
4
+ } from "./chunk-VVV7EI6T.js";
5
5
  import {
6
6
  assertAbleTimeCredential,
7
7
  callAbleTimeTool,
8
8
  normalizeAbleTimeHost,
9
9
  rewriteAbleTimeError
10
- } from "./chunk-DV6ID6CK.js";
10
+ } from "./chunk-ELBK34TY.js";
11
11
  import {
12
12
  httpFetch
13
13
  } from "./chunk-JAT3JFOS.js";
@@ -15,6 +15,32 @@ import {
15
15
  // src/store/thread-store.ts
16
16
  import { randomUUID } from "crypto";
17
17
 
18
+ // src/review/review-write-gate.ts
19
+ var REVIEW_TAB_TITLE = "Review";
20
+ function hasLiveReviewSibling(thread, siblings = []) {
21
+ const selfId = thread.id;
22
+ return siblings.some(
23
+ (t) => t.id !== selfId && t.status !== "archived" && t.title.trim() === REVIEW_TAB_TITLE
24
+ );
25
+ }
26
+ function isReviewWriteGatedThread(thread, siblings) {
27
+ if (thread.sourceType === "pr" || thread.title.trim() === REVIEW_TAB_TITLE) {
28
+ return true;
29
+ }
30
+ return hasLiveReviewSibling(thread, siblings);
31
+ }
32
+ function formatReviewWriteGateDirective() {
33
+ return [
34
+ "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.",
35
+ "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.",
36
+ "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.",
37
+ "Do not request reviewers, change labels, or assign yourself unless they asked \u2014 those also notify the author."
38
+ ].join("\n");
39
+ }
40
+ function formatReviewWriteGateReminder() {
41
+ 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.";
42
+ }
43
+
18
44
  // src/git/team-meta.ts
19
45
  var SOCCER_TEAM_META = {
20
46
  "aalborg": { location: "Aalborg, Denmark", league: "Danish Superliga" },
@@ -875,11 +901,12 @@ function branchDisplayLabel(branchName, worktreePath) {
875
901
  }
876
902
  function taskPurposeTitle(title) {
877
903
  const trimmed = title?.trim() ?? "";
878
- if (!trimmed || teamSlugFromName(trimmed)) return null;
904
+ if (!trimmed || teamSlugFromName(trimmed) || trimmed === REVIEW_TAB_TITLE) return null;
879
905
  return trimmed;
880
906
  }
881
907
  function threadDisplayLabel(thread) {
882
- if (thread.userSetTitle && thread.title?.trim()) return thread.title.trim();
908
+ const titled = thread.title?.trim() ?? "";
909
+ if (thread.userSetTitle && titled && titled !== REVIEW_TAB_TITLE) return titled;
883
910
  if (thread.prTitle?.trim()) return thread.prTitle.trim();
884
911
  if (isPlaceholderBranch(thread.branchName, thread.worktreePath)) {
885
912
  const purpose = taskPurposeTitle(thread.title);
@@ -1285,6 +1312,10 @@ function findThreadByRef(ref) {
1285
1312
  }
1286
1313
 
1287
1314
  export {
1315
+ REVIEW_TAB_TITLE,
1316
+ isReviewWriteGatedThread,
1317
+ formatReviewWriteGateDirective,
1318
+ formatReviewWriteGateReminder,
1288
1319
  FAMOUS_SOCCER_TEAMS,
1289
1320
  lookupSoccerTeam,
1290
1321
  teamSlugFromName,
@@ -3,13 +3,13 @@
3
3
  import {
4
4
  abletimeRestUrl,
5
5
  textFromAbleTimeDoc
6
- } from "./chunk-Y4WARKPW.js";
6
+ } from "./chunk-VZAJVX36.js";
7
7
  import {
8
8
  assertAbleTimeCredential,
9
9
  callAbleTimeTool,
10
10
  normalizeAbleTimeHost,
11
11
  rewriteAbleTimeError
12
- } from "./chunk-JRZTJ4F7.js";
12
+ } from "./chunk-7SCVGGF6.js";
13
13
  import {
14
14
  httpFetch
15
15
  } from "./chunk-2GPQZZLY.js";