@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
@@ -3787,12 +3787,14 @@ var init_issue_source_labels = __esm({
3787
3787
  // src/store/app-settings.ts
3788
3788
  var app_settings_exports = {};
3789
3789
  __export(app_settings_exports, {
3790
+ AGENT_DONE_SOUNDS: () => AGENT_DONE_SOUNDS,
3790
3791
  FOLLOW_UP_BEHAVIORS: () => FOLLOW_UP_BEHAVIORS,
3791
3792
  GITHUB_GIT_AUTH_MODES: () => GITHUB_GIT_AUTH_MODES,
3792
3793
  HARNESS_ENV_KEYS: () => HARNESS_ENV_KEYS,
3793
3794
  ISSUE_SOURCE_LABELS: () => ISSUE_SOURCE_LABELS,
3794
3795
  PROFILE_NOTES_MAX: () => PROFILE_NOTES_MAX,
3795
3796
  USAGE_ON_LIMIT_VALUES: () => USAGE_ON_LIMIT_VALUES,
3797
+ agentDoneSound: () => agentDoneSound,
3796
3798
  appSettingsPath: () => appSettingsPath,
3797
3799
  applyAppEnvironment: () => applyAppEnvironment,
3798
3800
  autoArchiveOnMergeEnabled: () => autoArchiveOnMergeEnabled,
@@ -3840,6 +3842,7 @@ __export(app_settings_exports, {
3840
3842
  historyMaxCount: () => historyMaxCount,
3841
3843
  historyMaxDays: () => historyMaxDays,
3842
3844
  isAbleTimeConnected: () => isAbleTimeConnected,
3845
+ isAgentDoneSound: () => isAgentDoneSound,
3843
3846
  isIssueSourceConnected: () => isIssueSourceConnected,
3844
3847
  isLinearConnected: () => isLinearConnected,
3845
3848
  isUsageOnLimit: () => isUsageOnLimit,
@@ -3881,6 +3884,9 @@ __export(app_settings_exports, {
3881
3884
  usageOnLimit: () => usageOnLimit,
3882
3885
  writeViewerContext: () => writeViewerContext
3883
3886
  });
3887
+ function isAgentDoneSound(value) {
3888
+ return AGENT_DONE_SOUNDS.includes(value);
3889
+ }
3884
3890
  function emptyPublicIntegrations() {
3885
3891
  return {
3886
3892
  hasLinearApiKey: false,
@@ -4311,6 +4317,13 @@ function normalizeAdvanced(raw) {
4311
4317
  if (source.followUpBehavior === "queue" || source.followUpBehavior === "steer") {
4312
4318
  out.followUpBehavior = source.followUpBehavior;
4313
4319
  }
4320
+ if (isAgentDoneSound(source.agentDoneSound)) {
4321
+ out.agentDoneSound = source.agentDoneSound;
4322
+ }
4323
+ if (typeof source.agentDoneCustomSoundName === "string") {
4324
+ const name = source.agentDoneCustomSoundName.trim();
4325
+ if (name) out.agentDoneCustomSoundName = name.slice(0, 200);
4326
+ }
4314
4327
  return out;
4315
4328
  }
4316
4329
  function normalizeSettings(raw) {
@@ -5221,6 +5234,16 @@ function updateAdvancedSettings(patch) {
5221
5234
  if (patch.followUpBehavior === "queue" || patch.followUpBehavior === "steer") {
5222
5235
  advanced.followUpBehavior = patch.followUpBehavior;
5223
5236
  }
5237
+ if (isAgentDoneSound(patch.agentDoneSound)) {
5238
+ advanced.agentDoneSound = patch.agentDoneSound;
5239
+ }
5240
+ if (patch.agentDoneCustomSoundName === null || patch.agentDoneCustomSoundName === "") {
5241
+ delete advanced.agentDoneCustomSoundName;
5242
+ } else if (typeof patch.agentDoneCustomSoundName === "string") {
5243
+ const name = patch.agentDoneCustomSoundName.trim();
5244
+ if (name) advanced.agentDoneCustomSoundName = name.slice(0, 200);
5245
+ else delete advanced.agentDoneCustomSoundName;
5246
+ }
5224
5247
  return saveAppSettings({ ...current, advanced });
5225
5248
  }
5226
5249
  function autoRenameBranchEnabled(settings = loadAppSettings()) {
@@ -5288,6 +5311,9 @@ function orchestrationQuotaFallbackAgent(settings = loadAppSettings()) {
5288
5311
  function followUpBehavior(settings = loadAppSettings()) {
5289
5312
  return settings.advanced.followUpBehavior === "queue" ? "queue" : "steer";
5290
5313
  }
5314
+ function agentDoneSound(settings = loadAppSettings()) {
5315
+ return isAgentDoneSound(settings.advanced.agentDoneSound) ? settings.advanced.agentDoneSound : "none";
5316
+ }
5291
5317
  function maxConcurrentAgents(settings = loadAppSettings()) {
5292
5318
  const n = settings.advanced.maxConcurrent;
5293
5319
  if (typeof n === "number" && Number.isFinite(n)) {
@@ -5375,7 +5401,7 @@ function childEnvWithAppSettings(extra) {
5375
5401
  function harnessEnvKey(harness) {
5376
5402
  return HARNESS_ENV_KEYS[harness];
5377
5403
  }
5378
- var import_node_crypto3, import_node_fs15, import_node_os5, import_node_path18, HARNESS_ENV_KEYS, DEFAULT_AGENTS, GITHUB_GIT_AUTH_MODES, FOLLOW_UP_BEHAVIORS, CLOUD_CONNECT_AGENTS, ISSUE_SOURCES, GIT_AUTH_MODES, EMPTY_SETTINGS, CONFIRM_ACCOUNT, CONFIRM_PROJECT, DEFAULT_CLI_BIN;
5404
+ var import_node_crypto3, import_node_fs15, import_node_os5, import_node_path18, HARNESS_ENV_KEYS, DEFAULT_AGENTS, GITHUB_GIT_AUTH_MODES, FOLLOW_UP_BEHAVIORS, AGENT_DONE_SOUNDS, CLOUD_CONNECT_AGENTS, ISSUE_SOURCES, GIT_AUTH_MODES, EMPTY_SETTINGS, CONFIRM_ACCOUNT, CONFIRM_PROJECT, DEFAULT_CLI_BIN;
5379
5405
  var init_app_settings = __esm({
5380
5406
  "src/store/app-settings.ts"() {
5381
5407
  "use strict";
@@ -5412,6 +5438,18 @@ var init_app_settings = __esm({
5412
5438
  ]);
5413
5439
  GITHUB_GIT_AUTH_MODES = ["auto", "gh", "ssh", "token"];
5414
5440
  FOLLOW_UP_BEHAVIORS = ["steer", "queue"];
5441
+ AGENT_DONE_SOUNDS = [
5442
+ "none",
5443
+ "goal",
5444
+ "bell",
5445
+ "level",
5446
+ "coin",
5447
+ "fanfare",
5448
+ "magic",
5449
+ "rooster",
5450
+ "whistle",
5451
+ "custom"
5452
+ ];
5415
5453
  CLOUD_CONNECT_AGENTS = /* @__PURE__ */ new Set([
5416
5454
  "claude",
5417
5455
  "codex",
@@ -10242,6 +10280,9 @@ var init_injected_mcp = __esm({
10242
10280
  "mcp__sideboard__present_plan",
10243
10281
  "mcp__sideboard__wait_for_job",
10244
10282
  "mcp__sideboard__stop_job",
10283
+ "mcp__sideboard__list_run_scripts",
10284
+ "mcp__sideboard__run_dev_script",
10285
+ "mcp__sideboard__stop_dev_script",
10245
10286
  "mcp__sideboard__get_viewer_context",
10246
10287
  "mcp__sideboard__update_viewer_context"
10247
10288
  ];
@@ -10451,6 +10492,13 @@ function toolDescription(name, input) {
10451
10492
  if (/stop_job$/i.test(name)) {
10452
10493
  return str2(input?.id) ? `Stop ${str2(input?.id)}` : "Stop job";
10453
10494
  }
10495
+ if (/list_run_scripts$/i.test(name)) return "List run scripts";
10496
+ if (/run_dev_script$/i.test(name)) {
10497
+ return str2(input?.name) ? `Start ${str2(input?.name)}` : "Start Dev script";
10498
+ }
10499
+ if (/stop_dev_script$/i.test(name)) {
10500
+ return str2(input?.name) ? `Stop ${str2(input?.name)}` : "Stop Dev script";
10501
+ }
10454
10502
  if (isSubagentToolName(name)) {
10455
10503
  const desc = str2(input?.description);
10456
10504
  const sub = asRecord(input?.subagentType);
@@ -20529,12 +20577,13 @@ function formatLongRunningDirective(opts) {
20529
20577
  "- Loop Sideboard MCP `wait_for_job` (returns in ~45s). The desktop opens a `type=log` pane from wait/stop (and shell detached-job JSON) automatically \u2014 you may still `present_artifact` with `artifact_id=<id>` for a custom title. stillRunning \u2192 wait again. Shell fallback: the same helper with `wait <id>`.",
20530
20578
  "- Hanging, no useful output, or the wrong thing \u2192 `stop_job` (or the helper with `stop <id>`). Do not stop a pack/test/deploy that is clearly making progress.",
20531
20579
  "- Stay in the loop until stillRunning is false (or you stopped it). ok \u2192 finish the task. failed / stopped \u2192 read the log, fix or narrow the command, start once.",
20532
- "State: `.context/.sideboard/detached-jobs/<id>/` (local scratch). Full guide: `/long-running` (always available)."
20580
+ "State: `.context/.sideboard/detached-jobs/<id>/` (local scratch). Full guide: `/long-running` (always available).",
20581
+ "Project Dev / run scripts (`.sideboard` `[scripts.run.*]`, same as the desktop Dev button): use MCP `list_run_scripts` / `run_dev_script` / `stop_dev_script` \u2014 logs and Stop live in the thread UI. Do not detached-job or shell-spawn that same command."
20533
20582
  ].join("\n");
20534
20583
  }
20535
20584
  function formatLongRunningReminder(opts) {
20536
20585
  const invoke = formatDetachedJobInvoke(opts?.scriptPath);
20537
- return `Long jobs: \`${invoke} start <id> -- <cmd>\`, loop wait_for_job (or detached-job wait). The log pane updates from wait JSON; present_artifact type=log is optional. stop_job if hanging or wrong. Do not say you will let the user know later \u2014 stay in the turn.`;
20586
+ return `Long jobs: \`${invoke} start <id> -- <cmd>\`, loop wait_for_job (or detached-job wait). The log pane updates from wait JSON; present_artifact type=log is optional. stop_job if hanging or wrong. Do not say you will let the user know later \u2014 stay in the turn. Project Dev button: list_run_scripts / run_dev_script / stop_dev_script (UI-connected \u2014 not detached-job).`;
20538
20587
  }
20539
20588
  function formatArtifactDirective() {
20540
20589
  return [
@@ -20546,7 +20595,7 @@ function formatArtifactDirective() {
20546
20595
  ].join("\n");
20547
20596
  }
20548
20597
  function formatUiReminder() {
20549
- return "Sideboard UI: markdown table is enough to read data; present_schema if they ask to edit/filter (even after markdown); present_files for the file manager. html fence or present_artifact, not both for the same document. type=log appends (same artifact_id, new lines only). ask_user only for a real multiple-choice (not hellos, \u201Cwhat next?\u201D, or after a review) \u2014 reply in chat. Do not say artifacts/CMS UI are unavailable.";
20598
+ return "Sideboard UI: markdown table is enough to read data; present_schema if they ask to edit/filter (even after markdown); present_files for the file manager. html fence or present_artifact, not both for the same document. type=log appends (same artifact_id, new lines only). ask_user only for a real multiple-choice (not hellos, \u201Cwhat next?\u201D, or after a review) \u2014 reply in chat. Do not say artifacts/CMS UI are unavailable. Dev / preview: run_dev_script (same as the Dev button); stop_dev_script to stop.";
20550
20599
  }
20551
20600
  var import_node_fs50, import_node_path49, PR_GOAL_RE, GITHUB_TICKET_REF, KEYED_TICKET_REF;
20552
20601
  var init_instructions = __esm({
@@ -25730,6 +25779,23 @@ function mcpArchiveBlockedReason(thread) {
25730
25779
 
25731
25780
  // src/mcp/server.ts
25732
25781
  init_profile();
25782
+
25783
+ // src/mcp/run-script-ref.ts
25784
+ init_chat_tabs();
25785
+ function resolveRunScriptThreadRef(ref) {
25786
+ const explicit = ref?.trim();
25787
+ if (explicit) return explicit;
25788
+ const siblings = threadsSharingWorktree(process.cwd());
25789
+ const thread = siblings[0];
25790
+ if (!thread) {
25791
+ throw new Error(
25792
+ "No Sideboard thread for this cwd. Pass ref (thread id), or call from a worktree chat."
25793
+ );
25794
+ }
25795
+ return thread.id;
25796
+ }
25797
+
25798
+ // src/mcp/server.ts
25733
25799
  init_wait_for_turn();
25734
25800
  init_wait_for_job();
25735
25801
  init_message_parts();
@@ -28161,13 +28227,73 @@ async function startMcpServer() {
28161
28227
  "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.",
28162
28228
  {
28163
28229
  id: import_zod9.z.string().describe("Detached job id (same kebab-case id passed to detached-job.cjs start)"),
28164
- reason: import_zod9.z.string().optional().describe("Why you are stopping (hanging, no progress, wrong output, already have the error)")
28230
+ reason: import_zod9.z.string().optional().describe("Why you are stopping (hanging, no progress, wrong output, already have the answer)")
28165
28231
  },
28166
28232
  async ({ id, reason }) => {
28167
28233
  const result = await stopDetachedJob(process.cwd(), id, { reason });
28168
28234
  return mcpJson(result);
28169
28235
  }
28170
28236
  );
28237
+ server.tool(
28238
+ "list_run_scripts",
28239
+ "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).",
28240
+ {
28241
+ ref: import_zod9.z.string().optional().describe("Thread id. Omit on a worktree turn (uses cwd).")
28242
+ },
28243
+ async ({ ref }) => {
28244
+ try {
28245
+ const threadRef = resolveRunScriptThreadRef(ref);
28246
+ const scripts = orch.listThreadRunScripts(threadRef);
28247
+ const active = orch.getActiveRuns(threadRef);
28248
+ return mcpJson({ scripts, active, ref: threadRef });
28249
+ } catch (err) {
28250
+ const message = err instanceof Error ? err.message : String(err);
28251
+ return { content: [{ type: "text", text: message }], isError: true };
28252
+ }
28253
+ }
28254
+ );
28255
+ server.tool(
28256
+ "run_dev_script",
28257
+ "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.",
28258
+ {
28259
+ ref: import_zod9.z.string().optional().describe("Thread id. Omit on a worktree turn (uses cwd)."),
28260
+ name: import_zod9.z.string().optional().describe("Script name from list_run_scripts (default script if omitted).")
28261
+ },
28262
+ async ({ ref, name }) => {
28263
+ try {
28264
+ const threadRef = resolveRunScriptThreadRef(ref);
28265
+ const result = await orch.startDev(threadRef, name);
28266
+ return mcpJson({
28267
+ port: result.port,
28268
+ scriptName: result.scriptName,
28269
+ ports: result.ports,
28270
+ url: `http://localhost:${result.port}`,
28271
+ ref: threadRef
28272
+ });
28273
+ } catch (err) {
28274
+ const message = err instanceof Error ? err.message : String(err);
28275
+ return { content: [{ type: "text", text: message }], isError: true };
28276
+ }
28277
+ }
28278
+ );
28279
+ server.tool(
28280
+ "stop_dev_script",
28281
+ "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).",
28282
+ {
28283
+ ref: import_zod9.z.string().optional().describe("Thread id. Omit on a worktree turn (uses cwd)."),
28284
+ name: import_zod9.z.string().optional().describe("Script name to stop; omit to stop all active scripts.")
28285
+ },
28286
+ async ({ ref, name }) => {
28287
+ try {
28288
+ const threadRef = resolveRunScriptThreadRef(ref);
28289
+ orch.stopDev(threadRef, name);
28290
+ return mcpJson({ ok: true, ref: threadRef, stopped: name ?? "all" });
28291
+ } catch (err) {
28292
+ const message = err instanceof Error ? err.message : String(err);
28293
+ return { content: [{ type: "text", text: message }], isError: true };
28294
+ }
28295
+ }
28296
+ );
28171
28297
  if (!worktreeProfile) {
28172
28298
  registerSlackTools(server);
28173
28299
  registerConnectedIssueVendorTools(server);
@@ -28646,45 +28772,6 @@ async function startMcpServer() {
28646
28772
  }
28647
28773
  }
28648
28774
  );
28649
- server.tool(
28650
- "run_dev_script",
28651
- "Start a .sideboard/.conductor run script for a thread (default script if name omitted); returns port",
28652
- {
28653
- ref: import_zod9.z.string(),
28654
- name: import_zod9.z.string().optional()
28655
- },
28656
- async ({ ref, name }) => {
28657
- const result = await orch.startDev(ref, name);
28658
- return mcpJson({
28659
- port: result.port,
28660
- scriptName: result.scriptName,
28661
- ports: result.ports,
28662
- url: `http://localhost:${result.port}`
28663
- });
28664
- }
28665
- );
28666
- server.tool(
28667
- "list_run_scripts",
28668
- "List named run scripts available for a thread",
28669
- { ref: import_zod9.z.string() },
28670
- async ({ ref }) => {
28671
- const scripts = orch.listThreadRunScripts(ref);
28672
- const active = orch.getActiveRuns(ref);
28673
- return mcpJson({ scripts, active });
28674
- }
28675
- );
28676
- server.tool(
28677
- "stop_dev_script",
28678
- "Stop a running script for a thread (all scripts if name omitted)",
28679
- {
28680
- ref: import_zod9.z.string(),
28681
- name: import_zod9.z.string().optional()
28682
- },
28683
- async ({ ref, name }) => {
28684
- orch.stopDev(ref, name);
28685
- return { content: [{ type: "text", text: "ok" }] };
28686
- }
28687
- );
28688
28775
  server.tool(
28689
28776
  "run_setup",
28690
28777
  "Re-run workspace setup (Sideboard/Conductor settings, .cursor/worktrees.json, or script/setup). New worktrees already run this automatically.",
@@ -11,7 +11,7 @@ import {
11
11
  searchAbleTimeTasks,
12
12
  toAbleTimeIssueInfo,
13
13
  updateAbleTimeTask
14
- } from "../chunk-THLVCXLF.js";
14
+ } from "../chunk-RGNPPRZZ.js";
15
15
  import {
16
16
  AGENT_GIT_ACTIONS,
17
17
  BOARD_COLUMN_DEFS,
@@ -48,9 +48,10 @@ import {
48
48
  slackTokenFor,
49
49
  stopDetachedJob,
50
50
  syncBoardPins,
51
+ threadsSharingWorktree,
51
52
  updateSchedule,
52
53
  waitForDetachedJob
53
- } from "../chunk-WHYJL7CP.js";
54
+ } from "../chunk-6HKGCUDN.js";
54
55
  import "../chunk-JFOPOMK7.js";
55
56
  import "../chunk-YWI3IBP2.js";
56
57
  import {
@@ -61,16 +62,16 @@ import {
61
62
  materializeSystemCaBundle,
62
63
  sideboardMcpProfile,
63
64
  trustSystemCertificates
64
- } from "../chunk-SQHRPJ7P.js";
65
+ } from "../chunk-T7Y5ULHM.js";
65
66
  import {
66
67
  GLOBAL_WORKSPACE_ID,
67
68
  isCloudCoordinatorThread,
68
69
  listWorkspaces
69
- } from "../chunk-P2EAAM3H.js";
70
+ } from "../chunk-N7UXGM3Y.js";
70
71
  import "../chunk-SXFRXNBM.js";
71
72
  import "../chunk-P2BSMNHB.js";
72
- import "../chunk-CLI5DVU4.js";
73
- import "../chunk-HSYE5ID6.js";
73
+ import "../chunk-GHRZNPBK.js";
74
+ import "../chunk-AS4UN7QL.js";
74
75
  import {
75
76
  httpFetch
76
77
  } from "../chunk-VKQGAWHY.js";
@@ -84,7 +85,7 @@ import {
84
85
  resolveListPrsOptions,
85
86
  resolveRepoRoot,
86
87
  warmGithubAgentAuth
87
- } from "../chunk-NFWPDEN4.js";
88
+ } from "../chunk-F3GT6DQW.js";
88
89
  import "../chunk-D6JWYJ4P.js";
89
90
  import "../chunk-HY2GFZ5S.js";
90
91
  import "../chunk-X5B3OS5I.js";
@@ -105,7 +106,7 @@ import {
105
106
  resolveViewerProfileForRepo,
106
107
  saveLinearOAuth,
107
108
  writeViewerContext
108
- } from "../chunk-Y5JES2VV.js";
109
+ } from "../chunk-RZTRWN2V.js";
109
110
  import "../chunk-NSTQ6QKD.js";
110
111
  import "../chunk-KGZBYWZ3.js";
111
112
  import {
@@ -1797,6 +1798,20 @@ function mcpArchiveBlockedReason(thread) {
1797
1798
  return null;
1798
1799
  }
1799
1800
 
1801
+ // src/mcp/run-script-ref.ts
1802
+ function resolveRunScriptThreadRef(ref) {
1803
+ const explicit = ref?.trim();
1804
+ if (explicit) return explicit;
1805
+ const siblings = threadsSharingWorktree(process.cwd());
1806
+ const thread = siblings[0];
1807
+ if (!thread) {
1808
+ throw new Error(
1809
+ "No Sideboard thread for this cwd. Pass ref (thread id), or call from a worktree chat."
1810
+ );
1811
+ }
1812
+ return thread.id;
1813
+ }
1814
+
1800
1815
  // src/mcp/thread-visibility.ts
1801
1816
  function lastMessagePreview(messages, max = 160) {
1802
1817
  if (!messages?.length) return null;
@@ -3883,7 +3898,7 @@ async function startMcpServer() {
3883
3898
  );
3884
3899
  }
3885
3900
  try {
3886
- const { maxConcurrentAgents } = await import("../app-settings-5RQMQKSB.js");
3901
+ const { maxConcurrentAgents } = await import("../app-settings-KBL2G7M4.js");
3887
3902
  orch.setMaxConcurrent(maxConcurrentAgents());
3888
3903
  } catch {
3889
3904
  }
@@ -4186,19 +4201,79 @@ async function startMcpServer() {
4186
4201
  "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.",
4187
4202
  {
4188
4203
  id: z9.string().describe("Detached job id (same kebab-case id passed to detached-job.cjs start)"),
4189
- reason: z9.string().optional().describe("Why you are stopping (hanging, no progress, wrong output, already have the error)")
4204
+ reason: z9.string().optional().describe("Why you are stopping (hanging, no progress, wrong output, already have the answer)")
4190
4205
  },
4191
4206
  async ({ id, reason }) => {
4192
4207
  const result = await stopDetachedJob(process.cwd(), id, { reason });
4193
4208
  return mcpJson(result);
4194
4209
  }
4195
4210
  );
4211
+ server.tool(
4212
+ "list_run_scripts",
4213
+ "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).",
4214
+ {
4215
+ ref: z9.string().optional().describe("Thread id. Omit on a worktree turn (uses cwd).")
4216
+ },
4217
+ async ({ ref }) => {
4218
+ try {
4219
+ const threadRef = resolveRunScriptThreadRef(ref);
4220
+ const scripts = orch.listThreadRunScripts(threadRef);
4221
+ const active = orch.getActiveRuns(threadRef);
4222
+ return mcpJson({ scripts, active, ref: threadRef });
4223
+ } catch (err) {
4224
+ const message = err instanceof Error ? err.message : String(err);
4225
+ return { content: [{ type: "text", text: message }], isError: true };
4226
+ }
4227
+ }
4228
+ );
4229
+ server.tool(
4230
+ "run_dev_script",
4231
+ "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.",
4232
+ {
4233
+ ref: z9.string().optional().describe("Thread id. Omit on a worktree turn (uses cwd)."),
4234
+ name: z9.string().optional().describe("Script name from list_run_scripts (default script if omitted).")
4235
+ },
4236
+ async ({ ref, name }) => {
4237
+ try {
4238
+ const threadRef = resolveRunScriptThreadRef(ref);
4239
+ const result = await orch.startDev(threadRef, name);
4240
+ return mcpJson({
4241
+ port: result.port,
4242
+ scriptName: result.scriptName,
4243
+ ports: result.ports,
4244
+ url: `http://localhost:${result.port}`,
4245
+ ref: threadRef
4246
+ });
4247
+ } catch (err) {
4248
+ const message = err instanceof Error ? err.message : String(err);
4249
+ return { content: [{ type: "text", text: message }], isError: true };
4250
+ }
4251
+ }
4252
+ );
4253
+ server.tool(
4254
+ "stop_dev_script",
4255
+ "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).",
4256
+ {
4257
+ ref: z9.string().optional().describe("Thread id. Omit on a worktree turn (uses cwd)."),
4258
+ name: z9.string().optional().describe("Script name to stop; omit to stop all active scripts.")
4259
+ },
4260
+ async ({ ref, name }) => {
4261
+ try {
4262
+ const threadRef = resolveRunScriptThreadRef(ref);
4263
+ orch.stopDev(threadRef, name);
4264
+ return mcpJson({ ok: true, ref: threadRef, stopped: name ?? "all" });
4265
+ } catch (err) {
4266
+ const message = err instanceof Error ? err.message : String(err);
4267
+ return { content: [{ type: "text", text: message }], isError: true };
4268
+ }
4269
+ }
4270
+ );
4196
4271
  if (!worktreeProfile) {
4197
4272
  registerSlackTools(server);
4198
4273
  registerConnectedIssueVendorTools(server);
4199
4274
  registerScheduleTools(server);
4200
4275
  const { getCaffeinateHold, setCaffeinateHold } = await import("../caffeinate-hold-OK4JJ5PP.js");
4201
- const { resolveNewThreadOptions, resolveThreadDefaults } = await import("../app-settings-5RQMQKSB.js");
4276
+ const { resolveNewThreadOptions, resolveThreadDefaults } = await import("../app-settings-KBL2G7M4.js");
4202
4277
  const accountDefaults = resolveThreadDefaults();
4203
4278
  const accountDefaultsHint = `Account defaults: agent=${accountDefaults.agent}, model=${accountDefaults.model?.trim() || "Auto"}, effort=${accountDefaults.effort}`;
4204
4279
  server.tool(
@@ -4671,45 +4746,6 @@ async function startMcpServer() {
4671
4746
  }
4672
4747
  }
4673
4748
  );
4674
- server.tool(
4675
- "run_dev_script",
4676
- "Start a .sideboard/.conductor run script for a thread (default script if name omitted); returns port",
4677
- {
4678
- ref: z9.string(),
4679
- name: z9.string().optional()
4680
- },
4681
- async ({ ref, name }) => {
4682
- const result = await orch.startDev(ref, name);
4683
- return mcpJson({
4684
- port: result.port,
4685
- scriptName: result.scriptName,
4686
- ports: result.ports,
4687
- url: `http://localhost:${result.port}`
4688
- });
4689
- }
4690
- );
4691
- server.tool(
4692
- "list_run_scripts",
4693
- "List named run scripts available for a thread",
4694
- { ref: z9.string() },
4695
- async ({ ref }) => {
4696
- const scripts = orch.listThreadRunScripts(ref);
4697
- const active = orch.getActiveRuns(ref);
4698
- return mcpJson({ scripts, active });
4699
- }
4700
- );
4701
- server.tool(
4702
- "stop_dev_script",
4703
- "Stop a running script for a thread (all scripts if name omitted)",
4704
- {
4705
- ref: z9.string(),
4706
- name: z9.string().optional()
4707
- },
4708
- async ({ ref, name }) => {
4709
- orch.stopDev(ref, name);
4710
- return { content: [{ type: "text", text: "ok" }] };
4711
- }
4712
- );
4713
4749
  server.tool(
4714
4750
  "run_setup",
4715
4751
  "Re-run workspace setup (Sideboard/Conductor settings, .cursor/worktrees.json, or script/setup). New worktrees already run this automatically.",
@@ -10,21 +10,21 @@ import {
10
10
  resolveSendFollowUp,
11
11
  startOrchestration,
12
12
  waitForPidExit
13
- } from "./chunk-WHYJL7CP.js";
13
+ } from "./chunk-6HKGCUDN.js";
14
14
  import "./chunk-JFOPOMK7.js";
15
15
  import "./chunk-YWI3IBP2.js";
16
- import "./chunk-SQHRPJ7P.js";
17
- import "./chunk-P2EAAM3H.js";
16
+ import "./chunk-T7Y5ULHM.js";
17
+ import "./chunk-N7UXGM3Y.js";
18
18
  import "./chunk-SXFRXNBM.js";
19
19
  import "./chunk-P2BSMNHB.js";
20
20
  import "./chunk-VKQGAWHY.js";
21
- import "./chunk-NFWPDEN4.js";
21
+ import "./chunk-F3GT6DQW.js";
22
22
  import "./chunk-D6JWYJ4P.js";
23
23
  import "./chunk-HY2GFZ5S.js";
24
24
  import "./chunk-X5B3OS5I.js";
25
25
  import "./chunk-SZJZEFTY.js";
26
26
  import "./chunk-ABOBTSO6.js";
27
- import "./chunk-Y5JES2VV.js";
27
+ import "./chunk-RZTRWN2V.js";
28
28
  import "./chunk-NSTQ6QKD.js";
29
29
  import "./chunk-KGZBYWZ3.js";
30
30
  import "./chunk-EQNRWDLN.js";
@@ -8,11 +8,11 @@ import {
8
8
  resolveSendFollowUp,
9
9
  startOrchestration,
10
10
  waitForPidExit
11
- } from "./chunk-72XUASTH.js";
11
+ } from "./chunk-UHT6OS7V.js";
12
12
  import "./chunk-DJU54RYW.js";
13
- import "./chunk-VUW3VKLW.js";
14
- import "./chunk-N2VST3NL.js";
15
- import "./chunk-KTZESHYH.js";
13
+ import "./chunk-LULHFLPU.js";
14
+ import "./chunk-7YKXBFQE.js";
15
+ import "./chunk-AMMRFFB7.js";
16
16
  import "./chunk-6K64FJDD.js";
17
17
  import "./chunk-PO4M4JAJ.js";
18
18
  import "./chunk-ZXJMAKEP.js";
@@ -20,7 +20,7 @@ import "./chunk-ROPGQRPU.js";
20
20
  import "./chunk-N7WZ6NIN.js";
21
21
  import "./chunk-AXQ4ZWHK.js";
22
22
  import "./chunk-TQBUXKIB.js";
23
- import "./chunk-EWHJNJHV.js";
23
+ import "./chunk-I5NC7DWO.js";
24
24
  import "./chunk-WDRMZKVB.js";
25
25
  import "./chunk-4TYXWPAJ.js";
26
26
  import "./chunk-JT7R45JB.js";
@@ -5,11 +5,11 @@ import {
5
5
  primaryCheckoutFromLinkedWorktree,
6
6
  removeWorkspace,
7
7
  syncWorkspacesFromThreads
8
- } from "./chunk-N2VST3NL.js";
9
- import "./chunk-KTZESHYH.js";
8
+ } from "./chunk-7YKXBFQE.js";
9
+ import "./chunk-AMMRFFB7.js";
10
10
  import "./chunk-6K64FJDD.js";
11
11
  import "./chunk-PO4M4JAJ.js";
12
- import "./chunk-EWHJNJHV.js";
12
+ import "./chunk-I5NC7DWO.js";
13
13
  import "./chunk-WDRMZKVB.js";
14
14
  import "./chunk-JT7R45JB.js";
15
15
  import "./chunk-3IMSQNTS.js";
@@ -7,14 +7,14 @@ import {
7
7
  primaryCheckoutFromLinkedWorktree,
8
8
  removeWorkspace,
9
9
  syncWorkspacesFromThreads
10
- } from "./chunk-P2EAAM3H.js";
11
- import "./chunk-NFWPDEN4.js";
10
+ } from "./chunk-N7UXGM3Y.js";
11
+ import "./chunk-F3GT6DQW.js";
12
12
  import "./chunk-D6JWYJ4P.js";
13
13
  import "./chunk-HY2GFZ5S.js";
14
14
  import "./chunk-X5B3OS5I.js";
15
15
  import "./chunk-SZJZEFTY.js";
16
16
  import "./chunk-ABOBTSO6.js";
17
- import "./chunk-Y5JES2VV.js";
17
+ import "./chunk-RZTRWN2V.js";
18
18
  import "./chunk-NSTQ6QKD.js";
19
19
  import "./chunk-KGZBYWZ3.js";
20
20
  import "./chunk-EQNRWDLN.js";
@@ -60,13 +60,13 @@ import {
60
60
  worktreeDisplayLabelForGroup,
61
61
  worktreeNameFromPath,
62
62
  worktreeSlugForTicket
63
- } from "./chunk-NFWPDEN4.js";
63
+ } from "./chunk-F3GT6DQW.js";
64
64
  import "./chunk-D6JWYJ4P.js";
65
65
  import "./chunk-HY2GFZ5S.js";
66
66
  import "./chunk-X5B3OS5I.js";
67
67
  import "./chunk-SZJZEFTY.js";
68
68
  import "./chunk-ABOBTSO6.js";
69
- import "./chunk-Y5JES2VV.js";
69
+ import "./chunk-RZTRWN2V.js";
70
70
  import "./chunk-NSTQ6QKD.js";
71
71
  import "./chunk-KGZBYWZ3.js";
72
72
  import "./chunk-EQNRWDLN.js";
@@ -58,10 +58,10 @@ import {
58
58
  worktreeDisplayLabelForGroup,
59
59
  worktreeNameFromPath,
60
60
  worktreeSlugForTicket
61
- } from "./chunk-KTZESHYH.js";
61
+ } from "./chunk-AMMRFFB7.js";
62
62
  import "./chunk-6K64FJDD.js";
63
63
  import "./chunk-PO4M4JAJ.js";
64
- import "./chunk-EWHJNJHV.js";
64
+ import "./chunk-I5NC7DWO.js";
65
65
  import "./chunk-WDRMZKVB.js";
66
66
  import "./chunk-JT7R45JB.js";
67
67
  import "./chunk-3IMSQNTS.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sideboard-ai/core",
3
- "version": "0.1.228",
3
+ "version": "0.1.229",
4
4
  "description": "Sideboard core — orchestration, agents, git worktrees, MCP server",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",