@sideboard-ai/core 0.1.272 → 0.1.273

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.
@@ -1362,7 +1362,9 @@ function looksLikeDeferredDonePromise(text) {
1362
1362
  if (!t || t.length > DEFERRED_DONE_MAX_CHARS) return false;
1363
1363
  const unquoted = t.replace(/`[^`]*`/g, " ").replace(/["“”][^"“”]*["“”]/g, " ").replace(/\s+/g, " ").trim();
1364
1364
  if (!unquoted) return false;
1365
- 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);
1365
+ 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(
1366
+ unquoted
1367
+ ) || /\bi(?:['’]ll| will)\s+come back when\b/i.test(unquoted);
1366
1368
  }
1367
1369
  function isJobContinuePrompt(text) {
1368
1370
  if (typeof text !== "string") return false;
@@ -1404,6 +1406,7 @@ function formatJobStillRunningContinuePrompt(jobIds) {
1404
1406
  function formatDeferredDoneContinuePrompt() {
1405
1407
  return [
1406
1408
  "You ended the turn after promising to report later, but no detached job is running.",
1409
+ "A native background poll / Task / bash notify does not resume this chat (Claude, Cursor, Codex, OpenCode).",
1407
1410
  "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).",
1408
1411
  "Do not say you will let the user know later."
1409
1412
  ].join(" ");
@@ -1628,7 +1631,7 @@ var PORT_RANGE_SIZE = 10;
1628
1631
  var RECLAIM_RETRY_DELAY_MS = 40;
1629
1632
  var RECLAIM_TRIES = 8;
1630
1633
  async function killReclaimable(ports, worktreePath, signal) {
1631
- const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-POUIKR5A.js");
1634
+ const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-3AQM67VK.js");
1632
1635
  if (worktreePath) killStaleWorktreeListeners2(ports, worktreePath, signal);
1633
1636
  else killListenersOnPorts2(ports);
1634
1637
  }
@@ -44,7 +44,7 @@ import {
44
44
  worktreeDevProcessKey,
45
45
  worktreeRunProcessKey,
46
46
  worktreeSetupProcessKey
47
- } from "./chunk-M7626KJO.js";
47
+ } from "./chunk-HO2T6BC3.js";
48
48
  import {
49
49
  applyAgentEvent,
50
50
  clipAgentEventForPaint,
@@ -4374,7 +4374,7 @@ var LONG_RUNNING_SKILL_BODY = `# Long-running jobs
4374
4374
 
4375
4375
  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.
4376
4376
 
4377
- 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
4377
+ 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.
4378
4378
 
4379
4379
  ## Tool
4380
4380
 
@@ -5017,7 +5017,7 @@ function formatPrGateDirective() {
5017
5017
  return [
5018
5018
  "If a goal is given (not after every push):",
5019
5019
  "- 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.",
5020
- "- Wait with `/long-running`: `gh pr checks --watch` (add `-R <origin>` when needed). Present the log. Do not ask the human to poll.",
5020
+ "- 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.",
5021
5021
  "- 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."
5022
5022
  ].join("\n");
5023
5023
  }
@@ -5050,7 +5050,7 @@ function formatLongRunningDirective(opts) {
5050
5050
  }
5051
5051
  function formatLongRunningReminder(opts) {
5052
5052
  const invoke = formatDetachedJobInvoke(opts?.scriptPath);
5053
- 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 / get_run_log (UI-connected \u2014 not detached-job). ${formatDevAccessHint(opts?.activeRuns)}`;
5053
+ 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)}`;
5054
5054
  }
5055
5055
  function formatArtifactDirective() {
5056
5056
  return [
@@ -5610,7 +5610,7 @@ function formatScheduledPrompt(name, prompt) {
5610
5610
  ${prompt}`;
5611
5611
  }
5612
5612
  async function defaultDeps() {
5613
- const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-VF5PZMS3.js");
5613
+ const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-K42IBMBE.js");
5614
5614
  const orch = getOrchestrator2();
5615
5615
  return {
5616
5616
  findThread: (id) => findThreadByRef(id),
@@ -1306,7 +1306,9 @@ function looksLikeDeferredDonePromise(text) {
1306
1306
  if (!t || t.length > DEFERRED_DONE_MAX_CHARS) return false;
1307
1307
  const unquoted = t.replace(/`[^`]*`/g, " ").replace(/["“”][^"“”]*["“”]/g, " ").replace(/\s+/g, " ").trim();
1308
1308
  if (!unquoted) return false;
1309
- 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);
1309
+ 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(
1310
+ unquoted
1311
+ ) || /\bi(?:['’]ll| will)\s+come back when\b/i.test(unquoted);
1310
1312
  }
1311
1313
  function isJobContinuePrompt(text) {
1312
1314
  if (typeof text !== "string") return false;
@@ -1348,6 +1350,7 @@ function formatJobStillRunningContinuePrompt(jobIds) {
1348
1350
  function formatDeferredDoneContinuePrompt() {
1349
1351
  return [
1350
1352
  "You ended the turn after promising to report later, but no detached job is running.",
1353
+ "A native background poll / Task / bash notify does not resume this chat (Claude, Cursor, Codex, OpenCode).",
1351
1354
  "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).",
1352
1355
  "Do not say you will let the user know later."
1353
1356
  ].join(" ");
@@ -1572,7 +1575,7 @@ var PORT_RANGE_SIZE = 10;
1572
1575
  var RECLAIM_RETRY_DELAY_MS = 40;
1573
1576
  var RECLAIM_TRIES = 8;
1574
1577
  async function killReclaimable(ports, worktreePath, signal) {
1575
- const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-JA3A4NAI.js");
1578
+ const { killListenersOnPorts: killListenersOnPorts2, killStaleWorktreeListeners: killStaleWorktreeListeners2 } = await import("./conductor-FLWACOVC.js");
1576
1579
  if (worktreePath) killStaleWorktreeListeners2(ports, worktreePath, signal);
1577
1580
  else killListenersOnPorts2(ports);
1578
1581
  }
@@ -58,7 +58,7 @@ import {
58
58
  worktreeDevProcessKey,
59
59
  worktreeRunProcessKey,
60
60
  worktreeSetupProcessKey
61
- } from "./chunk-RQR25LUB.js";
61
+ } from "./chunk-OUBQH5GR.js";
62
62
  import {
63
63
  applyAgentEvent,
64
64
  clipAgentEventForPaint,
@@ -4228,7 +4228,7 @@ var LONG_RUNNING_SKILL_BODY = `# Long-running jobs
4228
4228
 
4229
4229
  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.
4230
4230
 
4231
- 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
4231
+ 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.
4232
4232
 
4233
4233
  ## Tool
4234
4234
 
@@ -4849,7 +4849,7 @@ function formatPrGateDirective() {
4849
4849
  return [
4850
4850
  "If a goal is given (not after every push):",
4851
4851
  "- 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.",
4852
- "- Wait with `/long-running`: `gh pr checks --watch` (add `-R <origin>` when needed). Present the log. Do not ask the human to poll.",
4852
+ "- 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.",
4853
4853
  "- 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."
4854
4854
  ].join("\n");
4855
4855
  }
@@ -4882,7 +4882,7 @@ function formatLongRunningDirective(opts) {
4882
4882
  }
4883
4883
  function formatLongRunningReminder(opts) {
4884
4884
  const invoke = formatDetachedJobInvoke(opts?.scriptPath);
4885
- 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 / get_run_log (UI-connected \u2014 not detached-job). ${formatDevAccessHint(opts?.activeRuns)}`;
4885
+ 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)}`;
4886
4886
  }
4887
4887
  function formatArtifactDirective() {
4888
4888
  return [
@@ -5271,7 +5271,7 @@ function formatScheduledPrompt(name, prompt) {
5271
5271
  ${prompt}`;
5272
5272
  }
5273
5273
  async function defaultDeps() {
5274
- const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-NLCTI3MC.js");
5274
+ const { getOrchestrator: getOrchestrator2, startOrchestration: startOrchestration2 } = await import("./orchestrator-YKSDWR6C.js");
5275
5275
  const orch = getOrchestrator2();
5276
5276
  return {
5277
5277
  findThread: (id) => findThreadByRef(id),
@@ -31,7 +31,7 @@ import {
31
31
  tryReservePort,
32
32
  tryReservePorts,
33
33
  worktreeRunPortsPath
34
- } from "./chunk-M7626KJO.js";
34
+ } from "./chunk-HO2T6BC3.js";
35
35
  import "./chunk-FAGK33E2.js";
36
36
  import "./chunk-PTNGMA5C.js";
37
37
  import "./chunk-USBZ7PH4.js";
@@ -33,7 +33,7 @@ import {
33
33
  tryReservePort,
34
34
  tryReservePorts,
35
35
  worktreeRunPortsPath
36
- } from "./chunk-RQR25LUB.js";
36
+ } from "./chunk-OUBQH5GR.js";
37
37
  import "./chunk-UKSJO36E.js";
38
38
  import "./chunk-2QUILREI.js";
39
39
  import "./chunk-NWE3NOWQ.js";
package/dist/index.cjs CHANGED
@@ -19287,7 +19287,9 @@ function looksLikeDeferredDonePromise(text6) {
19287
19287
  if (!t || t.length > DEFERRED_DONE_MAX_CHARS) return false;
19288
19288
  const unquoted = t.replace(/`[^`]*`/g, " ").replace(/["“”][^"“”]*["“”]/g, " ").replace(/\s+/g, " ").trim();
19289
19289
  if (!unquoted) return false;
19290
- 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);
19290
+ 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(
19291
+ unquoted
19292
+ ) || /\bi(?:['’]ll| will)\s+come back when\b/i.test(unquoted);
19291
19293
  }
19292
19294
  function isJobContinuePrompt(text6) {
19293
19295
  if (typeof text6 !== "string") return false;
@@ -19329,6 +19331,7 @@ function formatJobStillRunningContinuePrompt(jobIds) {
19329
19331
  function formatDeferredDoneContinuePrompt() {
19330
19332
  return [
19331
19333
  "You ended the turn after promising to report later, but no detached job is running.",
19334
+ "A native background poll / Task / bash notify does not resume this chat (Claude, Cursor, Codex, OpenCode).",
19332
19335
  "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).",
19333
19336
  "Do not say you will let the user know later."
19334
19337
  ].join(" ");
@@ -24862,7 +24865,7 @@ var init_long_running = __esm({
24862
24865
 
24863
24866
  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.
24864
24867
 
24865
- 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
24868
+ 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.
24866
24869
 
24867
24870
  ## Tool
24868
24871
 
@@ -25531,7 +25534,7 @@ function formatPrGateDirective() {
25531
25534
  return [
25532
25535
  "If a goal is given (not after every push):",
25533
25536
  "- 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.",
25534
- "- Wait with `/long-running`: `gh pr checks --watch` (add `-R <origin>` when needed). Present the log. Do not ask the human to poll.",
25537
+ "- 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.",
25535
25538
  "- 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."
25536
25539
  ].join("\n");
25537
25540
  }
@@ -25564,7 +25567,7 @@ function formatLongRunningDirective(opts) {
25564
25567
  }
25565
25568
  function formatLongRunningReminder(opts) {
25566
25569
  const invoke = formatDetachedJobInvoke(opts?.scriptPath);
25567
- 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 / get_run_log (UI-connected \u2014 not detached-job). ${formatDevAccessHint(opts?.activeRuns)}`;
25570
+ 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)}`;
25568
25571
  }
25569
25572
  function formatArtifactDirective() {
25570
25573
  return [
package/dist/index.js CHANGED
@@ -173,7 +173,7 @@ import {
173
173
  worktreeBoardStatus,
174
174
  worktreeCleanupSettings,
175
175
  writeWorktreeFile
176
- } from "./chunk-SVXGDQAI.js";
176
+ } from "./chunk-N3LASDJM.js";
177
177
  import {
178
178
  BASE_ALLOWED_TOOLS,
179
179
  BRIGHTSY_MCP_ALLOWED_TOOLS,
@@ -380,7 +380,7 @@ import {
380
380
  waitForTurnToolResult,
381
381
  worktreeRunPortsPath,
382
382
  wrapReviewSkillMarkdown
383
- } from "./chunk-M7626KJO.js";
383
+ } from "./chunk-HO2T6BC3.js";
384
384
  import {
385
385
  STDERR_EVENT_MAX_CHARS,
386
386
  STDOUT_EVENT_MAX_CHARS,
@@ -5139,7 +5139,7 @@ async function handleJobStop(params, _ctx) {
5139
5139
  return stopDetachedJob(jobCwd(rec), id, reason ? { reason } : void 0);
5140
5140
  }
5141
5141
  async function defaultTurnWait(ref, timeoutMs) {
5142
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-VF5PZMS3.js");
5142
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-K42IBMBE.js");
5143
5143
  const orch = getOrchestrator2();
5144
5144
  const thread = await orch.waitForTurn(ref, timeoutMs, {
5145
5145
  resolveIfStillRunning: true
@@ -10469,7 +10469,7 @@ async function continueSourceThread(threadId, prompt) {
10469
10469
  await continueOnReply(threadId, prompt);
10470
10470
  return;
10471
10471
  }
10472
- const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-VF5PZMS3.js");
10472
+ const { getOrchestrator: getOrchestrator2 } = await import("./orchestrator-K42IBMBE.js");
10473
10473
  await getOrchestrator2().send(threadId, prompt);
10474
10474
  } catch {
10475
10475
  }
@@ -16138,7 +16138,9 @@ function looksLikeDeferredDonePromise(text6) {
16138
16138
  if (!t || t.length > DEFERRED_DONE_MAX_CHARS) return false;
16139
16139
  const unquoted = t.replace(/`[^`]*`/g, " ").replace(/["“”][^"“”]*["“”]/g, " ").replace(/\s+/g, " ").trim();
16140
16140
  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);
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(
16142
+ unquoted
16143
+ ) || /\bi(?:['’]ll| will)\s+come back when\b/i.test(unquoted);
16142
16144
  }
16143
16145
  function isJobContinuePrompt(text6) {
16144
16146
  if (typeof text6 !== "string") return false;
@@ -16180,6 +16182,7 @@ function formatJobStillRunningContinuePrompt(jobIds) {
16180
16182
  function formatDeferredDoneContinuePrompt() {
16181
16183
  return [
16182
16184
  "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).",
16183
16186
  "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).",
16184
16187
  "Do not say you will let the user know later."
16185
16188
  ].join(" ");
@@ -22531,7 +22534,7 @@ var init_long_running = __esm({
22531
22534
 
22532
22535
  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.
22533
22536
 
22534
- 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
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.
22535
22538
 
22536
22539
  ## Tool
22537
22540
 
@@ -23178,7 +23181,7 @@ function formatPrGateDirective() {
23178
23181
  return [
23179
23182
  "If a goal is given (not after every push):",
23180
23183
  "- 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.",
23181
- "- Wait with `/long-running`: `gh pr checks --watch` (add `-R <origin>` when needed). Present the log. Do not ask the human to poll.",
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.",
23182
23185
  "- 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."
23183
23186
  ].join("\n");
23184
23187
  }
@@ -23211,7 +23214,7 @@ function formatLongRunningDirective(opts) {
23211
23214
  }
23212
23215
  function formatLongRunningReminder(opts) {
23213
23216
  const invoke = formatDetachedJobInvoke(opts?.scriptPath);
23214
- 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 / get_run_log (UI-connected \u2014 not detached-job). ${formatDevAccessHint(opts?.activeRuns)}`;
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)}`;
23215
23218
  }
23216
23219
  function formatArtifactDirective() {
23217
23220
  return [
@@ -52,7 +52,7 @@ import {
52
52
  sliceRunLogOutput,
53
53
  syncBoardPins,
54
54
  updateSchedule
55
- } from "../chunk-ODC3Y4GQ.js";
55
+ } from "../chunk-T47ARZ5Q.js";
56
56
  import "../chunk-LX5R5JOR.js";
57
57
  import {
58
58
  PRESENT_PLAN_REQUIRES_PLAN_MODE,
@@ -86,7 +86,7 @@ import {
86
86
  threadsSharingWorktree,
87
87
  waitForDetachedJob,
88
88
  waitForTurnToolResult
89
- } from "../chunk-RQR25LUB.js";
89
+ } from "../chunk-OUBQH5GR.js";
90
90
  import {
91
91
  clipToolResultForStore,
92
92
  isInternalAgentStatusText,
@@ -9,10 +9,10 @@ import {
9
9
  resolveSendFollowUp,
10
10
  startOrchestration,
11
11
  waitForPidExit
12
- } from "./chunk-SVXGDQAI.js";
12
+ } from "./chunk-N3LASDJM.js";
13
13
  import "./chunk-ADWNK2JH.js";
14
14
  import "./chunk-GWFVCCJZ.js";
15
- import "./chunk-M7626KJO.js";
15
+ import "./chunk-HO2T6BC3.js";
16
16
  import "./chunk-FAGK33E2.js";
17
17
  import "./chunk-7H655NEW.js";
18
18
  import "./chunk-PGPSIEMW.js";
@@ -11,7 +11,7 @@ import {
11
11
  resolveSendFollowUp,
12
12
  startOrchestration,
13
13
  waitForPidExit
14
- } from "./chunk-ODC3Y4GQ.js";
14
+ } from "./chunk-T47ARZ5Q.js";
15
15
  import "./chunk-LX5R5JOR.js";
16
16
  import "./chunk-4GK32AYX.js";
17
17
  import "./chunk-5DZUWGKV.js";
@@ -19,7 +19,7 @@ import "./chunk-JLDJGGCL.js";
19
19
  import "./chunk-TQRSVE7D.js";
20
20
  import "./chunk-P2BSMNHB.js";
21
21
  import "./chunk-VKQGAWHY.js";
22
- import "./chunk-RQR25LUB.js";
22
+ import "./chunk-OUBQH5GR.js";
23
23
  import "./chunk-UKSJO36E.js";
24
24
  import "./chunk-2QUILREI.js";
25
25
  import "./chunk-NWE3NOWQ.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sideboard-ai/core",
3
- "version": "0.1.272",
3
+ "version": "0.1.273",
4
4
  "description": "Sideboard core — orchestration, agents, git worktrees, MCP server",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",