@sideboard-ai/core 0.1.273 → 0.1.275

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-4ZSDI4YP.js → abletime-VCVPSLSU.js} +4 -4
  2. package/dist/{abletime-JNQAHLHH.js → abletime-VRATUMDO.js} +4 -4
  3. package/dist/{abletime-oauth-4RXZH2KU.js → abletime-oauth-4C4G2J3R.js} +3 -3
  4. package/dist/{abletime-oauth-DCEIINYT.js → abletime-oauth-4K7MICAD.js} +3 -3
  5. package/dist/{abletime-rest-KVBJFVFD.js → abletime-rest-6N63ZVQ3.js} +3 -3
  6. package/dist/{abletime-rest-VN6PZ6P2.js → abletime-rest-PIBCNHF3.js} +3 -3
  7. package/dist/{agents-LAFFXBBZ.js → agents-2FOWVJCN.js} +4 -4
  8. package/dist/{agents-ZCO37SKG.js → agents-JBVJRDH3.js} +4 -4
  9. package/dist/{app-settings-RAC4PSSP.js → app-settings-EQQZQNYD.js} +1 -1
  10. package/dist/{app-settings-L5HGYXWJ.js → app-settings-NI4X5HW3.js} +1 -1
  11. package/dist/{chunk-UXI52MLJ.js → chunk-2J34G3WJ.js} +3 -3
  12. package/dist/{chunk-PTNGMA5C.js → chunk-A2G3ZBJS.js} +2 -2
  13. package/dist/{chunk-T47ARZ5Q.js → chunk-FELFTNH2.js} +25 -24
  14. package/dist/{chunk-OUBQH5GR.js → chunk-HOMZKYHF.js} +31 -29
  15. package/dist/{chunk-GONPMH36.js → chunk-IJDQKC5A.js} +5 -5
  16. package/dist/{chunk-USBZ7PH4.js → chunk-IPPY3FG5.js} +1 -1
  17. package/dist/{chunk-NWE3NOWQ.js → chunk-K7MWJLR7.js} +1 -1
  18. package/dist/{chunk-HO2T6BC3.js → chunk-MGS5T2A3.js} +31 -29
  19. package/dist/{chunk-ADWNK2JH.js → chunk-NIB2IZ6J.js} +5 -5
  20. package/dist/{chunk-AGXZAMOF.js → chunk-NQ7JMVSU.js} +2 -2
  21. package/dist/{chunk-JLDJGGCL.js → chunk-NT7RIWRR.js} +5 -5
  22. package/dist/{chunk-L6CYOON4.js → chunk-PZURG3XN.js} +5 -5
  23. package/dist/{chunk-LAIBYKZS.js → chunk-QINJKNLR.js} +3 -3
  24. package/dist/{chunk-2QUILREI.js → chunk-QTZO4LPU.js} +2 -2
  25. package/dist/{chunk-KZ2CDZBZ.js → chunk-R7HLXD4I.js} +3 -3
  26. package/dist/{chunk-N3LASDJM.js → chunk-SQOAFR2U.js} +26 -25
  27. package/dist/{chunk-OIENQEGG.js → chunk-WRIMAEF2.js} +67 -122
  28. package/dist/{chunk-DBFAFI5A.js → chunk-XKZAVGTT.js} +2 -2
  29. package/dist/{chunk-PAH7KDL2.js → chunk-YNTXWFXT.js} +67 -122
  30. package/dist/{conductor-3AQM67VK.js → conductor-GBCE37K4.js} +4 -4
  31. package/dist/{conductor-FLWACOVC.js → conductor-YYQKZAND.js} +4 -4
  32. package/dist/{coordinator-prompt-4KVA6XUX.js → coordinator-prompt-B3GLVXPP.js} +3 -3
  33. package/dist/{coordinator-prompt-MVUHFNSC.js → coordinator-prompt-SFZCZ3HR.js} +3 -3
  34. package/dist/{global-workspace-FR7QTLPK.js → global-workspace-7XEXTIHL.js} +3 -3
  35. package/dist/{global-workspace-34Z2IWYQ.js → global-workspace-N2YYJKA5.js} +3 -3
  36. package/dist/index.cjs +1700 -186
  37. package/dist/index.d.cts +99 -20
  38. package/dist/index.d.ts +99 -20
  39. package/dist/index.js +1583 -43
  40. package/dist/mcp/run-stdio.cjs +95 -141
  41. package/dist/mcp/run-stdio.js +11 -11
  42. package/dist/{orchestrator-YKSDWR6C.js → orchestrator-6QJLM6Y4.js} +6 -6
  43. package/dist/{orchestrator-K42IBMBE.js → orchestrator-QMKVXVUR.js} +6 -6
  44. package/dist/{workspaces-5GERYHDJ.js → workspaces-BJCHMGVG.js} +3 -3
  45. package/dist/{workspaces-2JBDUMM6.js → workspaces-PBB6HY2D.js} +3 -3
  46. package/dist/{worktree-ACW23KJ5.js → worktree-L57T3KH7.js} +2 -2
  47. package/dist/{worktree-C7RPVHZ7.js → worktree-Q6UJHG25.js} +2 -2
  48. package/package.json +1 -1
@@ -3872,6 +3872,9 @@ function normalizeVault(raw) {
3872
3872
  if (typeof raw.remoteHostSecret === "string" && raw.remoteHostSecret.trim()) {
3873
3873
  out.remoteHostSecret = raw.remoteHostSecret.trim();
3874
3874
  }
3875
+ if (typeof raw.remoteAccountToken === "string" && raw.remoteAccountToken.trim()) {
3876
+ out.remoteAccountToken = raw.remoteAccountToken.trim();
3877
+ }
3875
3878
  if (typeof raw.githubPat === "string" && raw.githubPat.trim()) {
3876
3879
  out.githubPat = raw.githubPat.trim();
3877
3880
  }
@@ -4540,7 +4543,8 @@ function emptyPublicIntegrations() {
4540
4543
  hasVercelToken: false,
4541
4544
  hasSupabaseToken: false,
4542
4545
  hasPosthogToken: false,
4543
- hasSentryToken: false
4546
+ hasSentryToken: false,
4547
+ hasRemoteAccount: false
4544
4548
  };
4545
4549
  }
4546
4550
  function hasLinearOAuth(integrations) {
@@ -4557,29 +4561,7 @@ function toPublicAppSettings(settings) {
4557
4561
  if (key.trim()) environment[key] = "";
4558
4562
  }
4559
4563
  const integrations = { ...settings.integrations };
4560
- const slackClientSecret = integrations.slackClientSecret;
4561
- const slackAppToken = integrations.slackAppToken;
4562
- const githubPat = integrations.githubPat;
4563
- const abletimeAccessToken = integrations.abletimeAccessToken;
4564
- const abletimeRefreshToken = integrations.abletimeRefreshToken;
4565
- const vercelToken = integrations.vercelToken;
4566
- const supabaseAccessToken = integrations.supabaseAccessToken;
4567
- const posthogPersonalApiKey = integrations.posthogPersonalApiKey;
4568
- const sentryAuthToken = integrations.sentryAuthToken;
4569
- delete integrations.linearApiKey;
4570
- delete integrations.linearAccessToken;
4571
- delete integrations.linearRefreshToken;
4572
- delete integrations.linearClientSecret;
4573
- delete integrations.slackClientSecret;
4574
- delete integrations.slackAppToken;
4575
- delete integrations.remoteHostSecret;
4576
- delete integrations.githubPat;
4577
- delete integrations.abletimeAccessToken;
4578
- delete integrations.abletimeRefreshToken;
4579
- delete integrations.vercelToken;
4580
- delete integrations.supabaseAccessToken;
4581
- delete integrations.posthogPersonalApiKey;
4582
- delete integrations.sentryAuthToken;
4564
+ for (const key of INTEGRATION_VAULT_KEYS) delete integrations[key];
4583
4565
  return {
4584
4566
  ...settings,
4585
4567
  environment,
@@ -4587,15 +4569,18 @@ function toPublicAppSettings(settings) {
4587
4569
  ...integrations,
4588
4570
  hasLinearApiKey: hasLinearCredentials(settings.integrations),
4589
4571
  hasLinearOAuth: hasLinearOAuth(settings.integrations),
4590
- hasSlackClientSecret: Boolean(slackClientSecret?.trim()),
4591
- hasSlackAppToken: Boolean(slackAppToken?.trim()),
4592
- hasGithubPat: Boolean(githubPat?.trim()),
4593
- hasAbleTimeToken: Boolean(abletimeAccessToken?.trim() || abletimeRefreshToken?.trim()),
4594
- hasAbleTimeOAuth: Boolean(abletimeRefreshToken?.trim()),
4595
- hasVercelToken: Boolean(vercelToken?.trim()),
4596
- hasSupabaseToken: Boolean(supabaseAccessToken?.trim()),
4597
- hasPosthogToken: Boolean(posthogPersonalApiKey?.trim()),
4598
- hasSentryToken: Boolean(sentryAuthToken?.trim())
4572
+ hasSlackClientSecret: Boolean(settings.integrations.slackClientSecret?.trim()),
4573
+ hasSlackAppToken: Boolean(settings.integrations.slackAppToken?.trim()),
4574
+ hasGithubPat: Boolean(settings.integrations.githubPat?.trim()),
4575
+ hasAbleTimeToken: Boolean(
4576
+ settings.integrations.abletimeAccessToken?.trim() || settings.integrations.abletimeRefreshToken?.trim()
4577
+ ),
4578
+ hasAbleTimeOAuth: Boolean(settings.integrations.abletimeRefreshToken?.trim()),
4579
+ hasVercelToken: Boolean(settings.integrations.vercelToken?.trim()),
4580
+ hasSupabaseToken: Boolean(settings.integrations.supabaseAccessToken?.trim()),
4581
+ hasPosthogToken: Boolean(settings.integrations.posthogPersonalApiKey?.trim()),
4582
+ hasSentryToken: Boolean(settings.integrations.sentryAuthToken?.trim()),
4583
+ hasRemoteAccount: Boolean(settings.integrations.remoteAccountToken?.trim())
4599
4584
  }
4600
4585
  };
4601
4586
  }
@@ -4722,6 +4707,14 @@ function normalizeIntegrations(raw) {
4722
4707
  const secret = source.remoteHostSecret.trim();
4723
4708
  if (secret) out.remoteHostSecret = secret;
4724
4709
  }
4710
+ if (typeof source.remoteAccountToken === "string") {
4711
+ const token = source.remoteAccountToken.trim();
4712
+ if (token) out.remoteAccountToken = token;
4713
+ }
4714
+ if (typeof source.remoteAccountEmail === "string") {
4715
+ const email = source.remoteAccountEmail.trim().toLowerCase();
4716
+ if (email) out.remoteAccountEmail = email;
4717
+ }
4725
4718
  if (typeof source.githubGitAuthMode === "string" && GIT_AUTH_MODES.has(source.githubGitAuthMode)) {
4726
4719
  out.githubGitAuthMode = source.githubGitAuthMode;
4727
4720
  }
@@ -5065,110 +5058,31 @@ function readSettingsFile() {
5065
5058
  }
5066
5059
  }
5067
5060
  function diskHoldsSecrets(disk) {
5068
- return Boolean(
5069
- disk.integrations.linearApiKey || disk.integrations.linearAccessToken || disk.integrations.linearRefreshToken || disk.integrations.linearClientSecret || disk.integrations.slackClientSecret || disk.integrations.slackAppToken || disk.integrations.remoteHostSecret || disk.integrations.githubPat || disk.integrations.abletimeAccessToken || disk.integrations.abletimeRefreshToken || disk.integrations.vercelToken || disk.integrations.supabaseAccessToken || disk.integrations.posthogPersonalApiKey || disk.integrations.sentryAuthToken || Object.keys(disk.environment).length > 0
5070
- );
5061
+ return INTEGRATION_VAULT_KEYS.some((key) => Boolean(disk.integrations[key])) || Object.keys(disk.environment).length > 0;
5071
5062
  }
5072
5063
  function mergeVault(disk) {
5073
5064
  const vault = loadSecretVault();
5074
5065
  const environment = { ...vault.environment ?? {}, ...disk.environment };
5075
5066
  const integrations = { ...disk.integrations };
5076
- if (vault.linearApiKey && !integrations.linearApiKey) {
5077
- integrations.linearApiKey = vault.linearApiKey;
5078
- }
5079
- if (vault.linearAccessToken && !integrations.linearAccessToken) {
5080
- integrations.linearAccessToken = vault.linearAccessToken;
5081
- }
5082
- if (vault.linearRefreshToken && !integrations.linearRefreshToken) {
5083
- integrations.linearRefreshToken = vault.linearRefreshToken;
5084
- }
5085
- if (vault.linearClientSecret && !integrations.linearClientSecret) {
5086
- integrations.linearClientSecret = vault.linearClientSecret;
5087
- }
5088
- if (vault.slackClientSecret && !integrations.slackClientSecret) {
5089
- integrations.slackClientSecret = vault.slackClientSecret;
5090
- }
5091
- if (vault.slackAppToken && !integrations.slackAppToken) {
5092
- integrations.slackAppToken = vault.slackAppToken;
5093
- }
5094
- if (vault.remoteHostSecret && !integrations.remoteHostSecret) {
5095
- integrations.remoteHostSecret = vault.remoteHostSecret;
5096
- }
5097
- if (vault.githubPat && !integrations.githubPat) {
5098
- integrations.githubPat = vault.githubPat;
5099
- }
5100
- if (vault.abletimeAccessToken && !integrations.abletimeAccessToken) {
5101
- integrations.abletimeAccessToken = vault.abletimeAccessToken;
5102
- }
5103
- if (vault.abletimeRefreshToken && !integrations.abletimeRefreshToken) {
5104
- integrations.abletimeRefreshToken = vault.abletimeRefreshToken;
5105
- }
5106
- if (vault.vercelToken && !integrations.vercelToken) {
5107
- integrations.vercelToken = vault.vercelToken;
5108
- }
5109
- if (vault.supabaseAccessToken && !integrations.supabaseAccessToken) {
5110
- integrations.supabaseAccessToken = vault.supabaseAccessToken;
5111
- }
5112
- if (vault.posthogPersonalApiKey && !integrations.posthogPersonalApiKey) {
5113
- integrations.posthogPersonalApiKey = vault.posthogPersonalApiKey;
5114
- }
5115
- if (vault.sentryAuthToken && !integrations.sentryAuthToken) {
5116
- integrations.sentryAuthToken = vault.sentryAuthToken;
5067
+ for (const key of INTEGRATION_VAULT_KEYS) {
5068
+ const stored = vault[key];
5069
+ if (stored && !integrations[key]) integrations[key] = stored;
5117
5070
  }
5118
5071
  return { ...disk, environment, integrations };
5119
5072
  }
5120
5073
  function persistSplit(settings) {
5121
5074
  const integrations = { ...settings.integrations };
5122
- const linearApiKey = integrations.linearApiKey;
5123
- const linearAccessToken = integrations.linearAccessToken;
5124
- const linearRefreshToken = integrations.linearRefreshToken;
5125
- const linearClientSecret = integrations.linearClientSecret;
5126
- const slackClientSecret = integrations.slackClientSecret;
5127
- const slackAppToken = integrations.slackAppToken;
5128
- const remoteHostSecret = integrations.remoteHostSecret;
5129
- const githubPat = integrations.githubPat;
5130
- const abletimeAccessToken = integrations.abletimeAccessToken;
5131
- const abletimeRefreshToken = integrations.abletimeRefreshToken;
5132
- const vercelToken = integrations.vercelToken;
5133
- const supabaseAccessToken = integrations.supabaseAccessToken;
5134
- const posthogPersonalApiKey = integrations.posthogPersonalApiKey;
5135
- const sentryAuthToken = integrations.sentryAuthToken;
5136
- delete integrations.linearApiKey;
5137
- delete integrations.linearAccessToken;
5138
- delete integrations.linearRefreshToken;
5139
- delete integrations.linearClientSecret;
5140
- delete integrations.slackClientSecret;
5141
- delete integrations.slackAppToken;
5142
- delete integrations.remoteHostSecret;
5143
- delete integrations.githubPat;
5144
- delete integrations.abletimeAccessToken;
5145
- delete integrations.abletimeRefreshToken;
5146
- delete integrations.vercelToken;
5147
- delete integrations.supabaseAccessToken;
5148
- delete integrations.posthogPersonalApiKey;
5149
- delete integrations.sentryAuthToken;
5075
+ const vault = { environment: settings.environment };
5076
+ for (const key of INTEGRATION_VAULT_KEYS) {
5077
+ vault[key] = integrations[key];
5078
+ delete integrations[key];
5079
+ }
5150
5080
  writePrivateFile2(
5151
5081
  appSettingsPath(),
5152
5082
  `${JSON.stringify({ ...settings, environment: {}, integrations }, null, 2)}
5153
5083
  `
5154
5084
  );
5155
- saveSecretVault({
5156
- linearApiKey,
5157
- linearAccessToken,
5158
- linearRefreshToken,
5159
- linearClientSecret,
5160
- slackClientSecret,
5161
- slackAppToken,
5162
- remoteHostSecret,
5163
- githubPat,
5164
- abletimeAccessToken,
5165
- abletimeRefreshToken,
5166
- vercelToken,
5167
- supabaseAccessToken,
5168
- posthogPersonalApiKey,
5169
- sentryAuthToken,
5170
- environment: settings.environment
5171
- });
5085
+ saveSecretVault(vault);
5172
5086
  }
5173
5087
  function loadAppSettings() {
5174
5088
  const disk = readSettingsFile();
@@ -5379,6 +5293,20 @@ function updateIntegrationsSettings(patch) {
5379
5293
  integrations.remoteHostSecret = patch.remoteHostSecret.trim();
5380
5294
  }
5381
5295
  }
5296
+ if ("remoteAccountToken" in patch) {
5297
+ if (patch.remoteAccountToken == null || patch.remoteAccountToken.trim() === "") {
5298
+ delete integrations.remoteAccountToken;
5299
+ } else {
5300
+ integrations.remoteAccountToken = patch.remoteAccountToken.trim();
5301
+ }
5302
+ }
5303
+ if ("remoteAccountEmail" in patch) {
5304
+ if (patch.remoteAccountEmail == null || patch.remoteAccountEmail.trim() === "") {
5305
+ delete integrations.remoteAccountEmail;
5306
+ } else {
5307
+ integrations.remoteAccountEmail = patch.remoteAccountEmail.trim().toLowerCase();
5308
+ }
5309
+ }
5382
5310
  if ("githubGitAuthMode" in patch) {
5383
5311
  if (patch.githubGitAuthMode == null) {
5384
5312
  delete integrations.githubGitAuthMode;
@@ -6117,7 +6045,7 @@ function childEnvWithAppSettings(extra) {
6117
6045
  function harnessEnvKey(harness) {
6118
6046
  return HARNESS_ENV_KEYS[harness];
6119
6047
  }
6120
- var import_node_crypto2, import_node_fs15, import_node_os6, import_node_path16, HARNESS_ENV_KEYS, DEFAULT_AGENTS, GITHUB_GIT_AUTH_MODES, FOLLOW_UP_BEHAVIORS, AGENT_DONE_SOUNDS, CHAT_TEXT_SCALES, CHAT_TEXT_SCALE_DEFAULT, CLOUD_CONNECT_AGENTS, ISSUE_SOURCES, GIT_AUTH_MODES, REVIEW_LABEL_MAX, EMPTY_SETTINGS, CONFIRM_ACCOUNT, CONFIRM_PROJECT, DEFAULT_CLI_BIN;
6048
+ var import_node_crypto2, import_node_fs15, import_node_os6, import_node_path16, HARNESS_ENV_KEYS, DEFAULT_AGENTS, GITHUB_GIT_AUTH_MODES, FOLLOW_UP_BEHAVIORS, AGENT_DONE_SOUNDS, CHAT_TEXT_SCALES, CHAT_TEXT_SCALE_DEFAULT, INTEGRATION_VAULT_KEYS, CLOUD_CONNECT_AGENTS, ISSUE_SOURCES, GIT_AUTH_MODES, REVIEW_LABEL_MAX, EMPTY_SETTINGS, CONFIRM_ACCOUNT, CONFIRM_PROJECT, DEFAULT_CLI_BIN;
6121
6049
  var init_app_settings = __esm({
6122
6050
  "src/store/app-settings.ts"() {
6123
6051
  "use strict";
@@ -6170,6 +6098,23 @@ var init_app_settings = __esm({
6170
6098
  ];
6171
6099
  CHAT_TEXT_SCALES = [1.2, 1.4];
6172
6100
  CHAT_TEXT_SCALE_DEFAULT = 1.2;
6101
+ INTEGRATION_VAULT_KEYS = [
6102
+ "linearApiKey",
6103
+ "linearAccessToken",
6104
+ "linearRefreshToken",
6105
+ "linearClientSecret",
6106
+ "slackClientSecret",
6107
+ "slackAppToken",
6108
+ "remoteHostSecret",
6109
+ "remoteAccountToken",
6110
+ "githubPat",
6111
+ "abletimeAccessToken",
6112
+ "abletimeRefreshToken",
6113
+ "vercelToken",
6114
+ "supabaseAccessToken",
6115
+ "posthogPersonalApiKey",
6116
+ "sentryAuthToken"
6117
+ ];
6173
6118
  CLOUD_CONNECT_AGENTS = /* @__PURE__ */ new Set([
6174
6119
  "claude",
6175
6120
  "codex",
@@ -16064,17 +16009,7 @@ var init_worktree_run_ports = __esm({
16064
16009
  }
16065
16010
  });
16066
16011
 
16067
- // src/mcp/wait-for-job.ts
16068
- function mcpWaitForJobTimeoutMs(requested) {
16069
- return mcpWaitForTurnTimeoutMs(requested);
16070
- }
16071
- function sanitizeDetachedJobId(id) {
16072
- const s = id.trim();
16073
- if (!JOB_ID_RE.test(s)) {
16074
- throw new Error(`detached-job id must be 1\u201364 chars [A-Za-z0-9._-], got ${JSON.stringify(id)}`);
16075
- }
16076
- return s;
16077
- }
16012
+ // src/mcp/job-process.ts
16078
16013
  function jobAlive(pid) {
16079
16014
  if (!Number.isInteger(pid) || pid <= 0) return false;
16080
16015
  try {
@@ -16098,6 +16033,23 @@ function jobTreeAlive(pid) {
16098
16033
  if (pid == null) return false;
16099
16034
  return jobAlive(pid) || processGroupAlive(pid);
16100
16035
  }
16036
+ var init_job_process = __esm({
16037
+ "src/mcp/job-process.ts"() {
16038
+ "use strict";
16039
+ }
16040
+ });
16041
+
16042
+ // src/mcp/wait-for-job.ts
16043
+ function mcpWaitForJobTimeoutMs(requested) {
16044
+ return mcpWaitForTurnTimeoutMs(requested);
16045
+ }
16046
+ function sanitizeDetachedJobId(id) {
16047
+ const s = id.trim();
16048
+ if (!JOB_ID_RE.test(s)) {
16049
+ throw new Error(`detached-job id must be 1\u201364 chars [A-Za-z0-9._-], got ${JSON.stringify(id)}`);
16050
+ }
16051
+ return s;
16052
+ }
16101
16053
  function readIntFile(file) {
16102
16054
  if (!(0, import_node_fs45.existsSync)(file)) return null;
16103
16055
  const n = Number.parseInt((0, import_node_fs45.readFileSync)(file, "utf8").trim(), 10);
@@ -16138,7 +16090,7 @@ function looksLikeDeferredDonePromise(text6) {
16138
16090
  if (!t || t.length > DEFERRED_DONE_MAX_CHARS) return false;
16139
16091
  const unquoted = t.replace(/`[^`]*`/g, " ").replace(/["“”][^"“”]*["“”]/g, " ").replace(/\s+/g, " ").trim();
16140
16092
  if (!unquoted) return false;
16141
- return /\b(i['’]?ll|i will)\s+let you know\b/i.test(unquoted) || /\blet you know when\b/i.test(unquoted) || /\b(check back|ping me)\s+when\b/i.test(unquoted) || /\bi(?:['’]ll| will)\s+(report|update you)\s+when\b/i.test(unquoted) || /\bbackground poll\b/i.test(unquoted) || /\bwill notify (?:me|you) when\b/i.test(unquoted) || /\bi(?:['’]ll| will) be notified when\b/i.test(unquoted) || /\bi(?:['’]ll| will)\s+(?:keep|continue)\s+(?:watching|waiting|polling|checking)\b/i.test(
16093
+ return /\b(i['’]?ll|i will)\s+let you know\b/i.test(unquoted) || /\blet you know when\b/i.test(unquoted) || /\b(check back|ping me)\s+when\b/i.test(unquoted) || /\bi(?:['’]ll| will)\s+(report|update you)\s+when\b/i.test(unquoted) || /\bwill notify (?:me|you) when\b/i.test(unquoted) || /\bi(?:['’]ll| will) be notified when\b/i.test(unquoted) || /\bi(?:['’]ll| will)\s+(?:keep|continue)\s+(?:watching|waiting|polling|checking)\b/i.test(
16142
16094
  unquoted
16143
16095
  ) || /\bi(?:['’]ll| will)\s+come back when\b/i.test(unquoted);
16144
16096
  }
@@ -16182,7 +16134,7 @@ function formatJobStillRunningContinuePrompt(jobIds) {
16182
16134
  function formatDeferredDoneContinuePrompt() {
16183
16135
  return [
16184
16136
  "You ended the turn after promising to report later, but no detached job is running.",
16185
- "A native background poll / Task / bash notify does not resume this chat (Claude, Cursor, Codex, OpenCode).",
16137
+ "A native CLI Task or bash notify does not resume this chat (Claude, Cursor, Codex, OpenCode).",
16186
16138
  "If tests/pack/deploy still need to run: start once with detached-job.cjs, then loop wait_for_job until stillRunning is false (the log pane updates from wait JSON).",
16187
16139
  "Do not say you will let the user know later."
16188
16140
  ].join(" ");
@@ -16407,6 +16359,7 @@ var init_wait_for_job = __esm({
16407
16359
  import_node_fs45 = require("fs");
16408
16360
  import_node_path45 = require("path");
16409
16361
  init_workspace_scratch();
16362
+ init_job_process();
16410
16363
  init_wait_for_turn();
16411
16364
  MAX_JOB_CONTINUES = 8;
16412
16365
  MAX_JOB_DELTA_LINES = 80;
@@ -22534,7 +22487,7 @@ var init_long_running = __esm({
22534
22487
 
22535
22488
  A Sideboard or Cursor **worktree turn** SIGTERMs the agent shell (and its process group) when the user sends another message or the turn is interrupted. \`block_until_ms: 0\` is not enough \u2014 the child stays in that group.
22536
22489
 
22537
- Do **not** ask the human to check back. Detach, then **wait** in 45s slices (MCP \`wait_for_job\`, same idea as \`wait_for_turn\`) until \`stillRunning\` is false. Do not end the turn with \u201CI\u2019ll let you know\u201D or \u201Ca background poll will notify me.\u201D Native background bash/Task notify (Claude, Cursor, Codex, OpenCode) does **not** resume a Sideboard chat.
22490
+ Do **not** ask the human to check back. Detach, then **wait** in 45s slices (MCP \`wait_for_job\`, same idea as \`wait_for_turn\`) until \`stillRunning\` is false. Do not end the turn after starting a job \u2014 a native CLI Task or bash notify does **not** resume a Sideboard chat (Claude, Cursor, Codex, OpenCode).
22538
22491
 
22539
22492
  ## Tool
22540
22493
 
@@ -23181,7 +23134,7 @@ function formatPrGateDirective() {
23181
23134
  return [
23182
23135
  "If a goal is given (not after every push):",
23183
23136
  "- Enter a watch-fix-push loop and stay in it until that goal is met or you are blocked (examples: \u201CGreptile 5/5\u201D, \u201CCI green\u201D, \u201Cuntil checks pass\u201D). Do not stop after one red run or one review cycle.",
23184
- "- Wait with `/long-running`: detach `gh pr checks --watch` (add `-R <origin>` when needed), then loop `wait_for_job` until stillRunning is false. Do not end the turn \u2014 a background poll / Task notify does not resume this chat. Do not ask the human to poll.",
23137
+ "- Wait with `/long-running`: detach `gh pr checks --watch` (add `-R <origin>` when needed), then loop `wait_for_job` until stillRunning is false. Do not end the turn \u2014 a native CLI Task or bash notify does not resume this chat. Do not ask the human to poll.",
23185
23138
  "- Greptile 5/5: wait for the greptile check; read the latest `N/5` from the PR body or Greptile\u2019s most recently *updated* issue comment; also fetch unresolved review comments / the \u201CPrompt to fix all with AI\u201D block. Done = **5/5 and zero unresolved Greptile comments**. If Greptile is idle, comment `@greptile review`. Cap about 5 iterations, then report leftovers. Do not merge unless asked."
23186
23139
  ].join("\n");
23187
23140
  }
@@ -23214,7 +23167,7 @@ function formatLongRunningDirective(opts) {
23214
23167
  }
23215
23168
  function formatLongRunningReminder(opts) {
23216
23169
  const invoke = formatDetachedJobInvoke(opts?.scriptPath);
23217
- 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. A background poll / Task notify does not resume this chat. Project Dev button: list_run_scripts / run_dev_script / stop_dev_script / get_run_log (UI-connected \u2014 not detached-job). ${formatDevAccessHint(opts?.activeRuns)}`;
23170
+ 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. A native CLI Task or bash notify does not resume this chat. Project Dev button: list_run_scripts / run_dev_script / stop_dev_script / get_run_log (UI-connected \u2014 not detached-job). ${formatDevAccessHint(opts?.activeRuns)}`;
23218
23171
  }
23219
23172
  function formatArtifactDirective() {
23220
23173
  return [
@@ -24913,7 +24866,8 @@ var init_orchestrator = __esm({
24913
24866
  throw new Error(`Thread is archived: ${thread.id}`);
24914
24867
  }
24915
24868
  const followUp = resolveSendFollowUp(current, opts?.followUp);
24916
- const consumed = consumeComposerAttachments(current);
24869
+ const explicit = opts?.attachments;
24870
+ const consumed = explicit !== void 0 ? { attachments: current.attachments, consumed: explicit } : consumeComposerAttachments(current);
24917
24871
  const queued = appendQueuedItem(
24918
24872
  current.queue,
24919
24873
  current.queueAttachments,
@@ -24927,7 +24881,7 @@ var init_orchestrator = __esm({
24927
24881
  const inFlight = this.activeTurns.has(thread.id) || this.startingTurns.has(thread.id) || current.status === "running";
24928
24882
  shouldSteer = followUp === "steer" && (inFlight || current.queue.length > 0);
24929
24883
  const patch = queued;
24930
- if (consumed.consumed.length > 0) {
24884
+ if (explicit === void 0 && consumed.consumed.length > 0) {
24931
24885
  patch.attachments = consumed.attachments;
24932
24886
  }
24933
24887
  if (!inFlight) patch.status = "queued";
@@ -18,9 +18,9 @@ import {
18
18
  searchAbleTimeTasks,
19
19
  toAbleTimeIssueInfo,
20
20
  updateAbleTimeTask
21
- } from "../chunk-KZ2CDZBZ.js";
22
- import "../chunk-DBFAFI5A.js";
23
- import "../chunk-GONPMH36.js";
21
+ } from "../chunk-R7HLXD4I.js";
22
+ import "../chunk-XKZAVGTT.js";
23
+ import "../chunk-IJDQKC5A.js";
24
24
  import {
25
25
  AGENT_GIT_ACTIONS,
26
26
  BOARD_COLUMN_DEFS,
@@ -52,7 +52,7 @@ import {
52
52
  sliceRunLogOutput,
53
53
  syncBoardPins,
54
54
  updateSchedule
55
- } from "../chunk-T47ARZ5Q.js";
55
+ } from "../chunk-FELFTNH2.js";
56
56
  import "../chunk-LX5R5JOR.js";
57
57
  import {
58
58
  PRESENT_PLAN_REQUIRES_PLAN_MODE,
@@ -71,7 +71,7 @@ import {
71
71
  sideboardMcpProfile,
72
72
  trustSystemCertificates,
73
73
  worktreeMcpToolNames
74
- } from "../chunk-JLDJGGCL.js";
74
+ } from "../chunk-NT7RIWRR.js";
75
75
  import "../chunk-TQRSVE7D.js";
76
76
  import "../chunk-P2BSMNHB.js";
77
77
  import {
@@ -86,7 +86,7 @@ import {
86
86
  threadsSharingWorktree,
87
87
  waitForDetachedJob,
88
88
  waitForTurnToolResult
89
- } from "../chunk-OUBQH5GR.js";
89
+ } from "../chunk-HOMZKYHF.js";
90
90
  import {
91
91
  clipToolResultForStore,
92
92
  isInternalAgentStatusText,
@@ -97,7 +97,7 @@ import {
97
97
  isCloudCoordinatorThread,
98
98
  isOrchestratorThread,
99
99
  listWorkspaces
100
- } from "../chunk-2QUILREI.js";
100
+ } from "../chunk-QTZO4LPU.js";
101
101
  import {
102
102
  canonicalizeRepoPath,
103
103
  formatGhLandError,
@@ -108,7 +108,7 @@ import {
108
108
  resolveListPrsOptions,
109
109
  resolveRepoRoot,
110
110
  warmGithubAgentAuth
111
- } from "../chunk-NWE3NOWQ.js";
111
+ } from "../chunk-K7MWJLR7.js";
112
112
  import {
113
113
  CLI_DIR
114
114
  } from "../chunk-N2WW62LF.js";
@@ -131,7 +131,7 @@ import {
131
131
  resolveViewerProfileForRepo,
132
132
  saveLinearOAuth,
133
133
  writeViewerContext
134
- } from "../chunk-OIENQEGG.js";
134
+ } from "../chunk-WRIMAEF2.js";
135
135
  import "../chunk-NSTQ6QKD.js";
136
136
  import {
137
137
  dropNestedElectronEnvFromProcess
@@ -3860,7 +3860,7 @@ async function startMcpServer() {
3860
3860
  );
3861
3861
  }
3862
3862
  try {
3863
- const { maxConcurrentAgents } = await import("../app-settings-RAC4PSSP.js");
3863
+ const { maxConcurrentAgents } = await import("../app-settings-EQQZQNYD.js");
3864
3864
  orch.setMaxConcurrent(maxConcurrentAgents());
3865
3865
  } catch {
3866
3866
  }
@@ -4348,7 +4348,7 @@ async function startMcpServer() {
4348
4348
  if (!worktreeProfile) {
4349
4349
  registerConnectedIssueVendorTools(server);
4350
4350
  const { getCaffeinateHold, setCaffeinateHold } = await import("../caffeinate-hold-7JM5H5P3.js");
4351
- const { resolveNewThreadOptions, resolveThreadDefaults } = await import("../app-settings-RAC4PSSP.js");
4351
+ const { resolveNewThreadOptions, resolveThreadDefaults } = await import("../app-settings-EQQZQNYD.js");
4352
4352
  const accountDefaults = resolveThreadDefaults();
4353
4353
  const accountDefaultsHint = `Account defaults: agent=${accountDefaults.agent}, model=${accountDefaults.model?.trim() || "Auto"}, effort=${accountDefaults.effort}`;
4354
4354
  server.tool(
@@ -11,22 +11,22 @@ import {
11
11
  resolveSendFollowUp,
12
12
  startOrchestration,
13
13
  waitForPidExit
14
- } from "./chunk-T47ARZ5Q.js";
14
+ } from "./chunk-FELFTNH2.js";
15
15
  import "./chunk-LX5R5JOR.js";
16
16
  import "./chunk-4GK32AYX.js";
17
17
  import "./chunk-5DZUWGKV.js";
18
- import "./chunk-JLDJGGCL.js";
18
+ import "./chunk-NT7RIWRR.js";
19
19
  import "./chunk-TQRSVE7D.js";
20
20
  import "./chunk-P2BSMNHB.js";
21
21
  import "./chunk-VKQGAWHY.js";
22
- import "./chunk-OUBQH5GR.js";
22
+ import "./chunk-HOMZKYHF.js";
23
23
  import "./chunk-UKSJO36E.js";
24
- import "./chunk-2QUILREI.js";
25
- import "./chunk-NWE3NOWQ.js";
24
+ import "./chunk-QTZO4LPU.js";
25
+ import "./chunk-K7MWJLR7.js";
26
26
  import "./chunk-N2WW62LF.js";
27
27
  import "./chunk-DD67JWTN.js";
28
28
  import "./chunk-2UG25RMK.js";
29
- import "./chunk-OIENQEGG.js";
29
+ import "./chunk-WRIMAEF2.js";
30
30
  import "./chunk-NSTQ6QKD.js";
31
31
  import "./chunk-WWUABK6B.js";
32
32
  import "./chunk-FJZWM2ON.js";
@@ -9,15 +9,15 @@ import {
9
9
  resolveSendFollowUp,
10
10
  startOrchestration,
11
11
  waitForPidExit
12
- } from "./chunk-N3LASDJM.js";
13
- import "./chunk-ADWNK2JH.js";
12
+ } from "./chunk-SQOAFR2U.js";
13
+ import "./chunk-NIB2IZ6J.js";
14
14
  import "./chunk-GWFVCCJZ.js";
15
- import "./chunk-HO2T6BC3.js";
15
+ import "./chunk-MGS5T2A3.js";
16
16
  import "./chunk-FAGK33E2.js";
17
17
  import "./chunk-7H655NEW.js";
18
18
  import "./chunk-PGPSIEMW.js";
19
- import "./chunk-PTNGMA5C.js";
20
- import "./chunk-USBZ7PH4.js";
19
+ import "./chunk-A2G3ZBJS.js";
20
+ import "./chunk-IPPY3FG5.js";
21
21
  import "./chunk-FWNL62VA.js";
22
22
  import "./chunk-2P4XKWV2.js";
23
23
  import "./chunk-ROPGQRPU.js";
@@ -29,7 +29,7 @@ import "./chunk-6K64FJDD.js";
29
29
  import "./chunk-UWQ6UCIB.js";
30
30
  import "./chunk-QVN2WOKJ.js";
31
31
  import "./chunk-NYBFYFK7.js";
32
- import "./chunk-PAH7KDL2.js";
32
+ import "./chunk-YNTXWFXT.js";
33
33
  import "./chunk-77WWLBCI.js";
34
34
  import "./chunk-4TR3HZFT.js";
35
35
  import "./chunk-WDRMZKVB.js";
@@ -7,12 +7,12 @@ import {
7
7
  primaryCheckoutFromLinkedWorktree,
8
8
  removeWorkspace,
9
9
  syncWorkspacesFromThreads
10
- } from "./chunk-2QUILREI.js";
11
- import "./chunk-NWE3NOWQ.js";
10
+ } from "./chunk-QTZO4LPU.js";
11
+ import "./chunk-K7MWJLR7.js";
12
12
  import "./chunk-N2WW62LF.js";
13
13
  import "./chunk-DD67JWTN.js";
14
14
  import "./chunk-2UG25RMK.js";
15
- import "./chunk-OIENQEGG.js";
15
+ import "./chunk-WRIMAEF2.js";
16
16
  import "./chunk-NSTQ6QKD.js";
17
17
  import "./chunk-WWUABK6B.js";
18
18
  import "./chunk-FJZWM2ON.js";
@@ -5,14 +5,14 @@ import {
5
5
  primaryCheckoutFromLinkedWorktree,
6
6
  removeWorkspace,
7
7
  syncWorkspacesFromThreads
8
- } from "./chunk-PTNGMA5C.js";
9
- import "./chunk-USBZ7PH4.js";
8
+ } from "./chunk-A2G3ZBJS.js";
9
+ import "./chunk-IPPY3FG5.js";
10
10
  import "./chunk-FWNL62VA.js";
11
11
  import "./chunk-2P4XKWV2.js";
12
12
  import "./chunk-6K64FJDD.js";
13
13
  import "./chunk-UWQ6UCIB.js";
14
14
  import "./chunk-QVN2WOKJ.js";
15
- import "./chunk-PAH7KDL2.js";
15
+ import "./chunk-YNTXWFXT.js";
16
16
  import "./chunk-77WWLBCI.js";
17
17
  import "./chunk-4TR3HZFT.js";
18
18
  import "./chunk-WDRMZKVB.js";
@@ -62,11 +62,11 @@ import {
62
62
  worktreeDisplayLabelForGroup,
63
63
  worktreeNameFromPath,
64
64
  worktreeSlugForTicket
65
- } from "./chunk-NWE3NOWQ.js";
65
+ } from "./chunk-K7MWJLR7.js";
66
66
  import "./chunk-N2WW62LF.js";
67
67
  import "./chunk-DD67JWTN.js";
68
68
  import "./chunk-2UG25RMK.js";
69
- import "./chunk-OIENQEGG.js";
69
+ import "./chunk-WRIMAEF2.js";
70
70
  import "./chunk-NSTQ6QKD.js";
71
71
  import "./chunk-WWUABK6B.js";
72
72
  import "./chunk-FJZWM2ON.js";
@@ -60,13 +60,13 @@ import {
60
60
  worktreeDisplayLabelForGroup,
61
61
  worktreeNameFromPath,
62
62
  worktreeSlugForTicket
63
- } from "./chunk-USBZ7PH4.js";
63
+ } from "./chunk-IPPY3FG5.js";
64
64
  import "./chunk-FWNL62VA.js";
65
65
  import "./chunk-2P4XKWV2.js";
66
66
  import "./chunk-6K64FJDD.js";
67
67
  import "./chunk-UWQ6UCIB.js";
68
68
  import "./chunk-QVN2WOKJ.js";
69
- import "./chunk-PAH7KDL2.js";
69
+ import "./chunk-YNTXWFXT.js";
70
70
  import "./chunk-77WWLBCI.js";
71
71
  import "./chunk-4TR3HZFT.js";
72
72
  import "./chunk-WDRMZKVB.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sideboard-ai/core",
3
- "version": "0.1.273",
3
+ "version": "0.1.275",
4
4
  "description": "Sideboard core — orchestration, agents, git worktrees, MCP server",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",