@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
@@ -15,11 +15,11 @@ import {
15
15
  toAbleTimeIssueInfo,
16
16
  updateAbleTimeTask,
17
17
  verifyAbleTimeConnection
18
- } from "./chunk-SOGGKYFV.js";
19
- import "./chunk-RRW2XWAY.js";
20
- import "./chunk-646I442S.js";
18
+ } from "./chunk-SWNEA5OZ.js";
19
+ import "./chunk-P6ZM5QJW.js";
20
+ import "./chunk-MVLXDYN5.js";
21
21
  import "./chunk-N7WZ6NIN.js";
22
- import "./chunk-EWHJNJHV.js";
22
+ import "./chunk-I5NC7DWO.js";
23
23
  import "./chunk-WDRMZKVB.js";
24
24
  import "./chunk-JT7R45JB.js";
25
25
  import "./chunk-77WWLBCI.js";
@@ -17,11 +17,11 @@ import {
17
17
  toAbleTimeIssueInfo,
18
18
  updateAbleTimeTask,
19
19
  verifyAbleTimeConnection
20
- } from "./chunk-THLVCXLF.js";
21
- import "./chunk-CLI5DVU4.js";
22
- import "./chunk-HSYE5ID6.js";
20
+ } from "./chunk-RGNPPRZZ.js";
21
+ import "./chunk-GHRZNPBK.js";
22
+ import "./chunk-AS4UN7QL.js";
23
23
  import "./chunk-VKQGAWHY.js";
24
- import "./chunk-Y5JES2VV.js";
24
+ import "./chunk-RZTRWN2V.js";
25
25
  import "./chunk-NSTQ6QKD.js";
26
26
  import "./chunk-KGZBYWZ3.js";
27
27
  import "./chunk-EQNRWDLN.js";
@@ -20,10 +20,10 @@ import {
20
20
  parseAbleTimeOAuthCallbackUrl,
21
21
  resolveAbleTimeOAuthHost,
22
22
  startAbleTimeOAuth
23
- } from "./chunk-3NWUHXU3.js";
24
- import "./chunk-646I442S.js";
23
+ } from "./chunk-C774RJJA.js";
24
+ import "./chunk-MVLXDYN5.js";
25
25
  import "./chunk-N7WZ6NIN.js";
26
- import "./chunk-EWHJNJHV.js";
26
+ import "./chunk-I5NC7DWO.js";
27
27
  import "./chunk-WDRMZKVB.js";
28
28
  import "./chunk-JT7R45JB.js";
29
29
  import "./chunk-77WWLBCI.js";
@@ -3,7 +3,7 @@
3
3
  import {
4
4
  DEFAULT_ABLETIME_HOST,
5
5
  normalizeAbleTimeHost
6
- } from "./chunk-HSYE5ID6.js";
6
+ } from "./chunk-AS4UN7QL.js";
7
7
  import {
8
8
  httpFetch
9
9
  } from "./chunk-VKQGAWHY.js";
@@ -12,7 +12,7 @@ import {
12
12
  getAbleTimeHost,
13
13
  loadAppSettings,
14
14
  saveAbleTimeConnection
15
- } from "./chunk-Y5JES2VV.js";
15
+ } from "./chunk-RZTRWN2V.js";
16
16
  import "./chunk-NSTQ6QKD.js";
17
17
  import "./chunk-KGZBYWZ3.js";
18
18
  import "./chunk-EQNRWDLN.js";
@@ -287,7 +287,7 @@ async function startAbleTimeOAuth(opts) {
287
287
  persistAbleTimeTokens(data, { host });
288
288
  const token = data.access_token.trim();
289
289
  try {
290
- const { getAbleTimeOrientation } = await import("./abletime-BF253OZT.js");
290
+ const { getAbleTimeOrientation } = await import("./abletime-WZNDTRVL.js");
291
291
  const orientation = await getAbleTimeOrientation({ token, host });
292
292
  return saveAbleTimeConnection({
293
293
  accessToken: token,
@@ -5,10 +5,10 @@ import {
5
5
  callAbleTimeRestTool,
6
6
  looksLikeAbleTimeUlid,
7
7
  textFromAbleTimeDoc
8
- } from "./chunk-RRW2XWAY.js";
9
- import "./chunk-646I442S.js";
8
+ } from "./chunk-P6ZM5QJW.js";
9
+ import "./chunk-MVLXDYN5.js";
10
10
  import "./chunk-N7WZ6NIN.js";
11
- import "./chunk-EWHJNJHV.js";
11
+ import "./chunk-I5NC7DWO.js";
12
12
  import "./chunk-WDRMZKVB.js";
13
13
  import "./chunk-JT7R45JB.js";
14
14
  import "./chunk-77WWLBCI.js";
@@ -7,10 +7,10 @@ import {
7
7
  callAbleTimeRestTool,
8
8
  looksLikeAbleTimeUlid,
9
9
  textFromAbleTimeDoc
10
- } from "./chunk-CLI5DVU4.js";
11
- import "./chunk-HSYE5ID6.js";
10
+ } from "./chunk-GHRZNPBK.js";
11
+ import "./chunk-AS4UN7QL.js";
12
12
  import "./chunk-VKQGAWHY.js";
13
- import "./chunk-Y5JES2VV.js";
13
+ import "./chunk-RZTRWN2V.js";
14
14
  import "./chunk-NSTQ6QKD.js";
15
15
  import "./chunk-KGZBYWZ3.js";
16
16
  import "./chunk-EQNRWDLN.js";
@@ -50,12 +50,12 @@ import {
50
50
  resolveQuotaFallbackAgent,
51
51
  turnCostUsdFromCursorUsage,
52
52
  whichOnPath
53
- } from "./chunk-SQHRPJ7P.js";
54
- import "./chunk-P2EAAM3H.js";
53
+ } from "./chunk-T7Y5ULHM.js";
54
+ import "./chunk-N7UXGM3Y.js";
55
55
  import "./chunk-SXFRXNBM.js";
56
56
  import "./chunk-P2BSMNHB.js";
57
57
  import "./chunk-VKQGAWHY.js";
58
- import "./chunk-NFWPDEN4.js";
58
+ import "./chunk-F3GT6DQW.js";
59
59
  import "./chunk-D6JWYJ4P.js";
60
60
  import "./chunk-HY2GFZ5S.js";
61
61
  import "./chunk-X5B3OS5I.js";
@@ -74,7 +74,7 @@ import {
74
74
  assertOrchestratorCapableAgent,
75
75
  coerceOrchestratorAgent,
76
76
  isOrchestratorCapableAgent
77
- } from "./chunk-Y5JES2VV.js";
77
+ } from "./chunk-RZTRWN2V.js";
78
78
  import "./chunk-NSTQ6QKD.js";
79
79
  import "./chunk-KGZBYWZ3.js";
80
80
  import "./chunk-EQNRWDLN.js";
@@ -44,9 +44,9 @@ import {
44
44
  resolveLoginCommand,
45
45
  resolveQuotaFallbackAgent,
46
46
  whichOnPath
47
- } from "./chunk-VUW3VKLW.js";
48
- import "./chunk-N2VST3NL.js";
49
- import "./chunk-KTZESHYH.js";
47
+ } from "./chunk-LULHFLPU.js";
48
+ import "./chunk-7YKXBFQE.js";
49
+ import "./chunk-AMMRFFB7.js";
50
50
  import "./chunk-6K64FJDD.js";
51
51
  import "./chunk-PO4M4JAJ.js";
52
52
  import "./chunk-ZXJMAKEP.js";
@@ -63,7 +63,7 @@ import {
63
63
  assertOrchestratorCapableAgent,
64
64
  coerceOrchestratorAgent,
65
65
  isOrchestratorCapableAgent
66
- } from "./chunk-EWHJNJHV.js";
66
+ } from "./chunk-I5NC7DWO.js";
67
67
  import "./chunk-WDRMZKVB.js";
68
68
  import "./chunk-JT7R45JB.js";
69
69
  import "./chunk-3IMSQNTS.js";
@@ -1,12 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  import {
4
+ AGENT_DONE_SOUNDS,
4
5
  FOLLOW_UP_BEHAVIORS,
5
6
  GITHUB_GIT_AUTH_MODES,
6
7
  HARNESS_ENV_KEYS,
7
8
  ISSUE_SOURCE_LABELS,
8
9
  PROFILE_NOTES_MAX,
9
10
  USAGE_ON_LIMIT_VALUES,
11
+ agentDoneSound,
10
12
  appSettingsPath,
11
13
  applyAppEnvironment,
12
14
  autoArchiveOnMergeEnabled,
@@ -54,6 +56,7 @@ import {
54
56
  historyMaxCount,
55
57
  historyMaxDays,
56
58
  isAbleTimeConnected,
59
+ isAgentDoneSound,
57
60
  isIssueSourceConnected,
58
61
  isLinearConnected,
59
62
  isUsageOnLimit,
@@ -94,19 +97,21 @@ import {
94
97
  updateProjectProfileSettings,
95
98
  usageOnLimit,
96
99
  writeViewerContext
97
- } from "./chunk-Y5JES2VV.js";
100
+ } from "./chunk-RZTRWN2V.js";
98
101
  import "./chunk-NSTQ6QKD.js";
99
102
  import "./chunk-KGZBYWZ3.js";
100
103
  import "./chunk-EQNRWDLN.js";
101
104
  import "./chunk-WWUABK6B.js";
102
105
  import "./chunk-FJZWM2ON.js";
103
106
  export {
107
+ AGENT_DONE_SOUNDS,
104
108
  FOLLOW_UP_BEHAVIORS,
105
109
  GITHUB_GIT_AUTH_MODES,
106
110
  HARNESS_ENV_KEYS,
107
111
  ISSUE_SOURCE_LABELS,
108
112
  PROFILE_NOTES_MAX,
109
113
  USAGE_ON_LIMIT_VALUES,
114
+ agentDoneSound,
110
115
  appSettingsPath,
111
116
  applyAppEnvironment,
112
117
  autoArchiveOnMergeEnabled,
@@ -154,6 +159,7 @@ export {
154
159
  historyMaxCount,
155
160
  historyMaxDays,
156
161
  isAbleTimeConnected,
162
+ isAgentDoneSound,
157
163
  isIssueSourceConnected,
158
164
  isLinearConnected,
159
165
  isUsageOnLimit,
@@ -1,10 +1,12 @@
1
1
  import {
2
+ AGENT_DONE_SOUNDS,
2
3
  FOLLOW_UP_BEHAVIORS,
3
4
  GITHUB_GIT_AUTH_MODES,
4
5
  HARNESS_ENV_KEYS,
5
6
  ISSUE_SOURCE_LABELS,
6
7
  PROFILE_NOTES_MAX,
7
8
  USAGE_ON_LIMIT_VALUES,
9
+ agentDoneSound,
8
10
  appSettingsPath,
9
11
  applyAppEnvironment,
10
12
  autoArchiveOnMergeEnabled,
@@ -52,6 +54,7 @@ import {
52
54
  historyMaxCount,
53
55
  historyMaxDays,
54
56
  isAbleTimeConnected,
57
+ isAgentDoneSound,
55
58
  isIssueSourceConnected,
56
59
  isLinearConnected,
57
60
  isUsageOnLimit,
@@ -92,19 +95,21 @@ import {
92
95
  updateProjectProfileSettings,
93
96
  usageOnLimit,
94
97
  writeViewerContext
95
- } from "./chunk-EWHJNJHV.js";
98
+ } from "./chunk-I5NC7DWO.js";
96
99
  import "./chunk-WDRMZKVB.js";
97
100
  import "./chunk-JT7R45JB.js";
98
101
  import "./chunk-77WWLBCI.js";
99
102
  import "./chunk-WFUDY6PC.js";
100
103
  import "./chunk-4TR3HZFT.js";
101
104
  export {
105
+ AGENT_DONE_SOUNDS,
102
106
  FOLLOW_UP_BEHAVIORS,
103
107
  GITHUB_GIT_AUTH_MODES,
104
108
  HARNESS_ENV_KEYS,
105
109
  ISSUE_SOURCE_LABELS,
106
110
  PROFILE_NOTES_MAX,
107
111
  USAGE_ON_LIMIT_VALUES,
112
+ agentDoneSound,
108
113
  appSettingsPath,
109
114
  applyAppEnvironment,
110
115
  autoArchiveOnMergeEnabled,
@@ -152,6 +157,7 @@ export {
152
157
  historyMaxCount,
153
158
  historyMaxDays,
154
159
  isAbleTimeConnected,
160
+ isAgentDoneSound,
155
161
  isIssueSourceConnected,
156
162
  isLinearConnected,
157
163
  isUsageOnLimit,
@@ -42,7 +42,7 @@ import {
42
42
  summarizeTurnStderr,
43
43
  toolDescription,
44
44
  turnFailChatText
45
- } from "./chunk-SQHRPJ7P.js";
45
+ } from "./chunk-T7Y5ULHM.js";
46
46
  import {
47
47
  SLACK_REPLY_FORMATTING,
48
48
  addWorkspace,
@@ -65,7 +65,7 @@ import {
65
65
  stageAbsolutePathsAsAttachments,
66
66
  stageBuffersAsAttachments,
67
67
  syncWorkspacesFromThreads
68
- } from "./chunk-P2EAAM3H.js";
68
+ } from "./chunk-N7UXGM3Y.js";
69
69
  import {
70
70
  addPrStackLayer,
71
71
  allocateTeamName,
@@ -114,7 +114,7 @@ import {
114
114
  worktreeDisplayLabelForGroup,
115
115
  worktreeNameFromPath,
116
116
  worktreeSlugForTicket
117
- } from "./chunk-NFWPDEN4.js";
117
+ } from "./chunk-F3GT6DQW.js";
118
118
  import {
119
119
  ATTACHMENTS_DIR,
120
120
  DETACHED_JOBS_DIR,
@@ -177,7 +177,7 @@ import {
177
177
  updateAdvancedSettings,
178
178
  usageOnLimit,
179
179
  writeSecureJson
180
- } from "./chunk-Y5JES2VV.js";
180
+ } from "./chunk-RZTRWN2V.js";
181
181
  import {
182
182
  writePrivateFile
183
183
  } from "./chunk-NSTQ6QKD.js";
@@ -418,7 +418,7 @@ async function continueSourceThread(threadId, prompt) {
418
418
  await continueOnReply(threadId, prompt);
419
419
  return;
420
420
  }
421
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-6XEWQWSM.js");
421
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-GKAHLGXT.js");
422
422
  await getOrchestrator2().send(threadId, prompt);
423
423
  } catch {
424
424
  }
@@ -895,9 +895,9 @@ async function spawnAgentTurn(thread, input, onEvent) {
895
895
  `Cannot spawn ${thread.agent}: thread ${thread.id} has no worktreePath`
896
896
  );
897
897
  }
898
- const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-QPSJEXGR.js");
898
+ const { isGlobalThread: isGlobalThread2 } = await import("./global-workspace-G3QEVRGZ.js");
899
899
  if (isGlobalThread2(thread)) {
900
- const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-VZ7OSRLD.js");
900
+ const { ensureGlobalCoordinatorCwd: ensureGlobalCoordinatorCwd2 } = await import("./coordinator-prompt-RL3GKIAQ.js");
901
901
  ensureGlobalCoordinatorCwd2(
902
902
  isOrchestratorThread(thread) ? { orchestratorThreadId: thread.id } : void 0
903
903
  );
@@ -3918,7 +3918,7 @@ async function createThread(input, _onSetupLine) {
3918
3918
  });
3919
3919
  await requireAgent(resolved.agent);
3920
3920
  if (input.cowboy) {
3921
- const { cowboyModeEnabled } = await import("./app-settings-5RQMQKSB.js");
3921
+ const { cowboyModeEnabled } = await import("./app-settings-KBL2G7M4.js");
3922
3922
  if (!cowboyModeEnabled()) {
3923
3923
  throw new Error(
3924
3924
  "Cowboy mode is off. Enable it in Settings \u2192 Advanced."
@@ -3976,7 +3976,7 @@ async function createThread(input, _onSetupLine) {
3976
3976
  let sourceIsFork = false;
3977
3977
  if (!input.cowboy && sourceType === "branch" && (!sourceRef || sourceRef === "HEAD" || sourceRef === "default")) {
3978
3978
  if (isAbleTimeConnected() && getIssueSource() === "abletime") {
3979
- const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-BF253OZT.js");
3979
+ const { ensureAbleTimeTask, issueAttachmentForAbleTimeTask } = await import("./abletime-WZNDTRVL.js");
3980
3980
  const task = await ensureAbleTimeTask({
3981
3981
  title: title?.trim() || "Untitled work",
3982
3982
  description: input.prompt?.trim() || void 0
@@ -4539,7 +4539,7 @@ async function adoptThread(input) {
4539
4539
  messages: input.messages ?? []
4540
4540
  });
4541
4541
  writeThread(thread);
4542
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-TDBA64II.js");
4542
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-WXRPLT2N.js");
4543
4543
  await ensureWorkspace2(repoPath);
4544
4544
  const { ensureWorktreeSideboardIgnored: ensureWorktreeSideboardIgnored2 } = await import("./worktree-exclude-K7QK4RI5.js");
4545
4545
  await ensureWorktreeSideboardIgnored2(input.worktreePath);
@@ -6597,12 +6597,13 @@ function formatLongRunningDirective(opts) {
6597
6597
  "- 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>`.",
6598
6598
  "- 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.",
6599
6599
  "- 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.",
6600
- "State: `.context/.sideboard/detached-jobs/<id>/` (local scratch). Full guide: `/long-running` (always available)."
6600
+ "State: `.context/.sideboard/detached-jobs/<id>/` (local scratch). Full guide: `/long-running` (always available).",
6601
+ "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."
6601
6602
  ].join("\n");
6602
6603
  }
6603
6604
  function formatLongRunningReminder(opts) {
6604
6605
  const invoke = formatDetachedJobInvoke(opts?.scriptPath);
6605
- 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.`;
6606
+ 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).`;
6606
6607
  }
6607
6608
  function formatArtifactDirective() {
6608
6609
  return [
@@ -6614,7 +6615,7 @@ function formatArtifactDirective() {
6614
6615
  ].join("\n");
6615
6616
  }
6616
6617
  function formatUiReminder() {
6617
- 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.";
6618
+ 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.";
6618
6619
  }
6619
6620
 
6620
6621
  // src/review/review-write-gate.ts
@@ -7014,7 +7015,7 @@ function formatScheduledPrompt(name, prompt) {
7014
7015
  ${prompt}`;
7015
7016
  }
7016
7017
  async function defaultDeps() {
7017
- const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-6XEWQWSM.js");
7018
+ const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-GKAHLGXT.js");
7018
7019
  const orch = getOrchestrator2();
7019
7020
  return {
7020
7021
  findThread: (id) => findThreadByRef(id),
@@ -7331,7 +7332,7 @@ var Orchestrator = class {
7331
7332
  orphans: orphans.map((o) => ({ path: o.path, repoPath: o.repoPath }))
7332
7333
  });
7333
7334
  }
7334
- const { autoCleanupOrphansEnabled } = await import("./app-settings-5RQMQKSB.js");
7335
+ const { autoCleanupOrphansEnabled } = await import("./app-settings-KBL2G7M4.js");
7335
7336
  if (autoCleanupOrphansEnabled() && shouldRunWorktreeCleanup() && orphans.length > 0) {
7336
7337
  await cleanupOrphanWorktrees({ repoPaths });
7337
7338
  }
@@ -7618,7 +7619,7 @@ var Orchestrator = class {
7618
7619
  }
7619
7620
  await setup;
7620
7621
  if (skipSetup) return;
7621
- const { autoRunAfterSetupEnabled } = await import("./app-settings-5RQMQKSB.js");
7622
+ const { autoRunAfterSetupEnabled } = await import("./app-settings-KBL2G7M4.js");
7622
7623
  if (autoRunAfterSetupEnabled()) {
7623
7624
  try {
7624
7625
  await this.startDev(threadId);
@@ -7974,7 +7975,7 @@ var Orchestrator = class {
7974
7975
  }
7975
7976
  const isBrightsy = fresh.agent === "brightsy";
7976
7977
  const isOrchestration = isOrchestratorThread(fresh);
7977
- const { autoRenameBranchEnabled, getGithubGitAuthMode, gitBranchPrefixSetting } = await import("./app-settings-5RQMQKSB.js");
7978
+ const { autoRenameBranchEnabled, getGithubGitAuthMode, gitBranchPrefixSetting } = await import("./app-settings-KBL2G7M4.js");
7978
7979
  const gitAuthMode = getGithubGitAuthMode();
7979
7980
  const worktreeDirective = isBrightsy || isOrchestration ? null : formatWorktreeDirective(fresh, {
7980
7981
  githubSlug: await withTimeout(
@@ -9118,7 +9119,7 @@ var Orchestrator = class {
9118
9119
  if (!titled.userSetTitle && meta.title && titled.title !== meta.title) {
9119
9120
  updateThread(thread.id, { title: meta.title });
9120
9121
  }
9121
- const { autoArchiveOnMergeEnabled } = await import("./app-settings-5RQMQKSB.js");
9122
+ const { autoArchiveOnMergeEnabled } = await import("./app-settings-KBL2G7M4.js");
9122
9123
  const latest = this.requireThread(thread.id);
9123
9124
  if (!shouldAutoArchiveOnPrMerge({
9124
9125
  previousPrState: prevState || null,
@@ -9400,7 +9401,7 @@ var Orchestrator = class {
9400
9401
  this.enforceHistoryRetention();
9401
9402
  if (thread.repoPath && !isGlobalRepoPath(thread.repoPath)) {
9402
9403
  try {
9403
- const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-TDBA64II.js");
9404
+ const { ensureWorkspace: ensureWorkspace2 } = await import("./workspaces-WXRPLT2N.js");
9404
9405
  await ensureWorkspace2(thread.repoPath);
9405
9406
  } catch {
9406
9407
  }
@@ -9427,7 +9428,7 @@ var Orchestrator = class {
9427
9428
  await runArchiveScript(thread.repoPath, thread.worktreePath);
9428
9429
  } catch {
9429
9430
  }
9430
- const { deleteBranchOnPurgeEnabled } = await import("./app-settings-5RQMQKSB.js");
9431
+ const { deleteBranchOnPurgeEnabled } = await import("./app-settings-KBL2G7M4.js");
9431
9432
  const deleteBranch = opts?.deleteBranch ?? deleteBranchOnPurgeEnabled();
9432
9433
  await removeWorktree(thread.repoPath, thread.worktreePath, {
9433
9434
  deleteBranch: deleteBranch ? thread.branchName : void 0
@@ -9454,7 +9455,7 @@ var Orchestrator = class {
9454
9455
  `Cowboy checkout missing: ${thread.worktreePath}. Re-add the project folder, then restore.`
9455
9456
  );
9456
9457
  }
9457
- const { createThreadWorktree: createThreadWorktree2 } = await import("./worktree-I573UOPD.js");
9458
+ const { createThreadWorktree: createThreadWorktree2 } = await import("./worktree-L6FJXFUC.js");
9458
9459
  const slug = thread.worktreePath.split("/").pop();
9459
9460
  const dest = thread.worktreePath;
9460
9461
  await withRepoGitLock(thread.repoPath, async () => {
@@ -9564,7 +9565,7 @@ async function startOrchestration(opts) {
9564
9565
  sourceRef: "default",
9565
9566
  ...createOpts
9566
9567
  }).catch(async () => {
9567
- const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-I573UOPD.js");
9568
+ const { resolveDefaultBranch: resolveDefaultBranch2, resolveRepoRoot: resolveRepoRoot2 } = await import("./worktree-L6FJXFUC.js");
9568
9569
  const repo = await resolveRepoRoot2(repoPath);
9569
9570
  const def = await resolveDefaultBranch2(repo);
9570
9571
  return orch.createThread({
@@ -9594,6 +9595,7 @@ export {
9594
9595
  recordSlackOutboundWatch,
9595
9596
  pollSlackOutboundWatches,
9596
9597
  AGENT_GIT_ACTIONS,
9598
+ threadsSharingWorktree,
9597
9599
  mcpWaitForTurnTimeoutMs,
9598
9600
  mcpWaitStillRunningHint,
9599
9601
  mcpWaitFinishedHint,
@@ -6,7 +6,7 @@ import {
6
6
  resolveRepoRoot,
7
7
  takenSlugsFromThread,
8
8
  teamSlugFromName
9
- } from "./chunk-KTZESHYH.js";
9
+ } from "./chunk-AMMRFFB7.js";
10
10
  import {
11
11
  ATTACHMENTS_DIR,
12
12
  attachmentsGitignoreBody
@@ -23,7 +23,7 @@ import {
23
23
  resolveThreadDefaults,
24
24
  resolveViewerProfile,
25
25
  resolveViewerProfileForRepo
26
- } from "./chunk-EWHJNJHV.js";
26
+ } from "./chunk-I5NC7DWO.js";
27
27
  import {
28
28
  createEmptyThread,
29
29
  listThreads,
@@ -7,7 +7,7 @@ import {
7
7
  import {
8
8
  getGithubGitAuthMode,
9
9
  getGithubPat
10
- } from "./chunk-EWHJNJHV.js";
10
+ } from "./chunk-I5NC7DWO.js";
11
11
  import {
12
12
  listThreads
13
13
  } from "./chunk-3IMSQNTS.js";
@@ -6,7 +6,7 @@ import {
6
6
  import {
7
7
  getAbleTimeHost,
8
8
  isAbleTimeConnected
9
- } from "./chunk-Y5JES2VV.js";
9
+ } from "./chunk-RZTRWN2V.js";
10
10
 
11
11
  // src/integrations/abletime-mcp.ts
12
12
  var DEFAULT_ABLETIME_HOST = "https://track.abletime.com";
@@ -155,7 +155,7 @@ function textsFromUnknown(value) {
155
155
  return "";
156
156
  }
157
157
  async function abletimeMcpRequest(method, params, opts) {
158
- const rawToken = opts?.token ?? await import("./abletime-oauth-H4672PRH.js").then((m) => m.ensureAbleTimeAccessToken());
158
+ const rawToken = opts?.token ?? await import("./abletime-oauth-ZLU2EYRK.js").then((m) => m.ensureAbleTimeAccessToken());
159
159
  if (!rawToken?.trim()) {
160
160
  throw new Error("AbleTime is not connected \u2014 paste a personal access token in Account settings");
161
161
  }
@@ -226,9 +226,9 @@ async function callAbleTimeTool(name, args = {}, opts) {
226
226
  if (!opts?.token && !isAbleTimeConnected()) {
227
227
  throw new Error("AbleTime is not connected \u2014 paste a personal access token in Account settings");
228
228
  }
229
- const rawToken = opts?.token ?? await import("./abletime-oauth-H4672PRH.js").then((m) => m.ensureAbleTimeAccessToken());
229
+ const rawToken = opts?.token ?? await import("./abletime-oauth-ZLU2EYRK.js").then((m) => m.ensureAbleTimeAccessToken());
230
230
  if (rawToken && ableTimeUsesRest(rawToken)) {
231
- const { callAbleTimeRestTool } = await import("./abletime-rest-OPEVV3XC.js");
231
+ const { callAbleTimeRestTool } = await import("./abletime-rest-WNHIATB3.js");
232
232
  return callAbleTimeRestTool(name, args, { ...opts, token: rawToken });
233
233
  }
234
234
  const requestOpts = { ...opts, pm: opts?.pm ?? abletimeToolUsesPm(name) };
@@ -244,7 +244,7 @@ async function callAbleTimeTool(name, args = {}, opts) {
244
244
  return await call();
245
245
  }
246
246
  if (rawToken && ableTimeUsesRest(rawToken) && isAbleTimeRejectedCredential(message)) {
247
- const { callAbleTimeRestTool } = await import("./abletime-rest-OPEVV3XC.js");
247
+ const { callAbleTimeRestTool } = await import("./abletime-rest-WNHIATB3.js");
248
248
  return callAbleTimeRestTool(name, args, { ...opts, token: rawToken });
249
249
  }
250
250
  throw err instanceof Error ? new Error(rewriteAbleTimeError(err.message)) : err;
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  DEFAULT_ABLETIME_HOST,
3
3
  normalizeAbleTimeHost
4
- } from "./chunk-646I442S.js";
4
+ } from "./chunk-MVLXDYN5.js";
5
5
  import {
6
6
  httpFetch
7
7
  } from "./chunk-N7WZ6NIN.js";
@@ -10,7 +10,7 @@ import {
10
10
  getAbleTimeHost,
11
11
  loadAppSettings,
12
12
  saveAbleTimeConnection
13
- } from "./chunk-EWHJNJHV.js";
13
+ } from "./chunk-I5NC7DWO.js";
14
14
 
15
15
  // src/integrations/abletime-oauth.ts
16
16
  import { createHash, randomBytes } from "crypto";
@@ -280,7 +280,7 @@ async function startAbleTimeOAuth(opts) {
280
280
  persistAbleTimeTokens(data, { host });
281
281
  const token = data.access_token.trim();
282
282
  try {
283
- const { getAbleTimeOrientation } = await import("./abletime-D6773P33.js");
283
+ const { getAbleTimeOrientation } = await import("./abletime-BGVOCEOU.js");
284
284
  const orientation = await getAbleTimeOrientation({ token, host });
285
285
  return saveAbleTimeConnection({
286
286
  accessToken: token,
@@ -22,7 +22,7 @@ import {
22
22
  import {
23
23
  getGithubGitAuthMode,
24
24
  getGithubPat
25
- } from "./chunk-Y5JES2VV.js";
25
+ } from "./chunk-RZTRWN2V.js";
26
26
  import {
27
27
  worktreesRoot
28
28
  } from "./chunk-EQNRWDLN.js";
@@ -6,14 +6,14 @@ import {
6
6
  normalizeAbleTimeCredential,
7
7
  normalizeAbleTimeHost,
8
8
  rewriteAbleTimeError
9
- } from "./chunk-HSYE5ID6.js";
9
+ } from "./chunk-AS4UN7QL.js";
10
10
  import {
11
11
  httpFetch
12
12
  } from "./chunk-VKQGAWHY.js";
13
13
  import {
14
14
  getAbleTimeAccessToken,
15
15
  getAbleTimeHost
16
- } from "./chunk-Y5JES2VV.js";
16
+ } from "./chunk-RZTRWN2V.js";
17
17
 
18
18
  // src/integrations/abletime-rest.ts
19
19
  var ABLETIME_REST_PREFIX = "/api/public/v2";
@@ -568,6 +568,21 @@ var DEFAULT_AGENTS = /* @__PURE__ */ new Set([
568
568
  ]);
569
569
  var GITHUB_GIT_AUTH_MODES = ["auto", "gh", "ssh", "token"];
570
570
  var FOLLOW_UP_BEHAVIORS = ["steer", "queue"];
571
+ var AGENT_DONE_SOUNDS = [
572
+ "none",
573
+ "goal",
574
+ "bell",
575
+ "level",
576
+ "coin",
577
+ "fanfare",
578
+ "magic",
579
+ "rooster",
580
+ "whistle",
581
+ "custom"
582
+ ];
583
+ function isAgentDoneSound(value) {
584
+ return AGENT_DONE_SOUNDS.includes(value);
585
+ }
571
586
  function emptyPublicIntegrations() {
572
587
  return {
573
588
  hasLinearApiKey: false,
@@ -1006,6 +1021,13 @@ function normalizeAdvanced(raw) {
1006
1021
  if (source.followUpBehavior === "queue" || source.followUpBehavior === "steer") {
1007
1022
  out.followUpBehavior = source.followUpBehavior;
1008
1023
  }
1024
+ if (isAgentDoneSound(source.agentDoneSound)) {
1025
+ out.agentDoneSound = source.agentDoneSound;
1026
+ }
1027
+ if (typeof source.agentDoneCustomSoundName === "string") {
1028
+ const name = source.agentDoneCustomSoundName.trim();
1029
+ if (name) out.agentDoneCustomSoundName = name.slice(0, 200);
1030
+ }
1009
1031
  return out;
1010
1032
  }
1011
1033
  function normalizeSettings(raw) {
@@ -1929,6 +1951,16 @@ function updateAdvancedSettings(patch) {
1929
1951
  if (patch.followUpBehavior === "queue" || patch.followUpBehavior === "steer") {
1930
1952
  advanced.followUpBehavior = patch.followUpBehavior;
1931
1953
  }
1954
+ if (isAgentDoneSound(patch.agentDoneSound)) {
1955
+ advanced.agentDoneSound = patch.agentDoneSound;
1956
+ }
1957
+ if (patch.agentDoneCustomSoundName === null || patch.agentDoneCustomSoundName === "") {
1958
+ delete advanced.agentDoneCustomSoundName;
1959
+ } else if (typeof patch.agentDoneCustomSoundName === "string") {
1960
+ const name = patch.agentDoneCustomSoundName.trim();
1961
+ if (name) advanced.agentDoneCustomSoundName = name.slice(0, 200);
1962
+ else delete advanced.agentDoneCustomSoundName;
1963
+ }
1932
1964
  return saveAppSettings({ ...current, advanced });
1933
1965
  }
1934
1966
  function autoRenameBranchEnabled(settings = loadAppSettings()) {
@@ -1996,6 +2028,9 @@ function orchestrationQuotaFallbackAgent(settings = loadAppSettings()) {
1996
2028
  function followUpBehavior(settings = loadAppSettings()) {
1997
2029
  return settings.advanced.followUpBehavior === "queue" ? "queue" : "steer";
1998
2030
  }
2031
+ function agentDoneSound(settings = loadAppSettings()) {
2032
+ return isAgentDoneSound(settings.advanced.agentDoneSound) ? settings.advanced.agentDoneSound : "none";
2033
+ }
1999
2034
  function maxConcurrentAgents(settings = loadAppSettings()) {
2000
2035
  const n = settings.advanced.maxConcurrent;
2001
2036
  if (typeof n === "number" && Number.isFinite(n)) {
@@ -2140,6 +2175,8 @@ export {
2140
2175
  HARNESS_ENV_KEYS,
2141
2176
  GITHUB_GIT_AUTH_MODES,
2142
2177
  FOLLOW_UP_BEHAVIORS,
2178
+ AGENT_DONE_SOUNDS,
2179
+ isAgentDoneSound,
2143
2180
  emptyPublicIntegrations,
2144
2181
  toPublicAppSettings,
2145
2182
  appSettingsPath,
@@ -2208,6 +2245,7 @@ export {
2208
2245
  orchestrationQuotaOnLimit,
2209
2246
  orchestrationQuotaFallbackAgent,
2210
2247
  followUpBehavior,
2248
+ agentDoneSound,
2211
2249
  maxConcurrentAgents,
2212
2250
  resolveClaudeExecutable,
2213
2251
  resolveAgentExecutable,