@sideboard-ai/core 0.1.228 → 0.1.230

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/dist/{abletime-D6773P33.js → abletime-BGVOCEOU.js} +4 -4
  2. package/dist/{abletime-BF253OZT.js → abletime-WZNDTRVL.js} +4 -4
  3. package/dist/{abletime-oauth-KQPVVBKA.js → abletime-oauth-6M5GWEPX.js} +3 -3
  4. package/dist/{abletime-oauth-H4672PRH.js → abletime-oauth-ZLU2EYRK.js} +3 -3
  5. package/dist/{abletime-rest-DAFPXZ7H.js → abletime-rest-F7XG5NGY.js} +3 -3
  6. package/dist/{abletime-rest-OPEVV3XC.js → abletime-rest-WNHIATB3.js} +3 -3
  7. package/dist/{agents-DV5UROWB.js → agents-ENAQHQRZ.js} +5 -5
  8. package/dist/{agents-QQ77D7VT.js → agents-TCTEAK6M.js} +5 -5
  9. package/dist/{app-settings-5RQMQKSB.js → app-settings-KBL2G7M4.js} +7 -1
  10. package/dist/{app-settings-V2BBCX2H.js → app-settings-UXWCPDEA.js} +7 -1
  11. package/dist/{chunk-NFWPDEN4.js → chunk-4CZ25DO2.js} +2 -2
  12. package/dist/{chunk-3IMSQNTS.js → chunk-4VGCG2HV.js} +17 -0
  13. package/dist/{chunk-SQHRPJ7P.js → chunk-6L25K7BE.js} +14 -4
  14. package/dist/{chunk-HSYE5ID6.js → chunk-AS4UN7QL.js} +5 -5
  15. package/dist/{chunk-3NWUHXU3.js → chunk-C774RJJA.js} +3 -3
  16. package/dist/{chunk-VUW3VKLW.js → chunk-FA4CPYCY.js} +17 -4
  17. package/dist/{chunk-CLI5DVU4.js → chunk-GHRZNPBK.js} +2 -2
  18. package/dist/{chunk-N2VST3NL.js → chunk-HZFLKVGC.js} +3 -3
  19. package/dist/{chunk-72XUASTH.js → chunk-HZLZ34FK.js} +157 -26
  20. package/dist/{chunk-EWHJNJHV.js → chunk-I5NC7DWO.js} +38 -0
  21. package/dist/{chunk-WHYJL7CP.js → chunk-JJRRLCCS.js} +156 -25
  22. package/dist/{chunk-646I442S.js → chunk-MVLXDYN5.js} +5 -5
  23. package/dist/{chunk-KTZESHYH.js → chunk-N5TX66CD.js} +2 -2
  24. package/dist/{chunk-RRW2XWAY.js → chunk-P6ZM5QJW.js} +2 -2
  25. package/dist/{chunk-THLVCXLF.js → chunk-RGNPPRZZ.js} +3 -3
  26. package/dist/{chunk-Y5JES2VV.js → chunk-RZTRWN2V.js} +38 -0
  27. package/dist/{chunk-SOGGKYFV.js → chunk-SWNEA5OZ.js} +3 -3
  28. package/dist/{chunk-P2EAAM3H.js → chunk-UNTOZA3C.js} +3 -3
  29. package/dist/{chunk-HY2GFZ5S.js → chunk-XJETIO4K.js} +17 -0
  30. package/dist/{coordinator-prompt-JLMQVORO.js → coordinator-prompt-DFXYTM6D.js} +4 -4
  31. package/dist/{coordinator-prompt-VZ7OSRLD.js → coordinator-prompt-YKLXQTWH.js} +4 -4
  32. package/dist/{global-workspace-3FDAUNN2.js → global-workspace-4SPANNJT.js} +4 -4
  33. package/dist/{global-workspace-QPSJEXGR.js → global-workspace-EYZKYHAO.js} +4 -4
  34. package/dist/index.cjs +992 -634
  35. package/dist/index.d.cts +120 -6
  36. package/dist/index.d.ts +120 -6
  37. package/dist/index.js +207 -68
  38. package/dist/mcp/run-stdio.cjs +289 -50
  39. package/dist/mcp/run-stdio.js +87 -51
  40. package/dist/{orchestrator-6XEWQWSM.js → orchestrator-HMJPNUN5.js} +8 -6
  41. package/dist/{orchestrator-QUJORSTA.js → orchestrator-ZT3SJVKF.js} +8 -6
  42. package/dist/{thread-store-KDPPXJJ3.js → thread-store-FBK5SZ5P.js} +1 -1
  43. package/dist/{thread-store-N6WQIWZ4.js → thread-store-IKJD4EOK.js} +1 -1
  44. package/dist/{workspaces-76W7IEKR.js → workspaces-73Y7IJY2.js} +4 -4
  45. package/dist/{workspaces-TDBA64II.js → workspaces-FQCSCTNH.js} +4 -4
  46. package/dist/{worktree-7V67XTEO.js → worktree-36VEFUJN.js} +3 -3
  47. package/dist/{worktree-I573UOPD.js → worktree-DOPRKG7K.js} +3 -3
  48. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -20,7 +20,7 @@ import {
20
20
  parseAbleTimeOAuthCallbackUrl,
21
21
  resolveAbleTimeOAuthHost,
22
22
  startAbleTimeOAuth
23
- } from "./chunk-3NWUHXU3.js";
23
+ } from "./chunk-C774RJJA.js";
24
24
  import {
25
25
  ableTimeDependencyTarget,
26
26
  commentAbleTimeTask,
@@ -38,8 +38,8 @@ import {
38
38
  toAbleTimeIssueInfo,
39
39
  updateAbleTimeTask,
40
40
  verifyAbleTimeConnection
41
- } from "./chunk-SOGGKYFV.js";
42
- import "./chunk-RRW2XWAY.js";
41
+ } from "./chunk-SWNEA5OZ.js";
42
+ import "./chunk-P6ZM5QJW.js";
43
43
  import {
44
44
  ABLETIME_MCP_PATH,
45
45
  ABLETIME_MCP_PM_PATH,
@@ -60,7 +60,7 @@ import {
60
60
  normalizeAbleTimeCredential,
61
61
  normalizeAbleTimeHost,
62
62
  rewriteAbleTimeError
63
- } from "./chunk-646I442S.js";
63
+ } from "./chunk-MVLXDYN5.js";
64
64
  import {
65
65
  AGENT_GIT_ACTIONS,
66
66
  BOARD_COLUMN_DEFS,
@@ -92,6 +92,7 @@ import {
92
92
  REVIEW_REQUEST_TEMPLATE,
93
93
  REVIEW_SKILL_NAME,
94
94
  REVIEW_SKILL_PATH,
95
+ RUN_SCRIPT_DESKTOP_ADOPT_MS,
95
96
  SEED_FULL_TOOL_MESSAGES,
96
97
  SEED_MAX_CHARS,
97
98
  SESSION_RESET_OCCUPANCY_TOKENS,
@@ -218,6 +219,7 @@ import {
218
219
  isSlackExternalReplyPrompt,
219
220
  isStaleLastErrorDuringTurn,
220
221
  isThisProcessDesktopHost,
222
+ isUnclaimedRunScriptRequest,
221
223
  issueNeedsWorkspacePick,
222
224
  issueTicketFromThread,
223
225
  killListenersOnPorts,
@@ -321,7 +323,7 @@ import {
321
323
  worktreeCleanupSettings,
322
324
  wrapReviewSkillMarkdown,
323
325
  writeWorktreeFile
324
- } from "./chunk-72XUASTH.js";
326
+ } from "./chunk-HZLZ34FK.js";
325
327
  import {
326
328
  LEGACY_PLAN_FILE_REL,
327
329
  PLAN_FILE_NAME,
@@ -438,7 +440,7 @@ import {
438
440
  withEventParentId,
439
441
  withEventsParentId,
440
442
  writeInjectedMcpConfig
441
- } from "./chunk-VUW3VKLW.js";
443
+ } from "./chunk-FA4CPYCY.js";
442
444
  import {
443
445
  CLOUD_COORDINATOR_BUSY_REPLY,
444
446
  CLOUD_COORDINATOR_STOPPED_REPLY,
@@ -482,7 +484,7 @@ import {
482
484
  stageBuffersAsAttachments,
483
485
  syncWorkspacesFromThreads,
484
486
  takenTeamSlugsForOrchestration
485
- } from "./chunk-N2VST3NL.js";
487
+ } from "./chunk-HZFLKVGC.js";
486
488
  import {
487
489
  FAMOUS_SOCCER_TEAMS,
488
490
  GITHUB_PR_BODY_MAX_CHARS,
@@ -580,7 +582,7 @@ import {
580
582
  worktreeDisplayLabelForGroup,
581
583
  worktreeNameFromPath,
582
584
  worktreeSlugForTicket
583
- } from "./chunk-KTZESHYH.js";
585
+ } from "./chunk-N5TX66CD.js";
584
586
  import {
585
587
  ATTACHMENTS_DIR,
586
588
  CLI_DIR,
@@ -633,6 +635,7 @@ import {
633
635
  withMaxOldSpaceSize
634
636
  } from "./chunk-TQBUXKIB.js";
635
637
  import {
638
+ AGENT_DONE_SOUNDS,
636
639
  FOLLOW_UP_BEHAVIORS,
637
640
  GITHUB_GIT_AUTH_MODES,
638
641
  HARNESS_ENV_KEYS,
@@ -646,6 +649,7 @@ import {
646
649
  ORCHESTRATOR_AGENT_KINDS,
647
650
  PROFILE_NOTES_MAX,
648
651
  USAGE_ON_LIMIT_VALUES,
652
+ agentDoneSound,
649
653
  appSettingsPath,
650
654
  applyAppEnvironment,
651
655
  applyTurnUsage,
@@ -700,6 +704,7 @@ import {
700
704
  historyMaxCount,
701
705
  historyMaxDays,
702
706
  isAbleTimeConnected,
707
+ isAgentDoneSound,
703
708
  isHistoryRetentionStub,
704
709
  isIssueSourceConnected,
705
710
  isLinearConnected,
@@ -753,7 +758,7 @@ import {
753
758
  updateProjectProfileSettings,
754
759
  usageOnLimit,
755
760
  writeViewerContext
756
- } from "./chunk-EWHJNJHV.js";
761
+ } from "./chunk-I5NC7DWO.js";
757
762
  import {
758
763
  examplePrefixedBranch,
759
764
  resolveGitBranchPrefix,
@@ -784,7 +789,7 @@ import {
784
789
  updateThread,
785
790
  withThreadLock,
786
791
  writeThread
787
- } from "./chunk-3IMSQNTS.js";
792
+ } from "./chunk-4VGCG2HV.js";
788
793
  import "./chunk-7J72QJOM.js";
789
794
  import {
790
795
  THINKING_EFFORTS,
@@ -840,6 +845,92 @@ import {
840
845
  stripNestedElectronEnv
841
846
  } from "./chunk-4TR3HZFT.js";
842
847
 
848
+ // src/store/agent-done-sound.ts
849
+ import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync } from "fs";
850
+ import { basename, extname, join } from "path";
851
+ var AGENT_DONE_CUSTOM_SOUND_MAX_BYTES = 5 * 1024 * 1024;
852
+ var AUDIO_EXT_MIME = {
853
+ ".mp3": "audio/mpeg",
854
+ ".wav": "audio/wav",
855
+ ".ogg": "audio/ogg",
856
+ ".m4a": "audio/mp4",
857
+ ".aac": "audio/aac",
858
+ ".caf": "audio/x-caf",
859
+ ".flac": "audio/flac"
860
+ };
861
+ var AGENT_DONE_CUSTOM_SOUND_EXTENSIONS = Object.keys(AUDIO_EXT_MIME);
862
+ function agentDoneSoundsDir() {
863
+ const dir = join(appDataDir(), "sounds");
864
+ mkdirSync(dir, { recursive: true });
865
+ return dir;
866
+ }
867
+ function normalizeExt(ext) {
868
+ const e = ext.trim().toLowerCase();
869
+ return e.startsWith(".") ? e : `.${e}`;
870
+ }
871
+ function agentDoneCustomSoundMime(extOrPath) {
872
+ const ext = normalizeExt(extname(extOrPath) || extOrPath);
873
+ return AUDIO_EXT_MIME[ext] ?? null;
874
+ }
875
+ function findAgentDoneCustomSoundPath() {
876
+ const dir = agentDoneSoundsDir();
877
+ for (const name of readdirSync(dir)) {
878
+ if (!name.startsWith("agent-done.")) continue;
879
+ const full = join(dir, name);
880
+ if (existsSync(full) && agentDoneCustomSoundMime(name)) return full;
881
+ }
882
+ return null;
883
+ }
884
+ function clearAgentDoneCustomSoundFile() {
885
+ const dir = agentDoneSoundsDir();
886
+ for (const name of readdirSync(dir)) {
887
+ if (!name.startsWith("agent-done.")) continue;
888
+ try {
889
+ unlinkSync(join(dir, name));
890
+ } catch {
891
+ }
892
+ }
893
+ }
894
+ function importAgentDoneCustomSound(sourcePath) {
895
+ const trimmed = sourcePath.trim();
896
+ if (!trimmed || !existsSync(trimmed)) {
897
+ throw new Error("Sound file not found");
898
+ }
899
+ const ext = normalizeExt(extname(trimmed));
900
+ const mime = AUDIO_EXT_MIME[ext];
901
+ if (!mime) {
902
+ throw new Error(
903
+ `Unsupported audio type (use ${AGENT_DONE_CUSTOM_SOUND_EXTENSIONS.join(", ")})`
904
+ );
905
+ }
906
+ const data = readFileSync(trimmed);
907
+ if (data.byteLength === 0) throw new Error("Sound file is empty");
908
+ if (data.byteLength > AGENT_DONE_CUSTOM_SOUND_MAX_BYTES) {
909
+ throw new Error("Sound file is too large (max 5 MB)");
910
+ }
911
+ clearAgentDoneCustomSoundFile();
912
+ const dest = join(agentDoneSoundsDir(), `agent-done${ext}`);
913
+ copyFileSync(trimmed, dest);
914
+ return {
915
+ name: basename(trimmed),
916
+ path: dest,
917
+ mime
918
+ };
919
+ }
920
+ function readAgentDoneCustomSound(displayName) {
921
+ const path2 = findAgentDoneCustomSoundPath();
922
+ if (!path2) return null;
923
+ const mime = agentDoneCustomSoundMime(path2);
924
+ if (!mime) return null;
925
+ const data = readFileSync(path2);
926
+ if (data.byteLength === 0) return null;
927
+ return {
928
+ name: displayName?.trim() || basename(path2),
929
+ mime,
930
+ dataBase64: data.toString("base64")
931
+ };
932
+ }
933
+
843
934
  // src/store/thread-list.ts
844
935
  var LIST_PREVIEW_MAX = 480;
845
936
  function slimThreadForUiList(thread) {
@@ -3161,7 +3252,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3161
3252
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3162
3253
  import { z as z9 } from "zod";
3163
3254
  import { randomUUID as randomUUID3 } from "crypto";
3164
- import { basename } from "path";
3255
+ import { basename as basename2 } from "path";
3165
3256
 
3166
3257
  // src/mcp/archive-guard.ts
3167
3258
  function mcpArchiveBlockedReason(thread) {
@@ -3171,6 +3262,20 @@ function mcpArchiveBlockedReason(thread) {
3171
3262
  return null;
3172
3263
  }
3173
3264
 
3265
+ // src/mcp/run-script-ref.ts
3266
+ function resolveRunScriptThreadRef(ref) {
3267
+ const explicit = ref?.trim();
3268
+ if (explicit) return explicit;
3269
+ const siblings = threadsSharingWorktree(process.cwd());
3270
+ const thread = siblings[0];
3271
+ if (!thread) {
3272
+ throw new Error(
3273
+ "No Sideboard thread for this cwd. Pass ref (thread id), or call from a worktree chat."
3274
+ );
3275
+ }
3276
+ return thread.id;
3277
+ }
3278
+
3174
3279
  // src/mcp/thread-visibility.ts
3175
3280
  function lastMessagePreview(messages, max = 160) {
3176
3281
  if (!messages?.length) return null;
@@ -4842,23 +4947,23 @@ function registerScheduleTools(server) {
4842
4947
  }
4843
4948
 
4844
4949
  // src/board/load-home-board.ts
4845
- import { existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync as readFileSync2, unlinkSync as unlinkSync2, writeFileSync as writeFileSync2 } from "fs";
4846
- import { join as join2 } from "path";
4950
+ import { existsSync as existsSync3, mkdirSync as mkdirSync3, readFileSync as readFileSync3, unlinkSync as unlinkSync3, writeFileSync as writeFileSync2 } from "fs";
4951
+ import { join as join3 } from "path";
4847
4952
 
4848
4953
  // src/board/board-pins.ts
4849
4954
  import { randomUUID as randomUUID2 } from "crypto";
4850
- import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "fs";
4851
- import { join } from "path";
4955
+ import { existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync as readFileSync2, unlinkSync as unlinkSync2, writeFileSync } from "fs";
4956
+ import { join as join2 } from "path";
4852
4957
  var FILE = "home-board-pins.json";
4853
4958
  var VERSION = 1;
4854
4959
  function pinsFile() {
4855
- return join(appDataDir(), FILE);
4960
+ return join2(appDataDir(), FILE);
4856
4961
  }
4857
4962
  function readDisk() {
4858
4963
  const path2 = pinsFile();
4859
- if (!existsSync(path2)) return [];
4964
+ if (!existsSync2(path2)) return [];
4860
4965
  try {
4861
- const raw = JSON.parse(readFileSync(path2, "utf8"));
4966
+ const raw = JSON.parse(readFileSync2(path2, "utf8"));
4862
4967
  if (raw?.version !== VERSION || !Array.isArray(raw.items)) return [];
4863
4968
  return raw.items.filter((item) => item?.id && item.kind && item.ref);
4864
4969
  } catch {
@@ -4866,7 +4971,7 @@ function readDisk() {
4866
4971
  }
4867
4972
  }
4868
4973
  function writeDisk(items) {
4869
- mkdirSync(appDataDir(), { recursive: true });
4974
+ mkdirSync2(appDataDir(), { recursive: true });
4870
4975
  writeFileSync(pinsFile(), JSON.stringify({ version: VERSION, items }, null, 2), "utf8");
4871
4976
  }
4872
4977
  function listBoardPins() {
@@ -4919,7 +5024,7 @@ function replaceBoardPins(items) {
4919
5024
  }
4920
5025
  function clearBoardPins() {
4921
5026
  try {
4922
- unlinkSync(pinsFile());
5027
+ unlinkSync2(pinsFile());
4923
5028
  } catch {
4924
5029
  }
4925
5030
  }
@@ -4935,7 +5040,7 @@ function homeBoardWorkspaceKey(workspaces) {
4935
5040
  return workspaces.map((w) => w.path).filter(Boolean).sort().join("\n");
4936
5041
  }
4937
5042
  function cacheFile() {
4938
- return join2(appDataDir(), "home-board-cache.json");
5043
+ return join3(appDataDir(), "home-board-cache.json");
4939
5044
  }
4940
5045
  function emptyInputs() {
4941
5046
  return {
@@ -4961,9 +5066,9 @@ function shouldCacheHomeBoardInputs(inputs) {
4961
5066
  }
4962
5067
  function readDiskCache() {
4963
5068
  const path2 = cacheFile();
4964
- if (!existsSync2(path2)) return null;
5069
+ if (!existsSync3(path2)) return null;
4965
5070
  try {
4966
- const raw = JSON.parse(readFileSync2(path2, "utf8"));
5071
+ const raw = JSON.parse(readFileSync3(path2, "utf8"));
4967
5072
  if (raw?.version !== CACHE_VERSION || typeof raw.fetchedAt !== "number") {
4968
5073
  return null;
4969
5074
  }
@@ -4977,14 +5082,14 @@ function readDiskCache() {
4977
5082
  }
4978
5083
  function writeDiskCache(entry) {
4979
5084
  try {
4980
- mkdirSync2(appDataDir(), { recursive: true });
5085
+ mkdirSync3(appDataDir(), { recursive: true });
4981
5086
  writeFileSync2(cacheFile(), JSON.stringify(entry), "utf8");
4982
5087
  } catch {
4983
5088
  }
4984
5089
  }
4985
5090
  function deleteDiskCache() {
4986
5091
  try {
4987
- unlinkSync2(cacheFile());
5092
+ unlinkSync3(cacheFile());
4988
5093
  } catch {
4989
5094
  }
4990
5095
  }
@@ -5275,7 +5380,7 @@ async function startMcpServer() {
5275
5380
  );
5276
5381
  }
5277
5382
  try {
5278
- const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-V2BBCX2H.js");
5383
+ const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-UXWCPDEA.js");
5279
5384
  orch.setMaxConcurrent(maxConcurrentAgents2());
5280
5385
  } catch {
5281
5386
  }
@@ -5330,7 +5435,7 @@ async function startMcpServer() {
5330
5435
  async () => {
5331
5436
  const threads = orch.getThreads(true);
5332
5437
  const lines = threads.map((t) => {
5333
- const repo = t.repoPath === GLOBAL_WORKSPACE_ID ? "Orchestration" : basename(t.repoPath) || t.repoPath;
5438
+ const repo = t.repoPath === GLOBAL_WORKSPACE_ID ? "Orchestration" : basename2(t.repoPath) || t.repoPath;
5334
5439
  const live = orch.threadLooksLive(t) ? readTurnLive(t.id) : null;
5335
5440
  const parent = t.parentThreadId ? ` parent:${t.parentThreadId.slice(0, 8)}` : "";
5336
5441
  const preview = lastMessagePreview(t.messages, 80);
@@ -5578,19 +5683,79 @@ async function startMcpServer() {
5578
5683
  "Stop a detached job you started with detached-job.cjs when it is hanging, producing no useful output, buffering forever, or doing the wrong thing (wrong project, infinite watch, huge dump). Do not stop a pack/test/deploy that is clearly making progress. The type=log pane updates to status=failed with the last delta. Then decide the next step.",
5579
5684
  {
5580
5685
  id: z9.string().describe("Detached job id (same kebab-case id passed to detached-job.cjs start)"),
5581
- reason: z9.string().optional().describe("Why you are stopping (hanging, no progress, wrong output, already have the error)")
5686
+ reason: z9.string().optional().describe("Why you are stopping (hanging, no progress, wrong output, already have the answer)")
5582
5687
  },
5583
5688
  async ({ id, reason }) => {
5584
5689
  const result = await stopDetachedJob(process.cwd(), id, { reason });
5585
5690
  return mcpJson(result);
5586
5691
  }
5587
5692
  );
5693
+ server.tool(
5694
+ "list_run_scripts",
5695
+ "List .sideboard/.conductor run scripts for this thread (same menu as the desktop Dev button) and which are active. Worktree turns may omit ref (uses cwd).",
5696
+ {
5697
+ ref: z9.string().optional().describe("Thread id. Omit on a worktree turn (uses cwd).")
5698
+ },
5699
+ async ({ ref }) => {
5700
+ try {
5701
+ const threadRef = resolveRunScriptThreadRef(ref);
5702
+ const scripts = orch.listThreadRunScripts(threadRef);
5703
+ const active = orch.getActiveRuns(threadRef);
5704
+ return mcpJson({ scripts, active, ref: threadRef });
5705
+ } catch (err) {
5706
+ const message = err instanceof Error ? err.message : String(err);
5707
+ return { content: [{ type: "text", text: message }], isError: true };
5708
+ }
5709
+ }
5710
+ );
5711
+ server.tool(
5712
+ "run_dev_script",
5713
+ "Start a .sideboard/.conductor run script (same as the desktop Dev / play button). Logs and Stop appear in the thread UI \u2014 do not detached-job or shell-spawn the same command. Returns the allocated port. Worktree turns may omit ref (uses cwd). Omit name for the default script.",
5714
+ {
5715
+ ref: z9.string().optional().describe("Thread id. Omit on a worktree turn (uses cwd)."),
5716
+ name: z9.string().optional().describe("Script name from list_run_scripts (default script if omitted).")
5717
+ },
5718
+ async ({ ref, name }) => {
5719
+ try {
5720
+ const threadRef = resolveRunScriptThreadRef(ref);
5721
+ const result = await orch.startDev(threadRef, name);
5722
+ return mcpJson({
5723
+ port: result.port,
5724
+ scriptName: result.scriptName,
5725
+ ports: result.ports,
5726
+ url: `http://localhost:${result.port}`,
5727
+ ref: threadRef
5728
+ });
5729
+ } catch (err) {
5730
+ const message = err instanceof Error ? err.message : String(err);
5731
+ return { content: [{ type: "text", text: message }], isError: true };
5732
+ }
5733
+ }
5734
+ );
5735
+ server.tool(
5736
+ "stop_dev_script",
5737
+ "Stop a run script started with run_dev_script or the desktop Dev button (same as UI Stop). Omit name to stop all scripts on this worktree. Worktree turns may omit ref (uses cwd).",
5738
+ {
5739
+ ref: z9.string().optional().describe("Thread id. Omit on a worktree turn (uses cwd)."),
5740
+ name: z9.string().optional().describe("Script name to stop; omit to stop all active scripts.")
5741
+ },
5742
+ async ({ ref, name }) => {
5743
+ try {
5744
+ const threadRef = resolveRunScriptThreadRef(ref);
5745
+ await orch.stopDev(threadRef, name);
5746
+ return mcpJson({ ok: true, ref: threadRef, stopped: name ?? "all" });
5747
+ } catch (err) {
5748
+ const message = err instanceof Error ? err.message : String(err);
5749
+ return { content: [{ type: "text", text: message }], isError: true };
5750
+ }
5751
+ }
5752
+ );
5588
5753
  if (!worktreeProfile) {
5589
5754
  registerSlackTools(server);
5590
5755
  registerConnectedIssueVendorTools(server);
5591
5756
  registerScheduleTools(server);
5592
5757
  const { getCaffeinateHold: getCaffeinateHold2, setCaffeinateHold: setCaffeinateHold2 } = await import("./caffeinate-hold-22VFDPSO.js");
5593
- const { resolveNewThreadOptions: resolveNewThreadOptions2, resolveThreadDefaults: resolveThreadDefaults2 } = await import("./app-settings-V2BBCX2H.js");
5758
+ const { resolveNewThreadOptions: resolveNewThreadOptions2, resolveThreadDefaults: resolveThreadDefaults2 } = await import("./app-settings-UXWCPDEA.js");
5594
5759
  const accountDefaults = resolveThreadDefaults2();
5595
5760
  const accountDefaultsHint = `Account defaults: agent=${accountDefaults.agent}, model=${accountDefaults.model?.trim() || "Auto"}, effort=${accountDefaults.effort}`;
5596
5761
  server.tool(
@@ -6063,45 +6228,6 @@ async function startMcpServer() {
6063
6228
  }
6064
6229
  }
6065
6230
  );
6066
- server.tool(
6067
- "run_dev_script",
6068
- "Start a .sideboard/.conductor run script for a thread (default script if name omitted); returns port",
6069
- {
6070
- ref: z9.string(),
6071
- name: z9.string().optional()
6072
- },
6073
- async ({ ref, name }) => {
6074
- const result = await orch.startDev(ref, name);
6075
- return mcpJson({
6076
- port: result.port,
6077
- scriptName: result.scriptName,
6078
- ports: result.ports,
6079
- url: `http://localhost:${result.port}`
6080
- });
6081
- }
6082
- );
6083
- server.tool(
6084
- "list_run_scripts",
6085
- "List named run scripts available for a thread",
6086
- { ref: z9.string() },
6087
- async ({ ref }) => {
6088
- const scripts = orch.listThreadRunScripts(ref);
6089
- const active = orch.getActiveRuns(ref);
6090
- return mcpJson({ scripts, active });
6091
- }
6092
- );
6093
- server.tool(
6094
- "stop_dev_script",
6095
- "Stop a running script for a thread (all scripts if name omitted)",
6096
- {
6097
- ref: z9.string(),
6098
- name: z9.string().optional()
6099
- },
6100
- async ({ ref, name }) => {
6101
- orch.stopDev(ref, name);
6102
- return { content: [{ type: "text", text: "ok" }] };
6103
- }
6104
- );
6105
6231
  server.tool(
6106
6232
  "run_setup",
6107
6233
  "Re-run workspace setup (Sideboard/Conductor settings, .cursor/worktrees.json, or script/setup). New worktrees already run this automatically.",
@@ -8589,6 +8715,9 @@ export {
8589
8715
  ABLETIME_ORG_KEY_PREFIX,
8590
8716
  ABLETIME_PAT_PREFIX,
8591
8717
  ABLETIME_PM_TOOL_NAMES,
8718
+ AGENT_DONE_CUSTOM_SOUND_EXTENSIONS,
8719
+ AGENT_DONE_CUSTOM_SOUND_MAX_BYTES,
8720
+ AGENT_DONE_SOUNDS,
8592
8721
  AGENT_GIT_ACTIONS,
8593
8722
  AGENT_RUNNER_MAX_OLD_SPACE_MB,
8594
8723
  ATTACHMENTS_DIR,
@@ -8668,6 +8797,7 @@ export {
8668
8797
  REVIEW_REQUEST_TEMPLATE,
8669
8798
  REVIEW_SKILL_NAME,
8670
8799
  REVIEW_SKILL_PATH,
8800
+ RUN_SCRIPT_DESKTOP_ADOPT_MS,
8671
8801
  SEED_FULL_TOOL_MESSAGES,
8672
8802
  SEED_MAX_CHARS,
8673
8803
  SESSION_RESET_OCCUPANCY_TOKENS,
@@ -8711,6 +8841,9 @@ export {
8711
8841
  addStackLayerFromThread,
8712
8842
  addWorkspace,
8713
8843
  adoptThread,
8844
+ agentDoneCustomSoundMime,
8845
+ agentDoneSound,
8846
+ agentDoneSoundsDir,
8714
8847
  agentGitPrompt,
8715
8848
  alignQueueAttachments,
8716
8849
  allAdapters,
@@ -8789,6 +8922,7 @@ export {
8789
8922
  claudeUserSettingsPath,
8790
8923
  cleanupArchivedHistory,
8791
8924
  cleanupOrphanWorktrees,
8925
+ clearAgentDoneCustomSoundFile,
8792
8926
  clearBoardPins,
8793
8927
  clearHomeBoardCache,
8794
8928
  clipAgentEventForPaint,
@@ -8891,6 +9025,7 @@ export {
8891
9025
  fetchOriginForWorktree,
8892
9026
  fetchPrHead,
8893
9027
  finalizeParts,
9028
+ findAgentDoneCustomSoundPath,
8894
9029
  findConventionSetup,
8895
9030
  findInvalidCacheControlTtlOrder,
8896
9031
  findLastBrightsyContextSummary,
@@ -9025,6 +9160,7 @@ export {
9025
9160
  historyMaxDays,
9026
9161
  hottestClaudeWindow,
9027
9162
  httpFetch,
9163
+ importAgentDoneCustomSound,
9028
9164
  importConductorWorkspace,
9029
9165
  importConductorWorkspaceAsync,
9030
9166
  initPrStack,
@@ -9040,6 +9176,7 @@ export {
9040
9176
  isAbleTimeConnected,
9041
9177
  isAbleTimeOAuthCancelled,
9042
9178
  isAbleTimeRejectedCredential,
9179
+ isAgentDoneSound,
9043
9180
  isAskUserToolName,
9044
9181
  isBrightsyConnected,
9045
9182
  isBrightsyNdjsonLine,
@@ -9090,6 +9227,7 @@ export {
9090
9227
  isThisProcessDesktopHost,
9091
9228
  isThreadCaffeinated,
9092
9229
  isThreadRecordFile,
9230
+ isUnclaimedRunScriptRequest,
9093
9231
  isUsageOnLimit,
9094
9232
  isWorkspaceScratchPath,
9095
9233
  issueAttachmentForAbleTimeTask,
@@ -9231,6 +9369,7 @@ export {
9231
9369
  primaryCheckoutFromLinkedWorktree,
9232
9370
  promptMentionsBrightsy,
9233
9371
  pushBranch,
9372
+ readAgentDoneCustomSound,
9234
9373
  readExistingReviewRequestFile,
9235
9374
  readKeychainVaultKey,
9236
9375
  readPlanFile,