@sideboard-ai/core 0.1.319 → 0.1.321

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 (75) hide show
  1. package/dist/{abletime-L3ODNTBT.js → abletime-CRRLEYTE.js} +4 -4
  2. package/dist/{abletime-DVYO4IVS.js → abletime-ICW6Q2AB.js} +4 -4
  3. package/dist/{abletime-oauth-2VWQCXGT.js → abletime-oauth-P3KPPJE4.js} +3 -3
  4. package/dist/{abletime-oauth-6DTX7LB7.js → abletime-oauth-Q76XBSPG.js} +3 -3
  5. package/dist/{abletime-rest-PYQM234B.js → abletime-rest-DNFAYYLP.js} +3 -3
  6. package/dist/{abletime-rest-7NICZYOC.js → abletime-rest-DQ3PNKXP.js} +3 -3
  7. package/dist/agents/cursor-runner.js +2 -2
  8. package/dist/{agents-KABJUDPI.js → agents-PFVYC36J.js} +10 -10
  9. package/dist/{agents-2AR7I6B6.js → agents-ROFDNE7Z.js} +11 -11
  10. package/dist/{app-settings-CZVFMOI5.js → app-settings-KMPVI2B7.js} +1 -1
  11. package/dist/{app-settings-V6YPYY57.js → app-settings-P3H4SEIK.js} +1 -1
  12. package/dist/{chunk-QVN2WOKJ.js → chunk-2TUE6JKQ.js} +12 -0
  13. package/dist/{chunk-OO3R6CS2.js → chunk-45UB2J47.js} +537 -90
  14. package/dist/{chunk-DD67JWTN.js → chunk-4YXZOXMT.js} +1 -1
  15. package/dist/{chunk-5OM7UCTQ.js → chunk-56M6VEXI.js} +3 -3
  16. package/dist/{chunk-ZM43NTJJ.js → chunk-5OQONGHO.js} +5 -5
  17. package/dist/{chunk-V5BTGQ6M.js → chunk-6U6QRUHY.js} +1 -1
  18. package/dist/{chunk-QPLQXWND.js → chunk-72PUPPV2.js} +3 -3
  19. package/dist/{chunk-53OCOGND.js → chunk-7JV5QP5K.js} +3 -3
  20. package/dist/{chunk-HOLB6ZFZ.js → chunk-B4CDSSRN.js} +2 -0
  21. package/dist/{chunk-ST2UQBJT.js → chunk-BANN5HUX.js} +8 -8
  22. package/dist/{chunk-AESO2KJS.js → chunk-BPDVHB4U.js} +3 -3
  23. package/dist/{chunk-WLZHRNE6.js → chunk-BTIXTH4N.js} +3 -3
  24. package/dist/{chunk-AUJ4XB6H.js → chunk-DFUXW2IT.js} +2 -2
  25. package/dist/{chunk-I5TESHDN.js → chunk-EQ52JR3Q.js} +5 -5
  26. package/dist/{chunk-E52SQENB.js → chunk-FZKAAAEB.js} +3 -1
  27. package/dist/{chunk-YALFZKSC.js → chunk-H6GXYV5Q.js} +23 -20
  28. package/dist/{chunk-JD7CC6SW.js → chunk-HHPTGIKS.js} +2 -2
  29. package/dist/{chunk-GCHSJCCX.js → chunk-IFU4W4C4.js} +3 -1
  30. package/dist/{chunk-YEIHCSZS.js → chunk-IFWGG2M2.js} +9 -0
  31. package/dist/{chunk-IAPO7ZFG.js → chunk-JNEFEA2A.js} +8 -8
  32. package/dist/{chunk-U2N32EA6.js → chunk-LD2DXHBP.js} +543 -92
  33. package/dist/{chunk-7Q327QF2.js → chunk-QIC2JXHW.js} +5 -5
  34. package/dist/{chunk-2P4XKWV2.js → chunk-QKHEVSB5.js} +1 -1
  35. package/dist/{chunk-NRSC4N5X.js → chunk-RGUZPMTF.js} +8 -8
  36. package/dist/{chunk-AZ4GEEGL.js → chunk-RHJKZOPQ.js} +3 -3
  37. package/dist/{chunk-HH3VVTEC.js → chunk-S5CJUIPY.js} +5 -5
  38. package/dist/{chunk-A6C67DY5.js → chunk-SPMIZSKH.js} +16 -13
  39. package/dist/{chunk-FDXHNROD.js → chunk-TEFFR6PB.js} +2 -2
  40. package/dist/{chunk-TUJFCJJU.js → chunk-UWJUARFA.js} +546 -187
  41. package/dist/{chunk-MBYGWNLQ.js → chunk-UX6EDDGR.js} +1 -1
  42. package/dist/{chunk-LXBZQP2Q.js → chunk-V76MQ7MH.js} +5 -5
  43. package/dist/{chunk-GH7UMULC.js → chunk-XDQSHSL6.js} +8 -8
  44. package/dist/{chunk-2UG25RMK.js → chunk-YBTSZ2SW.js} +12 -0
  45. package/dist/{chunk-A46CIARU.js → chunk-YWBLQBSN.js} +549 -188
  46. package/dist/{chunk-Y3Y7SZBZ.js → chunk-ZHGMRBSC.js} +1 -1
  47. package/dist/{conductor-MG2RAQNT.js → conductor-CNT3VL3S.js} +8 -8
  48. package/dist/{conductor-NIUBJLTS.js → conductor-XLXJU24U.js} +8 -8
  49. package/dist/{connected-teams-IHK2WXUI.js → connected-teams-H4LZOJDC.js} +2 -2
  50. package/dist/{connected-teams-IFW3NQ6G.js → connected-teams-XYRZMQO4.js} +2 -2
  51. package/dist/{coordinator-prompt-X74F3JIC.js → coordinator-prompt-D5EE2YTV.js} +6 -6
  52. package/dist/{coordinator-prompt-3CT3D5UM.js → coordinator-prompt-TU24TQ4I.js} +6 -6
  53. package/dist/{global-workspace-BUWMRNW5.js → global-workspace-743TPQNF.js} +6 -6
  54. package/dist/{global-workspace-FTNJEML3.js → global-workspace-UPMXDQM7.js} +6 -6
  55. package/dist/index.cjs +2160 -867
  56. package/dist/index.d.cts +211 -74
  57. package/dist/index.d.ts +211 -74
  58. package/dist/index.js +496 -78
  59. package/dist/mcp/run-stdio.cjs +1377 -478
  60. package/dist/mcp/run-stdio.js +80 -32
  61. package/dist/{optional-cli-6GGESWGE.js → optional-cli-2YDQQCCD.js} +5 -5
  62. package/dist/{optional-cli-EMSZBYDE.js → optional-cli-USD6PROE.js} +4 -4
  63. package/dist/{orchestrator-NCA4LSCC.js → orchestrator-B4STIW4B.js} +14 -14
  64. package/dist/{orchestrator-H3DSZ5RM.js → orchestrator-VQ4HRYVB.js} +13 -13
  65. package/dist/{run-PCX5QWR4.js → run-7QMRYP3F.js} +3 -1
  66. package/dist/{run-TB7RBII2.js → run-UPNCCRCN.js} +3 -1
  67. package/dist/{thread-store-PLNIWFZ4.js → thread-store-3F7GR64A.js} +1 -1
  68. package/dist/{thread-store-7BBA63KV.js → thread-store-JRSL4HQY.js} +1 -1
  69. package/dist/{workspaces-MGKEAYNM.js → workspaces-47WQL5IG.js} +6 -6
  70. package/dist/{workspaces-2V5UYPYC.js → workspaces-75FD4QUR.js} +6 -6
  71. package/dist/{worktree-XJKLDYOL.js → worktree-G3E6WP66.js} +11 -9
  72. package/dist/{worktree-THAXW5U7.js → worktree-PDNPL5CQ.js} +11 -9
  73. package/dist/{worktree-exclude-RXZPTCNH.js → worktree-exclude-INRDQFWV.js} +2 -2
  74. package/dist/{worktree-exclude-5N2KTYIT.js → worktree-exclude-P5NJODWP.js} +2 -2
  75. package/package.json +1 -1
@@ -2,7 +2,7 @@
2
2
 
3
3
  import {
4
4
  git
5
- } from "./chunk-2UG25RMK.js";
5
+ } from "./chunk-YBTSZ2SW.js";
6
6
 
7
7
  // src/git/worktree-exclude.ts
8
8
  import { mkdirSync, readFileSync, writeFileSync } from "fs";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DEFAULT_ABLETIME_HOST,
3
3
  normalizeAbleTimeHost
4
- } from "./chunk-LXBZQP2Q.js";
4
+ } from "./chunk-V76MQ7MH.js";
5
5
  import {
6
6
  httpFetch
7
7
  } from "./chunk-JAT3JFOS.js";
@@ -10,7 +10,7 @@ import {
10
10
  getAbleTimeHost,
11
11
  loadAppSettings,
12
12
  saveAbleTimeConnection
13
- } from "./chunk-E52SQENB.js";
13
+ } from "./chunk-FZKAAAEB.js";
14
14
 
15
15
  // src/integrations/abletime-oauth.ts
16
16
  import { createHash, randomBytes } from "crypto";
@@ -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-DVYO4IVS.js");
283
+ const { getAbleTimeOrientation } = await import("./abletime-ICW6Q2AB.js");
284
284
  const orientation = await getAbleTimeOrientation({ token, host });
285
285
  return saveAbleTimeConnection({
286
286
  accessToken: token,
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  getAbleTimeHost,
8
8
  isAbleTimeConnected
9
- } from "./chunk-GCHSJCCX.js";
9
+ } from "./chunk-IFU4W4C4.js";
10
10
 
11
11
  // src/integrations/abletime-mcp.ts
12
12
  var DEFAULT_ABLETIME_HOST = "https://track.abletime.com";
@@ -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-2VWQCXGT.js").then((m) => m.ensureAbleTimeAccessToken());
158
+ const rawToken = opts?.token ?? await import("./abletime-oauth-P3KPPJE4.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-2VWQCXGT.js").then((m) => m.ensureAbleTimeAccessToken());
229
+ const rawToken = opts?.token ?? await import("./abletime-oauth-P3KPPJE4.js").then((m) => m.ensureAbleTimeAccessToken());
230
230
  if (rawToken && ableTimeUsesRest(rawToken)) {
231
- const { callAbleTimeRestTool } = await import("./abletime-rest-7NICZYOC.js");
231
+ const { callAbleTimeRestTool } = await import("./abletime-rest-DQ3PNKXP.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-7NICZYOC.js");
247
+ const { callAbleTimeRestTool } = await import("./abletime-rest-DQ3PNKXP.js");
248
248
  return callAbleTimeRestTool(name, args, { ...opts, token: rawToken });
249
249
  }
250
250
  throw err instanceof Error ? new Error(rewriteAbleTimeError(err.message)) : err;
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-E63AM3PW.js";
11
11
  import {
12
12
  run
13
- } from "./chunk-2UG25RMK.js";
13
+ } from "./chunk-YBTSZ2SW.js";
14
14
  import {
15
15
  appDataDir
16
16
  } from "./chunk-WOU343SI.js";
@@ -3,13 +3,13 @@
3
3
  import {
4
4
  abletimeRestUrl,
5
5
  textFromAbleTimeDoc
6
- } from "./chunk-JD7CC6SW.js";
6
+ } from "./chunk-HHPTGIKS.js";
7
7
  import {
8
8
  assertAbleTimeCredential,
9
9
  callAbleTimeTool,
10
10
  normalizeAbleTimeHost,
11
11
  rewriteAbleTimeError
12
- } from "./chunk-ZM43NTJJ.js";
12
+ } from "./chunk-5OQONGHO.js";
13
13
  import {
14
14
  httpFetch
15
15
  } from "./chunk-2GPQZZLY.js";
@@ -22,7 +22,7 @@ import {
22
22
  getAbleTimeHost,
23
23
  isAbleTimeConnected,
24
24
  saveAbleTimeConnection
25
- } from "./chunk-GCHSJCCX.js";
25
+ } from "./chunk-IFU4W4C4.js";
26
26
 
27
27
  // src/integrations/issue-attachments.ts
28
28
  import { existsSync, mkdirSync, writeFileSync } from "fs";
@@ -6,10 +6,10 @@ import {
6
6
  resolveCommandBinarySync,
7
7
  run,
8
8
  withExportedPath
9
- } from "./chunk-2UG25RMK.js";
9
+ } from "./chunk-YBTSZ2SW.js";
10
10
  import {
11
11
  resolveAgentExecutable
12
- } from "./chunk-GCHSJCCX.js";
12
+ } from "./chunk-IFU4W4C4.js";
13
13
 
14
14
  // src/agents/install.ts
15
15
  import { existsSync } from "fs";
@@ -267,7 +267,7 @@ async function loginAgent(agent) {
267
267
  };
268
268
  }
269
269
  async function loginManagedAccount(accountId) {
270
- const { loadAppSettings } = await import("./app-settings-CZVFMOI5.js");
270
+ const { loadAppSettings } = await import("./app-settings-KMPVI2B7.js");
271
271
  const { loginEnvPrefix } = await import("./managed-accounts-PITLFLKU.js");
272
272
  const account = loadAppSettings().accounts.accounts.find((a) => a.id === accountId);
273
273
  if (!account) {
@@ -1105,6 +1105,7 @@ function normalizeThread(raw) {
1105
1105
  quotaContinuedFromId: raw.quotaContinuedFromId ?? null,
1106
1106
  accountId: raw.accountId === null ? null : typeof raw.accountId === "string" && raw.accountId.trim() ? raw.accountId.trim() : void 0,
1107
1107
  archivedAt: typeof raw.archivedAt === "string" && raw.archivedAt.trim() ? raw.archivedAt.trim() : void 0,
1108
+ ephemeralAutomationId: typeof raw.ephemeralAutomationId === "string" && raw.ephemeralAutomationId.trim() ? raw.ephemeralAutomationId.trim() : void 0,
1108
1109
  compactedMessages: Array.isArray(raw.compactedMessages) ? raw.compactedMessages : void 0
1109
1110
  };
1110
1111
  }
@@ -1293,6 +1294,7 @@ function updateThread(id, patch) {
1293
1294
  } else {
1294
1295
  delete next.archivedAt;
1295
1296
  }
1297
+ if (!next.ephemeralAutomationId?.trim()) delete next.ephemeralAutomationId;
1296
1298
  writeThread(next);
1297
1299
  return next;
1298
1300
  }
@@ -2,17 +2,17 @@ import {
2
2
  compactSummaryPart,
3
3
  isInternalAgentStatusText,
4
4
  lastAssistantMessageText
5
- } from "./chunk-7Q327QF2.js";
5
+ } from "./chunk-QIC2JXHW.js";
6
6
  import {
7
7
  isCloudCoordinatorThread,
8
8
  isGlobalThread,
9
9
  isOrchestratorThread,
10
10
  isSlackCoordinatorThread
11
- } from "./chunk-YALFZKSC.js";
11
+ } from "./chunk-H6GXYV5Q.js";
12
12
  import {
13
13
  mergeAgentGitAuthEnv,
14
14
  resolveAgentGitAuthEnv
15
- } from "./chunk-TUJFCJJU.js";
15
+ } from "./chunk-UWJUARFA.js";
16
16
  import {
17
17
  REVIEW_TAB_TITLE,
18
18
  allocateTeamName,
@@ -24,10 +24,10 @@ import {
24
24
  updateThread,
25
25
  worktreeNameFromPath,
26
26
  writeThread
27
- } from "./chunk-YEIHCSZS.js";
27
+ } from "./chunk-IFWGG2M2.js";
28
28
  import {
29
29
  ensureWorktreeSideboardIgnored
30
- } from "./chunk-2P4XKWV2.js";
30
+ } from "./chunk-QKHEVSB5.js";
31
31
  import {
32
32
  clipToolResultForStore
33
33
  } from "./chunk-5XNT6BCG.js";
@@ -40,11 +40,11 @@ import {
40
40
  import {
41
41
  ensureAgentPath,
42
42
  run
43
- } from "./chunk-QVN2WOKJ.js";
43
+ } from "./chunk-2TUE6JKQ.js";
44
44
  import {
45
45
  assertOrchestratorCapableAgent,
46
46
  contextTokens
47
- } from "./chunk-E52SQENB.js";
47
+ } from "./chunk-FZKAAAEB.js";
48
48
  import {
49
49
  stripNestedElectronEnv
50
50
  } from "./chunk-4TR3HZFT.js";
@@ -1808,7 +1808,7 @@ var PORT_RANGE_SIZE = 10;
1808
1808
  var RECLAIM_RETRY_DELAY_MS = 40;
1809
1809
  var RECLAIM_TRIES = 8;
1810
1810
  async function killReclaimable(ports, worktreePath, signal) {
1811
- const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-MG2RAQNT.js");
1811
+ const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-CNT3VL3S.js");
1812
1812
  if (worktreePath) killStaleWorktreeListeners2(ports, worktreePath, signal);
1813
1813
  else killListenersOnPorts2(ports);
1814
1814
  }
@@ -4,10 +4,10 @@ import {
4
4
  resolveCommandBinarySync,
5
5
  run,
6
6
  withExportedPath
7
- } from "./chunk-QVN2WOKJ.js";
7
+ } from "./chunk-2TUE6JKQ.js";
8
8
  import {
9
9
  resolveAgentExecutable
10
- } from "./chunk-E52SQENB.js";
10
+ } from "./chunk-FZKAAAEB.js";
11
11
 
12
12
  // src/agents/install.ts
13
13
  import { existsSync } from "fs";
@@ -265,7 +265,7 @@ async function loginAgent(agent) {
265
265
  };
266
266
  }
267
267
  async function loginManagedAccount(accountId) {
268
- const { loadAppSettings } = await import("./app-settings-V6YPYY57.js");
268
+ const { loadAppSettings } = await import("./app-settings-P3H4SEIK.js");
269
269
  const { loginEnvPrefix } = await import("./managed-accounts-JJTAKHMG.js");
270
270
  const account = loadAppSettings().accounts.accounts.find((a) => a.id === accountId);
271
271
  if (!account) {
@@ -1,13 +1,13 @@
1
1
  import {
2
2
  abletimeRestUrl,
3
3
  textFromAbleTimeDoc
4
- } from "./chunk-AUJ4XB6H.js";
4
+ } from "./chunk-DFUXW2IT.js";
5
5
  import {
6
6
  assertAbleTimeCredential,
7
7
  callAbleTimeTool,
8
8
  normalizeAbleTimeHost,
9
9
  rewriteAbleTimeError
10
- } from "./chunk-LXBZQP2Q.js";
10
+ } from "./chunk-V76MQ7MH.js";
11
11
  import {
12
12
  httpFetch
13
13
  } from "./chunk-JAT3JFOS.js";
@@ -20,7 +20,7 @@ import {
20
20
  getAbleTimeHost,
21
21
  isAbleTimeConnected,
22
22
  saveAbleTimeConnection
23
- } from "./chunk-E52SQENB.js";
23
+ } from "./chunk-FZKAAAEB.js";
24
24
 
25
25
  // src/integrations/issue-attachments.ts
26
26
  import { existsSync, mkdirSync, writeFileSync } from "fs";
@@ -4,14 +4,14 @@ import {
4
4
  normalizeAbleTimeCredential,
5
5
  normalizeAbleTimeHost,
6
6
  rewriteAbleTimeError
7
- } from "./chunk-LXBZQP2Q.js";
7
+ } from "./chunk-V76MQ7MH.js";
8
8
  import {
9
9
  httpFetch
10
10
  } from "./chunk-JAT3JFOS.js";
11
11
  import {
12
12
  getAbleTimeAccessToken,
13
13
  getAbleTimeHost
14
- } from "./chunk-E52SQENB.js";
14
+ } from "./chunk-FZKAAAEB.js";
15
15
 
16
16
  // src/integrations/abletime-rest.ts
17
17
  var ABLETIME_REST_PREFIX = "/api/public/v2";
@@ -566,13 +566,13 @@ function toolDescription(name, input) {
566
566
  else if (/notify_orchestrator$/i.test(name)) return "Notify orchestrator";
567
567
  else if (/set_workspace_tags$/i.test(name)) return "Set workspace tags";
568
568
  if (/(?:list|set|delete)_env$/i.test(name)) return /list_env$/i.test(name) ? "List env vars" : /set_env$/i.test(name) ? "Set env var" : "Delete env var";
569
- if (/list_schedules$/i.test(name)) return "List schedules";
569
+ if (/list_schedules$/i.test(name)) return "List automations";
570
570
  if (/create_schedule$/i.test(name)) {
571
- return str(input?.name) ? `Schedule ${str(input?.name)}` : "Create schedule";
571
+ return str(input?.name) ? `Automation ${str(input?.name)}` : "Create automation";
572
572
  }
573
- if (/update_schedule$/i.test(name)) return "Update schedule";
574
- if (/delete_schedule$/i.test(name)) return "Delete schedule";
575
- if (/run_schedule$/i.test(name)) return "Run schedule";
573
+ if (/update_schedule$/i.test(name)) return "Update automation";
574
+ if (/delete_schedule$/i.test(name)) return "Delete automation";
575
+ if (/run_schedule$/i.test(name)) return "Run automation";
576
576
  if (isSkillToolName(name)) {
577
577
  const cmd = skillCommandFromInput(input);
578
578
  return cmd ? `Using /${cmd}` : "Using skill";
@@ -876,7 +876,9 @@ function planHistoryRetention(archived, thresholds = {}) {
876
876
  if (archivedUpdatedMs(thread) < cutoff) expiredIds.add(thread.id);
877
877
  }
878
878
  }
879
- const remaining = oldestFirst.filter((t) => !expiredIds.has(t.id));
879
+ const remaining = oldestFirst.filter(
880
+ (t) => !expiredIds.has(t.id) && !t.ephemeralAutomationId?.trim()
881
+ );
880
882
  const overflow = remaining.length > maxCount ? remaining.slice(0, remaining.length - maxCount) : [];
881
883
  const stripIds = [];
882
884
  const purgeIds = [...expiredIds];
@@ -1,9 +1,11 @@
1
1
  import {
2
2
  canonicalizeRepoPath,
3
3
  ensureGhPreferOrigin,
4
+ formatRemoteTag,
4
5
  resolveGithubRepoSlug,
6
+ resolveOriginRemote,
5
7
  resolveRepoRoot
6
- } from "./chunk-TUJFCJJU.js";
8
+ } from "./chunk-UWJUARFA.js";
7
9
  import {
8
10
  allocateTeamName,
9
11
  createEmptyThread,
@@ -12,7 +14,7 @@ import {
12
14
  teamSlugFromName,
13
15
  updateThread,
14
16
  writeThread
15
- } from "./chunk-YEIHCSZS.js";
17
+ } from "./chunk-IFWGG2M2.js";
16
18
  import {
17
19
  ATTACHMENTS_DIR,
18
20
  attachmentsGitignoreBody
@@ -29,7 +31,7 @@ import {
29
31
  resolveThreadDefaults,
30
32
  resolveViewerProfile,
31
33
  resolveViewerProfileForRepo
32
- } from "./chunk-E52SQENB.js";
34
+ } from "./chunk-FZKAAAEB.js";
33
35
  import {
34
36
  appDataDir,
35
37
  globalAgentCwd,
@@ -354,7 +356,7 @@ import { join as join2 } from "path";
354
356
  function formatWorkspaceInventory(workspaces) {
355
357
  if (workspaces.length === 0) return "(no registered workspaces)";
356
358
  return workspaces.map((w) => {
357
- const slug = w.githubSlug?.trim() ? ` github:${w.githubSlug.trim()}` : "";
359
+ const slug = w.originRemote ? ` ${formatRemoteTag(w.originRemote)}` : w.githubSlug?.trim() ? ` github:${w.githubSlug.trim()}` : "";
358
360
  const profile = formatWorkspaceProfileSuffix(safeViewerProfile(w.path));
359
361
  return `- ${w.name}: ${w.path}${slug}${profile}`;
360
362
  }).join("\n");
@@ -362,8 +364,9 @@ function formatWorkspaceInventory(workspaces) {
362
364
  async function enrichWorkspacesWithGithub(workspaces) {
363
365
  return Promise.all(
364
366
  workspaces.map(async (w) => {
365
- const githubSlug = await resolveGithubRepoSlug(w.path).catch(() => null);
366
- return { ...w, githubSlug };
367
+ const originRemote = await resolveOriginRemote(w.path).catch(() => null);
368
+ const githubSlug = originRemote ? originRemote.forge === "github" ? originRemote.slug : null : await resolveGithubRepoSlug(w.path).catch(() => null);
369
+ return { ...w, githubSlug, originRemote };
367
370
  })
368
371
  );
369
372
  }
@@ -374,8 +377,8 @@ function coordinatorGreenfieldPlaybook(reposDir) {
374
377
  "- Examples:",
375
378
  ` - Clone: \`git clone <url> ${reposDir}/<name>\``,
376
379
  ` - New GitHub repo: \`gh repo create <owner>/<name> --private --clone -- ${reposDir}/<name>\` (or mkdir + git init + gh repo create + remote add + push)`,
377
- "- Then: add_project with that absolute path \u2192 create_workspace (repoPath + parentChatId) \u2192 send_to_chat (build) \u2192 wait_for_turn (loop while stillRunning) \u2192 ask_git create-draft (or send_to_chat `gh pr create --draft --assignee @me -R <origin-owner/name>`).",
378
- "- Always target the child worktree's **origin** (`github:` slug from list_projects / `git remote get-url origin` in that worktree). Never open PRs against `upstream`.",
380
+ "- Then: add_project with that absolute path \u2192 create_workspace (repoPath + parentChatId) \u2192 send_to_chat (build) \u2192 wait_for_turn (loop while stillRunning) \u2192 ask_git create-draft (GitHub: `gh pr create --draft --assignee @me -R <slug>`; Cursor: `origin pr create --draft --push -R <slug>`; Entire: `entire trail create --title`).",
381
+ "- Always target the child worktree's **origin** (`github:`, `cursor:`, or `entire:` from list_projects / `git remote get-url origin` in that worktree). Never open PRs against `upstream`.",
379
382
  "- Do coding work in the child worktree thread, not by editing files in this home cwd."
380
383
  ].join("\n");
381
384
  }
@@ -383,9 +386,9 @@ var COORDINATOR_TOOL_PLAYBOOK = [
383
386
  "Role: you oversee Sideboard workspaces across registered repos. A workspace is one isolated checkout and can have many agent chats on those same files. You do not live inside one of those worktrees. Do not treat a workspace as one agent.",
384
387
  "Sideboard MCP (fleet control \u2014 prefer these for status and orchestration):",
385
388
  "Discover:",
386
- "- list_projects \u2014 registered repos (path + github slug + project context when set). Use account / project context to pick the right repo for tickets or reviews.",
389
+ "- list_projects \u2014 registered repos (path + that repo's origin host:owner/repo, such as github:, cursor:, or entire:, and project context when set). Projects do not share one git host. Use account / project context to pick the right repo for tickets or reviews.",
387
390
  "- list_board \u2014 Home Kanban of workspaces (New / Draft / Review / Approved / Merged; one card per checkout). Sibling chats on a card are separate agents, not one agent. Path to merge: no PR \u2192 draft PR \u2192 open PR \u2192 approved \u2192 merged. Archive removes the card to Settings \u2192 History (list_archive to browse, restore_workspace to bring it back). Queued/running are activity on the card, not columns. Orchestration chats are not on the board. Filters: query, repoPath, kind, column, limit.",
388
- `- list_branches / list_prs / list_issues \u2014 pass repoPath from list_projects. Review is PRs (the surface for assigned ticket work), not the tickets: "Get me N tickets to review" \u2192 list_prs(queue=review, limit=N) then create_workspace sourceType=pr. That is open non-draft PRs labeled with this project's ready-for-review GitHub label (Settings \u2192 Projects; default eng-review) with no individual user reviewer yet. A team request (engineering-team) is not a claim \u2014 the viewer is on that team and can pick it up; claimed means an individual account is the reviewer. Bots ignored. Use Settings \u2192 Agents / Projects context (roles, teams, labels \u2014 freeform text; project adds to account) to prefer the right queues. queue=mine is review-requested:@me; queue=approved|changes uses those labels. Also: state, label, reviewer=me|unassigned|login, query, limit default 40 max 250; raise limit or tighten when truncated. list_issues (query, assignee=me|unassigned|all|user, limit default 40 max 250) lists Linear, AbleTime, or GitHub tickets \u2014 do not use it for that review-inbox ask. When they ask for tickets to work on, follow their context (assignee=me or unassigned as it says).`,
391
+ '- list_branches / list_prs / list_issues \u2014 pass repoPath from list_projects. Review is PRs (the surface for assigned ticket work), not the tickets: "Get me N tickets to review" \u2192 list_prs(queue=review, limit=N) then create_workspace sourceType=pr. That is open non-draft PRs labeled with this project\'s ready-for-review GitHub label (Settings \u2192 Projects; default eng-review) with no individual user reviewer yet. A team request (engineering-team) is not a claim \u2014 the viewer is on that team and can pick it up; claimed means an individual account is the reviewer. Bots ignored. Use Settings \u2192 Agents / Projects context (roles, teams, labels \u2014 freeform text; project adds to account) to prefer the right queues. queue=mine is review-requested:@me; queue=approved|changes uses those labels. Also: state, label, reviewer=me|unassigned|login, query, limit default 40 max 250; raise limit or tighten when truncated. list_issues (query, assignee=me|unassigned|all|user, limit default 40 max 250) lists Linear, AbleTime, or GitHub tickets. Cursor Origin has no issues; a Cursor repo uses Linear or AbleTime (unavailableReason otherwise) \u2014 do not use it for that review-inbox ask. Entire tickets are Trails (`entire trail`), not GitHub Issues. When they ask for tickets to work on, follow their context (assignee=me or unassigned as it says).',
389
392
  "- Find work: when they ask to find work, pick up tickets, or list reviews, use Settings \u2192 Agents (account) plus Settings \u2192 Projects (per-repo) context. Tickets \u2192 Sideboard list_issues / linear_* (Account Linear). Reviews \u2192 list_prs(queue=review). Do not call Claude Linear MCP or any other vendor Linear MCP \u2014 those HTTP connectors hang or flap on the first turn. If a vendor MCP is down or reconnecting, ignore it and keep going with Sideboard tools. A failed Claude connector is not a Sideboard outage \u2014 do not mention it when the Account connection works. Show the options \u2014 do not create_workspace or start unless they also asked to start (e.g. \u201Cfind me work and start it\u201D). Do not start this unprompted. To change that context, show the proposed text, ask_user (Save this context / Do not save), wait, then update_viewer_context with confirmed=true. Never write it without confirmation.",
390
393
  "- Ticket updates: list_issues / linear_search_issues / github_search_issues with updatedSince (yesterday, 2d, or ISO). One call returns new assignments, ticket edits, and new comments \u2014 do not get_issue every ticket just to check for comments. kind=created vs updated distinguishes new tickets from existing ones.",
391
394
  "- linear_* (when Linear is connected) \u2014 list_teams for team key/states; linear_list_projects for project names; get/search include the project a ticket is on; get/create/update/comment with ENG-123. Worktree agents have the same Account tools \u2014 prefer they comment, update status, and create spin-offs (parent=) on their own ticket when they were asked to do the work. When reviewing a PR or ticket, do not comment or update until the user types a next step \u2014 they should work through the feedback in chat first. Do not tell the child to ask_user after the review. Scope errors: reconnect Linear in Account settings. Prefer these over any Linear MCP the CLI may still list. Worktree agents use the Claude Linear connector only when Account Linear is not set or the Sideboard call fails, and they do not mention that connector startup failure when Sideboard works.",
@@ -399,7 +402,7 @@ var COORDINATOR_TOOL_PLAYBOOK = [
399
402
  "- get_viewer_context / update_viewer_context \u2014 read or replace Settings \u2192 Agents (account) and Settings \u2192 Projects (per-repo) context. You can update a project: pass scope=project and repoPath from list_projects (this cwd is not a project). update_viewer_context requires confirmed=true after ask_user. Never write context unprompted.",
400
403
  "- list_env / set_env / delete_env \u2014 Settings \u2192 Environment. scope=project requires repoPath from list_projects and stores the key under that project prefix (the project name, uppercased, plus _). APPLE_ID for sideboard is SIDEBOARD_APPLE_ID. scope=account is shared by every project and is not prefixed. list_env returns names only.",
401
404
  "- set_caffeinate \u2014 keep this Mac awake across turns (macOS caffeinate). Turn on for phone remote / away-from-keyboard work, overnight schedules, or when the user will be away. Turn OFF when they say they are done, wrapping up, going to sleep, or no longer need the machine awake. Closing this chat also releases it.",
402
- "- list_schedules / create_schedule / update_schedule / delete_schedule / run_schedule \u2014 local jobs that send a prompt to a chat (chatId or self) or start a new Global chat (omit chatId). One-shot `at`, interval `every` (15m/1h/6h/1d), or 5-field `cron`. Recurring jobs without chatId open a new chat each run. Worktree agents have the same tools (`chatId=self` continues that coding chat). Jobs fire only while Sideboard.app is running; sleep skips until wake. Creating or enabling a future job turns on Settings \u2192 Advanced \u2192 Caffeinate while schedules are enabled (or call set_caffeinate).",
405
+ "- list_schedules / create_schedule / update_schedule / delete_schedule / run_schedule \u2014 automations that send a prompt to a chat (chatId or self) or start a new Global chat (omit chatId). One-shot `at`, interval `every` (15m/1h/6h/1d), or 5-field `cron`. Recurring jobs without chatId open a new chat each run and archive it when that run finishes (History keeps the latest run for that automation). Worktree agents have the same tools (`chatId=self` continues that coding chat). Jobs fire only while Sideboard.app is running; sleep skips until wake. Creating or enabling a future job turns on Settings \u2192 Advanced \u2192 Caffeinate while automations are enabled (or call set_caffeinate). The desktop lists them in the sidebar after Board.",
403
406
  "Projects:",
404
407
  "- add_project / remove_project \u2014 register or unregister a git repo",
405
408
  "Workspaces and chats:",
@@ -422,11 +425,11 @@ var COORDINATOR_TOOL_PLAYBOOK = [
422
425
  "- list_run_scripts / run_dev_script / stop_dev_script / get_run_log \u2014 start/stop named run scripts and read the Run-tab terminal (tail). Pass name so desktop and mobile (or any pair) can run at once; each gets its own port. run_dev_script returns {url, port, preview} (SIDEBOARD_PORT). preview=url \u2192 tell the worktree agent to open that URL; preview=window \u2192 Electron: the native window is the app (url is renderer/HMR only). Never localhost:3000. list_run_scripts active[].url if already running.",
423
426
  "Inspect / review / PRs:",
424
427
  "- get_diff \u2014 compact diff summary",
425
- "- get_pr_checks \u2014 snapshot of a worktree thread's PR checks (null = no PR). Use this to inspect status. If the user gave a goal, the worktree agent watches with `gh pr checks --watch` \u2014 do not poll for the human.",
428
+ "- get_pr_checks \u2014 snapshot of a worktree thread's PR checks (null = no PR). Use this to inspect status. If the user gave a goal, the worktree agent watches with `gh pr checks --watch` on GitHub, `origin pr watch` on Cursor, or `entire trail watch` on Entire \u2014 do not poll for the human.",
426
429
  '- request_review \u2014 run a Review on a worktree thread. Reuses the only unused idle agent when the checkout has a single chat with no messages; otherwise opens a Review tab (attaches .claude/skills/review/SKILL.md when present, else .context/review.md copied from .sideboard/review.md / stock; sends "Review changes in this workspace."); then wait_for_turn (loop while stillRunning) / get_turn_result on the returned id. The review stays in that chat so they can read it and type next steps \u2014 do not tell the child to comment or update the PR or ticket.',
427
430
  "- ask_git \u2014 commit & push, open a draft PR, mark ready for review, resolve conflicts, or merge \u2014 same prompts as the desktop git buttons (Resolve, Create PR, \u2026). Always steers the worktree agent; then wait_for_turn (loop while stillRunning). Prefer this over paraphrasing. If the user gave a goal (Greptile 5/5, CI green), send_to_chat that goal so the worktree agent enters the watch-fix-push loop \u2014 do not tell the human to poll.",
428
431
  '- Merge (`ask_git` action=merge / send_to_chat "Merge PR.") only when the user explicitly asked to merge that PR. Do not merge because the work looks done, CI is green, or a typical flow includes it.',
429
- '- Or send_to_chat with those exact phrases: "Commit and push.", "Commit, push, and open a draft PR.", "Ready for review.", "Merge PR." Prefer ask_git resolve-conflicts (it names the actual PR base \u2014 not always main) over paraphrasing. (draft PRs: `gh pr create --draft --assignee @me -R <origin-owner/name>` using the workspace `github:` slug \u2014 never upstream). Never run git/gh from this orchestration cwd, and never merge the PR yourself.',
432
+ '- Or send_to_chat with those exact phrases: "Commit and push.", "Commit, push, and open a draft PR.", "Ready for review.", "Merge PR." Prefer ask_git resolve-conflicts (it names the actual PR base \u2014 not always main) over paraphrasing. Draft PRs follow that workspace origin: GitHub (`github:`) uses `gh pr create --draft --assignee @me -R <slug>`; Cursor (`cursor:`) uses `origin pr create --draft --push -R <slug>`; Entire (`entire:`) uses `entire trail create --title` (Trails have no draft state). Never upstream. Never run git, gh, origin, or entire from this orchestration cwd, and never merge the PR yourself.',
430
433
  "Process guides:",
431
434
  "- Long child jobs (pack, test, deploy, anything that may run more than ~30s): workers always have `/long-running` (Sideboard product skill). Tell them to detach and wait; they may `stop_job` if it hangs or is doing the wrong thing; do not ask the human to poll.",
432
435
  "- Recurring multi-item / fan-out: if the child worktree has `.claude/skills/graph-engineering/SKILL.md`, tell the worker to follow it (`/graph-engineering`). Judge first; state on disk; grow the rulebook; do not patch three threads.",
@@ -1076,6 +1079,13 @@ async function archiveRemovedWorkspaceChats(threads, archive) {
1076
1079
  }
1077
1080
 
1078
1081
  export {
1082
+ isImageFilePath,
1083
+ attachmentFromAbsolutePath,
1084
+ stageAbsolutePathsAsAttachments,
1085
+ stageBuffersAsAttachments,
1086
+ attachmentsFromBuffers,
1087
+ persistPendingFileAttachments,
1088
+ attachmentsFromWorktreePaths,
1079
1089
  CLOUD_ORCHESTRATOR_GOAL,
1080
1090
  SIDEBOARD_FORCE_STOP,
1081
1091
  CLOUD_COORDINATOR_BUSY_REPLY,
@@ -1084,13 +1094,6 @@ export {
1084
1094
  CLOUD_COORDINATOR_INPUT_REQUIRED_REPLY,
1085
1095
  CLOUD_COORDINATOR_CANCELED_REPLY,
1086
1096
  parseForceStopMessage,
1087
- isImageFilePath,
1088
- attachmentFromAbsolutePath,
1089
- stageAbsolutePathsAsAttachments,
1090
- stageBuffersAsAttachments,
1091
- attachmentsFromBuffers,
1092
- persistPendingFileAttachments,
1093
- attachmentsFromWorktreePaths,
1094
1097
  sameWorkspacePath,
1095
1098
  isRemovedWorkspace,
1096
1099
  archivesWithRemovedWorkspace,
@@ -6,14 +6,14 @@ import {
6
6
  normalizeAbleTimeCredential,
7
7
  normalizeAbleTimeHost,
8
8
  rewriteAbleTimeError
9
- } from "./chunk-ZM43NTJJ.js";
9
+ } from "./chunk-5OQONGHO.js";
10
10
  import {
11
11
  httpFetch
12
12
  } from "./chunk-2GPQZZLY.js";
13
13
  import {
14
14
  getAbleTimeAccessToken,
15
15
  getAbleTimeHost
16
- } from "./chunk-GCHSJCCX.js";
16
+ } from "./chunk-IFU4W4C4.js";
17
17
 
18
18
  // src/integrations/abletime-rest.ts
19
19
  var ABLETIME_REST_PREFIX = "/api/public/v2";
@@ -661,7 +661,9 @@ function planHistoryRetention(archived, thresholds = {}) {
661
661
  if (archivedUpdatedMs(thread) < cutoff) expiredIds.add(thread.id);
662
662
  }
663
663
  }
664
- const remaining = oldestFirst.filter((t) => !expiredIds.has(t.id));
664
+ const remaining = oldestFirst.filter(
665
+ (t) => !expiredIds.has(t.id) && !t.ephemeralAutomationId?.trim()
666
+ );
665
667
  const overflow = remaining.length > maxCount ? remaining.slice(0, remaining.length - maxCount) : [];
666
668
  const stripIds = [];
667
669
  const purgeIds = [...expiredIds];
@@ -967,6 +967,12 @@ function workspaceNameLabel(thread) {
967
967
  if (repo && worktreeNameFromPath(repo).toLowerCase() === dir.toLowerCase()) return null;
968
968
  return agentNicknameFromWorktreePath(path) ?? dir;
969
969
  }
970
+ function workspaceRowLabel(threads) {
971
+ if (threads.length === 0) return { label: "Worktree" };
972
+ const label = worktreeAnchorLabel(threads).title;
973
+ const named = workspaceNameLabel(threads[0]);
974
+ return named && named !== label ? { label, workspace: named } : { label };
975
+ }
970
976
  function worktreeIdentityTitles(thread, parentTitle) {
971
977
  const out = [];
972
978
  const push = (value) => {
@@ -1095,6 +1101,7 @@ function normalizeThread(raw) {
1095
1101
  quotaContinuedFromId: raw.quotaContinuedFromId ?? null,
1096
1102
  accountId: raw.accountId === null ? null : typeof raw.accountId === "string" && raw.accountId.trim() ? raw.accountId.trim() : void 0,
1097
1103
  archivedAt: typeof raw.archivedAt === "string" && raw.archivedAt.trim() ? raw.archivedAt.trim() : void 0,
1104
+ ephemeralAutomationId: typeof raw.ephemeralAutomationId === "string" && raw.ephemeralAutomationId.trim() ? raw.ephemeralAutomationId.trim() : void 0,
1098
1105
  compactedMessages: Array.isArray(raw.compactedMessages) ? raw.compactedMessages : void 0
1099
1106
  };
1100
1107
  }
@@ -1283,6 +1290,7 @@ function updateThread(id, patch) {
1283
1290
  } else {
1284
1291
  delete next.archivedAt;
1285
1292
  }
1293
+ if (!next.ephemeralAutomationId?.trim()) delete next.ephemeralAutomationId;
1286
1294
  writeThread(next);
1287
1295
  return next;
1288
1296
  }
@@ -1326,6 +1334,7 @@ export {
1326
1334
  worktreeAnchorLabel,
1327
1335
  agentNicknameFromWorktreePath,
1328
1336
  workspaceNameLabel,
1337
+ workspaceRowLabel,
1329
1338
  worktreeIdentityTitles,
1330
1339
  isWorktreeIdentityTitle,
1331
1340
  resolveThreadEffort,
@@ -3,22 +3,22 @@ import {
3
3
  brightsyMcpServerName,
4
4
  ensureCliTeamTracked,
5
5
  ensureConnectedBrightsyTeamTokens
6
- } from "./chunk-HH3VVTEC.js";
6
+ } from "./chunk-S5CJUIPY.js";
7
7
  import {
8
8
  looksLikeConversationSummary,
9
9
  looksLikeSkillBody,
10
10
  skillCommandFromBody,
11
11
  withEventParentId
12
- } from "./chunk-7Q327QF2.js";
12
+ } from "./chunk-QIC2JXHW.js";
13
13
  import {
14
14
  isOrchestratorThread
15
- } from "./chunk-YALFZKSC.js";
15
+ } from "./chunk-H6GXYV5Q.js";
16
16
  import {
17
17
  codexUnattendedGitConfigArgs,
18
18
  mergeAgentGitAuthEnv,
19
19
  resolveAgentGitAuthEnv,
20
20
  resolveCodexGitWritableRoots
21
- } from "./chunk-TUJFCJJU.js";
21
+ } from "./chunk-UWJUARFA.js";
22
22
  import {
23
23
  loadBrightsyConfig
24
24
  } from "./chunk-RSA47QYR.js";
@@ -45,7 +45,7 @@ import {
45
45
  packagedMcpStdioPath,
46
46
  parseCursorRunnerLine,
47
47
  resolveNodeLaunch
48
- } from "./chunk-Y3Y7SZBZ.js";
48
+ } from "./chunk-ZHGMRBSC.js";
49
49
  import {
50
50
  extractJsonErrorMessage,
51
51
  formatUnknownDetail,
@@ -55,7 +55,7 @@ import {
55
55
  import {
56
56
  githubAgentAuthReady,
57
57
  run
58
- } from "./chunk-QVN2WOKJ.js";
58
+ } from "./chunk-2TUE6JKQ.js";
59
59
  import {
60
60
  AGENT_RPC_CLAUDE_SDK_SERVER,
61
61
  AGENT_RPC_CWD_ENV,
@@ -76,7 +76,7 @@ import {
76
76
  loadAppSettings,
77
77
  resolveAgentExecutable,
78
78
  resolveClaudeExecutable
79
- } from "./chunk-E52SQENB.js";
79
+ } from "./chunk-FZKAAAEB.js";
80
80
  import {
81
81
  isElectronLikeCommand,
82
82
  unwrapStrippedElectronLaunch
@@ -2609,7 +2609,7 @@ var claudeAdapter = {
2609
2609
  );
2610
2610
  }
2611
2611
  const mode = permissionMode(thread);
2612
- const { isOrchestratorThread: isOrchestratorThread2 } = await import("./global-workspace-FTNJEML3.js");
2612
+ const { isOrchestratorThread: isOrchestratorThread2 } = await import("./global-workspace-UPMXDQM7.js");
2613
2613
  const isOrchestrator = isOrchestratorThread2(thread);
2614
2614
  const rpc = worktreeAgentRpc(isOrchestrator);
2615
2615
  const injectedServers = await buildInjectedMcpServers({