@sideboard-ai/core 0.1.228 → 0.1.229

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 (44) 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-B7G4BQTS.js} +4 -4
  8. package/dist/{agents-QQ77D7VT.js → agents-ZKP7QNXA.js} +4 -4
  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-WHYJL7CP.js → chunk-6HKGCUDN.js} +24 -22
  12. package/dist/{chunk-N2VST3NL.js → chunk-7YKXBFQE.js} +2 -2
  13. package/dist/{chunk-KTZESHYH.js → chunk-AMMRFFB7.js} +1 -1
  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-NFWPDEN4.js → chunk-F3GT6DQW.js} +1 -1
  17. package/dist/{chunk-CLI5DVU4.js → chunk-GHRZNPBK.js} +2 -2
  18. package/dist/{chunk-EWHJNJHV.js → chunk-I5NC7DWO.js} +38 -0
  19. package/dist/{chunk-VUW3VKLW.js → chunk-LULHFLPU.js} +17 -4
  20. package/dist/{chunk-646I442S.js → chunk-MVLXDYN5.js} +5 -5
  21. package/dist/{chunk-P2EAAM3H.js → chunk-N7UXGM3Y.js} +2 -2
  22. package/dist/{chunk-RRW2XWAY.js → chunk-P6ZM5QJW.js} +2 -2
  23. package/dist/{chunk-THLVCXLF.js → chunk-RGNPPRZZ.js} +3 -3
  24. package/dist/{chunk-Y5JES2VV.js → chunk-RZTRWN2V.js} +38 -0
  25. package/dist/{chunk-SOGGKYFV.js → chunk-SWNEA5OZ.js} +3 -3
  26. package/dist/{chunk-SQHRPJ7P.js → chunk-T7Y5ULHM.js} +14 -4
  27. package/dist/{chunk-72XUASTH.js → chunk-UHT6OS7V.js} +24 -23
  28. package/dist/{coordinator-prompt-JLMQVORO.js → coordinator-prompt-DZMMCDRW.js} +3 -3
  29. package/dist/{coordinator-prompt-VZ7OSRLD.js → coordinator-prompt-RL3GKIAQ.js} +3 -3
  30. package/dist/{global-workspace-QPSJEXGR.js → global-workspace-G3QEVRGZ.js} +3 -3
  31. package/dist/{global-workspace-3FDAUNN2.js → global-workspace-QW4OXCLJ.js} +3 -3
  32. package/dist/index.cjs +820 -619
  33. package/dist/index.d.cts +68 -2
  34. package/dist/index.d.ts +68 -2
  35. package/dist/index.js +202 -67
  36. package/dist/mcp/run-stdio.cjs +131 -44
  37. package/dist/mcp/run-stdio.js +86 -50
  38. package/dist/{orchestrator-6XEWQWSM.js → orchestrator-GKAHLGXT.js} +5 -5
  39. package/dist/{orchestrator-QUJORSTA.js → orchestrator-X4VFA5WW.js} +5 -5
  40. package/dist/{workspaces-76W7IEKR.js → workspaces-77C5XQEY.js} +3 -3
  41. package/dist/{workspaces-TDBA64II.js → workspaces-WXRPLT2N.js} +3 -3
  42. package/dist/{worktree-I573UOPD.js → worktree-L6FJXFUC.js} +2 -2
  43. package/dist/{worktree-7V67XTEO.js → worktree-P67WAJKH.js} +2 -2
  44. 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,
@@ -321,7 +321,7 @@ import {
321
321
  worktreeCleanupSettings,
322
322
  wrapReviewSkillMarkdown,
323
323
  writeWorktreeFile
324
- } from "./chunk-72XUASTH.js";
324
+ } from "./chunk-UHT6OS7V.js";
325
325
  import {
326
326
  LEGACY_PLAN_FILE_REL,
327
327
  PLAN_FILE_NAME,
@@ -438,7 +438,7 @@ import {
438
438
  withEventParentId,
439
439
  withEventsParentId,
440
440
  writeInjectedMcpConfig
441
- } from "./chunk-VUW3VKLW.js";
441
+ } from "./chunk-LULHFLPU.js";
442
442
  import {
443
443
  CLOUD_COORDINATOR_BUSY_REPLY,
444
444
  CLOUD_COORDINATOR_STOPPED_REPLY,
@@ -482,7 +482,7 @@ import {
482
482
  stageBuffersAsAttachments,
483
483
  syncWorkspacesFromThreads,
484
484
  takenTeamSlugsForOrchestration
485
- } from "./chunk-N2VST3NL.js";
485
+ } from "./chunk-7YKXBFQE.js";
486
486
  import {
487
487
  FAMOUS_SOCCER_TEAMS,
488
488
  GITHUB_PR_BODY_MAX_CHARS,
@@ -580,7 +580,7 @@ import {
580
580
  worktreeDisplayLabelForGroup,
581
581
  worktreeNameFromPath,
582
582
  worktreeSlugForTicket
583
- } from "./chunk-KTZESHYH.js";
583
+ } from "./chunk-AMMRFFB7.js";
584
584
  import {
585
585
  ATTACHMENTS_DIR,
586
586
  CLI_DIR,
@@ -633,6 +633,7 @@ import {
633
633
  withMaxOldSpaceSize
634
634
  } from "./chunk-TQBUXKIB.js";
635
635
  import {
636
+ AGENT_DONE_SOUNDS,
636
637
  FOLLOW_UP_BEHAVIORS,
637
638
  GITHUB_GIT_AUTH_MODES,
638
639
  HARNESS_ENV_KEYS,
@@ -646,6 +647,7 @@ import {
646
647
  ORCHESTRATOR_AGENT_KINDS,
647
648
  PROFILE_NOTES_MAX,
648
649
  USAGE_ON_LIMIT_VALUES,
650
+ agentDoneSound,
649
651
  appSettingsPath,
650
652
  applyAppEnvironment,
651
653
  applyTurnUsage,
@@ -700,6 +702,7 @@ import {
700
702
  historyMaxCount,
701
703
  historyMaxDays,
702
704
  isAbleTimeConnected,
705
+ isAgentDoneSound,
703
706
  isHistoryRetentionStub,
704
707
  isIssueSourceConnected,
705
708
  isLinearConnected,
@@ -753,7 +756,7 @@ import {
753
756
  updateProjectProfileSettings,
754
757
  usageOnLimit,
755
758
  writeViewerContext
756
- } from "./chunk-EWHJNJHV.js";
759
+ } from "./chunk-I5NC7DWO.js";
757
760
  import {
758
761
  examplePrefixedBranch,
759
762
  resolveGitBranchPrefix,
@@ -840,6 +843,92 @@ import {
840
843
  stripNestedElectronEnv
841
844
  } from "./chunk-4TR3HZFT.js";
842
845
 
846
+ // src/store/agent-done-sound.ts
847
+ import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, unlinkSync } from "fs";
848
+ import { basename, extname, join } from "path";
849
+ var AGENT_DONE_CUSTOM_SOUND_MAX_BYTES = 5 * 1024 * 1024;
850
+ var AUDIO_EXT_MIME = {
851
+ ".mp3": "audio/mpeg",
852
+ ".wav": "audio/wav",
853
+ ".ogg": "audio/ogg",
854
+ ".m4a": "audio/mp4",
855
+ ".aac": "audio/aac",
856
+ ".caf": "audio/x-caf",
857
+ ".flac": "audio/flac"
858
+ };
859
+ var AGENT_DONE_CUSTOM_SOUND_EXTENSIONS = Object.keys(AUDIO_EXT_MIME);
860
+ function agentDoneSoundsDir() {
861
+ const dir = join(appDataDir(), "sounds");
862
+ mkdirSync(dir, { recursive: true });
863
+ return dir;
864
+ }
865
+ function normalizeExt(ext) {
866
+ const e = ext.trim().toLowerCase();
867
+ return e.startsWith(".") ? e : `.${e}`;
868
+ }
869
+ function agentDoneCustomSoundMime(extOrPath) {
870
+ const ext = normalizeExt(extname(extOrPath) || extOrPath);
871
+ return AUDIO_EXT_MIME[ext] ?? null;
872
+ }
873
+ function findAgentDoneCustomSoundPath() {
874
+ const dir = agentDoneSoundsDir();
875
+ for (const name of readdirSync(dir)) {
876
+ if (!name.startsWith("agent-done.")) continue;
877
+ const full = join(dir, name);
878
+ if (existsSync(full) && agentDoneCustomSoundMime(name)) return full;
879
+ }
880
+ return null;
881
+ }
882
+ function clearAgentDoneCustomSoundFile() {
883
+ const dir = agentDoneSoundsDir();
884
+ for (const name of readdirSync(dir)) {
885
+ if (!name.startsWith("agent-done.")) continue;
886
+ try {
887
+ unlinkSync(join(dir, name));
888
+ } catch {
889
+ }
890
+ }
891
+ }
892
+ function importAgentDoneCustomSound(sourcePath) {
893
+ const trimmed = sourcePath.trim();
894
+ if (!trimmed || !existsSync(trimmed)) {
895
+ throw new Error("Sound file not found");
896
+ }
897
+ const ext = normalizeExt(extname(trimmed));
898
+ const mime = AUDIO_EXT_MIME[ext];
899
+ if (!mime) {
900
+ throw new Error(
901
+ `Unsupported audio type (use ${AGENT_DONE_CUSTOM_SOUND_EXTENSIONS.join(", ")})`
902
+ );
903
+ }
904
+ const data = readFileSync(trimmed);
905
+ if (data.byteLength === 0) throw new Error("Sound file is empty");
906
+ if (data.byteLength > AGENT_DONE_CUSTOM_SOUND_MAX_BYTES) {
907
+ throw new Error("Sound file is too large (max 5 MB)");
908
+ }
909
+ clearAgentDoneCustomSoundFile();
910
+ const dest = join(agentDoneSoundsDir(), `agent-done${ext}`);
911
+ copyFileSync(trimmed, dest);
912
+ return {
913
+ name: basename(trimmed),
914
+ path: dest,
915
+ mime
916
+ };
917
+ }
918
+ function readAgentDoneCustomSound(displayName) {
919
+ const path2 = findAgentDoneCustomSoundPath();
920
+ if (!path2) return null;
921
+ const mime = agentDoneCustomSoundMime(path2);
922
+ if (!mime) return null;
923
+ const data = readFileSync(path2);
924
+ if (data.byteLength === 0) return null;
925
+ return {
926
+ name: displayName?.trim() || basename(path2),
927
+ mime,
928
+ dataBase64: data.toString("base64")
929
+ };
930
+ }
931
+
843
932
  // src/store/thread-list.ts
844
933
  var LIST_PREVIEW_MAX = 480;
845
934
  function slimThreadForUiList(thread) {
@@ -3161,7 +3250,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3161
3250
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
3162
3251
  import { z as z9 } from "zod";
3163
3252
  import { randomUUID as randomUUID3 } from "crypto";
3164
- import { basename } from "path";
3253
+ import { basename as basename2 } from "path";
3165
3254
 
3166
3255
  // src/mcp/archive-guard.ts
3167
3256
  function mcpArchiveBlockedReason(thread) {
@@ -3171,6 +3260,20 @@ function mcpArchiveBlockedReason(thread) {
3171
3260
  return null;
3172
3261
  }
3173
3262
 
3263
+ // src/mcp/run-script-ref.ts
3264
+ function resolveRunScriptThreadRef(ref) {
3265
+ const explicit = ref?.trim();
3266
+ if (explicit) return explicit;
3267
+ const siblings = threadsSharingWorktree(process.cwd());
3268
+ const thread = siblings[0];
3269
+ if (!thread) {
3270
+ throw new Error(
3271
+ "No Sideboard thread for this cwd. Pass ref (thread id), or call from a worktree chat."
3272
+ );
3273
+ }
3274
+ return thread.id;
3275
+ }
3276
+
3174
3277
  // src/mcp/thread-visibility.ts
3175
3278
  function lastMessagePreview(messages, max = 160) {
3176
3279
  if (!messages?.length) return null;
@@ -4842,23 +4945,23 @@ function registerScheduleTools(server) {
4842
4945
  }
4843
4946
 
4844
4947
  // 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";
4948
+ import { existsSync as existsSync3, mkdirSync as mkdirSync3, readFileSync as readFileSync3, unlinkSync as unlinkSync3, writeFileSync as writeFileSync2 } from "fs";
4949
+ import { join as join3 } from "path";
4847
4950
 
4848
4951
  // src/board/board-pins.ts
4849
4952
  import { randomUUID as randomUUID2 } from "crypto";
4850
- import { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from "fs";
4851
- import { join } from "path";
4953
+ import { existsSync as existsSync2, mkdirSync as mkdirSync2, readFileSync as readFileSync2, unlinkSync as unlinkSync2, writeFileSync } from "fs";
4954
+ import { join as join2 } from "path";
4852
4955
  var FILE = "home-board-pins.json";
4853
4956
  var VERSION = 1;
4854
4957
  function pinsFile() {
4855
- return join(appDataDir(), FILE);
4958
+ return join2(appDataDir(), FILE);
4856
4959
  }
4857
4960
  function readDisk() {
4858
4961
  const path2 = pinsFile();
4859
- if (!existsSync(path2)) return [];
4962
+ if (!existsSync2(path2)) return [];
4860
4963
  try {
4861
- const raw = JSON.parse(readFileSync(path2, "utf8"));
4964
+ const raw = JSON.parse(readFileSync2(path2, "utf8"));
4862
4965
  if (raw?.version !== VERSION || !Array.isArray(raw.items)) return [];
4863
4966
  return raw.items.filter((item) => item?.id && item.kind && item.ref);
4864
4967
  } catch {
@@ -4866,7 +4969,7 @@ function readDisk() {
4866
4969
  }
4867
4970
  }
4868
4971
  function writeDisk(items) {
4869
- mkdirSync(appDataDir(), { recursive: true });
4972
+ mkdirSync2(appDataDir(), { recursive: true });
4870
4973
  writeFileSync(pinsFile(), JSON.stringify({ version: VERSION, items }, null, 2), "utf8");
4871
4974
  }
4872
4975
  function listBoardPins() {
@@ -4919,7 +5022,7 @@ function replaceBoardPins(items) {
4919
5022
  }
4920
5023
  function clearBoardPins() {
4921
5024
  try {
4922
- unlinkSync(pinsFile());
5025
+ unlinkSync2(pinsFile());
4923
5026
  } catch {
4924
5027
  }
4925
5028
  }
@@ -4935,7 +5038,7 @@ function homeBoardWorkspaceKey(workspaces) {
4935
5038
  return workspaces.map((w) => w.path).filter(Boolean).sort().join("\n");
4936
5039
  }
4937
5040
  function cacheFile() {
4938
- return join2(appDataDir(), "home-board-cache.json");
5041
+ return join3(appDataDir(), "home-board-cache.json");
4939
5042
  }
4940
5043
  function emptyInputs() {
4941
5044
  return {
@@ -4961,9 +5064,9 @@ function shouldCacheHomeBoardInputs(inputs) {
4961
5064
  }
4962
5065
  function readDiskCache() {
4963
5066
  const path2 = cacheFile();
4964
- if (!existsSync2(path2)) return null;
5067
+ if (!existsSync3(path2)) return null;
4965
5068
  try {
4966
- const raw = JSON.parse(readFileSync2(path2, "utf8"));
5069
+ const raw = JSON.parse(readFileSync3(path2, "utf8"));
4967
5070
  if (raw?.version !== CACHE_VERSION || typeof raw.fetchedAt !== "number") {
4968
5071
  return null;
4969
5072
  }
@@ -4977,14 +5080,14 @@ function readDiskCache() {
4977
5080
  }
4978
5081
  function writeDiskCache(entry) {
4979
5082
  try {
4980
- mkdirSync2(appDataDir(), { recursive: true });
5083
+ mkdirSync3(appDataDir(), { recursive: true });
4981
5084
  writeFileSync2(cacheFile(), JSON.stringify(entry), "utf8");
4982
5085
  } catch {
4983
5086
  }
4984
5087
  }
4985
5088
  function deleteDiskCache() {
4986
5089
  try {
4987
- unlinkSync2(cacheFile());
5090
+ unlinkSync3(cacheFile());
4988
5091
  } catch {
4989
5092
  }
4990
5093
  }
@@ -5275,7 +5378,7 @@ async function startMcpServer() {
5275
5378
  );
5276
5379
  }
5277
5380
  try {
5278
- const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-V2BBCX2H.js");
5381
+ const { maxConcurrentAgents: maxConcurrentAgents2 } = await import("./app-settings-UXWCPDEA.js");
5279
5382
  orch.setMaxConcurrent(maxConcurrentAgents2());
5280
5383
  } catch {
5281
5384
  }
@@ -5330,7 +5433,7 @@ async function startMcpServer() {
5330
5433
  async () => {
5331
5434
  const threads = orch.getThreads(true);
5332
5435
  const lines = threads.map((t) => {
5333
- const repo = t.repoPath === GLOBAL_WORKSPACE_ID ? "Orchestration" : basename(t.repoPath) || t.repoPath;
5436
+ const repo = t.repoPath === GLOBAL_WORKSPACE_ID ? "Orchestration" : basename2(t.repoPath) || t.repoPath;
5334
5437
  const live = orch.threadLooksLive(t) ? readTurnLive(t.id) : null;
5335
5438
  const parent = t.parentThreadId ? ` parent:${t.parentThreadId.slice(0, 8)}` : "";
5336
5439
  const preview = lastMessagePreview(t.messages, 80);
@@ -5578,19 +5681,79 @@ async function startMcpServer() {
5578
5681
  "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
5682
  {
5580
5683
  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)")
5684
+ reason: z9.string().optional().describe("Why you are stopping (hanging, no progress, wrong output, already have the answer)")
5582
5685
  },
5583
5686
  async ({ id, reason }) => {
5584
5687
  const result = await stopDetachedJob(process.cwd(), id, { reason });
5585
5688
  return mcpJson(result);
5586
5689
  }
5587
5690
  );
5691
+ server.tool(
5692
+ "list_run_scripts",
5693
+ "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).",
5694
+ {
5695
+ ref: z9.string().optional().describe("Thread id. Omit on a worktree turn (uses cwd).")
5696
+ },
5697
+ async ({ ref }) => {
5698
+ try {
5699
+ const threadRef = resolveRunScriptThreadRef(ref);
5700
+ const scripts = orch.listThreadRunScripts(threadRef);
5701
+ const active = orch.getActiveRuns(threadRef);
5702
+ return mcpJson({ scripts, active, ref: threadRef });
5703
+ } catch (err) {
5704
+ const message = err instanceof Error ? err.message : String(err);
5705
+ return { content: [{ type: "text", text: message }], isError: true };
5706
+ }
5707
+ }
5708
+ );
5709
+ server.tool(
5710
+ "run_dev_script",
5711
+ "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.",
5712
+ {
5713
+ ref: z9.string().optional().describe("Thread id. Omit on a worktree turn (uses cwd)."),
5714
+ name: z9.string().optional().describe("Script name from list_run_scripts (default script if omitted).")
5715
+ },
5716
+ async ({ ref, name }) => {
5717
+ try {
5718
+ const threadRef = resolveRunScriptThreadRef(ref);
5719
+ const result = await orch.startDev(threadRef, name);
5720
+ return mcpJson({
5721
+ port: result.port,
5722
+ scriptName: result.scriptName,
5723
+ ports: result.ports,
5724
+ url: `http://localhost:${result.port}`,
5725
+ ref: threadRef
5726
+ });
5727
+ } catch (err) {
5728
+ const message = err instanceof Error ? err.message : String(err);
5729
+ return { content: [{ type: "text", text: message }], isError: true };
5730
+ }
5731
+ }
5732
+ );
5733
+ server.tool(
5734
+ "stop_dev_script",
5735
+ "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).",
5736
+ {
5737
+ ref: z9.string().optional().describe("Thread id. Omit on a worktree turn (uses cwd)."),
5738
+ name: z9.string().optional().describe("Script name to stop; omit to stop all active scripts.")
5739
+ },
5740
+ async ({ ref, name }) => {
5741
+ try {
5742
+ const threadRef = resolveRunScriptThreadRef(ref);
5743
+ orch.stopDev(threadRef, name);
5744
+ return mcpJson({ ok: true, ref: threadRef, stopped: name ?? "all" });
5745
+ } catch (err) {
5746
+ const message = err instanceof Error ? err.message : String(err);
5747
+ return { content: [{ type: "text", text: message }], isError: true };
5748
+ }
5749
+ }
5750
+ );
5588
5751
  if (!worktreeProfile) {
5589
5752
  registerSlackTools(server);
5590
5753
  registerConnectedIssueVendorTools(server);
5591
5754
  registerScheduleTools(server);
5592
5755
  const { getCaffeinateHold: getCaffeinateHold2, setCaffeinateHold: setCaffeinateHold2 } = await import("./caffeinate-hold-22VFDPSO.js");
5593
- const { resolveNewThreadOptions: resolveNewThreadOptions2, resolveThreadDefaults: resolveThreadDefaults2 } = await import("./app-settings-V2BBCX2H.js");
5756
+ const { resolveNewThreadOptions: resolveNewThreadOptions2, resolveThreadDefaults: resolveThreadDefaults2 } = await import("./app-settings-UXWCPDEA.js");
5594
5757
  const accountDefaults = resolveThreadDefaults2();
5595
5758
  const accountDefaultsHint = `Account defaults: agent=${accountDefaults.agent}, model=${accountDefaults.model?.trim() || "Auto"}, effort=${accountDefaults.effort}`;
5596
5759
  server.tool(
@@ -6063,45 +6226,6 @@ async function startMcpServer() {
6063
6226
  }
6064
6227
  }
6065
6228
  );
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
6229
  server.tool(
6106
6230
  "run_setup",
6107
6231
  "Re-run workspace setup (Sideboard/Conductor settings, .cursor/worktrees.json, or script/setup). New worktrees already run this automatically.",
@@ -8589,6 +8713,9 @@ export {
8589
8713
  ABLETIME_ORG_KEY_PREFIX,
8590
8714
  ABLETIME_PAT_PREFIX,
8591
8715
  ABLETIME_PM_TOOL_NAMES,
8716
+ AGENT_DONE_CUSTOM_SOUND_EXTENSIONS,
8717
+ AGENT_DONE_CUSTOM_SOUND_MAX_BYTES,
8718
+ AGENT_DONE_SOUNDS,
8592
8719
  AGENT_GIT_ACTIONS,
8593
8720
  AGENT_RUNNER_MAX_OLD_SPACE_MB,
8594
8721
  ATTACHMENTS_DIR,
@@ -8711,6 +8838,9 @@ export {
8711
8838
  addStackLayerFromThread,
8712
8839
  addWorkspace,
8713
8840
  adoptThread,
8841
+ agentDoneCustomSoundMime,
8842
+ agentDoneSound,
8843
+ agentDoneSoundsDir,
8714
8844
  agentGitPrompt,
8715
8845
  alignQueueAttachments,
8716
8846
  allAdapters,
@@ -8789,6 +8919,7 @@ export {
8789
8919
  claudeUserSettingsPath,
8790
8920
  cleanupArchivedHistory,
8791
8921
  cleanupOrphanWorktrees,
8922
+ clearAgentDoneCustomSoundFile,
8792
8923
  clearBoardPins,
8793
8924
  clearHomeBoardCache,
8794
8925
  clipAgentEventForPaint,
@@ -8891,6 +9022,7 @@ export {
8891
9022
  fetchOriginForWorktree,
8892
9023
  fetchPrHead,
8893
9024
  finalizeParts,
9025
+ findAgentDoneCustomSoundPath,
8894
9026
  findConventionSetup,
8895
9027
  findInvalidCacheControlTtlOrder,
8896
9028
  findLastBrightsyContextSummary,
@@ -9025,6 +9157,7 @@ export {
9025
9157
  historyMaxDays,
9026
9158
  hottestClaudeWindow,
9027
9159
  httpFetch,
9160
+ importAgentDoneCustomSound,
9028
9161
  importConductorWorkspace,
9029
9162
  importConductorWorkspaceAsync,
9030
9163
  initPrStack,
@@ -9040,6 +9173,7 @@ export {
9040
9173
  isAbleTimeConnected,
9041
9174
  isAbleTimeOAuthCancelled,
9042
9175
  isAbleTimeRejectedCredential,
9176
+ isAgentDoneSound,
9043
9177
  isAskUserToolName,
9044
9178
  isBrightsyConnected,
9045
9179
  isBrightsyNdjsonLine,
@@ -9231,6 +9365,7 @@ export {
9231
9365
  primaryCheckoutFromLinkedWorktree,
9232
9366
  promptMentionsBrightsy,
9233
9367
  pushBranch,
9368
+ readAgentDoneCustomSound,
9234
9369
  readExistingReviewRequestFile,
9235
9370
  readKeychainVaultKey,
9236
9371
  readPlanFile,