@sideboard-ai/core 0.1.229 → 0.1.231

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (31) hide show
  1. package/dist/{agents-B7G4BQTS.js → agents-ENAQHQRZ.js} +4 -4
  2. package/dist/{agents-ZKP7QNXA.js → agents-TCTEAK6M.js} +4 -4
  3. package/dist/{chunk-F3GT6DQW.js → chunk-4CZ25DO2.js} +1 -1
  4. package/dist/{chunk-3IMSQNTS.js → chunk-4VGCG2HV.js} +17 -0
  5. package/dist/{chunk-T7Y5ULHM.js → chunk-6L25K7BE.js} +3 -3
  6. package/dist/{chunk-LULHFLPU.js → chunk-FA4CPYCY.js} +3 -3
  7. package/dist/{chunk-7YKXBFQE.js → chunk-HZFLKVGC.js} +2 -2
  8. package/dist/{chunk-UHT6OS7V.js → chunk-HZLZ34FK.js} +145 -15
  9. package/dist/{chunk-6HKGCUDN.js → chunk-JJRRLCCS.js} +143 -14
  10. package/dist/{chunk-AMMRFFB7.js → chunk-N5TX66CD.js} +1 -1
  11. package/dist/{chunk-N7UXGM3Y.js → chunk-UNTOZA3C.js} +2 -2
  12. package/dist/{chunk-HY2GFZ5S.js → chunk-XJETIO4K.js} +17 -0
  13. package/dist/{coordinator-prompt-DZMMCDRW.js → coordinator-prompt-DFXYTM6D.js} +3 -3
  14. package/dist/{coordinator-prompt-RL3GKIAQ.js → coordinator-prompt-YKLXQTWH.js} +3 -3
  15. package/dist/{global-workspace-QW4OXCLJ.js → global-workspace-4SPANNJT.js} +3 -3
  16. package/dist/{global-workspace-G3QEVRGZ.js → global-workspace-EYZKYHAO.js} +3 -3
  17. package/dist/index.cjs +174 -17
  18. package/dist/index.d.cts +53 -5
  19. package/dist/index.d.ts +53 -5
  20. package/dist/index.js +10 -6
  21. package/dist/mcp/run-stdio.cjs +159 -7
  22. package/dist/mcp/run-stdio.js +6 -6
  23. package/dist/{orchestrator-GKAHLGXT.js → orchestrator-HMJPNUN5.js} +7 -5
  24. package/dist/{orchestrator-X4VFA5WW.js → orchestrator-ZT3SJVKF.js} +7 -5
  25. package/dist/{thread-store-KDPPXJJ3.js → thread-store-FBK5SZ5P.js} +1 -1
  26. package/dist/{thread-store-N6WQIWZ4.js → thread-store-IKJD4EOK.js} +1 -1
  27. package/dist/{workspaces-77C5XQEY.js → workspaces-73Y7IJY2.js} +3 -3
  28. package/dist/{workspaces-WXRPLT2N.js → workspaces-FQCSCTNH.js} +3 -3
  29. package/dist/{worktree-P67WAJKH.js → worktree-36VEFUJN.js} +2 -2
  30. package/dist/{worktree-L6FJXFUC.js → worktree-DOPRKG7K.js} +2 -2
  31. package/package.json +1 -1
package/dist/index.cjs CHANGED
@@ -30,6 +30,16 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
30
30
  ));
31
31
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
32
32
 
33
+ // src/types/thread.ts
34
+ function isUnclaimedRunScriptRequest(req) {
35
+ return Boolean(req && !req.claimedAt && !req.fulfilledAt && !req.error);
36
+ }
37
+ var init_thread = __esm({
38
+ "src/types/thread.ts"() {
39
+ "use strict";
40
+ }
41
+ });
42
+
33
43
  // src/types/thinking-effort.ts
34
44
  function normalizeThinkingEffort(value) {
35
45
  if (typeof value !== "string") return null;
@@ -3137,6 +3147,22 @@ function resolveThreadEffort(raw) {
3137
3147
  if (raw.fast) return "low";
3138
3148
  return "high";
3139
3149
  }
3150
+ function normalizeRunScriptRequest(raw) {
3151
+ if (!raw || typeof raw !== "object") return void 0;
3152
+ const req = raw;
3153
+ if (req.op !== "start" && req.op !== "stop") return void 0;
3154
+ if (typeof req.requestId !== "string" || !req.requestId.trim()) return void 0;
3155
+ if (typeof req.requestedAt !== "string" || !req.requestedAt.trim()) return void 0;
3156
+ return {
3157
+ op: req.op,
3158
+ scriptName: req.scriptName ?? null,
3159
+ requestId: req.requestId,
3160
+ requestedAt: req.requestedAt,
3161
+ claimedAt: req.claimedAt ?? null,
3162
+ fulfilledAt: req.fulfilledAt ?? null,
3163
+ error: req.error ?? null
3164
+ };
3165
+ }
3140
3166
  function normalizeThread(raw) {
3141
3167
  return {
3142
3168
  ...raw,
@@ -3160,6 +3186,7 @@ function normalizeThread(raw) {
3160
3186
  stackLayer: raw.stackLayer ?? null,
3161
3187
  userSetTitle: Boolean(raw.userSetTitle),
3162
3188
  activeRuns: Array.isArray(raw.activeRuns) ? raw.activeRuns : [],
3189
+ runScriptRequest: normalizeRunScriptRequest(raw.runScriptRequest),
3163
3190
  quotaResumeAt: raw.quotaResumeAt ?? null,
3164
3191
  quotaContinuedFromId: raw.quotaContinuedFromId ?? null,
3165
3192
  archivedAt: typeof raw.archivedAt === "string" && raw.archivedAt.trim() ? raw.archivedAt.trim() : void 0
@@ -23334,6 +23361,7 @@ __export(orchestrator_exports, {
23334
23361
  LIGHT_RECONCILE_THROTTLE_MS: () => LIGHT_RECONCILE_THROTTLE_MS,
23335
23362
  LIVE_TURN_SPAWN_GRACE_MS: () => LIVE_TURN_SPAWN_GRACE_MS,
23336
23363
  Orchestrator: () => Orchestrator,
23364
+ RUN_SCRIPT_DESKTOP_ADOPT_MS: () => RUN_SCRIPT_DESKTOP_ADOPT_MS,
23337
23365
  getOrchestrator: () => getOrchestrator,
23338
23366
  isPidAlive: () => isPidAlive,
23339
23367
  resolveOrchChildFollowUp: () => resolveOrchChildFollowUp,
@@ -23445,12 +23473,13 @@ async function startOrchestration(opts) {
23445
23473
  }
23446
23474
  return updated;
23447
23475
  }
23448
- var import_node_events, import_node_fs56, LIVE_TURN_SPAWN_GRACE_MS, STALE_AGENT_PID_WAIT_MS, LIGHT_RECONCILE_THROTTLE_MS, Orchestrator, singleton;
23476
+ var import_node_events, import_node_crypto12, import_node_fs56, LIVE_TURN_SPAWN_GRACE_MS, RUN_SCRIPT_DESKTOP_ADOPT_MS, STALE_AGENT_PID_WAIT_MS, LIGHT_RECONCILE_THROTTLE_MS, Orchestrator, singleton;
23449
23477
  var init_orchestrator = __esm({
23450
23478
  "src/orchestrator/orchestrator.ts"() {
23451
23479
  "use strict";
23452
23480
  import_node_events = require("events");
23453
23481
  init_outbound_watch();
23482
+ import_node_crypto12 = require("crypto");
23454
23483
  import_node_fs56 = require("fs");
23455
23484
  init_error_detail();
23456
23485
  init_run();
@@ -23468,6 +23497,7 @@ var init_orchestrator = __esm({
23468
23497
  init_history_cleanup();
23469
23498
  init_apply_into_main();
23470
23499
  init_clone_repo();
23500
+ init_thread();
23471
23501
  init_message_parts();
23472
23502
  init_usage();
23473
23503
  init_thread_store();
@@ -23513,6 +23543,7 @@ var init_orchestrator = __esm({
23513
23543
  init_schedule_runner();
23514
23544
  init_coordinator_prompt();
23515
23545
  LIVE_TURN_SPAWN_GRACE_MS = 15e3;
23546
+ RUN_SCRIPT_DESKTOP_ADOPT_MS = 2e4;
23516
23547
  STALE_AGENT_PID_WAIT_MS = 2500;
23517
23548
  LIGHT_RECONCILE_THROTTLE_MS = 1e4;
23518
23549
  Orchestrator = class {
@@ -23551,6 +23582,11 @@ var init_orchestrator = __esm({
23551
23582
  jobContinueNudged = /* @__PURE__ */ new Set();
23552
23583
  /** In-flight startDev per worktree run key — agent MCP + UI Start must not double-spawn. */
23553
23584
  startingDev = /* @__PURE__ */ new Map();
23585
+ /**
23586
+ * MCP/CLI poll budget while Electron main adopts `runScriptRequest`.
23587
+ * Tests shorten this so a missing desktop does not wait 20s.
23588
+ */
23589
+ runScriptAdoptTimeoutMs = RUN_SCRIPT_DESKTOP_ADOPT_MS;
23554
23590
  maxConcurrent;
23555
23591
  runningCount = 0;
23556
23592
  constructor(opts) {
@@ -23720,6 +23756,58 @@ var init_orchestrator = __esm({
23720
23756
  this.armDrain(thread.id);
23721
23757
  }
23722
23758
  }
23759
+ this.adoptPersistedRunScripts();
23760
+ }
23761
+ /**
23762
+ * Adopt run-script start/stop persisted by MCP/CLI while this process owns
23763
+ * live children (desktop host). Spawning in stdio leaves the Run tab on
23764
+ * "Starting…" with no logs — `run_output` never reaches the renderer.
23765
+ */
23766
+ adoptPersistedRunScripts() {
23767
+ if (!this.shouldOwnRunScripts()) return;
23768
+ for (const thread of listThreads()) {
23769
+ if (thread.status === "archived") continue;
23770
+ const req = thread.runScriptRequest;
23771
+ if (!isUnclaimedRunScriptRequest(req) || !req) continue;
23772
+ const claimedAt = (/* @__PURE__ */ new Date()).toISOString();
23773
+ const claimed = { ...req, claimedAt };
23774
+ updateThread(thread.id, { runScriptRequest: claimed });
23775
+ void this.applyRunScriptRequest(thread.id, claimed);
23776
+ }
23777
+ }
23778
+ async applyRunScriptRequest(threadId, req) {
23779
+ try {
23780
+ if (req.op === "start") {
23781
+ await this.startDev(threadId, req.scriptName ?? void 0);
23782
+ } else {
23783
+ await this.stopDev(threadId, req.scriptName ?? void 0);
23784
+ }
23785
+ const latest = readThread(threadId);
23786
+ const current = latest?.runScriptRequest;
23787
+ if (current?.requestId === req.requestId && !current.error) {
23788
+ updateThread(threadId, {
23789
+ runScriptRequest: {
23790
+ ...current,
23791
+ fulfilledAt: (/* @__PURE__ */ new Date()).toISOString()
23792
+ }
23793
+ });
23794
+ }
23795
+ } catch (err) {
23796
+ const message = err instanceof Error ? err.message : String(err);
23797
+ const latest = readThread(threadId);
23798
+ const current = latest?.runScriptRequest;
23799
+ if (!current || current.requestId !== req.requestId) return;
23800
+ updateThread(threadId, {
23801
+ runScriptRequest: { ...current, error: message }
23802
+ });
23803
+ }
23804
+ }
23805
+ /**
23806
+ * Same rule as agent-queue drain: MCP stdio must not own Electron children
23807
+ * while Sideboard.app is alive.
23808
+ */
23809
+ shouldOwnRunScripts() {
23810
+ return thisProcessShouldDrainAgentQueues();
23723
23811
  }
23724
23812
  /**
23725
23813
  * Mid-session: a worktree can sit at `running` after the agent process dies
@@ -24768,6 +24856,13 @@ var init_orchestrator = __esm({
24768
24856
  "No run script found for this worktree. Add [scripts.run.*] in the worktree\u2019s .sideboard/settings.toml or .conductor/settings.toml (or settings.local.toml on the main repo)."
24769
24857
  );
24770
24858
  }
24859
+ if (!this.shouldOwnRunScripts()) {
24860
+ const result = await this.requestDesktopRunScript(thread, "start", resolvedName);
24861
+ if (!result) {
24862
+ throw new Error("Desktop did not return a run script port.");
24863
+ }
24864
+ return result;
24865
+ }
24771
24866
  const runKey = worktreeRunProcessKey(thread.worktreePath, resolvedName);
24772
24867
  const inFlight = this.startingDev.get(runKey);
24773
24868
  if (inFlight) return inFlight;
@@ -24890,8 +24985,65 @@ var init_orchestrator = __esm({
24890
24985
  });
24891
24986
  return { port: handle.port, scriptName: resolvedName, ports: handle.ports };
24892
24987
  }
24893
- stopDev(threadRef, scriptName) {
24988
+ /**
24989
+ * Persist a run-script intent for the desktop host (MCP/CLI while the board
24990
+ * is alive). Polls until Electron main adopts and fulfills it.
24991
+ */
24992
+ async requestDesktopRunScript(thread, op, scriptName) {
24993
+ const latest = readThread(thread.id) ?? thread;
24994
+ const pending = latest.runScriptRequest;
24995
+ const claimedAt = pending?.claimedAt;
24996
+ const staleClaim = typeof claimedAt === "string" && Date.now() - Date.parse(claimedAt) > this.runScriptAdoptTimeoutMs;
24997
+ const sameIntent = pending && pending.op === op && (pending.scriptName ?? null) === (scriptName ?? null) && !pending.error && !pending.fulfilledAt && !staleClaim;
24998
+ const request = sameIntent ? pending : {
24999
+ op,
25000
+ scriptName: scriptName ?? null,
25001
+ requestId: (0, import_node_crypto12.randomUUID)(),
25002
+ requestedAt: (/* @__PURE__ */ new Date()).toISOString()
25003
+ };
25004
+ if (!sameIntent) {
25005
+ updateThread(thread.id, { runScriptRequest: request });
25006
+ }
25007
+ return this.waitForDesktopRunScript(thread.id, request, op, scriptName);
25008
+ }
25009
+ async waitForDesktopRunScript(threadId, request, op, scriptName) {
25010
+ const deadline = Date.now() + this.runScriptAdoptTimeoutMs;
25011
+ while (Date.now() < deadline) {
25012
+ const latest = readThread(threadId);
25013
+ if (!latest) {
25014
+ throw new Error("Thread disappeared while waiting for the desktop run script.");
25015
+ }
25016
+ const req = latest.runScriptRequest;
25017
+ if (req?.requestId === request.requestId && req.error) {
25018
+ throw new Error(req.error);
25019
+ }
25020
+ const shared = mergeWorktreeActiveRuns(threadsSharingWorktree(latest.worktreePath));
25021
+ const run2 = scriptName ? shared.activeRuns.find((r) => r.scriptName === scriptName) : shared.activeRuns[0];
25022
+ const fulfilled = req?.requestId === request.requestId && Boolean(req.fulfilledAt);
25023
+ const requestGone = !req || req.requestId !== request.requestId;
25024
+ if (op === "start") {
25025
+ if (run2 && (fulfilled || requestGone || run2.startedAt >= request.requestedAt)) {
25026
+ return { port: run2.port, scriptName: run2.scriptName, ports: run2.ports };
25027
+ }
25028
+ if (fulfilled && !run2) {
25029
+ throw new Error("Desktop reported the run script started, but it is not active.");
25030
+ }
25031
+ } else {
25032
+ const gone = scriptName ? !run2 : shared.activeRuns.length === 0;
25033
+ if (fulfilled || gone) return null;
25034
+ }
25035
+ await new Promise((r) => setTimeout(r, 40));
25036
+ }
25037
+ throw new Error(
25038
+ op === "start" ? "Desktop did not start the run script in time. Is Sideboard.app running this worktree?" : "Desktop did not stop the run script in time."
25039
+ );
25040
+ }
25041
+ async stopDev(threadRef, scriptName) {
24894
25042
  const thread = this.requireThread(threadRef);
25043
+ if (!this.shouldOwnRunScripts()) {
25044
+ await this.requestDesktopRunScript(thread, "stop", scriptName);
25045
+ return;
25046
+ }
24895
25047
  const siblings = threadsSharingWorktree(thread.worktreePath);
24896
25048
  const shared = mergeWorktreeActiveRuns(siblings);
24897
25049
  if (scriptName) {
@@ -26099,6 +26251,7 @@ __export(index_exports, {
26099
26251
  REVIEW_REQUEST_TEMPLATE: () => REVIEW_REQUEST_TEMPLATE,
26100
26252
  REVIEW_SKILL_NAME: () => REVIEW_SKILL_NAME,
26101
26253
  REVIEW_SKILL_PATH: () => REVIEW_SKILL_PATH,
26254
+ RUN_SCRIPT_DESKTOP_ADOPT_MS: () => RUN_SCRIPT_DESKTOP_ADOPT_MS,
26102
26255
  SEED_FULL_TOOL_MESSAGES: () => SEED_FULL_TOOL_MESSAGES,
26103
26256
  SEED_MAX_CHARS: () => SEED_MAX_CHARS,
26104
26257
  SESSION_RESET_OCCUPANCY_TOKENS: () => SESSION_RESET_OCCUPANCY_TOKENS,
@@ -26528,6 +26681,7 @@ __export(index_exports, {
26528
26681
  isThisProcessDesktopHost: () => isThisProcessDesktopHost,
26529
26682
  isThreadCaffeinated: () => isThreadCaffeinated,
26530
26683
  isThreadRecordFile: () => isThreadRecordFile,
26684
+ isUnclaimedRunScriptRequest: () => isUnclaimedRunScriptRequest,
26531
26685
  isUsageOnLimit: () => isUsageOnLimit,
26532
26686
  isWorkspaceScratchPath: () => isWorkspaceScratchPath,
26533
26687
  issueAttachmentForAbleTimeTask: () => issueAttachmentForAbleTimeTask,
@@ -26898,6 +27052,7 @@ __export(index_exports, {
26898
27052
  writeWorktreeFile: () => writeWorktreeFile
26899
27053
  });
26900
27054
  module.exports = __toCommonJS(index_exports);
27055
+ init_thread();
26901
27056
  init_thinking_effort();
26902
27057
  init_paths();
26903
27058
  init_app_settings();
@@ -27204,7 +27359,7 @@ function issueActivityKind(issue, sinceIso) {
27204
27359
  }
27205
27360
 
27206
27361
  // src/integrations/linear-oauth.ts
27207
- var import_node_crypto12 = require("crypto");
27362
+ var import_node_crypto13 = require("crypto");
27208
27363
  var import_node_http2 = require("http");
27209
27364
  init_app_settings();
27210
27365
  init_fetch();
@@ -27236,8 +27391,8 @@ function linearOAuthCredentials() {
27236
27391
  return { clientId, clientSecret };
27237
27392
  }
27238
27393
  function createLinearPkce() {
27239
- const verifier = (0, import_node_crypto12.randomBytes)(32).toString("base64url");
27240
- const challenge = (0, import_node_crypto12.createHash)("sha256").update(verifier).digest("base64url");
27394
+ const verifier = (0, import_node_crypto13.randomBytes)(32).toString("base64url");
27395
+ const challenge = (0, import_node_crypto13.createHash)("sha256").update(verifier).digest("base64url");
27241
27396
  return { verifier, challenge };
27242
27397
  }
27243
27398
  function linearOAuthAuthorizeUrl(clientId, state, codeChallenge) {
@@ -27368,7 +27523,7 @@ async function startLinearOAuth(opts) {
27368
27523
  throw new LinearOAuthCancelledError();
27369
27524
  }
27370
27525
  const { clientId, clientSecret } = linearOAuthCredentials();
27371
- const state = (0, import_node_crypto12.randomBytes)(16).toString("hex");
27526
+ const state = (0, import_node_crypto13.randomBytes)(16).toString("hex");
27372
27527
  const pkce = createLinearPkce();
27373
27528
  const authorizeUrl = linearOAuthAuthorizeUrl(clientId, state, pkce.challenge);
27374
27529
  const timeoutMs = opts?.timeoutMs ?? 5 * 6e4;
@@ -29223,7 +29378,7 @@ init_stage_files();
29223
29378
  init_consume_attachments();
29224
29379
 
29225
29380
  // src/composer/pasted-text.ts
29226
- var import_node_crypto13 = require("crypto");
29381
+ var import_node_crypto14 = require("crypto");
29227
29382
  var PASTE_ATTACH_MIN_CHARS = 1200;
29228
29383
  var PASTE_ATTACH_MIN_LINES = 15;
29229
29384
  var PASTED_NAME_RE = /^Pasted text #(\d+)\.txt$/i;
@@ -29250,7 +29405,7 @@ function nextPastedTextName(existing) {
29250
29405
  }
29251
29406
  function buildPastedTextAttachment(text7, opts) {
29252
29407
  return {
29253
- id: opts?.id ?? (0, import_node_crypto13.randomUUID)(),
29408
+ id: opts?.id ?? (0, import_node_crypto14.randomUUID)(),
29254
29409
  name: opts?.name ?? "Pasted text #1.txt",
29255
29410
  kind: "file",
29256
29411
  path: opts?.path,
@@ -29406,7 +29561,7 @@ init_history_cleanup();
29406
29561
  var import_mcp = require("@modelcontextprotocol/sdk/server/mcp.js");
29407
29562
  var import_stdio = require("@modelcontextprotocol/sdk/server/stdio.js");
29408
29563
  var import_zod9 = require("zod");
29409
- var import_node_crypto15 = require("crypto");
29564
+ var import_node_crypto16 = require("crypto");
29410
29565
  var import_node_path56 = require("path");
29411
29566
  init_orchestrator();
29412
29567
  init_worktree();
@@ -31150,7 +31305,7 @@ init_worktree();
31150
31305
  init_paths();
31151
31306
 
31152
31307
  // src/board/board-pins.ts
31153
- var import_node_crypto14 = require("crypto");
31308
+ var import_node_crypto15 = require("crypto");
31154
31309
  var import_node_fs57 = require("fs");
31155
31310
  var import_node_path54 = require("path");
31156
31311
  init_paths();
@@ -31182,7 +31337,7 @@ function addBoardPin(input) {
31182
31337
  const ref = input.ref.trim();
31183
31338
  if (!ref) throw new Error("Board item needs a ref");
31184
31339
  const pin = {
31185
- id: (0, import_node_crypto14.randomUUID)(),
31340
+ id: (0, import_node_crypto15.randomUUID)(),
31186
31341
  kind: input.kind,
31187
31342
  ref,
31188
31343
  repoPath: input.repoPath.trim(),
@@ -31948,7 +32103,7 @@ async function startMcpServer() {
31948
32103
  async ({ ref, name }) => {
31949
32104
  try {
31950
32105
  const threadRef = resolveRunScriptThreadRef(ref);
31951
- orch.stopDev(threadRef, name);
32106
+ await orch.stopDev(threadRef, name);
31952
32107
  return mcpJson({ ok: true, ref: threadRef, stopped: name ?? "all" });
31953
32108
  } catch (err) {
31954
32109
  const message = err instanceof Error ? err.message : String(err);
@@ -32076,7 +32231,7 @@ async function startMcpServer() {
32076
32231
  const ident = issue?.identifier ?? ref.trim();
32077
32232
  const attachments = issue ? [
32078
32233
  {
32079
- id: (0, import_node_crypto15.randomUUID)(),
32234
+ id: (0, import_node_crypto16.randomUUID)(),
32080
32235
  name: issue.identifier,
32081
32236
  kind: "issue",
32082
32237
  content: [
@@ -33005,7 +33160,7 @@ init_orch_mcp_isolation();
33005
33160
  init_workspaces2();
33006
33161
 
33007
33162
  // src/slack/oauth.ts
33008
- var import_node_crypto16 = require("crypto");
33163
+ var import_node_crypto17 = require("crypto");
33009
33164
  init_app_settings();
33010
33165
  init_workspaces2();
33011
33166
 
@@ -33229,7 +33384,7 @@ async function startSlackOAuth(opts) {
33229
33384
  throw new SlackOAuthCancelledError();
33230
33385
  }
33231
33386
  const { clientId } = slackOAuthCredentials();
33232
- const state = (0, import_node_crypto16.randomBytes)(16).toString("hex");
33387
+ const state = (0, import_node_crypto17.randomBytes)(16).toString("hex");
33233
33388
  const authorizeUrl = slackOAuthAuthorizeUrl(clientId, state);
33234
33389
  const timeoutMs = opts?.timeoutMs ?? 5 * 6e4;
33235
33390
  const pollIntervalMs = opts?.pollIntervalMs ?? 400;
@@ -33511,7 +33666,7 @@ init_workspaces2();
33511
33666
  init_reply_target();
33512
33667
 
33513
33668
  // src/slack/relay-protocol.ts
33514
- var import_node_crypto17 = require("crypto");
33669
+ var import_node_crypto18 = require("crypto");
33515
33670
  var SLACK_RELAY_PING_INTERVAL_MS = 2e4;
33516
33671
  var SLACK_RELAY_PONG_TIMEOUT_MS = 15e3;
33517
33672
  function slackRelaySessionKey(teamId, userId, deviceId) {
@@ -33521,7 +33676,7 @@ function slackRelayUserKey(teamId, userId) {
33521
33676
  return `${teamId.trim()}:${userId.trim()}`;
33522
33677
  }
33523
33678
  function newSlackRelayEventId() {
33524
- return (0, import_node_crypto17.randomBytes)(12).toString("hex");
33679
+ return (0, import_node_crypto18.randomBytes)(12).toString("hex");
33525
33680
  }
33526
33681
  function parseSlackRelayClientMessage(raw) {
33527
33682
  try {
@@ -35050,6 +35205,7 @@ init_outbound_watch();
35050
35205
  REVIEW_REQUEST_TEMPLATE,
35051
35206
  REVIEW_SKILL_NAME,
35052
35207
  REVIEW_SKILL_PATH,
35208
+ RUN_SCRIPT_DESKTOP_ADOPT_MS,
35053
35209
  SEED_FULL_TOOL_MESSAGES,
35054
35210
  SEED_MAX_CHARS,
35055
35211
  SESSION_RESET_OCCUPANCY_TOKENS,
@@ -35479,6 +35635,7 @@ init_outbound_watch();
35479
35635
  isThisProcessDesktopHost,
35480
35636
  isThreadCaffeinated,
35481
35637
  isThreadRecordFile,
35638
+ isUnclaimedRunScriptRequest,
35482
35639
  isUsageOnLimit,
35483
35640
  isWorkspaceScratchPath,
35484
35641
  issueAttachmentForAbleTimeTask,
package/dist/index.d.cts CHANGED
@@ -144,6 +144,12 @@ interface Thread {
144
144
  devPort: number | null;
145
145
  /** Named run scripts currently tracked for this thread. */
146
146
  activeRuns?: ActiveRun[];
147
+ /**
148
+ * Cross-process run-script intent. Worktree MCP / CLI write this when the
149
+ * desktop host is alive instead of spawning; Electron main adopts and calls
150
+ * `startDev` / `stopDev` so Run-tab logs use renderer IPC.
151
+ */
152
+ runScriptRequest?: RunScriptRequest | null;
147
153
  prUrl: string | null;
148
154
  /** Cached PR title for Conductor-style sidebar labels (PR title > branch). */
149
155
  prTitle: string | null;
@@ -651,6 +657,22 @@ interface ActiveRun {
651
657
  ports: number[];
652
658
  startedAt: string;
653
659
  }
660
+ /**
661
+ * MCP/CLI → desktop run-script request (same path as `send_to_thread` queues).
662
+ * Desktop claims, runs `startDev`/`stopDev`, then fulfills or sets `error`.
663
+ */
664
+ interface RunScriptRequest {
665
+ op: 'start' | 'stop';
666
+ /** Omit/null = default script for start, every script for stop. */
667
+ scriptName?: string | null;
668
+ requestId: string;
669
+ requestedAt: string;
670
+ claimedAt?: string | null;
671
+ fulfilledAt?: string | null;
672
+ error?: string | null;
673
+ }
674
+ /** True when desktop should `startDev`/`stopDev` this persisted request. */
675
+ declare function isUnclaimedRunScriptRequest(req: RunScriptRequest | null | undefined): boolean;
654
676
  /** Live snapshot for the global orchestrator board. */
655
677
  interface OrchestratorRuntime {
656
678
  running: number;
@@ -1678,9 +1700,10 @@ declare function releaseDesktopHost(pid?: number): void;
1678
1700
  declare function isDesktopHostAlive(): boolean;
1679
1701
  declare function isThisProcessDesktopHost(): boolean;
1680
1702
  /**
1681
- * MCP/CLI must not spawn worktree turns when the board is running — those
1682
- * children have no renderer IPC, so the chat stays blank, and Stop/Send now
1683
- * in the desktop cannot see `activeTurns`. Desktop adopts persisted queues.
1703
+ * MCP/CLI must not spawn worktree turns or run scripts when the board is
1704
+ * running — those children have no renderer IPC, so the chat/Run tab stays
1705
+ * blank, and Stop cannot see in-memory handles. Desktop adopts persisted
1706
+ * queues and `runScriptRequest`.
1684
1707
  */
1685
1708
  declare function thisProcessShouldDrainAgentQueues(): boolean;
1686
1709
 
@@ -4743,6 +4766,8 @@ declare function applyThreadIntoMain(thread: Pick<Thread, 'repoPath' | 'worktree
4743
4766
 
4744
4767
  /** Status may be `running` for this long before `agentPid` is written. */
4745
4768
  declare const LIVE_TURN_SPAWN_GRACE_MS = 15000;
4769
+ /** MCP/CLI wait for desktop to adopt a run-script request (under the ~60s MCP kill). */
4770
+ declare const RUN_SCRIPT_DESKTOP_ADOPT_MS = 20000;
4746
4771
  /** True when `kill(pid, 0)` succeeds (process exists and is signalable). */
4747
4772
  declare function isPidAlive(pid: number): boolean;
4748
4773
  /** Wait until pid exits, or `timeoutMs` elapses. */
@@ -4798,6 +4823,11 @@ declare class Orchestrator {
4798
4823
  private readonly jobContinueNudged;
4799
4824
  /** In-flight startDev per worktree run key — agent MCP + UI Start must not double-spawn. */
4800
4825
  private readonly startingDev;
4826
+ /**
4827
+ * MCP/CLI poll budget while Electron main adopts `runScriptRequest`.
4828
+ * Tests shorten this so a missing desktop does not wait 20s.
4829
+ */
4830
+ runScriptAdoptTimeoutMs: number;
4801
4831
  private maxConcurrent;
4802
4832
  private runningCount;
4803
4833
  constructor(opts?: {
@@ -4851,6 +4881,18 @@ declare class Orchestrator {
4851
4881
  * MCP-created review threads don't stay `queued` after the MCP child exits.
4852
4882
  */
4853
4883
  adoptPersistedQueues(): void;
4884
+ /**
4885
+ * Adopt run-script start/stop persisted by MCP/CLI while this process owns
4886
+ * live children (desktop host). Spawning in stdio leaves the Run tab on
4887
+ * "Starting…" with no logs — `run_output` never reaches the renderer.
4888
+ */
4889
+ adoptPersistedRunScripts(): void;
4890
+ private applyRunScriptRequest;
4891
+ /**
4892
+ * Same rule as agent-queue drain: MCP stdio must not own Electron children
4893
+ * while Sideboard.app is alive.
4894
+ */
4895
+ shouldOwnRunScripts(): boolean;
4854
4896
  /**
4855
4897
  * Mid-session: a worktree can sit at `running` after the agent process dies
4856
4898
  * (Cursor/CLI crash, OOM) while wait_for_turn still reports stillRunning.
@@ -4930,7 +4972,13 @@ declare class Orchestrator {
4930
4972
  ports: number[];
4931
4973
  }>;
4932
4974
  private startDevUnlocked;
4933
- stopDev(threadRef: string, scriptName?: string): void;
4975
+ /**
4976
+ * Persist a run-script intent for the desktop host (MCP/CLI while the board
4977
+ * is alive). Polls until Electron main adopts and fulfills it.
4978
+ */
4979
+ private requestDesktopRunScript;
4980
+ private waitForDesktopRunScript;
4981
+ stopDev(threadRef: string, scriptName?: string): Promise<void>;
4934
4982
  /**
4935
4983
  * App quit: tear down every registered run/setup child and free persisted
4936
4984
  * ports so the next launch is not blocked by orphans.
@@ -7023,4 +7071,4 @@ declare function pollSlackOutboundWatches(opts?: {
7023
7071
  now?: number;
7024
7072
  }): Promise<void>;
7025
7073
 
7026
- export { ABLETIME_MCP_PATH, ABLETIME_MCP_PM_PATH, ABLETIME_OAUTH_CALLBACK_PATH, ABLETIME_OAUTH_CANCELLED, ABLETIME_OAUTH_LOCAL_CALLBACK, ABLETIME_OAUTH_PORT, ABLETIME_OAUTH_REDIRECT, ABLETIME_OAUTH_RESOURCE, ABLETIME_OAUTH_TOKEN_PREFIX, ABLETIME_ORG_KEY_PREFIX, ABLETIME_PAT_PREFIX, ABLETIME_PM_TOOL_NAMES, AGENT_DONE_CUSTOM_SOUND_EXTENSIONS, AGENT_DONE_CUSTOM_SOUND_MAX_BYTES, AGENT_DONE_SOUNDS, AGENT_GIT_ACTIONS, AGENT_RUNNER_MAX_OLD_SPACE_MB, ATTACHMENTS_DIR, type AbleTimeAssignedIssuesResult, type AbleTimeComment, type AbleTimeCredentialKind, type AbleTimeMcpToolName, AbleTimeOAuthCancelledError, type AbleTimeOrientation, type AbleTimePmToolName, type AbleTimeProject, type AbleTimeTask, type AbleTimeTaskRelationInput, type AbleTimeViewer, type AccountProfile, type ActiveRun, type AddBoardPinInput, type AddStackLayerInput, type AdoptInput, type AdvancedAppSettings, type AgentAdapter, type AgentDoneCustomSoundPayload, type AgentDoneSound, type AgentEvent, type AgentGitAction, type AgentKind, type AgentModelCatalog, type AgentModelInfo, type AgentSetupActionResult, type AgentSetupInfo, type AgentSetupKind, type AgentStatus, type AgentTurnInput, type AnthropicCacheControl, type AppSettings, type ApplyIntoMainResult, type AttachCommand, type Autonomy, BAKED_ABLETIME_OAUTH_CLIENT_ID, BAKED_SLACK_RELAY_URL, BRIGHTSY_MCP_ALLOWED_TOOLS, BRIGHTSY_OAUTH_CLIENT_ID, BRIGHTSY_OAUTH_REDIRECT, BRIGHTSY_SUMMARIZE_CONTEXT_TOOL, BUNDLED_LONG_RUNNING_PATH, BUNDLED_SKILL_PREFIX, type BoardPin, type BranchInfo, type BrightsyAccount, type BrightsyChatTarget, type BrightsyChatTargets, type BrightsyCloudConnectAgent, type BrightsyHarnessSettings, type BrightsySession, BrightsySideboardApi, type BrightsyTeamTargets, CHARS_PER_CONTEXT_TOKEN, CLAUDE_MODEL_CATALOG, CLI_DIR, CLOUD_COORDINATOR_BUSY_REPLY, CLOUD_COORDINATOR_STOPPED_REPLY, CLOUD_COORDINATOR_TIMEOUT_REPLY, CLOUD_ORCHESTRATOR_GOAL, CONTEXT_COMPACT_CHARS, CONTEXT_KEEP_RECENT_CHARS, CONTEXT_KEEP_RECENT_MESSAGES, CONTEXT_MIN_MESSAGES, CONTEXT_REVIEW_PATH, CONVENTION_SETUP_RELPATHS, COORDINATOR_TOOL_PLAYBOOK, type CaffeinateHoldState, type ClaudeExtraUsage, type ClaudeHarnessSettings, type ClaudePlanUsage, type ClaudeUsageWindow, type ClaudeUsageWindowId, type CleanupOrphansResult, type CliAgentKind, type CliExecutableSettings, type CloudConnectAgent, type CloudConnectOptions, type CloudConnectStatus, type CodeLineRange, type CodeRefInput, type CompactResult, type CompactThresholds, type ComposerFileBuffer, type ConductorSettings, type ConductorWorkspace, type ConnectedBrightsyTeamInfo, type ConventionSetupFile, type CowboyThreadFields, type CreateChatTabInput, type CreateGlobalChatOpts, type CreateScheduledTaskInput, type CreateStackInput, type CreateThreadInput, type CreateWorktreeResult, type CursorAgentUsageSnapshot, type CursorModelInfo, type CursorSdkStreamMessage, type CursorTurnRequest, type CursorUsageCost, type CursorWorktreesConfig, DEFAULT_ABLETIME_HOST, DEFAULT_WORKTREE_SORT, DETACHED_JOBS_DIR, type DefaultsAppSettings, type DefaultsSettingsPatch, type DevServerHandle, type DiffCommentInput, type DiffCommentLine, type DiffCommit, type DiffFile, type DiffResult, type DiffScope, type DiffScopeStat, type EnsuredReviewGuidelines, type ExpandResult, FAMOUS_SOCCER_TEAMS, FOLLOW_UP_BEHAVIORS, type FastForwardMainResult, type FollowUpBehavior, type ForkChatTabInput, type ForkThreadWorktreeInput, type FormatGhLandErrorOptions, GITHUB_GIT_AUTH_MODES, GITHUB_PR_BODY_MAX_CHARS, GITHUB_PR_BODY_SAFE_CHARS, GLOBAL_WORKSPACE_ID, type GetDiffOptions, type GhStackStatus, type GitHubIssue, type GitHubIssueComment, type GitHubIssueRelationInput, type GitHubStatus, type GitWorktreeStatus, type GithubGitAuthMode, HARNESS_ENV_KEYS, HISTORY_DISCARDED_TEXT, HISTORY_MAX_COUNT_DEFAULT, HISTORY_MAX_COUNT_MAX, HISTORY_MAX_COUNT_MIN, HISTORY_MAX_DAYS_DEFAULT, HISTORY_MAX_DAYS_MAX, HOME_BOARD_CACHE_TTL_MS, type HarnessId, type HistoryCleanupResult, type HistoryRetentionPlan, type HomeBoardLoaded, type HomeBoardRemoteData, IMPLIED_TICKET_RESOLVE_PROMPT, ISSUE_SOURCE_LABELS, type ImportedAgentDoneSound, type InitStackFromThreadInput, type IntegrationsSettings, type IpcApi, type IssueActivityComment, type IssueAssigneeFilter, type IssueCycleInfo, type IssueInfo, type IssueSource, LEGACY_ATTACHMENTS_DIR, LEGACY_DETACHED_JOBS_DIR, LEGACY_PLAN_FILE_REL, LEGACY_REVIEW_REQUEST_PATH, LIGHT_RECONCILE_THROTTLE_MS, LINEAR_OAUTH_CANCELLED, LINEAR_OAUTH_PORT, LINEAR_OAUTH_REDIRECT, LINEAR_OAUTH_SCOPES, LIVE_TURN_SPAWN_GRACE_MS, LONG_RUNNING_SKILL_COMMAND, type LandPreview, type LandResult, type LinearAssignedIssuesResult, type LinearAssigneeFilter, type LinearComment, type LinearCycle, type LinearIssue, type LinearIssueAttachment, type LinearIssueComment, type LinearIssueRef, type LinearIssueRelation, type LinearIssueRelationInput, type LinearNamedRef, LinearOAuthCancelledError, type LinearProjectRef, type LinearTeam, type LinearTeamsResult, type LinearWorkflowState, type ListIssuesOptions, type ListIssuesResult, type ListPrsOptions, MAX_ANTHROPIC_CACHE_CONTROL_BLOCKS, type McpServerStatus, type MessagePart, OPTIONAL_SERVICES, OPTIONAL_SERVICE_IDS, ORCHESTRATOR_AGENT_KINDS, type OpenPrStackLayersInput, type OpenStackLayerInput, type OpenStackLayerResult, type OptionalServiceCliStatus, type OptionalServiceId, type OptionalServiceSpec, type OrchestrationQuotaOnLimit, Orchestrator, type OrchestratorAgentKind, type OrchestratorDefaultsSettings, type OrchestratorEvent, type OrchestratorRuntime, type OrphanWorktree, PASTE_ATTACH_MIN_CHARS, PASTE_ATTACH_MIN_LINES, PLAN_FILE_NAME, PLAN_FILE_REL, PLAN_MODE_INSTRUCTION, PLAN_QUESTION_ANSWERS_PREFIX, PROFILE_NOTES_MAX, PR_DETAILS_JSON_FIELDS, type PathRefInput, type PendingPlanQuestions, type PlanQuestion, type PlanQuestionAnswer, type PlanQuestionOption, type PlanToolPartLike, type PortReservation, type PrActor, type PrCheckRun, type PrCommentInfo, type PrCommitInfo, type PrDetails, type PrInfo, type PrMeta, type PrReviewInfo, type PrStack, type PrStackLayer, type PresentedPlan, type ProjectProfileSettings, type PublicAppSettings, type PublicIntegrationsSettings, REPO_REVIEW_NAME, REPO_REVIEW_PATH, REVIEW_REQUEST_NAME, REVIEW_REQUEST_PATH, REVIEW_REQUEST_PREFILL, REVIEW_REQUEST_TEMPLATE, REVIEW_SKILL_NAME, REVIEW_SKILL_PATH, type RepoSettings, type RepoSetupInfo, type RequestReviewResult, type ResolvedAccountProfile, type ResolvedReviewGuidelines, type ResolvedThreadDefaults, type ResolvedViewerProfile, type ReviewGuidelinesSource, type RunMode, type RunScript, SEED_FULL_TOOL_MESSAGES, SEED_MAX_CHARS, SESSION_RESET_OCCUPANCY_TOKENS, SIDEBOARD_FORCE_STOP, SIDEBOARD_MCP_ALLOWED_TOOLS, SIDEBOARD_MCP_PROFILE_ENV, SLACK_LISTEN_STOPPED_REPLY, SLACK_LISTEN_TIMEOUT_REPLY, SLACK_OAUTH_CANCELLED, SLACK_OAUTH_REDIRECT, SLACK_PROGRESS_DELAY_MS, SLACK_PROGRESS_EDIT_MS, SLACK_REPLY_FORMATTING, SLACK_SEEN_REACTION, STDERR_EVENT_MAX_CHARS, STDOUT_EVENT_MAX_CHARS, type ScheduleCreatedBy, type ScheduleWhen, type ScheduledTask, type ScriptHandle, type SessionSeedOptions, type SetupLogSnapshot, type SetupRunResult, type SidebarGitAction, type SideboardMcpProfile, type SkillInfo, type SlackInboundMessage, type SlackListenOptions, type SlackListenStatus, SlackOAuthCancelledError, type SlackOutboundReply, type SlackOutboundWatch, type SlackRelayClientMessage, type SlackRelayClientOptions, SlackRelayHub, type SlackRelayServerHandle, type SlackRelayServerMessage, type SlackRelayServerOptions, type SlackWorkspaceInfo, type SourceType, type SpawnTurnHandle, type SummarizeResult, THINKING_EFFORTS, THINKING_PART_MAX_CHARS, type TeamName, type ThinkingEffort, type Thread, type ThreadAttachment, type ThreadMessage, type ThreadOptionsPatch, type ThreadStatus, type TokenUsage, type ToolPartLike, type TranscriptToolDetail, type TurnCommand, USAGE_ON_LIMIT_VALUES, type UpdateScheduledTaskPatch, type UsageOnLimit, type UsageScope, type ViewerContextWriteResult, type ViewerProfile, WORKTREE_ABLETIME_MCP_TOOLS, WORKTREE_GITHUB_MCP_TOOLS, WORKTREE_LINEAR_MCP_TOOLS, WORKTREE_MCP_TOOLS, type Workspace, type WorkspaceInventoryEntry, type WorkspaceScriptEnvOpts, type WorktreeDirtyStat, type WorktreeSortMode, type WorktreeStatKind, ableTimeCredentialKind, ableTimeDependencyTarget, ableTimeOAuthAuthorizeUrl, ableTimeOAuthBouncePage, ableTimeOAuthClientId, ableTimeOAuthLocalBounceUrl, ableTimeOAuthRedirectUri, ableTimeOAuthResource, ableTimeUsesRest, abletimeMcpRequest, abletimeMcpUrl, abletimeToolUsesPm, ackSlackInboundSeen, addBoardPin, addPrStackLayer, addStackLayerFromThread, addWorkspace, adoptThread, agentDoneCustomSoundMime, agentDoneSound, agentDoneSoundsDir, agentGitPrompt, alignQueueAttachments, allAdapters, allocatePort, allocatePortRange, allocateTeamName, allocateTeamSlug, appDataDir, appSettingsPath, appendIndexedGitConfig, appendMessage, appendQueuedItem, applyAgentEvent, applyAgentRunnerHeapEnv, applyAppEnvironment, applyCompaction, applyForwardOccupancy, applyGithubGitAuthEnv, applyPromptCacheTtlEnv, applySystemCaEnv, applyThreadIntoMain, applyTurnUsage, armSchedules, assertAbleTimeCredential, assertAbleTimeMcpCredential, assertOrchestratorCapableAgent, attachmentFromAbsolutePath, attachmentsFromBuffers, attachmentsFromWorktreePaths, attachmentsGitignoreBody, autoArchiveOnMergeEnabled, autoCleanupHistoryEnabled, autoCleanupOrphansEnabled, autoRenameBranchEnabled, autoRunAfterSetupEnabled, branchDisplayLabel, brightsyAccessTokenNeedsRefresh, brightsyAdapter, brightsyCloudConnectAgent, brightsyCloudConnectEnabled, brightsyConfigPath, brightsyInjectWorktreeMcpEnabled, brightsyMcpAllowedTools, brightsyMcpServerName, buildBrightsySessionSeed, buildCachedUserContent, buildClaudeStreamJsonUserMessage, buildCodeRefAttachment, buildDiffCommentAttachment, buildForkTranscriptAttachment, buildLinearIssueFilter, buildPastedTextAttachment, buildPathRefAttachment, buildReviewRequestAttachment, buildSessionSeed, buildWorkspaceScriptEnv, caffeinateHoldPath, caffeinateWhileCloudConnectEnabled, caffeinateWhileRunningEnabled, caffeinateWhileSchedulesEnabled, caffeinateWhileSlackListenEnabled, callAbleTimeTool, canonicalizeRepoPath, captureLoginEnv, captureTurnBaseline, checkoutPrStackLayer, childEnvWithAppSettings, claimDesktopHost, clampGithubPrBody, clampHistoryMaxCount, clampHistoryMaxDays, classifyWorktreeColumn, claudeAdapter, claudeChromeEnabled, claudeUsageOverLimitWindows, claudeUserSettingsPath, cleanupArchivedHistory, cleanupOrphanWorktrees, clearAgentDoneCustomSoundFile, clearBoardPins, clearHomeBoardCache, clipAgentEventForPaint, clipThinkingForStore, cloneRepoIntoSideboard, codeRefRangeLabel, codexAdapter, codexSandboxWritableRootsArgs, codexUnattendedGitConfigArgs, coerceOrchestratorAgent, collectTakenTeamSlugs, commentAbleTimeTask, commentGitHubIssue, commentLinearIssue, commitAll, computeNextRunAt, conductorBundledBinDir, conductorDbPath, confirmClaudeUsageOverLimitEnabled, confirmLand, connectBrightsyTeam, connectOptionalService, connectSlackToken, connectedOptionalServices, connectedPrSelectors, consumeComposerAttachments, contextTokens, coordinatorSystemPrompt, coordinatorTurnReminder, copyConfiguredFiles, countCacheControlBlocks, countUnpushedVsOrigin, cowboyModeEnabled, createAbleTimePkce, createAbleTimeTask, createChatTab, createEmptyThread, createExistingBranchWorktree, createGitHubIssue, createGlobalChat, createLinearIssue, createLinearPkce, createOrUpdatePr, createPrStack, createSchedule, createThread, createThreadWorktree, currentBranch, cursorAdapter, cursorSdkMessageToEvents, decodeBrightsyTarget, defaultScheduleName, deleteBranchOnPurgeEnabled, deleteSchedule, deleteThreadRecord, desktopHostPidPath, detectAgents, detectGhStack, detectLocalMergeConflicts, detectOptionalServiceClis, disconnectAbleTimeConnection, disconnectBrightsyTeam, disconnectLinear, disconnectLinearConnection, disconnectOptionalService, disconnectSlackWorkspace, discoverSkills, dropCachedPrefixOnResume, emptyPublicIntegrations, emptySetupLog, encodeBrightsyTarget, enrichPathWithNpmGlobalBin, enrichWorkspacesWithGithub, ensureAbleTimeAccessToken, ensureAbleTimeTask, ensureAgentPath, ensureBrightsyLocalConfigFresh, ensureBrightsyOAuthClientId, ensureCloudCoordinator, ensureConnectedBrightsyTeamTokens, ensureGhPreferOrigin, ensureGlobalCoordinatorCwd, ensureReviewGuidelinesFile, ensureReviewRequestFile, ensureReviewSkillFile, ensureSlackCoordinator, ensureSlackDeviceIdentity, ensureWorkspace, estimateMessageChars, estimateOccupancyTokens, estimateThreadChars, examplePrefixedBranch, expandComposerPrompt, extractBrightsyContextSummary, extractGhErrorDetail, extractPendingPlanQuestions, extractPresentedPlan, extractiveSummary, fastForwardMainCheckoutIfSafe, fetchOriginForWorktree, fetchPrHead, finalizeParts, findAgentDoneCustomSoundPath, findConventionSetup, findInvalidCacheControlTtlOrder, findLastBrightsyContextSummary, findLiveThreadForCreate, findLiveThreadForCreateSource, findOrphanWorktrees, findProjectProfileKey, findSlackCoordinator, findThreadByRef, findThreadForStackLayer, fireSchedule, flattenTurnInput, flipLinearRelationType, foldLegacyRolesIntoNotes, followUpBehavior, forkChatTab, forkMessageSlice, forkThreadWorktree, formatAccountProfilePlaybookLine, formatArtifactDirective, formatBrightsyFetchError, formatClaudeExtraUsageDetail, formatClaudeUsageCompact, formatClaudeUsageFetchedAt, formatClaudeUsageOverLimitConfirm, formatClaudeUsageOverLimitWait, formatClaudeUsageReset, formatClaudeUsageResetClock, formatClaudeUsageTooltip, formatDetachedJobInvoke, formatFetchError, formatGhLandError, formatGitAuthModeDirective, formatIpcInvokeError, formatIssueToolsDirective, formatIssueToolsReminder, formatLinearDirective, formatLinearReminder, formatLongRunningDirective, formatLongRunningReminder, formatMergePrError, formatMessagesAsTranscript, formatOptionalServicesDirective, formatOptionalServicesReminder, formatPlanQuestionAnswers, formatPlanQuestionsForChat, formatPrGateDirective, formatProcessGuideDirective, formatProjectProfilePlaybookLines, formatRateLimitResetHint, formatRenameBranchDirective, formatScheduleWhen, formatScheduledPrompt, formatSlackExternalReplyPrompt, formatSlackInboundPrompt, formatSlackRepliesForTurn, formatSlackReplyContinuePrompt, formatSlackSignedReply, formatSlackWorkingText, formatTranscriptMarkdown, formatUiReminder, formatViewerContextDirective, formatViewerContextReminder, formatWorkspaceInventory, formatWorkspaceProfileSuffix, formatWorktreeDirective, formatWorktreeReminder, forwardContextUsage, forwardOccupancyTokens, fromInclusiveInputUsage, getAbleTimeAccessToken, getAbleTimeHost, getAbleTimeOrientation, getAbleTimeTask, getAdapter, getAgentSetupInfo, getBrightsySession, getCaffeinateHold, getClaudePlanUsage, getDefaultAgent, getDefaultEffort, getDefaultFast, getDefaultModel, getDefaultRunScript, getDiff, getDiffSummary, getGitHubIssue, getGitHubStatus, getGithubGitAuthMode, getGithubPat, getHomeBoardInputs, getIssueSource, getLinearApiKey, getLinearAuthToken, getLinearIssue, getOrchestrator, getPr, getPrChecks, getPrDetails, getPrForHeadBranch, getPrMeta, getPrStack, getRepoSetupInfo, getRunMode, getRunScript, getSchedule, getSlackWorkspace, getWorktreeDirtyStat, gh, ghHeadRef, ghRepoSelectArgs, git, gitBranchPrefixSetting, githubAgentGitEnv, githubHttpsInsteadOfEntries, githubRelationEditFlag, globalAgentCwd, groupHomeBoardWorktrees, handleSlackInbound, harnessEnvKey, hasBakedAbleTimeOAuth, hasBakedLinearOAuth, hasBakedSlackOAuth, hasConductorHook, hasConventionSetup, hasCursorWorktreeSetup, hasEnabledSchedules, hasRepoHook, hasWorkspaceHook, healOrchestrationSoccerTitles, historyMaxCount, historyMaxDays, hottestClaudeWindow, httpFetch, importAgentDoneCustomSound, importConductorWorkspace, importConductorWorkspaceAsync, initPrStack, initStackFromThread, initializeGitRepository, inspectGitWorktree, installAgent, installNpmGlobalPackage, installOptionalServiceCli, interruptSlackCoordinatorForInbound, invalidateThreadListCache, invalidateThreadRecord, isAbleTimeConnected, isAbleTimeOAuthCancelled, isAbleTimeRejectedCredential, isAgentDoneSound, isAskUserToolName, isBrightsyConnected, isBrightsyNdjsonLine, isCloudCoordinatorThread, isConductorBundledCli, isCowboyThread, isCursorApiKeyConfigured, isCursorAutoModel, isDefaultishSourceRef, isDesktopHostAlive, isDirty, isGhPrBodyTooLongError, isGhRateLimitError, isGlobalRepoPath, isGlobalThread, isHistoryRetentionStub, isHomeBoardThread, isImageFilePath, isInPrStack, isInboundForThisDesktop, isInjectedOrchMcpName, isInternalAgentStatusText, isIssueSourceConnected, isLinearConnected, isLinearNoneToken, isLinearOAuthCancelled, isOptionalServiceId, isOrchestratorCapableAgent, isOrchestratorThread, isPidAlive, isPlaceholderBranch, isPlanQuestionAnswersMessage, isPollWrapperToolName, isPrNotMergeableError, isPresentPlanToolName, isPrimaryCheckoutThread, isSelfWrittenRecord, isSessionQuotaLimit, isSetupLastError, isShellToolName, isSideboardScratchPath, isSlackCoordinatorThread, isSlackExternalReplyPrompt, isSlackOAuthCancelled, isStaleLastErrorDuringTurn, isSubagentToolName, isThinkingEffort, isThisProcessDesktopHost, isThreadCaffeinated, isThreadRecordFile, isUsageOnLimit, isWorkspaceScratchPath, issueAttachmentForAbleTimeTask, issueMatchesAssignee, issueSourceLabel, issueTicketFromThread, killListenersOnPorts, lastAssistantMessageText, lastRequestOccupancy, latestPendingPlanQuestions, linearAuthorizationHeader, linearCycleIsActive, linearGraphql, linearOAuthAuthorizeUrl, linearOAuthCredentials, linearRelationCreateInput, linearTicketIdFromThread, listAbleTimeAssignedIssues, listAbleTimeProjects, listAbleTimeTasks, listAgentSetupInfo, listBoardPins, listBranchCommits, listBranches, listBrightsyAccounts, listBrightsyChatTargets, listCodexModels, listConductorWorkspaces, listConnectedBrightsyTeams, listCursorModels, listGitHubIssueCommentsSince, listGitHubIssues, listGlobalThreads, listIssues, listLinearAssignedIssues, listLinearCommentsSince, listLinearIssues, listLinearIssuesDirect, listLinearIssuesFiltered, listLinearTeamCycles, listLinearTeams, listModelsForAgent, listOpencodeModels, listPrs, listRunScripts, listSchedules, listSlackOutboundWatches, listSlackWorkspaces, listThreads, listWorkspaces, listWorktreeFiles, listWorktrees, liveActivitySummary, loadAppSettings, loadBrightsyConfig, loadConductorSettings, loadHomeBoardInputs, loadRepoSettings, loadWorkspaceSettings, locksDir, loginAgent, lookupSoccerTeam, mapAbleTimeTask, markPrReady, materializeSystemCaBundle, maxConcurrentAgents, maybeCompactContext, mcpAllowTools, mcpAllowToolsFromNames, mcpAuthWarnings, mcpStatusThinkingFromClaudeInit, mentionsPrGoal, mergeAgentGitAuthEnv, mergePr, mergePrStack, mergeSetupOutput, mergeSideboardIntoMcpServersJson, mergeUsage, messagePartParentId, messagesSinceLastBrightsyContextSummary, moveQueuedItemToFront, nextPastedTextName, nextThinkingEffort, nonInteractiveGitProcessEnv, normalizeAbleTimeCredential, normalizeAbleTimeHost, normalizeBrightsyEndpoint, normalizeCodeSelection, normalizeLinearRelationType, normalizeParseResult, normalizeServiceOrigin, normalizeThinkingEffort, normalizeThread, normalizeTurnInput, normalizeWorktreePath, openInSystemTerminal, openPrStackLayers, openStackLayer, opencodeAdapter, optionalServiceConnected, optionalServiceSpec, orchestrationQuotaFallbackAgent, orchestrationQuotaOnLimit, orchestrationTitleNeedsSoccerNickname, orchestratorSessionPoisonedByBuiltins, originFetchBranch, originGhRepoEnv, packagedDetachedJobPath, parseAbleTimeOAuthCallbackUrl, parseClaudeUsagePayload, parseCursorRunnerLine, parseDurationMs, parseForceStopMessage, parseGhStackViewJson, parseGitHubIssueNumber, parseGithubSlugFromRemoteUrl, parseMcpList, parsePlanQuestionsInput, parsePrDetailsView, parseSessionQuotaResetAt, parseSlackRelayClientMessage, parseSlackRelayServerMessage, partsToAssistantText, pastedTextStats, pendingSlackExternalReplies, permissionMode, persistPendingFileAttachments, persistVaultKeyInKeychain, planFileAbs, planHistoryAgePurge, planHistoryRetention, planQuestionsSignature, pollSlackOutboundWatches, posixShellSingleQuote, preferredCursorCostCents, prepareTerminalCommand, prependQueuedItem, previewLand, primaryCheckoutFromLinkedWorktree, promptMentionsBrightsy, pushBranch, readAgentDoneCustomSound, readExistingReviewRequestFile, readKeychainVaultKey, readPlanFile, readSetupLog, readSkillBody, readThread, readViewerContext, readWorktreeFile, readWorktreeFileForUpload, readWorktreeInclude, recordScheduleRun, recordSlackOutboundWatch, refreshBrightsyAccessToken, refreshGitHubAuth, registerBrightsyOAuthClient, registerPackagedUserMcpClients, releaseCaffeinateHoldForThread, releaseDesktopHost, removeBoardPin, removeQueuedItem, removeWorkspace, removeWorktree, repoSlug, requestOccupancy, requestReview, requireAgent, reservePort, reservePortRange, resetGhStackDetectCache, resetGithubAgentTokenMemo, resolveAbleTimeOAuthHost, resolveAccountProfile, resolveAccountProfileFromSettings, resolveAgentExecutable, resolveAgentGitAuthEnv, resolveClaudeExecutable, resolveCodexGitWritableRoots, resolveCommandBinarySync, resolveConductorCursorAgentId, resolveCreateFirstPrompt, resolveCursorModelId, resolveDefaultBranch, resolveDetachedJobScript, resolveDiffBaseRef, resolveEffectiveIssueSource, resolveFilesToCopy, resolveGhAuthToken, resolveGitBranchPrefix, resolveGitDirsForLockRecovery, resolveGitHubIssueRepo, resolveGithubAgentToken, resolveGithubRepoSlug, resolveLinearCycle, resolveLinearLabel, resolveLinearProject, resolveLinearState, resolveLinearTeam, resolveLoginCommand, resolveNewOrchestratorOptions, resolveNewThreadOptions, resolveOrchChildFollowUp, resolveOrchestratorDefaults, resolvePlanMarkdown, resolvePrSelector, resolvePrSelectors, resolveQuotaFallbackAgent, resolveRepoRoot, resolveReviewGuidelines, resolveScheduleThreadId, resolveSendFollowUp, resolveSidebarGitPrompt, resolveSlackListenMode, resolveThreadDefaults, resolveThreadEffort, resolveUsageOnLimit, resolveVaultKey, resolveViewerProfile, resolveViewerProfileForRepo, resolveWorktreeStartPoint, rewriteAbleTimeError, rewriteLinearError, run, runArchiveScript, runCloudConnect, runConventionSetup, runCursorWorktreeSetup, runSetupScript, runSlackListen, runSlackRelayClient, runWorkspaceSetup, sameWorktreePath, sanitizeGitBranchPrefix, sanitizeMcpServerName, saveAbleTimeConnection, saveAppSettings, saveLinearOAuth, schedulesPath, scrubGithubTokensFromChildEnv, searchAbleTimeTasks, secureFileUnlocksWith, setCaffeinateHold, setHttpFetchImpl, setStatus, setVaultMasterKey, settingsSourceLabel, shiftQueuedItem, shouldAttachPastedText, shouldCompactContext, shouldInjectBrightsyMcp, shouldRefreshReviewRequestTemplate, shouldRemoveWorktreeOnTeardown, shouldResetSessionForOccupancy, shouldRunHistoryCleanup, shouldRunWorktreeCleanup, shouldStampSetupLastError, showCostEnabled, sideboardHomeDir, sideboardMcpProfile, sideboardReposDir, sideboardWorkspacesDir, slackAppLevelToken, slackArchiveUrl, slackCoordinatorSourceRef, slackListenEnabled, slackOAuthCredentials, slackOAuthResultUrl, slackRelayUrl, slimMessagesForUiList, slimThreadForUiList, slugify, spawnAgentTurn, splitForCompaction, splitTurnInputForSystemPrompt, stackAgentDefaultsFrom, stackIdFrom, stackMergeReadiness, stageAbsolutePathsAsAttachments, stageBuffersAsAttachments, startAbleTimeOAuth, startDevServer, startLinearOAuth, startMcpServer, startOrchestration, startSlackOAuth, startSlackRelayServer, statWorktreePath, stripBrightsyNdjsonNoise, stripNestedElectronEnv, submitPrStack, suggestSlug, sumUsageList, summarizeConversation, switchBrightsyAccount, syncWorkspacesFromThreads, takePendingTurnAttachments, takenTeamSlugsForChatTab, takenTeamSlugsForOrchestration, taskMessageText, taskUrl, thinkingEffortBars, thinkingEffortLabel, thisProcessShouldDrainAgentQueues, threadDisplayLabel, threadFilePath, threadHasCompactedContext, threadLivePath, threadLockPath, threadRequestsBrightsyMcp, threadsDir, threadsSharingWorktree, ticketSlugForBranch, toAbleTimeIssueInfo, toGitHubIssueInfo, toPublicAppSettings, toolActivityLine, toolDescription, toolDetail, toolFilePath, totalTokens, trustSystemCertificates, turnCostUsdFromCursorUsage, updateAbleTimeTask, updateAdvancedSettings, updateAgentExecutable, updateAppEnvironment, updateBrightsySettings, updateClaudeSettings, updateCodexSettings, updateDefaultsSettings, updateGitHubIssue, updateIntegrationsSettings, updateLinearIssue, updateOpencodeSettings, updateProjectProfileSettings, updateSchedule, updateThread, usageOnLimit, userClaudeMcpConfigPath, userCursorMcpConfigPath, userMcpNamesToDisable, validateLinearApiKey, verifyAbleTimeConnection, verifyOptionalService, visibleToolRowDetail, waitForPidExit, warmGithubAgentAuth, whichOnPath, withEventParentId, withEventsParentId, withExportedPath, withMaxOldSpaceSize, withThreadLock, workspaceSettingsSourceLabel, worktreeBoardStatus, worktreeCleanupSettings, worktreeDisplayLabel, worktreeDisplayLabelForGroup, worktreeNameFromPath, worktreeSlugForTicket, worktreesRoot, wrapReviewSkillMarkdown, writeInjectedMcpConfig, writePlanFile, writeThread, writeViewerContext, writeWorktreeFile };
7074
+ export { ABLETIME_MCP_PATH, ABLETIME_MCP_PM_PATH, ABLETIME_OAUTH_CALLBACK_PATH, ABLETIME_OAUTH_CANCELLED, ABLETIME_OAUTH_LOCAL_CALLBACK, ABLETIME_OAUTH_PORT, ABLETIME_OAUTH_REDIRECT, ABLETIME_OAUTH_RESOURCE, ABLETIME_OAUTH_TOKEN_PREFIX, ABLETIME_ORG_KEY_PREFIX, ABLETIME_PAT_PREFIX, ABLETIME_PM_TOOL_NAMES, AGENT_DONE_CUSTOM_SOUND_EXTENSIONS, AGENT_DONE_CUSTOM_SOUND_MAX_BYTES, AGENT_DONE_SOUNDS, AGENT_GIT_ACTIONS, AGENT_RUNNER_MAX_OLD_SPACE_MB, ATTACHMENTS_DIR, type AbleTimeAssignedIssuesResult, type AbleTimeComment, type AbleTimeCredentialKind, type AbleTimeMcpToolName, AbleTimeOAuthCancelledError, type AbleTimeOrientation, type AbleTimePmToolName, type AbleTimeProject, type AbleTimeTask, type AbleTimeTaskRelationInput, type AbleTimeViewer, type AccountProfile, type ActiveRun, type AddBoardPinInput, type AddStackLayerInput, type AdoptInput, type AdvancedAppSettings, type AgentAdapter, type AgentDoneCustomSoundPayload, type AgentDoneSound, type AgentEvent, type AgentGitAction, type AgentKind, type AgentModelCatalog, type AgentModelInfo, type AgentSetupActionResult, type AgentSetupInfo, type AgentSetupKind, type AgentStatus, type AgentTurnInput, type AnthropicCacheControl, type AppSettings, type ApplyIntoMainResult, type AttachCommand, type Autonomy, BAKED_ABLETIME_OAUTH_CLIENT_ID, BAKED_SLACK_RELAY_URL, BRIGHTSY_MCP_ALLOWED_TOOLS, BRIGHTSY_OAUTH_CLIENT_ID, BRIGHTSY_OAUTH_REDIRECT, BRIGHTSY_SUMMARIZE_CONTEXT_TOOL, BUNDLED_LONG_RUNNING_PATH, BUNDLED_SKILL_PREFIX, type BoardPin, type BranchInfo, type BrightsyAccount, type BrightsyChatTarget, type BrightsyChatTargets, type BrightsyCloudConnectAgent, type BrightsyHarnessSettings, type BrightsySession, BrightsySideboardApi, type BrightsyTeamTargets, CHARS_PER_CONTEXT_TOKEN, CLAUDE_MODEL_CATALOG, CLI_DIR, CLOUD_COORDINATOR_BUSY_REPLY, CLOUD_COORDINATOR_STOPPED_REPLY, CLOUD_COORDINATOR_TIMEOUT_REPLY, CLOUD_ORCHESTRATOR_GOAL, CONTEXT_COMPACT_CHARS, CONTEXT_KEEP_RECENT_CHARS, CONTEXT_KEEP_RECENT_MESSAGES, CONTEXT_MIN_MESSAGES, CONTEXT_REVIEW_PATH, CONVENTION_SETUP_RELPATHS, COORDINATOR_TOOL_PLAYBOOK, type CaffeinateHoldState, type ClaudeExtraUsage, type ClaudeHarnessSettings, type ClaudePlanUsage, type ClaudeUsageWindow, type ClaudeUsageWindowId, type CleanupOrphansResult, type CliAgentKind, type CliExecutableSettings, type CloudConnectAgent, type CloudConnectOptions, type CloudConnectStatus, type CodeLineRange, type CodeRefInput, type CompactResult, type CompactThresholds, type ComposerFileBuffer, type ConductorSettings, type ConductorWorkspace, type ConnectedBrightsyTeamInfo, type ConventionSetupFile, type CowboyThreadFields, type CreateChatTabInput, type CreateGlobalChatOpts, type CreateScheduledTaskInput, type CreateStackInput, type CreateThreadInput, type CreateWorktreeResult, type CursorAgentUsageSnapshot, type CursorModelInfo, type CursorSdkStreamMessage, type CursorTurnRequest, type CursorUsageCost, type CursorWorktreesConfig, DEFAULT_ABLETIME_HOST, DEFAULT_WORKTREE_SORT, DETACHED_JOBS_DIR, type DefaultsAppSettings, type DefaultsSettingsPatch, type DevServerHandle, type DiffCommentInput, type DiffCommentLine, type DiffCommit, type DiffFile, type DiffResult, type DiffScope, type DiffScopeStat, type EnsuredReviewGuidelines, type ExpandResult, FAMOUS_SOCCER_TEAMS, FOLLOW_UP_BEHAVIORS, type FastForwardMainResult, type FollowUpBehavior, type ForkChatTabInput, type ForkThreadWorktreeInput, type FormatGhLandErrorOptions, GITHUB_GIT_AUTH_MODES, GITHUB_PR_BODY_MAX_CHARS, GITHUB_PR_BODY_SAFE_CHARS, GLOBAL_WORKSPACE_ID, type GetDiffOptions, type GhStackStatus, type GitHubIssue, type GitHubIssueComment, type GitHubIssueRelationInput, type GitHubStatus, type GitWorktreeStatus, type GithubGitAuthMode, HARNESS_ENV_KEYS, HISTORY_DISCARDED_TEXT, HISTORY_MAX_COUNT_DEFAULT, HISTORY_MAX_COUNT_MAX, HISTORY_MAX_COUNT_MIN, HISTORY_MAX_DAYS_DEFAULT, HISTORY_MAX_DAYS_MAX, HOME_BOARD_CACHE_TTL_MS, type HarnessId, type HistoryCleanupResult, type HistoryRetentionPlan, type HomeBoardLoaded, type HomeBoardRemoteData, IMPLIED_TICKET_RESOLVE_PROMPT, ISSUE_SOURCE_LABELS, type ImportedAgentDoneSound, type InitStackFromThreadInput, type IntegrationsSettings, type IpcApi, type IssueActivityComment, type IssueAssigneeFilter, type IssueCycleInfo, type IssueInfo, type IssueSource, LEGACY_ATTACHMENTS_DIR, LEGACY_DETACHED_JOBS_DIR, LEGACY_PLAN_FILE_REL, LEGACY_REVIEW_REQUEST_PATH, LIGHT_RECONCILE_THROTTLE_MS, LINEAR_OAUTH_CANCELLED, LINEAR_OAUTH_PORT, LINEAR_OAUTH_REDIRECT, LINEAR_OAUTH_SCOPES, LIVE_TURN_SPAWN_GRACE_MS, LONG_RUNNING_SKILL_COMMAND, type LandPreview, type LandResult, type LinearAssignedIssuesResult, type LinearAssigneeFilter, type LinearComment, type LinearCycle, type LinearIssue, type LinearIssueAttachment, type LinearIssueComment, type LinearIssueRef, type LinearIssueRelation, type LinearIssueRelationInput, type LinearNamedRef, LinearOAuthCancelledError, type LinearProjectRef, type LinearTeam, type LinearTeamsResult, type LinearWorkflowState, type ListIssuesOptions, type ListIssuesResult, type ListPrsOptions, MAX_ANTHROPIC_CACHE_CONTROL_BLOCKS, type McpServerStatus, type MessagePart, OPTIONAL_SERVICES, OPTIONAL_SERVICE_IDS, ORCHESTRATOR_AGENT_KINDS, type OpenPrStackLayersInput, type OpenStackLayerInput, type OpenStackLayerResult, type OptionalServiceCliStatus, type OptionalServiceId, type OptionalServiceSpec, type OrchestrationQuotaOnLimit, Orchestrator, type OrchestratorAgentKind, type OrchestratorDefaultsSettings, type OrchestratorEvent, type OrchestratorRuntime, type OrphanWorktree, PASTE_ATTACH_MIN_CHARS, PASTE_ATTACH_MIN_LINES, PLAN_FILE_NAME, PLAN_FILE_REL, PLAN_MODE_INSTRUCTION, PLAN_QUESTION_ANSWERS_PREFIX, PROFILE_NOTES_MAX, PR_DETAILS_JSON_FIELDS, type PathRefInput, type PendingPlanQuestions, type PlanQuestion, type PlanQuestionAnswer, type PlanQuestionOption, type PlanToolPartLike, type PortReservation, type PrActor, type PrCheckRun, type PrCommentInfo, type PrCommitInfo, type PrDetails, type PrInfo, type PrMeta, type PrReviewInfo, type PrStack, type PrStackLayer, type PresentedPlan, type ProjectProfileSettings, type PublicAppSettings, type PublicIntegrationsSettings, REPO_REVIEW_NAME, REPO_REVIEW_PATH, REVIEW_REQUEST_NAME, REVIEW_REQUEST_PATH, REVIEW_REQUEST_PREFILL, REVIEW_REQUEST_TEMPLATE, REVIEW_SKILL_NAME, REVIEW_SKILL_PATH, RUN_SCRIPT_DESKTOP_ADOPT_MS, type RepoSettings, type RepoSetupInfo, type RequestReviewResult, type ResolvedAccountProfile, type ResolvedReviewGuidelines, type ResolvedThreadDefaults, type ResolvedViewerProfile, type ReviewGuidelinesSource, type RunMode, type RunScript, type RunScriptRequest, SEED_FULL_TOOL_MESSAGES, SEED_MAX_CHARS, SESSION_RESET_OCCUPANCY_TOKENS, SIDEBOARD_FORCE_STOP, SIDEBOARD_MCP_ALLOWED_TOOLS, SIDEBOARD_MCP_PROFILE_ENV, SLACK_LISTEN_STOPPED_REPLY, SLACK_LISTEN_TIMEOUT_REPLY, SLACK_OAUTH_CANCELLED, SLACK_OAUTH_REDIRECT, SLACK_PROGRESS_DELAY_MS, SLACK_PROGRESS_EDIT_MS, SLACK_REPLY_FORMATTING, SLACK_SEEN_REACTION, STDERR_EVENT_MAX_CHARS, STDOUT_EVENT_MAX_CHARS, type ScheduleCreatedBy, type ScheduleWhen, type ScheduledTask, type ScriptHandle, type SessionSeedOptions, type SetupLogSnapshot, type SetupRunResult, type SidebarGitAction, type SideboardMcpProfile, type SkillInfo, type SlackInboundMessage, type SlackListenOptions, type SlackListenStatus, SlackOAuthCancelledError, type SlackOutboundReply, type SlackOutboundWatch, type SlackRelayClientMessage, type SlackRelayClientOptions, SlackRelayHub, type SlackRelayServerHandle, type SlackRelayServerMessage, type SlackRelayServerOptions, type SlackWorkspaceInfo, type SourceType, type SpawnTurnHandle, type SummarizeResult, THINKING_EFFORTS, THINKING_PART_MAX_CHARS, type TeamName, type ThinkingEffort, type Thread, type ThreadAttachment, type ThreadMessage, type ThreadOptionsPatch, type ThreadStatus, type TokenUsage, type ToolPartLike, type TranscriptToolDetail, type TurnCommand, USAGE_ON_LIMIT_VALUES, type UpdateScheduledTaskPatch, type UsageOnLimit, type UsageScope, type ViewerContextWriteResult, type ViewerProfile, WORKTREE_ABLETIME_MCP_TOOLS, WORKTREE_GITHUB_MCP_TOOLS, WORKTREE_LINEAR_MCP_TOOLS, WORKTREE_MCP_TOOLS, type Workspace, type WorkspaceInventoryEntry, type WorkspaceScriptEnvOpts, type WorktreeDirtyStat, type WorktreeSortMode, type WorktreeStatKind, ableTimeCredentialKind, ableTimeDependencyTarget, ableTimeOAuthAuthorizeUrl, ableTimeOAuthBouncePage, ableTimeOAuthClientId, ableTimeOAuthLocalBounceUrl, ableTimeOAuthRedirectUri, ableTimeOAuthResource, ableTimeUsesRest, abletimeMcpRequest, abletimeMcpUrl, abletimeToolUsesPm, ackSlackInboundSeen, addBoardPin, addPrStackLayer, addStackLayerFromThread, addWorkspace, adoptThread, agentDoneCustomSoundMime, agentDoneSound, agentDoneSoundsDir, agentGitPrompt, alignQueueAttachments, allAdapters, allocatePort, allocatePortRange, allocateTeamName, allocateTeamSlug, appDataDir, appSettingsPath, appendIndexedGitConfig, appendMessage, appendQueuedItem, applyAgentEvent, applyAgentRunnerHeapEnv, applyAppEnvironment, applyCompaction, applyForwardOccupancy, applyGithubGitAuthEnv, applyPromptCacheTtlEnv, applySystemCaEnv, applyThreadIntoMain, applyTurnUsage, armSchedules, assertAbleTimeCredential, assertAbleTimeMcpCredential, assertOrchestratorCapableAgent, attachmentFromAbsolutePath, attachmentsFromBuffers, attachmentsFromWorktreePaths, attachmentsGitignoreBody, autoArchiveOnMergeEnabled, autoCleanupHistoryEnabled, autoCleanupOrphansEnabled, autoRenameBranchEnabled, autoRunAfterSetupEnabled, branchDisplayLabel, brightsyAccessTokenNeedsRefresh, brightsyAdapter, brightsyCloudConnectAgent, brightsyCloudConnectEnabled, brightsyConfigPath, brightsyInjectWorktreeMcpEnabled, brightsyMcpAllowedTools, brightsyMcpServerName, buildBrightsySessionSeed, buildCachedUserContent, buildClaudeStreamJsonUserMessage, buildCodeRefAttachment, buildDiffCommentAttachment, buildForkTranscriptAttachment, buildLinearIssueFilter, buildPastedTextAttachment, buildPathRefAttachment, buildReviewRequestAttachment, buildSessionSeed, buildWorkspaceScriptEnv, caffeinateHoldPath, caffeinateWhileCloudConnectEnabled, caffeinateWhileRunningEnabled, caffeinateWhileSchedulesEnabled, caffeinateWhileSlackListenEnabled, callAbleTimeTool, canonicalizeRepoPath, captureLoginEnv, captureTurnBaseline, checkoutPrStackLayer, childEnvWithAppSettings, claimDesktopHost, clampGithubPrBody, clampHistoryMaxCount, clampHistoryMaxDays, classifyWorktreeColumn, claudeAdapter, claudeChromeEnabled, claudeUsageOverLimitWindows, claudeUserSettingsPath, cleanupArchivedHistory, cleanupOrphanWorktrees, clearAgentDoneCustomSoundFile, clearBoardPins, clearHomeBoardCache, clipAgentEventForPaint, clipThinkingForStore, cloneRepoIntoSideboard, codeRefRangeLabel, codexAdapter, codexSandboxWritableRootsArgs, codexUnattendedGitConfigArgs, coerceOrchestratorAgent, collectTakenTeamSlugs, commentAbleTimeTask, commentGitHubIssue, commentLinearIssue, commitAll, computeNextRunAt, conductorBundledBinDir, conductorDbPath, confirmClaudeUsageOverLimitEnabled, confirmLand, connectBrightsyTeam, connectOptionalService, connectSlackToken, connectedOptionalServices, connectedPrSelectors, consumeComposerAttachments, contextTokens, coordinatorSystemPrompt, coordinatorTurnReminder, copyConfiguredFiles, countCacheControlBlocks, countUnpushedVsOrigin, cowboyModeEnabled, createAbleTimePkce, createAbleTimeTask, createChatTab, createEmptyThread, createExistingBranchWorktree, createGitHubIssue, createGlobalChat, createLinearIssue, createLinearPkce, createOrUpdatePr, createPrStack, createSchedule, createThread, createThreadWorktree, currentBranch, cursorAdapter, cursorSdkMessageToEvents, decodeBrightsyTarget, defaultScheduleName, deleteBranchOnPurgeEnabled, deleteSchedule, deleteThreadRecord, desktopHostPidPath, detectAgents, detectGhStack, detectLocalMergeConflicts, detectOptionalServiceClis, disconnectAbleTimeConnection, disconnectBrightsyTeam, disconnectLinear, disconnectLinearConnection, disconnectOptionalService, disconnectSlackWorkspace, discoverSkills, dropCachedPrefixOnResume, emptyPublicIntegrations, emptySetupLog, encodeBrightsyTarget, enrichPathWithNpmGlobalBin, enrichWorkspacesWithGithub, ensureAbleTimeAccessToken, ensureAbleTimeTask, ensureAgentPath, ensureBrightsyLocalConfigFresh, ensureBrightsyOAuthClientId, ensureCloudCoordinator, ensureConnectedBrightsyTeamTokens, ensureGhPreferOrigin, ensureGlobalCoordinatorCwd, ensureReviewGuidelinesFile, ensureReviewRequestFile, ensureReviewSkillFile, ensureSlackCoordinator, ensureSlackDeviceIdentity, ensureWorkspace, estimateMessageChars, estimateOccupancyTokens, estimateThreadChars, examplePrefixedBranch, expandComposerPrompt, extractBrightsyContextSummary, extractGhErrorDetail, extractPendingPlanQuestions, extractPresentedPlan, extractiveSummary, fastForwardMainCheckoutIfSafe, fetchOriginForWorktree, fetchPrHead, finalizeParts, findAgentDoneCustomSoundPath, findConventionSetup, findInvalidCacheControlTtlOrder, findLastBrightsyContextSummary, findLiveThreadForCreate, findLiveThreadForCreateSource, findOrphanWorktrees, findProjectProfileKey, findSlackCoordinator, findThreadByRef, findThreadForStackLayer, fireSchedule, flattenTurnInput, flipLinearRelationType, foldLegacyRolesIntoNotes, followUpBehavior, forkChatTab, forkMessageSlice, forkThreadWorktree, formatAccountProfilePlaybookLine, formatArtifactDirective, formatBrightsyFetchError, formatClaudeExtraUsageDetail, formatClaudeUsageCompact, formatClaudeUsageFetchedAt, formatClaudeUsageOverLimitConfirm, formatClaudeUsageOverLimitWait, formatClaudeUsageReset, formatClaudeUsageResetClock, formatClaudeUsageTooltip, formatDetachedJobInvoke, formatFetchError, formatGhLandError, formatGitAuthModeDirective, formatIpcInvokeError, formatIssueToolsDirective, formatIssueToolsReminder, formatLinearDirective, formatLinearReminder, formatLongRunningDirective, formatLongRunningReminder, formatMergePrError, formatMessagesAsTranscript, formatOptionalServicesDirective, formatOptionalServicesReminder, formatPlanQuestionAnswers, formatPlanQuestionsForChat, formatPrGateDirective, formatProcessGuideDirective, formatProjectProfilePlaybookLines, formatRateLimitResetHint, formatRenameBranchDirective, formatScheduleWhen, formatScheduledPrompt, formatSlackExternalReplyPrompt, formatSlackInboundPrompt, formatSlackRepliesForTurn, formatSlackReplyContinuePrompt, formatSlackSignedReply, formatSlackWorkingText, formatTranscriptMarkdown, formatUiReminder, formatViewerContextDirective, formatViewerContextReminder, formatWorkspaceInventory, formatWorkspaceProfileSuffix, formatWorktreeDirective, formatWorktreeReminder, forwardContextUsage, forwardOccupancyTokens, fromInclusiveInputUsage, getAbleTimeAccessToken, getAbleTimeHost, getAbleTimeOrientation, getAbleTimeTask, getAdapter, getAgentSetupInfo, getBrightsySession, getCaffeinateHold, getClaudePlanUsage, getDefaultAgent, getDefaultEffort, getDefaultFast, getDefaultModel, getDefaultRunScript, getDiff, getDiffSummary, getGitHubIssue, getGitHubStatus, getGithubGitAuthMode, getGithubPat, getHomeBoardInputs, getIssueSource, getLinearApiKey, getLinearAuthToken, getLinearIssue, getOrchestrator, getPr, getPrChecks, getPrDetails, getPrForHeadBranch, getPrMeta, getPrStack, getRepoSetupInfo, getRunMode, getRunScript, getSchedule, getSlackWorkspace, getWorktreeDirtyStat, gh, ghHeadRef, ghRepoSelectArgs, git, gitBranchPrefixSetting, githubAgentGitEnv, githubHttpsInsteadOfEntries, githubRelationEditFlag, globalAgentCwd, groupHomeBoardWorktrees, handleSlackInbound, harnessEnvKey, hasBakedAbleTimeOAuth, hasBakedLinearOAuth, hasBakedSlackOAuth, hasConductorHook, hasConventionSetup, hasCursorWorktreeSetup, hasEnabledSchedules, hasRepoHook, hasWorkspaceHook, healOrchestrationSoccerTitles, historyMaxCount, historyMaxDays, hottestClaudeWindow, httpFetch, importAgentDoneCustomSound, importConductorWorkspace, importConductorWorkspaceAsync, initPrStack, initStackFromThread, initializeGitRepository, inspectGitWorktree, installAgent, installNpmGlobalPackage, installOptionalServiceCli, interruptSlackCoordinatorForInbound, invalidateThreadListCache, invalidateThreadRecord, isAbleTimeConnected, isAbleTimeOAuthCancelled, isAbleTimeRejectedCredential, isAgentDoneSound, isAskUserToolName, isBrightsyConnected, isBrightsyNdjsonLine, isCloudCoordinatorThread, isConductorBundledCli, isCowboyThread, isCursorApiKeyConfigured, isCursorAutoModel, isDefaultishSourceRef, isDesktopHostAlive, isDirty, isGhPrBodyTooLongError, isGhRateLimitError, isGlobalRepoPath, isGlobalThread, isHistoryRetentionStub, isHomeBoardThread, isImageFilePath, isInPrStack, isInboundForThisDesktop, isInjectedOrchMcpName, isInternalAgentStatusText, isIssueSourceConnected, isLinearConnected, isLinearNoneToken, isLinearOAuthCancelled, isOptionalServiceId, isOrchestratorCapableAgent, isOrchestratorThread, isPidAlive, isPlaceholderBranch, isPlanQuestionAnswersMessage, isPollWrapperToolName, isPrNotMergeableError, isPresentPlanToolName, isPrimaryCheckoutThread, isSelfWrittenRecord, isSessionQuotaLimit, isSetupLastError, isShellToolName, isSideboardScratchPath, isSlackCoordinatorThread, isSlackExternalReplyPrompt, isSlackOAuthCancelled, isStaleLastErrorDuringTurn, isSubagentToolName, isThinkingEffort, isThisProcessDesktopHost, isThreadCaffeinated, isThreadRecordFile, isUnclaimedRunScriptRequest, isUsageOnLimit, isWorkspaceScratchPath, issueAttachmentForAbleTimeTask, issueMatchesAssignee, issueSourceLabel, issueTicketFromThread, killListenersOnPorts, lastAssistantMessageText, lastRequestOccupancy, latestPendingPlanQuestions, linearAuthorizationHeader, linearCycleIsActive, linearGraphql, linearOAuthAuthorizeUrl, linearOAuthCredentials, linearRelationCreateInput, linearTicketIdFromThread, listAbleTimeAssignedIssues, listAbleTimeProjects, listAbleTimeTasks, listAgentSetupInfo, listBoardPins, listBranchCommits, listBranches, listBrightsyAccounts, listBrightsyChatTargets, listCodexModels, listConductorWorkspaces, listConnectedBrightsyTeams, listCursorModels, listGitHubIssueCommentsSince, listGitHubIssues, listGlobalThreads, listIssues, listLinearAssignedIssues, listLinearCommentsSince, listLinearIssues, listLinearIssuesDirect, listLinearIssuesFiltered, listLinearTeamCycles, listLinearTeams, listModelsForAgent, listOpencodeModels, listPrs, listRunScripts, listSchedules, listSlackOutboundWatches, listSlackWorkspaces, listThreads, listWorkspaces, listWorktreeFiles, listWorktrees, liveActivitySummary, loadAppSettings, loadBrightsyConfig, loadConductorSettings, loadHomeBoardInputs, loadRepoSettings, loadWorkspaceSettings, locksDir, loginAgent, lookupSoccerTeam, mapAbleTimeTask, markPrReady, materializeSystemCaBundle, maxConcurrentAgents, maybeCompactContext, mcpAllowTools, mcpAllowToolsFromNames, mcpAuthWarnings, mcpStatusThinkingFromClaudeInit, mentionsPrGoal, mergeAgentGitAuthEnv, mergePr, mergePrStack, mergeSetupOutput, mergeSideboardIntoMcpServersJson, mergeUsage, messagePartParentId, messagesSinceLastBrightsyContextSummary, moveQueuedItemToFront, nextPastedTextName, nextThinkingEffort, nonInteractiveGitProcessEnv, normalizeAbleTimeCredential, normalizeAbleTimeHost, normalizeBrightsyEndpoint, normalizeCodeSelection, normalizeLinearRelationType, normalizeParseResult, normalizeServiceOrigin, normalizeThinkingEffort, normalizeThread, normalizeTurnInput, normalizeWorktreePath, openInSystemTerminal, openPrStackLayers, openStackLayer, opencodeAdapter, optionalServiceConnected, optionalServiceSpec, orchestrationQuotaFallbackAgent, orchestrationQuotaOnLimit, orchestrationTitleNeedsSoccerNickname, orchestratorSessionPoisonedByBuiltins, originFetchBranch, originGhRepoEnv, packagedDetachedJobPath, parseAbleTimeOAuthCallbackUrl, parseClaudeUsagePayload, parseCursorRunnerLine, parseDurationMs, parseForceStopMessage, parseGhStackViewJson, parseGitHubIssueNumber, parseGithubSlugFromRemoteUrl, parseMcpList, parsePlanQuestionsInput, parsePrDetailsView, parseSessionQuotaResetAt, parseSlackRelayClientMessage, parseSlackRelayServerMessage, partsToAssistantText, pastedTextStats, pendingSlackExternalReplies, permissionMode, persistPendingFileAttachments, persistVaultKeyInKeychain, planFileAbs, planHistoryAgePurge, planHistoryRetention, planQuestionsSignature, pollSlackOutboundWatches, posixShellSingleQuote, preferredCursorCostCents, prepareTerminalCommand, prependQueuedItem, previewLand, primaryCheckoutFromLinkedWorktree, promptMentionsBrightsy, pushBranch, readAgentDoneCustomSound, readExistingReviewRequestFile, readKeychainVaultKey, readPlanFile, readSetupLog, readSkillBody, readThread, readViewerContext, readWorktreeFile, readWorktreeFileForUpload, readWorktreeInclude, recordScheduleRun, recordSlackOutboundWatch, refreshBrightsyAccessToken, refreshGitHubAuth, registerBrightsyOAuthClient, registerPackagedUserMcpClients, releaseCaffeinateHoldForThread, releaseDesktopHost, removeBoardPin, removeQueuedItem, removeWorkspace, removeWorktree, repoSlug, requestOccupancy, requestReview, requireAgent, reservePort, reservePortRange, resetGhStackDetectCache, resetGithubAgentTokenMemo, resolveAbleTimeOAuthHost, resolveAccountProfile, resolveAccountProfileFromSettings, resolveAgentExecutable, resolveAgentGitAuthEnv, resolveClaudeExecutable, resolveCodexGitWritableRoots, resolveCommandBinarySync, resolveConductorCursorAgentId, resolveCreateFirstPrompt, resolveCursorModelId, resolveDefaultBranch, resolveDetachedJobScript, resolveDiffBaseRef, resolveEffectiveIssueSource, resolveFilesToCopy, resolveGhAuthToken, resolveGitBranchPrefix, resolveGitDirsForLockRecovery, resolveGitHubIssueRepo, resolveGithubAgentToken, resolveGithubRepoSlug, resolveLinearCycle, resolveLinearLabel, resolveLinearProject, resolveLinearState, resolveLinearTeam, resolveLoginCommand, resolveNewOrchestratorOptions, resolveNewThreadOptions, resolveOrchChildFollowUp, resolveOrchestratorDefaults, resolvePlanMarkdown, resolvePrSelector, resolvePrSelectors, resolveQuotaFallbackAgent, resolveRepoRoot, resolveReviewGuidelines, resolveScheduleThreadId, resolveSendFollowUp, resolveSidebarGitPrompt, resolveSlackListenMode, resolveThreadDefaults, resolveThreadEffort, resolveUsageOnLimit, resolveVaultKey, resolveViewerProfile, resolveViewerProfileForRepo, resolveWorktreeStartPoint, rewriteAbleTimeError, rewriteLinearError, run, runArchiveScript, runCloudConnect, runConventionSetup, runCursorWorktreeSetup, runSetupScript, runSlackListen, runSlackRelayClient, runWorkspaceSetup, sameWorktreePath, sanitizeGitBranchPrefix, sanitizeMcpServerName, saveAbleTimeConnection, saveAppSettings, saveLinearOAuth, schedulesPath, scrubGithubTokensFromChildEnv, searchAbleTimeTasks, secureFileUnlocksWith, setCaffeinateHold, setHttpFetchImpl, setStatus, setVaultMasterKey, settingsSourceLabel, shiftQueuedItem, shouldAttachPastedText, shouldCompactContext, shouldInjectBrightsyMcp, shouldRefreshReviewRequestTemplate, shouldRemoveWorktreeOnTeardown, shouldResetSessionForOccupancy, shouldRunHistoryCleanup, shouldRunWorktreeCleanup, shouldStampSetupLastError, showCostEnabled, sideboardHomeDir, sideboardMcpProfile, sideboardReposDir, sideboardWorkspacesDir, slackAppLevelToken, slackArchiveUrl, slackCoordinatorSourceRef, slackListenEnabled, slackOAuthCredentials, slackOAuthResultUrl, slackRelayUrl, slimMessagesForUiList, slimThreadForUiList, slugify, spawnAgentTurn, splitForCompaction, splitTurnInputForSystemPrompt, stackAgentDefaultsFrom, stackIdFrom, stackMergeReadiness, stageAbsolutePathsAsAttachments, stageBuffersAsAttachments, startAbleTimeOAuth, startDevServer, startLinearOAuth, startMcpServer, startOrchestration, startSlackOAuth, startSlackRelayServer, statWorktreePath, stripBrightsyNdjsonNoise, stripNestedElectronEnv, submitPrStack, suggestSlug, sumUsageList, summarizeConversation, switchBrightsyAccount, syncWorkspacesFromThreads, takePendingTurnAttachments, takenTeamSlugsForChatTab, takenTeamSlugsForOrchestration, taskMessageText, taskUrl, thinkingEffortBars, thinkingEffortLabel, thisProcessShouldDrainAgentQueues, threadDisplayLabel, threadFilePath, threadHasCompactedContext, threadLivePath, threadLockPath, threadRequestsBrightsyMcp, threadsDir, threadsSharingWorktree, ticketSlugForBranch, toAbleTimeIssueInfo, toGitHubIssueInfo, toPublicAppSettings, toolActivityLine, toolDescription, toolDetail, toolFilePath, totalTokens, trustSystemCertificates, turnCostUsdFromCursorUsage, updateAbleTimeTask, updateAdvancedSettings, updateAgentExecutable, updateAppEnvironment, updateBrightsySettings, updateClaudeSettings, updateCodexSettings, updateDefaultsSettings, updateGitHubIssue, updateIntegrationsSettings, updateLinearIssue, updateOpencodeSettings, updateProjectProfileSettings, updateSchedule, updateThread, usageOnLimit, userClaudeMcpConfigPath, userCursorMcpConfigPath, userMcpNamesToDisable, validateLinearApiKey, verifyAbleTimeConnection, verifyOptionalService, visibleToolRowDetail, waitForPidExit, warmGithubAgentAuth, whichOnPath, withEventParentId, withEventsParentId, withExportedPath, withMaxOldSpaceSize, withThreadLock, workspaceSettingsSourceLabel, worktreeBoardStatus, worktreeCleanupSettings, worktreeDisplayLabel, worktreeDisplayLabelForGroup, worktreeNameFromPath, worktreeSlugForTicket, worktreesRoot, wrapReviewSkillMarkdown, writeInjectedMcpConfig, writePlanFile, writeThread, writeViewerContext, writeWorktreeFile };